From 8645089eae989d721dbabb18b47c0f21e0adaf38 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 15 May 2020 20:20:07 -0400 Subject: [PATCH 001/144] Adding image sources --- book/figs/image_sources.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 book/figs/image_sources.txt diff --git a/book/figs/image_sources.txt b/book/figs/image_sources.txt new file mode 100644 index 00000000..7e2136df --- /dev/null +++ b/book/figs/image_sources.txt @@ -0,0 +1,5 @@ +globe, public domain, http://www.freestockphotos.biz/stockphoto/16911 +sphere, CC0, https://www.kissclipart.com/blue-sphere-clipart-clip-art-spxa3o/ +chart, CC0, https://openclipart.org/detail/215430/chart +empire state building, public domain, https://freesvg.org/boort-art-deco-empire-state-building +other building, public domain, https://freesvg.org/building-vector-silhouette From f4df9a66c0bcef94a7268e040ace2d0e27601ce5 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Jun 2020 09:34:10 -0400 Subject: [PATCH 002/144] Run on Colab --- soln/jump2_soln.ipynb | 496 ++++++++++++------------------------------ 1 file changed, 136 insertions(+), 360 deletions(-) diff --git a/soln/jump2_soln.ipynb b/soln/jump2_soln.ipynb index 87ebc5d4..5fa97f6e 100644 --- a/soln/jump2_soln.ipynb +++ b/soln/jump2_soln.ipynb @@ -18,13 +18,26 @@ "execution_count": 1, "metadata": {}, "outputs": [], + "source": [ + "# If we're running on Colab, install modsimpy\n", + "# https://pypi.org/project/modsimpy/\n", + "\n", + "import sys\n", + "IN_COLAB = 'google.colab' in sys.modules\n", + "\n", + "if IN_COLAB:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], "source": [ "# Configure Jupyter so figures appear in the notebook\n", "%matplotlib inline\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", "# import functions from the modsim.py module\n", "from modsim import *" ] @@ -75,26 +88,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$\\mathrm{newton}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "m = UNITS.meter\n", "s = UNITS.second\n", @@ -104,92 +100,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
values
v_init0.0 meter / second
g9.8 meter / second ** 2
M75 kilogram
m_cord75 kilogram
area1 meter ** 2
rho1.2 kilogram / meter ** 3
v_term60.0 meter / second
L25 meter
k40.0 newton / meter
\n", - "
" - ], - "text/plain": [ - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "M 75 kilogram\n", - "m_cord 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "params = Params(v_init = 0 * m / s,\n", " g = 9.8 * m/s**2,\n", @@ -215,7 +128,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -250,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -353,13 +266,14 @@ "dtype: object" ] }, - "execution_count": 5, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "system = make_system(params)" + "system = make_system(params)\n", + "system" ] }, { @@ -371,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -397,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -412,7 +326,7 @@ "-81.66666666666667 " ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -432,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -459,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -474,7 +388,7 @@ "-3.6363636363636362 " ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -494,7 +408,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -527,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -536,7 +450,7 @@ "(0.0 , -9.8 )" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -554,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -581,7 +495,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -596,7 +510,7 @@ "25 " ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -614,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -623,7 +537,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -642,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -651,13 +565,14 @@ "2.2118255911654763" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "t_final = get_last_label(results)" + "t_final = get_last_label(results)\n", + "t_final" ] }, { @@ -669,12 +584,12 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -703,7 +618,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -718,7 +633,7 @@ "-25.0 " ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -736,14 +651,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "scrolled": false }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3xUVf7/8dfMpPcGBBJAbAcVRVAQUbEBNiyIa8NCs/1cu2Jd24roAq7rul9FxYINxV5QUQSxoaCC/SgoQhISUoCQAqTM7487YIwhDJjJnUzez8cjDzN37sy8k8eVT06553j8fj8iIiLhxut2ABERkaaoQImISFhSgRIRkbCkAiUiImEpyu0AoWaMiQX6AauAOpfjiIjIH/mAzsBCa+3Ghk9EfIHCKU4fuh1CRESadQjwUcMD7aFArQJ4+umnyc7OdjuLiIg0UFhYyMiRIyHwb3VD7aFA1QFkZ2eTm5vrdhYREWnan4ZgNElCRETCkgqUiIiEJRUoEREJSypQIiISltrMJAljTG/gQWAf4BdgjLV2obupRERaVn19PXl5eVRWVrodpUVER0fTsWNHUlJStvu1baJAGWNigFeBe4FBwAhgtjGmu7W23NVwIiItqKSkBI/HgzEGr7dtd3L5/X6qq6vJz88H2O4i1VZ++sOAaGvtvdbaGmvtDOA74LRQf7Df72dj0XLqazZu+2QRkb9o7dq1dOrUqc0XJwCPx0NCQgI5OTmsXr16u1/fJlpQwJ7AD42O/QjsHeoPrlr6BUXPT8SXkkXmEWeTuOdBeDyeUH+siLRTdXV1REdHux2jRcXHx1NTU7Pdr2srJToJqGp0rApICPUHx3belZhOPagrL2H1K/+mYPqNbChYGuqPFZF2LNL+CN7Rn6etFKhKIL7RsQSgItQfHJWURs6Yu8k69iJ8ialszLMUPHYtq1/7L7XlpaH+eBGRdqutFKjvAdPoWM/A8ZDzeH2k9BlM14vuJ/XAk8AXRcU381j54CWs+XCmxqdEREKgrYxBzQU8xpgrgPtxZvHtA7zcmiG8sQlkHnE2KX2GUDpnOlX2M9bMn0H54vc0PiUi0sLaRAvKWrsJOAanMJUBNwInWWuL3cgTnZ5N9inj6TzyVmI67qTxKRFpd6666iomTJiw5XFdXR0DBw7ks88+a7HPaCstKKy13wIHu52jofid9iZn7L9Yv+R9yuY9s2V8Kmnvw8g4fCRRyRluRxSRNm7VjAlUL/uy1T4vfpe+dD79xm2eN3z4cK677jquu+46fD4fH3/8MXFxcfTv37/FsrSJFlQ4c8anhtCt8fjUA39nzUcvaHxKRCLSwIED8Xq9W1pMr7/+Oscff3yLDnO0mRZUuPPGJf55fOqDZ1n/1btkHHkOiXsM1PiUiGy3YFozbvB6vZxwwgm8/vrr9OnTh/fee4+XXnqpZT+jRd9N/jQ+VVtewuqX76Fg+k1s1PiUiESQ4cOH89577zF79mx23313evTo0aLvrwIVIpvHp7KOvRBvQgob834k/7FrWf36f6ldX+Z2PBGRv2yXXXahe/fu3HvvvZx44okt/v4qUCH0h/GpASeCN4qKr+ex8oFLND4lIhFh+PDhFBcXc+yxx7b4e6tAtQJvXCKZR55D1wvuJWH3/vhrNrDmg2fJm3oZFd9/jN/vdzuiiMgOGTlyJN9++y1paWkt/t4qUK0oOqMz2X+7NjA+1Z3adcWsfvkeVj35DzauWuZ2PBGRsKIC5QJnfGoSWcdcgDchhQ0rfyD/0WtZ/fr9Gp8SEQlQgXKJx+sjpe/QwPjUCeD1UfH1XGd86uMXNT4lIu2eCpTLnPGpcwPjU/2c8al5zzjjUz98ovEpEWm3VKDChDM+dR2dz7yFmI7dnPGpl6YExqd+cTueiLSiSPvDdEd/HhWoMBPfYx9yxk4m6+jzG4xPjaf4jf9RW7HG7XgiEmI+n2+Hdp8NZ9XV1Tu0S7AKVBjyeH2k7HeUs//UAceD18v6Je+z8oG/s/aTl6iv3eR2RBEJkbS0NIqKiqivr3c7yl/m9/upqqoiPz+fjh07bvfrtRZfGPPFJZI5eBTJfYZSNucJqn5eRNncpynfvL6fGaD1/UQiTFZWFnl5eVhr3Y7SIqKjo+nUqRMpKSnb/VoVqDYgJrML2adeT9UvSyh97zFqiley+sXJxHXbi8who4nNbtn1r0TEPV6vl27durkdIyyoi68NSdi5N7njppB51Hl445PZsOI78qddQ/GbD1BbsdbteCIiLUoFqo3xeH2k7n80XS+6n5T+w5zxqcXvOeNTn76CvzayBldFpP1SgWqjfPFJZA0ZTe5595Cw6374N1VT9v6TrHzocirtZxE3TVVE2h8VqDYuJiuX7NNuIPv0m4jOyqV2TSFFL/yLVc/cxsai5W7HExHZYSpQESJhlz7O+NTQsXjjk9iw/BtnfOqtqdRVrnM7nojIdlOBiiAeXxSp/Y51xqf2d/ZmWf/lbGd86rPX8ddpfEpE2g4VqAjki08m66ix5J53D/E770v9xirK3nucvIeupOrnLzQ+JSJtggpUBIvp0JXs028i+9QbiM7oQk1ZAYXP30nhjDvYVLzS7XgiIs1SgYpwHo+HhN32I/f8e8gYPApvbALVvywm7+ErKXlnGnXV692OKCLSJBWodsLjiybtgOPpetH9JPcdCkD5olmsfODvrFs4C399ncsJRUT+SAWqnfElptLhmAvIGTuJuJ32pr66gtLZ08h7+EqqflnsdjwRkS1UoNqp2E470fnMW+h0ynii0jpRU5JH4bP/pPC5O9lUWuB2PBERLRbbnnk8HhLNASTs0pd1C99kzUcvULX0C6p+WUJqv2NJP/gUvHGJbscUkXZKLSjBExVN2oEn0fWi/5Lc+wior2PdZ6+x4oG/U/7lbI1PiYgrVKBki6ikdDoMu5icMf8iruse1FeVU/LWVPKnjaf6t+/cjici7YwKlPxJbOed6Xz2P+k4/Ep8KVlsWr2cVU/dTNGLk6lZu9rteCLSTmgMSprk8XhI2vMgEnbbn3ULXmXtJy9T+eOnVP28iNQBJ5A2cDjemHi3Y4pIBFMLSprljY4l/ZBT6XrRf0na6xD8dTWs/fhFVj5wKeu/mYffX+92RBGJUG2iBWWMmQ6cCtQ2OLyPtfYXlyK1O1EpWXQ86XJS9j+a0tmPsnHVMopf+y/li94mc+gY4nJ2dzuiiESYNlGggL7ASdbat90O0t7F5faky+i7qPjmA8ref4qNBT9T8Pj1JPUaRMbhZxGVkul2RBGJEGHfxWeMiQd6AlrmIEx4PF6S9zmcrhfdT9rAk8EXRcW381n54CWs+egF6ms2uh1RRCJAWLSgjDExQEYTT/mBnXG69h42xgwAVgI3W2vfaMWI0gRvbDwZh48ked8jKZ0znSr7GWs+eJb1i+eQMfgcEs0APB6P2zFFpI0KlxbUQGBVE1/5QDLwIXAb0AWYADxvjOntTlRpLDo9m+xTxtN55K3EdOxG7brVrH5xMquevkXbzovIDguLFpS1dh7Q3J/asxt8/6IxZjRwArAklLlk+8TvtDc5Yyez/qt3KfvgWTb89h35064huc9gMg49A19CitsRRaQNCZcW1FYZY443xpzb6HAMsMGNPNI8j9dHyn5HO9vO9/vjtvPrFr6Jv652G+8gIuIIixbUNviA/xhjfgC+AE7D6RIc52oqaZYvPpmsoWNJ6TOU0ncfo/rXJZTOfpTyL2eTOWQ0CTvv63ZEEQlzYd+Csta+AtwIPAuUA1cBw6y1K1wNJkGJ6dCV7DP+Qae/XUdUevbv23o8P5GaMm3rISJb1xZaUFhr/wf8z+0csmM8Hg+Ju/cjYed9A9t6zKTq50VULVtMav/jnG09YhPcjikiYSbsW1ASOX7f1uN+kvY5AuprWbfgVVY+cAnli+do2SQR+QMVKGl1UUnpdDz+YrqMvpvYHENd5VpK3vw/8h+9jg15P7odT0TChAqUuCauy650OXcCHU68DF9yBpsKl1HwxI2sfvU/1JaXuh1PRFymAiWu8ng8JPcaRNcL7yPtoBF4fNGBZZMuZc3HL1Jfu8ntiCLiEhUoCQvemHgyDjuT3AvuJcEcgL9mA2vmPUPe1MuptJ/h9/vdjigirUwFSsLKlmWTzryF6A5dqV1bRNEL/6Lw2dvZVLzS7Xgi0opUoCQsxffYh9xxU8gcOhZvXBLVv35N3sNXUjJ7GnXVFW7HE5FWoAIlYcvj9ZHa71i6XvRfUvoeBUD5wlmsfODvlH/xDv76OpcTikgoqUBJ2PMlpJB1zPnkjJ1EXLe9qK9eT8nbD5E/bTzVK75zO56IhIgKlLQZsZ12ovNZt9Hx5KuJSsli0+rlrHryZopemkLtumK344lIC2sTSx2JbObxeEja40ASdu3LugWvsvaTl6n84ROqfl5E2sCTSR1wAt7oWLdjikgLUAtK2iRvdCzph5xK1wvvI3HPg/DXbmLN/BnOtPQfF2haukgECKoFZYzZGzgG2B/oCNQBhcBC4A1r7dKQJRRpRlRqBzoNv5LqvkdROnsam1b/RtGLk4jfaW8yh44hpkM3tyOKyA5qtgVljBlkjJkLLAKOB9YAnwQebwDOAr43xrxrjBkU6rAiWxPffS9yxk4i86jznGnpy78h7+GrNC1dpA3bagvKGPMosBdwPzDcWrt2K+elAGcA9xpjvrbWjgpFUJFt8Xh9pO5/NEl7HsSa+TMo/3I25QtnUfHdR2QcdibJvY/A4/W5HVNEgtRcF9+b1tox23oDa205MBWYaow5pcWSiewgX0IyWUefR3KfIZTOnsaGFd9TMutByr94h6yjxhHXtafbEUUkCFvt4rPWvri9b2atfeGvxRFpOc609NvpOPxKfMmZbCr6lYLpWi1dpK0IdpJEAnAt8JS19mdjzFRgJPA5MNJauyqEGUV2mMfjIWnPg0jYdT/Wfvoy6z59lYpv51NpPyftoBGkHXA8nqhot2OKSBOCnWb+H5wJETHGmBOBc4ErgGrgvhBlE2kx3pg4Mg49g9wL/9NgtfSnWfnQ5VT+vMjteCLShGAL1InAGdba74C/Ae9aax8GrgGGhiqcSEuLTutE9injyT7zZqKzcqldU0jR8xNZNWMCNWUFbscTkQaCLVDxQJExxgscBbwdOO7HuSdKpE1J6NHbWS19yGg8sQlUL/uSlVOvoPT9J6nfVO12PBEh+KWOFuKMQRUD6cDLxpguwD+BBSHKJhJSHl8Uqf2HkbjnwZTNfZqKr99n3aevUPHNfDKPPIfEvQ7G4/G4HVOk3Qq2BfV3YCBwGfD/rLUFwPWAAS4NUTaRVhGVlEbH4y+my6iJxHbelbqKMla/ei+rnvwHG4uWux1PpN1q7kbdgcACa229tfZ7YN9Gp9xgrV0f0nQirSguZ3e6jJ7I+iXvUzb3aTas/IH8adeQ0mcI6YedgS8+2e2IIu1Kc118kwFjjPkQmA3MbrjmnoqTRCKPx0vKvoNJ7Hkga+Y/R/mityj/8h0qfviYjEPPJLnPYK1GIdJKmrtRdyDQA3gC6AW8bYz51RjzkDHmFGNMemuFFGltvrhEsoaOIXfcFOK696K+usLZJPHRa9mw8ke344m0C57t2ZbAGNMDZ1r5EOAwYBnOlPObQpKuBRhjdgJ+nTNnDrm5uW7HkTbI7/dT+eMCSt97nLryEgCSeg0i44iziUrOcDmdSNuWl5fHkUceCdDDWru84XPbtWGhtfZXfl93zwv0wylWIhGr4SaJaz956ffVKH76nPRDTiW137F4fFqNQqSlBV2gjDGH4axu3ni70qqWDCQSrrzRsWQcegbJ+xxO6XuPU/XTQsrmTGf94jlkHjWWhB693Y4oElGCXYvvXuASYAXOPlAN+YF7WjiXSNiKTs8m+2/XUbXsK0pnT6OmNJ/CZ24nsecAMgePIiq1g9sRRSJCsC2oc4Ax1tonQhlGpC1J2KUP8ef9m3Wfv86aj16g8scFVC39krSDRpA64AS8UTFuRxRp04K9UbcKZ+VyEWnAExVN2sCT6XrhfSTueRD+2k2s+eBZ8h66gqqfv3A7nkibFmyBugOYHJjFJyKNRKVk0Wn4lXQeeeuWRWgLn7+TwufupGZNodvxRNqkYLv4fgDuBJYaY/70pLW2xe5cNMZcARxqrT2pwbFuwDRgALAauMRaO6ulPlOkpcTvtDe546ZQ/sXblM1/jqqlX1D969ekDjiRtINOxhvdeI6RiGxNsAXqIZxFYR8jRLP2jDFJwC3AVcBrjZ6eAXwKHAccDLxijNnXWvtLKLKI/BW/L0J7EGXvP0XFN/NY+/ELVHwzj8who0kwB2gRWpEgBFugugLHhLggvImzWvpUoPPmg8aY3YH9gSHW2k3A+8aY14CxwI0hzCPyl0QlpdPxhEtI6TOEknceYVPRrxS9OIn4Hr3JHDqGmCzdOC7SnGAL1LvAIGCHC5QxJgZo6rZ7v7W2CGdDxAJjzK00KFDAnsAKa21lg2M/Av13NItIa4rr2pOcMXez/qt3KZv3LNW/LiHv4atIPWAY6Qefgjcm3u2IImEp2AL1GXC/MWYEsBSoafiktXZ8EO8xEJjbxPE6ICqwhUdTkvhzt2IVkBDEZ4qEBY/XR8p+R5O4x0DK5j7N+sVznL2nvv2QzCGjSOx5oLr9RBoJtkANwdm0MIk/b7sR1GJ+1tp5wI78H1iJs6NvQwlAxQ68l4irfAkpdDjuIpL3HUzpOw+zcdUyVr80hfge+5A5dKy6/UQaCKpAWWsPD3WQZnwPdDPGxFtrN+/F3TNwXKRNisvZjS6jJrJ+8RzK5j1N9a9fq9tPpJGt3gdljLnFGBP0/yXGmGRjzO0tE+t31loLLAEmGGNijTGHAycCz7T0Z4m0Jo/XR0rfoXS98L8k7zsY6utY9+krrHzwMip++ITt2WlAJBI114JaB3xnjHkBeMlau6DxCcYYD84Mu7OAk4F/hyQljMCZ6r4aKAHGWmu/DdFnibQqdfuJNK3Z/aCMMbnAeGAUUItzw24JzlhSB5zVzT3A48Aka+2K0MbdftoPStoSf33dlm6/+uoK8Eap208i2g7vB2WtzQMuNcZcj7NB4X5AJ6AeZ2bfbcBca+3Glo8t0v5s7vZL7DlAs/2k3Qt2kkQlzo20b4Y2jojANrr9jhpHTGaO2xFFQi7YxWJFxAWbZ/tlHXMB3vgkZ7bfQ1dSNvdp6mvUcSGRTQVKJMz9ebZfLWs/eYm8qZdRaT/XbD+JWCpQIm3E5m6/LqMmEtOpB7Xriil64W6Knp+oLT0kIgVVoAIz4UQkDMTl7E7OmLvJHDoWT2wCVUu/IO+hK1jz4Uzqaze5HU+kxQTbglpqjPnIGHOhMSYzpIlEZJs8Xh+p/Y6l64X3kdRrkLOT7/wZzk6+y75yO55Iiwi2QO0MvAFcBBQYY143xpy+PStNiEjLi0pKp+OJl9H5rNt+38l3xh0UvTiZ2vJSt+OJ/CVBFShr7Qpr7V3W2t4490ItAa4HiowxTxhjBocypIg0L757L3LHTSbjiLPxRMdS+eOnrHzwUtYueBV/Xa3b8UR2yI5MksgDluHsDRWFs7r5dGOMNcYc2JLhRCR4Hl80aQeeRNcL7yOx5wD8NRsomzOdvGlXU73iO7fjiWy3YCdJJBpjzgzsZFsI3IqzaWC/QKsqF2evp+dCFVREghOVkkWnEdeQffpNRKVnU1O8klVP3szqV/9DbcVat+OJBC3Y/aBWA5uAl4CjA3s7bWGtrTfGzAYOadl4IrKjEnbpQ+75/2bdJ6+w9pOXqPh2PlVLvyDjsJEk9x2Cx6O7TCS8BVugRgGvNbXmnjGmo7V2tbX2JZwCJiJhwhsVQ/qgU0naexAlbz9C9S9fUfL2Q6z/ei5Zx5xPbPbObkcU2apg/4SaAaQ0PmiM6YYzFiUiYSw6PZvs02+k48lX40vKYGPBz+Q/ei0lsx+lfmOV2/FEmrTVFpQx5gxgeOChB3jEGNO4BdUdKAtRNhFpQR6Ph6Q9DiRh530pmz+D8oWzKF/4JpU/fErm0NFaKV3CTnMtqHeBCqAy8Lg68P3mrwqcLTdOCmVAEWlZ3th4soaMJmfMv4jtsht1FWWsfmkKhTPu0JJJEla22oKy1pYAYwCMMctxNiRUX4BIhIjN7kGXUXey/qv3KJv7FNW/LCZv6uWkHTSCtANPwhMV7XZEaeea6+I7FnjXWlsDLAQOM8Y0ea61dlZo4olIKHk8XmeDRHMApXOmU/HNPNbMn0HFt/PJOvo84nvs43ZEaceam8X3BpCNM8X8jWbO8wO+lgwlIq3Ll5hKxxMuIbn34ZS89RA1pfmseuY2kvY6hIzB5xKVlO52RGmHmuvi8zb1vYhErvjuvcg9bwprF7zO2o9mUvHdh1Qt/YL0w0aS0ncIHq/+FpXWE3ThMcaMMcac0uDx88aYs0MTS0Tc4vFFk37QyeRecC/xu/SlfmMVpe88TMETN7Kx8Fe340k7EuxSRzcCk/ljV943wL3GmMtDEUxE3BWd1ons026g04hr8CVvvndqPKVznqB+0wa340k7EGwL6gLgdGvtlrX2rLX/BM4CLgtFMBFxn8fjIbHnALpecB8p/Y4DYN2C15zt5n9e5HI6iXTBFqh04Lcmji8DOrVcHBEJR97YeLKGjiFn1ERisnemtryEoucnUvTiJO07JSETbIFaAFxnjNkyqcIY4wOuwpmCLiLtQGyXXckZfReZQ0bjiYmj8scFrJx6GesWzsJfX+d2PIkwwS4WezUwB1hhjPkaZ2r53oHXHxOibCIShjxeH6n9h5HYcwAl70yj6qfPKZ09jYpv5pF17IVagFZaTLA76i4BDDABWAr8ANwB7Gat/Sp08UQkXEWlZJH9t2vpdMp4fMmZbFy1jPxHr6X03ceo31TtdjyJAEFPM7fWlgLvALOB+cA8a+36UAUTkbYh0RxA1wv+Q0r/YQCs+/wNVk69nMqf1Psvf01QXXzGmCRgGnAKUIOzunmUMeZdYIS1trK514tIZNu8AG1yr0MpnvUgmwqXUTTzLhJ270/WUeOISsl0O6K0QcG2oO7BGXM6EIgH4gLfdwHuDk00EWlrYjvvTM7oiWQOHYsnJo6qnz5n5dRLNYlCdkiwkyROBoZbaz9vcOxzY8zFwAvA31s8mYi0SR6vj9R+x5JoDqBk9jSq7GfOJIpv59PhuIuI6djd7YjSRgTbgvICJU0cLwOSWi6OiESKqJRMsk8Z70yiCOzimzftGsrmPk19TeO9T0X+LNgCNR+41RgTs/mAMSYWuAX4MBTBRCQyOJMo7iVlv6Ohvp61n7xE3sNXUr38G7ejSZjbnvugPgJWGmMWB471BjYAR4cimIhEDm9cIllHn0dSr0MonvUgNcUrWfX0rSTtcwSZR56DLyHZ7YgShoIqUNbapcaYPYCRwJ4427/PBJ621rboDQ/GmCuAQ621JzU4dgTOFvQNP+vuwHqAItJGxOX2JHfsJNZ++iprPppJxdfvU7V0EVlDx5C458F4PB63I0oYCbYFhbV2DXB/qIIEprLfgrN80muNnu4LzLTWnh6qzxeR1uHxRZN+8Ckk7nEgJbMeZMOK71n9yr3Ef/MBWUefT3RaR7cjSphobsv3hThLGm2TtbZ/C2R5EygGpgKdGz23H7D4T68QkTYrJjOHzmfdxvrF71P2/nSql31F3kOXk37o6aT2O06bI8o2t3xvMYEJFhlNPOW31hYBZ1hrC4wxt/LnAtUX6GCMuQjnJuHngJustZoKJNKGeTxeUvoMJmG3/Sh99zEqv/+YsveeoOLbj+hwnNb1a++a2/L9thb+rIHA3CaO1wFR1tqCpl4UWEE9D3gZeAzn5uCZOK278S2cUURcEJWUTqfhV1LV61CK336ITYXOun6pBxxP+qDT8EbHuh1RXBD0GJQx5lTgGmA3nBbN/wMKrbWTg3m9tXYeTutnu1hra4EjGxxaaoyZgLOChQqUSARJ2G0/una/l7J5z1K+cBbrFrxKpf2MDsddRHz3Xm7Hk1YW7Jbvo4D/A14CNt8L9SNwszHmutBE2/LZOcaYyQ3vwQpk0J7TIhHIG+Nsjthl1J1Ed+hK7ZpCVj11C8WzHqR+g5b9bE+CvVH3KuAia+1EnC45rLWPAKNxtoMPpVKc6e03GWOijDG7ATfhdPeJSISKy9md3LGTSB90GnijWP/Vu1olvZ0JtkDtAixq4vhiILvl4vyZtXYDzqaIg3CK1XycMah7Qvm5IuI+jy+a9ENOJXfcJGJzdqeuooyimXdR9PI91FWuczuehFiwY1AWGAw83Oj4qThdfS3GWntrE8cWA4e15OeISNsR06EbXc65g/JFb1E27xkqv/+Y6l+XkDlkDEm9BukG3wgVbIG6AXjBGLN/4DUXGmN2BYbh7BElIhJSm7eaT9i9HyWzHqT6168pfu0+Kr77kA7HXEBUage3I0oLC3bL97eA/kAs8C0wBGeSwgBrbeNVH0REQiY6rRPZZ9xMh2EX441LpHrZV6x86HLWLXoLv7/e7XjSgppbSeJY4G1rbT2AtfY7YFQr5RIR2SqPx0Ny7yOI36UPpe9Mo/LHTyl95xEqv/+YrGMvJCYr1+2I0gKaa0G9ChQYY/5tjNm3tQKJiAQrKimdTiOuptOIa/AlprFh5Q/kPXIVaz5+EX9drdvx5C9qrkDlAHcCBwBfGmO+McZcbYzp0jrRRESCk9hzALkX/Ifk3kdCXS1r5j1D/mPXsbFoudvR5C/YaoGy1q621t5nrR0I7Aw8A5wN/GaMmW2MOcsYE99aQUVEmuOLT6LDsP9H5zNvISq1I5uKfiX/0fGUzX8Of12N2/FkBwQ7SWK5tXaitbY3zkaFn+PM7CsyxuiGWREJG/E99iH3/HtI2f8YqK9j7YfPk//otWxc9Yvb0WQ7BXuj7hbW2u+BycBE4GecVpWISNjwxsSTddQ4Op91O1Hp2Wxa/Rv5j11L2bxn8NeqNdVWBF2gjDGpxphzjTFvAoXA9Thr8+0SqnAiIn9FfPe9yB03hZT+w8DvZ+3HL5L36DVsKFjqdjQJQrM36hpjUoGTgL/hrCRRDswAbrXWakEsEQl73pg4soaMJqnngRS/cT81xfkRRoEAABD1SURBVCspePx60g48kbRDTsUbFbPtNxFXbLUFFWgpFQEPAJU4K0Z0sdZequIkIm1NXNee5IybQuoBJzitqU9eJn/aNWzI/8ntaLIVzbWgkoCLgZnW2vJWyiMiEjLe6FgyB59LYs8BFL/xP2pK8ih44kZSDxhG+qDTtTFimGluR91DWzOIiEhrics15IybzJr5z7FuwWusW/AaVT8tosOwi4nr2tPteBKw3bP4REQigTcqhswjzqbLuXcSnZVLTVkBBdNvouTdx6iv2eh2PEEFSkTaubic3cgdO5m0g0aAx0P552+Q/8hVbMizbkdr91SgRKTd80RFk3HYmeSMvovoDl2pKVtFwfSbKJv7lO6bcpEKlIhIQGznXcgdM4nUA08CYO0nL5P36Hg2FmoVCjeoQImINOCJinbGps65g+iMztQUryD/setY8+HzWiG9lalAiYg0wZnpN4WUfsdCfR1r5j9H/uM3sKl4pdvR2g0VKBGRrfBGx5I1dCydR95KVGoHNhUuI3/aNaxd8Cr++jq340U8FSgRkW2I32lvcs+7h+R9B+Ovq6FsznQKnryZmrJVbkeLaCpQIiJB8MYm0OG4i8g+7UZ8SelszPuRvEeuYt2it/D7692OF5FUoEREtkPCrn3JPf/fJPUahL9mI6XvPELhM7dTu67Y7WgRRwVKRGQ7+eKT6XjiZXQccTXehBSql3/DyoevZP2S9/H7/W7HixgqUCIiOyip54F0Pf9eEswB+DdWUfzG/yh64V/UVa5zO1pEUIESEfkLfImpdBpxDR1OuBRvbAJVP31O3sNXUrX0C7ejtXkqUCIif5HH4yF570PJPe8e4rrvRV3lWgqfu5Pit6ZSv2mD2/HaLBUoEZEWEpXagc4jbyXjyHPAF8X6L2c7myJqi/kdogIlItKCPB4vaQNOJGf03UR36OZs4/H49az5cKZu7t1OKlAiIiEQ22kncsbcTeoBx4O/njXzZ1Aw/SZq1hS6Ha3NUIESEQkRb1QMmYNH0XnkrfiSM9mY/xN5D19F+Vfvajp6EFSgRERCbPNSSYl7HYy/ZgMlsx6kaObdmo6+DSpQIiKtwBefRKeTrqDjiZc709F/Xkjew1dQ+fMit6OFrSi3A2xmjLkMuAzIBCxwlbX2w8Bz3YBpwABgNXCJtXaWW1lFRHZUUq9DiOvak9Wv38+G376l6PmJJPcZQubgUXhj4tyOF1bCogVljDkZGA8MA9KBB4A3jDEdAqfMAL7GKV7nATOMMTu7kVVE5K9ypqPfQsbgc53p6F+9S/60q9m4apnb0cJKWBQooDNwp7X2e2ttvbX2MaAO2NsYszuwP3CztXaTtfZ94DVgrIt5RUT+Eo/HS9oBJ5A75l/EdOxGTdkq8h+/wdlrSqujA63YxWeMiQEymnjKb639X6NzBwFJwHfAgcAKa21lg1N+BPqHKquISGuJ6didLqPvpmzOk5QvmkXZnOlU/7qEDsdfQlRSutvxXNWaLaiBwKomvvIbnmSM6QU8B9xkrS3CKVRVjd6rCkgIdWARkdbgjYoh66ixdDr1emd19F+WBNbz+9LtaK5qtRaUtXYe4GnuHGPMMOBJ4C5r7b8ChyuB+EanJgAVLZ1RRMRNibvtT+y4KRS/dh/Vy7+h8LkJpPQfRubhZ+GJinY7XqsLlzGozbP4ngXGWWvvbvDU90A3Y0zDItUzcFxEJKJEJWeQfebNZBx+Fnh9lH/+BvmPX8+mkjy3o7W6sChQxphTgTuBwdbaFxs+Z621wBJggjEm1hhzOHAi8EzrJxURCT2Px0vawOF0OWcCUWmd2FT0K/mPjqd88XvtagWKsChQwHVALDDHGFPR4GtY4PkRwB4490A9Aoy11n7rUlYRkVYRl7MbueMmb9levuTNB1j98hTqNlRu+8URICxu1LXW9t3G8yuBY1opjohI2PDGJtDxxMuI33lfSt5+iMofPmVj/s90POkK4rr2dDteSIVLC0pERJqRvPeh5I6bQmyX3agtL6HgyX+wZv7zEb2FhwqUiEgbEZ2eTZdz7iBt4HDw+1nz4XOseuoWatcVux0tJFSgRETaEI8viozDz6LzmTfjS0pnw8ofyHvk6ohcdFYFSkSkDYrvsQ+546YQv0tf6jdUUPT8RErnTMdfV+t2tBajAiUi0kb5ElPJPu16Mo44Gzxe1i14lYKnbqa2vMTtaC1CBUpEpA3zeLykHXgSXc7+J77kDDbmWfIeuZqqpV+4He0vU4ESEYkAcV17Ol1+O/ehvno9hc/dSen7T7bpWX4qUCIiEcKXkEL26TeQcfhIp8vv01ecWX7lpW5H2yEqUCIiEcRZJulkOp91G76kDGeW37SrqVr2ldvRtpsKlIhIBIrvtie54yYTv3Nv6qvKKZxxB2Vzn25TXX4qUCIiEcqXmEr26TeRfugZ4PGy9pOXWPX0bdSuL3M7WlBUoEREIpjH4yX94FPoPPIWfIlpbFjxHXmPXEXVL0vcjrZNKlAiIu1AfPde5IybQvxOeztdfs/+k7IPng3rLj8VKBGRdiIqKY3sM/5B+qDTAFj70QsUPvtP6irXuZysaSpQIiLtiMfrI/2QUwNdfqlUL/+G/EfHs7FgqdvR/kQFSkSkHYrfaW9yxkwiNmd3Z/uO6TdRvniO27H+QAVKRKSdikrJpMtZt5Pcdyj+uhpK3vw/imdNxV9b43Y0QAVKRKRd80RF0+GYC+gw7GI8vmjWfzWbgif/ERarT6hAiYgIyb2PoMu5E4hKyWJjwc/kP3oN1b9962omFSgREQEgtvMu5IydRHyPfairXMeqp29j7Wev4/f7XcmjAiUiIls4C87eFNhWvp6y9x5n9Sv/pn7ThlbPogIlIiJ/4PH6yDj8LDqNuAZPTByV339M/uPXU1NW0Ko5VKBERKRJiT0HkDP6bqIzc6gpXkH+o9dS+fOiVvt8FSgREdmqmKxcckbfRYI5gPqNVRQ9P5GyD2bg99eH/LNVoEREpFne2AQ6jbhmy0aIaz+aSeFzE6mrrgjt54b03UVEJCJ4PB7SBp5M9uk34Y1PonrZlxQ8fj2bSkM3LqUCJSIiQUvYuTc5YyYR07E7NWUFFDxxQ8haUipQIiKyXaLTOtLl3Akk7XUIvoRkPN7QlJKokLyriIhENG9MPB1Pujy0nxHSdxcREdlBKlAiIhKWVKBERCQsqUCJiEhYCptJEsaYy4DLgEzAAldZaz8MPHcE8C5Q3eAld1tr/9nqQUVEpFWERYEyxpwMjAeGAD8C5wJvGGN2tdYWA32Bmdba012MKSIirShcuvg6A3daa7+31tZbax8D6oC9A8/vByx2LZ2IiLS6VmtBGWNigIwmnvJba//X6NxBQBLwXeBQX6CDMeYiwAM8B9xkrd0YxEf7AAoLC3c0uoiIhEiDf5t9jZ9rzS6+gcDcJo7XNcxhjOnF7wWoyBgTBeQBLwOPAV2AmYAfp1twWzoDjBw58i+FFxGRkOoMLGt4wOPWVr5NMcYMA54E7rLW3t3MeafgTJLYJYj3jAX6AatwiqGIiIQPH05xWti4VywsJknAlll8dwCjrLUvNjieA1wB3GCt3RQ4HAMEtf9w4Af+qIXjiohIy1nW1MGwKFDGmFOBO4EjrLWfNXq6FBgJVBljbgd6ADcBj7ZuShERaU1hUaCA64BYYI4xpuHx0621bxhjjgHuxSlWVcBDwD2tnlJERFpNWI1BiYiIbBYu90GJiIj8gQqUiIiEJRUoEREJSypQIiISllSgREQkLIXLNHPXGWN6Aw8C+wC/AGOstQubOK8bMA0YAKwGLrHWzmrNrG7ajt+TtkgBjDH9gTestR238ny7vp42C+L31K6vJ2PMEOAuYDec62SStXZqE+dF1PWkAsWWhWxfxbnXahAwAphtjOlurS1vdPoM4FPgOOBg4BVjzL7W2l9aM7MbtvP31K63SDHGeICxwORtnNpuryfYrt9Tu72ejDFdgRdxtiF6FWd3h3eMMcutte80Oj2irid18TkOA6Kttfdaa2ustTNwVlI/reFJxpjdgf2Bm621m6y17wOv4fwP1h4cRhC/p4D2vkXKbcBFOMt3NUnXExDE7ymgPV9POwHPWGtfDmxHtBCYBxzU8KRIvJ5UoBx7Aj80OvYjv+9H1fC8Fdbaym2cF6mC/T2B8xfvYGPMb8aYFcaYSYGFe9uLB621+wGLmjmnvV9PENzvCdrx9WSt/dBae+Hmx8aYDOAQ4KtGp0bc9aQC5UjCWUKpoSogYQfPi1RB/fyNtkjZAzgCGAy0i/ECAGttQRCntffrKajfk66n3xljUnFaRZ/hdPc1FHHXk8agHJVAfKNjCUDFDp4XqYL6+a21tcCRDQ4tNcZMAO4muD282ov2fj0FRdeTI9CF9yrwPTDSWlvf6JSIu57UgnJ8D5hGx3oGjjc+r5sxJn4b50WqoH5PxpgcY8zkwKSKzYLeIqUdae/XU1B0PW3ZZfwz4BXgFGttUz97xF1PakE55gIeY8wVwP04s9P2welS2MJaa40xS4AJxpjrcXYJPhE4sJXzuiWo3xPaIiUoup6C1q6vJ2PMLsAbwI3W2v9u7bxIvJ7UggICGyEeg/MPbhlwI3CStbbYGDPSGNOwiTwCpx98NfAIMNZa+21rZ3ZDsL+nwF93x+BMRS8F5gMz0RYp6HoKjq6nP7gYSAYmGmMqGnzdHenXk7bbEBGRsKQWlIiIhCUVKBERCUsqUCIiEpZUoEREJCypQImISFhSgRIRkbCkG3VFWogx5nGcLRG25jacVajnAsnW2lZZgsYY4wM+Bs6x1v7UzHleYAFwtrXWtkY2keaoBSXSci4DOge+Dgsc69/g2GTgk8D3lU28PlQuBZY0V5wAAmu73Y6zIaWI63SjrkgIGGN6Ad8APay1y13MEQesAI4IdkUBY8wynBUI5oUym8i2qItPpBUZYw6jQRefMcYPnAFcj7MQ7yLgLOAa4GygHLjeWvtk4PXJwBTgFMAPvA9c1sy2FacDaxsWJ2PMP4DzgQ44+3vdYK19q8FrXsZpDc5rgR9ZZIepi0/EfXcBlwMDgG7AlziFqR/wEjDVGJMUOPchnEJ2FHAoTpF6J7BnUlOOA97e/MAYMzzwWWfhrHT9JjDTGJPS4DVv42wOqD9gxVUqUCLu+5+1dq61djHOqtUVOK0ai7MgajzQwxizM06L6Exr7cJAq+hsnC3Bj97Ke+8PfNfg8U7ARuC3QNfj7cDJQE2Dc77H2fyuZ4v8dCI7SH8hibhvaYPvq4Dl1trNg8Ob9/2JBboHvrfG/GFbrgScVtUbTbx3J6CkweOncGYa/mKM+QJnd9bHrLXVDc4pDfy343b+HCItSi0oEffVNHrceKfUzaIC5/YB9m3wtTvw2FZeUw94Nj+w1hYD++G0uD4BRgFfByZ1bLb534W6oH8CkRBQgRJpO34AooFEa+1Sa+1SYBUwCadINaUQZzIEAMaYk4ELrLWzrbWX4bS81gPHNnhNhwavFXGNuvhE2ojAjqmvAdONMRcDxcAEnMkVP27lZV8AvRs89gGTjDFFODMGBwDZge836w2s4Y9djyKtTi0okbblXJxi8gqwEEgFhlhr127l/DdxZvsBYK2dCdyC0+r6CbgD+Lu19v0GrxkEvG2tVRefuEo36opEMGNMArAcONpa+2UQ53uB33BmCn4Y4ngizVILSiSCWWurcFpLFwf5khOBX1ScJByoQIlEvn8D+5hGc9MbC7SebgQubJVUItugLj4REQlLakGJiEhYUoESEZGwpAIlIiJhSQVKRETCkgqUiIiEpf8PnnaIy5it5akAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -773,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -788,7 +703,7 @@ "-23.876881009672466 " ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -808,12 +723,12 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -840,26 +755,9 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.4537935759242928 dimensionless" - ], - "text/latex": [ - "$1.4537935759242928\\ dimensionless$" - ], - "text/plain": [ - "1.4537935759242928 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "max_acceleration = max(abs(a)) * m/s**2 / params.g" ] @@ -873,7 +771,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -888,7 +786,7 @@ "1.625 " ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -919,7 +817,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -937,152 +835,9 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
values
1-21.43444396611346 meter ** 2 / second ** 2
11-21.778799793406385 meter ** 2 / second ** 2
21-22.1185904356283 meter ** 2 / second ** 2
31-22.453924142289296 meter ** 2 / second ** 2
41-22.78486198074548 meter ** 2 / second ** 2
51-23.111415158472745 meter ** 2 / second ** 2
61-23.4335416886762 meter ** 2 / second ** 2
71-23.751142173575644 meter ** 2 / second ** 2
81-24.064054490941942 meter ** 2 / second ** 2
91-24.372047155067598 meter ** 2 / second ** 2
101-24.67679574004737 meter ** 2 / second ** 2
111-24.97875199285987 meter ** 2 / second ** 2
121-25.27786764272998 meter ** 2 / second ** 2
131-25.57421210507495 meter ** 2 / second ** 2
141-25.867837825239334 meter ** 2 / second ** 2
151-26.158780104872434 meter ** 2 / second ** 2
161-26.44705675559671 meter ** 2 / second ** 2
171-26.732667571098236 meter ** 2 / second ** 2
181-27.0155936062971 meter ** 2 / second ** 2
191-27.295796249246642 meter ** 2 / second ** 2
201-27.57321606785513 meter ** 2 / second ** 2
\n", - "
" - ], - "text/plain": [ - "1 -21.43444396611346 meter ** 2 / second ** 2\n", - "11 -21.778799793406385 meter ** 2 / second ** 2\n", - "21 -22.1185904356283 meter ** 2 / second ** 2\n", - "31 -22.453924142289296 meter ** 2 / second ** 2\n", - "41 -22.78486198074548 meter ** 2 / second ** 2\n", - "51 -23.111415158472745 meter ** 2 / second ** 2\n", - "61 -23.4335416886762 meter ** 2 / second ** 2\n", - "71 -23.751142173575644 meter ** 2 / second ** 2\n", - "81 -24.064054490941942 meter ** 2 / second ** 2\n", - "91 -24.372047155067598 meter ** 2 / second ** 2\n", - "101 -24.67679574004737 meter ** 2 / second ** 2\n", - "111 -24.97875199285987 meter ** 2 / second ** 2\n", - "121 -25.27786764272998 meter ** 2 / second ** 2\n", - "131 -25.57421210507495 meter ** 2 / second ** 2\n", - "141 -25.867837825239334 meter ** 2 / second ** 2\n", - "151 -26.158780104872434 meter ** 2 / second ** 2\n", - "161 -26.44705675559671 meter ** 2 / second ** 2\n", - "171 -26.732667571098236 meter ** 2 / second ** 2\n", - "181 -27.0155936062971 meter ** 2 / second ** 2\n", - "191 -27.295796249246642 meter ** 2 / second ** 2\n", - "201 -27.57321606785513 meter ** 2 / second ** 2\n", - "dtype: object" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "m_cord_array = linspace(1, 201, 21) * kg\n", "sweep = sweep_m_cord(m_cord_array, params)" @@ -1099,12 +854,12 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1140,7 +895,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -1173,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1188,7 +943,7 @@ "0.0 " ] }, - "execution_count": 27, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1199,7 +954,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1214,7 +969,7 @@ "40.0 " ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1232,7 +987,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -1265,7 +1020,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1368,32 +1123,36 @@ "dtype: object" ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "system1 = make_system(params)" + "system1 = make_system(params)\n", + "system1" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "A termination event occurred.\n" - ] + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "event_func.direction=-1\n", "results1, details1 = run_ode_solver(system1, slope_func1, events=event_func)\n", - "print(details1.message)" + "details1.message" ] }, { @@ -1405,7 +1164,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1414,18 +1173,19 @@ "2.2118255911654763" ] }, - "execution_count": 32, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "t_final = get_last_label(results1)" + "t_final = get_last_label(results1)\n", + "t_final" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -1471,13 +1231,14 @@ "Name: 2.2118255911654763, dtype: object" ] }, - "execution_count": 33, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "init2 = results1.row[t_final]" + "init2 = results1.row[t_final]\n", + "init2" ] }, { @@ -1489,7 +1250,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1597,13 +1358,14 @@ "dtype: object" ] }, - "execution_count": 34, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "system2 = System(system1, t_0=t_final, init=init2)" + "system2 = System(system1, t_0=t_final, init=init2)\n", + "system2" ] }, { @@ -1615,23 +1377,16 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "A termination event occurred.\n" - ] - }, { "data": { "text/plain": [ - "8.09952482949752" + "'A termination event occurred.'" ] }, - "execution_count": 35, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1639,8 +1394,28 @@ "source": [ "event_func.direction=+1\n", "results2, details2 = run_ode_solver(system2, slope_func2, events=event_func)\n", - "print(details2.message)\n", - "t_final = get_last_label(results2)" + "details2.message" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8.09952482949752" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_final = get_last_label(results2)\n", + "t_final" ] }, { @@ -1652,12 +1427,12 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1682,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1697,7 +1472,7 @@ "-77.04609533183535 " ] }, - "execution_count": 37, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1715,7 +1490,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -1743,7 +1518,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -1752,12 +1527,12 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1774,7 +1549,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ @@ -1784,7 +1559,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": { "scrolled": true }, @@ -1798,7 +1573,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1818,7 +1593,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -1833,7 +1608,7 @@ "-74.62920556283255 " ] }, - "execution_count": 43, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1844,7 +1619,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -1859,13 +1634,14 @@ "-2.4168897690027933 " ] }, - "execution_count": 44, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "diff = min(results.y) - min(results_no_cord.y)" + "diff = min(results.y) - min(results_no_cord.y)\n", + "diff" ] }, { From 32f2a1156a84725d36d3ee2983266c28bdcf2dad Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Jun 2020 09:48:26 -0400 Subject: [PATCH 003/144] Run on Colab --- soln/chap08soln.ipynb | 356 ++++++++++++------------------------------ 1 file changed, 97 insertions(+), 259 deletions(-) diff --git a/soln/chap08soln.ipynb b/soln/chap08soln.ipynb index 7893a8f9..f32e3d1e 100644 --- a/soln/chap08soln.ipynb +++ b/soln/chap08soln.ipynb @@ -18,13 +18,27 @@ "execution_count": 1, "metadata": {}, "outputs": [], + "source": [ + "# If we're running on Colab, install modsimpy\n", + "# https://pypi.org/project/modsimpy/\n", + "\n", + "import sys\n", + "IN_COLAB = 'google.colab' in sys.modules\n", + "\n", + "if IN_COLAB:\n", + " !pip install pint\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], "source": [ "# Configure Jupyter so figures appear in the notebook\n", "%matplotlib inline\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", "# import functions from the modsim.py module\n", "from modsim import *" ] @@ -38,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -61,7 +75,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -91,11 +105,26 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "def read_table2(filename = 'data/World_population_estimates.html'):\n", + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates2.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates2.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def read_table2(filename):\n", " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", " table2 = tables[2]\n", " table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -106,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -116,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -275,25 +304,25 @@ "1954 NaN NaN " ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "table2 = pd.read_csv('data/World_population_estimates2.csv')\n", + "table2 = pd.read_csv('World_population_estimates2.csv')\n", "table2.index = table2.Year\n", "table2.head()" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -331,7 +360,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -355,20 +384,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.557628654" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "t_0 = get_first_label(census)\n", "t_end = get_last_label(census)\n", @@ -384,74 +402,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": { "scrolled": true }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
values
t_01950.000000
t_end2016.000000
p_02.557629
alpha0.025000
beta-0.001800
\n", - "
" - ], - "text/plain": [ - "t_0 1950.000000\n", - "t_end 2016.000000\n", - "p_0 2.557629\n", - "alpha 0.025000\n", - "beta -0.001800\n", - "dtype: float64" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "system = System(t_0=t_0, \n", " t_end=t_end,\n", @@ -469,12 +424,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { - "image/png": "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CfDRRx/RtGnTq50rhBCiljh16hR33HEHuP/Ol1ZbEpQToGnTpkRFRXk7FiGEEJXvR903MkhCCCFEjSQJSgghRI0kCUoIIUSNJAlKCCFEjSQJSgghRI0kCUoIIcQ1qeql8iRBCSGEqJDCwkK+/vpr/vrXv6J12b08K09tmQclhBCiBtBa8/XXX5OdnY3VasXHp7y9Oq+PJCghhBBXlZOTw/Lly9mzZw8ALVq0YNKkSURGRlbZMyVBCSGEuCLDMNixYwcrVqygoKAAHx8fRowYQb9+/bBaq7aXSPqgqplSir179/6ofPLkyXz++ecl7xcvXszkyZOJjo6mb9++3H///SX/crmSdevWcc899xAbG0u/fv2466672LRpU6V/BiFE/XDhwgX+85//8NVXX1FQUEC7du2YOXMm/fv3r/LkBFKDqpE2bdrE888/z+zZs4mOjqaoqIj58+dz9913s3LlSho1avSjaz777DNeeeUV/vKXvzBkyBAAvvrqKx544AHeeecd+vTpU90fQwhRS7lcLpKTk1mzZg3FxcX4222MGTOaXn36YbFYqi0OqUHVQDt27KB169b07t0bq9WKv78/Dz74IBMmTOD8+fM/Oj8/P5+//e1v/OUvf2HUqFH4+vri6+vL1KlTmTFjBocPHwbA6XQyZ84cRo4cSWxsLA8//HDJ/ZKTk5kwYQIvvfQSsbGxDBkyhNdee63kGf/73/8YNWoUffv25Sc/+Qlr164tua5s8hsxYgSrVq0q9zohRM105swZ3n33XVauXElxcTHtglxMNHbS7EhCSXLKyC7ktYXb2b7vTJXGUmcT1E2PfMVNj3x1Sdmf523kpke+YtOeUyVlyzcc4aZHvuL1/24vKUvPzOemR77i7ueWX3L9b/6ZwE2PfMWBYxlVGvuwYcPYt28f06dP54MPPmDPnj04nU6ee+452rdv/6Pzt23bRlFREUOHDv3RsQcffJCpU6cC8MEHH7Bo0SLmz59PYmIijRo14re//W3JuQcOHMDHx4f169fz17/+lTfeeIODBw9y/vx5nn76ad58801SUlKYNm0azz///FXnQFzrdUKI6udwOFizZg1z587lxIkThISEMLpRHgMKdxMcHELD/pNKzs3MLWRVylHeXbynSn+f62yCqs06dOjAl19+SadOnViwYAG33HILAwcO5M0337zs/wznz58nNDT0qsM9Fy5cyK9+9StatmyJv78/jz32GCkpKRw5cgQAi8XCzJkz8fHxYdCgQURERJCamoqvry92u53PPvuMXbt2ccstt7BixYqrVvWv9TohRPU6duwYc+fOZe3atbhcLvr06cOsWbPoNeFn+LfsQov7/s5pe4uS81s1bcDMn/Tg8bv6VOnvc53tg1r8yuQflT1zX/8flY2La824uNaXlDUODbjs9a/+dth1x+Xr64vD4fhRudPpxM/Pr+R9q1at+OMf/wiYCWjlypW8+OKLhIWFMW3atEuujYiIICMjg+Li4h8lqezsbPz8/PD19SUtLY0nn3ySZ555puS43W7nxIkT2O12goODL4nBx8cHl8tFcHAw77//PnPnzmX69On4+/tz9913M2PGjHI/a3nXSZISwvuKioqIj48vGUzVKKwho7q1ovOICeYJbXvh37oHL364mQ27TvLKw0PocEMYAGP7t67y+OpsgqqpmjZtSlpaGt27dy8pczgcpKWllewWfPvttzNmzBjuueceABo1asS0adPYtWvXZWdtR0dH4+/vT2JiIqNGjbrk2Msvv0xqairvv/8+kZGRPPPMMwwePLjk+L59+2jdujXbtm27YsyZmZkl/VfFxcV8++23PPTQQ/Tp0webzUZxcXHJuYZhkJmZedXrZNCGEN514MABlixZQmZmJhaLhT5tm9Lx5HqsG9ZR2Kkbfs3N7gSr1UrTRkH4+9o5eS63JEFVB2niq2YTJkzg9ddf5+DBgwBkZGTw0ksvERERQY8ePQC48cYbmTNnDqtWraKoqIiioiKSk5NJTExk5MiRP7qnr68vjz76KM888wzx8fE4HA7y8vKYP38+X375JbNmzQJgypQpvPHGG5w8eRKn08lbb73FHXfcQUFBQbkxnz9/nvvuu49Nmzbh4+NDkyZNsFgshIaG0rJlS4qKili6dClOp5P333+f3Nzcq14nhPCOvLw8vvjiCz766CMyMzNp0jiMyeE5dEpdgbUol4B20WzYn8X3R34YkHXb6I7M/cNIhkRX747mUoOqZrNmzcJmszFjxgzS09Px8/Ojf//+vPfeeyXNc3fddRf+/v7Mnj2bxx9/HMMwaNeuHc888wyDBg267H1vu+02QkJCmDt3Lk888QSGYdClSxfmzZtH3759AXjggQdwOBzccccdZGRk0LFjR+bNm0eDBg3K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\n", + "image/png": "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CfDRRx/RtGnTq50rhBCiljh16hR33HEHuP/Ol1ZbEpQToGnTpkRFRXk7FiGEEJXvR903MkhCCCFEjSQJSgghRI0kCUoIIUSNJAlKCCFEjSQJSgghRI0kCUoIIcQ1qeql8iRBCSGEqJDCwkK+/vpr/vrXv6J12b08K09tmQclhBCiBtBa8/XXX5OdnY3VasXHp7y9Oq+PJCghhBBXlZOTw/Lly9mzZw8ALVq0YNKkSURGRlbZMyVBCSGEuCLDMNixYwcrVqygoKAAHx8fRowYQb9+/bBaq7aXSPqgqplSir179/6ofPLkyXz++ecl7xcvXszkyZOJjo6mb9++3H///SX/crmSdevWcc899xAbG0u/fv2466672LRpU6V/BiFE/XDhwgX+85//8NVXX1FQUEC7du2YOXMm/fv3r/LkBFKDqpE2bdrE888/z+zZs4mOjqaoqIj58+dz9913s3LlSho1avSjaz777DNeeeUV/vKXvzBkyBAAvvrqKx544AHeeecd+vTpU90fQwhRS7lcLpKTk1mzZg3FxcX4222MGTOaXn36YbFYqi0OqUHVQDt27KB169b07t0bq9WKv78/Dz74IBMmTOD8+fM/Oj8/P5+//e1v/OUvf2HUqFH4+vri6+vL1KlTmTFjBocPHwbA6XQyZ84cRo4cSWxsLA8//HDJ/ZKTk5kwYQIvvfQSsbGxDBkyhNdee63kGf/73/8YNWoUffv25Sc/+Qlr164tua5s8hsxYgSrVq0q9zohRM105swZ3n33XVauXElxcTHtglxMNHbS7EhCSXLKyC7ktYXb2b7vTJXGUmcT1E2PfMVNj3x1Sdmf523kpke+YtOeUyVlyzcc4aZHvuL1/24vKUvPzOemR77i7ueWX3L9b/6ZwE2PfMWBYxlVGvuwYcPYt28f06dP54MPPmDPnj04nU6ee+452rdv/6Pzt23bRlFREUOHDv3RsQcffJCpU6cC8MEHH7Bo0SLmz59PYmIijRo14re//W3JuQcOHMDHx4f169fz17/+lTfeeIODBw9y/vx5nn76ad58801SUlKYNm0azz///FXnQFzrdUKI6udwOFizZg1z587lxIkThISEMLpRHgMKdxMcHELD/pNKzs3MLWRVylHeXbynSn+f62yCqs06dOjAl19+SadOnViwYAG33HILAwcO5M0337zs/wznz58nNDT0qsM9Fy5cyK9+9StatmyJv78/jz32GCkpKRw5cgQAi8XCzJkz8fHxYdCgQURERJCamoqvry92u53PPvuMXbt2ccstt7BixYqrVvWv9TohRPU6duwYc+fOZe3atbhcLvr06cOsWbPoNeFn+LfsQov7/s5pe4uS81s1bcDMn/Tg8bv6VOnvc53tg1r8yuQflT1zX/8flY2La824uNaXlDUODbjs9a/+dth1x+Xr64vD4fhRudPpxM/Pr+R9q1at+OMf/wiYCWjlypW8+OKLhIWFMW3atEuujYiIICMjg+Li4h8lqezsbPz8/PD19SUtLY0nn3ySZ555puS43W7nxIkT2O12goODL4nBx8cHl8tFcHAw77//PnPnzmX69On4+/tz9913M2PGjHI/a3nXSZISwvuKioqIj48vGUzVKKwho7q1ovOICeYJbXvh37oHL364mQ27TvLKw0PocEMYAGP7t67y+OpsgqqpmjZtSlpaGt27dy8pczgcpKWllewWfPvttzNmzBjuueceABo1asS0adPYtWvXZWdtR0dH4+/vT2JiIqNGjbrk2Msvv0xqairvv/8+kZGRPPPMMwwePLjk+L59+2jdujXbtm27YsyZmZkl/VfFxcV8++23PPTQQ/Tp0webzUZxcXHJuYZhkJmZedXrZNCGEN514MABlixZQmZmJhaLhT5tm9Lx5HqsG9ZR2Kkbfs3N7gSr1UrTRkH4+9o5eS63JEFVB2niq2YTJkzg9ddf5+DBgwBkZGTw0ksvERERQY8ePQC48cYbmTNnDqtWraKoqIiioiKSk5NJTExk5MiRP7qnr68vjz76KM888wzx8fE4HA7y8vKYP38+X375JbNmzQJgypQpvPHGG5w8eRKn08lbb73FHXfcQUFBQbkxnz9/nvvuu49Nmzbh4+NDkyZNsFgshIaG0rJlS4qKili6dClOp5P333+f3Nzcq14nhPCOvLw8vvjiCz766CMyMzNp0jiMyeE5dEpdgbUol4B20WzYn8X3R34YkHXb6I7M/cNIhkRX747mUoOqZrNmzcJmszFjxgzS09Px8/Ojf//+vPfeeyXNc3fddRf+/v7Mnj2bxx9/HMMwaNeuHc888wyDBg267H1vu+02QkJCmDt3Lk888QSGYdClSxfmzZtH3759AXjggQdwOBzccccdZGRk0LFjR+bNm0eDBg3K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\n", "text/plain": [ "
" ] @@ -506,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "scrolled": false }, @@ -520,7 +475,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3hUVfrA8W86JXQChA4Cr4CA9KIUFREQBREQBcGOwrLq/lh3FUGx7Ipt3VUQBWwUIUhTRAVBEESKiAoKhypFOgklJKTMzO+PeydOQhImJJOZSd7P88zDzG3z3nvDfefcc+45IS6XC6WUUirQhPo7AKWUUio7mqCUUkoFJE1QSimlApImKKWUUgFJE5RSSqmApAlKKaVUQNIEpQqEiHwuIguzTKsnIi4R+S7L9Ioi4hSR3pf5XatE5NVc5n8iIh9czrZ9TUS62cck2svl64pIX4/Pv4vIX3wXYcG61LnKw3ZCRORBESlhf75HRE7mP0IVyDRBqYKyCmifZVp34BDQTkTKekzvBDiANYUTWlB7H+js8bkt8J6fYrkc/YEJBbCdLsC7QLj9eS7QpAC2qwKYJihVUFYBsSJS22PaDVgX2ASgm8f0TsAPxphzhRZd8Arx/GCMOWGMSfJXMHlljIkvoPOc9TgkG2OOF8B2VQALv/QiSnnlR+AsVinqgIiEANcDUwDBKk19ai/bCVjpXlFEegDPA1cBJ4G3gFeNMS4RedbeZijQAfhr1i8WkbuBZ4BYYDYQmVOQInIP8BjWL/C/Y5XkpgJPG2Oc9jJtgJexSiuJwEf2/DQR6QYssrfxb6AkEAc8aoxJtud/A5QxxiTa23sW6GOMaZNNPA2B17BKCCWBXcBTxphP7duUXYGuIjLAGFNXRH63j81b9jEeDfwFqA3ssNddam/7AyDJ3u4A4BQwzRjzQg7H5gMgBYgGbgMOA+OMMR97zA8HGtqvQVil4KeAYfbx/wH4P2PMBnudVVg/RsbYn4cBTwM17XjHGWM+94jhEeBxe/424G9YpfBv7EXOici99vtXjTGVPY7jq/ZxdAILgL8ZY86JSF1gHzAQ6++sFrAJeNgYY7I7FiowaAlKFQhjjAP4DiuJADTHutB9j5WMbgQQkXCsC/9K+3MXYCnwGdAS62I3DhjpsfmewLf2tpd6fq+IXId1y+t1oBVWQrnlEuE2BvpgJdB7gYfs70REGgGrgd/sOB8E7gb+5bF+NFZyux24FSv5Tr7Ed17ETjCfAefsfbsa2Aq8LyKRwKNYx+9tO5asnsK6fTYe63gvAj4VkRYeyzyAdYFvA0wDnheR1rmEdQ/WD41WWD8UZtpJ122IHc/1wDp7mfuAUVjn71dguYjEZrO/NwH/s+NtBrwDfCIiHe3592Il65fs/fkG+Nw+Prfbm7kC68eF53YrAmuBNKzbof2Ba7n4VuizwAjgOqxkmu+6MeVbWoJSBWkV1gUbrNt7a40xKSKyEpgiIjWA6kAY1sUNrBLRlx6/6neKSE2si+8ke1oy8G+PEo7ndz4MLDLGTLbn/Q0roeUmHBhijPkd+ElEXgD+KSLPYSWrvcBoY4wL2CEijwMz7JIQdvwPG2PWeXxnnIg86sUx8lQSK2m8Z4yJt7f1KjAYqGqMOSgiqUCSMeaE54p2cnsMeNEYM8ee/KyItAeewEokAHuMMePs9y/Y+9Ia2JxDTPuBUfax3mEnp0ewzi2AMcZ8YMdQHivBD/YotT2ClRz+AozNsu2ngFc84t1jJ8v/wyrhjQTeMca8Z2/rn/ZyFYB4+/1xu6Tqud27sH5s322MSbbXvQdYb//gSHXvvzHmW3v+ZOCfqICmJShVkFYDrexS0g3ACgBjzC7gINaFqxOw3n0hAZpilRI8rQWq2xdAgH3u5JSNq7BuL2J/lwvr9k1uDtrJyW0jUBWobMez3t6OZzwRWLe1wLot+H2W9SOwbmV6za5Lehu4XUTeEZFv+PPWZ9glVq9ix5vdsWvq8XlXlvnn7Fhzsi7Lsd6IdYzd9ni8FzvOjBjsdddlicGtKTBORBLdL2A4fx63JnicO2OMyxjzD2PM7lzidW/3J4+/KeztpJK5IcVOj/dnyf04qACgJShVkDYD6Vi3h7pg3VJxWwlcg3VhXekx3fOi4uauEA/NZZnslndLJfe/7fQsn93f4/AyHqf9ym797IYHyDYWESkNbLC/cyFWHV0if5ZWcpPTMQkh8w/P1ByWyUl2x8aRw/d6G4NbOPAk1m1NT2n2v6lkf/wu5XKPRW7HQQUALUGpAmOMSceqh7oX60L3o8fslUALrLoWzwS1HeiYZVOdgONYrf8u5Rcubt7e6hLr1BaRyh6f22GVquLteDrYt9A840njz9JDBJlLFe2AC4Dhz4tgOY/59XOIoxtWqayzMeZfdmOBqvY89/dne8E2xpzFasSQ3bHbkcP3eSPrsWsH/JzDsruxjktGDPZx65BDDNuBOsaY3e4XVkOLO+35O7N+v4j8KiK3k3vi2g60EJGSHtPaYJ2n/BwL5WdaglIFbTVWK63ldsMJtxVYt7NcWKUGt1eAH0TkaazK71ZYv7Ldrfgu9X3/BdbY9UBLsFqTtcBKXDmJAD4QkX9gVbqP5c9GEJOw6sXeFJG3gHpYFfcfGmPOeMQz1a5vKWvPn2aMOS8iv2L9on9eRJ7HqpC/mYtvtYHVqi4SuMNu7dYKeMOeF2X/mwg0EJEaxpg/sqz/EvCciBzCKr3eAdxE5ib9edXSrpP7CKshSS+sku9FjDFJIvIm8B8RScKqu/sLVkKems0qLwMfi8gOYDlWQ4sJWI1QAP4DTBORn4D1WA08qmI1kHE/vtBaRLLWn83CauTiriesgNVo5WtjzG92Kz4VhLQEpQraKqA0mUtJ2BfXQ1gNJ9I8pv+E1epqIFaz4n9hNQX2bDWXI2PMenvdB7F+6TcBPr7Eaqew6lbWYSXNV7BaAWKMOYzVyKKVvb1pWBfrUVm2MQf4CvgEmI/VHNpdsrkPK0n8BvQjhwdV7djHYiWa37Bat43BKjm6W9q9jZUgfhaRrP9f38K66L+M1fqvL1Zz9vw8AL0Mq1T3s70ftxljNuay/JNYPyzexyoxNwOus+sdMzHGLMRqFv83rP39OzDS3WjC/vdp4EV7f7oAvewGIluxfoAsw2rI4rndJKxzVhar7mkBVl1c/7zvvgokITqiripO7NZdGc/PXMb63cjynFNRYT/nFG2MGVCA21wLfGuMeaqgtqmKD73Fp5QqcHZ9UDOgEdbD00rlmd7iU0r5QmuskuZOsjxYq5S39BafUkqpgBT0t/hEJAqrG5gjZH5eQymlVOALw+p6apMxJsVzRtAnKKzkpMM2KKVUcOuM1foyQ1FIUEcAZs2aRbVq1fwdi1JKqTw4evQoQ4YMAfta7qkoJCgHQLVq1ahZs6a/Y1FKKXV5Lqqi0VZ8SimlApJfEpSItBORbEfDFJE37W5flFJKFWOFeovP7kjyfnIYKExEemGNPbM2u/lKKaWKj8IuQU3ASkAXDTktIjHAm1h9jymllCrmCjtBTTHGtAZ+yGbee1idZu7JZp5SSqliplATlN1T9EVEZCTgNMZMK8x4lFJK5Y3L5cLhcJCWlkZKSsqlV8gHvzczF5HGWN3ut/N3LEopVdhcLhfp6emkpaVlejkcDhwOB+np6Zf93v1yOp2ZXtlN8+blcFzcWU+LFi3o16+fT46N3xMU1pgtVYBd9mBwUUCEiJw2xpT3a2RKKWVzuVykpqaSmppKSkpKxiunz1kTTlpaWraJKD093d+7lmehoaEZr+joaJ99j98TlDHmRawBygAQkceAfsaYbn4LSilVJLmTTHJycq6vCxcuZPrsTjy+Eh4eTkRERMYrPDyc8PBwwsLCCAsLu+h9aGhorvOzvvdMKJ6v3Obl9AoJCSEkJMRnxyLTcSmUb1FKKR9xuVxcuHCBc+fOcf78eRITEzP96365P2d3m8pbERERREVFERkZSVRUVMYrMjIy0zT3Z8+kk9MrPDy80C74wcYvCcoYswrI9vadMeYN4I1CDShAiAiLFi2icePGmab37duX4cOH07+/NYL1Z599xrRp0zhw4ADh4eFcffXVPPbYYzRt2jTHba9Zs4bp06ezfft2XC4XIsLo0aNp106r/lTgcrlcpKSkcObMGc6ePXvRyz09LS3N621GRERQsmTJHF8lSpS4aJo76YSGauc7hUlLUEFm48aNvPDCC0yePJmWLVuSmprK+++/z/Dhw1m2bBkVK1a8aJ1PPvmE1157jeeff54uXboAsHjxYh566CGmTZtGmzZtCns3lMrgdDo5e/Ys8fHxJCQkZLzcn71pKRYREUHZsmWJjo6mdOnSlC5dOtv30dHRREREFMJeqYKgCSrI/Pzzz9StW5fWrVsDUKJECR555BGOHj1KfHz8RQkqOTmZl156iZdeeonu3btnTB84cCAnT55k3759tGnTBofDwdSpU5k3bx6JiYl06NCBZ555hooVK7Jhwwaee+45unbtyvz584mKimLgwIGMHj0agPnz5/P2229z5swZateuzaOPPkqXLl3YsGEDo0aN4ocf/nzs7frrr+epp56ie/fuOa6niqaUlBROnjzJiRMnOHHiBCdPnuTkyZOcPn0ap9OZ43oRERGUK1eOsmXLXvRyT4+KitLbZEVQsUxQt/zfYgA+e61vxrTnpq9n02/HGHdfe9o1tYbt+PL735n0yc/c1KEOfxl4NQCnziRzz3PLqFg2ig+f6Zmx/mP/WcWeQ2f4z2NdaVDLuns5+6sd3HXTlQUae7du3Zg8eTLDhg2je/futG7dmiuvvJIJEyZku/yWLVtITU2la9euF8175JFHMt5/9NFHfPrpp7z//vtUqVKFiRMn8vjjj/Phhx8CsHv3brp3787atWvZsGEDDzzwAL1796ZChQqMGzeOxYsX07BhQ+bNm8cLL7zAV199let+xMfH57ieXmiCm8Ph4MSJExw9epSjR49mJKWzZ8/muE50dDQVK1akQoUKGS/351KlSunfRDFVLBNUMGvYsCGLFi1i1qxZzJ07lxdffJEKFSowfPhwHn744Yv+I8fHx1OuXLlL3taIi4tj9OjR1K5dG4C///3vtGnTht9//x2AkJAQRo4cSUREBNdeey0xMTHs37+fqlWrEh4ezieffEKfPn3o378/AwYMuOQFJTIy8rLWU4ElNTWVY8eOcfToUY4cOcLRo0c5fvx4tg0RwsLCqFy5MpUrVyYmJoaYmBgqVapExYoV9babylaxTFCeJSe38fd3uGhaz4516dmxbqZplcqVzHb9Nx7vdtG0vJaeIiMjs30mwuFwEBUVlfG5Tp06PPXUU4CVgJYtW8bEiROpUKECgwcPzrRuTEwMp0+fJi0t7aKLwLlz5zIqfw8fPszYsWMZP358xvzw8HD++OMPwsPDiY6OzhRDREQETqeT6OhoPvzwQ9555x2GDRtGiRIlGD58OCNGjMh1X3NbT5NUYHK5XCQkJHDw4EEOHTrEoUOHOHbsGC6X66JlK1asSLVq1ahWrRpVqlShcuXKVKhQQRsZqDwplgkqUFWrVo3Dhw/TrFmzjGnp6ekcPnw4Y7Tgu+66ix49enDPPfcA1oVg8ODBbN26FWPMRdts2bIlJUqUYPXq1ZnqoABeeeUV9u/fz4cffkiVKlUYP348nTt3zpi/c+dO6taty5YtW3KM+cyZMzgcDqZMmUJaWhrfffcdo0ePpk2bNoSFhWVqXeVyuThz5swl19NGG4HB6XRy5MgR9u3bl5GUkpKSMi0TEhJC1apVM5JRbGws1apVy/RjRqnLpQkqgNx888289dZbNGjQgCuuuILTp08zefJkYmJiaN68OQC9evVi0qRJ1KxZM6NBwZYtW1i9ejUvvfTSRduMjIxkzJgxjB8/npCQELp27Upqaipz585l0aJFTJtmdX/Yr18/Jk2aRIMGDahSpQrTp09n6tSprFixIteY4+Pjuf/++5k6dSrt2rWjatWqhISEUK5cOcqVK0dqaipLly7lpptuYsaMGZw/f/6S6yn/cLlcHDt2jH379vH777+zf//+i1rQlS5dmpo1a1KzZk1q1apF9erV9fac8hlNUAFk1KhRhIWFMWLECE6dOkVUVBQdOnTggw8+yLgI3H333ZQoUYLJkyfzxBNP4HK5uOKKKxg/fjzXXnttttu94447KFOmDO+88w5PPvkkLpeLJk2aMH36dNq2bQvAQw89RHp6OkOGDOH06dM0atSI6dOnU7Zs2VxjrlevHhMmTGDcuHEcP36cChUq8PTTT9OwYUMAnn76aV555RWeeeYZ+vbtS6tWrbxaTxWOpKQkdu3axa5du9i7dy/JycmZ5lesWJG6detSp04datWqRfny5fUWrCo0IdndPw4mIlIX2LdixQpq1qzp73CUCmjuUtLOnTvZtWsXhw4dyjS/bNmy1KtXj3r16lG3bl0t0SqfO3ToEDfccANAPWPM757ztASlVBHndDo5cOAAv/32Gzt27ODcuXMZ88LCwqhbty4NGzakQYMGVKxYUUtIKmBoglKqCHI6nezfvz8jKSUmJmbMK1OmDA0aNKBRo0bUr1+fyMhIP0aqVM40QSlVhBw7doyffvqJbdu2ZUpKFSpUoEmTJjRp0oTY2FgtJamgoAlKqSCXmJjI1q1b+fnnnzl27FjG9IoVK2YkpWrVqmlSUkFHE5RSQcjlcrFnzx42b96MMSbjYdkSJUpw1VVX0aJFC2rUqKFJSQU1rxKUiIQBrYE2WKPfOoCjwCZjzE++C08p5SkpKYktW7awefNmEhISAGt000aNGtGiRQsaNmxIeLj+7lRFQ65/ySJSAfgr8AhQCdgLnALCgMpAHRE5AkwBJhljTvs2XKWKpyNHjrB+/Xp+/fXXjH7uypUrR+vWrWnZsqVPh91Wyl9yTFAiMgx4DlgB3A98bYxJybJMWaAzMATYJiJjjTEf+jBepYoN9228devWsW/fvozpDRs2pE2bNjRo0ED7tlNFWm4lqLZAW2PMiZwWMMacBT4HPheRWGAsoAlKqXxwOBxs27aNdevWcfz4ccDqnLdVq1a0b9+eChUq+DlCpQpHjgnKGDM6LxsyxhwB/pLviIoxb4Z8f/PNN5k6dSoLFiygQYMGGctkNzig24IFCxg7diwlSpQArGdkqlevzoABA7jvvvsyKtKvv/56Tp48SVhYWKb1q1SpkjG+0/79+3n55ZfZuHEj6enp1KhRg8GDBzN06NCLvrd3794kJiayYsUK7a/NCw6Hg59++ok1a9ZkdKobHR1N+/btad26NSVLlvRzhEoVLq9rU0WkCtAciAAyNQ0yxiwt4LhULlJSUhgzZgxxcXFeP2TZqFEjFi+2Bmp0uVxs2bKFMWPGcPbsWR5//PGM5V5//fWLej13czqdPPjgg/Tp04dXX32VEiVK8NNPPzFq1CgiIyMZNGhQxrIbN24kIiKCmJgYli1bxs0335yPPS7asktMMTExdOrUiauuukobPahiy9tWfPcDk7GSU1YurEYTqpB07NiRw4cP88Ybb/DEE0/kef2QkBBatWrFCy+8wEMPPcT9999/yU5hARISEti/fz99+vTJ+DXfsmVLnnjiCVJTUzMtO3fuXG688UYqVarEjBkzNEFlw+l0ZiSm06et9kUxMTF07dqVJk2aaBNxVex5+9Ps78BU4EljzLlLLRzo9r54e47zKvcaQdlWPQA4++MyTn7xTo7L1h87P+P9oel/J/Xo3lyXKSilSpXi5ZdfZujQoXTt2pX27dtf1nY6duxIaGgoW7ZsyXZI+KwqVapEu3btuPfee7n11ltp27YtLVu2pF+/fpmWi4+PZ8WKFXzxxReUKVOGl19+ma1bt2Ya56o4c7lc7Nq1i+XLl3Py5EkAKleunJGYtOGDUhZvE1Qt4L9FITkVFVdffTUjRozgn//8Z8atu7xyj7/k2SXOmDFjLrqldM899/CXv1jVi9OnTycuLo7ly5fz0UcfkZ6eTteuXRk/fnzGoIoLFy6kY8eOxMbGAnDrrbcyc+ZMJk6ceFlxFiWHDx9m+fLl/P7774DVBdF1111H06ZNNTEplYW3CWoZcAOwy4exFBpvSzVlW/XIKE1dSs37X8lPSID3Q767jRw5krVr1zJhwoRM9T/ecjgcnD17NiORALz66qs51kG5Yxw6dChDhw4lNTWVzZs388Ybb/Doo48yd+5cXC4XcXFxHD9+nGuuuQaw6sxSUlJ44oknqFSpUp7jLArOnDnDypUr+eWXXwAoWbIkXbp0oW3bthc1SlFKWbxNUD8Dr4vIrcBOIFOFgzEmTxUhItIOWGKMqWJ/rgL8FysJhgBfAI8aYxLyst1g582Q757CwsJ45ZVX6Nu3L6VKlcrz923cuBGXy0WjRo28Wn7u3LnMmTOHhQsXAlay6tixIxERETzwwAMArF+/ntOnT/Pll19mKhGMGDGCOXPmMGrUqDzHGcwcDgfr1q3j22+/JT09nbCwMNq1a0fnzp21VZ5Sl+DtPYWuwAagJNAC+xkp+9XG2y8TkRAReQCrRObZ/GwakA7UAxoCFYBJ3m63qHAP+b5nzx4ATp8+zcsvv5xpyPesateuzVNPPUVcXJzX3+N0Otm4cSPjxo1jxIgRXvdC0LVrVw4cOMDEiRM5deoULpeLgwcP8v7777sHHGPu3Ln07NmTqlWrEhMTk/G67bbbmDNnDmlpaV7HGez27dvHlClTWLlyJenp6TRt2pRRo0bRo0cPTU5KecGrEpQx5roC+r4JwM3AC8DTACISCjiBCcaY8/a0qcBbBfSdQcObId+zM3DgQFavXs369etzXGbnzp20bNkSgPDwcGrUqMEDDzzA4MGDMy33t7/9LdtbTl9++SXVqlVj9uzZvPnmm/Tp04fk5GQqVKhAz549+etf/8qpU6f4+uuv+eCDDy5av0+fPkycOJGvvvqKPn36eHlEgtO5c+dYvnw5W7duBazGJb1796Z+/fp+jkyp4OL1kO8iUhXrQdymWCWv7cBUY8zFTddy3kZ1Y8xhEekGLDLGlM9hufeASsaYvl5ssy465LsKAC6Xi82bN/P111+TkpJCeHg4nTt3plOnTvosk1I5yPeQ73ad0XLgILAOq56oDzBaRLoZYy7uviAbxpjDXnzXGKAf0MmbbSoVCE6fPs2nn36a0Wdeo0aN6Nmzp3ZLpFQ+ePuz7jXgY+ARY0xGkUtE3gJeAfJ9C1BEIoA3gVuA640xO/K7TaV8zV1qWr58OampqZQqVYrevXvTtGlTf4emVNDzNkG1AR7wTE62N4HN+Q1CRMoAnwFlgHbGmD/yu02lfC1rqalx48bcfPPNlC5d2s+RKVU0eJugjgB1AZNlen2gIB7enYNVr9XZGJNUANtTyqd++eUXPv/8cy01KeVD3iaoGcC7IvIY4G4q1hH4jz3vsolIc6A3kAIcFxH3rNPGGG31oAJKSkoKS5cuzXjgVktNSvmOtwnqRaA6EIdV0gkB0rBu8Y3N65caY1YB5e33v5Cld3SlAtHhw4eZP38+8fHxhIeH06tXL1q2bKmduirlI94+B5UKPGi3sBMgGdhtjEn2ZXBKBQKXy8X333/PihUrcDqdVK1aldtvv52YmBh/h6ZUkZbbkO+9geXGmDT7fVa13LfjdDwoVVQlJyezcOFCdu2yuqFs164dN954oz7XpFQhyO1/2RKgGnDcfp8THQ9KFUnHjh1j7ty5JCQkULJkSfr27YtHHalSysdyG/I9NLv3Kvi8+eabbN++ncmTJ+e6nPuJ7k2bNnk1gGFRtnXrVj799FPS09OJjY1l0KBBlC+fbccnSikf0fsUSnlwOBwsX76cDRs2ANa4W7179861L0SllG/kVgd1Auv23SW5h81Q+XPo0CH69evHo48+ypQpU0hLS2P06NGEhoYyZcoUUlNTeeSRR7jnnntYt24dr732Gvv27aNGjRqMGjWKnj17Zmxn7Nix/PLLL9SvX/+iTkrj4uKYPn068fHxNG/enGeffZZatWr5Y5cDyvnz55k3bx779+8nNDSUnj170qZNG22lp5Sf5FaC+jteJqhgMnv27IwK78LQsGFD7rrrLq+XP3fuHNu2beObb77h66+/ZsyYMfTt25cVK1awZs0aRo8eTbNmzRgxYgQTJ06kR48ebNq0iZEjRxITE0Pr1q159NFHadKkCVOnTsUYw/3330+bNtaoKMuWLeN///sf77zzDg0bNuT999/nwQcfZMmS3KoZi74TJ04we/ZsTp8+TXR0NIMGDdKkrZSf5VYH9UEhxqE8jBw5MmMwQIfDwbBhw4iMjOS6667D4XDw3nvv0b59e3r3thpXduzYkVtuuYWFCxdSpUoVtm3bxrRp04iMjKRZs2b07duXP/6weo+Ki4tj2LBhGb0ePPTQQ8yYMYMNGzZQp04dv+2zP+3du5e4uDhSUlKoXr06gwcPpkyZMv4OS6liL7dbfF6PgGeMyft4436Sl9KMv7gr493jMrkvlu4Rai9cuECNGjUyrVOzZk02bNjAiRMniIqKytSLds2aNTMS1OHDh5k8eTLvvvtuxvy0tDQOHz5cLBPU5s2b+fzzz3G5XDRu3JjbbrtN65uUChC53eI7X2hRqEwuVefRpk0bfvgh8wgnBw8epHLlylStWpWUlBROnTpFpUqVAKu5tFuVKlUYNmxYpoEK9+zZQ/Xq1Tl16lQB7kVgc7lcLF++nO+//x6Aa665hhtuuEHrm5QKILnd4ru3MANR3rv22muZMmUKS5cu5aabbmLjxo189tlnvPXWW9SoUYN27doxceJEJkyYwP79+1mwYAGtWrUCoF+/frz99tu0bduW+vXrs2TJEp588kmWLFlSbB4+TU9PZ8GCBWzfvp3Q0FBuvvnmjOOjlAocud3iexl7GHb7fU5cxph/FHxoKifh4eFMnjyZ1157jbFjx1K1alUmTJjAtddeC8B//vMfxo4dS6dOnahevTrdu3cnPj4esBLU2bNnGTlyJMePH6d27dpMmjSJunXrcujQIX/uVqG4cOECc+bMYf/+/URFRXHHHXdQr149f4ellMpGjkO+i8g3wG3GmNP2+5y4jHTGDpUAACAASURBVDHX+yQ6L+iQ78pbiYmJzJo1i6NHjxIdHc3QoUOpWrWqv8NSqli7rCHfjTHXZfdeqWCUkJDAjBkzSEhIoGLFitx9993aM4RSAc7rSgcRKQ0MBpoCqcCvwFy7p3OlAtaxY8eYOXMmiYmJxMbGMmTIEB2/Sakg4FUfeyLSDDgAvICVoFoDrwJGRK70XXhK5c/Bgwd5//33SUxMpG7dugwfPlyTk1JBwtsS1FRgEfCwMSYNQERKAtOAd4CuvglPqcu3f/9+Zs2aRVpaGo0bN6Z///7FpqWiUkWBt72UtwAmupMTgD1Y4fNAO18EplR+7N27l5kzZ5KWlkbz5s0ZMGCAJielgoy3CepHoHM209sAvxVcOErl3+7du/n4449JT0/n6quvpm/fvhm9cCilgkduz0GN9Pi4EXhLRNoA6wEH0Bx4BJjo0wiVyoOdO3cSFxeHw+GgVatW9OnTR3uHUCpIXao3c09HgZ72y+0kcB9W4wml/GrHjh3MmzcPp9NJ27Zt6dWrlyYnpYJYbs9B6eP1Kmjs3LkzIzl16NCBHj16aHJSKsjleGNeRIbnZUMiEiIi9+U/JKXyZs+ePcTFxeF0OunYsaMmJ6WKiNxu8bUUkf8DpgALjTFHsltIRKoAdwEPAV9786Ui0g5Y4h6JV0QigbeAAVj1W68bY/7t9V6oYmv//v3MmTMHh8NB27ZtufHGGzU5KVVE5HaL7zG7UcR44A0R+Q2r94iTQAgQg9X8vBHwBXCPMWZjbl8mIiHA/VgP+XqaAAhwBVAO+FJE/jDGfHRZe6WKhUOHDjF79uyM1npa56RU0ZLrgyHGmB+AW0WkHtALq1l5A8CJ1Wjif8BSY8wBL79vAnAzVqOKpz2mD8dKcAlAgoi8CowANEGpbB05coRZs2aRmppKs2bNuOWWWzQ5KVXEePXkojFmHzC5AL5vijFmvIh0c08QkfJALJmfp9oBNCuA71NF0PHjx5kxYwYXLlygcePG9OvXT59zUqoIKtT/1caYw9lMjrb/TfKYlgSU8n1EKticPn2amTNnkpycTMOGDbn99ts1OSlVRAXC/2z30PIlPaaVAhL9EIsKYOfPn2fmzJmcO3eOOnXqMHDgQMLCwvwdllLKR/yeoOx6p6NYjSTcrkS7UFIeUlJSmD17NqdOnaJq1aoMHjyYiIgIf4ellPKhQOk9cwbwjIj8gnXLbwzwX/+GpAKFw+EgLi6Ow4cPU758eYYMGUKJEiX8HZZSysfyMmBhS6xxoCKwmplnMMbktwHFeOA1rGbsocC7WM9fqWLO5XKxcOFC9u7dS+nSpbn77rspU6aMv8NSShUCrxKUiIzFGlojHjiXZbaLPLbwM8asAsp7fL4AjLJfSgFWcvriiy/49ddfiYyMZMiQIVSsWNHfYSmlCom3JagHgHHGmBd9GYxSntatW8emTZsICwtj8ODBxMbG+jskpVQh8raRRCUgzpeBKOXp119/5euvrZ6zbrvtNurV076LlSpuvE1QnwBDfBmIUm4HDx5k4cKFAHTv3p2mTZv6OSKllD94e4svGXhSRAYCu4BUz5nGmEEFHZgqnuLj4zM6f23dujWdOnXyd0hKKT/xNkGVAmb7MhClkpKSmDVrFklJSTRo0IDevXtr/3pKFWPe9sV3r68DUcVbeno6c+fOJT4+nmrVqjFgwADtwkipYi4vz0E1A54AmmLVXe0A/meMWeej2FQx4XK5WLx4MQcOHKBMmTLceeedREVF+TsspZSfefUTVUR6AT9iteb7BJgHlAFWi0gP34WnioOVK1eybdu2jGedypYt6++QlFIBwNsS1IvAC8aYCZ4TReRprAd4lxV0YKp4+OWXX1i7di0hISEMHDiQqlWr+jskpVSA8PYmf2NgVjbT56DjNqnLdOjQIT799FMAevXqRYMGDfwckVIqkHiboA4ALbOZ3ho4XnDhqOLi7NmzzJ07F4fDQZs2bWjbtq2/Q1JKBRhvb/FNAqaISE1gvT2tIzAWeNkXgamiKy0tjTlz5pCYmEjdunXp2bOnv0NSSgUgb5uZ/09EygBPApXtyYeBZ4wxb/kqOFX0uFvsHTlyhAoVKuigg0qpHHndzNzuKPZFEakCJBtjsvZqrtQlffvttxm9k995552UKlXK3yEppQJUjglKREYC7xljLtjvs87PeF8A40GpYuC3335j1apVAAwYMICYmBj/BqSUCmi5laD+DswFLtjvc5Ln8aBU8XP06FEWLVoEwI033kjDhg39HJFSKtDlmKCMMfWye5+ViGhnaSpXSUlJzJkzh7S0NFq0aEHHjh39HZJSKgh425PEXhG5aChTEakOHCvwqFSR4XQ6+eSTTzhz5gzVq1enT58+2gGsUsorudVB3Qpca3+sCzwnIklZFtMnK1WuVqxYwb59+yhdujSDBg0iPNzrdjlKqWIut6vFz8BjgPvnbksyjwPlAhKB4b4JTQW7X3/9lXXr1hEaGsrAgQMpV66cv0NSSgWR3Oqg9gPXA4jI+8CjxpizhRWYCm7Hjh1j8eLFAPTo0YM6der4OSKlVLDxejwoEQkXkRqA+6nKECAKaG2M+dhXAargk5yczNy5c0lLS6N58+a0a9fO3yEppYKQVwlKRPoA7wMXNZQAEgBNUAqwGkUsWLCAhIQEqlWrpo0ilFKXzdvOYv+NNaRGO+AccB1wJ3AU+ItvQlPBaNWqVezevZuSJUtyxx13EBER4e+QlFJBytsE1RB4zhizGWvgwtLGmDis5JTbQ7xeE5EOIrJRRM6IyG4ReaAgtqsKz/bt21mzZg0hISEMGDCA8uXL+zskpVQQ8zZBJQNO+/1OoIX9fjPQKL9BiEgosBhrCPlyWKWzt0SkRe5rqkBx4sSJjJ4iunfvTv369f0ckVIq2HmboL4FxolIeeAH4DYRiQC6AQXRsq8CUAUIsXumcAHpZG7WrgJUamoqcXFxpKam0rRpU+0pQilVILxNUP8HtAXuA2YDpbES0/vAm/kNwhhzCngL+BBIAzYBTxljtud328q3XC4Xn332GSdPnqRy5crceuut2ihCKVUgvEpQxpjdxpjGwNvGmCSsxhIDgE7GmJfyG4R9i+8CcBdQEqtk9oyI9MjvtpVvbdq0iW3bthEREcGgQYOIjIz0d0hKqSIit66Osh2ox2P6N+7PdtLKj/7ANcYYd4OL1SIyHRiB1XpQBaBDhw7x1VdfAXDrrbfq8BlKqQKV23NQiVh1Qd7I75CotbAe+vWUjnW7TwWgpKQk5s2bh9PppF27dlx11VX+DkkpVcTklqCuK7QorFLSv0XkIWAq0Ap4ENCm5gHI/TDu2bNnqVmzJj166J1YpVTBy60vvtWFFYQx5lcR6Q88D7yC9QDwP40xiwsrBuW9b7/9lj179lCqVCkGDBhAWFh+C9BKKXUxb7s62kQut/uMMfnubM0YsxRYmt/tKN/avXs3q1dbv1369++vPZQrpXzG28F5lmSzXn3gZuDZggxIBa4zZ86wYMECALp168YVV1zh54iUUkWZt72ZT8huuojcB9wKvFGQQanA43A4mDdvHsnJyTRo0IAuXbr4OySlVBHn7YO6OVkJ3FgQgajA9tVXX/HHH39Qrlw5brvtNn0YVynlc97WQWX3TFQ54GngSIFGpALO1q1b2bRpU8bIuKVKZfuInFJKFShv66ByeibqAnBvwYWjAs2JEyf4bLHVCWyPG7pRo0YNP0eklCouvE1QWZ+JcmF15PqrMeZcwYakAkVqaipzP55NmsNJ3ZAErqpWxt8hKaWKEW/74lttPxe1Gas0dRb4WZNT0eXuBPZUwmnKcYHI9Ai+O1HB32EppYoRrxKUiETZfeOdxOpp/EfgpIi8ISL6lGYR5O4ENjIigtYxJVlf6jraN63m77CUUsWIt7f4/ofVw/gdwEasxNYeeBVIAf7hi+CUf2TqBLZvX5o2bUqHdAcR4fpbRClVeLxNUIOAW4wxaz2mLRCReCAOTVBFRlJSEnEfz8LpdNLi6tY0bdoUQJOTUqrQ5WXI9+x6Fj9TgLEoP3M6nXwyZzbnki4Qw3nMLwdJTNYO5ZVS/uFtCepJYJqIjADWG2OcInIVMBl40fM5qQIYG0r5yeqVX7Pv4B9EkU6tqDBONe1MdMkIf4ellCqmvE1QbwDRwBrAISJOIAIIwRpd93WPZfVeUBDatWsn3373PeDiuooptLjvGSJL6gO5Sin/8TZB9fNpFMqvzpw5w/y4uQBcHXWaVnc/RUTp0n6OSilV3HnbWexqABEpCTTEqrvao89BBT+Hw8Gcj94jJd1JLOeIkl5ElK/i77CUUsrrvvjCgH8Bj/Lnrb1UEfkA+IsxJt1nESqfWrZsGUfjz1Iq1Emyqzqtunb2d0hKKQV4f4vvRWAoMAxYi5WgrsF6Dmq8/VJBZtu2bWzcuJHQ0FDuHH4PVWJrEhmhVYhKqcDgbYIaBjxgj3rrFici54B30QQVdI4dPsTihdbggzfddBM1a9fxc0RKKZWZtwkqGtidzfS9QOWCC0cVhpQLyXz8wXTSnRCNi7oNrvJ3SEopdRFvH9TdBIzKZvpfsDqQVUHC5XIx/71JnEmDsqQQVb0tlcuX9HdYSil1EW9LUP8AVolIN2C9Pa0DUBfoWfBhKV9Zu3AGu06cJxwHt93Sm9hmHQkN1dFxlVKBx9vhNn4AWgHLgVpYt/U+A640xnzvu/BUQdq1fiWrtu4BoEfrJtRtdS1R2ihCKRWgvC1BYYzZCYwRkUqAwxhz2ndhqYJ2+uBOFn21EicRVC8VSds+g/0dklJK5crbOihEZJyIHAaOA6dE5HcRecx3oamC4nK5WPLN9yQRQSnSadNnuL9DUkqpS/L2Qd0XgYeAF8g8HtTTIhJhjHklv4GISCzwNtbw8heAd40x4/K7XQXffvste/b9TsmSJbnrrqHUqFnd3yEppdQleXuL7wFgeJbnoL4Tkd3AJCDfCQpYjNUisCoQC6wWke3GmNkFsO1iyeV08N3C2azatheA/v37a3JSSgUNbxNUOHAwm+m7gTL5DUJE2gP1gWuMMWnAPrvFYHJ+t11cuVwudsyfzNrfjgPhXN26Aw0aNPB3WEop5TVv66BeASaLSC33BBGpCLyE1d1RfrUGtgLPisgfIrIHuM0Yc6QAtl0snfpuISt+O0QK4YSHl6Znj+v9HZJSSuWJtyWoO4DGwF4ROQikA7WBSKCDiPzVvaAx5nK6wq4IdAZWY5WkrgS+FJEjeosv7xJ3fM9XK1dxikqULVWCYQ88SFSkDjyolAoueRmw0JdSgLPGmGftzz+LyDSgP6AJKg8uHN7N2k8+ZLcrlrDQEAYPHUalCuX8HZZSSuWZt+NBfejjOHYApUQk0hiTak/z+hktZUk/e4ofP3qFTY5qANxya19iY2P9HJVSSl0er5+D8rHlwAngNRGJFJFmwP3Ax/4NK7icT01nbVosTkKpXkdo0aKFv0NSSqnLFhAJyhhzAeiKVf90BPgSeNkYM9+vgQURh8PBwiVfkOwMITY2lvvuHujvkJRSKl8C5jaaMWYvcLO/4whG8eZHvvntEPv37yc6Opo777yTsDDtY08pFdwCJkGpy5O452d+jJvENmdtQkJCGThwIGXK5PvRNKWU8rscE5SIvOftRowx9xVMOCov0s+cYOeCt1jvrAlAp87XUbt2bT9HpZRSBSO3OqgyHq9KwD1YY0CFAQ6gBdZQ8FoK8wOXI439817jm6QYHITSUJpwQ7dr/B2WUkoVmByTizEmo5ZdRN4F3jDG/M1zGRF5AeuhWlXIDn3xAV8fTieRMlSrWoWBt/cjJEQHHlRKFR3eln7uxBqwMKsPgZ8KLhzljfht37Pux1846qpMqRJRDL7zLiIitKcIpVTR4m0z86NAdp259QH2F1w4yhsbvl3JDldlAG4bMJhy5bSnCKVU0eNtCeo5YLqIXA/8CIRgjQfVG9AHbgrRgQMH+OGUE4DO191Igyvq+jcgpZTyEa9KUMaYGcBNgAu4GxiKNRRGF2PMp74LT3lKSDhNXFwcTqeT9u3bc32XTv4OSSmlfMbrFnjGmG+Ab3wYi8rFMbOVmXPjOO8Kp379+vTo0cPfISmllE/l9hzUy95uxBjzRMGEo7LjuJDEkk9mkugqRWQI9O9/O6GhAdFLlVJK+UxuJai2Xm7DVRCBqJx99dFbHEovRThO+t0xnNKlS/k7JKWU8rncnoO6zv1eRO4GvjDGnCyUqFSGTZ/HselIMuCi38030Vjq+zskpZQqFN7eJ/ofVm8SqhBtWfcdX/7wKwBdr6pH0zbaKEIpVXx4m6A2ALf5MhCV2cljR/hy+Vc4CaVGFHS57W5/h6SUUoXK21Z8TuBfIvI0sA+riXkGY0y7gg6sOEtOTmbOvPmkEkZM6AUGPfxPbRShlCp2vE1QG+yX8jGHw0FcXBynTp2iSpUq3Dv8bkqUivZ3WEopVei8SlDGmAnu9yJSFgg1xpz2WVTFlMvl4r13p3L4+DFKly7NXXfdpclJKVVseX3fSEQeEZGDQAJwSkSOiMg/fRda8bN08SIOHz9GGE6uaX+N9rGnlCrWvEpQIjIGeAl4E+gMdAH+AzwhIo/6Lrzi4+fNG/nh518AF1eVdtHh2vb+DkkppfzK2zqoUcDDxpiPPaZ9JyL7gReA/xZ4ZMXInl07+XTJUiCEduVSuWnkeEJCtFGEUqp48/YqGANsymb6ZqBmwYVT/Bw4eIiPP56NkxCaRJ2j+71/IzSyhL/DUkopv/M2QW0j+2E17gB2FFw4xUtCQgIzP3gPhyuEWiFnuGX4SCLKVfZ3WEopFRC8vcU3HvhcRDoC39vTOgI9gf6+CKyoO3/+PDNnziTN6aJqSCLX3tiXErHajZFSSrl5Ox7UMuAGIAVrPKgBwFmgrTFmSUEGJCLlReSAiNxTkNsNJKmpqcyePZv4+HiqVavG0Icfp1HHrv4OSymlAkpuw230BNYYY84DGGO+Bb4thJimADUK4Xv8wuFw8PakKZw+m0D58uUZMmQI0dH6rJNSSmWV2y2+z4F0EfkBWGm/1hljUnwVjIgMB8oCW331Hf7kdDqZ8eGHnD6bQCTpdOvYSZOTUkrlILcEVRm4Bquu6VrgcSBURNbzZ8LaYIxxFEQgIlIPeAboBHxZENsMJC6Xi8UL57P/4EEicNCxvJPmbVr5OyyllApYuY0HlQAssV+ISBjQCithdQTuAyqLyBpjzM35CcLe9kxgjDHmqIjkZ3MBx+Vy8eXSz/ll22+E4eSmyim0fPBZQkLD/B2aUkoFLK+fBrVLSoeAI8Bx4IC9fkE0PRtnfYVZUADbCjhLli5j4w+bCcXJDWUSaDHsH4RGlvR3WEopFdBybWYuItFAN6A7cCNwJXAQ+AaYDtxljDlcAHEMBqqLiLvJehlgsoi0M8aMLIDt+813333Hjz+sJwQXncKO0Hro04SXqejvsJRSKuDl1opvDdAOq3PYVVjdGa00xuwu6CCMMVdm+e6fgDeMMR8U9HcVpo0bN/L1118D0D7sMC0HPExkldp+jkoppYJDbiWoa7Bu6b2H1SDie2NMWqFEVQRs3LiRL774AoDevXvTqkkjwkpr7+RKKeWt3BJUfaxbezcAjwClRWQtsAIrYf1ojHH5IihjzNW+2G5h8UxOvXr1om3btn6OSCmlgk9urfh+B6bZL0SkBXA9VsIaB6SJyCpghTFmss8jDRKeyallyFGqlC7t54iUUio45aUV38/GmP8At2IlqblAD6wxohSwYcOGjOTULvQP6sZUpM6VRavJvFJKFZZLdhYrIjWB9kAH+99WQDqwDmssqFU+jC9obNiwgS+/tJ4vbhf6B81rVCB26NOEhHnbH69SSilPubXim4+VkGKBc8B3wGfAGGBzQfUgURSsWbOGlStXAlZyuqpyFNXueEqfdVJKqXzI7ed9FPAGVgnpR2OMs1AiCiIul4sVK1bw3XffAS7ah/5B7SgHsXe9qC32lFIqn3JrJNGnMAMJNk6nk6VLl7J582ZCQ0O5oeWVVPjtAPXufZ7wcjH+Dk8ppYKeVpBcBofDwaJFi9i2bRvh4eEMHDiQRo0a4bzpVkIjovwdnlJKFQmaoPIoLS2NefPmsWvXLsJwckUdoVGjRgCanJRSqgBpgsqDpKQk5syZw8GDB4nCwQ1he7lwMJ6U1H5EReqhVEqpgqRXVS/Fx8cza9Ys4uPjKRWSxg2heylZqSYNB/1Tk5NSSvmAXlm98McffzBj5ixSLiRTgWSuD91Hlas6EtNnFCHhEf4OTymliiRNUJewY8cO5s+fT3p6OtVDztE5dD9VuwykfOeBhISE+Ds8pZQqsjRB5cKzX70m9WrS/NDXVLvlr5Rr1tnPkSmlVNGnCSobDoeDz5d+wZYfNwPQrVs3unTpgjN5EGGlyvg5OqWUKh40QWVx/vx54uLmcuDAQUJxUqv6FXTt2hVAk5NSShUiTVAejh49ysezZ3H2XCIlSaNL2H6qXtHS32EppVSxpAnK9u26H1j99VKcLheVOc8NFc5Tq99TlK7d2N+hKaVUsaQJClixfAVr160F4IqQeK5vXp9qPR8gtIQONqiUUv6iCQo4ceIIIbi4OuwE7XsNpGrrbv4OSSmlij1NUMCAQYOJ37OVirG1CC9b2d/hKKWUQhMUAOHh4VQRbQyhlFKBJNTfASillFLZ0QSllFIqIGmCUkopFZACpg5KRG4EXgIaAseBV4wx7/g3KqWUUv4SECUoEakFzAdeAMoDdwL/FpGb/BqYUkopvwmUElRdYLYxZqH9eZOIrAKuAb7yV1BKKaX8JyASlDFmDbDG/VlEKgKdgRlerB4GVj96SimlgovHtTss67yASFCeRKQc8CmwAVjsxSqxAEOGDPFlWEoppXwrFtjjOSGgEpSINMJKSr8BQ4wxTi9W24RV2joCOHwYnlJKqYIXhpWcNmWdEeJyuQo/nGyISBes5DQFeMoYExiBKaWU8ouASFAicgWwBRhrjHnT3/EopZTyv0BJUK8DjwPns8yaZIz5hx9CUkop5WcBkaCUUkqprALiQV2llFIqK01QSimlApImKKWUUgFJE5RSSqmApAlKKaVUQAqoniQKmoi0A5YYY6rYn2OA/wI3ASnAe8AzxhiHPf8jYBCQ7rGZ5saYvSJSG5gOdMAaDmS0MWZpoe2Mh5yGJhGRSOAtYABWrxqvG2P+7bHeIOBfWE9trwbuMcYct+cFxP7lY9+C+tx5zC8BrAJeMsYs8pge8OfOjuVy9y+oz5+IVMG6ttwAhABfAI8aYxLs9QL+/OVj33x27opkCUpEQkTkAWAZEOkx60OgCtAYuApoBzznMb8V0M8YE+3x2mvPmwP8AlQCHgTmiEh9H+/KRS4xNMkEQIArgLbAcBEZZq/XBOsP5R57H3Zh7ZOb3/fvcvfNFuznDhFpjnXxbp9lvYA/d3D5+2cL9vM3DesCXQ/rAl8BmGSvF/Dn73L3zeazc1dUS1ATgJuxDvbTACJSCugJtPD45TIO+ExEngZKAFcCP2XdmN1HYBvgRmNMKrBSRD4F7gfG+n53MqlLzkOTDMf6ZZYAJIjIq8AI4CNgKPCZMWYtgIg8aS/TEOtXUSDsX10uY99EpCRBfu5EZB+wgj9/ZXsKhnMHl7l/ReH8AU5ggjHmvB33VKwSPwTH+avLZeybr89dUU1QU4wx40Wkm8c0d2nRs7cKBxCD9YvhSqxfCVNFpANwEBhvjFkCNAEOuE+QbQdWCaxQXWJoklisjnbddgDN7PdNgB88tpMkIgft+U4CYP/ysW9XE/zn7jBQ3xhzTkQezbJqwJ87O67L3b+gP3/GmPFZFu+H1X0bBMH5y8e++fTcFckEZYw5nM20RBFZBrwsIg9h/XJxH/iSQBmsEzQB+Bm4FYgTkY5ANJCUZZNJQCnf7IF3sgxNstme7BmnZ4yX2oeA2r887luwn7vFl+i5P6jOHeR5/4L+/GWZNwbrIt7JnhRU5y+P++bTc1ckE1Qu7saq7NsOnABeB24BThtjlmHVWbnNF5F7sQ74Nqwk5qkUkOjziHMgWYYm4c/4POP0jPE8Oe9DSC7zCl1e9y3Yz50Xw8oEzbmDvO9fUTl/IhIBvIl1TbneGLPDXiVozl9e983X565INpLIRSwwwhhT1RhzFfAHsN0uct8iIsOzLB8JXMA6WbXt+61uV5L5llOhEWtokg3AImCAMeaCXTdzFKshgZtnjL95zrPr5Grb0wNm/y5n34L93HmxWlCcOzu2PO9fUTh/IlIGWI7VgKedMcazTiYozt/l7Juvz11xK0G9Dmyzi6m1gYn8WZEZBvxXRLZj3VK6A6sY+4Ax5oCI/Ay8aFdwdgL6Ah0LewfEGppkCdkPTTIDeEZEfsEqXo/BKjECzAbW2vVy3wP/BrYYY3ba2/X7/uVj34rCuctNwJ87O47L3b+icP7mYP3g72yMyXpbK+DPXz72zafnrrglqAeBqUA8cBp40xgzGcAYs0hExgIfA9WwKvP6GGMO2OveDryL1Zb/JHC/MWZbIccPMArrvu+/ReTfHtMnYdWpvQb8ivUH9S7WAJAYY7aKyH325xpYv5QGeqwfCPt3ufsW9OfO5DKsTJCcO7j8/Qv287cc6I31bOVxkYzC0mljTM0gOX+Xu28+PXc63IZSSqmAVNzqoJRSSgUJTVBKKaUCkiYopZRSAUkTlFJKqYCkCUoppVRA0gSllFIqIGmCUqoQiMgcETlhd8KZdd5YEUkUkbp+CE2pgKUJSqnC8RjWg/GeD0EiIvWwhh4Ya4z53Q9xKRWwNEEpVQiMMUeBJ4EHRMRzwL43scbSyUvXQEoVC9qThFKFRERCgO+wOtNsiz00AdDSGOPu+PZe4CmsLnG2Y5WsvrTnhQPPA3cB1YFTWF3MjDHGOERkJtb4Qo2xRh7ub4xZVWg7qFQB0xKUUoXEGOMCHgKaFybMlgAAAblJREFUA/cCrwIveCSnm7E6NB5rLzMdWCgi7gHensQaivturKG3nwT+CvTx+JqhWJ3o3gD8f3t3rNpUFMdx/Cu0FJf6CHXyD3UR6huUOvkATq4Fp0ZoBEFKaYfQgLuTEpxM6SN0cCjdI9I/xOeI0MXh3MAl+7050u8HLiTnhHDucPnzPze5v9uOT0nq1EN7WKy0Vpn5KyI+A18oHdKoNf0RGGXmj+b9PCJeAu+BN8CMEnv/s5n/GhFDSnLpMljud2Z+7/o8pD5YoKT+nQIfgLPMvG+N7wJ7EfGpNbZJk5/TPDl6PyLGwDNKl/WUEnmw9KfLhUt9cotP6llmLpqXi5WpDeAYeNE6nlMydIiIc2BKuW6nwCtKamnb6ndK/y07KKked8BOZs6XA0039RcYA++Ao8ycNHOPKcGbj9awVqlzFiipHhfAJCISuAYOgBPK/ScoQZuvI+IGeELZKtwGttawVqlzbvFJlcjMKTAAhpT7TgPgMDMvm4+8pfx6bwZcAXPgG7DX+2KlHvg/KElSleygJElVskBJkqpkgZIkVckCJUmqkgVKklQlC5QkqUoWKElSlSxQkqQq/QOwN3B4aRbPtgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -547,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -556,7 +511,7 @@ "13.856665141368708" ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -567,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -576,7 +531,7 @@ "13.88888888888889" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -594,12 +549,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9eXwdV333/57t7tLVvlm2ZMf2iePEcVZIQiAbCQQoBEJZQoE2PEApPFBKS1nKWgpPgfZHobSUpUCAEAqEpIQ9JJAYEpKQzY59vMmWZVu7rqR7ddeZ+f1xRtLVatmWJTk579dr7pw5c+bMd5Y7nznnfOccw/d9NBqNRqNZaZjLbYBGo9FoNLOhBUqj0Wg0KxItUBqNRqNZkWiB0mg0Gs2KRAuURqPRaFYkWqA0Go1GsyKxl9uA0xkhxAGgrSzKBQ4D/wN8WEqZOcF8vw4kpJQ3nqSJCCFuAB6WUh4SQlwB3ANUSCnTJ5v3qUAI8RHgxVLKC4PlE7ZfCNEOdADnSCm3nzKj595/AniVlPKrwfLXOYnrKoRwgP8jpfxisPwRys7VSdh5BSd4Xwgh6oHnSym/cxL73wLUSinvCZZ94CVSyh+faJ4rleO9B063/+9io0tQJ8/7geZgagP+Angd8LmTyPOdwJtO1jAhRBvwQyAZRP0OZecJCecS8RngOpjV/tONvwH+chHzey3wsbLliXO1jPwz8PKTzOMOYHPZcjPwy5PM87TnNP3/Liq6BHXyjEopu8uWDwshPge8lxMUGSnl8KJYBsa0fAtA9xxpVwTBm+H426ExX9rTgMW2f/r1LD9Xy8ViHOP041rR9+gSctr9fxcbLVCnhhKQh4lqmGehSqvPBv4v8E3gHcDbgTXALuD9UsqfBNt8nbJqACHEC4FPAgLYD3xGSvnf4zsTQtwI/AOwMVj/finlHajqLYAnhRAfBe6lrIpACNGMegO+DogAPwPeKaU8GuTrA38e2LoJeBJ4l5Ty98H6NwN/B6wO9vVPUspvTj8ZQogfAd1SyrcGy38b7HeVlPJIUHU1ALwMeC6T1Vaz2Q/wOiHEe4Em4H7gL6SUh+a5HtcJIW4DzgAeB26WUm4XQnwRVf13eZmtr0eVUtYG5+p+4ELgecAe4G+klL8M0hrMcR2FEG8EPlx2HtcGu4gJIb4KvBJ1j3xJSvnBafv/INAa5PcPUsq7guqd/y7L70rgCqZWh14J/BNwLnAU+JSU8svBuuuAjwbrfOAB4G1Syl3znLdxm24APg6sD/L9opTy08G9/YZxm6SUhhCiEfgX4FrUm/8h4JNSyq8E6Q4A3wNejXoAD6JqHj4vhLhRSnlFeRWfEOJe4DeB3dcG+X26LL8w8P8F+ZWCfd8MvElKee8sx3IvJ3hNg/VfR123BHADcCS4RreWrZ9ShRcc82eklF+YxZ6bUC+zIsj3XuDNgUiviP/vcqKr+BYRIYQphLgYdUP8qGzVC4DfogTqJ6hqwY8CHwK2BGnvFEKcO0uem4EfAP8JnI16eH5WCPHqYP1VwG3ALcA5wH8B3xNCnAVcHGRzBao6qDxfB7gb9Se8HrgKWAX8KPiTjvOPKPG7BCgE+SOEOB/4PPBulDD+G/B1IcSGWU7NT4P8x7kS9ZB8TrB8STC/b9p2c9n/BuBG4HLUg/+fZ9lnOW9BVbVdEOz3y0H8t4DLhBCry9K+FviOlHK8D7C/BX4PnIe6dj8uO8b5ruNtwGdRgtiMerACvBD1kN8KvA/4QCAe4yLyb0F+5wBfAr4vhLgEVb3zLtQDvTlYnkAIcSbqAXVfkPcHgS8IIZ4fVBXdiWobPQt1LWqATx/jvBEIzm3Av6Ieon8LfEIIcTXqmnwP+HFgE6iXrwbg6mBfdwL/IYRoKsv2/6Cu3w2oe6ErOJdzVRW+F1Xldx7wq2n5fQ4lXC9D/c9eDqw7xmGd6DUd543ACHA+8AXgW8ELxHEhhLgU9dLxadR/6GWoa/eBIMlK+f8uG7oEdfJ8VgjxqSAcRj0A70T9qcbJot4iveDmeRfwCSnld4P1HxFCPAv1NnPTtPz/Dvi2lPI/g+V9QogzgPcA30U9eO+UUo7fwJ8LGudjQF8QNxC8cZXnex3qjfgaKeURACHEq1BvUtcw2QbwhbK3x08DdwRvrW2ABxyUUh4EviiE2FO2z3J+CvynEKIVVUXxHNRD7XLUA+464JdSyuI0G+ey/6+klH8MbPo6SlTm4++llL8N0n+B4E8qpfydEKIDeBXwmaDB/2pU29E490spPzqejxDiBcCbhBB/zzzXUUp5kxAiDZTGq6wC+58sKzHtD/I5F/g56uH46bL89gkhLkC94d8ohBgG/Gn5jXMzsENK+XfB8m4hRHUQtoH3SCk/Hyx3CCFuAd52jPMG0AI4wKHgOh8UQvQAu4NrkgWssmq5u4AfSyn3Bzb+Y3CeNjBZPXWblPIP4zsQQrioqvLBOWy4V0r570Ha9wV2bwnO758Dr5RS/iZY/2fAzmMc0wldUyb/mwdR96AH7ArE6S+ZLOEvlCzK6eWW8XyFEHeghB1Wzv932dACdfJ8EvUmDuoNpUdKmZ+WpiO4mUG9Xdah3uDKuR9V7TOdzcA5QojXlMXZQDEInwV8u3wDKeUnYMKLbS42o27OI2XbdQXVEZuZvMF3l20zUrb/nwHbgMeEEDtQgvPfUsrU9B1JKTuFEE+h3vJ2o6rzbmVSxK8DvjiPrdPZVxZOAdGTSP8tVPXQZ1BCtUNKuaNs/fRS3R9QJdnjvY6z2TLdns3As4KH8DgOU6/BXJwFPFweMe7tByCE+GFQLboZOJPJasBj8Rjq/vq5EGI/SoC+KaXsmSP9fwCvFEKMv5mfF8RbZWmmn4NjMXH8UsqR4EHtoI4jBDxUtn6XEGLGPTiNk72mvyv7P49vP/3F8phIKR8VQowJIT6EqoLbFNhx/wI2X7L/73Kiq/hOnn4p5d5g6pxFnEC9Kc0WLsdg9utho4riW8ums5n84xdQpbbjZaF2FGZLI6XMAs9nsjT0YtTNfvUc+Y5X812BalP4DUp416OO6afHYbs7i83Hk76cbwEXBKXS1zBN7FHtGuWYQX7Hex3ns2XcfhtV7Vd+rTejzu2xmPM+EEKcjWpLeRbwCKr0/cHZ0k5HSulLKV+Hut++GeTxQFBSmb4fA1US/BDQjxKry2bJdq5zNxez3oNMvqQd73PsZK/pXNvD7Ndg1oKAEOIa4AlU2+hvgDez8Be1pf7/Lgu6BLXEBG+AR1B1wtvKVl2KeohMZyewXkq5dzxCCPEm1Bvzu1FvSOeXbyCE+DnqgX/7PKbsBNqEEM1ljaotqKL/QhrOrwCeI6X8x+A4/l4IsQ14BapufDo/Bb4O1AI/DJwj9qPa1B4ft2Eap3wsGCnlHiHEH1BVRRejSlHlnD9t+SJUlepCruPx2r8TaJt2rd+Pqor51DHy283Udj6EEF9GvTV7wKNSypeXrRt3UpiXoO3lDVLKd6NKUx8VQnwHJea3TLPpLFSb0hllVXzj7Sjz7etEr/NeIIdqWzwc7G89UHWM7U7mms62/cWotkZQgjDxWURQ3d4whx1vQVV3vqEs/UeYPFfznZel/v8uC1qglodPAR8TQnSh3mhfharmumKWtJ8BHgweVN9DVc38K6rxE5QH031CiLejROBFKE+4dzHpgrxVCDHdy+1XqD/Vd4PqGFAeULuDdcdiDPhw0B7xC1R1yybgK3Okvw/14LgW9Z0XqDr7m4FPzLHNfPYvJregGqrvl1J2TVv30uDc/gL12cAZTDpZHOs6poEmIcQ6oHMBdvwzcKsQYheqiuYqVIP9eGklDSSEcoDZP23bLwLvFEJ8HPgG6qH7Z6gG9IuBM4UQl6Me5C9FOSoMLMCmQeAvhRBDqNJmC8rZZ7zdJA2cHThipFAliVcLIb7NZOM7qPbZuUgDm4QQDVLK3gXYBICUMhOI8GeD9rlhlNMCzP9wP5lrCnBe0Lb2TVTJ44VMlhQfAm4WQrwMJSIfZe4S/ABwReCwkEY5/7wQeDBYv5L+v8uCruJbHr6Aehj9M8r186Uod+HpdeNIKR9BeTy9CtiBugk/FWxL4DL6epRb7A7Uh8Ivk1LulFIOAF9F3XQfnZavj/Ia6kMJxd0ol9mrpfreYl6CRu6bUaU4ifqDf1aWub9PS18Afg30jr9do6o1DJQn1WzbzGn/IvNdVFvG9Oo9UG1lL0M9DJ6H6jVhXGyOdR2/D4wCTzFZJTsnUsrbUR6g7w62+VuUK/h4g/3dwKPB9KJp2x4EXhLE7wA+gnK1/jVKJH4F/C/qofti4K1AQ+C4Mp9Nh1CecTcE+f4A5dk2/lLxdZS7/07Ug/jNwbQr2O8XUdVYF8yzm8+hxPTn89kyB+9Fecj+L0rUb0eJ03z38MlcU1AP9A3B9n8B3FDm9HEL6px8E/VS9hhTS2PlfBjVHvfbIM3ZqOrXs4QQkZX0/10uDD2i7spDCPEtwJRSHss7TbMICOXK/zDQXN5ILNQ3Mw9LKd+zXLZp5kcI8XLg1+PXLfDE7EVVlc4otZ7sNRWL2A2Z5tjoKr4VRNDIfAGqcXzWUoVm8RBCNKCqQ9+B+vZpRXkwaRbEB4BXCPUhq4MqaTwwmzhpTj90Fd/KYg2quO6jPtLUnFoSwNdQbt7vX2ZbNCfGTUA9qgS8DeUQcsOyWqRZNHQVn0aj0WhWJKd9FV/wVfRFqI8O5/veRaPRaDQrDwvVVdZD078jPe0FCiVOM7zfNBqNRnNacTnTetF4OgjUUYBvf/vbNDU1HSutRqPRaFYQ3d3d3HTTTTBL11tPB4FyAZqammhtnfeTDo1Go9GsXGY00WgvPo1Go9GsSLRAaTQajWZFogVKo9FoNCuSJW2DEkI8H9WP3AZUdySfllJ+KXAVH2Vq/1m/k1Jeu5T2aTQajWblsGQCJdSw2j9A9dh7B6pLn58HA2wNAINSSu2Gp9FoNBpgaUtQ7aj+zsbHKHoo6LjxMtQQAI8toS1TGO9NwzCOOTyORqPRaJaIJROooLv6iQ9qhRA1qA+zbgFegOr6/wmgEdX9/LuklIeXwrYv3f4kD2w/yufefQXJxHzD1mg0Go1mqVgWJwkhRBK4EzUw1x1ABtXR49WAQA1nPN9osItKfyrLwHCOB3d0L9UuNRqNRnMMlvxDXSHERpQoPQXcJKX0UINmlad5N9AnhFgdDJh2SrngzAYe3NHNwzt7uPZZbad6dxqNRqNZAEtaghJCPBdVavoRcKOUMhfEf0wIsaksaSiY55bCrgvObATgsd19FEveUuxSo9FoNMdgKb34zgB+DHxASvn5aau3ABcKIcZHkP0ccJeUsm8pbGuoibGmqYLO7lF2Hhhgy/r6pditRqPRaOZhKUtQfwVUAJ8UQqTLpv8H3AwMAXuBA6jvof5sCW3jwqAU9dBTPUu5W41Go9HMwVJ68b2baW1N07hpqWyZjQvPauSH9+7lkV093PwnZy+nKRqNRqNBd3U0wab2GmIRm0M9aboHMsttjkaj0Tzj0QIVYFsm521sAHQ1n0aj0awEtECV8eyzVU9L2544ssyWaDQajUYLVBkXb27Ctkye6hhgaGRJPNw1Go1GMwdaoMqIRRzOFw34Pvx++4zRhzUajUazhGiBmsZl5zYDsO1xXc2n0Wg0y4kWqGlcvLkZ2zLYvq+f1Gh+uc3RaDSaZyxaoKaRiDps3diAp6v5NBqNZlnRAjULl21pAeC3j3YtsyUajUbzzEUL1CxcuqWZkGOxfd+A/mhXo9FolgktULMQizhceo5ylrjn4VM+2odGo9FoZkEL1BxcdeFqAH79yKGJIeE1Go1Gs3RogQJ+KA/zsft3ki6UJuK2bKinLhmhe2CMpzoGl9E6jUajeWaiBQroyeQ5NJJlW9fARJxlGlwZlKLufqhzuUzTaDSaZyxaoIBLV9UC8JvOfryy6rzxar77HjtMJltcFts0Go3mmYoWKOCchkpqIiH6xvLs6h+diG9tqGDL+jpyBZdfa2cJjUajWVK0QAGmYfDcNZOlqHKuv2wtAD/5XYd2ltBoNJolRAtUwGWtdVgGPNabYihXmIh/9uYmapMRunrTPLGnf54cNBqNRrOYaIEKqIo4bG2swvOnlqIsy+QFl7QDcNfvOpbJOo1Go3nmoQWqjKvb1Yi69x7sI19yJ+Kve1YbtmXw4Paj9AyOLZd5Go1G84xCC1QZ66vjrKuKkym6U1zOqysjXL51FZ4PP7p37zJaqNFoNM8ctECVYRgG161TpahfdvTiepNOEa+4cgMAv3jwoB6GQ6PRaJYALVDT2NpYRUMsTH+2wB97UhPxbc2VXHRWI4WSx4/v37+MFmo0Gs0zAy1Q0zANg+evVaWon+ztnvLh7o1XqVLUj7d1MJbTH+5qNBrNqUQL1Cxc1lpLVcShazTLo92Tpaiz1tayqb2GTLbIXdu0R59Go9GcSrRAzYJjmbzojCYA7txzdEop6rXXCQB+cM9e0rr7I41GozllaIGag8taa6mJhDiSzvHI0aGJ+HM31HPOGXVkskXt0afRaDSnEC1Qc+BYJi9ar0pRd+w5Sinw6DMMgz974SYA7rxvH8Np7dGn0Wg0pwJ7IYmEEBZwAXAh0AC4QDfwkJTysVNn3vJyaWstP9/fQ08mz287+7gq+JB309oaLtzUyMM7e7jtV7t588vOWWZLNRqN5unHvCUoIUS1EOLDwGFgG/BO4FrgxcDfAw8LIQ4JIT4ghKg65dYuMbZp8IozVwHwv3uOMlacHNDw9ddvwjTgrm0dHOoZnSsLjUaj0ZwgcwqUEOL1wKPAGuBmICGlFFLKS6WUz5JSngHUAG8FNgPbhRBvmG9nQojnCyEeEUKMCCH2CiHeEsSHhBD/JYQYFEL0CSHet1gHeLKc15hkY02CdNHlrr3dE/FrW5Jc++x2PM/nK3ds1z2dazQazSIzXwnqIuAiKeXNUsq7pJQzGluklCPButeOp58rMyHEauAHwD8CVcBrgE8KIa4DPgoI4IwgjzcEArkkdHfcw+6Hv0SpOLOfPcMw+NNNrQD8+mAf3encxLrXveBM4hGbP8peHt7Zs1TmajQazTOCOQVKSvkOKWXfQjOSUh6VUr59niTtwHeklLdLKT0p5UPAvcBlwBuAT0gph6SUB4DPAG9Z6L5PlrGRw4wO7qVr912zrm9LxristZaS5/PtHYcmSkvJRJhXX6vczr/8o+3ki+6s22s0Go3m+FmwF58Q4kohRH0QvkkI8WMhxIeEEAtytJBS3ielfGtZfjXA5ahqxGbgqbLku4Al8zxoWX8thmExcPgPjA7O3o3RK85cRcKx2DUwygNHBifiX3TZOtY0VXB0IMNtv5RLZbJGo9E87VmQQAkh3gP8FNgohLgA+G9gGFXy+eTx7lQIkQTuBB4EHgmiy+vXxoDY8eZ7okTiDTStvQqAzp0/wPNKM9JUhGxuDKr6vrfzMOmCSuPYJu945VYMA354z146jgwvldkajUbztGahJai/BF4rpdwGvB54REp5UxC+6Xh2KITYCDwA9AA3AuMucNGyZDEgfTz5nixN664iHKsnl+nl6L5fzZrm0lU1ymGiUOLWHYcm4s9sr+H6S9fiej6f/95juK63VGZrNBrN05aFClQL8FAQfhHwkyB8GKhc6M6EEM9FlZp+BNwopcxJKYdQ31SJsqRnMrXK75RjmjZtm28EDLo7fk06dXBGGsMweMM5awhZJn84OsTDZT1MvP76TdQlI+w5lOJ/fr1nCS3XaDSapycLFai9wNVCiGuAdcAdQfzrUO1Fx0QIcQbwY+BDUsr3SSnL/bJvAT4shKgTQrQD7wnilpSK6nU0tj8X8Dmw/bu4pcKMNA3xCK8Mvo369vZOhvOqP75YxOFdrz4fgFt/IdndOTRjW41Go9EsnIUK1IeALwE/B74lpXxCCPFZ4P3ABxaYx18BFSjX8nTZ9P+C/LcDO1AltR8A/3kcx7FotJxxHZFEE/mxfrp23zlrmuetqeOsugrSRZevPX5gojPZczfW8yfPXYfn+fzLdx4hl5/ZlqXRaDSahWEs9ANTIUQD0DLetZEQYgswKKXsOoX2LcSudqDj7rvvprW1dVHyHBs9wq4HP4/vlVh7zmupaT5vRpqhXIGP3b+LdKHEyza2TPTbly+6/PW//oZDPaNceUErf/2a8zEMY1Hs0mg0mqcbXV1dXH311QBrg8+MJjiezmIHgbQQYpMQ4iygBFQG4acVsYoWVos/AeDgU98nl+mdkaY6EuLmc9sAuGP3EXYPKp+OsGPx3tdfSDhkcc8jXfziwZltWRqNRqM5Ngt1M38xcASQqGq47cCTZfOnHXWtz6a6aSueW2DfY9/ELWZnpDm7PskL1zXiA1/6434Gs6rNqq2pkre94lwAvnT7k+w9lJqxrUaj0WjmZ6ElqE8AvwW2AmuDaV3Z/GmHYRi0nfUKIvFGcpke9j/xbXxvZk8RL93Ywpm1FYwUSnz+4X3kSirNVReu5gWXtFMseXz8aw/Sn5opcBqNRqOZm4UK1Hrgg1LKJ6WUB6dPp9LA5cSyI6w/78+xnTgjA5JDu/93ZhrT4K3nraUhFqZrNMtXy5wm3vyys9m8rpbBkRwf/+qDZLXThEaj0SyYhQrUH1jCrodWEuFYLWdsfQOGYdHXuY3ezm0z0sRDNu+48AxitsVjPcPcLo8A4NgW73/jxbTUxdl/ZJhPf+thXE/3eq7RaDQLYaECdTvwX0KIfxdCvEsI8bby6VQauBJIVK+lbfMrATgk72SoZ2azW1MiwlvPX4tpwM/29/CrDuVYURkP8eE3PZuKmMNDT/Xw5R89qYfm0Gg0mgWwUIH6ayAFXI8atPBvy6b3nBrTVha1LRfQvO4a8D06nvg2w30zv0/eVFfJ689Wnn237ezivkP9ALTUJ3j/Gy/Gtkzu2tbBN+56SouURqPRHIOF9kS+9lQbcjrQfMa1uKU8vZ33se/xb7Dh/JupqFk/Jc1lq2vJuS7ffaqLW57sJGSZPKulhrPPqOO9r7+QT33jIX5wz14c2+KmF5y5TEei0Wg0K58FCRSAECKC6hh2M6rktRO4TUr5jPGhNgyDVvESPK9Af9eD7H30v9lw/ptIVE/V76vbG8iXPG7ffYSvPX4AyzC4sLmaZ5/dzHtedwGfvuVhvvtLiWOb/Ok1G5fpaDQajWZls9DvoDai+tz7FHA2SqQ+DjwlhFg/37ZPNwzDYM2ml1PTfD6eW2D3I19muG/njHTXr2/i+jMa8Xz4r0c7Jqr7nnPuKv76tRdgGHDLT3fyzZ/o6j6NRqOZjYW2QX0ONbBgm5TyWinl81Ej5G4D/vUU2bZkPPHEE9x5552Mjo4eOzFgGCbtm/+U2lUX43tF9j72dQaPPjoj3cs2tvDSjc34wDef7OTn+9Ww8Fecr7pAMk2D/7l7D1/4n8f1EB0ajUYzjYUK1HNR30FNDCoYhD8KPO9UGLaUHDx4kD179vCd73yHnp6eBW1jmBZtZ91IY/sVynHiye/Qc/C+KaUhwzB48fpmXnvWagC+v+sw/7OzC8/3ufKC1Xzwzy8m5Fj84sGDfOqbD+kh4zUajaaMhQrUEFA1S3wVUFw8c5aHa665htbWVtLpNLfddhv79u1b0HaGYdC68UWs2vAiALrknbOOyHtlez03n9uOZcAvOnr54iP7yRZdLjqriX98y6Ukog4PbO/mff9+PwPDuscJjUajgeP7Duo/hBAT3XoLIc4H/h344akwbCmJRqO84hWvYNOmTRSLRe644w7+8Ic/LLhtqGntFbSf8xoM06a/60H2PPxfFAtTBwR+9qoa3nnRemKOxeO9w3zq95K+sTyb1tbwqbc/h4aaGHsOpXjXv/6GnR2Dp+IwNRqN5rRioQL1AdQQ7Y8IIbJCiCxq3KY9wLtPlXFLiW3bvPCFL+SSSy7B933uu+8+7rjjDnK53IK2r20+H3HR23DClaRTHex64HMzRuXdVFfJBy4VNCciHEnn+MS2XTzek6KtqZJ/eedz2bK+jtRonvf/x/389Hcd2nlCo9E8o1nweFAAQojNKA++LLBTSrn3VBm2UE7FeFB79+7lZz/7Gfl8nmQyyUte8hIaGxsXtG0xP8K+x75BZrgTDJNV619AY/vzMIzJd4GxostXHuvgyb4RAK5pb+DlogUT+Nr/7uDO+/YDcOmWZt7xyq0kYqFFOS6NRqNZacw3HtScAhWM87RLSukda8wnKeVTi2TrcXMqBApgeHiYO++8k97eXkzT5JJLLuHiiy/GNI9d6PS8Eof3/JTeg78FoKJmA+1nv4pQJDmZxvf5ZUcvt8vDuD6sqYzypq1raU5EuPePXXzx+4+TzZeoq4rynpsuYPO62kU7No1Go1kpnOiAhduBurJw+fhPT/I0Hw8qmUzymte8hvPOOw/P89i2bRu33norAwMDx9zWNG1Wi5ew/ry/wHbijA7u4anffZb+ww9NVNuZhsF16xp57yWCumiIzpEsH7t/Jz/d183lW1fxb39zBWJNNf2pLO/74v18+Y4n9RDyGo3mGcV8ArUW6C8Ll4//tI6n+XhQoNqlrrrqKm688UYqKiro7u7mlltu4fe//z2l0rHFIlm/ibMufTeVdWfilrIc3PE99v7xK+SzQxNp1lbF+YfnbOKy1lpKns8P5RE++XtJyTH51Nufw59esxHDMLjzt/v5q8/cw6Ny5ui+Go1G83TkuNqgViKnqopvOvl8nnvuuYcdO3YAUF1dzdVXX01bW9sxt/V9n8Gjf+SQvBO3OIZhOjSvu4rGtudhWs5Euu19w9zyZCeDuSKmAVe21fMnG5o50pPm87c9xv4jwwA8d+sq3vjizdRXR0/NwWo0Gs0ScaJtUA8BC1IvKeXFJ2njCbNUAjVOZ2cnd999N4ODyhV8w4YNXH755VRXVx9z22J+lEPyDoa6HwcgFK1htXgJyfrNGIYBQLbocvvuI9x7sA8fqAjZ3CBaeFZzNXf8Zh/f/YWkUPIIhyxuvGoDN1yxnrBjnbLj1Wg0mlPJiQrUR1i4QH305Ew8cZZaoABc1+Xhhx/mgQceoFQqYZomW7Zs4ZJLLiEWix1z+9HBfRza9SOy6W4A4sk2Wta/gBUWZMsAACAASURBVMrayW4NO0fGuHXHIfYOZQBoTkR46YZmVoVCfP2up9j2uBoUsS4Z4VXPF1xz8Rpsa6FfDWg0Gs3K4IQE6nRhOQRqnHQ6zbZt29ixYwe+7+M4Dueeey4XXngh8Xh83m19z6Wv6wGO7vslpaISoYqa9bSsfwGJKlVt6Ps+fzgyxO27jzCQLQDK2+8G0YKXKvCVO7fTcUS5qjfWxHjNtYIrzm/F0kKl0WhOE060BPXPC92BlPLvTsbAk2E5BWqcvr4+7r//fvbvV98v2bbNOeecw0UXXURFRcW827qlHL2d2+g5cC9uSX0UXFm7kcb251FRswHDMCh5HvcdGuCuvd0M51XPUmuTMZ6/toFszxi3/kLS1at6rlhVH+eGKzZw5QWthHTVn0ajWeGcqEDds9AdSCmvPBkDT4aVIFDjdHd388ADD0z05WdZFkIIzjvvPJqamubdtlQco+fAb+ntvA/PVaWlaEUzjW3Po6ZpK4ZpkXc97j3Yx8/2dZMOOpatj4W5uq0ety/L93+1h6MDqjRWlQhz/WVruf7SdpKJ8Ck8ao1GozlxdBXfEtPX18cDDzzA7t27J+Kam5s577zz2LhxI5Y1d8mmVByj79Dv6e28n1LQn58TrqRu1cXUrbqYULSafMnld12D/PJAD31jSszijsWzmmuIjhS554FO9h9WHn8h2+R557dy7bPbEGuqJ5wxNBqNZiVwoiWotwFfk1LmgvBc+FLK/1gsY4+XlShQ46RSKR577DG2b99OPp8HVMe0mzZtYvPmzTQ0NMy5recWGex+lJ4DvyGXGf/2yaCyTlDf+iySdZvwDZM/dqf4+f4eDgxPjITC+qo4bYbDzu09/HHX5HdTbU0VXPvsNq68YDUVuvskjUazAjhRgeoALpRSDgThufCllMv2se5KFqhxisUiO3fu5NFHH6W/v38ivr6+ns2bN7NhwwYqKytn3db3fdJD++jrepBUz5P4vqras5041Y1bqG7eSqKqnc6RHL/t7OfBI4Pkg8EPw5bJhliUwtEMj23vYSSjSlu2ZXLhpgaeu7WVizY3EgnZp/gMaDQazezoKr4Vgu/79Pb2sn37dnbt2jWlp/SmpiY2btzIhg0bqKqabegtKBUyDBx5mP7DfygrVYETqaKmcQvJhs3Y8VYe6h7h/kP9dJSVqhK2RUPBoO9Air0Hhhi/7JGQxcWbm7h0SwvnbawnFnGm71aj0WhOGYsmUEKIq1G9mReAHVLK+xbRzhNiMQRqdFcfmX2DRFsribVX4yQji2rjbJRKJfbv38+uXbvo6OiY0nVSfX0969evp729naamphkd1Pq+TzZ9lMGjjzLU/RiFXGpineXESNadSVX9ZnKxdh7pyfDgkUG6M/nJNCWPZNojdTjNke7JYe5ty2TL+jouPquRizY30VB97G+6NBqN5mQ4aYESQqwGfgm0AwdRffitAR4GbpRSHj0eg4QQFwM/llI2BMthYBQlfOP8Tkp57QLyauckBerIj54is3dykECnJkp8bTWx9mqirZWYp9hdu1gs0tHRwZ49e9i/fz+FwuRpiEQirFmzhvb2dtrb22e4rfu+RyZ1kKHe7Qz3PUV+bLIK0TAs4lXtVNSsZyTczq5MlMd7R+ganRy1182WiI4UyfVl6evJTPkyu725knM31LNlQx1nr6vVpSuNRrPoLIZA/QIlHm+UUvYHcc3AN4CslPKlCzFECGEANwOfAZBSVgXxF6IEa35f7NnzbOckBcrNl0jLfjIdQ2QPpvAK7uRK0yDSmCDaWkm0NUlkVSVW5NS12ZRKJTo7O+no6ODAgQOkUqkp66uqqli1ahWtra2sWrWKqqqqCc883/fJj/WR6t3BcN9O0qkDlHcGYlphKqrXUUqsp8NtYNeIiRzM4Ab3gFtwcQdzWMNFUj0ZikVvclvTYENrFVs21LF5XS1iTbUep0qj0Zw0iyFQWeB8KeXOafHnAA9IKefvNmEy/ceAFwG3Ah8sE6i3ADdIKV+wkHym5dnOIrZB+a5H7ugomY4hxg6kyPemZ3T4FKqPE2lOEGmsINyUIFwXwzhFvTekUikOHDjAgQMH6OzspFgsTlkfj8dpaWmhsbGRpqYmGhsbiURUFWWpkGF0aB+jA3sZGdxLfqxvyraGYWFXrKE/tJ4ur579Yw6H06r05ns+hVSeYioPwwUyQzmm3yqtDQlEWzWirYYz26pZ01ihe7HQaDTHxXwCtdCiwB7gTGDntPg1wKHjsOU/pZQfEkJcMS3+fKBBCPEE0Aj8FniXlPLwceS9KBiWSbQ1SbQ1CZer0lXu8AjZrhGyh0fIHR2l0Jeh0JdhhJ5gG4NwQ0KJVUOccF2cUG0MM3TyVYNVVVVs3bqVrVu34nkefX19dHV10dXVxeHDh8lkMuzZs4c9e/ZM2WZcsOrr66lru47Vm26gmB9mdHAfo0P7yaQOksv0UhzpIEkHSVTjYjFaQ19oA0dp5Eg8ztGaCB4QK3kUU3kKQ3lKIwUKIwW6etN09aa5+yF1C0RCFu3NlaxtSbK2Rc3bmiuJhrWXoEajOX7mfHIIIa4vW7wd+KoQYiPwAOACW4APA/+00J1JKY/MsSoDbAM+BhSBfwv2uWy9pI9jhW3i62qIr6sBwCu65HvS5LrVlO8ZpTiUI3d0lNzR0SnbOlURQnUxQnVxwnUxQjVRnKroCQuXaZo0NjbS2NjIBRdcoIbxGByku7ub7u5uenp66O3tJZVKkUqlkFJObBuJRKirq6O2tpa6ug3UtV3C6ooofrGfzHCnmlIHoThIS/FBWoALgKJl0W/UMxBtp7einsONlWRcE9/zKaULFIYLFIcLFEcK5LIldh0cYtfByfGuDAOaa+O0t1TS2lDBqvoErQ0JVtUniEd1m5ZGo5mb+b6D8mZdMRNfSnlcT9ygBPWj8Sq+WdbXAX3AGinlvCW0leBm7uZKgWiNku8bo9CfoTCYBW/2c2vFHZzqKKGqKE51BKcqSqg6gl0ZwQxbJ9Xbg+u6DAwMTAhWf38/AwMDEx8KT8dxHKqqqqiurqYqmSRZYRMLF7EZpZTvJzt6hEJuUnB8H8aI0u9XMUANQ2YD/X4VQ24Yr+BRTBcpjRbUPF2klCnO2Sd+MhGmtUEJVktdgsaaGPXVURprYlTGQ7rXC43mGcAJVfFJKZesMSFom7q1rI1rvPU9N8cmKworYhNrqyLWNqm3vutRGMpS6B+j0D9Gvj9DcShHMZXFzRRxM0VyXSMz8jJDFnZFGLsyjF0RxgnmdmUYpyKMFXfm9Sq0LIuGhoYpvVT4vk86nWZgYID+/v4J0UqlUuRyOfr6+ujr65uRl2maJBL1VFW2UVVhEI96RJwCVYyRdIdpyz8F7AADipbNYDTJUKSSVG0lKSoYpoqUG6OQcZVYjZVwx9S8NFZiOJ1nOJ1nx/6BGfsOOSa1VVGaauI01cZoqI5RXxWlpjJCdWWYmsoI0bCtRUyjeRozXxXf86SUvzmezIQQV0kpf30CdmwBLhRCvDZY/hxwl5Ry5lPzNMGwTMJ1qj2qHN/zKY3mKaZyFIayFIeyFFM5NY3k8AouhYExCgNjc+SsRMyKO1ixEHbcwYqHsGNqPhGOOphRGzOkSmQVFRVUVFTQ3t4+Ja9sNjtRJTg0NDQxHx4eJpvNMjIywsjICJ0zrIhgGGESEZ+qSouKmE8s7FNtj2BbfZh+FnBxTYPRqgSpZAUpKkn7cUaJM+LFGcpFyY9BaayImy3hZl3cXAk3V6JQ9Djal+FoX2bO8+DYJhWJEFUVEWoqw9Qno9RXRamuCFMZD1MRC1GZCFERC5GIOpimFjON5nRivtbrvxZC/D2qPehXUsribImEEDbwYuDtwBhwIgJ1c7CfvYFNdwFvPoF8VjyGaeAkIzjJyJQSF6iSjpd3KY3kKI7mKY3kVXXZSJ5SsOyOFfAKLl7BpTi0gAKmoUp4ZsTBitqYERsrYisBC8LxsE1FqIG21mbMdTZm2MIMWXimTzqbYXR0dMo0MjLC6Ogo6XSa0WyB0aw/uTOcYIrj2B4RxyUScok4I9SHhlgdgkjII2R7WPEi+USIURKMBsKV9uOMEWGkGGE4GyKTcyjmPNxsCS/v4uZdvIKHl3cpljwGUzkGUzn2L+DcRyI20YhNLOqQiIWoiDskY2EqYg6VsRDJWIiKmEMs7BCL2sQjDtGImuuhSzSapWdeN3MhxA3AR4A24F5gB9CPehLVA+cClwCdwMellN8/tebOamM7p0lXR4vBuIi5mQKlTEFVmWUKqtpwrEApmLvZEl6uNPWbrhPBADNsYzrWhHCZIQvTsTAcE9eCgl8g5xfIeUVybl5NpTxjhRy5Qo5sIUe+mCdfKDD1fvNxLI+wowQr5LiEbQ/b9nAsFWdbHp5tUzQj5MwIGaKMESXrhcm4YUbyITJ5h2zeJlcwKeTBK7j4RQ9vYnLxSyfXpZdhgu2YhBwT2zYJORaOYxIOWYQdm0jYJhJS82jIJhKyiIZtomGbWDBFQ8E6xyQcsnEsE8c2cRxLzS1Tl/I0zzhO2M1cSnk7cHvg1HA9SowaAQ/oBh4BPrkSujx6pmAYhioBRWxCtcfuish3PdycEis3V8LNFmeEvYKLly9NlMzKJ7/kqTS5kurrYw5sIAEksIBYME2zBZ8SLgVKFClRoEShVKJYKlE0XYqGWjdmeJRwJyffpeiX8CjhWGkce4SE7VFtediWj2V62CEfO+phWAae5VC0HEpmiJLp4JoOBWzSxTBjRYexgk22aJMr2BRKJoWSSbFk4JbAK6GO2fXwSz5eycMvefgeFPMexfxCfYdODMNQYmiahppbBmawbAXLVrBsGuXrVNgKwpZlTIZNA7t82TLVsmViWya2aWLZhppbJlb53DSwLQvLNIP9jMeNr1fbm5aBZZhY1ng+xsT68X2ahoE1YbOJbRoYpoFlgGGYmIY6Acb4edDti894FvSBipTyXlQJSnOaYVgmdjwE8RPr9cF3vZnClS/hFT38khvMPfyiO/Ewn3Nd0cMpuUSKHr7nq3Wup7z8FvDc9/FxPY9i0Z0qYLi4eGWTi4mPXRYfwiVujuGbJbBcfNMFwwWzhBH2MKIemB7YJr5p4VsWvmniW2q56FvkXIeCZ1P0bAqeRdGzKHgWJc+k6FoUXRPXMyiVDFzXwPUMXBc8FzX3wJ+YfHzPh2Du+z54ykvSd8Fz/Ymj1gQYU8NT5KtczGasK5tN0zzDmCPd9EzKF+fQzQXJqTFrcEHpF7SveTKdddW8+c9z7xkG4GMA65JjfOL/vnrutCeB/oJSM4HveRSLBUrjUyE/sewWi7huSU2lIm6phFcWdkslXDcIu6Wy+eR6zyvi+i6eUcIzPHzLxcXFdz31gHZ98IzgoQ2Gh/qP+IBvYPoGpmFhYmEaJiYWhmFioN7ODUwM1NwyTOwgbATrTAwMw8bAmUwbbD8eBjAw1V/TMCZ3r0xQE36gqapMqNb5wbIPhq/EzvAhpITPmIjz8A0f1zRwDfBMQ02GgWsYFA2Dkh9MhoHrQ8k3cQHXNyl5Bh7gYeD5Jh7g+gaebwRxBp5XFvbBH1/vG/hKE5UQzlhWcVC+HNwb0+LHw1Pi/OCRNpHGLwuPx/sTYbV6fKPJNHPfoFPD/pwrF0PW9YvB/Eyen/0sqCOhE0IL1GmK57oUCjkKuSzFfI5CPkshF8zzQVwuSyFYVyzkKRXylIoFJTqFcSHKUwzCbmlWP5gVhWlZmKaFaVgYpjmxbBhm8FanREY9UI0pD9jyh/B4eLxU442HfR/PA/UOaUw8mMeXJ+KnxE0Pj79bUrZuYWFlb1DNNfFrYAKmYeBM28oMhMDwx9/7/WCaJQ1KM4FxCZ5yNPhG2bbqDdkvPzLfV6fYUOnG100egY+PqXZi+Mp+w2BcyjGY3MYwxg0rO3wf3/Dxg0vp+0GxxVSCawCuEeRpqHcZjOCcmertwR/vl9IwVB7GxNFNpFMvGer4xs/Y+IFMnpXxhbLtjWmyNX6txm0vPxhjlrA/ebb88hM3Jcvye2j8HijP3Zi6n2PkN/VeVZnOTDs1Ynz9DPeE2YqlQJVz6r5I0gK1jPi+T7GQIzeWIZ/NkBvLkBtLT4azafJBXC6bUeFshkIuS6lYOPYOTgDbCWGHQjhOWIWDybIdLNtWkzUzbFr2vOst28GybEzbxjItTCsQmCBsmiauB/mcRy5bIpd1yWVLZLMuuZxLIeeSz6m4XK5ILhtMmSKF/Ek6gsyCYSinCNVGA6bhYxs+Jh6mX8LyXQy3iOkWMUoFjEIeo5iDQg7DLWH6Hgaemvsepu+qeVnceLxJ+XKQFh/Dd4O0Pphg2CaebeI7Jq5lULINihYUTF9NhkvRANcC1zTwTHAtg4Kpll3LwDWnrnMn1gVz08CzwDNUGs8A3zSwbQfbUtfOsSxsw8A0TRzAwsP2PCzXxSyVsNwiVqmIVSph+T6W72P7YPk+ju9j+WCXz1Fz2/cxfbB8sFBh01diWj63TFvdk1YYy3GwnQiGE8GwHQzLwbDtYB4sW7aabAesaWms8rSTYUxLLZsWvmGSL/mM5lxGsx6ZnEsm75LOeYzmPNK5kppnXdLZEulckdFMkfRYkZK7+G2WpgEhx5qYwo5J2LEJOWZZnDWx7FjKscexg/t5fLINtS5w1rHL1o9vY1sGjm1hW4ZaDtoXVRukals8lV2ZaYFaZMZFZ2x0mLH0iJpGh8mmRxhLD0/GB/MTLrUYBqFwhFA4SigSxQlFCEUml0PhqFofieKEIzhOGCcUxg6FcQIRmhSgME5IidBiN0wX8iVGR3KMjuQZGc5NhMfSaTKZAtlMgUy6wFimQPFEPQ4NiEQcIlGHSNQmHLEJhW1CIZtQ2JoIOyEL2y9iFLIY+THMfBYjl8HIpiE9gj86jD+Swh0ewh0Zxi8bo+t4MEMhrFgMKxoJ5lGsSAI/7FB0TAqOQd6CrO0zZrmMGS4jRoFRP8+wn2XYzZI1PUoWlAIh8hbo3WebNjEnQtSOEHEixJwIETtC1A5TEcRHnTARK0TY9QiXSjilIk4hh53PYeUyWNkMVmYUa2wEc3QEI5deWHvJLBhOGDMUxQxHMUIxzLAKq7jYZHwoEoQjmHYYw1GT6YRU2A5jOmEMJ4RhnrzLv+/7ZLJF+odzDA7nSKVzpEYLDKfzpNJ5htPpIKziiqUTExrHNtXnCoFHZzRiT4aDKRK2lJdn+RRRXqHKS9SaIjy2ZTxjHEgWLFBCiAbUB7XTaxmQUv5kke1asRQLedKpQUaHB0kPD5BODZIeHl8eIp0apFhYeAcYthMiEksQicUJR+NEYolgrsKRaJxwLE6kbJ0SpPCy36T5XInhoTFSQ1mGB7OkhsZIj+SVCA0rISrkF/6QtyyTWCJELD45xRMhIjElPtGomoeDeSRiq+WwDfgUhlIU+vvJDwxQGOgl3z9AoXeQQv9AEDeIexyiY8ViOFVJnIpK7IoEdiKOnUgE02TYSsTJhyyGzTxDRoGhYpqB7BCDYyk1z6YYHOsh7y601GsQsiIkI5VUhhNUhOLEQzESE/PJcNyZXE6EYoTsEL7n4o4OUhoZoDTSH0wDlEYOUxoZwB3tx80ML/g8YJhYsQrMSAIzWoEVTWBGE1jBshlJTI2LVWCG40pwFkFMjhff9xnJFOgZHGNgOEt/KsfAcJaB4VwwZekfzlEoLvyFKBKySCbCJBMhKuNhElGHRNQhHnNIRNX3c4ng+zo1V+Gw/n7upFiQQAkhbga+iBKn6fjA0+YqeJ5HZmSI4YFeNQ2q+chgLyNDA+Szc/dsMI7thIglksQqKoklkkQTlcQqksQSlWqqSE7Eh8KnfvTeE8VzPVJDWQb60gz2ZUgNZUkNjjE8lGV4KEt27NilP9s2qUhGSFSEqUhGqKiMkKgME0+EJ8QoHsxDx+i6qDSWJd/bQ677ILmeHgZ7esl195Dr6SXf24tXOLYA2IkEodoaQtXVSnyqqnCSSZxkJU4ySahs2QxNej4WSgV6xwboTffTmxmgJ91Pb6aL3oF+ejsHyJaO/VISscPURqupjiZJRipIhiuoDObJSOWUuIgdnjcvNztKcaiHUl83xaFuikM99KfU3E0PqYa1+TBMrHgSK16l5omqyXC8Cjs+uWzGKiYcSFYKuXyJnsExugcy9AyOTZsyZBdQ7RsNW9Qmo9QmI1RXRCYEqCoRJlkRVvNEmGQ8RET3yL8sLPSs/y3wZeB9Usp5voY5PTm4+0me+N2vGB7sZWSwH8+d+y3bsm0SlTUkqmpIJNVUURZOVNUQjsSWvXSzUHzfZ3Q4R39vhsH+zIQYDfZnGBoYw5ujw1tQ4pOsjpKsjlFVEyVZHaUyGSFRGQnEKEwkenzVhr7nke/rJ3v4MNmuw4x1HZ4IF6cN3jjDnooKwg31hGtrCdXWEq6rVWJUWxvE1WBF5n4h8H2fodwwB0a6OXxwB4dHuzky0sPh0W4Gxobm3A4g6kRoiNVSG6umJlpFTaya2mgVNbEqaqPV1MSqiDnRBZ8HAN8tUhw8SqG/i2J/l5oPdlNKdePl5ntRMrAS1diVddiVtViVddgVtdiVtUFcHVaiallKN8eD7/sMDOfo6h2lqzfN4WB4l67eUfqH538hiEdsGmvi1FUpAaqtilBbGaWuKjIhSnqE6JXPQgVqNfC5p6M4ATz5+7s5KJ+YWI5VJEnWNFBZU0+ytoFkTQPJ2gYqq+uIJipPG/GZzli6QG/3CL3do/R1j9J7dJTe7lHyubkFubIqQk1dnNr6OFU1MapqYiSro1TVxIgnTrzHcd/3KfT3k+k4QObAQcY6O8l2HSF7+PCcJSHDcYg0NhBpbCTc2ECkqZFIY+PEsh079ofL46RyIxxMdXEw1UVn6siEGM1VErIMk7p4LY3xOhritTQk6mhM1NEQr6MxXkc8dOIvJb5bUuLTd4hC/6EJQSoOHp2zJGQ4EZzqRuzqJpzqRpyqpomwXVmLYZ0+D1/f90mN5uk4MsKBo8N0HB2hq2eUw33pOUtCtmXSWBOlsTZOY02MppoYjTVxGmtVWI/2/PRgoQL1C+Bq1MCFTzuufPmf09vVQUV1LcmaBpzQ/NUrKx3f9xkeynK0a5gjXcMcPTRM79ER0qOzD7kRjTnUNVZQWxenpl6JUU19nJraOM4iDLroFYuMHewkc+DAhCBlOg7gZmYvBTjVVURXrSLWuopo6yqira3EWlcRqq3FMI+vqsnzPA6PdnNgqIuDw0qQDqQOM5yb2ZM8QDwUo7WiiZbKJlZVNtJS0cSqyiYa4rVYi1Di8ApZCr0HyXd3UOjuIN/TQaGvE2YttRvYVY2E6lpx6lcTql2FU9uCXdWEFU+eli9KrudzqGeU/YdTSpCOjNBxdJjh9OwvJclEKBhDrGJiaJZVDQkaq2N69OZnAAsVqMeBfxFC/AmwG5hyN0kp/26xDVtK4hVJ1m7autxmnDAjqSyHO1OBGKU42jU8a/tQKGxR31hBQ1MF9c1q3tBceVIloen4vk+uu5tRuYf07j2M7tlDZn/HrB5xdkUF8bXtxNe2E2tbQ6y1leiqVdiJE//wb2BsiD0DHewdPMjegQ72DXWSL80U5qgdoa1qFW1VrbRVrWJVZROrKpqoCCcW71y4JQo9B8gd3k3+yB7yR/dSHDjKbB+B2tVNhBraCNWtVoJU14pT24LpnL4vS77v0zeUZfehIXZ3ptjdOcS+rhS5Wbw1YxGbtS3JYETmStY0VrKqIUHlCfaAonl6sFCBeh7wIBBFdRBbjv7kegnxPJ+eIyMcOjDIoY4hDh0YZCQ1s1oqFg/R3JqkeXWSltYkjS1JqqqjGIvcGambyzG6SzKycxeju/eQ3rOH0mh6RrpISwuJdWuVGLW3EV/bTqim5qTEoOSW2Dd0kJ19ewNROsBQdqZ3Wn2shvbq1bRVtdIeTPXx2kUvgZRGh8gflkqQDu8mf3QffmlaycC0CdWvJtS4lnCTmkIN7Zjh42ufWokUSy67O1Ps2D/AroOD7OlMkUrPfDloqImxvjXJ2pYka5sraW9J0lAdPS1LhJpTy0L74rvyVBuimZ1SyaXrYIqDewc4dGCQroOpGa7b4YjNqjXVtKxO0rI6SXNrFZVVkVPyhy+NjTG6cxfD23cwsuMp0nv34btT34idqioqNm4gsWG9mq9ff1KlonEKbpG9Ax081beHp3r3sHtgPwV3akkx7kRZX9vOGTXtbKhdyxk1bVRFKk9637NRGhkge3A7uYM7yHbuoDTUPSONU9NCuHUjkZaNhFs2EKpfrT4EfRqQy5f4/9u78+iorjvR99/SPM/zLJDYSIDEPIMZbAy2MRiP8RDbsZ3cdF737X4373an052svO685HaG7qx0p+PY7vYU4xhP2NgGzGBmzCwhJDZCEkggNM9zqeq8P04hhIKxGGqQ9Pus5bXQOVV19uEY/Wrv/du/rc83U1TeyKnyRvT5JvqGrBcKDfIlOy2SCamRTEiLIDs1kojQkdsrFK51I+ug4jH3fJqEWU+mBHhJaz2crXjEMNntBjUXW6kobaCitJHKikb6rVf/o4+ICiI1M5LUjChSMyOJiw+97T2jy2y9vbSdKqaloJDWk6forKjAUQvI5OVF8PjxhE/KIXSiInRCNn4xMbclONrsNkobz1FYW8ypujOUNp6j3351cE4OSyAnNpuJMePJis4gISQWLyelRNs6W+muKKT7fBHd54v+LCBZ/AIJSM7GP3kCAckT8E+agHdQqFPa4g79Njv6fDPHdR0FpfWUVrVgG5LlmZYQyqRx0eRmRqPSIkmIHjkZrcLzDHcd1Gzgc6AK2I+5UPc+4C+VUku01kec18TRr6Oth9KSOs6erqOitJGe7qt7BXEJoWRkR5OWGUVqZhShYc5bO2UYBt1VF2g+foKWY8dpKy65KqvO4u1NiJpA2KRcwidPInSiwif49hWLrO9spKCmmBM12+M3LgAAIABJREFUxRTVarqs3VeujYX0iBRyY7PJic0iJzaLcCf1jgAMu43ei6V0lR2nq+w4fTVlV523+AUSmJZLQPokAtMn4xef4fGp2zequqGD47qe47qOwrMNdA/qvXtZICslnEnjYhxBKYrwEOkdidtnuD2oXwHrge9qrQe+Miml/h34BSBDgDfAsBtUX2ihtLiO0pI6Ll24et4kIiqQzKwYMrNjyMiOIcTJQyL2vj5aCk/S9OUhmo8ep6+x8arzweMyiZg2lYi8KYROVNddS3SjbHYbuqGcwxcLOH6piOr22qvOJ4bGkZ+QS178RCbGZhHi57zKyWD2kjpLj9BddpzuigLsvV0D5yw+fgSk5RKYMYWA9Mn4J2SOuoDUb7NTXNHIl0U1HCquoaax66rzqfEhTFNxTJsQR25mlKwlEk413AA1E3h+cHBy+C3mpoXia/T32yg/08DpwhpKS2rpHJRW6+PrRWZ2DNk58YxXMURGO/eXMIC1vZ3mI0fNoHS8AHvPlUQL3/BwIqblm0Fpaj5+ERHX+aQb19PfS2FNCYcvFnCs+iTtfVfSzQN9A5gSN5H8hFzyE3OJC46+rde+FmtzDZ1nDtGlD9FzQV+19sg3OonAcdMIGj+NgLTcEZ1V91W6eqwcPV3HoVM1HCmppWNQDz4k0Jf8CbFMdwSl2MiRn8whRo7hBqhLQAaghxwfx3X3WR3brFYbZafrKSm8xJni2qsWxIZHBpKdE0d2bhwZWTH4uqBmV19LC437DtB44CCtp4qvmksKHj+OqNmziJo9k+CMjBteb/R1uqzdHLlYyIGqoxTWnsY6KLkhMSSOmcl5zEzOIzt6HD5O7pUYhoG1vpKOkgN0nTlEX935Kye9fQjMyCc4eyaB46fhGxHv1La4S0e3lYMnL7Gn4CKFpfX0265890yJC2HOpARmT0pApUfhLdvQCzcZboB6A/iDUuqvgYOOY/OAf3WcEw79/TZKi+s4daKa0pK6qyp0xyeFkZOXwMTJCcQmhLpk8tja3k7TwS+p37OP1pNFA0HJ4u1NWN4UoufOJmr2LPxjY2/7tXv7+zh26ST7Ko9wvLoI66AEh+yoDGYm5zMrJZ/k0ATX/F0019Bxai8dp/ZgbbgwcNziF0hQ1nSC1RyCxk/Dy3/4FSlGkq4eK4eKa9l74iJHT9cNbAVhsUBuZhRzJiUwZ3IiybEhbm6pEKbhBqifAknAO5gZfBbAijnE90PnNG3kMOwGleeaOHn0IsUFl65KckhKDScnL5GcvESiYpw/dAfm2qTGg4do2LuXluMFA4tkLT4+RMyYRszCBUTNnIFPyO3/RdRvt1FQU8y+84c5XF04sEjWgoWc2Gzmp85gdspUIgPDb/u1r9me9mY6S/bRcWovvdVXCqF4BYYQrOYSrOYQmDFl1KR+D2Xtt3OkpJZdxy5wuLhmIA3cYoG8rBgWTk1m3uRESf0WHmm466D6gBeUUt8HFNANnNVad1//naNbQ20HhccuUHTsIi1NV/4qEpLDmDI9mZy8RCKiXPNt3DAM2k9rarftoHHffmzdjvZ4eRGen0fsogVEzZ2Db6hz0p6rWqvZWXGAPecPXVVGKCsqg/lpM5mXOp3ooEinXHsoo99KZ+lh2k/soLuiYGBOyeIbQLCaTUjuQgLH5Y2oenU3qvxiK9sPV/LFsQu0dV6Z78zJiGLR1GQW5CcR5cRsUCFuh68MUEqpe4DPtdZWx5+HSlVKAWNtPygbxQXVHD1YyYVzVypch0UEMGV6MlNmpBCX4Lq1L72NjdTv3EXt9p30VFcPHA9VE4i9YzHRC+bd9iSHyzr6OtlfeYSdFQcoa7oyj5McmsCijNksSJtJfMjtHzr8Kr2152gv2E5H0W7s3Y5qFt4+BI2fQcikRQRlzxyVSQ6XtXb0suvYBbYfrqK8+kpmaFpCKMtnprFoarIkOYgR5Xo9qE1AAlDn+PNXGVX7QX2Vmuo2jh04z8ljFweSHfz8fcjNTyRvRjLp46Kdtlh2KMNmo/nYcWo+20Lz8RMD80q+kRHELV1C3LKlBKWmOOfahsGZxnK2nN3Nl1XHBuaVAn0DWJA2iyUZc8mOznTZ4kx7bxftJ3fTXrDjqnVKfnEZhE5dTsikRaNqsexQhmFQVN7IZ/vPceBk9UCyQ0igL3dMT2H5rFSyUiJksawYkb4yQGmtva7157HEarVRdOwiRw+cp7rqyjfS5LQIps9NY9LUJPxcuJGZtbWV2m07qNm8ld66OsCcV4qaM5u4O5cROW0qFm/nfFfosfawt/IwW87u5nyLmWBgwcKU+IkszZzH7OSp+Pm4rrBnX30VbUc3037yCwzHDsZeASGETF5EaP4y/BPGuawt7tDZbWXn0So+3X+OqlozkdbLAjNz4lk+K5U5kxLw9Rn13xvFKDfcShI7gHVa65Yhx2OBzVrrGc5onLu0NndzZP85jh2sHKgKHhDoS96MZKbNTSM+0XnVC4YyDIN2fYaazzbTsHf/QMKDf3wcCSvvJv7OZfiGOa89F9ousfXsbnadO0i31QwEYf4hLB+3kDvHLyTWBeuULjPsNjrPHKLtyGZ6zhcNHA9Im0TY9LsIUnPwcmGQdIeK6lY+2VfBrmMXBqqCR4b6s2JOOnfPzZAhPDGqXG8OagmQ6/jxDuA7Sqmha55ygPHOaZprGYZB1blmDu2poORkDYajxlhSajizFmaSm5/okrVKA+2x2WjYd4DqjR/RcdYxdGWxEDlrBomrVhIxbeptX6s0cG3DoLC2hE16GwU1JQPHJ8aMZ0XWHcxJmYqvCxMMbN3ttB3bStvRLdjazSoXFt8AQqYsJnzGKvzi0lzWFnew2w2Onq7lw11lFJ5tGDielxXDqvkZzJ2ciI/sjSRGoev1oBqB72OmlFuA7wGDy1YbQAfwv5zWOheprGhiy4enBkoOWbwsTJqaxOxFmaSku3b8vr+ri9rPt3Hp40/orTd/GfmEhhJ/13ISVq4gIN55C0etNiv7Ko+wSW+nsvUiAP7efizKmMOK8YvJiHTOvNZXtqelltYvN9FesB3Daqar+0YlETZzJaFTluAV4Jq0fXfptdr44mgVH+4q40KdmfQR6O/N8llp3DM/k9T40Tu3JgRcfw7qJGalCJRSOzGH+Jq/6vUj2e6tpVy60EpgkC8z5qUzc346YRGuHSrprW+getMn1G7dhq3LrH8WkJRE8trVxC65A29/52WfdfR28nnZHjaXfkFzjxmkIwPCWTVhKXeOX+j0+ndD9VafpeXLj+gsOTCQIh44Lp/wOfcTmJmHxUnVyj1Fa0cvn+yr4NP9FQM7zcaEB7B60XjunptOcODoTY8XYrBb2g9KKeUHzNBaH7itrXKxex6cTN2lNsZPjHPpMB5A98VqLrz3AfVf7BrYVyls8iSS16wmcuYMpw3jAbR0t/Kx3sbWsj0DC2rTwpO5Ty1nYdosfLxdlwBiGAbd5Sdo2f8BPZWnzINe3oRMvoPwOffjH5/hsra4S2NrN+/vPMvmg+fps5r/L2SlhLP2jiwW5CfJMJ4Yc4abJDEXeBFzTmrovxJjuJ8z6PNmA5u01nGOn/2AfwcewhxG/LXW+mc38pm3Iiom2GVVHi7rPF/JhXffo2HvfjNN3MuLmEULSFpzP6HZWU69dkNXEx+VfM728r0DaeL5CTmsVncxJX6iS4c0DcOg6+xRWvZsoPfSWcAsPRQ2/S7CZ92HT5jrkjDcpaaxk3d3lLL9cNVA+aGZOfGsW5rF5HG3f+dfIUaK4QaW3wD1wGPAa8ALQCpmmaPnh3sxpZQFeA745ZBTP8GsUDEeCAc2K6Uuaq1fH+5njxQdZ8uo2vAeTQe/BMw08bg7l5G87gECExOceu2ajno+LNnCrnMHsdnNb+izk6eyLncl46LSnXrtoQzDTpc+TPPeDfTVVgDgFRRGxJz7CZu+YtTPLwFU1bazYfsZdh2/iN1uYLHAwvwkHrlzAplJrikFJYQnG26AygPmaK0LHQVja7XW65VSdcBfAxuG+Tk/Ae4F/hn4h0HHnwaeccxxNSulfgl8Bxg1AarjbBmVb71N89FjAFh8fUlYcSfJD6xxSqHWwWo76nn31KfsOX8Iu2HHYrGwIG0mD+SsJC0i2anXHsow7HSWHKB577tY6ysB8A6OIHzeGsKmrcDLb/SX36mu7+CtLZrdJy5gGODlZWHZzFQeWpYtiQ9CDDLcANUPXC6wdgaYCuwAdgL/dgPX+73W+keOFHYAlFIRQCJQPOh1p4EpN/C5HqursorKt9bTeMDsMXn5+5Ow6m6S19yPX5Rza9M1dbXwXvGn7Cjfh82w423xYknmPNbm3E1SqGu3kbg8lNf8xVsD21t4h0YRMe8BQqcuH9UliC6ra+ri7c81249UYbcb+HhbuGt2OuuWZpHggj3AhBhphhugvgT+Qin1d0ABsBr4NTAZ6LveGwfTWldf4/DlktqDt+7sAkb0ngc9NTVUrn+H+l27wTDw8vMj4Z6VpKxbi2+4c4dv2nra+bBkC1vKdmO1WbFYLNyRMZeHJ91LXEiMU699Ld3ni2ja+Ra9F83txLxDo4lc8CCh+ctGbRXxwZraetiw7QybD56n32bHy8vCijnpPHrnBOJcVExYiJFouAHqB8CnmHX5XgH+VilVDsQDL91iGy5vpzo4rzsIc43ViNPb2EjVn96lbtt2DJsNi7c38SvuJOXhh/CPjnLqtTv7uvhYb+PTMzvocWTlzU2dziOT7yMlLNGp176W3uqzNO16i+7yAsCcY4pc8CCh01eM+ooPAG2dfby3o5RN+yros9qwWOCOaSk8frciSfZcEuJrDTfN/LBSKgMI0lo3K6VmAA8CDZh7RN00x+fVYCZJXHQcnsjVQ34er7+jg6oN73Hpk88wrFbw8iJu2RJSH3vEqYtrAfpsVjaX7uSDki109pkd0emJk3l0yv1kRqY69drXbE/DBZq+eIsu7UgE8Q8iYs79hM++Dy//0V+Kp6evn427y3hvx1m6e80syXlTEnni7omku7BMlhAj3bDTw7XWnTh6O1rrGuA/bmM73gB+rJQqxBzy+z5m5qDHs1utXPp0MxfeeZf+DrPTFz1/HmmPP+a0iuID1zbs7K88wvrCjdR3NQEwKW4Cj025HxXj+gpU/R0tNO9+m/YT28GwY/HxI2zWPUTMXTuqK4pfZrMb7DxSxZubS2hsNesWTldxPLlqItmprtkLS4jR5Hq1+Oox1zh9rcvrmW7Bj4BfAacw11n9Afj9LX6mUxmGQeP+g5x//Q16amoBCJ8ymYxnvklIlvODQ3HdGd448T5lzWbCQVp4Mk/mryM/Icfl62bs1l5av/yYlgMfmJXFLV6ETl9B5MKH8Ql17rCmpziu6/jvTaeoqDZzicYlh/Ot1ZPIz3bdflhCjDbX60F931kX1Vp/AUQM+rkHs9bf95x1zdup7bTm3H+9Rrs2J/0DU1LIePabRM6Y7vTgUN1Ww5uFH3LkojmvExkQzqNT7mdJxly8nFh14loMw05H0W6adr41UMQ1KHsmUcuewi/GtXX73KWiupVXNxVzTJvbn8RGBvLUqhzumJaCl4v2BxNitLpeLb7XXNmQkaCnpoZzr79J4z6zspNveDhpjz9G/F3LnbYP02VtvR1sKNrE52V7sBt2/H38WTNxBfep5QT4uD5Fu/v8KRq3vTawSaBffCbRdz5NYMaoWB3wtZrbenjjsxK2Ha7EMCAowIeHl09g9aJx+Lu4XJYQo9VwSx1dNxFCa/3I7WmOZ7L19HDh3fe5+OFHGFYrXn5+JK29n+QH1uIT5NxJf5vdxtazu3mn6GM6rd1YLBbuHLeQRybfR0Sg66sNWFvraPz81YEECO/QKKKWPE7IlDtGfRFXAGu/nY/3lPP255ru3n68vSysWpDBY3cpwkNG/1ouIVxpuEkSnUN+9sGsdD4N+Nfb2iIPYhgGDXv2ce7V1+hrNJMQYpcuIf2px/GPdn6NuJO1p3n12DtUtV0CzHp535z6EKnhSU6/9lCGzUrLwY9p2bsBo78Pi28AEfMfIHzO6jGxyBbgSEktL288ycV685/DrNx4nrt/MsmSMi6EUww3zfzZax1XSv0tZkr4qNNRXkHFS6/QVmxu2BeSNZ5x336eUDXB6deu62zk9RPvcujCCQDig2N4etpDzEjKc0vh0O6KQhq2vIS10VxnHZy7gOg7nxkzCRAX6zt4eWMRR0rMZJjk2BBeWDuZGRNdW41DiLHmVvdT+BNQCFwzgI1E1rZ2Kt9aT82Wz8Fuxzc8jPRvPkncsqVO3foCoKe/l40lW/no9Fas9n78ffxZl7OSe9Vy/Fy4g+1l/e1NNG57lc7ifQD4RicRc/cLBGbmubwt7tDVY+Xtz8/w8Z4y+m0GQQE+fGOF4t4F4/D1Gf3DmUK4200HqEGVydu+7rUjgWGzUbN5K5VvvU1/RwcWb28S77+P1EcfwSfEuXXSDMPgQNVR3jjxPo3d5p6QC9Nn82TeA0QFRXzNu53QHruNtiOf0bTrbYy+biw+fkQsfJiIOavHRGkiu91gx5EqXvu0mJb2XiwWuGt2Gk/dk0Nk6OgvZiuEpxhuksS11kSFAAGY1cxHtI7yckr/7bd0nTera4fn5zHu+W8RlOb8KgwX22p45ejbFNWZKeuZkak8O+1RJsa6fqEtQE/VaRo2/2GgoGvQhFlE3/UtfCNudanbyFBR3cp/vldIyTlzznFieiTffmCKLLQVwg2G24MauibKwCwSe1hrXXZ7m+R65197k67zlfjHxZH53DNEzZnt9Lme3v4+3i/+jI/059jsNkL9gvlG3lqWZc53+XomAFtnK4073qSjcAcAPuFxRN/9HMHZM13eFnfo6rGyfqvmoz3l2O0GEaH+PHvfJJbOSJENA4Vwk+EmSQysiVJKRQM2rXWL01rlYulPP0XMogXELFqIt7/zM9KOVZ/klWN/or7TXNy6bNwCnshbS6i/67PBDLuN9hPbadr5R+w9HeDtQ8S8tUTMXzcmsvMMw2BfYTUvfVhEU1sPXha4b0EmT6zKISRw9A9nCuHJhj0HpZT6R+C7mBXMUUpVAf+mtb6R/aA8Usi4TELGZTr9Og1dTbx6bAOHLprZeenhyTw/8xtuqZsH0HupjIbP/jCw1XrguHxi7n4e3yjXp7G7Q3VDBy++f3KgCkR2agR/8WA+Wamun/cTQvy54c5B/RT4NuZOuIcw6+XNAf5BKeWrtf6F85o48vXbbXx6ZjsbTn1Kb38vAT7+PDJ5Nauyl+Dt5fqqA7buDpp3raft6BbAwDs0iui7niV44rwxMZzVZ7Xx7o5S3t1RirXfTnCgL0/fm8uKOel4S3kiITzGcHtQzwNPa60/HXRsn1LqLGZVcwlQX6GkvpSXj6wfWGw7N2U6T097iOgg10+6G4ZBx8kvaNz+OvauNrB4ET5nNZELHxkT22AAHD1dy4vvn+RSo7nYdvmsVJ65dxIRoaN/OFOIkWa4AcoHqLrG8bPA6N9H4Sa09bTzZsEHfHHOrNsXHxzDczMeY2riJLe0p6+ukobNf6Cnylx4HJCaQ8zKb+MXl+aW9rhafXM3L390kv2F5heF9IRQvvtgPpPGOb8iiBDi5gw3QP0C+J1S6nGtdRWAUioK+DnwS2c1biSyG3Z2lO/nj4Uf0NnXhY+XD2tzVrB24t34uWEXWXtvN8173qH10CYw7HgHhxO1/JuETL5jTAzn9dvsfLS7nPVbT9PTZyPAz5vH757I6kXj8PGWxbZCeLLhBqhHgRyg3JEc0Q+kAX7AXKXUX11+4W3YG2rEOtdcxUtH11PaWAHAlPiJPDfjMZJCXV8SxzAMOkv20/j5q9g6mgALYTNWErnkcbwDnLvw2FOcKm/kP98r4HxNOwAL8pJ4fs1kYiLGxnCmECPdcAPUiM/Uc6Zuaw9/KvqYz0p3YhgGkQHhPD3tIealznBLL6WvsZrGLS/TXWHuGeWflE3MyhfwT3RPtqCrtXb08uqmYrYdNhdeJ0YH8511U6R2nhAjzM2sgwoDvEbTOqibZRgGBy8c49XjG2jubsVisXBP9lIembKaIF/Xf0u3W3tp2fceLQc3gq0fr4AQopY+Qei0O8fEVhh2u8G2w5W8uukU7V1WfLy9eHh5Ng8ty8ZP9mgSYsS5kXVQ3wX+Hkhy/FwH/EZr/XMntc2j1bTX8cqxP1FQUwxAdlQGz898nMxI55dHupbOM4dp3Ppf9Leaa3pC85cRtfRJvINdv2eUO5y71Mbv3i0YKFE0NTuW//FgnmyFIcQINtx1UN8H/hH4KbAXsAALgL9TSnVrrX/jvCZ6lj6blY0lW/iwZAtWez/BvoE8nvcAy8cvwMsNvRRrSy2NW/+LrtIjAPjFpROz8tsEpI7KXVD+THdvP+u3ajbuLsNuN4gM9ef5NZNZNDV5TCSBCDGaDbcH9T3gf2it1w86tk8pdR5z8e6YCFAFNcW8cvRtajrqAVicMYen8tcRHhDm8rYY/VZaDm6kZd975gaCfoFE3fEYYTNXYXHD4l93OFh0iRc/OElDSzcWR4miJ1flECwlioQYFYYboGKBw9c4fhRIuX3N8UxNXS28emIDB6uOAZASlsjzM75Bbly2W9rTVV5A45aXsTY5NhCctJDo5U+PmQ0E65q6ePGDkxwqrgEgKyWcv3goXyqOCzHKDDdAFQEPAz8bcvxR4PRtbZEHsdltfFb6Be8UfUxPfy/+3n48NOle7lXL8XFDL6W/rdHcQLBkP+DYQHDltwnMmOLytriDtd/Oxt1lrN+q6bPaCArw4alVOayanyklioQYhYYboH4EfKKUmgcccBybB6wE1jmjYe6mG8p4+ch6zrdeBGBWcj7PTHuY2GDXVx4wbP20HvmU5t1/wujrubKB4NzVWNyw0647FJU18Lv3CqmqNdc0LZ6azHNrJhMVJhsICjFaDTfNfKtSajnwl8BTQDdQAszSWhc4sX0u197bwR8LP2RHubnNeWxwNN+a/igzktzTS+k+f4qGLS9hrTcrTQVNmE30imfxDR8b66FbO3r5702n2H7YvP/EmGC+uy6PaWps3L8QY9mw08y11ruB3U5si1vZDTtfVBzkjwXv097XibeXN2sm3sUDOavwd0OJov72Jpq2v07HqT0A+ETEEbPieYKyZ7i8Le5gsxtsPXiONz4rkTVNQoxRXxmglFJBmBUkHgJ6gQ+Av9Nat7mobS5T3V7Lf375OrqxHIDJcYrnZjxGcliCy9tyzeG8eQ8QPm/NmNhAEOD0uSb+8/1Cyi+2ArKmSYix6no9qJ8Aq4F/AWzA/wVEYyZGjCqvHd+AbiwnPCCMp6c+yIK0WW5ZQ9N9voiGLS9fGc7LnmUO50WMjRI9ze09vLqpmB1HzPuPiQjk+TWTmT8lUdY0CTEGXS9APQQ8rrXeCaCU2gXsdmxQaHVJ61xkzcS7yY2dwJ3jFxLsF+Ty6/e3N9G4/TU6T+0FwCcinpgVz42d4TybnU/2VfDHLafp6unHx9uLdUuzeHhZNgH+wx6FFkKMMtf715/C1SnkhzF30o0HLjizUa6WG5ftljVNhq2f1sOf0rxn0HDe/HXmcJ4b5r3c4eTZBl78oHCg4vjMnHheWDuZpBgZzhNirLtegPLGHNoDQGttKKV6MbfYuO2UUt8CXsSc77rse4ML1Y4mXWeP0rjtVayN5mLboAmzib7rWXwjxkZ2WkNLN//98Sl2nzDT+BOig3hh7RRm57p+3k8I4Zk8afxkOvArrfXfubshztRXX0XjttfoLj8OgE9kgjmclzXdzS1zjV6rjQ+/OMu7O0rp6bPh5+PFw3dOYN2SLMnOE0Jc5esC1DNKqY4hr39SKdUw+EVa69/dhrbMYBTX9LN1tdO850+0Hd0Chh0v/yAiFj1M+MxVY2KxrWEY7Dp+kdc+KaahpRuAeVMSee7+ycRHuX7eTwjh+a4XoCqB7w45VgM8O+SYAdxSgFJKeQN5wFNKqV8DXcDLwP/RWhu38tnuZtj6aTu6meY972Dv6QSLF6HTVxC1+LExsxXG6XNNvLyxCF3ZDMC4pHCeWzOJvKxYN7dMCOHJvjJAaa0zXNiOWOAI8Bpm6aQcYCPQxi0GP3cxDIPusmNXzTMFZkwh+q5n8YtLd3PrXKOuqYvXPikemGeKDPXnqVU5LJuVJrXzhBBfyyPmoLTWNcAdgw6dUEr9FniQERigei+V0bTzTborCgHwjUokavnTBGXPHBPreTq7rby3s5SNu8ro67fj5+PF2iVZPLg0i6CA0T+cKYS4PTwiQCmlJgGPaK1/POiwH9DjpibdFGvTJZp2raez2KzjN9bmmfqsNj7ZV8GG7Wdo7zKXyi2elszT9+YSFynzTEKIG+MRAQpoAf6XUuoC8AowDfgrzOoVHq+/o4WWvRtoO/452G1YvH0Jm7WKiPnr8A4MdXfznM5mN9h5pJI/btEDCRCTx0fz9L25TEwfG3tUCSFuP48IUFrri0qp+zHLKv0r0AD8k9b6Xfe27Prsvd20HNxI65cfY1h7wOJFSN4yohY/gk/46E8AMAyDL0/V8PqnJQPbYGQkhvH0vbnMmBg3JoYzhRDO4xEBCkBrvQOY6e52DIfd2kvbsS207P8Ae5dZOzcoeyZRS57ALy7Nza1zjZNnG3j902JOnzcz8+Kjgnhy5UQWT0vBSxIghBC3gccEqJHAbu2l/fjntOz/AFtnCwD+KYroZU8RkJrj5ta5RlFZA29t0ZwsM5fChYf48eidipXzMvD18XJz64QQo4kEqGGw9/fRfnwbLfvfx9Zh9hj8EsYTtfhRArOmj4mhrKKyBtZv1RSeNQNTcIAPa+7IYs3icZKZJ4RwCglQ12G39tJesMMMTO1NAPjFZxK5+NExkzJ+qryRt7ac/rPAtHrROEICJTAJIZxHAtQ12Hs6aTu2hdZDnwwM5fnFZRC5+BGCJsxVx1NbAAAMz0lEQVQe9YHJMAyOnq7j3R2lnCpvBByBafF4Vi8eL4FJCOESEqAG6e9ooe3wJ7Qe3YzR2wWYPaaIhQ8SrOZgsYzuORabzc6egmre21HKuUtm8kdwgA/3Lx7P/RKYhBAuJgEK6O9opmXvu7QX7MDo7wMgIH0SEfPXEZiZP+p7TL1WG9sOVfLBF2epbTIDc1SYP2sWZ7FyXrrMMQkh3EICFNDw6e/pKj0CQNCEWUTMX0dA8gQ3t8r5Glu7+ezAOTYfOEdrhxmYk2ODeWBJNstmpuDrI9tfCCHcRwIUEDr1TnwjEwiduhy/2NG/julMZTMf7S5nb8FFbHazWHxWagQPLctm7uREKeQqhPAIEqCA4AmzCJ4wy93NcKp+m519BdV8vKd8YNsLLwssyEti9aJx5GZGjfqhTCHEyCIBapSraexk65fn2Xaokub2XgBCAn25e2469yzIlCKuQgiPJQFqFLL22zl0qobNB89x4kz9wPHU+FBWLxrH0ukpBPjLoxdCeDb5LTWKVNW2s/1wJdsPV9HSYfaW/Hy8WDg1mRVz0mUYTwgxokiAGuFa2nvZfeICO49e4GxVy8Dx9IRQ7p6bwdIZKYQE+bmxhUIIcXMkQI1APX39HDpVw86jFzim67A7MvGCAnxYkJfEirnpqLRI6S0JIUY0CVAjRE9fP8dO17GvsJrDxTV099oA8PayMCs3nqUzUpk9KQF/X1m7JIQYHSRAebDu3n6OlNSyr7CaIyW19PbZBs5NSItg6YxUFk1NJjzE342tFEII55AA5WEaW7s5UlLH4eIajp+pp896dVBakJfE/LwkEqKD3dhKIYRwPglQbma3G5y90MKRkloOF9dw9kLrVedzMqKYn5fE/CmJxEXJmiUhxNghAcoNGlu7KSitp6C0geO6bmABLYCfrzf52THMyk1gdm480eGBbmypEEK4jwQoF+jstlJU1sCJ0noKSuupqu246nxMRCCzcuOZnZvAlKwYSXQQQggkQDlFY2s3xRVNFFc0UlzRxLnqVhyZ4AAE+HkzeXwMUyfEMjU7lrSEUEkJF0KIISRA3SKb3eBCbTsl564EpMt7Kl3m7WUhJz2SqRNiyc+OZUJaJL4+o3vzQyGEuFUSoG6A3W5Q3dDB2aoWSi+0cLaqhbKLrVelfwME+vuQkxFFbmYUOZlRTEiNlNp3Qghxg+S35lfotdqoqmnn3KU2zte0UXahlbMXWuju7f+z18ZFBaHSIsnNjCI3M5r0xDDZU0kIIW6RBCjMKg3HdR3nLrVz/lIb5y61camh46p5o8uiwwPISokgOzWCrNQIslIiZKGsEEI4gQQo4Fd/PMrBopqrjnl5WUiJDSY9MYyMxDAyE8PISo2QtG8hhHARCVDAgvxkDAOSYkPISAwlPSGM1PhQ/CTdWwgh3EYCFLBkegpLpqe4uxlCCCEGkVxnIYQQHkkClBBCCI/kMUN8Sql84PdAHlAOfEtrfdi9rRJCCOEuHtGDUkr5ARuBPwERwE+BrUqpMLc2TAghhNt4RIAClgC+Wut/01pbtdZvA6eAR93bLCGEEO7iKQEqFygZcuw0MMUNbRFCCOEBPGUOKgToGnKsCxjODn3eADU1NV/3OiGEEB5m0O/uP1t46ikBqhMYWqIhCOi4xmuHSgR44oknbnebhBBCuE4iUDb4gKcEqGLgb4Ycmwi8Poz3HgYWAZcA29e8VgghhGfxxgxOf5a1bTGMa1REdTFHFl8Z8Gvg34EHgT8A47XW9e5smxBCCPfwiCQJrXUfsAozMDUBPwTWSnASQoixyyN6UEIIIcRQHtGDEkIIIYaSACWEEMIjSYASQgjhkSRACSGE8EgSoIQQQngkCVBCCCE8kqdUknAKpdRsYJPWOs7xcyzwG+BuoBf4L+DHWmub4/zrwCNA/6CPydNalyul0oBXgLlAHfCXWutPXXYzgyil7gJ+DmQ72vILrfWLjgXP/w48hFlV49da658Net8jwP+HuWp7F/CM1rrOcc4j7u8W7m1EP7tB5wOAL4Cfa60/HHTc45+doy03e38j+vkppeIwf7csByzAZ8D/1Fo3O97n8c/vFu7Nac9uVPaglFIWpdTzwFbAb9Cp14A4IAeYDMwG/t9B56djLhAOGfRfuePc20AhEA28ALytlBrn5Fv5M0qpVOA94J8x9876BvAzpdTdwE8ABYwHZgFPK6W+6XhfLub/KM847qEU854uc/v93ey9OYz0Z4dSKg/zl/ecIe/z+GcHN39/DiP9+b2M+Qs6E/MXfCTwH473efzzu9l7c3DasxutPaifAPdi/mX/A4BSKghYCeQP+ubyj8DHSql/AAIw6/+dGPphSqkJwEzgLkfVix1KqY+A5zCrXrhSBvCW1voDx8+HlVJfAAuApzG/mTUDzUqpXwLfwaxp+CTwsdZ6L4BS6geO12RjfivyhPvL4CbuTSkVyAh/dkqpCmA7V75lDzYSnh3c5P2NhucH2IGfaK07He1+CbPHDyPj+WVwE/fm7Gc3WgPU77XWP1JKLRl07HJvsXPQMRsQi/mNYSLmt4SXlFJzgSrgR1rrTZj7VVVefkAOpzF7YC6ltd4D7Ln8s1IqCrNY7huY//CLB7188J5aucCRQZ/TpZSqcpy34wH3dwv3NpWR/+yqgXFa63al1P8c8laPf3aOdt3s/Y3456e1/tGQl68Fjjv+7PHP7xbuzanPblQGKK119TWOdSiltgL/opT6NuY3l8t/8YFAKOYD+glQANwPvKOUmset7VflNEqpcOAj4EvgqOPw4HYObuPX3YNH3d8N3ttIf3Ybtdb267x8RD07uOH7G/HPb8i572P+Ep/vODSint8N3ptTn92oDFDX8RTmZF8JUI9ZPX010KK13oo5Z3XZe0qpZzH/wou4+f2qnMLRfd6I2at4givtG9zOwW283p5bluucc7kbvbeR/uy+5pc3jKBnBzd+f6Pl+SmlfIHfYv5OWaa1Pu14y4h5fjd6b85+dqMySeI6EoHvaK3jtdaTgYtAiaPLvVop9fSQ1/sBPZgPK80x3nrZRK4ecnIZpdRizG83HwIPaa17HHMzNZiJBJcNbmPx4HOOObk0x3GPub+bubeR/uyG8bYR8ewcbbvh+xsNz08pFQp8jpnAM1trPXhOZkQ8v5u5N2c/u7HWg/o1UOTopqYB/4crE5newG+UUiWYQ0qPYnZjn9daVyqlCoCfOiY45wNrgHmuvgGl1HhgE/BDrfVvh5x+A/ixUqoQs3v9fcweI8BbwF7HvNwB4GfAca31Gcfnuv3+buHeRsOzux6Pf3aOdtzs/Y2G5/c25hf+RVrrocNaHv/8buHenPrsxlqAegF4CXPPqRbgt1rr3wForT9USv0QWA8kYE7m3ae1rnS89/IminVAA/Cc1rrIxe0H+B7muO/PlFI/G3T8PzDn1H4FnML8H+oPwO8BtNYnlVLfcvycjPlN6eFB7/eE+7vZexvxz05r/bdf9aYR8uzg5u9vpD+/z4F7MNdW1ik10Flq0VqnjJDnd7P35tRnJ/tBCSGE8EhjbQ5KCCHECCEBSgghhEeSACWEEMIjSYASQgjhkSRACSGE8EgSoIQQQngkCVBCuIBS6m2lVL2jCOfQcz9USnUopTLc0DQhPJYEKCFc468xF8YPXgSJUioTc+uBH2qtz7mhXUJ4LAlQQriA1roG+AHwvFJq8IZ9v8XcS+dGSgMJMSZIJQkhXEQpZQH2YRbTnIVjawJgmtb6cuHbZ4G/xyyJU4LZs9rsOOcD/BPwOJAENGKWmPm+1tqmlHoTc3+hHMydh9dprb9w2Q0KcZtJD0oIF9FaG8C3gTzgWeCXwD8PCk73YhY0/qHjNa8AHyilLm/w9gPMrbifwtx6+wfAXwH3DbrMk5hFdJcDB518S0I41VgrFiuEW2mti5RSvwZexOwh/XzQ6b8Hfq61fsfx81ml1Ezg/wYeA05ibnu/23H+v5VS/xtz59LLG8sVa63fdPZ9COEKEqCEcL2fAH8L/JPW2jroeC4wQyn1j4OO+eLYP8dROXq5UuoXwATMXlYG5pYHl5U5s+FCuJIM8QnhYlrrbscfu4ec8gH+H2DqoP8mYe6hg1Lqn4ENmP9uNwArMHctHWzoZwoxYkkPSgjPcRpI11qfvXzA0ZvqAX4B/AXw11rr1x3nAjE33rS4oa1COJ0EKCE8x78AryulNLADuAv4Meb8E5gbbd6nlNoPhGMOFYYB/m5oqxBOJ0N8QngIrfUG4G+A/4057/Q3wHe01u86XvJNzOy9k8D7wFngVWCGyxsrhAvIOighhBAeSXpQQgghPJIEKCGEEB5JApQQQgiPJAFKCCGER5IAJYQQwiNJgBJCCOGRJEAJIYTwSBKghBBCeKT/H/mXiUZdyMzOAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -640,7 +595,22 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates3.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates3.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -653,7 +623,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -663,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -750,13 +720,13 @@ "2020 2020 7.643402e+09 NaN 7.758157e+09" ] }, - "execution_count": 18, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "table3 = pd.read_csv('data/World_population_estimates3.csv')\n", + "table3 = pd.read_csv('World_population_estimates3.csv')\n", "table3.index = table3.Year\n", "table3.head()" ] @@ -777,7 +747,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -802,72 +772,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
values
t_01950.000000
t_end2100.000000
p_02.557629
alpha0.025000
beta-0.001800
\n", - "
" - ], - "text/plain": [ - "t_0 1950.000000\n", - "t_end 2100.000000\n", - "p_0 2.557629\n", - "alpha 0.025000\n", - "beta -0.001800\n", - "dtype: float64" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "system = System(t_0=t_0, \n", " t_end=2100,\n", @@ -878,7 +785,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -890,7 +797,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -932,12 +839,12 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -981,7 +888,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -995,12 +902,12 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1025,20 +932,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.043001508" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solution\n", "\n", @@ -1049,67 +945,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
values
t_01960
t_end2100
p_03.043
alpha_func<function alpha_func at 0x7ff92564ac80>
\n", - "
" - ], - "text/plain": [ - "t_0 1960\n", - "t_end 2100\n", - "p_0 3.043\n", - "alpha_func \n", - "dtype: object" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solution\n", "\n", @@ -1121,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -1140,7 +978,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -1149,7 +987,7 @@ "3.1102518413268" ] }, - "execution_count": 28, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1162,7 +1000,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -1173,12 +1011,12 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 33, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] From 2035172e09dba52f5c4a7e8f3663b5c9bc69d6bf Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Jun 2020 09:51:53 -0400 Subject: [PATCH 004/144] Run on Colab --- soln/chap08soln.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/soln/chap08soln.ipynb b/soln/chap08soln.ipynb index f32e3d1e..4ce822af 100644 --- a/soln/chap08soln.ipynb +++ b/soln/chap08soln.ipynb @@ -27,7 +27,8 @@ "\n", "if IN_COLAB:\n", " !pip install pint\n", - " !pip install modsimpy" + " !pip install modsimpy\n", + " !mkdir figs" ] }, { From 34ee4334ff3b3cf85f06d6450efd38fb6142c414 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Jun 2020 11:01:40 -0400 Subject: [PATCH 005/144] Run on Colab --- soln/jump2_soln.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soln/jump2_soln.ipynb b/soln/jump2_soln.ipynb index 5fa97f6e..fadfae6d 100644 --- a/soln/jump2_soln.ipynb +++ b/soln/jump2_soln.ipynb @@ -26,7 +26,9 @@ "IN_COLAB = 'google.colab' in sys.modules\n", "\n", "if IN_COLAB:\n", - " !pip install modsimpy" + " !pip install pint==0.9\n", + " !pip install modsimpy\n", + " !mkdir figs" ] }, { From c36a476a20042acb33773e47d12aea5b0c413e60 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Jun 2020 15:47:02 -0400 Subject: [PATCH 006/144] Run on Colab --- soln/chap09soln.ipynb | 139 +++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 70 deletions(-) diff --git a/soln/chap09soln.ipynb b/soln/chap09soln.ipynb index 9f679158..aa6929e0 100644 --- a/soln/chap09soln.ipynb +++ b/soln/chap09soln.ipynb @@ -19,9 +19,6 @@ "metadata": {}, "outputs": [], "source": [ - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", "# import everything from SymPy.\n", "from sympy import *\n", "\n", @@ -76,7 +73,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAhElEQVQYGV2QgRGAIAwDWydwBmbBDXQFl9QZ2ABXwUSNUrnL0fZpA1hrzXqZWYUSa38wA6B+NwxI+jUhKSr8YQbYBR0BCwuUnpjwgOrriST40bcfG/xwOMDgR3iNxTYyhLKewV2QXci/D2GDPIOfu/NySZBjeX0DYMzvKxrLN27QSmn8CWOLY8q7tsXYAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAnElEQVQYGV2QCxHCMBAFGxSgIRqQQB3UAzIaG2ABCcUBQyWgAQdhNyRAmpnX++xd7tKQcx7aSSnt8R9oxH/uGqj2iI0C4y0cya0CzxbaeSuET5jn2cQJOa/BF/59cCFF0YRwP7H2/9puHp0dbFeaL6d01vdFMkvN/yDewYii76Y2tJndPMBEbWzQZ5S/YocAuwZXxnHeGV2R8UX7Bq+TPY8f0jS0AAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle t$" ], @@ -90,7 +87,8 @@ } ], "source": [ - "t = symbols('t')" + "t = symbols('t')\n", + "t" ] }, { @@ -107,7 +105,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACoAAAAQCAYAAABgIu2QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABVElEQVRIDdWVi23CMBCGMcoAVUZghKoj0A1asQGM0BnaDVBX6AbQDaAbwApkg/T7I1+UWA5JEcXhpJNzr9yfeziuLMvJPdA0BOmcO8CzUH9Lmfwv8Al+sLyZPeiUA8eMKh+b+qHPjfiPoTHm50F9Iiu3ClWDlE8LKPIz/CPDrYniFOR8VV5ALzlUtJrC1s+xbGvriB4y0AucvkTlFj+iW3Me+Mo/t5C4f6EMMKrgFnAq9RxZ7R8dNVufbD6HVKW5TBqBryFBVP8dP/mHpE3NsS9CA/KRblXLErH1qiqgvFgJNJ+b3ggcSPgW8/Pjo+vt6rNtrX9SYhLUG+/Bx/Ak0RnQ1nxaZZIg6khqQNX66m9kY0B1k1z8HqfwtMiWScuxBqT+CBqBq89YK2uHQH7d3zlsi/qNboe8r4ACTNVMfn+CYwWOKDmMUcMlSj826khxSfy5mF82g1Zg3k0dlwAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACoAAAAQCAYAAABgIu2QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABRklEQVRIDdWV4Q0BQRCFEQWIDihBlEAHRAd0wN/7SweiBDpABUIJShAdnO8ds1mXFVxwZ5LJzs7M7ry83dktx3Fc+gep+iCjKKox36Nd7KMf+6VN7R71FmgD+6zad0CZd9BmVpC3Alo/0+bvCGtEksCd0DqquZM00C6Rg4v+0AComOurJPaYQaw6qTjraojRTcpXiGkV9AI3QkV1E23hWzLuGN8+QtZ9RQRUDG4YRXWHUcdfOPGPPrf7+QorfjPpCqxeWQTrU/KUnxZdnzrxQTrA/Ig/aZZA7KkrAcoGdj/XT1eQQP4klIdf1yfT8xTaz/fZ0bflpJDreGyBL4wY0Lv7acwUBiVADKjYS77MG5M6vlwe/kfkWDOpOeaAGyqRMZf3k7pzyuv7tEbd4hOBa2smTXJ/PwGljycoxmgwmMGpZhQjH5cLLsJavFyXYl4AAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle t + 1$" ], @@ -121,7 +119,8 @@ } ], "source": [ - "expr = t + 1" + "expr = t + 1\n", + "expr" ] }, { @@ -165,7 +164,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA0ElEQVQoFW2RARHCMAxFVw4BQwJIQEMlDAvMAWiYhHnAAUjgcDAN4KD816Yju5G7vyQ//5ImCymlBgshHOT6nJTPUW5U/ZZTEyKCbCqUdwJdzlljwouRXRUaj3Ai3ijAXsLHQO4NXr3dOB+rtB7tBcSyVpiEodYWHVVgqcFEo3z7V1hJ68qCbyGSByOVr023RYjt89Yc2w5e6N/3qZD3xq1xPJy/s9OEcg4rzM5GM+JO7CGOBpyhrR2vSham7tyRK/RMmZdRIYo8OXU+lUQPuC82XK6BdbIUdQAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA3UlEQVQoFXWR0RGCQAxEwbEALUFKsAZKkBagBH/5cygBW5ASKAHpAFvQDvBtuDDHjGYmbLLZy11COs9zIqvrOgMqS5bPGWjhO6WphEF0BVch8YX6A6+I7zupMZFlKBpBbJ1IriJcOBJ/gotPEB4sWPhkH8gePIaCQx6CVmhv9Ipj6PYk74jtausYCXxyvVm33Lz2s6OKdGqAEi+I+7/CIH4LsZNNzYlMvnCb70Cm6XNfz0QyIfaVbNRKfBjtcEAojM1vGV1oK4gVHNLkEurXvtZhSLTgIhJL1MBrTckXilpU0lDNGcIAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle 3$" ], @@ -206,7 +205,8 @@ } ], "source": [ - "f = Function('f')" + "f = Function('f')\n", + "f" ] }, { @@ -250,7 +250,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACEklEQVRIDaWWjVECMRCFD8YCGEugBNQOsAOwBOwAxxK0A2qwBOjAwQ6gBKQDfF9MbvKzCee4M0suu29fNrvJHd3lcun+o13XTaWrIRzCLcDH2OriAk6kG+naj0kgJBIw25jw2rPwH9Keq5UAwDcpWbPaIieXbS/tyQz/IfdrTtL7gDUT8CAWnfvneQgIo+wr6SbM81E+l3huZy5hY2v3XAFUgwNeBMXugs8R/7av32nmowrf2MZ6sORBxqPlwDYajTh4VK+KkZvq7cDlorizbEfxzG9ipwyU9U76JD1pziFkoWfGSKhQQQ6h7EspCaIzz3EQx7vmsRC/rJ0BGuV6pMACI99WWr168g1pIZvdFy1Qxq68chY7lC0ImFOYGOOjbF+GPTYRPykSkHEGSjtvEdwKQh9rUu1/FMD5mVoJNA9gRGA+qoKccCpEm66KlQAVaO0eUle+Cvs9dlWwb6FPKodTxaOVAASfOTqbUz4ILEn6r8U5kFQkF2znJAGfKSW8VgH8XFdLiHfvh9COynkifpdcMRk4PMKXVy+2eRx3O4lnLmFn7ppqbF1VviOzhEAG3tGDvm7CNV/FVnLBpliq5DYwpkdSvnwIFQjPztD4IdmXhr/lepXTvWUBsRNKRlbmxyNkno8+rvo5zvHM83Uw8Eqs/umwSILNkw1qWRTDZvukkzMQQH8ZIZNWD1vMBS5eHN8PTnR/TuT0iscAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACPElEQVRIDaWW0VEbMRCGDUMBnpRw6YBAB6YDSAfgDsKj/cZAB5AKMqQDTAVAOsDpgKED833H6aKTJdmQnVmvdrW7+rWrkzxarVaj/+HZbNbAZ9vk0E//2HdHJUfz+XyM/RJ+hr86xrZE9oTeoFwjj3rjhgG+t7ich1x7Ff+fzLmgLJC7bozoyWQnvRYNWMANPMFHYbFu+hR5D39T3/UnpS74GLuLLmCT/I790M/QH5PkscsEpUnn0V+xL5A/dC5VwOARTi4uBfmuvf+eI2qld+5PHBCNLxj/ha+yFWDiEB70G70ngNl7ARZ9mHYTOeDGWYUlcjKoAAbLKnKDX9DtsXKKjMn2rCXHzzh97b8g97scD8gr9JiMP0kB3GC8wdlP4yITFBIIUnADwt+k9leAE2StRX5d07UWENSW10RwifR5KU1ir/U/hBk/XgOAcV8PgJQOkNNfYPtYIltR24Bxnp8mB6B6AI2sEcBD//2EN1IOgBWo7d6kbfkK2Q+0A6SvQAcqdbeKyxwAEzyk3olu+UyQo0H/WdwD2WQctb0OAHRILeGmCjjfXqWZxMa390OXz9swl8/4xQAAhrZ8yEe4RvbXg5Yj340xi3qnfEem33+Ica1fg6eYp/ISvoufy9IYv+f0aS35pnbjjNe+C8JjOFwq7iqMA9KSdKe+B58hb8trA3dEgrRnPqtPgPHt34rwtRVTZNvzbYLw9YzcI/vnOLz1ytrVmcvf7yQ3WbBZ4X//IdL+fFTv+vnpv2RvdG+7fm50SvMAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle f{\\left(t \\right)}$" ], @@ -281,7 +281,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAArCAYAAADczxCmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEVUlEQVRoBdWZi1EcMQxA75grgEkJlEBCB6QDSDogHcCkgkzSAaGDJB1ABwl0AB0E6IC8t9jLfuz9kGNv0YzPu7IkS5Ysy7eLh4eHxdC2WCx2aee0O9rpUL5N0S2deCwsl0uZDuH9NZZ3SvqtsZNh2H7guRjLOzX9aONQ8D3tBq/dT63s2PmeY5yem73XXIhV12oQgjuMn9D00l+aRplUvtDmD7lMhuZ6yKy4E2l4NlOaTLYjbs59Mizx2DYG/KSdoPwNfQSfr8DNfr+pcNI48F9pGviDVoVXs99UOmfcB8Yuqh4K3nQPGpqvAlrGBSP02lXDAr1mNfMqMqW6towTGeB3fAj9R/rCYBbggKYXZw0t40Io6p1SeQw54t0jICaXPeji82wNTNaWITTP0Dp6T2PNkCYacWbMFw/PEB37zPWdOTsB2gMI1Otp0XkZfCtYBy0KuJ9PacehL8/RqvxAd17F9T3D4/FVypvUMJULChgBrrSIg5TS4C9ppaJNGsaum+O8u3CXkXZS48LkGmTmVRFDrqUDePd49r7IWLEwGV4X7tixluAUw7pwXUpV54Cu5ZXGuGFdeqgx5qLdiWtlSwZeEvYQ/rThEzOFJOKid9FlKyX47p0DOfurhPy1o5jIMHtLs/K55d2V14BP9g0w5FqZWGXBH9I8omy7Qc41cr7xXgX5D6cOS/dbsR9QKDk345Z3Rx3j2f0WeeSnXU4Wlqyyqy20vPKILn+luy3f2g/+E9AsDZtU8m9PZhyTWeHorT7F3kDmvslBdr9VGNyvOytW1FBZC6D4skNQbzLp4C2G0NVMqGcH3UxWPQr1zTdmXM/1eU15RUhlBL8Tj85laGsw701P6/2bKcNSxWKtqo45MKRULgW1/YZhJhc92QRx95MYF8LJkBriOWk8NlKgjOL8iyGK11Iy5b9IpmMY1opnIpMAYvvlBlrPrpYOjOmR4qig7zourEt3WwJSQv8Xx0TWe4MrfGg7y68ufeDVu8XidIYlrrcKOKfd0YqqAsZBAL23da8ggp6LzwWi58fF8P/S58BnmB517VqFOAaxx0XragIuu8JhzBByJZNFbpSf6uGRN3vlyfDU5uoNSyYo9gt97Y9Y3jvLIMYtgTovpCkFI875aINDWT7paeWCDDHOEGltcHC6frRHovJDehWlZRNHVYZ00ldxyf9QICqBfWPm+QNTrYIHb0j+Av/cvVHO8VIPq6pgFHalsh8+GDdEh147qqI38xzdyOwqPujDB3Sd+y3K3HRfHAV4xM1rqh764aNWBsE3S4jnnElDA4d++NDLZfE6S8tUytABDMda2uVdYx2s/UOVw286BFPzb4WQ1JBmAap3NL7pIav7Gj7IED0riGGpUs3rSO7DR22/YVju2rFxQ7fwzD1a6B2PgQJQ2APRy2X8e6364UMvD7l2FLI2+VMc4iGszlAkek9jNdpEI6788AGti2B1YnY1PHs/Uki3CfgH0U26dfMPWagAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAArCAYAAADczxCmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRoBdWZ7VEXMRCH/zAWoNIBdoDaAXQAWoHQgX6Eb452AFSA2oFYAWIHYgU6dIDPc5Pc5N5yOYXj2Jmd3CWbZH/ZlyR3azc3N6tSOjo62kL2A/wC/sT7QWnf+5BbmwIuKggoV2SP8kusW2K5PlUpAG2HPudT+84tPxkcCu7AV4C8nlvZqfP9Czgtt3iruRCPcquBdTZpfwdrpd+woEwq7+HF0yC4EFufQfCc5yuRUH4NiB6E5XrdEhCPASGwdxFYACXIH9QtPt7Utxcc9e5lAvwEp/Rg4k2lh8C9ou08tVCwpjEYXdP+i6YOuABCq/1oaa7VVrQ/iHhT1w44KwNdxIdQetSqAANwF9aKi6YOOJQ2WQiiVp66/fBeZU2eX1IXn3ldJvWeLVFctzyFtd4GfAYL2kRjnRnzzt2TOVzgbcoTyiwhowHME/Wi94LLjvKfjUzuwrlIP+FnPqcK8V4RdQI7pvS4V0TINravwU28aLR/E9IjXF1ZkGbferV5jqSie/ElLQHhAl3COzynfd9Q9w1+DmcTiu23SkGpXQYVkG6tcp1rE3W62PeW4lTVZObebLfzbujomm+VnNty7e1kKG49z+bc0bb2ViUeyXPvL/jjum8z0kvmSt2oMzWrbqytKHNyLlLvwtBP63kl257Fckykm7naKvWHd+PJsu8zhW7bURxZ+ypvvLkAW2GcC8qPvKdk/725wJnKT1DCzxPve5RJFXMRBN8g+qiw8SR4t4ec25qJD2ZzS5Sp3E0F4Rwp9ycjkIu32M3+j2cDx2RecleAHEoENktPYeNmiHTPsQUyXjcfMVn5t72h6UI9Y61lREaTSaZv1cT4Md7cSkZJcDmFRgeYIKDlxqzmcJVLDYzr99IVOteWEzDctrTWv5rTLVXsQuVGSJdSuT5qxBugTC7GaJusu54FnKvLZHKJ5ZSpjk+UbXKMav8LY3pK6RvT/uezgGOiyp0ov8NjZDyZNPrIs6hu6L75irK9v8U+zne28nP6XfPh4eEH+GvpPMj+hDdL5VM5+9nfuuwmzsqYBFwtV2LSjw/6Gg+vKT3Za4ljuJSc0/Nl3wlmbAz7VHMV3edQsPPjgzr9v+/aUU1Ou6cE40Nwl7x7dysm5HXPA8oqxko6IqtO3yjLrjwIRv+v02+YyPrOtSNRIt7VLHNHpaRL47G2QKM2/9K8A6b+2veM/xovlQ+n7dQdw5dp3W0/M77xs18yrnLKp7LZmAuLpIXaVrPJ+s5F04bbouCSo99PnA/ZjlwDHAJufoM/PmgXUOm1wznvleqEEhTXZ9s/PgT0hPbrqCnPZsLPlHMd3eLUk8pqE0dJs4zASn98NI5Bk2acUTieUMxoAiz98aE1++JwRtXHp4rgin98BCsbm0XXjnEV7k5iPSir1doHUK2zor1tIU8rjfowhtWLomg5lWpfR8yKFWCUT398NOLNNuS05OJIy5kFBVErSJ2nbt/j0Sf98aGVS64diN0vVVsBYFT4FNZ6G/AZLGgTjXX1jw9kBe3B1Oy64r2zeVq/BPoLCcnP8gO03jYAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)}$" ], @@ -297,7 +297,8 @@ } ], "source": [ - "dfdt = diff(f(t), t)" + "dfdt = diff(f(t), t)\n", + "dfdt" ] }, { @@ -334,7 +335,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAJCAYAAADpeqZqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAv0lEQVQYGXWQAQ3CQAxF707BJTgYDggSwAEakIAFMhwMC+BgOCDBAThYmIPt/UtLLiRr0v32t//aLk7TFGqLMbbkg3Fr8EbPo+4JEpmwofDGdxWXyb94Yz3KD7VIgtYFjnA93pnoRJwTn8BKHaBJZ+V/9iHfGrdCPPpqWqH312uE142qC7NqiSnaU/7Cl0z1Z5lCkDwg1k1LNtJ392K5ieSK7510ZIujxZqk2zcFtaMR2ln2m0hNj/mPGgkHuMsMhpRwj4BD4poAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAJCAYAAADpeqZqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAxElEQVQYGXWQ2w2CQBREhViAiR1gB2gLdmAsQUvwd/+MdqAtSAfSgY8OwApI7GA9s+4lG6KTDHOfc4HMez9K4Zw7kHexNkMv1Op0JrMlGgWNK9zaEDohf8E5cRtnypyC4UFQ2YKKxG/kDnfKwQrWYYnmiUSuezhES2ERi1MZ2aU1xTo6D5d0raCnbw2mOYkuiE/4D+rfzFRLchKar/x+MldZZxyDM7qE0h4Mbkh0JYC8JGjTX653FvqLDAUTVD9Kb9QRHz9smkzvIogUTAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle \\alpha$" ], @@ -348,7 +349,8 @@ } ], "source": [ - "alpha = symbols('alpha')" + "alpha = symbols('alpha')\n", + "alpha" ] }, { @@ -365,7 +367,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)}$" ], @@ -381,7 +383,8 @@ } ], "source": [ - "eq1 = Eq(dfdt, alpha*f(t))" + "eq1 = Eq(dfdt, alpha*f(t))\n", + "eq1" ] }, { @@ -398,7 +401,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHIAAAAYCAYAAAAmsqlBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFAElEQVRoBe2Zi3EUORBAWRcBuEwGkAEcGUAG5jI4OwNcjoAyGfguAjAZQAYcZIAz4JOB7z2hHkY70szs2l7b3HaVVpruVqvVP2lmFxcXF/e2cDctsFgsPqH5X/jw82LryDvrxF00/47/Fu5g525uY6s1FnhGOw9LbDMyLHFLesrlCap8pT1QJTLuyD4A+kPG4nTkD9q/tFMZL9UQouCDOXLg25d/Du//kQfbfKE9i70zPqO99Bk4CXx+9nzcD1zTiTBZg09pL3M/cEDmeR/C5vTMUbmBrDlzN8WT9+W+32d9tYN6p4ClN3gLw15WN+S5RmFLng9oOszs6xzsWoA/nR3HHKniprlZ5KTO+6E0OBfphAU+emhGWEHn2QD5FDy3rUc3HfidNqgy4LSFBq/SL7OXLLOwMTgd6Fqnfdk8PxZf4PoPMYZJY+s8BTkuokE+wGgpFoj5mZ4CoI+LMfMMkFQyAnfTPfq4TzPQ4Ntt6QNNRxbZ0OJdBV+TCU6HuVahD88G25nypdEeVjMSQtMJoRw8g2wLWl7ADVczD7yLFxHVn3sTY3VVJ3UbWx96ypIxnnVoef0uYdSDZsAj7qfDQi44bVucnfdB1OApyO5qu8yQb06u0ORhjht+tzzXZ+b9QMY5TcU/1Hg2iUMPDWP0v1C3ibW/QX87wbMO+QWTjsK2jA0on3dpOvQjLeypvsfgzcw3tHvF6wcEy+UT2p80FU5GRuAh4w6ygEcVvM5TIS8Djp2vs7/A+5q+g6ycyhayO4YNDdBDXa0u5+jyaGpZ+M2UPXjHgnggJs87hvA1E13LC9NKcgaCA4GgQXmFZi43zzBoniWDy0DIgjanNKcbWcyZ6pFpVFr+VmnNMzzWy3JH9xu8rR4ZZnNx4+zzQjOoi6OI5yu9+d5HYAE5QsWNlTyVMGNb8BzC5xYx451vdM8CDFO8GM+aNI/JoBPG9vuTY+kXW+nAqCjaZAA5E30D8Jtoyr6Mcz+WyCuBgSORqnJm6Zgj9mAZO0uMwKjniquBm6puvsZ8jTj3IswqcToB26S9ZxsdgnO/thr8k5F78HmmCc4/CjkJc8mfmiNHLzpT6+Vo00GW37sAqTLMMSp7M3t1+FiQL+/ZOe+Q//cy4Sqfa440I6cUTZtvKPKHeBTvSpXOrRjKTJiVBcpDhmdkK+plqYEXGC9fY6CeB8j3w8WUPk/hmao0tbWm5NbmrISrOVJHvJqQomJRkpZZi/NxJIrN2rHyXMjFgNd1RhogXrzMnOJm3VcgB9KUXfpTYtx0IjK9UDbXDAFz+p0+E4J3ebZNZaR0X1Nq4PykfJZnpNfkOb/L2pqgTeDQTV3N2hP01aEFgNuneSl5Be/swOsJcW5RSbRLlrlOdvdE/xouv0e6oNfo9GflL7ZyhBLyebUfvHdBM9NU3puaJbZ6NsDna0T6d1u+mwb0MQDNzn6l8AjxU9howI3Zw31B95KjrdxzgpZdgr5qv+xIN/KYRSyPo4Byvhc9h7dZOloCstH8fDcIhNac24yfcuQmdN9BCUtHyh4WNNNiPLW+Tl/33Dpmrln7u4DZfONgZvmqoDLVj9xkzuDrj7g8r/ibqsUb+HXWibm3rWcvcYxoQw1iEjS/iF2n/p6FHvA6ceVvf7lEeoZMlmLkJ2COQXPInJVLchax7SoWKM7ICn0ShWOMSv/FqF5q+gLgNWg+bJ3Yt8rVjP8DnaL6agRL9pEAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHIAAAAYCAYAAAAmsqlBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFVklEQVRoBe2ab1IUOxDAF8oD+OcE4g2eegO8AeoJwBtAvU/wjYIboCdQvAF6AoEbqCd4ljfg/X4hmZrJJjOzC7K7JV3Vm6TT6XS6O+nMzK5dXV1N7mE1LXBwcHCB5tuUl+uruYR7rXHeQ6zwD/hDa9w7UiusJmyi9g8c+lv11+6P1uXyIo45QqP/wCfgQ9rv1JDS+m9wg+YeqCN14jl4MtGRN8H9/f0NcGeMDPnkH8P7N/Jgm+/gZlo79VNw1zblUaLH9gW0rUR7gDeLYATQYXR8B59ZhxbOY+oBYnScUL5KtL4SvvfgKbgHdmT1jbvrPnRz7Tug6wpHV9ThjD7X4K54R+nOuBVA1gmCPCq/tASeUXeeS0rrbTA/Sg9QdSS9H0CNLepQBeXGP4X2GpwCJtcY3qpeUW+P24b2FXwOLh2g6y5K/QsabJ0Apb0FavA39oO3CcrUNm3QbgbNa+YNR6yd1MOxStnYtXjZgUEnbIE6zwjRGZ8pG6BtxJ63hTWd1xUn28j7aRvhXyg12NIA+piDXK8Ge0r9fa4ctGQD7dPeOTnrPG1lNjssCvhFKT0PGndjmD/qvVHbkTphAlNSNpWSEyi8E7GpI5b25YollkMqP8HjRFiC0lNCAz1i3QZbDTyF3sDT7IYa44x0beXuC3KRrwPfKkN9bFvaBkx130KN0wP6XnFHwvASrCrKQCecUFZ56DYYSgHgOBUyH4SAob5QQA+PS53oEZaMVdPJXfKp1nkDuinK+XdBT7sdSjeLOdnU1raVwfRSXsqPYPfxIwpwJzlIhY2SX9Cb85n2JAp4VqA7Tl6jybqO1DDf4O3sPtoqZ5R1ZEO7U2B+g9ILnYFlpPcCPK7tMWVfEE/JiOPMvT5aCMUL5HXX7L8P2kOYzLxgBPje7pCyY/wWr842KjoAv44z/5lfNyn7jl6NN9qJyMqjsjN3pWEOH5oj9bsrBwF5BqbYADR38wfK4gUOukGt/ObiB80Acu48/0GaHTqOdHicwGrxWLQDUAl3bA368mMa43ijexSg160suDCZQSf0rfeaI/tFJx2oMx6DxbVEexr0vhNt5z/XMyp44BuEKUcyQuUmTOqxWgMV70RlxmgEphte1tU0XZQBsWhwLcKooxK7NJeOaCOf8wyGYLcgqfvjSSJ4HKeburbz8abPhmHQ2J+SI3svOkOCUc7I1EFe5VcBwskwxqjw6DAd3hfk+Zod85mxU48zOeNN2iVHGllDiobFVyZ+IR3Fm6OKehPFrTHuhFG7IMozsjXKLHDJ3MUXFi0h6rkD39Qzb4snVc1xKacm2phy9DrHCCvxlBypIw5LzC2aiqUjqUUO1U5+ZOEavxTF7trRRwtyzCl/Ik8aIF73ey8ezC/fPPNX14hMHzVqF0qmGw/rbVaEeiyKQzvS/uINLY4PERjlGekleY5vdi31hQC6qau7Nj2/dfSgP72W8xZfdUpnULfhpvDO0AByPKG86AzdI5oxQ5V8R4ZjkUHnAwPNf7Ubl5Hri3SjfEJZizjn2pZn0YCO5rBH6OGHAdeWHGYK8SX/PMdpWBZjj8EJqL185Aqyac8tMwjOf9JnkPhp5IhPI2dtWq0On59c5vok5TjH12SvGp21bC16PetEhkdHerj3CEj13Od5e96coRyjsbaj83lWpV27M9yJ/mtGEjOlPHGBUwdfUyXN4A1fCyhDTkz0vhJec/BXylqO7Ru+VH2swQubFyA3gHVz3tTrSGh/HMyR7iyNa9n3So3uKUg7a5Zx7vihR4KpiZaREAP4dnPdnAu98X92YlRuUg4+8MLjBch3saN38Jzr+uuG/Q++SmmKe4mwdAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{\\alpha t}$" ], @@ -413,7 +416,8 @@ } ], "source": [ - "solution_eq = dsolve(eq1)" + "solution_eq = dsolve(eq1)\n", + "solution_eq" ] }, { @@ -441,7 +445,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAAYCAYAAADwF3MkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFFUlEQVRoBe2ajXFUNxCAfR4KuIEOoANIKgjpwKQDoAM8riDjdOCkgozpAFJBAh3gDgB34HyfRquRdHp37+Kfc2zvjKzVarVa7Z90DxYXFxd7D3D7LbBYLD6h5Wv89Xnx4LT/hcOWaPkdXy3Udv/2q/ygIRZ4STsLSzxkWlhiBz0l75htv9KeuD2ZdGgfwPxTcGk67Zz2D+1Exks1hCj4zRw58B3IP4f3rvNghy+0l3FO8FPaO8fAcdDz2PvsIGiTDoPJOnpCe5f7FWNnng8hbE7PGpVbkTVn7V3hyfZs7AbtDU3nmFXFmZ4Z8E+x2TqnaVzT1+xwUfF0GA+amxRhQY+eOaOpmWdsMHwKnvvYc/7vtMaejHWW9JPaJoyfS29o9SBwmDSsjlKQeON5+QAjo9kg1uf55OyaFjjrDIZUCoJ2n3rO3mSOZwd0jsiytgVjK91p5tEXT4eZxsSkwUMgPCtZFHN5A0vrMKOgu3kTPfXau45rF1pJhGwPA5mjJwcWx0FLV1Smp7vuEcQR/AixPDF7hvyqcYdJHtaYpe/7tY5Zd46MM5qKfxzx3HHaK853GHYE10mOlzSd9zctbKfTjqCbcX/S9ponPxOWvBe0X2jfaMmgCHwLXiALeDag6ygV8kUp7nod+wXe3+gLZOVUtpFdGG4IQQ/1/JlmeVKXdB3QCwavXyHO02jmH2Qq44j2NS95Rm+WrAvyzDqjQ9BKiWSZOTp55zD3gTb5zGduTnlNr6XR/iMaMo1Ay8o2bfLOjT2UKw748LLklwcCuHuWVx640S4t9SGj7pkzCJqrg7FB3Dzj6zXb4iOHuYGneD4ljLnmcD0f85P3WfDCo2PNwBUdborG/p41OYneYEgXfuzP2MBimJwqXgwPrv49f7qrnatkSNMek/YM3rn9I4T1YJlQ08/9RDV+DL6uZBhtUZOrZQ1qqdBou4RvnDP09Ny/dspY1vZyufPLRCnlroN+6hx42OKPvP4xdLNRcO6w4knEy/wZOW3tI2TTZvmAOsMSeqshDInOBpnQP4p0ZDjEM3nP1+BcHaBm33vk/l4zXTU+cpqKrssydVD5pcgAfpCG4sUAXTTGErN19sWMDO+SMG7I2NSfoYcPo03gQ0TecFBkl/vpgKgIZT4L1A6eo4bZZ6oXbYOPnKbR+zLRy1SxXtng0QDF6Rjb6JO/0DKjhuiNkKdWOwzafExd5bgUReeUIMuSfEGrn/uG03RSD8uKMOkw7ODDrnlBV+u2QvdrbjOCsa03cM0m7rw/DUbg+qR8ludnrJE81/eGGsm7CZrVJRxjljk2s3+qs49xH6j92AdHUw20AU163J2gl4M+01ZK24R47ysVGYGHPUFRX1uWyanocq/X8uwS0DOMfAwejwcfIC/QPTIn+jqrVLsJcM+KDJ2ubXyNJoBeHjBBu1SPQA2bGoI0ePldEvRRD1/zW2TEM0VjrYfd6XM/dEMPz7xRF3lo5dOT6wH/lE9OIfO6+32i4oDmD0vBqAs8Edb88bD/9Z45Yu1Upq7Z8lqmPPOcMq2+5VGj3Rj7Ujy/Fq3WCPX/HBhBpr8K/YUSU3cV0y2guGXyLWuifLQMgxFrzLKt9hmIuRJS1sV/DnnFGTbeOfBbPp/kzXf6Cc67R2WMpObfvjhIKZ0jHH4dMKucxnr5t90n1l5ljw5migFrifP+mfxsd5X7XoWs5oMxim8NRJ+vLmv9xh+U8BogH+GdnZlbK3QPFvwLuEHX/wzxq6MAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAAYCAYAAADwF3MkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFU0lEQVRoBe2a61HVQBSAA0MBjHaAHfioQOwAtQKwAxh/wT8GO0ArcLADtQIeHagV+OgAv2/JZk5CNsnFK5cBzszh7G7O7p73bnJZOj8/r+7h5ltgb2/vFCk3oWfLN1/cewlx1CpWeAx+1xr3TtMKNx/WEfE7zvujqEv35XFxHsMJB+z+E3wIrtJ/ozRQ23/ANbo7oE7TYSfgYaXT/gV3d3fXwK0pa8gn/xTe286DHb6B61lP2kfgtn3oQR6v+6eMbeSxFTzXC3qbB0bCN/CRbcZSTaWdoI6EQ+iLPDZE4XsPHoE7YGutoXm37Rm6H6KT5e5L0O0z7TeMnUFtR/A8czxB0Wk8/QBqWFHnuVDX0EeMvQQvAZvrdG88L2jHeZuMfQWfgHcVXqG4doigjSyHL7FXKpM+pJ1KY7Rh70UEBg2+Aeooo0HDf4I2QH+LzklcrHl40XCzte5z+tbmL9DtDv9d6mrfJnNqxX9BHfcMi2CWpYzEZp51a6VM0+AVDDl9M42LufhQWfRZV7A8f5/GD/BdHrhjVLuYVakC6Qzar7UBbS8g6SJiH/BoOk6tqnrLs53eTIPhGRhLWj3ngjDRDStokYfHOr7P2c4z26zpKTho3zXwSLEMboNWrC2oSeCZ71EU7eIR9Exe6EewfeWvFzBDnGS6GhG/GG9qLP2qXuBRz7jz5DVybOs0HXQMbyur6CucEdVam7FrBfZXTnW2DEXZlcPg9SuEOkwG+NX/Leh1Xui9yF08mv3vSpzCZu/p622/be1DW4YOvCppBLQAfp3keeV5uA6VrwTeSic7jLW6EVhaN4575o7t4XntbVZ9PMNtJ72h7ul40oO+0e47VXq3ot89fyrGDAJvh80FjDErk3Jc4mdsZmg5zdn1BjZ7S5sPAIUwE0ugkmbpEDjfiJwEyDUXheNmta7H9Zg6nTEWL1wGVrowMW4Ze5jlgG6Avr40t2farqGTzc54Xim7jpwLLPesYpmo2HTI6A9gGSoZRtuQ091CpVRykWDpz05S73RmBIEsa9rC4NLwZmKCep6Oi4FnZgoPGPe80uGvQLN3yJ7OmQyXMo2Zg5eQsZVrJXRGo+DYnEU9R9YUeFCDTOgGmo7MwalOVocIPnNudrzHwifW85j5b9DnNAUdiwqFjxEWBXxqB8EbA9COV9jMa7YO3T4zX6KsYRRrlFnActeUr4GJlvPmg6x8ygzRITogV4TsQIYSaAf1iDBZpzhplnaf0zT6/sgiCtYVNk9pnWcor6Hl7waChugaIa9xibKO5Wnu51q9kc5pgqwes6wpn3tmp+mkLujcDEV9kN9yWbrY5fmT6HLkYlEFELsGjmy2fV76DOX8FG31en4V6VvP+V1DMbQQsLpkx1TIa9/Mfk47OqIbqN2+wW4ANMB8q4yXkFxCm2dXbXQzLZU2FjsZWdDzqnQbUlk/InvbqqCl6HKvTXkWCciXjewH8XRTRB4vIE/o51KXqQEZoRXg6gpWoLbx5pkcTn/stSOuOd7On/vrnwAO+AngcxwrteHzp4Ur/cziPOeX1r7OceRQ51FZ5AGbn1KUkf45uHqd8rrXMlGQ3jdq9xp1vmdMATPqqmeMkVfK1Cl7z5NHnaeUaeVtLjXajb43xVg+5ylXca0lIsU0Nv0V6BQh0rtJcUZ4AK9l0t+AcvkIT/ub8FpSvkJLZ2L/xP8wWsvym6X9Djh65sBjoCq/jpL6/mX7WmGF3bIgUm9+s0DOmFnmmclNxM6y2Tx5MbaZos6CX8+9MJXO38TE86tWljR/Xn/++X9EVBZh1qGjL5TweDnx2+TkzJyXordpnb9mDj0S0kloMwAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle f{\\left(t \\right)} = p_{0} e^{\\alpha t}$" ], @@ -456,7 +460,8 @@ } ], "source": [ - "particular = solution_eq.subs(C1, p_0)" + "particular = solution_eq.subs(C1, p_0)\n", + "particular" ] }, { @@ -498,7 +503,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = r \\left(1 - \\frac{f{\\left(t \\right)}}{K}\\right) f{\\left(t \\right)}$" ], @@ -514,7 +519,8 @@ } ], "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))" + "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2" ] }, { @@ -531,7 +537,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle f{\\left(t \\right)} = \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" ], @@ -549,7 +555,8 @@ } ], "source": [ - "solution_eq = dsolve(eq2)" + "solution_eq = dsolve(eq2)\n", + "solution_eq" ] }, { @@ -566,7 +573,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" ], @@ -584,7 +591,8 @@ } ], "source": [ - "general = solution_eq.rhs" + "general = solution_eq.rhs\n", + "general" ] }, { @@ -601,7 +609,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{K e^{C_{1} K}}{e^{C_{1} K} - 1}$" ], @@ -619,7 +627,8 @@ } ], "source": [ - "at_0 = general.subs(t, 0)" + "at_0 = general.subs(t, 0)\n", + "at_0" ] }, { @@ -661,7 +670,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{\\log{\\left(- \\frac{p_{0}}{K - p_{0}} \\right)}}{K}$" ], @@ -679,7 +688,8 @@ } ], "source": [ - "value_of_C1 = solutions[0]" + "value_of_C1 = solutions[0]\n", + "value_of_C1" ] }, { @@ -696,7 +706,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle - \\frac{K p_{0} e^{r t}}{\\left(K - p_{0}\\right) \\left(- \\frac{p_{0} e^{r t}}{K - p_{0}} - 1\\right)}$" ], @@ -716,7 +726,8 @@ } ], "source": [ - "particular = general.subs(C1, value_of_C1)" + "particular = general.subs(C1, value_of_C1)\n", + "particular" ] }, { @@ -733,7 +744,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{K p_{0} e^{r t}}{K + p_{0} e^{r t} - p_{0}}$" ], @@ -751,7 +762,8 @@ } ], "source": [ - "particular = simplify(particular)" + "particular = simplify(particular)\n", + "particular" ] }, { @@ -770,7 +782,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAYAAABLjFUnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPUlEQVQoFZ2T/VECQQzFXccCbrAD7ADGCjg7OOxA7QBquBJsQegAW5AOoASkg/P9cgkTbjz/MDPvsvnY7Et2r3Rdd4OUUmqpJ2EmvAmVgA95FF6UezZr7EMxL9i63ij3IDQ5JnuX7JXsVjB98XuBaWyW/hI2keDxV/m0tC5Y28FuN5EfrCoCHmTHhZX7YIGf1mFdR37aU90qQBGbhc8N1yefJMwx5kUXpxRjSay2YinABRyjOH4dABsu4kOgEBKFe6svPhkWY9OQ1bNvXsdO6SEzQn2bKYl24nRYYTOvRWYreyJkMfsuPGlerdZcOfIgzFXoaJZG4JrWs2Dv7QaVTAAGB9Z/gRxh/DYVRH6bVx+5/r7LXIZLXfDOtiJwLrCQA5rfJMneRuKY9jHce5w3yu9nQmWo0yuvf8UB/8EP2Yb1Q0L/7KAAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAYAAABLjFUnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABWUlEQVQoFZWTzU3DQBBGY5QCUOgAOgBRAUkHgQ6ADsjRvoYOKCGQDqCDoHRAOiCkA/PeeNdaLDgw0uw3/zM79lZt246kpmmmwAw+h+/hY1ibdAnfEnMI7Y9jXNhnBC/gF2yvsPKjfnAJaLeZ+gNwAn+K6AtwdOSBcgpslCHlLbZ1aN3xAcSU2O+QowCyzTagjbpi4L5I9pornQWdKRPj1Z3CyYNS3lxfnix2gSHv6C0HJ7RB3peT7wd+fdMoVjjcyY6iOXFkRwPhZ9hCUu/v1Cg+GRYzaTjVTUqOJRfJSeyhu2avdr9F7u5UXs8veYVcTjMpchRDH2cjwXlfS2Q/veTiL9B3obGChF69JPVtXwwl78trDq8aiU6XCg8n0/9e7uy3fUWRwfGEfp1tFJ8jr21U+ZwQHPPLIOTyZ805P5AY92jOIaGv5VDVdW1lnS5+C69wxDNC/hd9A8sSejeLNWH7AAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle p_{0}$" ], @@ -809,7 +821,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAuCAYAAAB3VXTKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEEUlEQVRoBe2agVUUMRCG93wU4JMOzg7wWYHQwaEViB3AswToADtQ6QA7QOgAOgDt4Py/bCZms7seB5u9W1/mvVySmcnuzGQyyWW2Wi6XVVyqqjpW+a6y9OWafsxDG5yn04FnL+WZSr9hgFhor+B1jIvboi9ULlXmMX6K7R0p0YLZbLbvkT9aRCFEP1L1IIUPuuhTw3UaQUqYcsx0ACn/Up3PKucywF0gTLwxw31TkLK2xmdGE25P7Q/iPzHc/1L3eQIK35iS3v3fyACfDLfpWjKxZPFYZEUuvNSW8Vu1P0re36pXA54QF43gQbjHKXgBuwWN25hv023JY/KxS92qLEwmaCqXUR8dwLna8Fa/ECEFiwf3svaxGM/E8EVlrj47wsZBcswlxJUXhPaN5LyIBMMozivESxDfFf3E63IlHIb7CyKknkA8YOaPjKY2LwLXu2Uab1etcbgqz12n9J47eJ69R23kCl4AXsCs0+C9ziDG7+mOZriGASKG4EqBsT4TMLhXOOMdq5YstnSDUbwO7Gq/VDBCS2ZPC4ZrLAe5iQWWxtaoQQDWBdgitwVYundSPARA6YDi6PFNBQ8GAr3uVg+qX/l21TCCkBYPWockvQgcZ4OFf5E9Y5M1yqayvhcOpeOtHKVTwFgOUiO4wCeFw/ZojL4+9/W2eAPbo802J1n6eOy72DvUD7OuNpD23bpBOQuIrCGiJztDiBn0VQgy0Ckb/d+g91s8oEY2CnqE/zJqM9tdMQHcvukXlDTEVGopwYyvPLvAEyuMfgJ+QjBNlwMMU4GueNAlO95xaAQtGZb8hYwRgmXnfwcbsK21D8xsgYdSJj4kdYosfpbKrifiAc3jP+4xpSJFmEmLTcSxRux6ii6T9AQ/o4NVU44JxQiDWUAPKp4gI3Bz5DbOIS07tWeVwKgZK8uhGKFeuMUTiicUT6gtUDyheELxhGCBshxqU+zEFsnR1oUGN0DD5AxzCKhnjnFOONBFB9ffXGfZ5eyZcKT3uMJvpsSEGBuyeoK8YC6FVuUMufpyEF2D3Qvh8oeelLd6ynXUY8dI8nCjqzb/VkPqi2cI4pwhiVOXafY0rtFa30o99t3r8I1yvyhliAuNa26vqMsZ+vbKq/F1FFuHd4yYIP1dYOzNGWoZkCRh6aTpMuIIBswKYxkBRf6VM8QAQMgF1N1m4tTjBq+yBsZIWnKEYZY1842cofrGGngMoRovyQrZjSAFzZ1P1bad4LW04huo9As4EqWxN7QSpzmskd0IEtq+IWA5pEvCdDJjpLNOvy9DbmOfXY8RE/CEPuWdAvIIZh9DdM38T8eU8SerEeT+zCTrv+vLl1StlYnTdMBQ/Wy3zTIAhx0OQ0R+XPqrZpyjci/4mNGfOO0d+TzCH7h0Kgisk3QWAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAuCAYAAAB3VXTKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEJklEQVRoBe2Z7VEbMRCGz4wL8JAOnA5gUkGgAyAVJOkAJr/sf5nQAaQCIB2EVECGDkIHEHfgvI+s1dyJuzMMp8OX0c5odrX6OO2r1crWjpbLZVGm+Xx+rPo7lQOvvxW/U/motoXXFZKvJJf70E7fwdEoBsEskEGgcyu+a7oylx4APlMkA9JgaVy3chm15/XXDe2fpH9Qv/269qHpakGQEWbcz7JBMnqi+heVs6HvftmuJhCcJ8jQ4AmSdzTwg/hJeYL/QW4CAYNDkJPhuP+uODFgI0hrYaPwWNbKuvBSt3niBPZKIFe9kR6B4CdngPMC1b9J5sbYtOC3r7WdqHBLcWyRT8ULcdaM3h1r1Vn/G5V7uOoVb96SMiaLB/dM5gecq9NUsl2J8Zhe61rHVB+88R9F5hb7UVrEH8nOK6THi53hkgHpRhyAAj3yBLWYSy38IDqDLJMRFMsfU3U9aR5c9ZcK/Cm0UKe23x3cTLYOjsPXaNK31P132fVwjBmnckWbCt8p6kBg0mt1YPcdSb5T4Xjsie+ohHjhu7Qy9edjtb83Wgc2NPr5CnHbsBDA/RBscAaK4ykPXm+MNsY6ILdMCy9NWrkafR+8AcIbNoU4umyQGYwNE+kw8FIFAKDQvqo6ULa9XFRAkNLiQYwsk6MjOB74D9kcr8kxNl7rkXQYXQ5+sSewZsByFIPgAp+MbHL3Mz9uU7wBt7fdZqOo47HvJZd3P+y6X3+lPlZnEPmuwmRuQumInkRRd+VILiRzzViAOVadD77a/wZ93+IBNxhrgwiI/J6x69x42HXXa+UFYaMBAcQOfWMjUz8ACaA0duyvweIBxyE+Em4V2OYBqey8X+JvW2p8HEw/BF4XD+rWzREOmyxQOPJck+G4NP6VrpttU3QyAPf+q3Io2X4vNC5PfYgTjMFwOL8ukR0NDgQtnp3EKOIX5/pCuhcd08GBIKM7pyHHhM7AyCAIygyCQBjNZrPqc3NnTjaciXJgzMdh5a05JmRPyJ6wQiB7QvaE7AkBgXwc8nEIzjAOUiJB//V5AeIpzL1JivOoYe+Dz8oZalwS6uPHkssZavW85JDPIJ136h9CeAitpMRU752SeoIMncqidTlDeyku1B+5MXGaCp3UnhDnDC8iQ0LOUACsTZxGYzurJgVBhrnHTHGLAfHTOHGCZ3H6kTEK6T/peEDtJduVFAQZYWQ5AgcKShk5EQOcSy9zdOJ0Gf0NQIlpqC8QMCT2giPpzAMAAAograrVxKnXdc76AgG3N0PxAup1OcPYEzAYj0lK46Sza3IZbO7cljO0ZWxLKHsD9eSUHARZYPGgMWeoPk9KnKZCo4/jUBcPKvbIW9h9gKjb+ZA4rQzqsJIUBBnHeeb8h6uvZe1rE6ctY1/UlOy1WQA8O2eoMa2J0xdZ2jL4HwrefShVXkI5AAAAAElFTkSuQmCC\n", "text/latex": [ "$\\displaystyle \\frac{K - p_{0}}{p_{0}}$" ], @@ -825,7 +837,8 @@ } ], "source": [ - "A = (K - p_0) / p_0" + "A = (K - p_0) / p_0\n", + "A" ] }, { @@ -835,7 +848,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIQAAAA5CAYAAAD3EIMMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHQ0lEQVR4Ae2c7XHcNhCGKU8KcNRB5A7kuILIHdhRBXI6sCe/pH+euAM5FSROB7IrkOMO4g7sUQfK+0BYDO4I6Hh3xB0pYGcgfBJc7L5YAMSeDm5vb7va6OLi4rXG/EzhhR/7F8VfFc5Ud+PLOqU/KB23oZ62D5YOagSEaVPKZTZ8UfzUyuJY5YDhN4LSAObB0w8PfoSZAUrBJ77qY6qJ6l+p/Lvi56n6h1pWLSCkUFP0VaxcAeCx8r8rXCpdhVWIx18zIJyFkNKDhVD6WMI5VfwmFlJN6ZoBgfLDBlEgYIl4qpg9Q7VUJSCkdGcdpHVnHZT/Q2lOHtUtEcvIf7RcUEne9g/fAIMCS8R7hSOl7ZhZiSgWh1krIMxC3HgwIBWsBMSGslqqFRDsHz4KDFgFR0qzXLCEHCtNfZVUHSCkbLMOC8dNr/3qrUR1gJDibf8QjptmCgQWyrAUL5Tme0R1VCMg3KZRCg9HziWtX/p8lXuJKu4y/Gz/U4o+UrD9wT9KX6vunQdApzRHT75D0A7CYlRzj8GAqwAEA200TAI1LhnDJFNpqwaIShWfG3YDRE4ylZY3QFSq+NywGyBykqm0vAGiUsXnht0AkZNMpeUH5+fn9bldV6rsIcNuH6aGSKmiNm3JqEjZQ4Y6O0DovuFoyMCm2Ea82z3KFNlzPM3Kp1ICNXe3IFCV4d+ACxwxl1G4z3Nx5Ujpf5VwDjGKXyoffpl112Knf3HRO1ToXb3vkgu9n0mFLF8uv3c2FkLM87M6u5oO4/DCxdkFd7jnCjEYGDj+DU983T7B0HneAOW+rRyT51qhR7OwEBIgM/yr4pxXNL/T/ByPTm3xe2BG9mZB3G4PaawZV/FF+NJ43c8J1D+WMTj5qNxd8yvGKwzZ4EL4SiG4Eaqsm4uFwFnlLxjOEIgPLnEaJH4NWIzg65B5bufF4gkrBVBLWYnv6v8/BX5jwvixmGEiqcz9CEkxfh4LYFC7bhYWQnzi+Jr0cFI5s4DAj3aJWVo+KD3qOq3+4pmnV7h3Ypneqi7JG40yBLgBcVCI5x3gf7NnVGazmnGZv6dVx/GV2rqlklgBGbylgdKAIQYEfd1Ql6LJA0IDWjWTEKwRAj1UwBwHYVvlCDGCxhKxV8HkspRR9kShUx5hwwMzlDLAkhI+CjpVcDz65z4p/wvtfZ5lxZHvY51flJ3omdyShLzc8qo2s1wyAERA+J2IFv4ySyHMMOaQgEBQ1iikvuDhbwX6ZAaa9UHZMWDdzFQ9imaGkk8RzwEeI5TPGFEQluhXxTmF2jPJWM/Rr/GXaoM146TDstprN3kL4UeEAHME4t9rgDbbmLkIl5maFKrq2VQNmXHumOr76xQDvmsFIwAS8wYQXZ5Y4WeFx1ZmDylmnT+M8oyBd/UUFLUZlPTvSo6bDlSPbLL1PUDoAYQFYn/ynSu5V0J4oD5HKMWtl1EDrAT7CKxGz7qojPXWrbnRM0OSKC5+F2Yfy9HxLkUxOCiGd8qZlTEBhpgvxkfbQOovBaRQXyrhAMHL9QJAAFMwe58CVL2a1Kcd+9zGaPUT2RYILjbLoaHeARigBYGrHLOOcgDGEEtAH/eS+oMH5EK/nfK8m5D87zO0uYfoKwYEliEAR33zHvSRncmqK0KP6FUMYN4wWQgvNolFXrpOp/BGe8UIKZDy7LptjX6jPAJ1pDRghFiTL++SW/9F+QCPH/GYuz5HO+MPBS/wqPyhQqx4ZR0BoiufJkLx/F+K175v9hFnVOyaekvGrhkY+D6UirkOZl6CY/YTeqS6TZeEXl9RAb/4Yn9yn8Wj3pl6YrX/rNgBJuqHJHuLYLl8m51bgyWeXNZZiFTFlMokMJQQBLgn3gDkKuuJUrkjYIazqe3xrDqs11hWS12NS3OxEIyaS6veuXlccaR703tRIEsSZh0rkJr1nS/vgcB6VT1Wg28Y2TbWdl/xbAAhIbJRZP1OnhxKCtArcAwlYjmSy1xJ/tfpu+cxpcGzYWLD9qPSyZkQv0BtaIs5XSZmQ25TxUXVyjVTbZp737JUC+Ul6wO63tpCqKMk4lW+9bHTmCwkg9ZtQgKz2FQm+G5FhSTQAFFIsHPttgFirporxHfYQ2i95mjFJtA2iJ9Uxlc27tpLXCUXGlLrdhsJxIAY41i1DS+zeVYThOMjn59xU4M4UT1T2MRZhucnQwEQBTjiwgaL81CJexTuI7Z1lpmUfIoBQrOIbxgrv2NMShoDmNG4+GLJlTdWYpWzjPlTYEEAkP0HPCWnSW1TuaZeBAg+qgF0loj4buNY+XgCnPh2nY+ds8yar9t58waIzUXO5jv2cDpVHssBALAiMTgoxteE8klTsSVj0qPekjmvcJYBp3TlsQ6ETZxltuRm3MebhdhMnih/LGeZzTgo9FSzEJsJdkxnmc04KPRUA8RmgmX/kLzUi7ozZxm+VfAbjVl85+ldf0cDasmEBLRf4IuuO3IqPlN+efOYeGo+Rf8Dk2x+5YE1OQQAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\frac{K}{1 + \\frac{\\left(K - p_{0}\\right) e^{- r t}}{p_{0}}}$" ], @@ -854,7 +867,8 @@ } ], "source": [ - "logistic = K / (1 + A * exp(-r*t))" + "logistic = K / (1 + A * exp(-r*t))\n", + "logistic" ] }, { @@ -873,7 +887,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAzklEQVQoFW1SiRGCMBAkGQtgtAPswKcCKYEa7MESLMWhBGkBOtAOEDuA3XDL3Cg3c9lkby+bEMI4jpkihHDHvEd+kXvkA/UOmGUUmrjFsnLrHOsXskh1E11BDBIJwdGh9cIniFoCIbgKybPlEQOjnOFv5FkZZcQFeBbGZ4bVseCOWyup2yuXZlmzqJ29UPMdhUuXWIdy6yNuKEuRTre4vGXdoLpmreZGwhrCk9/K5nzGLrm6j8vn+n3CAdyBmo11Eo7IG75rYdwZeIEo/RQTNRRqzYwqZmYAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA3ElEQVQoFW2S3Q2CQBCEkVgA0Q7ODvypQEpQO9AWjG+8GVuwA4MdCBWY0IF2ILED/AZvyYWwyTKze7M75GDUNE2kyLIsAS7kl3yRM/JGvwKjWA8fJfjg4Ehe4Wcyhzudt0KKA9yBdzUVcG1Wnau2jVt4oUYvntRzhhITpj2BldqqSGOp/zyqPQ6B08aJP7HpUGjDU7PWoW0OhR2X0Ka6ZkDM7aN3NEtrBrrO5W3WupohaxsuTKhLXYarPF+AlVxbIUSfrAY3JobLYUfu1Rvr4UPTJwTO1ytwTd3+FD9d+zu+IBCKGAAAAABJRU5ErkJggg==\n", "text/latex": [ "$\\displaystyle 0$" ], @@ -928,7 +942,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)} + \\beta f^{2}{\\left(t \\right)}$" ], @@ -946,7 +960,8 @@ "source": [ "# Solution\n", "\n", - "eq3 = Eq(diff(f(t), t), alpha*f(t) + beta*f(t)**2)" + "eq3 = Eq(diff(f(t), t), alpha*f(t) + beta*f(t)**2)\n", + "eq3" ] }, { @@ -956,7 +971,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle f{\\left(t \\right)} = \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" ], @@ -976,7 +991,8 @@ "source": [ "# Solution\n", "\n", - "solution_eq = dsolve(eq3)" + "solution_eq = dsolve(eq3)\n", + "solution_eq" ] }, { @@ -986,7 +1002,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJEAAAA5CAYAAAA2l8mgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKBElEQVR4Ae2d7ZXcNBSGhz0UsIQKCB2ElLB0AEkFSToIJ7+Sfzmhg0AFAToIVBBCB4QKWLaD8DyKpZVla8YzOx7PeH3P0err6uvq1dW1RvauPn78uFpcWwbPnz+/e+wyoY/3jqWPn68WakngxYsXr3A/tBKbCOmPCX6Pu8JdNv5LfNN/I/8D/qHoLu3dwf1+qAZr7Xwmmhf6JAEm5FdCP5RgIH6XdPPeEP7xE/dqRfi8Sb9P+IuYPoZP/e+p9xH+X7F+wq8JC/pDgjc2n/yzFLrlASbiHiL4UE4IcQH0N05wJQApLuJqJMH1p/FdiDosv5bgEayhfwWjGvNVkXbw6AKia5E/I/jmOppCbwn9yETWtg0BJM+uJEA20QUMAlzQJmribmsCfTKavU2EgF2p/+K+xJ0Tf6K08Q3nk3KPeNoqGp6n+E6Qdk+N3Ep+qmXeJJ3+2LbaRhBdEXf7el30U+CbP0ofqHcjzRpECNtt6Al+0CL4v+Ke4tyW1DzBgCZeW8kC7nfyc7CRdE19eaS5RWm/VMtd11APUV6A2n/toZf4v/Vwy/MQt4CoRzg3SkLgrlq3gHwbcttxUtQ4+RYkiPqMU9Pz8kTrRL1qhG9x+ndwNwIR5SNpD7W0ZMzAt43zLH7w4Jw10QOk+aiQqEARGN8z4WFby/L7Jlz+vvRQjDqs6wI/aAF8Aafm+i4wFH9IV0NZJidtGjVNTukpkDwB6VbWB3LLXOIE7GQ0ZxC5OsvVq8BND9tYJvWYniWFoKBQC9RIrVbWVeNdwesZU4tIe4tTe9XI9oM2hM++ezaUA0oA5fFaPaOlHwWIEEo0fh3o1zhtl7XbSCNQ7RqNZsly+ZmJAHLVBwE3/NoOK8Ku7NywlqfUEPIJkr9xj3HJ5iDsZNq2W+bY5LjeNY08o+0StGmMY3ekVv+kIEIgCiDaKflq+4e8b3DaNPL45JSMSsKqeCfwW3nwV/jyuUVFIbvqPdtxJV/hBI1xfUHrxIQ6iQuqFS4HFtmh3q9JF5xuRWos6xK4GrqGxybbFcw+KfokVtI3JMgzGU0KIkatLfATAkpax4nBefYiGASF9kWuBQSLQvPpJwJIzSB/0gxNXmn3rEjvpFFOsqzgTGA1UaJMBOanhAP+pW1lk+TT07Sn5bUx9bDvP2kyEDFwJ83Jf9kzLMFxv0n/Et58xatFJG0DV6dkvlom5wsZQ/9Q1gNFtWIHRFvUodYTiALd/mjv7Fzfpnap2wWWFs4m/rHyJwMRA/LpqXYGIxh8ahEwJcgUnD92Ju1EfF/kQV7L/tmmYspqh+laP49sqGMnLUJb59Trdr5T+Q192ir7bCvuPTE3AlAICrxG5r+DV0CVFLaxMvGmcdpSa1ziq0kOQrS161i8OTDZNpsLZyoQRWB4olylZlLL/Fi2TF/BH7e3Tt7QBNvE7TqxQ5u5MR99dPutyuLGDWxRwZTbmduR5yOtbQnBuMLO4xiIa2fkPz66vT2M+frwyO/WF+0lkxc6kAQmvU/E5MdJTxqJtAAqfA1GV9q/hFs2BnE1jucnlgurMZYjvtCBJTApiA481qW5kSQwiU000liWaieSwAKiiQQ/p2YXEM1pNicaywKiiQQ/p2YXEM1pNicaywKiiQQ/p2YXEM1pNicaywKiiQQ/p2Y/453u5RXYOc3oBGNZTqwnEPrcmly2s7nN6ATjGR1E/DDq/Whv+91KYux3j33gztG6PpK/9orNqFdBms55yX3dKzHr+n/SeYzbsfdeHCP9lD5T8xf99Q2czitPTtDYmuhn2uht+KTRMaDzCh22zv1n0uPLir5Z4vXW+CKl96Qs42tBo16Ko/73uKR9CHuj0370ak3SfVHAO10Cv0NrQWSlFmxcbwOdGpsEyijAN/jhvk+Nb47pjDlepGuBgXRl6B0oL/GXd6SUkyD6E7cTUafl1xI85zCE/hWMasx4v6vISm+8hFeuyswqiGjMfVB7xktiv+C8xJ7QW1aUx+FTWKK2dWsx55l5+Bnje9MzRt8mOeXP1KgYOkDrtYkAgQDwTYxwkR7fd8EsrBti3/gGgu+TVbUQeb614Xb31To+8o+GGhn44uJt/UyN256atPWGSQdECCpsW/jlmxiqwZCHv4kE4aOSiTqtQ+Bc4u7gjJ8E0fcgPPzwIiH+rftMDWPWLgq2EX7aZTogYka/g6G1Xzez7OX4ElgdAFDWLU9wdN7aJO+K9GBoE3a7VBsdPdFX1bjCy8fk1uTrzcrEcCQXWssWajJMz8tH/l6fei/IUOvru+CU3T7I+anNo204d+vIMTiHa0HUqaAZkIPxve9NdB8Gt799DXpTe4fIf0AjpWYVKAIjPl3l/egbu/x96aEc8rKuC/wwOfhO1jF+pkaNrDwStTQRHRcodtwBaa1bQA0kOofaLgKtbyWSfJzEeB2fxnDtCyPml6v3kjTTlVNOMT1PMywo1AI1UquVddV4V/B2jk5IO8RnapSDxxO6Kzt4VvTSpzGZFIQMGpA+cqpOBdYQks/yJ0GM14XjhyV8+vTJya3cB4jceFQmafzwCB4X14qwWtd4pKihYjz48FhfODLJMyyLsz23zLGp/ExNudgdY5lW9inObZJHSxPBLWhWDEoApVVBXI2kQTxkOxNwmzoCy/TEuBSEZytrvzBCvqveMxI1ibJx4sOZCb4AeIfzyWVFXFDpyyNvIuJz+ExNHJPzHKgEUVTnMT/6rkSFNYTOYYpoHcI/iMdJgfEPnP4QcrCCw77XKI5p7RdGqMNFkWumUB/pnbSmIbWKGi4Aq0kLHmXS4szTDxGm7WBnrWlrm8/UpHlIIKIBB20jfeSKdVKGkHwJpUMKDOGhf9Y7RBMOqS7yjPKFEfp6Gz5Tk/CQQIRU/R2ntkp81KwBLE7Iqfpjbb1z/UzNeTPRSW5n2cyriToEsNRC5tUAVpax8thQmXds8bSayo4xbs+xdibKu5XN8TM1cZdJJkuuiRzwY1w6RCKsIanh6VlIQt4GyWpk+rh8CvSSTj7MO8o4XQDaStFeyrO3ClNXxybaqoIDMdPPvsPlWuvBtKFMWoDheiwJahqR5UGhj4Hx9yGC233gsqnLE9wv8oasSCJNo1M026YTpuErQD3jSAAmfhCiTTXO8oWRgdJu5s+jCk2cT+S/quKy/qt9/gM26vsPd7HPOpe62v/Ybyp5MK/vcU/z9nObKOJqH75XR66Ruo8alzomlwDax51DE6e1Y5w1GbXzoV077pbVewtu1wqXckchAX8z83OEyR6yV2oi7aC9Pr7TiHZO9cdD8hY6TQn4hO7DSIs+Z8L3CqCsdn/19oT5JJ5Qsn4vwR4JgBN3FrWQCqJFo768SIOeCHuIWft5oNWZJXKcEmD+fKz38LTXzh3LsA7SoFG1kI/uPs4vdLoScBvrXD2JwxlVE8VGFn/eEvgfbzZ3sGoIEekAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" ], @@ -1006,33 +1022,15 @@ "source": [ "# Solution\n", "\n", - "general = solution_eq.rhs" + "general = solution_eq.rhs\n", + "general" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\alpha e^{C_{1} \\alpha}}{\\beta \\left(1 - e^{C_{1} \\alpha}\\right)}$" - ], - "text/plain": [ - " C₁⋅α \n", - " α⋅ℯ \n", - "─────────────\n", - " ⎛ C₁⋅α⎞\n", - "β⋅⎝1 - ℯ ⎠" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solution\n", "\n", @@ -1046,7 +1044,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/latex": [ "$\\displaystyle \\frac{\\log{\\left(\\frac{\\beta p_{0}}{\\alpha + \\beta p_{0}} \\right)}}{\\alpha}$" ], @@ -1067,7 +1065,8 @@ "# Solution\n", "\n", "solutions = solve(Eq(at_0, p_0), C1)\n", - "value_of_C1 = solutions[0]" + "value_of_C1 = solutions[0]\n", + "value_of_C1" ] }, { @@ -1077,7 +1076,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJ4AAAAyCAYAAACtW2LuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIzElEQVR4Ae2c7XEUORCG15QDcJkIDjLgI4IzGRiIwDgDKP+y/7lMBnARGMgALgIMGUAG+JyB731ktdyjndnvndmZVVdp9S21ut9pSbMa7dze3o4Kbb4Ezs7OfojLI/k/N5/b6Rw+mF6klOhaAgLbnnh4Ive7a15W1X8B3qokud52DtT8bwHwZr3dtNf6Tplq2xN23pOAdKG0P3IP5fYUP6aMfMI3co8UfScH8ADdldwHpfd/ugV4xbUvg9PT019yByZ7hT/LvSUu/8LSY/yH0g59Wt/Du3qCCrUsAVmsD+qSqfOb6/qrwsfRmhH2xPqu/1bOjais8ZwwWgy+Ul+AzxMbB6bWlx6QCodpVv5gNhYMugAPKbRP7FJzC3atNNJZ03nC2gXLKPCx9gOcvadBTrVSji3aUdBjuc9K89NaUJzSsCYv5FAuC3sUTxr0XI73Zizq5yLVoZ0TOTYOEDxcKN2sFqADQCEey79WfKQwm4qwuSAuou73EFKbysuBGbP65Q3K4kkpj+R+SQVf5b/HKYyiAF6wFPhyh1FNLxQmH3CxriLP6gGKz3JzkeoDXF72svu0tngQwo41NvZSPlPqW7k3Cr+RDx8f5VPWwK9g4OE5ZRW+JGEItDuEQbgxoHCUl6ybwlgQXkOgWJQP6CgDEM2SEP6ptC/yjQAwyg6kPMK89givPxSnvQrFNgErltJbM8qmNV3M80AM7Si9Lo2xpPGEggP4GQzwpDQUyxR3XqMXQPAspj9UWcA4kjOgMdXm9ZjiKEObbAaoF8Am/1AOK4rl8oS1gvaVZ6DFmr5THL9QlMBggKfxAI5vDQpG6UyjACMAzMrJP1AalFsVwAhAcWYtQ0HFv8gBvD05DyisKXkfQ8Hy0yiBQazxAIBGiMt3in7g5H/PgEI+m4vK31GxPQD5KYaZitl1egJwBlqfHqZYn1DC4xIYCvAAAcS6rJEEIptafRnAk1s7rCdtYukAHWR93MXugLhvkejnZVK2+rapN6Vtc2AQwIsKZHrDelVICmfXuGeJij+RS3GlM6UauEbkK86U/LfCHki5xVOR+3aJiJjGK1aQvuRYf9aBnjpbSYM6JCAF2+I+WT6lhfVWVD5A+qMwr1lG8gEJr1HsXR7JlXduKgMQ2S0/VjhNowr/p7Rz+aEthQMpjmWjDXgIwFVaWfMF6dz/7N4H+x+SgsOus24kyjuuSbf13aRXFgY2byVpivjYmlL9VIBY02dJkgSGNNUuotC69V2lHQEJqwX48vUc5a74KTS/BLYWeAIUFotpND8JUidF1mjpnZ3q2msTQFloAQkMao036/gjcFgPsqlgurxU2sQpUvmUB6yADb+8FJYQFqWtBN6iwir1VieBrZ1qVyfC0tIiEijAW0Rqpc7SEijAW1qEpYFFJFCAt4jUSp2lJbCjr5fKVQJLi7E0MK8Eyq52XomV8iuRQJlqVyLG0si8EijAm1dipfxKJFCAtxIxLt6I/hH5Icdfd1tFvT2dImU9kqb4kx/iyLudIrlL6cGveOavN0C3Mby3JddeWjwJhzNvHOjknNsnOT4l7KPV4MGpHLtXvDNqU66929VKOJwovpKfzsIpjAL5037sBHIXWhQfHCgIn0HK5wRyOAsoP3wcJB9rzdlB+ObQAcerOr0FSjy1KtdeWbyosJH8BDopDGLKQpmdk3jj5LF9UA64/KeOJzCoMlg5wAjoOMVsl/WQPTOpHp9ZLv0th9oIspPfmlx7BTxpBEHXHSN/rbxcaDMrcFUFxRvn9upugXqtPKxbfvaP5UHnfIuH1uW6q057TVGhKPXpBgzklXg4yvhg44BF4cqKdPw+8n0jf2M2Fp7vdct1DHjq0NYn8MFHK3y4nH/+53lsJRwFwe4VJTKFMaVh6Zhm/1I601agWNY+4EHZlAGc0Dov46Gf3IJdK410ePaEtQtyFb/kMyW3DsIoq9blmqZaMTDvhTdeiG2E2cWiVBR5I8c9JizK9+UAo6eZL+NRm1ycw01OwfeN+LDyAS5fm026jAf+Ei+qA6B4OEYKY92IG/FQ290tJ8prHXSRkU7k6i0eQp3pwhuTXMs+QAsKlJeshxSG5ftHLky1iqN4Uyjhxst4VJad3NQ7UWKbUy/jUVt8l8HuGmvGw8Euljg+Mwl82fe1tMemgs3BpVxX1IlcA/A0eBbFPI3nNaPnSaxceFNTJiQhYAX+lfNPdlNx0lEONythKaYRryfqiLoo1eha7ZlyAUA+JizNKPIKgP26q+lOFGvf71DhHVDhB1IYWaX2YjJ91aVN+qTSqlq79G9LBZ+HnOEpWFWfoTCbnPSBUpbno53I1Swei+KZL7zxXPuwBooSguXx6cuG1S5Cb1pnYtW88kM41qHrvJ5ZI/Koy9Ttifr0Z+Alz74qq9tRk79W0liShfcdKR2+wp1+Pn3WcJdyfaDO98QobpLVIb/uwptZx7hsOdZsTfyxicjBRX+kV/4ViGMFVPzbAegggOYJILJuzKmrNVjOxyrjnckV4JngWSs1ksp5C9BYbk0ZgGWMxBPgIa/OIpCeAxLLznh9+dziKXtsqWAyIq9C4oE1Wl+pM7k+iBJjCsFCVEhCnXbhTaX8GiOs2+AlkeJMmbyQ5f1YnTUi36zaKJZnrZRfxpNbtzyuKoO9jKczue4iVSmF3RWvFFBMsnyKhzWN/FHMSxfeUK8NUr88lVioZ8aDwmEnJv+p0sasUayj7HDhtVkkNhWUN5Cav0dBR8Qr07rqcJfxSI5NGPIJfSo+tmlw7Wx0ULx3Ktddk44Y8dOPJQe/YwHbO7kKGCoMjkdsfcdUm0+3Nib716DOwl3lTUoGE28ayMv3IN6pXG2q7YGc5mKRp7kWcFkrWLD0ykHgst3rmBXN6m1KlDG2ufZemVyTxdsUSXo+BASmvab3TL5oCsc6rO/OU2JDACsmxxIDAAI2+jtqKL5xyeIbnnFzkeoxzk7lutHn8SQgnjAWwDNNsyqHxWKdyqaCOlMv41GZraNNkOv/U6/3GYMc/LkAAAAASUVORK5CYII=\n", "text/latex": [ "$\\displaystyle \\frac{\\alpha p_{0} e^{\\alpha t}}{\\alpha - \\beta p_{0} e^{\\alpha t} + \\beta p_{0}}$" ], @@ -1140,7 +1139,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.7" } }, "nbformat": 4, From d47ab8edafceb6efd1aa51d849c23626c4ec516d Mon Sep 17 00:00:00 2001 From: Abhishek Jaisingh Date: Tue, 15 Dec 2020 12:40:35 +0530 Subject: [PATCH 007/144] Fix Broken Book Zip Files Link In Chapter 0, Section 0.6 - Copying my files, there is still reference to a broken link (http://modsimpy.com/zip). Probably the domain name itself is expired. The best thing is to use the Github zip link itself (https://github.com/AllenDowney/ModSimPy/archive/master.zip), which is guaranteed to be working. --- book/book.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/book.tex b/book/book.tex index 75656585..0b0274e3 100644 --- a/book/book.tex +++ b/book/book.tex @@ -448,7 +448,7 @@ \section{Installing Python} \section{Copying my files} -The simplest way to get the files for this book is to download a Zip archive from \url{http://modsimpy.com/zip}. You will need a program like WinZip or gzip to unpack the Zip file. Make a note of the location of the files you unpack. +The simplest way to get the files for this book is to download a Zip archive from \url{https://github.com/AllenDowney/ModSimPy/archive/master.zip}. You will need a program like WinZip or gzip to unpack the Zip file. Make a note of the location of the files you unpack. If you download the Zip file, you can skip the rest of this section, which explains how to use Git. From aaa56907ca877e42ce4ccdfce426ded54cadfd72 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 22 Jan 2021 15:47:41 -0500 Subject: [PATCH 008/144] Updating notebooks --- colab/chap01soln.ipynb | 522 +++++++++++++++++ colab/chap02soln.ipynb | 917 +++++++++++++++++++++++++++++ colab/chap03soln.ipynb | 595 +++++++++++++++++++ colab/chap04soln.ipynb | 667 ++++++++++++++++++++++ colab/chap05soln.ipynb | 594 +++++++++++++++++++ colab/chap06soln.ipynb | 527 +++++++++++++++++ colab/chap07soln.ipynb | 523 +++++++++++++++++ colab/chap08soln.ipynb | 617 ++++++++++++++++++++ colab/chap09soln.ipynb | 638 +++++++++++++++++++++ colab/chap10soln.ipynb | 447 +++++++++++++++ colab/chap11soln.ipynb | 463 +++++++++++++++ colab/chap12soln.ipynb | 877 ++++++++++++++++++++++++++++ colab/chap13ode.ipynb | 180 ++++++ colab/chap13soln.ipynb | 517 +++++++++++++++++ colab/chap14soln.ipynb | 475 +++++++++++++++ colab/chap15soln.ipynb | 318 +++++++++++ colab/chap16soln.ipynb | 842 +++++++++++++++++++++++++++ colab/chap17soln.ipynb | 273 +++++++++ colab/chap18soln.ipynb | 533 +++++++++++++++++ colab/chap20soln.ipynb | 643 +++++++++++++++++++++ colab/chap21soln.ipynb | 514 +++++++++++++++++ colab/chap22soln.ipynb | 1238 ++++++++++++++++++++++++++++++++++++++++ colab/chap23soln.ipynb | 571 ++++++++++++++++++ colab/chap24soln.ipynb | 640 +++++++++++++++++++++ colab/chap25soln.ipynb | 944 ++++++++++++++++++++++++++++++ 25 files changed, 15075 insertions(+) create mode 100644 colab/chap01soln.ipynb create mode 100644 colab/chap02soln.ipynb create mode 100644 colab/chap03soln.ipynb create mode 100644 colab/chap04soln.ipynb create mode 100644 colab/chap05soln.ipynb create mode 100644 colab/chap06soln.ipynb create mode 100644 colab/chap07soln.ipynb create mode 100644 colab/chap08soln.ipynb create mode 100644 colab/chap09soln.ipynb create mode 100644 colab/chap10soln.ipynb create mode 100644 colab/chap11soln.ipynb create mode 100644 colab/chap12soln.ipynb create mode 100644 colab/chap13ode.ipynb create mode 100644 colab/chap13soln.ipynb create mode 100644 colab/chap14soln.ipynb create mode 100644 colab/chap15soln.ipynb create mode 100644 colab/chap16soln.ipynb create mode 100644 colab/chap17soln.ipynb create mode 100644 colab/chap18soln.ipynb create mode 100644 colab/chap20soln.ipynb create mode 100644 colab/chap21soln.ipynb create mode 100644 colab/chap22soln.ipynb create mode 100644 colab/chap23soln.ipynb create mode 100644 colab/chap24soln.ipynb create mode 100644 colab/chap25soln.ipynb diff --git a/colab/chap01soln.ipynb b/colab/chap01soln.ipynb new file mode 100644 index 00000000..0dfd8650 --- /dev/null +++ b/colab/chap01soln.ipynb @@ -0,0 +1,522 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chapter 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Modeling and Simulation in Python\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jupyter\n", + "\n", + "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", + "\n", + "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Selecting and running cells\n", + "\n", + "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", + "\n", + "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "To run a cell, hold down SHIFT and press ENTER. \n", + "\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", + "\n", + "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", + "\n", + "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Adding and removing cells\n", + "\n", + "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", + "\n", + "Try the following exercises:\n", + "\n", + "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", + "\n", + "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", + "\n", + "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", + "\n", + "4. In the new cell, type some text, and then run it.\n", + "\n", + "5. Use the arrow buttons in the toolbar to move cells up and down.\n", + "\n", + "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", + "\n", + "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", + "\n", + "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the notebooks\n", + "\n", + "The notebooks for each chapter contain the code from the chapter along with additional examples, explanatory text, and exercises. I recommend you \n", + "\n", + "1. Read the chapter first to understand the concepts and vocabulary, \n", + "2. Run the notebook to review what you learned and see it in action, and then\n", + "3. Attempt the exercises.\n", + "\n", + "If you try to work through the notebooks without reading the book, you're gonna have a bad time. The notebooks contain some explanatory text, but it is probably not enough to make sense if you have not read the book. If you are working through a notebook and you get stuck, you might want to re-read (or read!) the corresponding section of the book." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Installing modules\n", + "\n", + "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", + "\n", + "They also use two less common modules: Pint, which provides units, and modsim, which contains code I wrote specifically for this book.\n", + "\n", + "The following cells check whether you have these modules already and tries to install them if you don't." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", + "\n", + "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", + "\n", + "You can find out what version of Python and Jupyter you have by running the following cells." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "!python --version" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "!jupyter-notebook --version" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The penny myth\n", + "\n", + "The following cells contain code from the beginning of Chapter 1.\n", + "\n", + "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", + "\n", + "The following lines create new variables named `meter` and `second`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "meter = UNITS.meter" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "second = UNITS.second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a variable named `a` and give it the value of acceleration due to gravity." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create `t` and give it the value 4 seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "t = 4 * second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "a * t**2 / 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", + "\n", + "1. Start from the bottom and read up.\n", + "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", + "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", + "\n", + "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", + "\n", + "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Falling pennies\n", + "\n", + "Now let's solve the falling penny problem.\n", + "\n", + "Set `h` to the height of the Empire State Building:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "h = 381 * meter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compute the time it would take a penny to fall, assuming constant acceleration.\n", + "\n", + "$ a t^2 / 2 = h $\n", + "\n", + "$ t = \\sqrt{2 h / a}$" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given `t`, we can compute the velocity of the penny when it lands.\n", + "\n", + "$v = a t$" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can convert from one set of units to another like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "mile = UNITS.mile\n", + "hour = UNITS.hour" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "v.to(mile/hour)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", + "\n", + "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", + "\n", + "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", + "\n", + "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", + "\n", + "You can break this question into three parts:\n", + "\n", + "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", + "2. How far would the penny fall during that time?\n", + "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", + "\n", + "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Restart and run all\n", + "\n", + "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", + "\n", + "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", + "\n", + "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap02soln.ipynb b/colab/chap02soln.ipynb new file mode 100644 index 00000000..f6b97493 --- /dev/null +++ b/colab/chap02soln.ipynb @@ -0,0 +1,917 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 2\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim library\n", + "from modsim import *\n", + "\n", + "# set the random number generator\n", + "np.random.seed(7)\n", + "\n", + "# If this cell runs successfully, it produces no output." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling a bikeshare system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll start with a `State` object that represents the number of bikes at each station.\n", + "\n", + "When you display a `State` object, it lists the state variables and their values:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can access the state variables using dot notation." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", + "\n", + "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Updating\n", + "\n", + "We can use the update operators `+=` and `-=` to change state variables." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin -= 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we display `bikeshare`, we should see the change." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.wellesley += 1\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Functions\n", + "\n", + "We can take the code we've written so far and encapsulate it in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conditionals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", + "\n", + "The Python function `help` looks up a function and displays its documentation." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "help(flip)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "flip(0.7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.7):\n", + " print('heads')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.7):\n", + " print('heads')\n", + "else:\n", + " print('tails')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step\n", + "\n", + "Now let's get back to the bikeshare state. Again let's start with a new `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + "\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.4):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')\n", + "\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def step():\n", + " if flip(0.5):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(0.4):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since this function takes no parameters, we call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "step()\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", + "\n", + "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "step(0.5, 0.4)\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## For loop" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before we go on, I'll redefine `step` without the print statements." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And let's start again with a new `State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use a `for` loop to move 4 bikes from Olin to Wellesley." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(4):\n", + " bike_to_wellesley()\n", + " \n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or we can simulate 4 random time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(4):\n", + " step(0.3, 0.2)\n", + " \n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If each step corresponds to a minute, we can simulate an entire hour like this." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(60):\n", + " step(0.3, 0.2)\n", + "\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", + "\n", + "But first, we want to plot the results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TimeSeries\n", + "\n", + "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", + "\n", + "We can create a new, empty `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "results = TimeSeries()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can add a value to the `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "results[0] = bikeshare.olin\n", + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", + "\n", + "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a for loop that runs 10 steps and stores the results." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(10):\n", + " step(0.3, 0.2)\n", + " results[i] = bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can display the results." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "results.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "results.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotting\n", + "\n", + "We can also plot the results like this." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')\n", + "\n", + "savefig('figs/chap02-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "help(decorate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`savefig()` saves a figure in a file." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "help(savefig)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The suffix of the filename indicates the format you want. This example saves the current figure in a PDF file named `chap01-fig01.pdf`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", + "\n", + "It should:\n", + "\n", + "1. Create a `TimeSeries` object to hold the results.\n", + "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", + "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", + "4. After the for loop, it should plot the results and\n", + "5. Decorate the axes.\n", + "\n", + "To test your function:\n", + "\n", + "1. Create a `State` object with the initial state of the system.\n", + "2. Call `run_simulation` with appropriate parameters.\n", + "3. Save the resulting figure.\n", + "\n", + "Optional:\n", + "\n", + "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Opening the hood\n", + "\n", + "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", + "\n", + "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", + "\n", + "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pandas\n", + "\n", + "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", + "\n", + "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", + "\n", + "The primary differences between `TimeSeries` and `Series` are:\n", + "\n", + "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", + "\n", + "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", + "\n", + "3. I provide a function called `set` that we'll use later.\n", + "\n", + "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pyplot\n", + "\n", + "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", + "\n", + "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "help(decorate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### NumPy\n", + "\n", + "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", + "\n", + "You can get the source code for `flip` by running the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(flip)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap03soln.ipynb b/colab/chap03soln.ipynb new file mode 100644 index 00000000..82a9d53a --- /dev/null +++ b/colab/chap03soln.ipynb @@ -0,0 +1,595 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 3\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim library\n", + "from modsim import *\n", + "\n", + "# set the random number generator\n", + "np.random.seed(7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More than one State object\n", + "\n", + "Here's the code from the previous chapter, with two changes:\n", + "\n", + "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", + "\n", + "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + " \n", + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.wellesley -= 1\n", + " state.olin += 1\n", + " \n", + "def decorate_bikeshare():\n", + " \"\"\"Add a title and label the axes.\"\"\"\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(state, p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " state: State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " results = TimeSeries() \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " results[i] = state.olin\n", + " \n", + " plot(results, label='Olin')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can create more than one `State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare1 = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare2 = State(olin=2, wellesley=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whenever we call a function, we indicate which `State` object to work with:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_olin(bikeshare1)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley(bikeshare2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And you can confirm that the different objects are getting updated independently:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Negative bikes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", + "\n", + "If you run this simulation a few times, it happens often." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if you run the simulation again, it should behave." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Comparison operators" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", + "\n", + "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", + "\n", + "Remember that `=` creates a variable or gives an existing variable a new value." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "x = 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whereas `==` compares two values and returns `True` if they are equal." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "x == 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can use `==` in an `if` statement." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "if x == 5:\n", + " print('yes, x is 5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But if you use `=` in an `if` statement, you get an error." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# If you remove the # from the if statement and run it, you'll get\n", + "# SyntaxError: invalid syntax\n", + "\n", + "#if x = 5:\n", + "# print('yes, x is 5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", + "\n", + "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now when we run a simulation, it keeps track of unhappy customers." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the simulation, we can print the number of unhappy customers at each location." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin_empty" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.wellesley_empty" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", + "\n", + "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", + "\n", + "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", + "\n", + "Test your code by running the simulation and check the value of `clock` at the end." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0,\n", + " clock=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", + "\n", + "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", + "\n", + "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", + "\n", + "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap04soln.ipynb b/colab/chap04soln.ipynb new file mode 100644 index 00000000..1945f357 --- /dev/null +++ b/colab/chap04soln.ipynb @@ -0,0 +1,667 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 4\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim library\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Returning values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a simple function that returns a value:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def add_five(x):\n", + " return x + 5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "y = add_five(3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you run a function on the last line of a cell, Jupyter displays the result:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "add_five(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", + "\n", + "In the following example, Jupyter shows the second result, but the first result just disappears." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "add_five(3)\n", + "add_five(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "y1 = add_five(3)\n", + "y2 = add_five(5)\n", + "\n", + "print(y1, y2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", + "\n", + "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running simulations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the code from the previous notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + " \n", + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1\n", + " \n", + "def decorate_bikeshare():\n", + " \"\"\"Add a title and label the axes.\"\"\"\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " state = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0)\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " \n", + " return state" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now `run_simulation` doesn't plot anything:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "state = run_simulation(0.4, 0.2, 60)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But after the simulation, we can read the metrics from the `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "state = run_simulation(0.2, 0.2, 60)\n", + "state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When `p1` is large, we probably do." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "state = run_simulation(0.6, 0.2, 60)\n", + "state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More for loops" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`linspace` creates a NumPy array of equally spaced numbers." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "p1_array = linspace(0, 1, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use an array in a `for` loop, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "for p1 in p1_array:\n", + " print(p1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This will come in handy in the next section.\n", + "\n", + "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "help(linspace)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** \n", + "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "help(linrange)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sweeping parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`p1_array` contains a range of values for `p1`." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "p2 = 0.2\n", + "num_steps = 60\n", + "p1_array = linspace(0, 1, 11)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " print(p1, state.olin_empty)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "sweep = SweepSeries()\n", + "\n", + "for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1] = state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then we can plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "plot(sweep, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", + "\n", + "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optional Exercises\n", + "\n", + "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", + "\n", + "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", + "\n", + "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", + "\n", + "`num_runs` specifies how many times it should call `run_simulation`.\n", + "\n", + "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", + "\n", + "Test your function with parameters\n", + "\n", + "```\n", + "p1 = 0.3\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 10\n", + "```\n", + "\n", + "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", + "\n", + "```\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 20\n", + "```\n", + "\n", + "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", + "\n", + "What value of `p1` minimizes the average number of unhappy customers?" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap05soln.ipynb b/colab/chap05soln.ipynb new file mode 100644 index 00000000..32632ff6 --- /dev/null +++ b/colab/chap05soln.ipynb @@ -0,0 +1,594 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 5\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reading data\n", + "\n", + "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates\n", + "\n", + "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'data/World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", + "\n", + "`head` selects the header and the first five rows." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "table2 = tables[2]\n", + "table2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`tail` selects the last five rows." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "table2.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Long column names are awkard to work with, but we can replace them with abbreviated names." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the DataFrame looks like now. " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "table2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", + "\n", + "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", + "\n", + "`NaN` is a special value that indicates missing data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Series\n", + "\n", + "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census\n", + "census.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "census.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", + "\n", + "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From here on, we will work in units of billions." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what these estimates look like." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + " \n", + "decorate(xlabel='Year',\n", + " ylabel='World population (billion)')\n", + "\n", + "savefig('figs/chap05-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", + "\n", + "So the largest relative error between the estimates is about 1.3%." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "max(abs(census - un) / un) * 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", + "\n", + "1. Compute the elementwise differences, `census - un`\n", + "2. Compute the absolute differences, `abs(census - un)`\n", + "3. Compute the relative differences, `abs(census - un) / un`\n", + "4. Compute the percent differences, `abs(census - un) / un * 100`\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Constant growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can select a value from a `Series` using bracket notation. Here's the first element:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "census[1950]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the last value." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "census[2016]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(census)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "t_end = get_last_label(census)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "elapsed_time = t_end - t_0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can get the first and last values:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "p_0 = get_first_value(census)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "p_end = get_last_value(census)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we can compute the average annual growth in billions of people per year." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "total_growth = p_end - p_0" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "annual_growth = total_growth / elapsed_time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TimeSeries" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's create a `TimeSeries` to contain values generated by a linear growth model." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "results = TimeSeries()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "results[t_0] = census[t_0]\n", + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After that, the population in the model grows by a constant amount each year." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "for t in linrange(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results looks like, compared to the actual data." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + "plot(results, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth')\n", + "\n", + "savefig('figs/chap05-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model fits the data pretty well after 1990, but not so well before." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", + "\n", + "Hint: \n", + "\n", + "1. Copy the code from above and make a few changes. Test your code after each small change.\n", + "\n", + "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", + "\n", + "3. You might want to add a constant to the starting value to match the data better." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "census.loc[1960:1970]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap06soln.ipynb b/colab/chap06soln.ipynb new file mode 100644 index 00000000..1af43b6b --- /dev/null +++ b/colab/chap06soln.ipynb @@ -0,0 +1,527 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 6\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *\n", + "\n", + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from the previous chapter\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'data/World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = get_first_value(census)\n", + "p_end = get_last_value(census)\n", + "total_growth = p_end - p_0\n", + "\n", + "annual_growth = total_growth / elapsed_time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### System objects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can rewrite the code from the previous chapter using system objects." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " annual_growth=annual_growth)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can encapsulate the code that runs the model in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation1(system):\n", + " \"\"\"Runs the constant growth model.\n", + " \n", + " system: System object\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = results[t] + system.annual_growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also encapsulate the code that plots the results." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation1(system)\n", + "plot_results(census, un, results, 'Constant growth model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Proportional growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a more realistic model where the number of births and deaths is proportional to the current population." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation2(system):\n", + " \"\"\"Run a model with proportional birth and death.\n", + " \n", + " system: System object\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " births = system.birth_rate * results[t]\n", + " deaths = system.death_rate * results[t]\n", + " results[t+1] = results[t] + births - deaths\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "system.death_rate = 0.01\n", + "system.birth_rate = 0.027" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation2(system)\n", + "plot_results(census, un, results, 'Proportional model')\n", + "savefig('figs/chap06-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model fits the data pretty well for the first 20 years, but not so well after that." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Factoring out the update function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func1(pop, t, system):\n", + " \"\"\"Compute the population next year.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " births = system.birth_rate * pop\n", + " deaths = system.death_rate * pop\n", + " return pop + births - deaths" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The name `update_func` refers to a function object." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "update_func1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Which we can confirm by checking its type." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "type(update_func1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`run_simulation` takes the update function as a parameter and calls it just like any other function." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we use it." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = census[t_0]\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " birth_rate=0.027,\n", + " death_rate=0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func1)\n", + "plot_results(census, un, results, 'Proportional model, factored')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remember not to put parentheses after `update_func1`. What happens if you try?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combining birth and death" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func2(pop, t, system):\n", + " \"\"\"Compute the population next year.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " net_growth = system.alpha * pop\n", + " return pop + net_growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how it works:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = system.birth_rate - system.death_rate\n", + "\n", + "results = run_simulation(system, update_func2)\n", + "plot_results(census, un, results, 'Proportional model, combined birth and death')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", + "\n", + "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", + "\n", + "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap07soln.ipynb b/colab/chap07soln.ipynb new file mode 100644 index 00000000..fb1ed01b --- /dev/null +++ b/colab/chap07soln.ipynb @@ -0,0 +1,523 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 7\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *\n", + "\n", + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from the previous chapter" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'data/World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Quadratic growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the implementation of the quadratic growth model." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func_quad(pop, t, system):\n", + " \"\"\"Compute the population next year with a quadratic model.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " net_growth = system.alpha * pop + system.beta * pop**2\n", + " return pop + net_growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a `System` object with the parameters `alpha` and `beta`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = census[t_0]\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha=0.025,\n", + " beta=-0.0018)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'Quadratic model')\n", + "savefig('figs/chap07-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Can you find values for the parameters that make the model fit better?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Equilibrium\n", + "\n", + "To understand the quadratic model better, let's plot net growth as a function of population." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "pop_array = linspace(0, 15, 100)\n", + "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", + "None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "sns.set_style('whitegrid')\n", + "\n", + "plot(pop_array, net_growth_array)\n", + "decorate(xlabel='Population (billions)',\n", + " ylabel='Net growth (billions)')\n", + "\n", + "sns.set_style('white')\n", + "\n", + "savefig('figs/chap07-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like. Remember that the x axis is population now, not time." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", + "\n", + "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "-system.alpha / system.beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the equilibrium the population tends toward." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dysfunctions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", + "\n", + "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's see all the ways that can go wrong.\n", + "\n", + "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity():\n", + " K = -sys1.alpha / sys1.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity()\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", + "\n", + "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity(system):\n", + " system = System(alpha=0.025, beta=-0.0018)\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", + "\n", + "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", + "\n", + "\n", + "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", + "\n", + "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys2 = System(alpha=0.025, beta=-0.0018)\n", + "carrying_capacity(sys2)\n", + "\n", + "# print(K) This line won't work because K only exists inside the function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", + "\n", + "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", + "\n", + "For example, you could eliminate the temporary variable `pop` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "print(carrying_capacity(sys1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or if you had more than one system, you could compute the total carrying capacity like this:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", + "total" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", + "\n", + "$ \\Delta p = r p (1 - p / K) $\n", + "\n", + "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap08soln.ipynb b/colab/chap08soln.ipynb new file mode 100644 index 00000000..3c31a82b --- /dev/null +++ b/colab/chap08soln.ipynb @@ -0,0 +1,617 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 8\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# If we're running on Colab, install modsimpy\n", + "# https://pypi.org/project/modsimpy/\n", + "\n", + "import sys\n", + "IN_COLAB = 'google.colab' in sys.modules\n", + "\n", + "if IN_COLAB:\n", + " !pip install pint\n", + " !pip install modsimpy\n", + " !mkdir figs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Functions from the previous chapter" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading the data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates2.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates2.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def read_table2(filename):\n", + " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", + " table2 = tables[2]\n", + " table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']\n", + " return table2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "#table2 = read_table2()\n", + "#table2.to_csv('data/World_population_estimates2.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "table2 = pd.read_csv('World_population_estimates2.csv')\n", + "table2.index = table2.Year\n", + "table2.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9\n", + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + " \n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Estimated world population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Running the quadratic model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func_quad(pop, t, system):\n", + " \"\"\"Update population based on a quadratic model.\n", + " \n", + " pop: current population in billions\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " net_growth = system.alpha * pop + system.beta * pop**2\n", + " return pop + net_growth" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Extract the starting time and population." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = get_first_value(census)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Initialize the system object." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha=0.025,\n", + " beta=-0.0018)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the model and plot results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'Quadratic model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generating projections" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To generate projections, all we have to do is change `t_end`" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "system.t_end = 2250\n", + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'World population projection')\n", + "savefig('figs/chap08-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The population in the model converges on the equilibrium population, `-alpha/beta`" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "results[system.t_end]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "-system.alpha / system.beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Comparing projections" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can compare the projection from our model with projections produced by people who know what they are doing." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates3.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates3.csv\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def read_table3(filename = 'data/World_population_estimates.html'):\n", + " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", + " table3 = tables[3]\n", + " table3.columns = ['census', 'prb', 'un']\n", + " return table3" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "#table3 = read_table3()\n", + "#table3.to_csv('data/World_population_estimates3.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "table3 = pd.read_csv('World_population_estimates3.csv')\n", + "table3.index = table3.Year\n", + "table3.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_projections(table):\n", + " \"\"\"Plot world population projections.\n", + " \n", + " table: DataFrame with columns 'un' and 'census'\n", + " \"\"\"\n", + " census_proj = table.census / 1e9\n", + " un_proj = table.un / 1e9\n", + " \n", + " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", + " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the model until 2100, which is as far as the other projections go." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(t_0=t_0, \n", + " t_end=2100,\n", + " p_0=p_0,\n", + " alpha=0.025,\n", + " beta=-0.0018)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "\n", + "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", + "plot_results(census, un, results, 'World population projections')\n", + "plot_projections(table3)\n", + "savefig('figs/chap08-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "People who know what they are doing expect the growth rate to decline more sharply than our model projects." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", + "\n", + "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", + "\n", + "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "alpha_census = compute_rel_diff(census)\n", + "plot(alpha_census, label='US Census')\n", + "\n", + "alpha_un = compute_rel_diff(un)\n", + "plot(alpha_un, label='UN DESA')\n", + "\n", + "decorate(xlabel='Year', label='Net growth rate')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", + "\n", + "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", + "\n", + "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", + "\n", + "3. Create a `System` object that includes `alpha_func` as a system variable.\n", + "\n", + "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", + "\n", + "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", + "\n", + "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", + "\n", + "7. Compare your projections with those from the US Census and UN." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap09soln.ipynb b/colab/chap09soln.ipynb new file mode 100644 index 00000000..fe1d4db2 --- /dev/null +++ b/colab/chap09soln.ipynb @@ -0,0 +1,638 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 9\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import everything from SymPy.\n", + "from sympy import *\n", + "\n", + "# Set up Jupyter notebook to display math.\n", + "init_printing() " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following displays SymPy expressions and provides the option of showing results in LaTeX format." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy.printing import latex\n", + "\n", + "def show(expr, show_latex=False):\n", + " \"\"\"Display a SymPy expression.\n", + " \n", + " expr: SymPy expression\n", + " show_latex: boolean\n", + " \"\"\"\n", + " if show_latex:\n", + " print(latex(expr))\n", + " return expr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis with SymPy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a symbol for time." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "t = symbols('t')\n", + "t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you combine symbols and numbers, you get symbolic expressions." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "expr = t + 1\n", + "expr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is an `Add` object, which just represents the sum without trying to compute it." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "type(expr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "expr.subs(t, 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`f` is a special class of symbol that represents a function." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "f = Function('f')\n", + "f" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The type of `f` is `UndefinedFunction`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "type(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "f(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`diff` returns a `Derivative` object that represents the time derivative of `f`" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "dfdt = diff(f(t), t)\n", + "dfdt" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "type(dfdt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need a symbol for `alpha`" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = symbols('alpha')\n", + "alpha" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can write the differential equation for proportional growth." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "eq1 = Eq(dfdt, alpha*f(t))\n", + "eq1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And use `dsolve` to solve it. The result is the general solution." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "solution_eq = dsolve(eq1)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", + "\n", + "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "C1, p_0 = symbols('C1 p_0')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "particular = solution_eq.subs(C1, p_0)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the next example, we have to work a little harder to find the particular solution." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Solving the quadratic growth equation \n", + "\n", + "We'll use the (r, K) parameterization, so we'll need two more symbols:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "r, K = symbols('r K')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can write the differential equation." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And solve it." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "solution_eq = dsolve(eq2)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "general = solution_eq.rhs\n", + "general" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can evaluate the right-hand side at $t=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "at_0 = general.subs(t, 0)\n", + "at_0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", + "\n", + "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", + "\n", + "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "solutions = solve(Eq(at_0, p_0), C1)\n", + "type(solutions), len(solutions)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "value_of_C1 = solutions[0]\n", + "value_of_C1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "particular = general.subs(C1, value_of_C1)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is complicated, but SymPy provides a method that tries to simplify it." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "particular = simplify(particular)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", + "\n", + "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "particular.subs(t, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", + "\n", + "In some places you'll see it written in a different form:\n", + "\n", + "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", + "\n", + "where $A = (K - p_0) / p_0$.\n", + "\n", + "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "A = (K - p_0) / p_0\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "logistic = K / (1 + A * exp(-r*t))\n", + "logistic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "simplify(particular - logistic)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", + "\n", + "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", + "\n", + "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", + "\n", + " df(t) / dt = alpha f(t) + beta f(t)^2\n", + "\n", + "or\n", + "\n", + " df(t) / dt = r f(t) (1 - f(t)/K)\n", + "\n", + "Find the general solution and also the particular solution where `f(0) = p_0`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap10soln.ipynb b/colab/chap10soln.ipynb new file mode 100644 index 00000000..e7167c43 --- /dev/null +++ b/colab/chap10soln.ipynb @@ -0,0 +1,447 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 10\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *\n", + "\n", + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", + "\n", + "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'data/World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']\n", + "table2.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "census.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "un.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "table2.index" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And `columns`, which labels the columns." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "table2.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And `values`, which is an array of values." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "table2.values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `Series` does not have `columns`, but it does have `name`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "census.name" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It contains `values`, which is an array." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "census.values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And it contains `index`:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "census.index" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", + "\n", + "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", + "\n", + "`ndarray` is defined by NumPy." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "type(table2)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "type(table2.index)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "type(table2.columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "type(table2.values)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "type(census)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "type(census.index)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "type(census.values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optional exercise\n", + "\n", + "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", + "\n", + "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'data/World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Select `tables[1]`, which is the second table on the page." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "table1 = tables[1]\n", + "table1.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "table1.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, we'll replace the long column names with more convenient abbreviations." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", + " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "for col in table1.columns:\n", + " table1[col] = pd.to_numeric(table1[col], errors='coerce')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results. Notice that we are working in millions now, not billions." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "table1.plot()\n", + "decorate(xlim=[-10000, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='Prehistoric population estimates')\n", + "plt.legend(fontsize='small');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `xlim` to zoom in on everything after Year 0." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "table1.plot()\n", + "decorate(xlim=[0, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')\n", + "plt.legend(fontsize='small');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "See if you can find a model that fits these data well from Year 0 to 1950.\n", + "\n", + "How well does your best model predict actual population growth from 1950 to the present?" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap11soln.ipynb b/colab/chap11soln.ipynb new file mode 100644 index 00000000..e75bc7e8 --- /dev/null +++ b/colab/chap11soln.ipynb @@ -0,0 +1,463 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 11\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SIR implementation\n", + "\n", + "We'll use a `State` object to represent the number (or fraction) of people in each compartment." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(S=89, I=1, R=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To convert from number of people to fractions, we divide through by the total." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "init /= sum(init)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system` creates a `System` object with the given parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an example with hypothetical values for `beta` and `gamma`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The update function takes the state during the current time step and returns the state during the next time step." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run a single time step, we call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "state = update_func(init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run a simulation by calling the update function for each time step." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: State object for final state\n", + " \"\"\"\n", + " state = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " \n", + " return state" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is the state of the system at `t_end`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", + "\n", + "Hint: what is the change in `S` between the beginning and the end of the simulation?" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using TimeSeries objects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " Add three Series objects to the System: S, I, R\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \"\"\"\n", + " S = TimeSeries()\n", + " I = TimeSeries()\n", + " R = TimeSeries()\n", + "\n", + " state = system.init\n", + " t0 = system.t0\n", + " S[t0], I[t0], R[t0] = state\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " S[t+1], I[t+1], R[t+1] = state\n", + " \n", + " return S, I, R" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "S, I, R = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then we can plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(S, I, R):\n", + " \"\"\"Plot the results of a SIR model.\n", + " \n", + " S: TimeSeries\n", + " I: TimeSeries\n", + " R: TimeSeries\n", + " \"\"\"\n", + " plot(S, '--', label='Susceptible')\n", + " plot(I, '-', label='Infected')\n", + " plot(R, ':', label='Recovered')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what they look like." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(S, I, R)\n", + "savefig('figs/chap11-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using a DataFrame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", + "\n", + "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.row[system.t0] = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run it, and what the result looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "results = run_simulation(system, update_func)\n", + "results.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can extract the results and plot them." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(results.S, results.I, results.R)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap12soln.ipynb b/colab/chap12soln.ipynb new file mode 100644 index 00000000..50a9c232 --- /dev/null +++ b/colab/chap12soln.ipynb @@ -0,0 +1,877 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 12\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code\n", + "\n", + "Here's the code from the previous notebook that we'll need." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.row[system.t0] = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an example.|" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "beta = 0.333\n", + "gamma = 0.25\n", + "system = make_system(beta, gamma)\n", + "\n", + "results = run_simulation(system, update_func)\n", + "print(beta, gamma, calc_total_infected(results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", + "\n", + "1. The fraction of students who are sick at the peak of the outbreak.\n", + "\n", + "2. The day the outbreak peaks.\n", + "\n", + "3. The fraction of students who are sick at the end of the semester.\n", + "\n", + "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", + "\n", + "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", + "\n", + " I.max()\n", + "\n", + "And the index of the largest value like this:\n", + "\n", + " I.idxmax()\n", + "\n", + "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### What if?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def add_immunization(system, fraction):\n", + " \"\"\"Immunize a fraction of the population.\n", + " \n", + " Moves the given fraction from S to R.\n", + " \n", + " system: System object\n", + " fraction: number from 0 to 1\n", + " \"\"\"\n", + " system.init.S -= fraction\n", + " system.init.R += fraction" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's start again with the system we used in the previous sections." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And run the model without immunization." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func)\n", + "calc_total_infected(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now with 10% immunization." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "system2 = make_system(beta, gamma)\n", + "add_immunization(system2, 0.1)\n", + "results2 = run_simulation(system2, update_func)\n", + "calc_total_infected(results2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "10% immunization leads to a drop in infections of 16 percentage points.\n", + "\n", + "Here's what the time series looks like for S, with and without immunization." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results.S, '-', label='No immunization')\n", + "plot(results2.S, '--', label='10% immunization')\n", + "\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Fraction susceptible')\n", + "\n", + "savefig('figs/chap12-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can sweep through a range of values for the fraction of the population who are immunized." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "immunize_array = linspace(0, 1, 11)\n", + "for fraction in immunize_array:\n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " results = run_simulation(system, update_func)\n", + " print(fraction, calc_total_infected(results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This function does the same thing and stores the results in a `Sweep` object." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_immunity(immunize_array):\n", + " \"\"\"Sweeps a range of values for immunity.\n", + " \n", + " immunize_array: array of fraction immunized\n", + " \n", + " returns: Sweep object\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for fraction in immunize_array:\n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " results = run_simulation(system, update_func)\n", + " sweep[fraction] = calc_total_infected(results)\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "immunize_array = linspace(0, 1, 21)\n", + "infected_sweep = sweep_immunity(immunize_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Fraction immunized',\n", + " ylabel='Total fraction infected',\n", + " title='Fraction infected vs. immunization rate',\n", + " legend=False)\n", + "\n", + "savefig('figs/chap12-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If 40% of the population is immunized, less than 4% of the population gets sick." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Logistic function" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", + " \"\"\"Computes the generalize logistic function.\n", + " \n", + " A: controls the lower bound\n", + " B: controls the steepness of the transition \n", + " C: not all that useful, AFAIK\n", + " M: controls the location of the transition\n", + " K: controls the upper bound\n", + " Q: shift the transition left or right\n", + " nu: affects the symmetry of the transition\n", + " \n", + " returns: float or array\n", + " \"\"\"\n", + " exponent = -B * (x - M)\n", + " denom = C + Q * exp(exponent)\n", + " return A + (K-A) / denom ** (1/nu)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following array represents the range of possible spending." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "spending = linspace(0, 1200, 21)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "\n", + "`M` is chosen so the transition happens around \\$500.\n", + "\n", + "`K` is the maximum reduction in `beta`, 20%.\n", + "\n", + "`B` is chosen by trial and error to yield a curve that seems feasible." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " \"\"\"Reduction factor as a function of spending.\n", + " \n", + " spending: dollars from 0 to 1200\n", + " \n", + " returns: fractional reduction in beta\n", + " \"\"\"\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "percent_reduction = compute_factor(spending) * 100\n", + "\n", + "plot(spending, percent_reduction)\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Percent reduction in infection rate',\n", + " title='Effect of hand washing on infection rate',\n", + " legend=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Hand washing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can model the effect of a hand-washing campaign by modifying `beta`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def add_hand_washing(system, spending):\n", + " \"\"\"Modifies system to model the effect of hand washing.\n", + " \n", + " system: System object\n", + " spending: campaign spending in USD\n", + " \"\"\"\n", + " factor = compute_factor(spending)\n", + " system.beta *= (1 - factor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's start with the same values of `beta` and `gamma` we've been using." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "beta, gamma" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can sweep different levels of campaign spending." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "spending_array = linspace(0, 1200, 13)\n", + "\n", + "for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " print(spending, system.beta, calc_total_infected(results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_hand_washing(spending_array):\n", + " \"\"\"Run simulations with a range of spending.\n", + " \n", + " spending_array: array of dollars from 0 to 1200\n", + " \n", + " returns: Sweep object\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " sweep[spending] = calc_total_infected(results)\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "spending_array = linspace(0, 1200, 20)\n", + "infected_sweep = sweep_hand_washing(spending_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Total fraction infected',\n", + " title='Effect of hand washing on total infections',\n", + " legend=False)\n", + "\n", + "savefig('figs/chap12-fig03.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's put it all together to make some public health spending decisions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "num_students = 90\n", + "budget = 1200\n", + "price_per_dose = 100\n", + "max_doses = int(budget / price_per_dose)\n", + "dose_array = linrange(max_doses, endpoint=True)\n", + "max_doses" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", + "\n", + "For each scenario, we compute the fraction of students who get sick." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " print(doses, system.init.S, system.beta, calc_total_infected(results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function wraps that loop and stores the results in a `Sweep` object." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_doses(dose_array):\n", + " \"\"\"Runs simulations with different doses and campaign spending.\n", + " \n", + " dose_array: range of values for number of vaccinations\n", + " \n", + " return: Sweep object with total number of infections \n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " sweep[doses] = calc_total_infected(results)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can compute the number of infected students for each possible allocation of the budget." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep = sweep_doses(dose_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Doses of vaccine',\n", + " ylabel='Total fraction infected',\n", + " title='Total infections vs. doses',\n", + " legend=False)\n", + "\n", + "savefig('figs/chap12-fig04.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", + "\n", + "How might you incorporate the effect of quarantine in the SIR model?" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap13ode.ipynb b/colab/chap13ode.ipynb new file mode 100644 index 00000000..28d11d48 --- /dev/null +++ b/colab/chap13ode.ipynb @@ -0,0 +1,180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 13\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= np.sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(S, I, R):\n", + " \"\"\"Plot the results of a SIR model.\n", + " \n", + " S: TimeSeries\n", + " I: TimeSeries\n", + " R: TimeSeries\n", + " \"\"\"\n", + " plot(S, '--', label='Susceptible')\n", + " plot(I, '-', label='Infected')\n", + " plot(R, ':', label='Recovered')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a slope function for the SIR model and test it with `run_ode_solver`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(0.333, 0.25)\n", + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, max_step=3)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(results.S, results.I, results.R)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap13soln.ipynb b/colab/chap13soln.ipynb new file mode 100644 index 00000000..d368dd4c --- /dev/null +++ b/colab/chap13soln.ipynb @@ -0,0 +1,517 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 13\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= np.sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(S, I, R):\n", + " \"\"\"Plot the results of a SIR model.\n", + " \n", + " S: TimeSeries\n", + " I: TimeSeries\n", + " R: TimeSeries\n", + " \"\"\"\n", + " plot(S, '--', label='Susceptible')\n", + " plot(I, '-', label='Infected')\n", + " plot(R, ':', label='Recovered')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " init, t0, t_end = system.init, system.t0, system.t_end\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t0] = init\n", + " \n", + " for t in linrange(t0, t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State (s, i, r)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (sir)\n", + " \"\"\"\n", + " beta, gamma = system.beta, system.gamma\n", + " s, i, r = state\n", + "\n", + " infected = beta * i * s \n", + " recovered = gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sweeping beta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make a range of values for `beta`, with constant `gamma`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma = 0.2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the simulation once for each value of `beta` and print total infections." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " print(system.beta, calc_total_infected(results))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wrap that loop in a function and return a `SweepSeries` object." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " \"\"\"Sweep a range of values for beta.\n", + " \n", + " beta_array: array of beta values\n", + " gamma: recovery rate\n", + " \n", + " returns: SweepSeries that maps from beta to total infected\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[system.beta] = calc_total_infected(results)\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sweep `beta` and plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep = sweep_beta(beta_array, gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "label = 'gamma = ' + str(gamma)\n", + "plot(infected_sweep, label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')\n", + "\n", + "savefig('figs/chap13-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sweeping gamma" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the same array of values for `beta`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "beta_array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now an array of values for `gamma`" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "gamma_array = [0.2, 0.4, 0.6, 0.8]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For each value of `gamma`, sweep `beta` and plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(7, 4))\n", + "\n", + "for gamma in gamma_array:\n", + " infected_sweep = sweep_beta(beta_array, gamma)\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(infected_sweep, label=label)\n", + " \n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected',\n", + " loc='upper left')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()\n", + "savefig('figs/chap13-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SweepFrame\n", + "\n", + "The following sweeps two parameters and stores the results in a `SweepFrame`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " \"\"\"Sweep a range of values for beta and gamma.\n", + " \n", + " beta_array: array of infection rates\n", + " gamma_array: array of recovery rates\n", + " \n", + " returns: SweepFrame with one row for each beta\n", + " and one column for each gamma\n", + " \"\"\"\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the `SweepFrame` look like." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we can plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "for gamma in gamma_array:\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(frame[gamma], label=label)\n", + " \n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected',\n", + " title='',\n", + " loc='upper left')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also plot one line for each value of `beta`, although there are a lot of them." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(7, 4))\n", + "\n", + "\n", + "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", + " label = 'beta = ' + str(beta)\n", + " plot(frame.row[beta], label=label)\n", + " \n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Fraction infected')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()\n", + "savefig('figs/chap13-fig03.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", + "\n", + "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "contour(frame)\n", + "\n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Contact rate (beta)',\n", + " title='Fraction infected, contour plot')\n", + "\n", + "savefig('figs/chap13-fig04.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap14soln.ipynb b/colab/chap14soln.ipynb new file mode 100644 index 00000000..c9624be2 --- /dev/null +++ b/colab/chap14soln.ipynb @@ -0,0 +1,475 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 14\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= np.sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State (s, i, r)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (sir)\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " init, t0, t_end = system.init, system.t0, system.t_end\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t0] = init\n", + " \n", + " for t in linrange(t0, t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " \"\"\"Sweep a range of values for beta.\n", + " \n", + " beta_array: array of beta values\n", + " gamma: recovery rate\n", + " \n", + " returns: SweepSeries that maps from beta to total infected\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[system.beta] = calc_total_infected(results)\n", + " return sweep" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " \"\"\"Sweep a range of values for beta and gamma.\n", + " \n", + " beta_array: array of infection rates\n", + " gamma_array: array of recovery rates\n", + " \n", + " returns: SweepFrame with one row for each beta\n", + " and one column for each gamma\n", + " \"\"\"\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Contact number" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "frame.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " print(beta, gamma, frac_infected)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_sweep_frame(frame):\n", + " \"\"\"Plot the values from a SweepFrame.\n", + " \n", + " For each (beta, gamma), compute the contact number,\n", + " beta/gamma\n", + " \n", + " frame: SweepFrame with one row per beta, one column per gamma\n", + " \"\"\"\n", + " for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " plot(beta/gamma, frac_infected, 'ro')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "plot_sweep_frame(frame)\n", + "\n", + "decorate(xlabel='Contact number (beta/gamma)',\n", + " ylabel='Fraction infected')\n", + "\n", + "savefig('figs/chap14-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", + "\n", + "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "s_inf_array = linspace(0.0001, 0.9999, 101);" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "c_array = log(s_inf_array) / (s_inf_array - 1);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`total_infected` is the change in $s$ from the beginning to the end." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "frac_infected = 1 - s_inf_array\n", + "frac_infected_series = Series(frac_infected, index=c_array);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot the analytic results and compare them to the simulations." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "plot_sweep_frame(frame)\n", + "plot(frac_infected_series, label='Analysis')\n", + "\n", + "decorate(xlabel='Contact number (c)',\n", + " ylabel='Fraction infected')\n", + "\n", + "savefig('figs/chap14-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The agreement is generally good, except for values of `c` less than 1." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", + "\n", + "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", + "\n", + "What do the results look like, and what does that imply? " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", + "\n", + "What is your best estimate of `c`?\n", + "\n", + "Hint: if you print `frac_infected_series`, you can read off the answer. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap15soln.ipynb b/colab/chap15soln.ipynb new file mode 100644 index 00000000..4e0f0cdb --- /dev/null +++ b/colab/chap15soln.ipynb @@ -0,0 +1,318 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 15\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The coffee cooling problem\n", + "\n", + "I'll use a `State` object to store the initial temperature.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(T=90)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And a `System` object to contain the system parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "coffee = System(init=init,\n", + " volume=300,\n", + " r=0.01,\n", + " T_env=22,\n", + " t_0=0,\n", + " t_end=30,\n", + " dt=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The update function implements Newton's law of cooling." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the thermal transfer model.\n", + " \n", + " state: State (temp)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (temp)\n", + " \"\"\"\n", + " r, T_env, dt = system.r, system.T_env, system.dt\n", + " \n", + " T = state.T\n", + " T += -r * (T - T_env) * dt\n", + " \n", + " return State(T=T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how it works." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "update_func(init, 0, coffee)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a version of `run_simulation` that uses `linrange` to make an array of time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " Add a TimeFrame to the System: results\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \"\"\"\n", + " init = system.init\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t_0] = init\n", + " ts = linrange(t_0, t_end, dt)\n", + " \n", + " for t in ts:\n", + " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how it works." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(coffee, update_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results.T, label='coffee')\n", + "decorate(xlabel='Time (minutes)',\n", + " ylabel='Temperature (C)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the final temperature:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "coffee.T_final = get_last_value(results.T)\n", + "T_final = get_last_value(results.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Encapsulation\n", + "\n", + "Before we go on, let's define a function to initialize `System` objects with relevant parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(T_init, r, volume, t_end):\n", + " \"\"\"Makes a System object with the given parameters.\n", + "\n", + " T_init: initial temperature in degC\n", + " r: heat transfer rate, in 1/min\n", + " volume: volume of liquid in mL\n", + " t_end: end time of simulation\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(T=T_init)\n", + " \n", + " return System(init=init,\n", + " r=r, \n", + " volume=volume,\n", + " temp=T_init,\n", + " t_0=0, \n", + " t_end=t_end, \n", + " dt=1,\n", + " T_env=22)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we use it:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, r=0.01, volume=300, t_end=30)\n", + "results = run_simulation(coffee, update_func)\n", + "T_final = get_last_value(results.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", + "\n", + "By trial and error, find a value for `r` that makes the final temperature close to 20 C." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results.T, label='milk')\n", + "decorate(xlabel='Time (minutes)',\n", + " ylabel='Temperature (C)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap16soln.ipynb b/colab/chap16soln.ipynb new file mode 100644 index 00000000..b359b505 --- /dev/null +++ b/colab/chap16soln.ipynb @@ -0,0 +1,842 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 16\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Code from previous notebooks" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the thermal transfer model.\n", + " \n", + " state: State (temp)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (temp)\n", + " \"\"\"\n", + " r, T_env, dt = system.r, system.T_env, system.dt\n", + " \n", + " T = state.T\n", + " T += -r * (T - T_env) * dt\n", + " \n", + " return State(T=T)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " Add a TimeFrame to the System: results\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \"\"\"\n", + " init = system.init\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t_0] = init\n", + " ts = linrange(t_0, t_end, dt)\n", + " \n", + " for t in ts:\n", + " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(T_init, r, volume, t_end):\n", + " \"\"\"Makes a System object with the given parameters.\n", + "\n", + " T_init: initial temperature in degC\n", + " r: heat transfer rate, in 1/min\n", + " volume: volume of liquid in mL\n", + " t_end: end time of simulation\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(T=T_init)\n", + " \n", + " return System(init=init,\n", + " r=r, \n", + " volume=volume,\n", + " temp=T_init,\n", + " t_0=0, \n", + " t_end=t_end, \n", + " dt=1,\n", + " T_env=22)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using `root_bisect`\n", + "\n", + "As a simple example, let's find the roots of this function; that is, the values of `x` that make the result 0." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def func(x):\n", + " return (x-1) * (x-2) * (x-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`modsim.py` provides `root_bisect`, which searches for a root by bisection. The first argument is the function whose roots we want. The second argument is an interval that contains a root." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_bisect(func, [0.5, 1.5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is an object that contains the root that was found and other information." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "res.root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we provide a different interval, we find a different root." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_bisect(func, [1.5, 2.5])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "res.root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the interval doesn't contain a root, the results explain the error." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_bisect(func, [4, 5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to find the value of `r` that makes the final temperature 70, so we define an \"error function\" that takes `r` as a parameter and returns the difference between the final temperature and the goal." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func1(r):\n", + " \"\"\"Runs a simulation and returns the `error`.\n", + " \n", + " r: heat transfer rate, in 1/min\n", + " \n", + " returns: difference between final temp and 70 C\n", + " \"\"\"\n", + " system = make_system(T_init=90, r=r, volume=300, t_end=30)\n", + " results = run_simulation(system, update_func)\n", + " T_final = get_last_value(results.T)\n", + " return T_final - 70" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With `r=0.01`, we end up a little too warm." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "error_func1(r=0.01)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With `r=0.02`, we end up too cold." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "error_func1(r=0.02)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The return value from `root_bisect` is an array with a single element, the estimated value of `r`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_bisect(error_func1, [0.01, 0.02])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "r_coffee = res.root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we run the simulation with the estimated value of `r`, the final temperature is 70 C, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", + "results = run_simulation(coffee, update_func)\n", + "T_final = get_last_value(results.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** When you call `root_bisect`, it calls `error_func1` several times. To see how this works, add a print statement to `error_func1` and run `root_bisect` again." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Repeat this process to estimate `r_milk`, given that it starts at 5 C and reaches 20 C after 15 minutes. \n", + "\n", + "Before you use `root_bisect`, you might want to try a few values for `r_milk` and see how close you can get by trial and error. Here's an initial guess to get you started:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "r_milk = 0.1\n", + "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=15)\n", + "results = run_simulation(milk, update_func)\n", + "T_final = get_last_value(results.T)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mixing liquids" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function takes `System` objects that represent two liquids, computes the temperature of the mixture, and returns a new `System` object that represents the mixture." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def mix(system1, system2):\n", + " \"\"\"Simulates the mixture of two liquids.\n", + " \n", + " system1: System representing coffee\n", + " system2: System representing milk\n", + " \n", + " returns: System representing the mixture\n", + " \"\"\"\n", + " assert system1.t_end == system2.t_end\n", + " \n", + " V1, V2 = system1.volume, system2.volume\n", + " T1, T2 = system1.temp, system2.temp\n", + " \n", + " V_mix = V1 + V2\n", + " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", + " \n", + " return make_system(T_init=T_mix,\n", + " r=system1.r,\n", + " volume=V_mix,\n", + " t_end=30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`mix` requires the `System` objects to have `temp` as a system variable. `make_system` initializes this variable;\n", + "the following function makes sure it gets updated when we run a simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def run_and_set(system):\n", + " \"\"\"Run a simulation and set the final temperature.\n", + " \n", + " system: System\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " results = run_simulation(system, update_func)\n", + " system.temp = get_last_value(results.T)\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mixing immediately\n", + "\n", + "Next here's what we get if we add the milk immediately." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", + "coffee.temp" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=30)\n", + "milk.temp" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "mix_first = mix(coffee, milk)\n", + "mix_first.temp" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "mix_results = run_and_set(mix_first)\n", + "mix_first.temp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mixing at the end\n", + "\n", + "First we'll see what happens if we add the milk at the end. We'll simulate the coffee and the milk separately." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "coffee_results = run_and_set(coffee)\n", + "coffee.temp" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "milk_results = run_and_set(milk)\n", + "milk.temp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "plot(coffee_results.T, label='coffee')\n", + "plot(milk_results.T, '--', label='milk')\n", + "\n", + "decorate(xlabel='Time (minutes)',\n", + " ylabel='Temperature (C)',\n", + " loc='center left')\n", + "\n", + "savefig('figs/chap16-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what happens when we mix them." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "mix_last = mix(coffee, milk)\n", + "mix_last.temp" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "mix_last.temp - mix_first.temp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function takes `t_add`, which is the time when the milk is added, and returns the final temperature." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "def run_and_mix(t_add, t_total):\n", + " \"\"\"Simulates two liquids and them mixes them at t_add.\n", + " \n", + " t_add: time in minutes\n", + " t_total: total time to simulate, min\n", + " \n", + " returns: final temperature\n", + " \"\"\"\n", + " coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=t_add)\n", + " coffee_results = run_and_set(coffee)\n", + " \n", + " milk = make_system(T_init=5, r=r_milk, volume=50, t_end=t_add)\n", + " milk_results = run_and_set(milk)\n", + " \n", + " mixture = mix(coffee, milk)\n", + " mixture.t_end = t_total - t_add\n", + " results = run_and_set(mixture)\n", + "\n", + " return mixture.temp" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can try it out with a few values." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "run_and_mix(t_add=0, t_total=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "run_and_mix(t_add=15, t_total=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "run_and_mix(t_add=30, t_total=30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then sweep a range of values for `t_add`" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "sweep = SweepSeries()\n", + "for t_add in linspace(0, 30, 11):\n", + " sweep[t_add] = run_and_mix(t_add, 30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the result looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "plot(sweep, label='final temp', color='C2')\n", + "decorate(xlabel='Time added (min)',\n", + " ylabel='Final temperature (C)')\n", + "\n", + "savefig('figs/chap16-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use the analytic result to compute temperature as a function of time. The following function is similar to `run_simulation`." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "def run_analysis(system):\n", + " \"\"\"Computes temperature using the analytic solution.\n", + " \n", + " system: System object\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " T_env, r = system.T_env, system.r\n", + " \n", + " T_init = system.init.T \n", + " ts = linspace(0, system.t_end)\n", + " \n", + " T_array = T_env + (T_init - T_env) * exp(-r * ts)\n", + " \n", + " # to be consistent with run_simulation,\n", + " # we put the array into a TimeFrame\n", + " return TimeFrame(T_array, index=ts, columns=['T'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run it. From the analysis (see `chap16sympy.ipynb`), we have the computed value of `r_coffee2`" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "r_coffee2 = 0.011610223142273859\n", + "coffee2 = make_system(T_init=90, r=r_coffee2, volume=300, t_end=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_analysis(coffee2)\n", + "T_final_analysis = get_last_value(results.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can compare to the results from simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", + "results = run_simulation(coffee, update_func)\n", + "T_final_simulation = get_last_value(results.T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "They are identical except for a small roundoff error." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "T_final_analysis - T_final_simulation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", + "\n", + "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap17soln.ipynb b/colab/chap17soln.ipynb new file mode 100644 index 00000000..834f0306 --- /dev/null +++ b/colab/chap17soln.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 17\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data\n", + "\n", + "We have data from Pacini and Bergman (1986), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122.." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('data/glucose_insulin.csv', index_col='time')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the glucose time series looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "plot(data.glucose, 'bo', label='glucose')\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the insulin time series." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "plot(data.insulin, 'go', label='insulin')\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the book, I put them in a single figure, using `subplot`" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "subplot(2, 1, 1)\n", + "plot(data.glucose, 'bo', label='glucose')\n", + "decorate(ylabel='Concentration (mg/dL)')\n", + "\n", + "subplot(2, 1, 2)\n", + "plot(data.insulin, 'go', label='insulin')\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')\n", + "\n", + "savefig('figs/chap17-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interpolation\n", + "\n", + "We have measurements of insulin concentration at discrete points in time, but we need to estimate it at intervening points. We'll use `interpolate`, which takes a `Series` and returns a function:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The return value from `interpolate` is a function." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "I = interpolate(data.insulin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use the result, `I`, to estimate the insulin level at any point in time." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "I(7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`I` can also take an array of time and return an array of estimates:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = get_first_label(data)\n", + "t_end = get_last_label(data)\n", + "ts = linrange(t_0, t_end, endpoint=True)\n", + "I(ts)\n", + "type(ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the interpolated values look like." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "plot(data.insulin, 'go', label='insulin data')\n", + "plot(ts, I(ts), color='green', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')\n", + "\n", + "savefig('figs/chap17-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** [Read the documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html) of `scipy.interpolate.interp1d`. Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Under the hood" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(interpolate)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap18soln.ipynb b/colab/chap18soln.ipynb new file mode 100644 index 00000000..e8e6df35 --- /dev/null +++ b/colab/chap18soln.ipynb @@ -0,0 +1,533 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 18\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from the previous chapter\n", + "\n", + "Read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Interpolate the insulin data." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "I = interpolate(data.insulin)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The glucose minimal model\n", + "\n", + "I'll cheat by starting with parameters that fit the data roughly; then we'll see how to improve them." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(G0 = 290,\n", + " k1 = 0.03,\n", + " k2 = 0.02,\n", + " k3 = 1e-05)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a version of `make_system` that takes the parameters and data:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " \"\"\"Makes a System object with the given parameters.\n", + " \n", + " params: sequence of G0, k1, k2, k3\n", + " data: DataFrame with `glucose` and `insulin`\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " G0, k1, k2, k3 = params\n", + " \n", + " Gb = data.glucose[0]\n", + " Ib = data.insulin[0]\n", + " I = interpolate(data.insulin)\n", + " \n", + " t_0 = get_first_label(data)\n", + " t_end = get_last_label(data)\n", + "\n", + " init = State(G=G0, X=0)\n", + " \n", + " return System(params,\n", + " init=init, Gb=Gb, Ib=Ib, I=I,\n", + " t_0=t_0, t_end=t_end, dt=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the update function." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Updates the glucose minimal model.\n", + " \n", + " state: State object\n", + " t: time in min\n", + " system: System object\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " G, X = state\n", + " k1, k2, k3 = system.k1, system.k2, system.k3 \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " dt = system.dt\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " G += dGdt * dt\n", + " X += dXdt * dt\n", + "\n", + " return State(G=G, X=X)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Before running the simulation, it is always a good idea to test the update function using the initial conditions. In this case we can veryify that the results are at least qualitatively correct." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "update_func(system.init, system.t_0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now `run_simulation` is pretty much the same as it always is." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " init = system.init\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t_0] = init\n", + " ts = linrange(t_0, t_end, dt)\n", + " \n", + " for t in ts:\n", + " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we run it." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results are in a `TimeFrame` object with one column per state variable." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following plot shows the results of the simulation along with the actual glucose data." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "subplot(2, 1, 1)\n", + "\n", + "plot(results.G, 'b-', label='simulation')\n", + "plot(data.glucose, 'bo', label='glucose data')\n", + "decorate(ylabel='Concentration (mg/dL)')\n", + "\n", + "subplot(2, 1, 2)\n", + "\n", + "plot(results.X, 'C1', label='remote insulin')\n", + "\n", + "decorate(xlabel='Time (min)', \n", + " ylabel='Concentration (arbitrary units)')\n", + "\n", + "savefig('figs/chap18-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numerical solution\n", + "\n", + "Now let's solve the differential equation numerically using `run_ode_solver`, which is an implementation of Ralston's method.\n", + "\n", + "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations.\n", + "\n", + "We don't have to do the update part; the solver does it for us." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes derivatives of the glucose minimal model.\n", + " \n", + " state: State object\n", + " t: time in min\n", + " system: System object\n", + " \n", + " returns: derivatives of G and X\n", + " \"\"\"\n", + " G, X = state\n", + " k1, k2, k3 = system.k1, system.k2, system.k3 \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " return dGdt, dXdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run the ODE solver." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "results2, details = run_ode_solver(system, slope_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`details` is a `ModSimSeries` object with information about how the solver worked." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "results2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results.G, 'C0', label='run_simulation')\n", + "plot(results2.G, 'C2--', label='run_ode_solver')\n", + "\n", + "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n", + "\n", + "savefig('figs/chap18-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The differences in `G` are less than 2%." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "diff = results.G - results2.G\n", + "percent_diff = diff / results2.G * 100\n", + "percent_diff" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "max(abs(percent_diff))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", + "\n", + "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "Here's the source code for `run_ode_solver` if you'd like to know how it works.\n", + "\n", + "Notice that `run_ode_solver` is another name for `run_ralston`, which implements [Ralston's method](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(run_ode_solver)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap20soln.ipynb b/colab/chap20soln.ipynb new file mode 100644 index 00000000..46fc858c --- /dev/null +++ b/colab/chap20soln.ipynb @@ -0,0 +1,643 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 20\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dropping pennies\n", + "\n", + "I'll start by getting the units we need from Pint." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "m = UNITS.meter\n", + "s = UNITS.second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And defining the initial state." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "init = State(y=381 * m, \n", + " v=0 * m/s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Acceleration due to gravity is about 9.8 m / s$^2$." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "g = 9.8 * m/s**2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll start with a duration of 10 seconds and step size 0.1 second." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 10 * s" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "dt = 0.1 * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we make a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, g=g, t_end=t_end, dt=dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And define the slope function." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing `g`\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " g = system.g \n", + "\n", + " dydt = v\n", + " dvdt = -g\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's always a good idea to test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "dydt, dvdt = slope_func(system.init, 0, system)\n", + "print(dydt)\n", + "print(dvdt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we're ready to call `run_ode_solver`" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's position as a function of time:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " plot(results.y, label='y')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + "\n", + "plot_position(results)\n", + "savefig('figs/chap20-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Onto the sidewalk\n", + "\n", + "To figure out when the penny hit the sidewalk, we can use `crossings`, which finds the times where a `Series` passes through a given value." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "t_crossings = crossings(results.y, 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example there should be just one crossing, the time when the penny hits the sidewalk." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "t_sidewalk = t_crossings[0] * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can compare that to the exact result. Without air resistance, we have\n", + "\n", + "$v = -g t$\n", + "\n", + "and\n", + "\n", + "$y = 381 - g t^2 / 2$\n", + "\n", + "Setting $y=0$ and solving for $t$ yields\n", + "\n", + "$t = \\sqrt{\\frac{2 y_{init}}{g}}$" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "sqrt(2 * init.y / g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The estimate is accurate to about 9 decimal places." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Events\n", + "\n", + "Instead of running the simulation until the penny goes through the sidewalk, it would be better to detect the point where the penny hits the sidewalk and stop. `run_ode_solver` provides exactly the tool we need, **event functions**.\n", + "\n", + "Here's an event function that returns the height of the penny above the sidewalk:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Return the height of the penny above the sidewalk.\n", + " \"\"\"\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we pass it to `run_ode_solver`. The solver should run until the event function returns 0, and then terminate." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The message from the solver indicates the solver stopped because the event we wanted to detect happened.\n", + "\n", + "Here are the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the `events` option, the solver returns the actual time steps it computed, which are not necessarily equally spaced. \n", + "\n", + "The last time step is when the event occurred:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "t_sidewalk = get_last_label(results) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is accurate to about 4 decimal places.\n", + "\n", + "We can also check the velocity of the penny when it hits the sidewalk:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "v_sidewalk = get_last_value(results.v)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And convert to kilometers per hour." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "km = UNITS.kilometer\n", + "h = UNITS.hour\n", + "v_sidewalk.to(km / h)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", + "\n", + "So it's a good thing there is air resistance." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "Here is the source code for `crossings` so you can see what's happening under the hood:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(crossings)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", + "\n", + "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", + "\n", + "Use `run_ode_solver` to answer this question.\n", + "\n", + "Here are some suggestions about how to proceed:\n", + "\n", + "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", + "\n", + "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", + "\n", + "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", + "\n", + "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", + "\n", + "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap21soln.ipynb b/colab/chap21soln.ipynb new file mode 100644 index 00000000..54539d62 --- /dev/null +++ b/colab/chap21soln.ipynb @@ -0,0 +1,514 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 21\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### With air resistance" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we'll add air resistance using the [drag equation](https://en.wikipedia.org/wiki/Drag_equation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll start by getting the units we'll need from Pint." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "m = UNITS.meter\n", + "s = UNITS.second\n", + "kg = UNITS.kilogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(height = 381 * m,\n", + " v_init = 0 * m / s,\n", + " g = 9.8 * m/s**2,\n", + " mass = 2.5e-3 * kg,\n", + " diameter = 19e-3 * m,\n", + " rho = 1.2 * kg/m**3,\n", + " v_term = 18 * m / s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", + "\n", + "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Makes a System object for the given conditions.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " diameter, mass = params.diameter, params.mass\n", + " g, rho = params.g, params.rho, \n", + " v_init, v_term = params.v_init, params.v_term\n", + " height = params.height\n", + " \n", + " area = np.pi * (diameter/2)**2\n", + " C_d = 2 * mass * g / (rho * area * v_term**2)\n", + " init = State(y=height, v=v_init)\n", + " t_end = 30 * s\n", + " dt = t_end / 100\n", + " \n", + " return System(params, area=area, C_d=C_d, \n", + " init=init, t_end=t_end, dt=dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a `System`" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the slope function, including acceleration due to gravity and drag." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " rho, C_d, g = system.rho, system.C_d, system.g\n", + " area, mass = system.area, system.mass\n", + " \n", + " f_drag = rho * v**2 * C_d * area / 2\n", + " a_drag = f_drag / mass\n", + " \n", + " dydt = v\n", + " dvdt = -g + a_drag\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, let's test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use the same event function as in the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Return the height of the penny above the sidewalk.\n", + " \"\"\"\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final height is close to 0, as expected.\n", + "\n", + "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", + "\n", + "We can get the flight time from `results`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "t_sidewalk = get_last_label(results) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the plot of position as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " plot(results.y)\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)\n", + "savefig('figs/chap21-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And velocity as a function of time:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + " plot(results.v, color='C1', label='v')\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. Hint: You can create a new `Params` object based on an existing one, like this:\n", + "\n", + "`params2 = Params(params, v_init=-30 * m/s)`\n", + "\n", + "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate the terminal velocity.\n", + "\n", + "1. You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", + "\n", + "2. Create a `Params` object with the system parameters. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", + "\n", + "3. Use `make_system` to create a `System` object.\n", + "\n", + "4. Call `run_ode_solver` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", + "\n", + "5. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", + "\n", + "6. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", + "\n", + "7. Use your best estimate of `v_term` to compute `C_d`.\n", + "\n", + "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap22soln.ipynb b/colab/chap22soln.ipynb new file mode 100644 index 00000000..5a41edee --- /dev/null +++ b/colab/chap22soln.ipynb @@ -0,0 +1,1238 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 22\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Vectors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `Vector` object represents a vector quantity. In the context of mechanics, vector quantities include position, velocity, acceleration, and force, all of which might be in 2D or 3D.\n", + "\n", + "You can define a `Vector` object without units, but if it represents a physical quantity, you will often want to attach units to it.\n", + "\n", + "I'll start by grabbing the units we'll need." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "m = UNITS.meter\n", + "s = UNITS.second\n", + "kg = UNITS.kilogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a two dimensional `Vector` in meters." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "A = Vector(3, 4) * m" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can access the elements by name." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "A.x" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "A.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The magnitude is the length of the vector." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "A.mag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The angle is the number of radians between the vector and the positive x axis." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "A.angle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we make another `Vector` with the same units," + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "B = Vector(1, 2) * m" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can add `Vector` objects like this" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "A + B" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And subtract like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "A - B" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can compute the Euclidean distance between two Vectors." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "A.dist(B)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the difference in angle" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "A.diff_angle(B)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we are given the magnitude and angle of a vector, what we have is the representation of the vector in polar coordinates." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "mag = A.mag\n", + "angle = A.angle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `pol2cart` to convert from polar to Cartesian coordinates, and then use the Cartesian coordinates to make a `Vector` object.\n", + "\n", + "In this example, the `Vector` we get should have the same components as `A`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "x, y = pol2cart(angle, mag)\n", + "Vector(x, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another way to represent the direction of `A` is a unit vector, which is a vector with magnitude 1 that points in the same direction as `A`. You can compute a unit vector by dividing a vector by its magnitude:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "A / A.mag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or by using the `hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "A.hat()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Create a `Vector` named `a_grav` that represents acceleration due to gravity, with x component 0 and y component $-9.8$ meters / second$^2$." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Degrees and radians\n", + "\n", + "Pint provides units to represent degree and radians." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "degree = UNITS.degree\n", + "radian = UNITS.radian" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you have an angle in degrees," + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "angle = 45 * degree\n", + "angle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can convert to radians." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "angle_rad = angle.to(radian)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If it's already in radians, `to` does the right thing." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "angle_rad.to(radian)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also convert from radians to degrees." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "angle_rad.to(degree)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an alterative, you can use `np.deg2rad`, which works with Pint quantities, but it also works with simple numbers and NumPy arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "np.deg2rad(angle)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Create a `Vector` named `a_force` that represents acceleration due to a force of 0.5 Newton applied to an object with mass 0.3 kilograms, in a direction 45 degrees up from the positive x-axis.\n", + "\n", + "Add `a_force` to `a_grav` from the previous exercise. If that addition succeeds, that means that the units are compatible. Confirm that the total acceleration seems to make sense." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Baseball" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a `Params` object that contains parameters for the flight of a baseball." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 10 * s\n", + "dt = t_end / 100\n", + "\n", + "params = Params(x = 0 * m, \n", + " y = 1 * m,\n", + " g = 9.8 * m/s**2,\n", + " mass = 145e-3 * kg,\n", + " diameter = 73e-3 * m,\n", + " rho = 1.2 * kg/m**3,\n", + " C_d = 0.33,\n", + " angle = 45 * degree,\n", + " velocity = 40 * m / s,\n", + " t_end=t_end, dt=dt)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the function that uses the `Params` object to make a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params object with angle, velocity, x, y,\n", + " diameter, duration, g, mass, rho, and C_d\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " angle, velocity = params.angle, params.velocity\n", + " \n", + " # convert angle to degrees\n", + " theta = np.deg2rad(angle)\n", + " \n", + " # compute x and y components of velocity\n", + " vx, vy = pol2cart(theta, velocity)\n", + " \n", + " # make the initial state\n", + " R = Vector(params.x, params.y)\n", + " V = Vector(vx, vy)\n", + " init = State(R=R, V=V)\n", + " \n", + " # compute area from diameter\n", + " diameter = params.diameter\n", + " area = np.pi * (diameter/2)**2\n", + " \n", + " return System(params, init=init, area=area)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we use it:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a function that computes drag force using vectors:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(V, system):\n", + " \"\"\"Computes drag force in the opposite direction of `v`.\n", + " \n", + " V: velocity Vector\n", + " system: System object with rho, C_d, area\n", + " \n", + " returns: Vector drag force\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = rho * V.mag**2 * C_d * area / 2\n", + " direction = -V.hat()\n", + " f_drag = direction * mag\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it like this." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "V_test = Vector(10, 10) * m/s\n", + "drag_force(V_test, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the slope function that computes acceleration due to gravity and drag." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes derivatives of the state variables.\n", + " \n", + " state: State (x, y, x velocity, y velocity)\n", + " t: time\n", + " system: System object with g, rho, C_d, area, mass\n", + " \n", + " returns: sequence (vx, vy, ax, ay)\n", + " \"\"\"\n", + " R, V = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " a_drag = drag_force(V, system) / mass\n", + " a_grav = Vector(0, -g)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V, A" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Always test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use an event function to stop the simulation when the ball hits the ground:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Stop when the y coordinate is 0.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: y coordinate\n", + " \"\"\"\n", + " R, V = state\n", + " return R.y" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "event_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can call `run_ode_solver`" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final label tells us the flight time." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "flight_time = get_last_label(results) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final value of `x` tells us the how far the ball landed from home plate:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "R_final = get_last_value(results.R)\n", + "x_dist = R_final.x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing the results\n", + "\n", + "The simplest way to visualize the results is to plot x and y as functions of time." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "xs = results.R.extract('x')\n", + "ys = results.R.extract('y')\n", + "\n", + "xs.plot()\n", + "ys.plot()\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + "\n", + "savefig('figs/chap22-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the velocities the same way." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "vx = results.V.extract('x')\n", + "vy = results.V.extract('y')\n", + "\n", + "vx.plot(label='vx')\n", + "vy.plot(label='vy')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The x velocity slows down due to drag.\n", + "\n", + "The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall.\n", + "\n", + "Another way to visualize the results is to plot y versus x. The result is the trajectory of the ball through its plane of motion." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_trajectory(results):\n", + " xs = results.R.extract('x')\n", + " ys = results.R.extract('y')\n", + " plot(xs, ys, color='C2', label='trajectory')\n", + "\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + "\n", + "plot_trajectory(results)\n", + "savefig('figs/chap22-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Animation\n", + "\n", + "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", + "\n", + "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", + "\n", + "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "xs = results.R.extract('x')\n", + "ys = results.R.extract('y')\n", + "\n", + "def draw_func(state, t):\n", + " set_xlim(xs)\n", + " set_ylim(ys)\n", + " x, y = state.R\n", + " plot(x, y, 'bo')\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Delete the lines that set the x and y axes (or [comment them out](https://en.wiktionary.org/wiki/comment_out)) and see what the animation does." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "`Vector` is a function that returns a `ModSimVector` object." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "V = Vector(3, 4)\n", + "type(V)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A `ModSimVector` is a specialized kind of Pint `Quantity`." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "isinstance(V, Quantity)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There's one gotcha you might run into with Vectors and Quantities. If you multiply a `ModSimVector` and a `Quantity`, you get a `ModSimVector`:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "V1 = V * m" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "type(V1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But if you multiply a `Quantity` and a `Vector`, you get a `Quantity`:" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "V2 = m * V" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "type(V2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With a `ModSimVector` you can get the coordinates using dot notation, as well as `mag`, `mag2`, and `angle`:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "V1.x, V1.y, V1.mag, V1.angle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With a `Quantity`, you can't. But you can use indexing to get the coordinates:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "V2[0], V2[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And you can use vector functions to get the magnitude and angle." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "vector_mag(V2), vector_angle(V2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And often you can avoid the whole issue by doing the multiplication with the `ModSimVector` on the left." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system_no_drag = System(system, C_d=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system2 = System(system, rho=1.0*kg/m**3)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", + "\n", + "\n", + "\n", + "\n", + "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "baseball_drag = pd.read_csv('data/baseball_drag.csv')\n", + "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n", + "mps = mph.to(m/s)\n", + "baseball_drag.index = magnitude(mps)\n", + "baseball_drag.index.name = 'Velocity in meters per second'\n", + "baseball_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results. Hint: use `interpolate`." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "C_d = drag_interp(43 * m / s)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap23soln.ipynb b/colab/chap23soln.ipynb new file mode 100644 index 00000000..0eca5394 --- /dev/null +++ b/colab/chap23soln.ipynb @@ -0,0 +1,571 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 23\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Code from the previous chapter" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "m = UNITS.meter\n", + "s = UNITS.second\n", + "kg = UNITS.kilogram\n", + "degree = UNITS.degree" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 20 * s\n", + "dt = t_end / 100\n", + "\n", + "params = Params(x = 0 * m, \n", + " y = 1 * m,\n", + " g = 9.8 * m/s**2,\n", + " mass = 145e-3 * kg,\n", + " diameter = 73e-3 * m,\n", + " rho = 1.2 * kg/m**3,\n", + " C_d = 0.3,\n", + " angle = 45 * degree,\n", + " velocity = 40 * m / s,\n", + " t_end=t_end,\n", + " dt=dt)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params object with angle, velocity, x, y,\n", + " diameter, duration, g, mass, rho, and C_d\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " angle, velocity = params.angle, params.velocity\n", + " \n", + " # convert angle to degrees\n", + " theta = np.deg2rad(angle)\n", + " \n", + " # compute x and y components of velocity\n", + " vx, vy = pol2cart(theta, velocity)\n", + " \n", + " # make the initial state\n", + " R = Vector(params.x, params.y)\n", + " V = Vector(vx, vy)\n", + " init = State(R=R, V=V)\n", + " \n", + " # compute area from diameter\n", + " diameter = params.diameter\n", + " area = np.pi * (diameter/2)**2\n", + " \n", + " return System(params, init=init, area=area)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(V, system):\n", + " \"\"\"Computes drag force in the opposite direction of `V`.\n", + " \n", + " V: velocity Vector\n", + " system: System object with rho, C_d, area\n", + " \n", + " returns: Vector drag force\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = rho * V.mag**2 * C_d * area / 2\n", + " direction = -V.hat()\n", + " f_drag = direction * mag\n", + " return f_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes derivatives of the state variables.\n", + " \n", + " state: State (x, y, x velocity, y velocity)\n", + " t: time\n", + " system: System object with g, rho, C_d, area, mass\n", + " \n", + " returns: sequence (vx, vy, ax, ay)\n", + " \"\"\"\n", + " R, V = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " a_drag = drag_force(V, system) / mass\n", + " a_grav = Vector(0, -g)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V, A" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Stop when the y coordinate is 0.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: y coordinate\n", + " \"\"\"\n", + " R, V = state\n", + " return R.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Optimal launch angle\n", + "\n", + "To find the launch angle that maximizes distance from home plate, we need a function that takes launch angle and returns range." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def range_func(angle, params): \n", + " \"\"\"Computes range for a given launch angle.\n", + " \n", + " angle: launch angle in degrees\n", + " params: Params object\n", + " \n", + " returns: distance in meters\n", + " \"\"\"\n", + " params = Params(params, angle=angle)\n", + " system = make_system(params)\n", + " results, details = run_ode_solver(system, slope_func, events=event_func)\n", + " x_dist = get_last_value(results.R).x\n", + " print(angle, x_dist)\n", + " return x_dist" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's test `range_func`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "range_func(45, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And sweep through a range of angles." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "angles = linspace(20, 80, 21)\n", + "sweep = SweepSeries()\n", + "\n", + "for angle in angles:\n", + " x_dist = range_func(angle, params)\n", + " sweep[angle] = x_dist" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting the `Sweep` object, it looks like the peak is between 40 and 45 degrees." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "plot(sweep, color='C2')\n", + "decorate(xlabel='Launch angle (degree)',\n", + " ylabel='Range (m)',\n", + " title='Range as a function of launch angle',\n", + " legend=False)\n", + "\n", + "savefig('figs/chap23-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `maximize` to search for the peak efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "bounds = [0, 90] * degree\n", + "res = maximize(range_func, bounds, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`res` is an `ModSimSeries` object with detailed results:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "res" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`x` is the optimal angle and `fun` the optional range." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "optimal_angle = res.x" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "max_x_dist = res.fun" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "Read the source code for `maximize` and `minimize_scalar`, below.\n", + "\n", + "Add a print statement to `range_func` that prints `angle`. Then run `maximize` again so you can see how many times it calls `range_func` and what the arguments are." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(maximize)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "source_code(minimize_scalar)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Manny Ramirez problem\n", + "\n", + "Finally, let's solve the Manny Ramirez problem:\n", + "\n", + "*What is the minimum effort required to hit a home run in Fenway Park?*\n", + "\n", + "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its most famous features is the \"Green Monster\", which is a wall in left field that is unusually close to home plate, only 310 feet along the left field line. To compensate for the short distance, the wall is unusually high, at 37 feet.\n", + "\n", + "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", + "\n", + "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", + "\n", + "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", + "\n", + "As a first step, write a function called `height_func` that takes a launch angle and a params as parameters, simulates the flights of a baseball, and returns the height of the baseball when it reaches a point 94.5 meters (310 feet) from home plate." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Always test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function with a launch angle of 45 degrees:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now use `maximize` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With initial velocity 40 m/s and an optimal launch angle, the ball clears the Green Monster with a little room to spare.\n", + "\n", + "Which means we can get over the wall with a lower initial velocity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Finding the minimum velocity\n", + "\n", + "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 11 m, given given that it's launched at the optimal angle. And that's a job for `root_bisect`.\n", + "\n", + "Write an error function that takes a velocity and a `Params` object as parameters. It should use `maximize` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your error function before you call `root_bisect`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then use `root_bisect` to find the answer to the problem, the minimum velocity that gets the ball out of the park." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And just to check, run `error_func` with the value you found." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap24soln.ipynb b/colab/chap24soln.ipynb new file mode 100644 index 00000000..6d7e6b52 --- /dev/null +++ b/colab/chap24soln.ipynb @@ -0,0 +1,640 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 24\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Rolling paper\n", + "\n", + "We'll start by loading the units we need." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And creating a `Params` object with the system parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(Rmin = 0.02 * m,\n", + " Rmax = 0.055 * m,\n", + " L = 47 * m,\n", + " omega = 10 * radian / s,\n", + " t_end = 130 * s,\n", + " dt = 1*s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def estimate_k(params):\n", + " \"\"\"Estimates the parameter `k`.\n", + " \n", + " params: Params with Rmin, Rmax, and L\n", + " \n", + " returns: k in meters per radian\n", + " \"\"\"\n", + " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", + " \n", + " Ravg = (Rmax + Rmin) / 2\n", + " Cavg = 2 * pi * Ravg\n", + " revs = L / Cavg\n", + " rads = 2 * pi * revs\n", + " k = (Rmax - Rmin) / rads\n", + " return k" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As usual, `make_system` takes a `Params` object and returns a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params with Rmin, Rmax, and L\n", + " \n", + " returns: System with init, k, and ts\n", + " \"\"\"\n", + " init = State(theta = 0 * radian,\n", + " y = 0 * m,\n", + " r = params.Rmin)\n", + " \n", + " k = estimate_k(params)\n", + "\n", + " return System(params, init=init, k=k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "system.init" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can write a slope function based on the differential equations\n", + "\n", + "$\\omega = \\frac{d\\theta}{dt} = 10$\n", + "\n", + "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", + "\n", + "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object with theta, y, r\n", + " t: time\n", + " system: System object with r, k\n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " theta, y, r = state\n", + " k, omega = system.k, system.omega\n", + " \n", + " dydt = r * omega\n", + " drdt = k * omega\n", + " \n", + " return omega, dydt, drdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `slope_func`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll use an event function to stop when `y=L`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Detects when we've rolled length `L`.\n", + " \n", + " state: State object with theta, y, r\n", + " t: time\n", + " system: System object with L\n", + " \n", + " returns: difference between `y` and `L`\n", + " \"\"\"\n", + " theta, y, r = state\n", + " \n", + " return y - system.L" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "event_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And look at the results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final value of `y` is 47 meters, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "unrolled = get_last_value(results.y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final value of radius is `R_max`." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "radius = get_last_value(results.r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The total number of rotations is close to 200, which seems plausible." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "radians = get_last_value(results.theta) \n", + "rotations = magnitude(radians) / 2 / np.pi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The elapsed time is about 2 minutes, which is also plausible." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "t_final = get_last_label(results) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `theta`" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_theta(results):\n", + " plot(results.theta, color='C0', label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `y`" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_y(results):\n", + " plot(results.y, color='C1', label='y')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')\n", + " \n", + "plot_y(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `r`" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_r(results):\n", + " plot(results.r, color='C2', label='r')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Radius (m)')\n", + " \n", + "plot_r(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also see the relationship between `y` and `r`, which I derive analytically in the book." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "plot(results.r, results.y, color='C3')\n", + "\n", + "decorate(xlabel='Radius (m)',\n", + " ylabel='Length (m)',\n", + " legend=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the figure from the book." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_three(results):\n", + " subplot(3, 1, 1)\n", + " plot_theta(results)\n", + "\n", + " subplot(3, 1, 2)\n", + " plot_y(results)\n", + "\n", + " subplot(3, 1, 3)\n", + " plot_r(results)\n", + "\n", + "plot_three(results)\n", + "savefig('figs/chap24-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Animation\n", + "\n", + "Here's a draw function that animates the results using `matplotlib` patches." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Circle\n", + "from matplotlib.patches import Arrow\n", + "\n", + "def draw_func(state, t):\n", + " # get radius in mm\n", + " theta, y, r = state\n", + " radius = r.magnitude * 1000\n", + " \n", + " # draw a circle with\n", + " circle = Circle([0, 0], radius, fill=True)\n", + " plt.gca().add_patch(circle)\n", + " \n", + " # draw an arrow to show rotation\n", + " dx, dy = pol2cart(theta, radius)\n", + " arrow = Arrow(0, 0, dx, dy)\n", + " plt.gca().add_patch(arrow)\n", + "\n", + " # make the aspect ratio 1\n", + " plt.axis('equal')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "plot(dydt, label='dydt')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Linear velocity (m/s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", + "\n", + "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", + "\n", + "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", + "\n", + "Run the simulation and see how much faster we could finish rolling the paper." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/colab/chap25soln.ipynb b/colab/chap25soln.ipynb new file mode 100644 index 00000000..5c74611e --- /dev/null +++ b/colab/chap25soln.ipynb @@ -0,0 +1,944 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Chapter 25\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Teapots and Turntables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tables in Chinese restaurants often have a rotating tray or turntable that makes it easy for customers to share dishes. These turntables are supported by low-friction bearings that allow them to turn easily and glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", + "\n", + "Suppose I am sitting at a table with a pot of tea on the turntable directly in front of me, and the person sitting directly opposite asks me to pass the tea. I push on the edge of the turntable with 1 Newton of force until it has turned 0.5 radians, then let go. The turntable glides until it comes to a stop 1.5 radians from the starting position. How much force should I apply for a second push so the teapot glides to a stop directly opposite me?\n", + "\n", + "The following figure shows the scenario, where `F` is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, `r`, and `tau` is the resulting torque. The blue circle near the bottom is the teapot.\n", + "\n", + "![](diagrams/teapot.png)\n", + "\n", + "We'll answer this question in these steps:\n", + "\n", + "1. We'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", + "\n", + "2. We'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", + "\n", + "Our simulation will use the following parameters:\n", + "\n", + "1. The radius of the turntable is 0.5 meters, and its weight is 7 kg.\n", + "\n", + "2. The teapot weights 0.3 kg, and it sits 0.4 meters from the center of the turntable.\n", + "\n", + "As usual, I'll get units from Pint." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second\n", + "kg = UNITS.kilogram\n", + "N = UNITS.newton" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And store the parameters in a `Params` object." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(radius_disk=0.5*m,\n", + " mass_disk=7*kg,\n", + " radius_pot=0.4*m,\n", + " mass_pot=0.3*kg,\n", + " force=1*N,\n", + " torque_friction=0.2*N*m,\n", + " theta_end=0.5*radian,\n", + " t_end=20*s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system` creates the initial state, `init`, and computes the total moment of inertia for the turntable and the teapot." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", + " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", + " \n", + " init = State(theta=0*radian, omega=0*radian/s)\n", + " \n", + " I_disk = mass_disk * radius_disk**2 / 2\n", + " I_pot = mass_pot * radius_pot**2\n", + " \n", + " return System(params, init=init, I=I_disk+I_pot)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the `System` object we'll use for the first phase of the simulation, while I am pushing the turntable." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "system1 = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulation\n", + "\n", + "When I stop pushing on the turntable, the angular acceleration changes abruptly. We could implement the slope function with an `if` statement that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more accurate results if we simulate the system in two phases:\n", + "\n", + "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", + "\n", + "2. During the second phase, force is 0, and we run until `omega` is 0.\n", + "\n", + "Then we can combine the results of the two phases into a single `TimeFrame`.\n", + "\n", + "Here's the slope function we'll use:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " theta, omega = state\n", + " radius_disk, force = system.radius_disk, system.force\n", + " torque_friction, I = system.torque_friction, system.I\n", + " \n", + " torque = radius_disk * force - torque_friction\n", + " alpha = torque / I\n", + " \n", + " return omega, alpha " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we'll test the slope function before running the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system1.init, 0, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an event function that stops the simulation when `theta` reaches `theta_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func1(state, t, system):\n", + " \"\"\"Stops when theta reaches theta_end.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: difference from target\n", + " \"\"\"\n", + " theta, omega = state\n", + " return theta - system.theta_end " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "event_func1(system1.init, 0, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the first phase." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results1, details1 = run_ode_solver(system1, slope_func, events=event_func1)\n", + "details1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And look at the results." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results1.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Phase 2\n", + "\n", + "Before we run the second phase, we have to extract the final time and state of the first phase." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = results1.last_label() * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And make an initial `State` object for Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "init2 = results1.last_row()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And a new `System` object with zero force." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "system2 = System(system1, t_0=t_0, init=init2, force=0*N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an event function that stops when angular velocity is 0." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func2(state, t, system):\n", + " \"\"\"Stops when omega is 0.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: omega\n", + " \"\"\"\n", + " theta, omega = state\n", + " return omega" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "event_func2(system2.init, 0, system2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the second phase." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system2.init, system2.t_0, system2)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "results2, details2 = run_ode_solver(system2, slope_func, events=event_func2)\n", + "details2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And check the results." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "results2.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pandas provides `combine_first`, which combines `results1` and `results2`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "results = results1.combine_first(results2)\n", + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot `theta` for both phases." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_theta(results):\n", + " plot(results.theta, label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And `omega`." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_omega(results):\n", + " plot(results.omega, label='omega', color='C1')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')\n", + " \n", + "plot_omega(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "subplot(2, 1, 1)\n", + "plot_theta(results)\n", + "subplot(2, 1, 2)\n", + "plot_omega(results)\n", + "savefig('figs/chap25-fig01.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Estimating friction\n", + "\n", + "Let's take the code from the previous section and wrap it in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def run_two_phases(force, torque_friction, params):\n", + " \"\"\"Run both phases.\n", + " \n", + " force: force applied to the turntable\n", + " torque_friction: friction due to torque\n", + " params: Params object\n", + " \n", + " returns: TimeFrame of simulation results\n", + " \"\"\"\n", + " # put the specified parameters into the Params object\n", + " params = Params(params, force=force, torque_friction=torque_friction)\n", + "\n", + " # run phase 1\n", + " system1 = make_system(params)\n", + " results1, details1 = run_ode_solver(system1, slope_func, \n", + " events=event_func1)\n", + "\n", + " # get the final state from phase 1\n", + " t_0 = results1.last_label() * s\n", + " init2 = results1.last_row()\n", + " \n", + " # run phase 2\n", + " system2 = System(system1, t_0=t_0, init=init2, force=0*N)\n", + " results2, details2 = run_ode_solver(system2, slope_func, \n", + " events=event_func2)\n", + " \n", + " # combine and return the results\n", + " results = results1.combine_first(results2)\n", + " return TimeFrame(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's test it with the same parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "force = 1*N\n", + "torque_friction = 0.2*N*m\n", + "results = run_two_phases(force, torque_friction, params)\n", + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And check the results." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "theta_final = results.last_row().theta" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the error function we'll use with `root_bisect`.\n", + "\n", + "It takes a hypothetical value for `torque_friction` and returns the difference between `theta_final` and the observed duration of the first push, 1.5 radian." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func1(torque_friction, params):\n", + " \"\"\"Error function for root_scalar.\n", + " \n", + " torque_friction: hypothetical value\n", + " params: Params object\n", + " \n", + " returns: offset from target value\n", + " \"\"\"\n", + " force = 1 * N\n", + " results = run_two_phases(force, torque_friction, params)\n", + " theta_final = results.last_row().theta\n", + " print(torque_friction, theta_final)\n", + " return theta_final - 1.5 * radian" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing the error function." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "guess1 = 0.1*N*m\n", + "error_func1(guess1, params)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "guess2 = 0.3*N*m\n", + "error_func1(guess2, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And running `root_scalar`." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_bisect(error_func1, [guess1, guess2], params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is the coefficient of friction that yields a total rotation of 1.5 radian." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "torque_friction = res.root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a test run with the estimated value." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "force = 1 * N\n", + "results = run_two_phases(force, torque_friction, params)\n", + "theta_final = get_last_value(results.theta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks good." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Animation\n", + "\n", + "\n", + "Here's a draw function we can use to animate the results." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Circle\n", + "from matplotlib.patches import Arrow\n", + "\n", + "def draw_func(state, t):\n", + " theta, omega = state\n", + " \n", + " # draw a circle for the table\n", + " radius_disk = magnitude(params.radius_disk)\n", + " circle1 = Circle([0, 0], radius_disk)\n", + " plt.gca().add_patch(circle1)\n", + " \n", + " # draw a circle for the teapot\n", + " radius_pot = magnitude(params.radius_pot)\n", + " center = pol2cart(theta, radius_pot)\n", + " circle2 = Circle(center, 0.05, color='C1')\n", + " plt.gca().add_patch(circle2)\n", + "\n", + " # make the aspect ratio 1\n", + " plt.axis('equal')" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "state = results.first_row()\n", + "draw_func(state, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Exercises\n", + "\n", + "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", + "\n", + "Write an error function that takes `force` and `params` and returns the offset from the desired angle." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the error function with `force=1`" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And run `root_bisect` to find the desired force." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "force = res.root\n", + "results = run_two_phases(force, torque_friction, params)\n", + "theta_final = get_last_value(results.theta)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "remaining_angle = np.pi - 1.5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Now suppose my friend pours 0.1 kg of tea and puts the teapot back on the turntable at distance 0.3 meters from the center. If I ask for the tea back, how much force should they apply, over an arc of 0.5 radians, to make the teapot glide to a stop back in front of me? You can assume that torque due to friction is proportional to the total mass of the teapot and the turntable." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From ed53a2cd9f59ecd91a43d389c389821750204fd8 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 22 Jan 2021 15:51:48 -0500 Subject: [PATCH 009/144] Updating notebooks --- colab/chap01soln.ipynb | 17 +---------- colab/chap02soln.ipynb | 64 ++++++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/colab/chap01soln.ipynb b/colab/chap01soln.ipynb index 0dfd8650..7f892bfe 100644 --- a/colab/chap01soln.ipynb +++ b/colab/chap01soln.ipynb @@ -77,21 +77,6 @@ "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the notebooks\n", - "\n", - "The notebooks for each chapter contain the code from the chapter along with additional examples, explanatory text, and exercises. I recommend you \n", - "\n", - "1. Read the chapter first to understand the concepts and vocabulary, \n", - "2. Run the notebook to review what you learned and see it in action, and then\n", - "3. Attempt the exercises.\n", - "\n", - "If you try to work through the notebooks without reading the book, you're gonna have a bad time. The notebooks contain some explanatory text, but it is probably not enough to make sense if you have not read the book. If you are working through a notebook and you get stuck, you might want to re-read (or read!) the corresponding section of the book." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -100,7 +85,7 @@ "\n", "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", "\n", - "They also use two less common modules: Pint, which provides units, and modsim, which contains code I wrote specifically for this book.\n", + "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n", "\n", "The following cells check whether you have these modules already and tries to install them if you don't." ] diff --git a/colab/chap02soln.ipynb b/colab/chap02soln.ipynb index f6b97493..ba819318 100644 --- a/colab/chap02soln.ipynb +++ b/colab/chap02soln.ipynb @@ -4,34 +4,55 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 2\n", + "# Chapter 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", + "# check if the libraries we need are installed\n", "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ "# set the random number generator\n", - "np.random.seed(7)\n", - "\n", - "# If this cell runs successfully, it produces no output." + "np.random.seed(7)" ] }, { @@ -52,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -68,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -77,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -894,6 +915,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -909,7 +931,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, From e6a2dc83cbbcd6eb5fc1d0e85c519c00ae6f3084 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 22 Jan 2021 15:58:26 -0500 Subject: [PATCH 010/144] Updating notebooks --- colab/{chap01soln.ipynb => chap01.ipynb} | 0 colab/{chap02soln.ipynb => chap02.ipynb} | 0 colab/{chap03soln.ipynb => chap03.ipynb} | 0 colab/{chap04soln.ipynb => chap04.ipynb} | 0 colab/{chap05soln.ipynb => chap05.ipynb} | 0 colab/{chap06soln.ipynb => chap06.ipynb} | 0 colab/{chap07soln.ipynb => chap07.ipynb} | 0 colab/{chap08soln.ipynb => chap08.ipynb} | 0 colab/{chap09soln.ipynb => chap09.ipynb} | 0 colab/{chap10soln.ipynb => chap10.ipynb} | 0 colab/{chap11soln.ipynb => chap11.ipynb} | 0 colab/{chap12soln.ipynb => chap12.ipynb} | 0 colab/{chap13soln.ipynb => chap13.ipynb} | 0 colab/{chap14soln.ipynb => chap14.ipynb} | 0 colab/{chap15soln.ipynb => chap15.ipynb} | 0 colab/{chap16soln.ipynb => chap16.ipynb} | 0 colab/{chap17soln.ipynb => chap17.ipynb} | 0 colab/{chap18soln.ipynb => chap18.ipynb} | 0 colab/{chap20soln.ipynb => chap20.ipynb} | 0 colab/{chap21soln.ipynb => chap21.ipynb} | 0 colab/{chap22soln.ipynb => chap22.ipynb} | 0 colab/{chap23soln.ipynb => chap23.ipynb} | 0 colab/{chap24soln.ipynb => chap24.ipynb} | 0 colab/{chap25soln.ipynb => chap25.ipynb} | 0 24 files changed, 0 insertions(+), 0 deletions(-) rename colab/{chap01soln.ipynb => chap01.ipynb} (100%) rename colab/{chap02soln.ipynb => chap02.ipynb} (100%) rename colab/{chap03soln.ipynb => chap03.ipynb} (100%) rename colab/{chap04soln.ipynb => chap04.ipynb} (100%) rename colab/{chap05soln.ipynb => chap05.ipynb} (100%) rename colab/{chap06soln.ipynb => chap06.ipynb} (100%) rename colab/{chap07soln.ipynb => chap07.ipynb} (100%) rename colab/{chap08soln.ipynb => chap08.ipynb} (100%) rename colab/{chap09soln.ipynb => chap09.ipynb} (100%) rename colab/{chap10soln.ipynb => chap10.ipynb} (100%) rename colab/{chap11soln.ipynb => chap11.ipynb} (100%) rename colab/{chap12soln.ipynb => chap12.ipynb} (100%) rename colab/{chap13soln.ipynb => chap13.ipynb} (100%) rename colab/{chap14soln.ipynb => chap14.ipynb} (100%) rename colab/{chap15soln.ipynb => chap15.ipynb} (100%) rename colab/{chap16soln.ipynb => chap16.ipynb} (100%) rename colab/{chap17soln.ipynb => chap17.ipynb} (100%) rename colab/{chap18soln.ipynb => chap18.ipynb} (100%) rename colab/{chap20soln.ipynb => chap20.ipynb} (100%) rename colab/{chap21soln.ipynb => chap21.ipynb} (100%) rename colab/{chap22soln.ipynb => chap22.ipynb} (100%) rename colab/{chap23soln.ipynb => chap23.ipynb} (100%) rename colab/{chap24soln.ipynb => chap24.ipynb} (100%) rename colab/{chap25soln.ipynb => chap25.ipynb} (100%) diff --git a/colab/chap01soln.ipynb b/colab/chap01.ipynb similarity index 100% rename from colab/chap01soln.ipynb rename to colab/chap01.ipynb diff --git a/colab/chap02soln.ipynb b/colab/chap02.ipynb similarity index 100% rename from colab/chap02soln.ipynb rename to colab/chap02.ipynb diff --git a/colab/chap03soln.ipynb b/colab/chap03.ipynb similarity index 100% rename from colab/chap03soln.ipynb rename to colab/chap03.ipynb diff --git a/colab/chap04soln.ipynb b/colab/chap04.ipynb similarity index 100% rename from colab/chap04soln.ipynb rename to colab/chap04.ipynb diff --git a/colab/chap05soln.ipynb b/colab/chap05.ipynb similarity index 100% rename from colab/chap05soln.ipynb rename to colab/chap05.ipynb diff --git a/colab/chap06soln.ipynb b/colab/chap06.ipynb similarity index 100% rename from colab/chap06soln.ipynb rename to colab/chap06.ipynb diff --git a/colab/chap07soln.ipynb b/colab/chap07.ipynb similarity index 100% rename from colab/chap07soln.ipynb rename to colab/chap07.ipynb diff --git a/colab/chap08soln.ipynb b/colab/chap08.ipynb similarity index 100% rename from colab/chap08soln.ipynb rename to colab/chap08.ipynb diff --git a/colab/chap09soln.ipynb b/colab/chap09.ipynb similarity index 100% rename from colab/chap09soln.ipynb rename to colab/chap09.ipynb diff --git a/colab/chap10soln.ipynb b/colab/chap10.ipynb similarity index 100% rename from colab/chap10soln.ipynb rename to colab/chap10.ipynb diff --git a/colab/chap11soln.ipynb b/colab/chap11.ipynb similarity index 100% rename from colab/chap11soln.ipynb rename to colab/chap11.ipynb diff --git a/colab/chap12soln.ipynb b/colab/chap12.ipynb similarity index 100% rename from colab/chap12soln.ipynb rename to colab/chap12.ipynb diff --git a/colab/chap13soln.ipynb b/colab/chap13.ipynb similarity index 100% rename from colab/chap13soln.ipynb rename to colab/chap13.ipynb diff --git a/colab/chap14soln.ipynb b/colab/chap14.ipynb similarity index 100% rename from colab/chap14soln.ipynb rename to colab/chap14.ipynb diff --git a/colab/chap15soln.ipynb b/colab/chap15.ipynb similarity index 100% rename from colab/chap15soln.ipynb rename to colab/chap15.ipynb diff --git a/colab/chap16soln.ipynb b/colab/chap16.ipynb similarity index 100% rename from colab/chap16soln.ipynb rename to colab/chap16.ipynb diff --git a/colab/chap17soln.ipynb b/colab/chap17.ipynb similarity index 100% rename from colab/chap17soln.ipynb rename to colab/chap17.ipynb diff --git a/colab/chap18soln.ipynb b/colab/chap18.ipynb similarity index 100% rename from colab/chap18soln.ipynb rename to colab/chap18.ipynb diff --git a/colab/chap20soln.ipynb b/colab/chap20.ipynb similarity index 100% rename from colab/chap20soln.ipynb rename to colab/chap20.ipynb diff --git a/colab/chap21soln.ipynb b/colab/chap21.ipynb similarity index 100% rename from colab/chap21soln.ipynb rename to colab/chap21.ipynb diff --git a/colab/chap22soln.ipynb b/colab/chap22.ipynb similarity index 100% rename from colab/chap22soln.ipynb rename to colab/chap22.ipynb diff --git a/colab/chap23soln.ipynb b/colab/chap23.ipynb similarity index 100% rename from colab/chap23soln.ipynb rename to colab/chap23.ipynb diff --git a/colab/chap24soln.ipynb b/colab/chap24.ipynb similarity index 100% rename from colab/chap24soln.ipynb rename to colab/chap24.ipynb diff --git a/colab/chap25soln.ipynb b/colab/chap25.ipynb similarity index 100% rename from colab/chap25soln.ipynb rename to colab/chap25.ipynb From d3c34aeb4c6bb9276717901b46a3a9397f4be3f3 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 22 Jan 2021 19:29:56 -0500 Subject: [PATCH 011/144] Adding data --- data/DataOWall.csv | 867 +++++++++ data/World_population_estimates.html | 2634 ++++++++++++++++++++++++++ data/glucose_insulin.csv | 25 + 3 files changed, 3526 insertions(+) create mode 100644 data/DataOWall.csv create mode 100644 data/World_population_estimates.html create mode 100644 data/glucose_insulin.csv diff --git a/data/DataOWall.csv b/data/DataOWall.csv new file mode 100644 index 00000000..040eabf1 --- /dev/null +++ b/data/DataOWall.csv @@ -0,0 +1,867 @@ +,Q_in,Q_out,T_int,T_ext +,W/m2,W/m2,Deg C,Deg C +,Avg,Avg,Avg,Avg +2014-10-05 16:30:00,10.994,6.84,16.92,14.68 +2014-10-05 16:35:00,10.952,6.012,16.92,14.69 +2014-10-05 16:40:00,10.882,7.04,16.93,14.66 +2014-10-05 16:45:00,10.798,8.88,16.93,14.59 +2014-10-05 16:50:00,10.756,10.491,16.94,14.5 +2014-10-05 16:55:00,10.924,11.058,16.93,14.43 +2014-10-05 17:00:00,10.728,12.025,16.93,14.33 +2014-10-05 17:05:00,10.616,12.224,16.94,14.28 +2014-10-05 17:10:00,10.616,13.497,16.94,14.2 +2014-10-05 17:15:00,10.518,15.046,16.95,14.09 +2014-10-05 17:20:00,10.392,16.472,16.96,13.96 +2014-10-05 17:25:00,10.35,16.564,16.96,13.89 +2014-10-05 17:30:00,10.322,16.917,16.95,13.79 +2014-10-05 17:35:00,10.196,16.089,16.96,13.77 +2014-10-05 17:40:00,10.098,16.196,16.95,13.7 +2014-10-05 17:45:00,10.014,16.396,16.95,13.64 +2014-10-05 17:50:00,9.972,17.055,16.96,13.58 +2014-10-05 17:55:00,9.958,17.04,16.96,13.5 +2014-10-05 18:00:00,9.888,17.423,16.96,13.44 +2014-10-05 18:05:00,9.846,17.04,16.95,13.39 +2014-10-05 18:10:00,9.776,16.917,16.96,13.38 +2014-10-05 18:15:00,9.65,17.577,16.97,13.32 +2014-10-05 18:20:00,9.734,16.104,16.98,13.37 +2014-10-05 18:25:00,9.776,17.347,16.98,13.28 +2014-10-05 18:30:00,9.65,15.153,16.98,13.29 +2014-10-05 18:35:00,9.482,14.985,16.98,13.33 +2014-10-05 18:40:00,9.538,15.752,16.97,13.24 +2014-10-05 18:45:00,9.44,14.923,16.98,13.25 +2014-10-05 18:50:00,9.426,14.908,16.99,13.24 +2014-10-05 18:55:00,9.356,15.598,16.99,13.19 +2014-10-05 19:00:00,9.062,15.997,16.97,13.12 +2014-10-05 19:05:00,9.02,15.537,16.98,13.11 +2014-10-05 19:10:00,8.978,15.552,16.96,13.07 +2014-10-05 19:15:00,9.02,14.969,16.97,13.06 +2014-10-05 19:20:00,8.908,14.294,16.98,13.06 +2014-10-05 19:25:00,8.922,14.371,16.99,13.07 +2014-10-05 19:30:00,8.796,14.678,16.98,13.04 +2014-10-05 19:35:00,8.697,15.199,16.98,13 +2014-10-05 19:40:00,8.599,15.936,16.97,12.95 +2014-10-05 19:45:00,8.585,15.859,16.97,12.91 +2014-10-05 19:50:00,8.599,16.273,16.97,12.88 +2014-10-05 19:55:00,8.515,16.595,16.98,12.84 +2014-10-05 20:00:00,8.459,17.485,16.97,12.77 +2014-10-05 20:05:00,8.403,18.957,16.97,12.73 +2014-10-05 20:10:00,8.375,20.046,16.96,12.64 +2014-10-05 20:15:00,8.333,21.288,16.96,12.57 +2014-10-05 20:20:00,8.291,20.537,16.97,12.52 +2014-10-05 20:25:00,8.179,20.506,16.98,12.47 +2014-10-05 20:30:00,8.151,20.736,16.96,12.42 +2014-10-05 20:35:00,8.109,20.859,16.96,12.38 +2014-10-05 20:40:00,8.221,20.997,16.97,12.36 +2014-10-05 20:45:00,8.109,20.061,16.96,12.31 +2014-10-05 20:50:00,7.969,19.724,16.96,12.32 +2014-10-05 20:55:00,7.969,19.279,16.96,12.31 +2014-10-05 21:00:00,7.997,19.156,16.95,12.29 +2014-10-05 21:05:00,7.927,19.172,16.96,12.28 +2014-10-05 21:10:00,7.857,19.064,16.95,12.24 +2014-10-05 21:15:00,7.871,19.724,16.95,12.2 +2014-10-05 21:20:00,7.773,20.629,16.95,12.15 +2014-10-05 21:25:00,7.717,21.488,16.96,12.11 +2014-10-05 21:30:00,7.717,22.285,16.94,12.03 +2014-10-05 21:35:00,7.703,22.807,16.94,11.97 +2014-10-05 21:40:00,7.703,23.236,16.94,11.93 +2014-10-05 21:45:00,7.549,23.543,16.93,11.85 +2014-10-05 21:50:00,7.577,23.42,16.93,11.81 +2014-10-05 21:55:00,7.535,23.267,16.93,11.77 +2014-10-05 22:00:00,7.465,23.512,16.92,11.72 +2014-10-05 22:05:00,7.465,23.62,16.92,11.69 +2014-10-05 22:10:00,7.409,23.221,16.91,11.65 +2014-10-05 22:15:00,7.423,23.236,16.91,11.62 +2014-10-05 22:20:00,7.339,23.359,16.92,11.6 +2014-10-05 22:25:00,7.297,23.451,16.92,11.58 +2014-10-05 22:30:00,7.283,22.975,16.9,11.53 +2014-10-05 22:35:00,7.353,22.837,16.9,11.51 +2014-10-05 22:40:00,7.255,23.175,16.89,11.48 +2014-10-05 22:45:00,7.185,23.42,16.9,11.44 +2014-10-05 22:50:00,7.185,23.865,16.89,11.4 +2014-10-05 22:55:00,7.087,24.463,16.88,11.34 +2014-10-05 23:00:00,7.003,24.049,16.87,11.32 +2014-10-05 23:05:00,6.989,23.451,16.87,11.3 +2014-10-05 23:10:00,6.933,23.252,16.87,11.29 +2014-10-05 23:15:00,6.835,22.914,16.86,11.28 +2014-10-05 23:20:00,6.821,23.313,16.85,11.25 +2014-10-05 23:25:00,6.807,23.083,16.85,11.23 +2014-10-05 23:30:00,6.751,23.451,16.84,11.2 +2014-10-05 23:35:00,6.765,22.469,16.84,11.19 +2014-10-05 23:40:00,6.709,21.61,16.82,11.19 +2014-10-05 23:45:00,6.723,21.273,16.82,11.2 +2014-10-05 23:50:00,6.695,21.242,16.83,11.2 +2014-10-05 23:55:00,6.555,21.81,16.81,11.18 +2014-10-06 00:00:00,6.569,21.304,16.8,11.16 +2014-10-06 00:05:00,6.513,21.104,16.8,11.16 +2014-10-06 00:10:00,6.457,21.181,16.79,11.15 +2014-10-06 00:15:00,6.527,20.399,16.78,11.16 +2014-10-06 00:20:00,6.457,20.092,16.77,11.16 +2014-10-06 00:25:00,6.485,19.555,16.78,11.19 +2014-10-06 00:30:00,6.499,19.248,16.77,11.2 +2014-10-06 00:35:00,6.555,17.592,16.76,11.23 +2014-10-06 00:40:00,6.527,17.362,16.76,11.26 +2014-10-06 00:45:00,6.471,16.595,16.75,11.29 +2014-10-06 00:50:00,6.485,16.503,16.73,11.29 +2014-10-06 00:55:00,6.457,16.871,16.73,11.31 +2014-10-06 01:00:00,6.485,16.35,16.73,11.32 +2014-10-06 01:05:00,6.499,16.074,16.73,11.34 +2014-10-06 01:10:00,6.457,16.549,16.72,11.36 +2014-10-06 01:15:00,6.513,16.227,16.69,11.33 +2014-10-06 01:20:00,6.513,16.58,16.71,11.35 +2014-10-06 01:25:00,6.471,17.607,16.7,11.32 +2014-10-06 01:30:00,6.555,17.546,16.7,11.31 +2014-10-06 01:35:00,6.653,17.408,16.67,11.28 +2014-10-06 01:40:00,6.625,18.206,16.66,11.26 +2014-10-06 01:45:00,6.639,18.62,16.67,11.23 +2014-10-06 01:50:00,6.611,19.571,16.66,11.19 +2014-10-06 01:55:00,6.541,20.015,16.66,11.16 +2014-10-06 02:00:00,6.513,19.172,16.65,11.17 +2014-10-06 02:05:00,6.429,18.436,16.63,11.16 +2014-10-06 02:10:00,6.513,18.067,16.62,11.16 +2014-10-06 02:15:00,6.569,18.16,16.63,11.17 +2014-10-06 02:20:00,6.527,18.19,16.61,11.15 +2014-10-06 02:25:00,6.513,18.113,16.59,11.14 +2014-10-06 02:30:00,6.555,17.408,16.61,11.17 +2014-10-06 02:35:00,6.583,16.549,16.6,11.19 +2014-10-06 02:40:00,6.611,16.12,16.61,11.23 +2014-10-06 02:45:00,6.611,16.549,16.6,11.22 +2014-10-06 02:50:00,6.681,17.285,16.58,11.19 +2014-10-06 02:55:00,6.667,17.592,16.57,11.16 +2014-10-06 03:00:00,6.639,17.301,16.56,11.14 +2014-10-06 03:05:00,6.653,16.702,16.55,11.14 +2014-10-06 03:10:00,6.625,15.859,16.56,11.19 +2014-10-06 03:15:00,6.611,14.678,16.54,11.22 +2014-10-06 03:20:00,6.639,13.252,16.52,11.25 +2014-10-06 03:25:00,6.723,12.117,16.52,11.31 +2014-10-06 03:30:00,6.639,11.028,16.52,11.38 +2014-10-06 03:35:00,6.667,10.506,16.52,11.44 +2014-10-06 03:40:00,6.667,10.66,16.53,11.5 +2014-10-06 03:45:00,6.653,10.199,16.53,11.54 +2014-10-06 03:50:00,6.681,9.709,16.5,11.56 +2014-10-06 03:55:00,6.639,9.187,16.5,11.61 +2014-10-06 04:00:00,6.653,9.018,16.5,11.65 +2014-10-06 04:05:00,6.709,9.08,16.5,11.68 +2014-10-06 04:10:00,6.765,8.819,16.48,11.69 +2014-10-06 04:15:00,6.709,9.202,16.46,11.71 +2014-10-06 04:20:00,6.737,8.834,16.46,11.73 +2014-10-06 04:25:00,6.765,8.497,16.46,11.77 +2014-10-06 04:30:00,6.779,8.298,16.46,11.8 +2014-10-06 04:35:00,6.821,7.776,16.45,11.83 +2014-10-06 04:40:00,6.779,7.531,16.44,11.87 +2014-10-06 04:45:00,6.849,6.825,16.44,11.92 +2014-10-06 04:50:00,6.863,6.534,16.43,11.96 +2014-10-06 04:55:00,6.905,6.028,16.43,12.02 +2014-10-06 05:00:00,8.179,6.212,16.45,12.03 +2014-10-06 05:05:00,7.801,6.104,16.44,12.04 +2014-10-06 05:10:00,7.885,5.475,16.44,12.08 +2014-10-06 05:15:00,8.039,5.368,16.44,12.11 +2014-10-06 05:20:00,8.095,5.261,16.45,12.15 +2014-10-06 05:25:00,7.773,5.123,16.43,12.17 +2014-10-06 05:30:00,7.689,5.322,16.41,12.17 +2014-10-06 05:35:00,7.661,5.491,16.41,12.2 +2014-10-06 05:40:00,7.633,5.184,16.42,12.25 +2014-10-06 05:45:00,7.563,5.015,16.42,12.27 +2014-10-06 05:50:00,7.563,4.954,16.39,12.27 +2014-10-06 05:55:00,7.535,4.647,16.38,12.3 +2014-10-06 06:00:00,7.577,5.445,16.39,12.32 +2014-10-06 06:05:00,7.661,6.304,16.39,12.33 +2014-10-06 06:10:00,7.717,4.985,16.39,12.35 +2014-10-06 06:15:00,7.787,4.985,16.39,12.37 +2014-10-06 06:20:00,7.815,4.908,16.4,12.4 +2014-10-06 06:25:00,7.773,5.169,16.39,12.4 +2014-10-06 06:30:00,7.843,5.475,16.38,12.4 +2014-10-06 06:35:00,8.445,5.399,16.39,12.4 +2014-10-06 06:40:00,10.21,5.475,16.43,12.4 +2014-10-06 06:45:00,9.734,5.245,16.44,12.43 +2014-10-06 06:50:00,9.412,5.215,16.44,12.44 +2014-10-06 06:55:00,9.342,5.123,16.44,12.45 +2014-10-06 07:00:00,9.398,4.816,16.45,12.47 +2014-10-06 07:05:00,9.118,4.34,16.44,12.51 +2014-10-06 07:10:00,8.908,4.08,16.44,12.54 +2014-10-06 07:15:00,8.81,3.067,16.42,12.59 +2014-10-06 07:20:00,8.824,2.991,16.41,12.63 +2014-10-06 07:25:00,8.81,2.883,16.41,12.66 +2014-10-06 07:30:00,8.908,3.313,16.42,12.69 +2014-10-06 07:35:00,9.02,3.359,16.41,12.69 +2014-10-06 07:40:00,9.048,2.669,16.4,12.72 +2014-10-06 07:45:00,9.16,1.963,16.41,12.77 +2014-10-06 07:50:00,9.286,1.442,16.43,12.84 +2014-10-06 07:55:00,9.286,0.874,16.42,12.89 +2014-10-06 08:00:00,9.538,0.798,16.42,12.93 +2014-10-06 08:05:00,9.986,0.905,16.43,12.95 +2014-10-06 08:10:00,9.944,0.276,16.45,13 +2014-10-06 08:15:00,9.93,-0.291,16.45,13.06 +2014-10-06 08:20:00,10.098,-0.936,16.46,13.12 +2014-10-06 08:25:00,10.756,-1.641,16.47,13.18 +2014-10-06 08:30:00,10.7,-0.598,16.49,13.2 +2014-10-06 08:35:00,10.784,0.199,16.5,13.18 +2014-10-06 08:40:00,10.826,0.567,16.51,13.19 +2014-10-06 08:45:00,11.807,1.426,16.54,13.14 +2014-10-06 08:50:00,12.787,0.629,16.58,13.1 +2014-10-06 08:55:00,13.501,-0.491,16.62,13.16 +2014-10-06 09:00:00,13.992,-0.859,16.66,13.23 +2014-10-06 09:05:00,14.58,-0.675,16.7,13.29 +2014-10-06 09:10:00,14.916,-0.475,16.74,13.34 +2014-10-06 09:15:00,15.266,-0.767,16.77,13.37 +2014-10-06 09:20:00,15.406,-1.074,16.8,13.42 +2014-10-06 09:25:00,15.84,-0.644,16.84,13.44 +2014-10-06 09:30:00,15.658,1.089,16.86,13.42 +2014-10-06 09:35:00,16.064,2.27,16.89,13.38 +2014-10-06 09:40:00,17.311,2.347,16.95,13.35 +2014-10-06 09:45:00,17.871,1.626,17,13.36 +2014-10-06 09:50:00,18.571,2.224,17.05,13.39 +2014-10-06 09:55:00,18.768,0.966,17.1,13.41 +2014-10-06 10:00:00,19.342,-0.368,17.15,13.48 +2014-10-06 10:05:00,19.72,-3.451,17.19,13.57 +2014-10-06 10:10:00,20.28,-3.482,17.24,13.68 +2014-10-06 10:15:00,20.476,0.414,17.28,13.69 +2014-10-06 10:20:00,21.821,-0.583,17.37,13.71 +2014-10-06 10:25:00,22.801,-3.16,17.44,13.75 +2014-10-06 10:30:00,23.669,-3.037,17.51,13.84 +2014-10-06 10:35:00,23.992,2.853,17.59,13.85 +2014-10-06 10:40:00,23.641,5.445,17.63,13.7 +2014-10-06 10:45:00,23.81,4.049,17.66,13.61 +2014-10-06 10:50:00,25.056,4.448,17.74,13.6 +2014-10-06 10:55:00,24.79,8.16,17.8,13.55 +2014-10-06 11:00:00,24.51,9.294,17.84,13.54 +2014-10-06 11:05:00,24.482,7.362,17.87,13.49 +2014-10-06 11:10:00,24.622,8.328,17.9,13.42 +2014-10-06 11:15:00,25.378,9.218,17.96,13.31 +2014-10-06 11:20:00,24.552,10.644,17.98,13.28 +2014-10-06 11:25:00,23.347,10.138,17.97,13.24 +2014-10-06 11:30:00,22.997,5.966,17.99,13.29 +2014-10-06 11:35:00,23.165,9.402,18,13.24 +2014-10-06 11:40:00,22.773,7.546,18.01,13.26 +2014-10-06 11:45:00,22.605,7.73,18.03,13.27 +2014-10-06 11:50:00,22.577,6.028,18.04,13.22 +2014-10-06 11:55:00,22.437,7.147,18.05,13.33 +2014-10-06 12:00:00,22.871,14.141,18.06,13.2 +2014-10-06 12:05:00,23.347,12.899,18.12,13.17 +2014-10-06 12:10:00,23.571,10.844,18.16,13.13 +2014-10-06 12:15:00,24.286,14.463,18.21,12.92 +2014-10-06 12:20:00,24.034,17.393,18.23,12.75 +2014-10-06 12:25:00,24.188,16.181,18.26,12.75 +2014-10-06 12:30:00,24.244,12.347,18.29,12.88 +2014-10-06 12:35:00,24.216,9.264,18.31,12.93 +2014-10-06 12:40:00,24.3,8.604,18.34,13.02 +2014-10-06 12:45:00,24.552,6.564,18.37,13.04 +2014-10-06 12:50:00,24.51,6.043,18.4,13.09 +2014-10-06 12:55:00,24.86,4.095,18.43,13.19 +2014-10-06 13:00:00,24.594,8.313,18.45,13.12 +2014-10-06 13:05:00,24.65,8.528,18.48,13.09 +2014-10-06 13:10:00,24.58,10.414,18.51,13.05 +2014-10-06 13:15:00,24.482,9.11,18.52,13.03 +2014-10-06 13:20:00,24.58,10.23,18.54,13.02 +2014-10-06 13:25:00,24.412,12.485,18.57,12.95 +2014-10-06 13:30:00,24.314,8.543,18.58,12.99 +2014-10-06 13:35:00,24.314,6.334,18.61,13.1 +2014-10-06 13:40:00,24.37,11.702,18.63,13 +2014-10-06 13:45:00,24.622,12.301,18.65,12.93 +2014-10-06 13:50:00,24.664,10.859,18.68,12.92 +2014-10-06 13:55:00,24.916,8.067,18.72,13.02 +2014-10-06 14:00:00,24.79,7.945,18.72,13.04 +2014-10-06 14:05:00,24.804,4.571,18.76,13.14 +2014-10-06 14:10:00,24.37,6.856,18.78,13.2 +2014-10-06 14:15:00,24.51,3.344,18.78,13.26 +2014-10-06 14:20:00,24.818,5.276,18.82,13.33 +2014-10-06 14:25:00,25,7.592,18.85,13.32 +2014-10-06 14:30:00,25.21,9.939,18.88,13.2 +2014-10-06 14:35:00,25.07,9.402,18.89,13.19 +2014-10-06 14:40:00,24.93,8.589,18.91,13.21 +2014-10-06 14:45:00,24.706,10.399,18.93,13.19 +2014-10-06 14:50:00,24.202,7.837,18.92,13.18 +2014-10-06 14:55:00,24.062,11.396,18.94,13.12 +2014-10-06 15:00:00,23.95,6.38,18.95,13.23 +2014-10-06 15:05:00,23.725,4.31,18.95,13.36 +2014-10-06 15:10:00,23.501,8.037,18.97,13.34 +2014-10-06 15:15:00,23.571,7.546,18.98,13.31 +2014-10-06 15:20:00,23.445,9.632,18.99,13.28 +2014-10-06 15:25:00,23.193,10.92,18.98,13.21 +2014-10-06 15:30:00,23.123,9.08,18.98,13.2 +2014-10-06 15:35:00,22.969,8.727,19.01,13.25 +2014-10-06 15:40:00,22.829,9.08,19.01,13.25 +2014-10-06 15:45:00,22.759,9.187,19.03,13.24 +2014-10-06 15:50:00,22.703,7.132,19.02,13.29 +2014-10-06 15:55:00,22.507,6.979,19.02,13.32 +2014-10-06 16:00:00,22.549,9.954,19.05,13.26 +2014-10-06 16:05:00,23.151,7.669,19.06,13.29 +2014-10-06 16:10:00,23.305,5.874,19.1,13.37 +2014-10-06 16:15:00,23.683,5.322,19.12,13.43 +2014-10-06 16:20:00,23.221,6.365,19.12,13.45 +2014-10-06 16:25:00,22.955,9.248,19.13,13.37 +2014-10-06 16:30:00,23.179,9.08,19.16,13.35 +2014-10-06 16:35:00,22.717,8.865,19.15,13.34 +2014-10-06 16:40:00,23.838,11.656,19.18,13.26 +2014-10-06 16:45:00,23.333,11.58,19.21,13.22 +2014-10-06 16:50:00,22.899,9.479,19.21,13.23 +2014-10-06 16:55:00,23.067,9.433,19.23,13.26 +2014-10-06 17:00:00,23.109,8.466,19.24,13.26 +2014-10-06 17:05:00,22.815,8.727,19.24,13.28 +2014-10-06 17:10:00,22.997,8.589,19.26,13.27 +2014-10-06 17:15:00,22.381,8.85,19.24,13.26 +2014-10-06 17:20:00,22.157,9.003,19.25,13.27 +2014-10-06 17:25:00,22.129,10.429,19.26,13.21 +2014-10-06 17:30:00,21.905,9.877,19.26,13.21 +2014-10-06 17:35:00,22.423,9.417,19.29,13.23 +2014-10-06 17:40:00,22.017,10.782,19.29,13.21 +2014-10-06 17:45:00,21.429,11.012,19.28,13.2 +2014-10-06 17:50:00,21.849,11.181,19.3,13.19 +2014-10-06 17:55:00,21.19,12.96,19.29,13.15 +2014-10-06 18:00:00,20.644,12.807,19.28,13.11 +2014-10-06 18:05:00,20.364,13.528,19.26,13.08 +2014-10-06 18:10:00,19.09,15.721,19.22,13.01 +2014-10-06 18:15:00,18.768,16.196,19.19,12.93 +2014-10-06 18:20:00,19.496,15.736,19.22,12.92 +2014-10-06 18:25:00,18.95,14.601,19.21,12.91 +2014-10-06 18:30:00,18.852,11.457,19.19,12.95 +2014-10-06 18:35:00,18.501,8.374,19.19,13.06 +2014-10-06 18:40:00,18.207,11.104,19.16,13.08 +2014-10-06 18:45:00,18.375,15.966,19.17,12.97 +2014-10-06 18:50:00,17.115,15.169,19.13,12.92 +2014-10-06 18:55:00,17.143,13.037,19.13,12.94 +2014-10-06 19:00:00,16.793,11.334,19.11,12.97 +2014-10-06 19:05:00,16.919,11.779,19.11,12.99 +2014-10-06 19:10:00,16.877,15.015,19.1,12.91 +2014-10-06 19:15:00,16.821,16.933,19.08,12.82 +2014-10-06 19:20:00,16.246,17.193,19.07,12.78 +2014-10-06 19:25:00,16.148,16.58,19.05,12.76 +2014-10-06 19:30:00,15.812,16.426,19.04,12.73 +2014-10-06 19:35:00,16.204,16.043,19.03,12.72 +2014-10-06 19:40:00,15.98,15.061,19.03,12.74 +2014-10-06 19:45:00,15.322,13.298,19,12.77 +2014-10-06 19:50:00,15.084,12.132,18.98,12.81 +2014-10-06 19:55:00,16.176,10.061,19,12.87 +2014-10-06 20:00:00,14.93,8.972,18.98,12.94 +2014-10-06 20:05:00,13.557,8.267,18.92,12.97 +2014-10-06 20:10:00,13.039,8.742,18.88,12.99 +2014-10-06 20:15:00,12.885,9.601,18.85,13 +2014-10-06 20:20:00,12.465,10.598,18.83,13 +2014-10-06 20:25:00,12.241,12.761,18.8,12.96 +2014-10-06 20:30:00,12.101,14.525,18.78,12.9 +2014-10-06 20:35:00,11.877,14.801,18.75,12.85 +2014-10-06 20:40:00,11.765,13.39,18.73,12.87 +2014-10-06 20:45:00,11.709,12.975,18.71,12.87 +2014-10-06 20:50:00,11.415,12.546,18.7,12.89 +2014-10-06 20:55:00,11.317,11.564,18.67,12.9 +2014-10-06 21:00:00,11.12,11.794,18.65,12.92 +2014-10-06 21:05:00,11.036,13.16,18.63,12.88 +2014-10-06 21:10:00,10.854,13.298,18.61,12.87 +2014-10-06 21:15:00,10.812,13.727,18.6,12.85 +2014-10-06 21:20:00,10.756,14.801,18.58,12.81 +2014-10-06 21:25:00,10.588,16.242,18.54,12.73 +2014-10-06 21:30:00,10.518,17.178,18.53,12.67 +2014-10-06 21:35:00,10.42,17.546,18.5,12.62 +2014-10-06 21:40:00,10.322,17.577,18.48,12.58 +2014-10-06 21:45:00,10.21,17.331,18.48,12.56 +2014-10-06 21:50:00,10.126,16.61,18.46,12.56 +2014-10-06 21:55:00,9.972,15.353,18.43,12.57 +2014-10-06 22:00:00,9.958,13.39,18.43,12.62 +2014-10-06 22:05:00,9.846,12.301,18.41,12.65 +2014-10-06 22:10:00,9.818,10.936,18.39,12.71 +2014-10-06 22:15:00,9.664,10.475,18.37,12.74 +2014-10-06 22:20:00,9.608,10.583,18.36,12.79 +2014-10-06 22:25:00,9.552,11.012,18.35,12.78 +2014-10-06 22:30:00,9.496,11.166,18.33,12.79 +2014-10-06 22:35:00,9.454,10.844,18.32,12.81 +2014-10-06 22:40:00,9.342,11.273,18.31,12.82 +2014-10-06 22:45:00,9.3,11.365,18.29,12.81 +2014-10-06 22:50:00,9.3,11.748,18.28,12.8 +2014-10-06 22:55:00,9.23,12.132,18.26,12.78 +2014-10-06 23:00:00,9.118,11.856,18.26,12.79 +2014-10-06 23:05:00,9.048,12.776,18.24,12.76 +2014-10-06 23:10:00,9.02,13.052,18.23,12.74 +2014-10-06 23:15:00,8.95,12.362,18.21,12.75 +2014-10-06 23:20:00,8.908,12.132,18.2,12.76 +2014-10-06 23:25:00,8.88,12.546,18.19,12.76 +2014-10-06 23:30:00,8.824,13.957,18.17,12.71 +2014-10-06 23:35:00,8.725,13.252,18.16,12.71 +2014-10-06 23:40:00,8.697,12.837,18.14,12.7 +2014-10-06 23:45:00,8.641,13.558,18.14,12.71 +2014-10-06 23:50:00,8.599,15.69,18.12,12.64 +2014-10-06 23:55:00,8.543,19.586,18.11,12.52 +2014-10-07 00:00:00,8.543,19.156,18.1,12.44 +2014-10-07 00:05:00,8.417,13.512,18.08,12.53 +2014-10-07 00:10:00,8.431,13.512,18.08,12.58 +2014-10-07 00:15:00,8.361,14.095,18.06,12.58 +2014-10-07 00:20:00,8.319,11.902,18.05,12.62 +2014-10-07 00:25:00,8.277,12.807,18.03,12.63 +2014-10-07 00:30:00,8.235,14.433,18.03,12.59 +2014-10-07 00:35:00,8.151,14.402,18.01,12.58 +2014-10-07 00:40:00,8.165,11.81,18,12.61 +2014-10-07 00:45:00,8.193,12.684,17.99,12.63 +2014-10-07 00:50:00,8.095,12.377,17.98,12.63 +2014-10-07 00:55:00,8.109,13.865,17.96,12.61 +2014-10-07 01:00:00,8.053,16.457,17.96,12.55 +2014-10-07 01:05:00,8.039,21.242,17.94,12.39 +2014-10-07 01:10:00,7.955,22.776,17.93,12.25 +2014-10-07 01:15:00,7.927,23.466,17.92,12.16 +2014-10-07 01:20:00,7.773,23.604,17.9,12.08 +2014-10-07 01:25:00,7.787,23.528,17.89,12.02 +2014-10-07 01:30:00,7.773,23.221,17.88,11.99 +2014-10-07 01:35:00,7.773,22.868,17.86,11.95 +2014-10-07 01:40:00,7.619,22.883,17.85,11.92 +2014-10-07 01:45:00,7.591,23.129,17.83,11.87 +2014-10-07 01:50:00,7.563,23.052,17.82,11.84 +2014-10-07 01:55:00,7.549,23.267,17.81,11.8 +2014-10-07 02:00:00,7.437,23.252,17.8,11.77 +2014-10-07 02:05:00,7.465,23.589,17.79,11.73 +2014-10-07 02:10:00,7.493,23.773,17.78,11.7 +2014-10-07 02:15:00,7.381,23.221,17.76,11.66 +2014-10-07 02:20:00,7.297,23.144,17.75,11.66 +2014-10-07 02:25:00,7.255,21.442,17.74,11.67 +2014-10-07 02:30:00,7.241,21.212,17.72,11.67 +2014-10-07 02:35:00,7.241,20.399,17.72,11.69 +2014-10-07 02:40:00,7.143,19.54,17.7,11.71 +2014-10-07 02:45:00,7.143,18.098,17.69,11.75 +2014-10-07 02:50:00,7.129,15.89,17.69,11.83 +2014-10-07 02:55:00,7.157,14.678,17.67,11.9 +2014-10-07 03:00:00,7.171,14.494,17.65,11.94 +2014-10-07 03:05:00,7.213,13.972,17.66,11.99 +2014-10-07 03:10:00,7.143,13.988,17.64,12 +2014-10-07 03:15:00,7.115,13.16,17.62,12.03 +2014-10-07 03:20:00,7.087,12.025,17.62,12.1 +2014-10-07 03:25:00,7.199,16.12,17.62,12.11 +2014-10-07 03:30:00,7.115,13.957,17.6,12.08 +2014-10-07 03:35:00,7.087,15.859,17.59,12.05 +2014-10-07 03:40:00,7.059,21.38,17.58,11.9 +2014-10-07 03:45:00,7.003,20.798,17.57,11.79 +2014-10-07 03:50:00,7.017,18.742,17.56,11.75 +2014-10-07 03:55:00,6.933,20.092,17.54,11.69 +2014-10-07 04:00:00,6.919,19.985,17.54,11.68 +2014-10-07 04:05:00,6.919,21.641,17.52,11.64 +2014-10-07 04:10:00,6.863,20.368,17.51,11.66 +2014-10-07 04:15:00,6.891,21.917,17.5,11.63 +2014-10-07 04:20:00,6.807,21.304,17.49,11.61 +2014-10-07 04:25:00,6.765,24.877,17.47,11.55 +2014-10-07 04:30:00,6.751,21.212,17.46,11.56 +2014-10-07 04:35:00,6.681,17.975,17.46,11.62 +2014-10-07 04:40:00,6.737,20.399,17.44,11.53 +2014-10-07 04:45:00,6.723,22.699,17.43,11.38 +2014-10-07 04:50:00,6.863,23.252,17.42,11.31 +2014-10-07 04:55:00,6.905,24.141,17.42,11.31 +2014-10-07 05:00:00,7.563,22.546,17.43,11.31 +2014-10-07 05:05:00,7.507,19.279,17.42,11.36 +2014-10-07 05:10:00,7.675,18.282,17.42,11.42 +2014-10-07 05:15:00,7.745,18.696,17.43,11.46 +2014-10-07 05:20:00,7.577,18.39,17.41,11.43 +2014-10-07 05:25:00,7.353,16.887,17.41,11.45 +2014-10-07 05:30:00,7.241,16.212,17.39,11.52 +2014-10-07 05:35:00,7.213,18.911,17.38,11.51 +2014-10-07 05:40:00,7.129,16.288,17.37,11.54 +2014-10-07 05:45:00,7.101,17.255,17.36,11.55 +2014-10-07 05:50:00,7.073,16.825,17.34,11.54 +2014-10-07 05:55:00,7.073,17.025,17.32,11.52 +2014-10-07 06:00:00,7.003,17.914,17.32,11.53 +2014-10-07 06:05:00,6.933,19.969,17.31,11.46 +2014-10-07 06:10:00,7.003,20.613,17.3,11.4 +2014-10-07 06:15:00,6.989,20.828,17.28,11.37 +2014-10-07 06:20:00,7.129,19.448,17.29,11.38 +2014-10-07 06:25:00,7.129,16.871,17.28,11.42 +2014-10-07 06:30:00,7.129,17.117,17.26,11.42 +2014-10-07 06:35:00,7.241,21.672,17.27,11.33 +2014-10-07 06:40:00,7.717,21.58,17.26,11.23 +2014-10-07 06:45:00,8.263,23.543,17.29,11.24 +2014-10-07 06:50:00,8.137,25.215,17.28,11.1 +2014-10-07 06:55:00,8.123,25.061,17.28,11.06 +2014-10-07 07:00:00,8.151,23.926,17.28,11.08 +2014-10-07 07:05:00,7.955,24.494,17.27,11.03 +2014-10-07 07:10:00,7.885,24.479,17.26,11.01 +2014-10-07 07:15:00,7.815,21.84,17.25,11.05 +2014-10-07 07:20:00,7.787,22.27,17.24,11.07 +2014-10-07 07:25:00,7.941,21.472,17.23,11.1 +2014-10-07 07:30:00,7.899,21.043,17.23,11.12 +2014-10-07 07:35:00,8.011,19.601,17.23,11.17 +2014-10-07 07:40:00,8.137,17.5,17.22,11.26 +2014-10-07 07:45:00,8.263,21.963,17.21,11.21 +2014-10-07 07:50:00,8.473,23.727,17.21,11.08 +2014-10-07 07:55:00,8.88,19.693,17.24,11.16 +2014-10-07 08:00:00,9.062,15.736,17.24,11.3 +2014-10-07 08:05:00,9.258,18.42,17.24,11.28 +2014-10-07 08:10:00,9.356,22.025,17.25,11.24 +2014-10-07 08:15:00,9.734,19.034,17.26,11.21 +2014-10-07 08:20:00,10.63,18.88,17.29,11.29 +2014-10-07 08:25:00,11.849,15.322,17.33,11.35 +2014-10-07 08:30:00,12.395,16.488,17.37,11.41 +2014-10-07 08:35:00,12.787,10.491,17.41,11.59 +2014-10-07 08:40:00,13.109,8.788,17.43,11.78 +2014-10-07 08:45:00,13.151,15.199,17.45,11.69 +2014-10-07 08:50:00,14.3,12.454,17.5,11.71 +2014-10-07 08:55:00,16.331,12.868,17.58,11.78 +2014-10-07 09:00:00,16.317,16.043,17.63,11.72 +2014-10-07 09:05:00,16.779,15.337,17.67,11.67 +2014-10-07 09:10:00,17.283,12.423,17.71,11.78 +2014-10-07 09:15:00,18.039,9.294,17.77,11.93 +2014-10-07 09:20:00,18.599,7.914,17.82,12.04 +2014-10-07 09:25:00,19.118,4.417,17.89,12.2 +2014-10-07 09:30:00,19.72,10.337,17.92,12.17 +2014-10-07 09:35:00,20.224,8.574,17.98,12.23 +2014-10-07 09:40:00,20.434,9.202,18.02,12.27 +2014-10-07 09:45:00,21.078,7.945,18.08,12.31 +2014-10-07 09:50:00,21.471,8.129,18.12,12.37 +2014-10-07 09:55:00,21.443,9.156,18.18,12.38 +2014-10-07 10:00:00,21.232,9.739,18.2,12.39 +2014-10-07 10:05:00,21.821,9.969,18.24,12.41 +2014-10-07 10:10:00,21.989,5.414,18.28,12.51 +2014-10-07 10:15:00,22.199,6.534,18.31,12.58 +2014-10-07 10:20:00,22.395,9.248,18.35,12.56 +2014-10-07 10:25:00,22.675,8.512,18.39,12.56 +2014-10-07 10:30:00,23.039,7.791,18.42,12.59 +2014-10-07 10:35:00,23.571,6.273,18.47,12.66 +2014-10-07 10:40:00,23.501,4.448,18.5,12.75 +2014-10-07 10:45:00,23.768,2.699,18.53,12.86 +2014-10-07 10:50:00,23.95,5.706,18.57,12.85 +2014-10-07 10:55:00,24.062,6.181,18.6,12.82 +2014-10-07 11:00:00,24.174,3.911,18.63,12.89 +2014-10-07 11:05:00,24.272,2.132,18.66,13 +2014-10-07 11:10:00,24.454,-0.675,18.7,13.13 +2014-10-07 11:15:00,23.641,-0.015,18.69,13.21 +2014-10-07 11:20:00,23.852,-3.344,18.72,13.36 +2014-10-07 11:25:00,24.09,-12.439,18.74,13.69 +2014-10-07 11:30:00,24.832,-16.396,18.78,14.04 +2014-10-07 11:35:00,25.154,-10.782,18.82,14.09 +2014-10-07 11:40:00,24.286,1.472,18.83,13.84 +2014-10-07 11:45:00,24.51,1.089,18.85,13.76 +2014-10-07 11:50:00,24.678,-3.742,18.89,13.88 +2014-10-07 11:55:00,24.65,-10.153,18.9,14.1 +2014-10-07 12:00:00,24.734,-17.991,18.92,14.46 +2014-10-07 12:05:00,25.238,-17.132,18.95,14.59 +2014-10-07 12:10:00,25.616,-17.561,18.99,14.78 +2014-10-07 12:15:00,25.826,-17.009,19.02,14.94 +2014-10-07 12:20:00,25.84,4.862,19.04,14.54 +2014-10-07 12:25:00,26.078,5.905,19.08,14.26 +2014-10-07 12:30:00,25.546,2.914,19.09,14.26 +2014-10-07 12:35:00,25.504,-0.399,19.11,14.31 +2014-10-07 12:40:00,25.028,-4.294,19.1,14.4 +2014-10-07 12:45:00,24.622,-7.071,19.11,14.57 +2014-10-07 12:50:00,24.44,-5.445,19.11,14.62 +2014-10-07 12:55:00,24.328,-0.46,19.13,14.56 +2014-10-07 13:00:00,24.37,0.905,19.13,14.51 +2014-10-07 13:05:00,24.23,-4.525,19.14,14.62 +2014-10-07 13:10:00,24.594,-7.914,19.16,14.78 +2014-10-07 13:15:00,24.258,0.429,19.17,14.68 +2014-10-07 13:20:00,24.062,0.874,19.18,14.66 +2014-10-07 13:25:00,23.501,0.997,19.16,14.59 +2014-10-07 13:30:00,23.711,-2.009,19.18,14.66 +2014-10-07 13:35:00,23.922,-3.344,19.2,14.74 +2014-10-07 13:40:00,23.95,-0.199,19.21,14.7 +2014-10-07 13:45:00,24.146,-4.233,19.22,14.8 +2014-10-07 13:50:00,24.216,-2.393,19.25,14.83 +2014-10-07 13:55:00,24.552,4.202,19.27,14.68 +2014-10-07 14:00:00,23.669,-1.549,19.26,14.76 +2014-10-07 14:05:00,23.207,-2.592,19.26,14.87 +2014-10-07 14:10:00,22.969,-0.613,19.25,14.82 +2014-10-07 14:15:00,22.871,-2.914,19.24,14.86 +2014-10-07 14:20:00,22.731,-2.929,19.25,14.93 +2014-10-07 14:25:00,22.927,-0.107,19.27,14.94 +2014-10-07 14:30:00,23.529,3.451,19.29,14.82 +2014-10-07 14:35:00,23.613,1.718,19.31,14.85 +2014-10-07 14:40:00,23.908,5.844,19.36,14.76 +2014-10-07 14:45:00,23.922,5.031,19.38,14.71 +2014-10-07 14:50:00,24.202,5.982,19.4,14.65 +2014-10-07 14:55:00,24.272,1.166,19.43,14.73 +2014-10-07 15:00:00,24.258,-3.267,19.45,14.89 +2014-10-07 15:05:00,24.902,-0.092,19.48,14.9 +2014-10-07 15:10:00,24.93,1.948,19.51,14.84 +2014-10-07 15:15:00,24.202,3.543,19.5,14.78 +2014-10-07 15:20:00,24.524,3.589,19.53,14.74 +2014-10-07 15:25:00,24.538,4.663,19.54,14.7 +2014-10-07 15:30:00,24.622,5.092,19.56,14.7 +2014-10-07 15:35:00,24.23,7.991,19.57,14.67 +2014-10-07 15:40:00,24.216,12.055,19.58,14.5 +2014-10-07 15:45:00,24.034,12.362,19.59,14.38 +2014-10-07 15:50:00,23.964,14.049,19.59,14.27 +2014-10-07 15:55:00,23.669,14.678,19.62,14.21 +2014-10-07 16:00:00,23.683,14.494,19.62,14.18 +2014-10-07 16:05:00,23.725,18.221,19.62,13.96 +2014-10-07 16:10:00,23.025,14.877,19.63,14.03 +2014-10-07 16:15:00,23.053,17.684,19.64,13.89 +2014-10-07 16:20:00,22.927,21.089,19.65,13.68 +2014-10-07 16:25:00,23.025,18.865,19.67,13.61 +2014-10-07 16:30:00,22.591,15.874,19.66,13.63 +2014-10-07 16:35:00,22.087,13.819,19.64,13.63 +2014-10-07 16:40:00,22.031,16.196,19.64,13.54 +2014-10-07 16:45:00,22.115,17.791,19.65,13.45 +2014-10-07 16:50:00,21.877,20.936,19.66,13.29 +2014-10-07 16:55:00,22.283,24.11,19.68,13.14 +2014-10-07 17:00:00,21.457,19.34,19.66,13.16 +2014-10-07 17:05:00,21.457,18.742,19.66,13.15 +2014-10-07 17:10:00,21.457,20.644,19.66,13.08 +2014-10-07 17:15:00,20.924,24.724,19.66,12.97 +2014-10-07 17:20:00,20.616,25.261,19.65,12.85 +2014-10-07 17:25:00,20.168,24.601,19.63,12.79 +2014-10-07 17:30:00,19.692,24.126,19.63,12.79 +2014-10-07 17:35:00,19.44,24.356,19.61,12.71 +2014-10-07 17:40:00,19.034,24.141,19.6,12.68 +2014-10-07 17:45:00,18.796,23.988,19.58,12.62 +2014-10-07 17:50:00,18.361,24.479,19.57,12.59 +2014-10-07 17:55:00,18.151,25.123,19.56,12.52 +2014-10-07 18:00:00,17.815,24.877,19.54,12.46 +2014-10-07 18:05:00,17.745,23.88,19.52,12.43 +2014-10-07 18:10:00,17.437,24.233,19.49,12.38 +2014-10-07 18:15:00,16.681,24.294,19.46,12.33 +2014-10-07 18:20:00,16.05,24.294,19.43,12.31 +2014-10-07 18:25:00,15.756,25.905,19.4,12.23 +2014-10-07 18:30:00,15.42,25.813,19.38,12.17 +2014-10-07 18:35:00,15,25.613,19.36,12.14 +2014-10-07 18:40:00,14.79,26.089,19.33,12.07 +2014-10-07 18:45:00,15.266,25.69,19.34,12.05 +2014-10-07 18:50:00,15.252,25.414,19.33,12 +2014-10-07 18:55:00,14.692,26.733,19.31,11.97 +2014-10-07 19:00:00,14.44,27.071,19.29,11.89 +2014-10-07 19:05:00,14.356,26.012,19.28,11.87 +2014-10-07 19:10:00,14.132,25.644,19.26,11.86 +2014-10-07 19:15:00,13.964,26.074,19.25,11.82 +2014-10-07 19:20:00,13.697,24.678,19.22,11.81 +2014-10-07 19:25:00,13.599,25.859,19.21,11.79 +2014-10-07 19:30:00,13.319,26.273,19.19,11.73 +2014-10-07 19:35:00,13.249,24.693,19.17,11.72 +2014-10-07 19:40:00,13.277,25.184,19.17,11.71 +2014-10-07 19:45:00,13.249,26.089,19.16,11.65 +2014-10-07 19:50:00,13.361,25.23,19.15,11.63 +2014-10-07 19:55:00,11.891,25.138,19.11,11.62 +2014-10-07 20:00:00,11.092,25.721,19.05,11.59 +2014-10-07 20:05:00,10.672,25.521,19.01,11.57 +2014-10-07 20:10:00,10.392,25.322,18.99,11.55 +2014-10-07 20:15:00,10.126,24.939,18.95,11.54 +2014-10-07 20:20:00,9.818,24.816,18.91,11.53 +2014-10-07 20:25:00,9.594,25.46,18.89,11.5 +2014-10-07 20:30:00,9.37,25.521,18.86,11.48 +2014-10-07 20:35:00,9.062,25.46,18.82,11.44 +2014-10-07 20:40:00,8.894,24.617,18.77,11.41 +2014-10-07 20:45:00,8.711,24.172,18.75,11.43 +2014-10-07 20:50:00,8.529,24.202,18.71,11.42 +2014-10-07 20:55:00,8.389,24.34,18.69,11.41 +2014-10-07 21:00:00,8.277,24.034,18.66,11.4 +2014-10-07 21:05:00,8.067,23.988,18.63,11.39 +2014-10-07 21:10:00,7.941,23.62,18.61,11.4 +2014-10-07 21:15:00,7.801,23.834,18.58,11.38 +2014-10-07 21:20:00,7.717,23.374,18.56,11.38 +2014-10-07 21:25:00,7.661,23.313,18.53,11.36 +2014-10-07 21:30:00,7.521,23.39,18.51,11.34 +2014-10-07 21:35:00,7.367,23.083,18.49,11.34 +2014-10-07 21:40:00,7.339,23.42,18.46,11.33 +2014-10-07 21:45:00,7.199,23.773,18.44,11.31 +2014-10-07 21:50:00,7.073,24.11,18.41,11.27 +2014-10-07 21:55:00,6.933,23.896,18.39,11.26 +2014-10-07 22:00:00,6.891,23.819,18.37,11.25 +2014-10-07 22:05:00,6.779,22.393,18.34,11.27 +2014-10-07 22:10:00,6.667,22.009,18.33,11.3 +2014-10-07 22:15:00,6.625,22.071,18.3,11.29 +2014-10-07 22:20:00,6.527,21.242,18.28,11.31 +2014-10-07 22:25:00,6.429,20.383,18.26,11.35 +2014-10-07 22:30:00,6.415,20.521,18.24,11.35 +2014-10-07 22:35:00,6.345,20.46,18.22,11.36 +2014-10-07 22:40:00,6.218,20.199,18.19,11.38 +2014-10-07 22:45:00,6.176,20.613,18.17,11.38 +2014-10-07 22:50:00,6.162,21.043,18.15,11.36 +2014-10-07 22:55:00,6.148,20.966,18.13,11.35 +2014-10-07 23:00:00,6.078,20.752,18.12,11.36 +2014-10-07 23:05:00,5.98,20.353,18.09,11.36 +2014-10-07 23:10:00,5.938,20.552,18.08,11.37 +2014-10-07 23:15:00,5.924,21.258,18.05,11.34 +2014-10-07 23:20:00,5.896,21.595,18.03,11.32 +2014-10-07 23:25:00,5.868,22.316,18.02,11.3 +2014-10-07 23:30:00,5.882,22.485,18,11.27 +2014-10-07 23:35:00,5.826,22.623,17.98,11.25 +2014-10-07 23:40:00,5.77,21.825,17.96,11.24 +2014-10-07 23:45:00,5.7,21.902,17.93,11.23 +2014-10-07 23:50:00,5.644,21.641,17.92,11.23 +2014-10-07 23:55:00,5.686,20.92,17.9,11.25 +2014-10-08 00:00:00,5.7,21.104,17.89,11.25 +2014-10-08 00:05:00,5.672,20.905,17.87,11.24 +2014-10-08 00:10:00,5.63,21.81,17.84,11.21 +2014-10-08 00:15:00,5.588,21.887,17.84,11.21 +2014-10-08 00:20:00,5.546,21.887,17.81,11.2 +2014-10-08 00:25:00,5.56,21.917,17.79,11.19 +2014-10-08 00:30:00,5.574,21.733,17.78,11.17 +2014-10-08 00:35:00,5.532,21.196,17.76,11.18 +2014-10-08 00:40:00,5.546,20.828,17.74,11.19 +2014-10-08 00:45:00,5.532,21.012,17.73,11.17 +2014-10-08 00:50:00,5.49,21.181,17.71,11.17 +2014-10-08 00:55:00,5.448,21.656,17.69,11.15 +2014-10-08 01:00:00,5.392,21.38,17.67,11.14 +2014-10-08 01:05:00,5.392,21.181,17.65,11.13 +2014-10-08 01:10:00,5.392,21.38,17.63,11.12 +2014-10-08 01:15:00,5.406,20.89,17.63,11.15 +2014-10-08 01:20:00,5.434,20.69,17.61,11.13 +2014-10-08 01:25:00,5.42,20.537,17.59,11.13 +2014-10-08 01:30:00,5.42,20.69,17.57,11.11 +2014-10-08 01:35:00,5.42,20.399,17.56,11.12 +2014-10-08 01:40:00,5.42,19.785,17.54,11.13 +2014-10-08 01:45:00,5.42,19.095,17.51,11.18 +2014-10-08 01:50:00,5.42,19.601,17.51,11.16 +2014-10-08 01:55:00,5.42,20.169,17.5,11.12 +2014-10-08 02:00:00,5.42,20.245,17.48,11.13 +2014-10-08 02:05:00,5.406,19.755,17.45,11.13 +2014-10-08 02:10:00,5.406,17.776,17.45,11.18 +2014-10-08 02:15:00,5.42,15.66,17.42,11.25 +2014-10-08 02:20:00,5.392,13.405,17.41,11.32 +2014-10-08 02:25:00,5.42,10.92,17.39,11.44 +2014-10-08 02:30:00,5.378,13.727,17.39,11.46 +2014-10-08 02:35:00,5.434,13.436,17.36,11.44 +2014-10-08 02:40:00,5.406,11.641,17.35,11.53 +2014-10-08 02:45:00,5.42,17.117,17.33,11.44 +2014-10-08 02:50:00,5.42,18.267,17.32,11.36 +2014-10-08 02:55:00,5.434,18.098,17.31,11.35 +2014-10-08 03:00:00,5.42,16.518,17.29,11.35 +2014-10-08 03:05:00,5.406,16.319,17.27,11.37 +2014-10-08 03:10:00,5.434,16.104,17.26,11.37 +2014-10-08 03:15:00,5.462,16.396,17.26,11.38 +2014-10-08 03:20:00,5.462,17.485,17.24,11.36 +2014-10-08 03:25:00,5.49,17.086,17.22,11.35 +2014-10-08 03:30:00,5.532,14.08,17.2,11.42 +2014-10-08 03:35:00,5.518,12.055,17.19,11.51 +2014-10-08 03:40:00,5.518,11.856,17.18,11.56 +2014-10-08 03:45:00,5.518,12.239,17.16,11.58 +2014-10-08 03:50:00,5.588,12.224,17.15,11.61 +2014-10-08 03:55:00,5.574,11.564,17.13,11.63 +2014-10-08 04:00:00,5.63,11.457,17.12,11.67 +2014-10-08 04:05:00,5.644,11.81,17.12,11.69 +2014-10-08 04:10:00,5.672,12.071,17.11,11.71 +2014-10-08 04:15:00,5.686,10.782,17.1,11.75 +2014-10-08 04:20:00,5.644,10.399,17.08,11.78 +2014-10-08 04:25:00,5.784,9.862,17.07,11.84 +2014-10-08 04:30:00,5.798,10.399,17.05,11.83 +2014-10-08 04:35:00,5.77,11.488,17.04,11.81 +2014-10-08 04:40:00,5.77,12.853,17.03,11.79 +2014-10-08 04:45:00,5.854,11.917,17.02,11.81 +2014-10-08 04:50:00,6.639,10.337,17.04,11.86 +2014-10-08 04:55:00,6.639,9.923,17.02,11.89 +2014-10-08 05:00:00,6.849,9.34,17.03,11.94 +2014-10-08 05:05:00,7.129,10.031,17.03,11.97 +2014-10-08 05:10:00,7.143,10.844,17.01,11.94 +2014-10-08 05:15:00,6.961,10.245,17,11.97 +2014-10-08 05:20:00,6.919,8.819,16.99,12.03 +2014-10-08 05:25:00,6.933,7.699,16.98,12.08 +2014-10-08 05:30:00,6.905,7.193,16.98,12.14 +2014-10-08 05:35:00,6.947,7.623,16.98,12.18 +2014-10-08 05:40:00,7.045,6.733,16.97,12.23 +2014-10-08 05:45:00,7.129,6.273,16.97,12.29 +2014-10-08 05:50:00,7.199,6.074,16.96,12.32 +2014-10-08 05:55:00,7.269,6.396,16.96,12.34 +2014-10-08 06:00:00,7.283,6.764,16.95,12.36 +2014-10-08 06:05:00,7.227,9.54,16.94,12.32 +2014-10-08 06:10:00,7.353,10.491,16.93,12.3 +2014-10-08 06:15:00,7.493,9.264,16.93,12.29 +2014-10-08 06:20:00,7.591,8.88,16.92,12.29 +2014-10-08 06:25:00,7.815,7.684,16.92,12.34 +2014-10-08 06:30:00,7.801,6.472,16.93,12.42 +2014-10-08 06:35:00,7.843,6.212,16.92,12.45 +2014-10-08 06:40:00,7.983,6.994,16.91,12.47 +2014-10-08 06:45:00,8.039,7.377,16.91,12.52 +2014-10-08 06:50:00,8.011,6.472,16.92,12.57 +2014-10-08 06:55:00,8.067,5.92,16.91,12.59 +2014-10-08 07:00:00,8.165,4.724,16.9,12.62 +2014-10-08 07:05:00,8.193,4.601,16.9,12.66 +2014-10-08 07:10:00,8.137,4.985,16.9,12.69 +2014-10-08 07:15:00,8.375,5.291,16.9,12.7 +2014-10-08 07:20:00,8.922,4.954,16.91,12.71 +2014-10-08 07:25:00,9.146,4.049,16.92,12.75 +2014-10-08 07:30:00,9.342,5.199,16.92,12.79 +2014-10-08 07:35:00,9.846,6.365,16.95,12.78 +2014-10-08 07:40:00,10.154,4.985,16.96,12.81 +2014-10-08 07:45:00,10.518,3.451,16.98,12.86 +2014-10-08 07:50:00,10.742,2.791,17,12.92 +2014-10-08 07:55:00,10.798,2.899,17,12.95 +2014-10-08 08:00:00,10.672,3.129,17.01,12.99 +2014-10-08 08:05:00,10.882,1.472,17.03,13.05 +2014-10-08 08:10:00,11.261,-0.353,17.04,13.15 +2014-10-08 08:15:00,12.003,-1.396,17.07,13.26 +2014-10-08 08:20:00,13.263,-3.374,17.12,13.38 +2014-10-08 08:25:00,13.894,-5.031,17.16,13.53 +2014-10-08 08:30:00,14.524,-4.54,17.21,13.62 +2014-10-08 08:35:00,14.944,-4.831,17.25,13.7 +2014-10-08 08:40:00,15.672,-4.755,17.29,13.77 +2014-10-08 08:45:00,17.199,-3.497,17.36,13.79 +2014-10-08 08:50:00,16.443,-4.525,17.39,13.86 +2014-10-08 08:55:00,16.947,-4.847,17.41,13.94 +2014-10-08 09:00:00,16.891,0.368,17.44,13.86 +2014-10-08 09:05:00,17.073,4.479,17.47,13.73 +2014-10-08 09:10:00,17.507,-2.071,17.51,13.82 +2014-10-08 09:15:00,17.899,-10.015,17.54,14.14 +2014-10-08 09:20:00,18.249,-11.534,17.58,14.32 +2014-10-08 09:25:00,18.543,-9.218,17.61,14.4 +2014-10-08 09:30:00,19.006,-8.359,17.65,14.45 +2014-10-08 09:35:00,19.608,-3.267,17.71,14.37 +2014-10-08 09:40:00,19.244,-3.788,17.73,14.35 +2014-10-08 09:45:00,19.636,-4.939,17.76,14.4 +2014-10-08 09:50:00,20.364,-3.558,17.81,14.34 +2014-10-08 09:55:00,21.485,-4.816,17.88,14.37 +2014-10-08 10:00:00,22.255,-3.39,17.95,14.41 +2014-10-08 10:05:00,21.877,-4.77,17.99,14.49 +2014-10-08 10:10:00,21.751,-3.067,18.03,14.52 +2014-10-08 10:15:00,22.297,-3.819,18.07,14.57 +2014-10-08 10:20:00,22.759,-7.761,18.12,14.73 +2014-10-08 10:25:00,22.549,-4.294,18.15,14.71 +2014-10-08 10:30:00,22.871,-6.718,18.18,14.78 +2014-10-08 10:35:00,23.543,-9.908,18.24,14.9 +2014-10-08 10:40:00,23.81,-9.555,18.29,14.98 +2014-10-08 10:45:00,24.79,-12.607,18.35,15.17 +2014-10-08 10:50:00,24.286,-12.316,18.38,15.33 +2014-10-08 10:55:00,24.468,-9.479,18.42,15.34 +2014-10-08 11:00:00,24.804,-6.718,18.46,15.23 +2014-10-08 11:05:00,24.44,-7.301,18.48,15.28 +2014-10-08 11:10:00,25.14,-10.629,18.53,15.45 +2014-10-08 11:15:00,25.448,-9.264,18.57,15.53 +2014-10-08 11:20:00,25.658,-4.095,18.62,15.43 +2014-10-08 11:25:00,25.742,-6.043,18.65,15.46 +2014-10-08 11:30:00,25.266,-9.923,18.68,15.58 +2014-10-08 11:35:00,25.322,-9.724,18.7,15.69 +2014-10-08 11:40:00,25.322,-16.994,18.73,15.89 +2014-10-08 11:45:00,25.238,-9.08,18.76,15.85 +2014-10-08 11:50:00,25.07,-15.123,18.78,15.99 +2014-10-08 11:55:00,25.014,-11.058,18.8,15.99 +2014-10-08 12:00:00,25.252,-12.147,18.83,16.08 +2014-10-08 12:05:00,25.07,-3.175,18.86,15.88 +2014-10-08 12:10:00,25.154,-9.908,18.88,15.91 +2014-10-08 12:15:00,24.986,-8.175,18.91,15.94 +2014-10-08 12:20:00,25.224,-8.267,18.92,15.93 +2014-10-08 12:25:00,25.182,-4.325,18.96,15.86 +2014-10-08 12:30:00,24.65,4.939,18.96,15.51 +2014-10-08 12:35:00,24.328,7.761,18.97,15.21 +2014-10-08 12:40:00,23.978,6.856,18.97,15.04 +2014-10-08 12:45:00,23.711,8.758,18.97,14.95 +2014-10-08 12:50:00,24.16,-2.592,19,15.12 +2014-10-08 12:55:00,24.832,-2.239,19.04,15.22 +2014-10-08 13:00:00,24.944,-5.015,19.07,15.36 +2014-10-08 13:05:00,24.986,-5.767,19.09,15.51 +2014-10-08 13:10:00,25.112,-11.258,19.12,15.76 +2014-10-08 13:15:00,25.42,-15.552,19.16,15.97 +2014-10-08 13:20:00,25.252,-12.684,19.18,16.05 +2014-10-08 13:25:00,25.504,-2.96,19.22,15.85 +2014-10-08 13:30:00,25.56,-5.69,19.24,15.87 +2014-10-08 13:35:00,25.672,-18.957,19.27,16.19 +2014-10-08 13:40:00,25.658,-15.399,19.3,16.33 +2014-10-08 13:45:00,25.896,-14.647,19.33,16.37 +2014-10-08 13:50:00,25.476,-13.359,19.37,16.42 +2014-10-08 13:55:00,25.364,-14.678,19.38,16.48 +2014-10-08 14:00:00,25.672,-16.733,19.41,16.63 +2014-10-08 14:05:00,25.532,-17.485,19.44,16.73 +2014-10-08 14:10:00,25.42,-10.245,19.45,16.73 +2014-10-08 14:15:00,24.804,-6.702,19.47,16.6 +2014-10-08 14:20:00,24.748,-3.313,19.47,16.53 +2014-10-08 14:25:00,25.14,-4.218,19.51,16.66 +2014-10-08 14:30:00,25.042,-4.939,19.54,16.66 +2014-10-08 14:35:00,24.832,-9.387,19.54,16.77 +2014-10-08 14:40:00,24.692,-6.227,19.56,16.78 +2014-10-08 14:45:00,24.566,-5.936,19.57,16.73 +2014-10-08 14:50:00,24.538,-9.954,19.59,16.83 +2014-10-08 14:55:00,24.594,-6.365,19.6,16.84 +2014-10-08 15:00:00,24.65,-8.436,19.63,16.87 +2014-10-08 15:05:00,24.468,-2.469,19.65,16.81 +2014-10-08 15:10:00,24.328,1.258,19.67,16.67 +2014-10-08 15:15:00,24.216,2.393,19.67,16.54 +2014-10-08 15:20:00,25.182,0.859,19.72,16.51 +2014-10-08 15:25:00,25.378,-2.101,19.75,16.59 +2014-10-08 15:30:00,25.308,0.598,19.79,16.52 +2014-10-08 15:35:00,25.252,-0.123,19.82,16.59 +2014-10-08 15:40:00,25.28,3.804,19.83,16.39 +2014-10-08 15:45:00,25.294,-1.656,19.86,16.45 +2014-10-08 15:50:00,25.182,-4.003,19.87,16.52 +2014-10-08 15:55:00,25.098,-0.982,19.9,16.47 +2014-10-08 16:00:00,24.972,-0.092,19.92,16.42 +2014-10-08 16:05:00,24.902,0.936,19.93,16.36 +2014-10-08 16:10:00,24.524,0.752,19.94,16.33 +2014-10-08 16:15:00,24.076,1.242,19.95,16.32 +2014-10-08 16:20:00,23.529,4.693,19.94,16.2 +2014-10-08 16:25:00,23.725,2.331,19.96,16.22 diff --git a/data/World_population_estimates.html b/data/World_population_estimates.html new file mode 100644 index 00000000..8d755b74 --- /dev/null +++ b/data/World_population_estimates.html @@ -0,0 +1,2634 @@ + + + + +World population estimates - Wikipedia + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+

World population estimates

+
From Wikipedia, the free encyclopedia
+
Jump to navigation + Jump to search +

This article lists estimates of world population, as well as projections of future developments. In summary, estimates for the progression of world population since the late medieval period are in the following ranges:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
year14001500160017001800190020002100[1]
population
+(in billions)
0.35–0.400.42–0.500.50–0.580.60–0.680.89–0.981.56–1.716.06–6.15ca. 10–13
growth p.a.[2]<0%<0.12%0.15%–0.3%0.1%–0.15%0.3%–0.5%0.5%–0.6%1.3%–1.4%0.7%–0.8%
+

Estimates for pre-modern times are necessarily fraught with great uncertainties, and few of the published estimates have confidence intervals; in the absence of a straightforward means to assess the error of such estimates, a rough idea of expert consensus can be gained by comparing the values given in independent publications. Population estimates cannot be considered accurate to more than two decimal digits; for example, world population for the year 2012 was estimated at 7.02, 7.06 and 7.08 billion by the United States Census Bureau, the Population Reference Bureau and the United Nations Department of Economic and Social Affairs, respectively, corresponding to a spread of estimates of the order of 0.8%.

+

+ +

+

Deep prehistory[edit]

+ +
+
+
+
+Graph of world population over the past 12,000 years (Holocene).
+
+
+

As a general rule, the confidence of estimates on historical world population decreases for the more distant past. Robust population data only exists for the last two or three centuries. Until the late 18th century, few governments had ever performed an accurate census. In many early attempts, such as in Ancient Egypt and the Persian Empire, the focus was on counting merely a subset of the population for purposes of taxation or military service.[3] Published estimates for the 1st century ("AD 1") suggest an uncertainty of the order of 50% (estimates range between 150 and 330 million). Some estimates extend their timeline into deep prehistory, to "10,000 BC", i.e. the early Holocene, when world population estimates range roughly between one and ten million (with an uncertainty of up to an order of magnitude).[4][5]

+

Estimates for yet deeper prehistory, into the Paleolithic, are of a different nature. At this time human populations consisted entirely of non-sedentary hunter-gatherer populations, with anatomically modern humans existing alongside archaic human varieties, some of which are still ancestral to the modern human population due to interbreeding with modern humans during the Upper Paleolithic. Estimates of the size of these populations are a topic of paleoanthropology. A late human population bottleneck is postulated by some scholars at approximately 70,000 years ago, during the Toba catastrophe, when Homo sapiens population may have dropped to as low as between 1,000 and 10,000 individuals.[6][7] For the time of speciation of Homo sapiens, some 200,000 years ago, an effective population size of the order of 10,000 to 30,000 individuals has been estimated, with an actual "census population" of early Homo sapiens of roughly 100,000 to 300,000 individuals.[8]

+

The question of "how many people have ever lived?" or "what percentage of people who have ever lived are alive today" can be traced to the 1970s.[9] The more dramatic phrasing of "the living outnumber the dead" also dates to the 1970s, a time of population explosion and growing fears of human overpopulation in the wake of decolonization and before the adoption of China's One-child policy. The claim that "the living outnumber the dead" was never accurate (although it may be roughly accurate if only ancestral population is considered). Arthur C. Clarke in 2001: A Space Odyssey (1968) has the claim that "Behind every man now alive stand 30 ghosts, for that is the ratio by which the dead outnumber the living", which was roughly accurate at the time of writing.[10]

+

Estimates of the "total number of people who have ever lived" is 107.6 billion as of 2011.[11] The answer naturally depends on the definition of "people", i.e. is only Homo sapiens to be counted, or all of genus Homo, but due to the small population sizes in the Lower Paleolithic, the order of magnitude of the estimate is not affected by the choice of cut-off date substantially more than by the uncertainty of estimates throughout the Neolithic to Iron Age.[12] The estimate is more crucially affected by the estimate of infant mortalitys vs. stillborn infants, due to the very high infant mortality throughout the pre-modern period. An estimate on the "total number of people who have ever lived" as of 1995 was calculated by Haub (1995) at "about 105 billion births since the dawn of the human race" with a cut-off date at 50,000 BC (beginning of the Upper Paleolithic), and an inclusion of a high infant mortality rate throughout pre-modern history.[13]

+

Historical population[edit]

+

Before 1950[edit]

+

The following table uses astronomical year numbering for dates, negative numbers corresponding roughly to the corresponding year BC (i.e. -10000 = 10,001 BC, etc.). The table starts counting around the Late Glacial Maximum period, in which ice retreated and humans started to spread into the northern hemisphere.

+

From the beginning of the early modern period until the 20th century, world population has been characterized by a faster-than-exponential growth. For the period of Classical Antiquity to the Middle Ages, roughly 500 BC to AD 1500, there has also been a general tendency of growth (estimated at roughly a factor 4 to 5 over the 2,000 year period), but not strictily monotonic: A noticeable dip in world population is assumed due to the Black Death in the mid-14th century.[14]

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
YearPopulation Reference Bureau +

(1973–2016)[15]

+
United Nations Department of Economic and Social Affairs +

(2015)[16]

+
Maddison +

(2008)[17]

+
HYDE +

(2010)[citation needed]

+
Tanton +

(1994)[18]

+
Biraben +

(1980)[19]

+
McEvedy & +

Jones (1978)[20]

+
Thomlinson +

(1975)[21]

+
Durand +

(1974)[22]

+
Clark +

(1967)[23]

+
-100002M[24]4M1–10M
-90004M
-80005M5M5–10M
-70008M
-600011M
-500018M[24]5M5–20M
-400028M7M
-300045M14M
-200072M27M
-1000115M50M
-200150M
1300M[25]300M231M[26]188M[24]150M255M170M200M270–330M256M[27]
100195M
200202M256M190M
300205M
350254M
400209M206M190M
500210M[24]206M190M
600213M206M200M237M
700226M207M210M
800240M224M220M261M
900269M226M240M
1000310M267M295M[24]254M265M275–345M280M
1100353M301M320M
1200393M400M360M384M
1250400M416M
1300392M300M432M360M400M
1340443M378M
1400390M374M350M
1500500M438M461M[24]460M425M440–540M427M
1600556M554M[24]579M545M498M
1650(<700M)[14]545M500M516M
1700603M603M[24]600M679M610M600M641M
1750791M814M770M720M700M735–805M731M
18001,000M978M989M[24]900M954M900M900M890M
18201,042M
18501,265M1,262M1,263M1,241M1,200M1,200M
18701,276M
18751,325M
19001,656M1,650M1,563M1,654M[24]1,600M1,633M1,625M1,600M1,650–1,710M1,668M
19101,750M1,777M
19131,793M
19201,860M1,863M1,912M1,968M
19252,000M
19302,070M2,092M2,145M
19402,300M2,299M2,307M2,340M
+

1950 to present[edit]

+

For times after World War II, demographic data of some accuracy becomes available for a significant number of countries, and population estimates are often given as grand totals of numbers (typically given by country) of widely diverging accuracies. Some sources give these numbers rounded to the nearest million or the nearest thousand, while others give them without any rounding.

+

Taking these numbers at face value would be false precision; in spite of being stated to four, seven or even ten digits, they should not be interpreted as accurate to more than three digits at best (estimates by the United States Census Bureau and by the United Nations differ by about 0.5%–1.5%).

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
YearUnited States Census Bureau +

(2017)[28]

+
Population Reference Bureau +

(1973–2016)[15]

+
United Nations Department of Economic and Social Affairs +

(2015)[16]

+
Maddison +

(2008)[17]

+
HYDE +

(2007)[24]

+
Tanton +

(1994)[18]

+
Biraben +

(1980)[19]

+
McEvedy & +

Jones (1978)[20]

+
Thomlinson +

(1975)[21]

+
Durand +

(1974)[22]

+
Clark +

(1967)[23]

+
19502,557,628,6542,516,000,0002,525,149,0002,544,000,0002,527,960,0002,400,000,0002,527,000,0002,500,000,0002,400,000,0002,486,000,000
19512,594,939,8772,572,850,9172,571,663,000
19522,636,772,3062,619,292,0682,617,949,000
19532,682,053,3892,665,865,3922,665,959,000
19542,730,228,1042,713,172,0272,716,927,000
19552,782,098,9432,761,650,9812,769,074,000
19562,835,299,6732,811,572,0312,822,502,000
19572,891,349,7172,863,042,7952,879,934,000
19582,948,137,2482,916,030,1672,939,254,000
19593,000,716,5932,970,395,8142,995,909,000
19603,043,001,5083,026,002,9423,041,507,0003,042,000,000
19613,083,966,9293,082,830,2663,082,161,000
19623,140,093,2173,141,071,5313,135,787,0003,036,000,000
19633,209,827,8823,201,178,2773,201,354,000
19643,281,201,3063,263,738,8323,266,477,000
19653,350,425,7933,329,122,4793,333,138,000
19663,420,677,9233,397,475,2473,402,224,0003,288,000,000
19673,490,333,7153,468,521,7243,471,464,000
19683,562,313,8223,541,674,8913,543,086,000
19693,637,159,0503,616,108,7493,615,743,000
19703,712,697,7423,691,172,6163,691,157,0003,710,000,0003,637,000,0003,600,000,0003,600,000,000– 3,700,000,0003,632,000,000
19713,790,326,9483,766,754,3453,769,818,000
19723,866,568,6533,842,873,6113,846,499,000
19733,942,096,4423,919,182,3323,922,793,0003,923,000,0003,860,000,000
19744,016,608,8133,995,304,9223,997,677,000
19754,089,083,2334,071,020,4344,070,671,0003,900,000,0004,000,000,000
19764,160,185,0104,146,135,8504,141,445,000
19774,232,084,5784,220,816,7374,213,539,000
19784,304,105,7534,295,664,8254,286,317,000
19794,379,013,9424,371,527,8714,363,144,000
19804,451,362,7354,449,048,7984,439,529,0004,461,000,000
19814,534,410,1254,528,234,6344,514,838,000
19824,614,566,5614,608,962,4184,587,307,000
19834,695,736,7434,691,559,8404,676,388,000
19844,774,569,3914,776,392,8284,756,521,000
19854,856,462,6994,863,601,5174,837,719,0005,000,000,000
19864,940,571,2324,953,376,7104,920,968,000
19875,027,200,4925,045,315,8715,006,672,000
19885,114,557,1675,138,214,6885,093,306,000
19895,201,440,1105,230,000,0005,180,540,000
19905,288,955,9345,320,816,6675,269,029,0005,308,000,000
19915,371,585,9225,408,908,7245,351,922,000
19925,456,136,2785,494,899,5705,435,722,000
19935,538,268,3165,578,865,1095,518,127,000
19945,618,682,1325,661,086,3465,599,396,000
19955,699,202,9855,760,000,0005,741,822,4125,681,575,000
19965,779,440,5935,821,016,7505,762,212,000
19975,857,972,5435,840,000,0005,898,688,3375,842,122,000
19985,935,213,2485,975,303,6575,921,366,000
19996,012,074,9226,051,478,0105,999,622,000
20006,088,571,3836,067,000,0006,127,700,4286,076,558,0006,145,000,0005,750,000,000
20016,165,219,2476,137,000,0006,204,147,0266,154,791,000
20026,242,016,3486,215,000,0006,280,853,8176,231,704,000
20036,318,590,9566,314,000,0006,357,991,7496,308,364,000
20046,395,699,5096,396,000,0006,435,705,5956,374,056,000
20056,473,044,7326,477,000,0006,514,094,6056,462,987,000
20066,551,263,5346,555,000,0006,593,227,9776,540,214,000
20076,629,913,7596,625,000,0006,673,105,9376,616,689,000
20086,709,049,7806,705,000,0006,753,649,2286,694,832,000
20096,788,214,3946,809,972,0006,834,721,9336,764,086,000
20106,858,584,7556,892,319,0006,916,183,482
20116,935,999,4916,986,951,0006,997,998,760
20127,013,871,3137,057,075,0007,080,072,417
20137,092,128,0947,136,796,0007,162,119,434
20147,169,968,1857,238,184,0007,243,784,000
20157,247,892,7887,336,435,0007,349,472,000
20167,325,996,7097,418,151,841
+

Projections[edit]

+ +
+
+
+
+World population estimates from 1800 to 2100, based on "high", "medium" and "low" United Nations projections in 2010 (colored red, orange and green) and US Census Bureau historical estimates (in black). Actual recorded population figures (as of 2010) are colored in blue. According to the highest estimate, the world population may rise to 16 billion by 2100; according to the lowest estimate, it may decline to 6 billion.
+
+
+

As of 2015, the population of the world is projected to reach 8 billion in 2025, and 9 billion by about 2040/42. Kapitza (1996) estimated an asymptotic limit of population growth of 14 billion, 90% of which (12.6 billion) expected to be reached by 2135.[29]

+

Reasonable predictions of population development are possible for the next 30 years or so, representing the period of fertility of the children alive today. Projections of population reaching more than one generation into the future are highly speculative: Thus, the United Nations Department of Economic and Social Affairs report of 2004 projected the world population to peak at 9.22 billion in 2075 and then stabilise at a value close to 9 billion;[30] By contrast, a 2014 projection by the United Nations Population Division predicts a population close to 11 billion by 2100 without any declining trend in the foreseeable future.[31] On the other hand, a conservative scenario published in 2012 assumes that a maximum of 8 billion will be reached before 2040.[32]

+

The following table shows projections of world population for the 21st century.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
YearUnited States Census Bureau +

(2015)[28]

+
Population Reference Bureau +

(1973-2015)[15]

+
United Nations Department of Economic and Social Affairs +

(2015)[16]

+
20167,334,771,6147,432,663,280
20177,412,778,971
20187,490,427,640
20197,567,402,977
20207,643,402,1237,758,157,000
20217,718,256,830
20227,792,021,317
20237,864,725,370
20247,936,271,554
20258,006,580,5538,000,000,0008,141,661,000
20268,075,716,000
20278,143,729,466
20288,210,559,895
20298,276,190,519
20308,340,606,5908,505,000,0008,500,766,000
20318,403,880,343
20328,466,094,022
20338,527,246,205
20348,587,325,154
20358,646,304,7048,838,908,000
20368,704,239,274
20378,761,189,197
20388,817,138,785
20398,872,066,537
20408,925,949,6799,157,234,000
20418,978,822,945
20429,030,723,366
20439,081,617,002
20449,131,462,326
20459,180,225,2149,453,892,000
20469,227,935,007
20479,274,616,811
20489,320,232,984
20499,364,750,182
20509,408,141,3029,804,000,0009,725,148,000
20559,968,809,000
206010,184,290,000
206510,375,719,000
207010,547,989,000
207510,701,653,000
208010,836,635,000
208510,953,525,000
209011,055,270,000
209511,142,461,000
210011,213,317,000
+

Other, historical projections include

+
    +
  • Tanton (1994):[18] 8 billion for the year 2020;
  • +
  • McEvedy & Jones (1978):[20] 5.75 billion for the year 2000, 8.25 billion for the year 2200.
  • +
+

By world region[edit]

+
+
+
+
+UN estimates (as of 2017) for world population by continent in 2000 and in 2050 (pie chart size to scale).
+     Asia      Africa      Europe      South/Central America      North America      Oceania
+
+
+

Population estimates for world regions based on Maddison (2007),[33] in millions. The row showing total world population includes the average growth rate per year over the period separating each column from the preceding one.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
year110001500160017001820191320002030
East/Southeast Asia74 (33%)88 (33%)166 (38%)223 (40%)216 (36%)469 (45%)613 (34%)1,996 (33%)2,417 (30%)
South Asia75 (33%)75 (28%)110 (25%)135 (24%)165 (27%)216 (21%)326 (18%)1,372 (23%)2,003 (25%)
Europe[34]34 (15%)40 (15%)78 (18%)112 (20%)127 (21%)224 (21%)498 (28%)742 (13%)829 (11%)
West Asia19 (8%)20 (7%)18 (3%)21 (3%)21 (3%)25 (2%)39 (2%)237 (4%)370 (5%)
Africa17 (8%)32 (12%)47 (11%)55 (10%)61 (10%)74 (7%)125 (7%)798 (13%)1,449 (18%)
South/Central America6 (3%)11 (4%)18 (4%)9 (2%)12 (2%)22 (2%)81 (5%)520 (9%)702 (9%)
North America1 (0%)1 (0%)2 (0%)2 (0%)1 (0%)11 (1%)105 (6%)314 (5%)413 (5%)
World226267
+(+ 0.02% p.a.)
438
+(+ 0.1% p.a.)
556
+(+ 0.2% p.a.)
603
+(+ 0.1% p.a.)
1,041
+(+ 0.5% p.a.)
1,791
+(+ 0.6% p.a.)
6,062
+(+ 1.4% p.a.)
8,175
+(+ 1.0% p.a.)
+

When considering population estimates by world region, it is worth noting that population history of the indigenous peoples of the Americas before the 1492 voyage of Christopher Columbus has proven difficult to establish, with many historians arguing for an estimate of 50 million people throughout the Americas, and some estimating that populations may have reached 100 million people or more.[35] It is therefore estimated by some that populations in Mexico, Central, and South America could have reached 37 million by 1492.[36] Additionally, the population estimate of 2 million for North America for the same time period represents the low end of modern estimates, and some estimate the population to have been as high as 18 million.[37]

+

See also

+ +

References[edit]

+
+
    +
  1. ^ UN World Population Prospect 2017 gives a "median" estimate of 11.2 billion for 2100, with a "95% confidence interval" between 10 and 13 billion.
  2. +
  3. ^ range of estimates for average growth rates over the preceding century according to the data cited under #Historical_population; The average growth rate for the 14th century is negative as a consequence of the Black Death.
  4. +
  5. ^ Kuhrt, A. (1995). The Ancient Near East, c. 3000–330 BCE. Vol. 2. London: Routledge. p. 695.
  6. +
  7. ^ Thomlinson (1975): "one to ten million".
  8. +
  9. ^ Pala, M; Olivieri, A; Achilli, A; Accetturo, M; Metspalu, E; Reidla, M; Tamm, E; Karmin, M; Reisberg, T; Hooshiar Kashani, B; Perego, UA; Carossa, V; Gandini, F; Pereira, JB; Soares, P; Angerhofer, N; Rychkov, S; Al-Zahery, N; Carelli, V; Sanati, MH; Houshmand, M; Hatina, J; Macaulay, V; Pereira, L; Woodward, SR; Davies, W; Gamble, C; Baird, D; Semino, O; Villems, R; Torroni, A; Richards, MB (2012). "Mitochondrial DNA signals of late glacial recolonization of Europe from near eastern refugia". Am. J. Hum. Genet. 90: 915–24. doi:10.1016/j.ajhg.2012.04.003. PMC 3376494Freely accessible. PMID 22560092. 
  10. +
  11. ^ Stanley H. Ambrose (1998). "Late Pleistocene human population bottlenecks, volcanic winter, and differentiation of modern humans". Journal of Human Evolution. 34 (6): 623–651. doi:10.1006/jhev.1998.0219. PMID 9650103.  Ambrose, Stanley H. (2005). "Volcanic Winter, and Differentiation of Modern Humans". Bradshaw Foundation. Retrieved 2006-04-08. 
  12. +
  13. ^ Robock, A., C.M. Ammann, L. Oman, D. Shindell, S. Levis, and G. Stenchikov (2009). "Did the Toba volcanic eruption of ~74k BP produce widespread glaciation?". Journal of Geophysical Research. 114 (D10): D10107. Bibcode:2009JGRD..11410107R. doi:10.1029/2008JD011652. 
  14. +
  15. ^ Per Sjödin, Agnès E Sjöstrand, Mattias Jakobsson and Michael G B Blum, "Resequencing data provide no evidence for a human bottleneck in Africa during the penultimate glacial period" Mol Biol Evol (2012) doi: 10.1093/molbev/mss061. "A small human effective population size, on the order of 10,000 individuals, which is smaller than the effective population size of most great apes, has been interpreted as a result of a very long history, starting ∼ 2 mya, of a small population size, coined as the long-necked bottle model (Harpending et al. 1998; Hawks et al. 2000). Our findings are consistent with this hypothesis, but, depending on the mutation rate, we find either an effective population size of NA = 12,000 (95% C.I. = 9,000−15,500 when averaging over all three demographic models) using the mutation rate calibrated with the human-chimp divergence or an effective population size of NA = 32,500 individuals (95% C.I. = 27,500−34,500) using the mutation rate given by whole-genome trio analysis (The 1000 Genomes Project Consortium 2010) (supplementary figure 4 and table 6, Supplementary Material online). Not surprisingly, the estimated effective mutation rates θ = 4NAµ are comparable for the two mutation rates we considered, and are equal to 1.4 × 10−3/bp/generation (95% C.I. = (1.1−1.7) × 10−3). Relating the estimated effective population size to the census population size during the Pleistocene is a difficult task because there are many factors affecting the effective population size (Charlesworth 2009). Nevertheless, based on published estimates of the ratio between effective and census population size, a comprehensive value on the order of 10% has been found by Frankham (1995). This 10% rule roughly predicts that 120,000−325,[0]00 individuals (depending on the assumed mutation rate)"
  16. +
  17. ^ Haub (1995): "at some time back in the 1970s, some now-forgotten writer made the statement that 75 percent of the people who had ever been born were alive at that moment." Haub (1995) is the basis of a 2007 article in Scientific American, "Fact or Fiction". Scientificamerican.com. 
  18. +
  19. ^ Wesley Stephenson, Do the dead outnumber the living?, BBC News 4 February 2012. Ciara Curtin, Fact or Fiction?: Living People Outnumber the Dead, Scientific American, 1 March 2007.
  20. +
  21. ^ Kapitza, 'The phenomenological theory of world population growth', Physics-Uspekhi 39(1) 57-71 (1996) cites estimates ranging between 80 and 150 billion (Sergei P Kapitza, 'The phenomenological theory of world population growth', Physics-Uspekhi 39(1) 57-71, 1996), citing K. M. Weiss, Human Biology 56637, 1984, and N. Keyfitz, Applied Mathematical Demography, New York: Wiley, 1977). Haub (1995) cited 105 billion, updated to 107 billion as of 2011 in Haub, Carl (October 2011). "How Many People Have Ever Lived on Earth?". Population Reference Bureau. Retrieved April 29, 2013. 
  22. +
  23. ^ Haub (1995): "Clearly, the period 8000 B.C. to 1 A.D. is key to the magnitude of our number, but, unfortunately, little is known about that era. [...] of course, pushing the date of humanity's arrival on the planet before 50,000 B.C. would also raise the number, although perhaps not by terribly much."
  24. +
  25. ^ Haub (1995): "Life expectancy at birth probably averaged only about 10 years for most of human history. Estimates of average life expectancy in Iron Age France have been put at only 10 or 12 years. Under these conditions, the birth rate would have to be about 80 per 1,000 people just for the species to survive. [...] Our birth rate assumption will greatly affect the estimate of the number of persons ever born. Infant mortality in the human race's earliest days is thought to have been very high--perhaps 500 infant deaths per 1,000 births, or even higher. [...] Birth rates were set at 80 per 1,000 per year through 1 A.D. and at 60 per 1,000 from 2 A.D. to 1750. Rates then declined to the low 30s by the modern period. (For a brief bibliography of sources consulted in the course of this alchemy, see [Colin McEvedy and Richard Jones 1978])." "So, our estimate here is that about 5.5 percent of all people ever born are alive today." Using the UN estimates for birth rates ("UNdata: Crude birth rate". United Nations. 25 August 2011. ) and world population (U.S. Census Bureau, International Data Base), there were an estimated 3.0 billion births during 1995–2016, so that based on the estimate by Haub (1995), the figures for 2017 would be "about 108 billion births" and "about 7 percent of all people ever born are alive today."
  26. +
  27. ^ a b Haub (1995): "The average annual rate of growth was actually lower from 1 A.D. to 1650 than the rate suggested above for the 8000 B.C. to 1 A.D. period. One reason for this abnormally slow growth was the Black Plague. This dreaded scourge was not limited to 14th century Europe. The epidemic may have begun about 542 A.D. in Western Asia, spreading from there. It is believed that half the Byzantine Empire was destroyed in the 6th century, a total of 100 million deaths."
  28. +
  29. ^ a b c Data from Population Reference Bureau.
    +2016 estimate: (a) "2016 World Population Data Sheet"
    +2015 estimate: (b) Toshiko Kaneda, 2015, "2015 World Population Data Sheet".
    +2014 estimate: (c) Carl Haub, 2014, "2014 World Population Data Sheet".
    +2013 estimate: (d) Carl Haub, 2013, "2013 World Population Data Sheet".
    +2012 estimate: (e) Carl Haub, 2012, "2012 World Population Data Sheet".
    +2011 estimate: (f) Carl Haub, 2011, "2011 World Population Data Sheet".
    +2010 estimate: (g) Carl Haub, 2010, "2010 World Population Data Sheet".
    +2009 estimate: (h) Carl Haub, 2009, "2009 World Population Data Sheet".
    +2008 estimate: (i) Carl Haub, 2008, "2008 World Population Data Sheet".
    +2007 estimate: (j) Carl Haub, 2007, "2007 World Population Data Sheet".
    +2006 estimate: (k) Carl Haub, 2006, "2006 World Population Data Sheet".
    +2005 estimate: (l) Carl Haub, 2005, "2005 World Population Data Sheet".
    +2004 estimate: (m) Carl Haub, 2004, "2004 World Population Data Sheet".
    +2003 estimate: (n) Carl Haub, 2003, "2003 World Population Data Sheet".
    +2002 estimate: (o) Carl Haub, 2002, "2002 World Population Data Sheet".
    +2001 estimate: (p) Carl Haub, 2001, "2001 World Population Data Sheet".
    +2000 estimate: (q) 2000, "9 Billion World Population by 2050".
    +1997 estimate: (r) 1997, "Studying Populations".
    +Estimates for 1995 and prior: (s) Carl Haub, 1995, "How Many People Have Ever Lived on Earth?" Population Today, Vol. 23 (no. 2), pp. 5–6.
  30. +
  31. ^ a b c Data from United Nations Department of Economic and Social Affairs, Population Division.
    +1950–2100 estimates (only medium variants shown): (a) World Population Prospects: The 2008 Revision.
    +Estimates prior to 1950: (b) "The World at Six Billion", 1999.
    +Estimates from 1950 to 2100: (c) "Population of the entire world, yearly, 1950 - 2100", 2013. Archived November 19, 2016, at the Wayback Machine.
    +2014: (d) http://esa.un.org/unpd/wup/Highlights/WUP2014-Highlights.pdf "2014 World Urbanization Prospects", 2014.]
    +2015: (e) http://esa.un.org/unpd/wpp/Publications/Files/Key_Findings_WPP_2015.pdf "2015 World Urbanization Prospects", 2015.] Archived March 20, 2014, at the Wayback Machine.
  32. +
  33. ^ a b Angus Maddison, 2003, The World Economy: Historical Statistics, Vol. 2, OECD, Paris Archived May 13, 2008, at the Wayback Machine. ISBN 92-64-10412-7.
    +"Statistical Appendix" (2008, ggdc.net) "The historical data were originally developed in three books: Monitoring the World Economy 1820-1992, OECD, Paris 1995; The World Economy: A Millennial Perspective, OECD Development Centre, Paris 2001; The World Economy: Historical Statistics, OECD Development Centre, Paris 2003. All these contain detailed source notes. Figures for 1820 onwards are annual, wherever possible. For earlier years, benchmark figures are shown for 1 AD, 1000 AD, 1500, 1600 and 1700." "OECD countries GDP revised and updated 1991-2003 from National Accounts for OECD Countries, vol. I, 2006. Norway 1820-1990 GDP from Ola Grytten (2004), “The Gross Domestic Product for Norway, 1830-2003” in Eitrheim, Klovland and Qvigstad (eds), Historical Monetary Statistics for Norway, 1819-2003, Norges Bank, Oslo. Latin American GDP 2000-2003 revised and updated from ECLAC, Statistical Yearbook 2004 and preliminary version of the 2005 Yearbook supplied by Andre Hofman. For Chile, GDP 1820-2003 from Rolf Lűders (1998), “The Comparative Economic Performance of Chile 1810-1995”, Estudios de Economia, vol. 25, no. 2, with revised population estimates from Diaz, J., R. Lűders, and G. Wagner (2005) Chili 1810-2000: la Republica en Cifras, mimeo, Instituto de Economia, Universidad Católica de Chile. For Peru, GDP 1896-1990 and population 1896-1949 from Bruno Seminario and Arlette Beltran, Crecimiento Economico en el Peru 1896-1995, Universidad del Pacifico, 1998. " "For Asia there are amendments to the GDP estimates for South and North Korea, 1911-74, to correct an error in Maddison (2003). Estimates for the Philippines, 1902-1940 were amended in line with Richard Hooley (2005), 'American Economic Policy in the Philippines, 1902-1940', Journal of Asian Economics, 16. 1820 estimates were amended for Hong Kong, the Philippines, Singapore, Sri Lanka, Taiwan and Thailand." "Asian countries GDP revised and updated 1998-2003 from Asian Development Bank, Key Indicators 2005, except for South Korea and Japan, where OECD sources were used for 1991-2003. GDP for African countries updated 2000-2003 from IMF, World Economic Outlook, April 2005. Population estimates for all countries except China and Indonesia revised and updated 1950-2008 and 2030 from International Data Base, International Programs Center, Population Division, US Bureau of the Census, April 2005 version. China’s population 1990-2003 from China Statistical Yearbook 2005, China Statistics Press, Beijing. Indonesian population 1950-2003 kindly supplied by Pierre van der Eng. The figures now include three countries previously omitted: Cook Islands, Nauru and Tuvalu."
  34. +
  35. ^ a b c John H. Tanton, 1994, "End of the Migration Epoch? Time For a New Paradigm", The Social Contract, Vol. 4 (no 3), pp. 162–173.
  36. +
  37. ^ a b Slightly updated data from original paper in French: (a) Jean-Noël Biraben, 1980, "An Essay Concerning Mankind's Evolution", Population, Selected Papers, Vol. 4, pp. 1–13. Original paper in French: (b) Jean-Noël Biraben, 1979, "Essai sur l'évolution du nombre des hommes", Population, Vol. 34 (no. 1), pp. 13–25.
  38. +
  39. ^ a b c Colin McEvedy and Richard Jones, 1978, Atlas of World Population History, Facts on File, New York, ISBN 0-7139-1031-3.
  40. +
  41. ^ a b Ralph Thomlinson, 1975, Demographic Problems: Controversy over population control, 2nd Ed., Dickenson Publishing Company, Ecino, CA, ISBN 0-8221-0166-1.
  42. +
  43. ^ a b John D. Durand, 1974, "Historical Estimates of World Population: An Evaluation", University of Pennsylvania, Population Center, Analytical and Technical Reports, Number 10.
  44. +
  45. ^ a b Colin Clark, 1967, Population Growth and Land Use, St. Martin's Press, New York, ISBN 0-333-01126-0.
  46. +
  47. ^ a b c d e f g h i j k Data from History Database of the Global Environment. K. Klein Goldewijk, A. Beusen and P. Janssen, "HYDE 3.1: Long-term dynamic modeling of global population and built-up area in a spatially explicit way", from table on pg. 2, Netherlands Environmental Assessment Agency (MNP), Bilthoven, The Netherlands.
  48. +
  49. ^ Haub (1995): "By 1 A.D., the world may have held about 300 million people. One estimate of the population of the Roman Empire, from Spain to Asia Minor, in 14 A.D. is 45 million. However, other historians set the figure twice as high, suggesting how imprecise population estimates of early historical periods can be."
  50. +
  51. ^ "The present figures are a revision and update of those presented on this website in 2003. The most significant changes are in the entries for the year 1, where gaps in previous tables have been filled with the new estimates for the Roman Empire in Maddison (2007). The estimates are in fact for 14 AD"
  52. +
  53. ^ The estimates are in fact for 14 AD"
  54. +
  55. ^ a b Data from U.S. Census Bureau, International Data Base Retrieved on 28 Oct, 2017
  56. +
  57. ^ "The expression for growth (6) indicates a limit for world population N=πK2=14×109, in the foreseeable future. Of this asymptotic limit 90% will be reached for Model III by year 2135, or in 3T years after T1 = 2007." Sergei P. Kapitza, 'The phenomenological theory of world population growth', Physics-Uspekhi 39(1) 57-71 (1996).
  58. +
  59. ^ United Nations Department of Economic and Social Affairs. World Population to 2300. 2004. Executive Summary, Page 2.
  60. +
  61. ^ Gerland, P.; Raftery, A. E.; Ev Ikova, H.; Li, N.; Gu, D.; Spoorenberg, T.; Alkema, L.; Fosdick, B. K.; Chunn, J.; Lalic, N.; Bay, G.; Buettner, T.; Heilig, G. K.; Wilmoth, J. (September 14, 2014). "World population stabilization unlikely this century". Science. AAAS. 346 (6206): 234–7. doi:10.1126/science.1257469. ISSN 1095-9203. PMC 4230924Freely accessible. PMID 25301627. Retrieved September 21, 2014. 
  62. +
  63. ^ Randers, Jorgen (2012). 2052: A Global Forecast for the Next Forty Years. Vermont: Chelsea Green Publishing. p. 62.
  64. +
  65. ^ Angus Maddison, The World Economy: Historical Statistics, Statistical Appendix (2007, ggdc.net). Estimates cited are for the beginning of the 1st millennium ("year 0"), the beginning of the 2nd millennium ("year 1000"), and for the beginning each century since the 16th (years 1820 and 1913 are given for the 19th and 20th century, respectively, as Maddison presents detailed estimates for these years), and a projection for the year 2030.
  66. +
  67. ^ includes Central Asia (listed under "former USSR")
  68. +
  69. ^ Taylor, Alan (2002). American Colonies. Penguin. ISBN 9780142002100. 
  70. +
  71. ^ "La catastrophe démographique" (The Demographic Catastrophe"), L'Histoire n°322, July–August 2007, p. 17.
  72. +
  73. ^ Dobyns, Henry (1983). Their Number Become Thinned: Native American Dynamics in Eastern North America. Knoxville: University of Tennessee Press.
  74. +
+
+

Further reading[edit]

+ +

External links[edit]

+ + + + + + +
+ +
+
+
+
+
+

Navigation menu

+
+ +
+ + +
+
+ + + +
+
+ +
+ + + + + diff --git a/data/glucose_insulin.csv b/data/glucose_insulin.csv new file mode 100644 index 00000000..91688b17 --- /dev/null +++ b/data/glucose_insulin.csv @@ -0,0 +1,25 @@ +time,glucose,insulin +0,92,11 +2,350,26 +4,287,130 +6,251,85 +8,240,51 +10,216,49 +12,211,45 +14,205,41 +16,196,35 +19,192,30 +22,172,30 +27,163,27 +32,142,30 +42,124,22 +52,105,15 +62,92,15 +72,84,11 +82,77,10 +92,82,8 +102,81,11 +122,82,7 +142,82,8 +162,85,8 +182,90,7 \ No newline at end of file From 28506e74ead64dea2321b5f7b6c62232d7d0d245 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 22 Jan 2021 19:36:09 -0500 Subject: [PATCH 012/144] Adding data --- data/World_population_estimates.csv | 68 ++++++++++++++++++++++++++++ data/World_population_estimates2.csv | 68 ++++++++++++++++++++++++++++ data/World_population_estimates3.csv | 46 +++++++++++++++++++ data/baseball_drag.csv | 17 +++++++ 4 files changed, 199 insertions(+) create mode 100644 data/World_population_estimates.csv create mode 100644 data/World_population_estimates2.csv create mode 100644 data/World_population_estimates3.csv create mode 100644 data/baseball_drag.csv diff --git a/data/World_population_estimates.csv b/data/World_population_estimates.csv new file mode 100644 index 00000000..ed7de057 --- /dev/null +++ b/data/World_population_estimates.csv @@ -0,0 +1,68 @@ +Year,census,prb,un,maddison,hyde,tanton,biraben,mj,thomlinson,durand,clark +1950,2557628654,2516000000.0,2525149000.0,2544000000.0,2527960000.0,2400000000.0,2527000000.0,2500000000.0,2400000000.0,,2486000000.0 +1951,2594939877,,2572850917.0,2571663000.0,,,,,,, +1952,2636772306,,2619292068.0,2617949000.0,,,,,,, +1953,2682053389,,2665865392.0,2665959000.0,,,,,,, +1954,2730228104,,2713172027.0,2716927000.0,,,,,,, +1955,2782098943,,2761650981.0,2769074000.0,,,,,,, +1956,2835299673,,2811572031.0,2822502000.0,,,,,,, +1957,2891349717,,2863042795.0,2879934000.0,,,,,,, +1958,2948137248,,2916030167.0,2939254000.0,,,,,,, +1959,3000716593,,2970395814.0,2995909000.0,,,,,,, +1960,3043001508,,3026002942.0,3041507000.0,3042000000.0,,,,,, +1961,3083966929,,3082830266.0,3082161000.0,,,,,,, +1962,3140093217,,3141071531.0,3135787000.0,,,,,,,3036000000.0 +1963,3209827882,,3201178277.0,3201354000.0,,,,,,, +1964,3281201306,,3263738832.0,3266477000.0,,,,,,, +1965,3350425793,,3329122479.0,3333138000.0,,,,,,, +1966,3420677923,,3397475247.0,3402224000.0,,,,,,,3288000000.0 +1967,3490333715,,3468521724.0,3471464000.0,,,,,,, +1968,3562313822,,3541674891.0,3543086000.0,,,,,,, +1969,3637159050,,3616108749.0,3615743000.0,,,,,,, +1970,3712697742,,3691172616.0,3691157000.0,3710000000.0,,3637000000.0,,3600000000.0,"3,600,000,000– 3,700,000,000",3632000000.0 +1971,3790326948,,3766754345.0,3769818000.0,,,,,,, +1972,3866568653,,3842873611.0,3846499000.0,,,,,,, +1973,3942096442,,3919182332.0,3922793000.0,3923000000.0,,,,,,3860000000.0 +1974,4016608813,,3995304922.0,3997677000.0,,,,,,, +1975,4089083233,,4071020434.0,4070671000.0,,,,3900000000.0,4000000000.0,, +1976,4160185010,,4146135850.0,4141445000.0,,,,,,, +1977,4232084578,,4220816737.0,4213539000.0,,,,,,, +1978,4304105753,,4295664825.0,4286317000.0,,,,,,, +1979,4379013942,,4371527871.0,4363144000.0,,,,,,, +1980,4451362735,,4449048798.0,4439529000.0,4461000000.0,,,,,, +1981,4534410125,,4528234634.0,4514838000.0,,,,,,, +1982,4614566561,,4608962418.0,4587307000.0,,,,,,, +1983,4695736743,,4691559840.0,4676388000.0,,,,,,, +1984,4774569391,,4776392828.0,4756521000.0,,,,,,, +1985,4856462699,,4863601517.0,4837719000.0,,5000000000.0,,,,, +1986,4940571232,,4953376710.0,4920968000.0,,,,,,, +1987,5027200492,,5045315871.0,5006672000.0,,,,,,, +1988,5114557167,,5138214688.0,5093306000.0,,,,,,, +1989,5201440110,,5230000000.0,5180540000.0,,,,,,, +1990,5288955934,,5320816667.0,5269029000.0,5308000000.0,,,,,, +1991,5371585922,,5408908724.0,5351922000.0,,,,,,, +1992,5456136278,,5494899570.0,5435722000.0,,,,,,, +1993,5538268316,,5578865109.0,5518127000.0,,,,,,, +1994,5618682132,,5661086346.0,5599396000.0,,,,,,, +1995,5699202985,5760000000.0,5741822412.0,5681575000.0,,,,,,, +1996,5779440593,,5821016750.0,5762212000.0,,,,,,, +1997,5857972543,5840000000.0,5898688337.0,5842122000.0,,,,,,, +1998,5935213248,,5975303657.0,5921366000.0,,,,,,, +1999,6012074922,,6051478010.0,5999622000.0,,,,,,, +2000,6088571383,6067000000.0,6127700428.0,6076558000.0,6145000000.0,,,5750000000.0,,, +2001,6165219247,6137000000.0,6204147026.0,6154791000.0,,,,,,, +2002,6242016348,6215000000.0,6280853817.0,6231704000.0,,,,,,, +2003,6318590956,6314000000.0,6357991749.0,6308364000.0,,,,,,, +2004,6395699509,6396000000.0,6435705595.0,6374056000.0,,,,,,, +2005,6473044732,6477000000.0,6514094605.0,6462987000.0,,,,,,, +2006,6551263534,6555000000.0,6593227977.0,6540214000.0,,,,,,, +2007,6629913759,6625000000.0,6673105937.0,6616689000.0,,,,,,, +2008,6709049780,6705000000.0,6753649228.0,6694832000.0,,,,,,, +2009,6788214394,6809972000.0,6834721933.0,6764086000.0,,,,,,, +2010,6858584755,6892319000.0,6916183482.0,,,,,,,, +2011,6935999491,6986951000.0,6997998760.0,,,,,,,, +2012,7013871313,7057075000.0,7080072417.0,,,,,,,, +2013,7092128094,7136796000.0,7162119434.0,,,,,,,, +2014,7169968185,7238184000.0,7243784000.0,,,,,,,, +2015,7247892788,7336435000.0,7349472000.0,,,,,,,, +2016,7325996709,7418151841.0,,,,,,,,, diff --git a/data/World_population_estimates2.csv b/data/World_population_estimates2.csv new file mode 100644 index 00000000..ed7de057 --- /dev/null +++ b/data/World_population_estimates2.csv @@ -0,0 +1,68 @@ +Year,census,prb,un,maddison,hyde,tanton,biraben,mj,thomlinson,durand,clark +1950,2557628654,2516000000.0,2525149000.0,2544000000.0,2527960000.0,2400000000.0,2527000000.0,2500000000.0,2400000000.0,,2486000000.0 +1951,2594939877,,2572850917.0,2571663000.0,,,,,,, +1952,2636772306,,2619292068.0,2617949000.0,,,,,,, +1953,2682053389,,2665865392.0,2665959000.0,,,,,,, +1954,2730228104,,2713172027.0,2716927000.0,,,,,,, +1955,2782098943,,2761650981.0,2769074000.0,,,,,,, +1956,2835299673,,2811572031.0,2822502000.0,,,,,,, +1957,2891349717,,2863042795.0,2879934000.0,,,,,,, +1958,2948137248,,2916030167.0,2939254000.0,,,,,,, +1959,3000716593,,2970395814.0,2995909000.0,,,,,,, +1960,3043001508,,3026002942.0,3041507000.0,3042000000.0,,,,,, +1961,3083966929,,3082830266.0,3082161000.0,,,,,,, +1962,3140093217,,3141071531.0,3135787000.0,,,,,,,3036000000.0 +1963,3209827882,,3201178277.0,3201354000.0,,,,,,, +1964,3281201306,,3263738832.0,3266477000.0,,,,,,, +1965,3350425793,,3329122479.0,3333138000.0,,,,,,, +1966,3420677923,,3397475247.0,3402224000.0,,,,,,,3288000000.0 +1967,3490333715,,3468521724.0,3471464000.0,,,,,,, +1968,3562313822,,3541674891.0,3543086000.0,,,,,,, +1969,3637159050,,3616108749.0,3615743000.0,,,,,,, +1970,3712697742,,3691172616.0,3691157000.0,3710000000.0,,3637000000.0,,3600000000.0,"3,600,000,000– 3,700,000,000",3632000000.0 +1971,3790326948,,3766754345.0,3769818000.0,,,,,,, +1972,3866568653,,3842873611.0,3846499000.0,,,,,,, +1973,3942096442,,3919182332.0,3922793000.0,3923000000.0,,,,,,3860000000.0 +1974,4016608813,,3995304922.0,3997677000.0,,,,,,, +1975,4089083233,,4071020434.0,4070671000.0,,,,3900000000.0,4000000000.0,, +1976,4160185010,,4146135850.0,4141445000.0,,,,,,, +1977,4232084578,,4220816737.0,4213539000.0,,,,,,, +1978,4304105753,,4295664825.0,4286317000.0,,,,,,, +1979,4379013942,,4371527871.0,4363144000.0,,,,,,, +1980,4451362735,,4449048798.0,4439529000.0,4461000000.0,,,,,, +1981,4534410125,,4528234634.0,4514838000.0,,,,,,, +1982,4614566561,,4608962418.0,4587307000.0,,,,,,, +1983,4695736743,,4691559840.0,4676388000.0,,,,,,, +1984,4774569391,,4776392828.0,4756521000.0,,,,,,, +1985,4856462699,,4863601517.0,4837719000.0,,5000000000.0,,,,, +1986,4940571232,,4953376710.0,4920968000.0,,,,,,, +1987,5027200492,,5045315871.0,5006672000.0,,,,,,, +1988,5114557167,,5138214688.0,5093306000.0,,,,,,, +1989,5201440110,,5230000000.0,5180540000.0,,,,,,, +1990,5288955934,,5320816667.0,5269029000.0,5308000000.0,,,,,, +1991,5371585922,,5408908724.0,5351922000.0,,,,,,, +1992,5456136278,,5494899570.0,5435722000.0,,,,,,, +1993,5538268316,,5578865109.0,5518127000.0,,,,,,, +1994,5618682132,,5661086346.0,5599396000.0,,,,,,, +1995,5699202985,5760000000.0,5741822412.0,5681575000.0,,,,,,, +1996,5779440593,,5821016750.0,5762212000.0,,,,,,, +1997,5857972543,5840000000.0,5898688337.0,5842122000.0,,,,,,, +1998,5935213248,,5975303657.0,5921366000.0,,,,,,, +1999,6012074922,,6051478010.0,5999622000.0,,,,,,, +2000,6088571383,6067000000.0,6127700428.0,6076558000.0,6145000000.0,,,5750000000.0,,, +2001,6165219247,6137000000.0,6204147026.0,6154791000.0,,,,,,, +2002,6242016348,6215000000.0,6280853817.0,6231704000.0,,,,,,, +2003,6318590956,6314000000.0,6357991749.0,6308364000.0,,,,,,, +2004,6395699509,6396000000.0,6435705595.0,6374056000.0,,,,,,, +2005,6473044732,6477000000.0,6514094605.0,6462987000.0,,,,,,, +2006,6551263534,6555000000.0,6593227977.0,6540214000.0,,,,,,, +2007,6629913759,6625000000.0,6673105937.0,6616689000.0,,,,,,, +2008,6709049780,6705000000.0,6753649228.0,6694832000.0,,,,,,, +2009,6788214394,6809972000.0,6834721933.0,6764086000.0,,,,,,, +2010,6858584755,6892319000.0,6916183482.0,,,,,,,, +2011,6935999491,6986951000.0,6997998760.0,,,,,,,, +2012,7013871313,7057075000.0,7080072417.0,,,,,,,, +2013,7092128094,7136796000.0,7162119434.0,,,,,,,, +2014,7169968185,7238184000.0,7243784000.0,,,,,,,, +2015,7247892788,7336435000.0,7349472000.0,,,,,,,, +2016,7325996709,7418151841.0,,,,,,,,, diff --git a/data/World_population_estimates3.csv b/data/World_population_estimates3.csv new file mode 100644 index 00000000..2ab604fe --- /dev/null +++ b/data/World_population_estimates3.csv @@ -0,0 +1,46 @@ +Year,census,prb,un +2016,7334771614.0,,7432663280.0 +2017,7412778971.0,, +2018,7490427640.0,, +2019,7567402977.0,, +2020,7643402123.0,,7758157000.0 +2021,7718256830.0,, +2022,7792021317.0,, +2023,7864725370.0,, +2024,7936271554.0,, +2025,8006580553.0,8000000000.0,8141661000.0 +2026,8075716000.0,, +2027,8143729466.0,, +2028,8210559895.0,, +2029,8276190519.0,, +2030,8340606590.0,8505000000.0,8500766000.0 +2031,8403880343.0,, +2032,8466094022.0,, +2033,8527246205.0,, +2034,8587325154.0,, +2035,8646304704.0,,8838908000.0 +2036,8704239274.0,, +2037,8761189197.0,, +2038,8817138785.0,, +2039,8872066537.0,, +2040,8925949679.0,,9157234000.0 +2041,8978822945.0,, +2042,9030723366.0,, +2043,9081617002.0,, +2044,9131462326.0,, +2045,9180225214.0,,9453892000.0 +2046,9227935007.0,, +2047,9274616811.0,, +2048,9320232984.0,, +2049,9364750182.0,, +2050,9408141302.0,9804000000.0,9725148000.0 +2055,,,9968809000.0 +2060,,,10184290000.0 +2065,,,10375719000.0 +2070,,,10547989000.0 +2075,,,10701653000.0 +2080,,,10836635000.0 +2085,,,10953525000.0 +2090,,,11055270000.0 +2095,,,11142461000.0 +2100,,,11213317000.0 diff --git a/data/baseball_drag.csv b/data/baseball_drag.csv new file mode 100644 index 00000000..7de5138a --- /dev/null +++ b/data/baseball_drag.csv @@ -0,0 +1,17 @@ +Velocity in mph,Drag coefficient +0.058486,0.49965 +19.845,0.49878 +39.476,0.49704 +50.181,0.48225 +60.134,0.45004 +68.533,0.40914 +73.769,0.38042 +77.408,0.36562 +83.879,0.34822 +90.507,0.33081 +97.29,0.31427 +104.54,0.30035 +113.83,0.28816 +120.9,0.28381 +127.34,0.28033 +134.41,0.28207 From 2f7f3d5e1e42319511a53a900cc5f6e510a6549d Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 23 Jan 2021 11:42:22 -0500 Subject: [PATCH 013/144] Updating notebooks --- colab/chap01.ipynb | 75 ++++++++++++++++-------- colab/chap02.ipynb | 64 +++------------------ colab/chap03.ipynb | 45 +++++++++------ colab/chap04.ipynb | 42 +++++++++----- colab/chap05.ipynb | 129 +++++++++++++++++++++++++----------------- colab/chap06.ipynb | 113 +++++++++++++++++++++++------------- colab/chap07.ipynb | 110 +++++++++++++++++++++-------------- colab/chap08.ipynb | 120 ++++++++++++++++++--------------------- colab/chap09.ipynb | 69 ++++++++++++++-------- colab/chap10.ipynb | 113 ++++++++++++++++++++++-------------- colab/chap11.ipynb | 45 +++++++++------ colab/chap12.ipynb | 54 +++++++++++------- colab/chap13.ipynb | 99 +++++++++++++++++--------------- colab/chap13ode.ipynb | 42 +++++++++----- colab/chap14.ipynb | 48 ++++++++++------ colab/chap15.ipynb | 42 +++++++++----- colab/chap16.ipynb | 46 +++++++++------ colab/chap17.ipynb | 46 +++++++++------ colab/chap18.ipynb | 46 +++++++++------ colab/chap20.ipynb | 43 +++++++++----- colab/chap21.ipynb | 43 +++++++++----- colab/chap22.ipynb | 46 +++++++++------ colab/chap23.ipynb | 43 +++++++++----- colab/chap24.ipynb | 43 +++++++++----- colab/chap25.ipynb | 43 +++++++++----- 25 files changed, 958 insertions(+), 651 deletions(-) diff --git a/colab/chap01.ipynb b/colab/chap01.ipynb index 7f892bfe..7a39ec16 100644 --- a/colab/chap01.ipynb +++ b/colab/chap01.ipynb @@ -9,15 +9,40 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ - "Modeling and Simulation in Python\n", + "*Modeling and Simulation in Python*\n", "\n", "Copyright 2021 Allen Downey\n", "\n", "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -92,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -105,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -129,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -138,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -169,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -199,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -215,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -231,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -247,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -263,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -298,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -318,7 +343,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -337,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -354,7 +379,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -364,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -384,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -393,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -419,7 +444,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -428,7 +453,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -437,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -446,7 +471,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -455,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ diff --git a/colab/chap02.ipynb b/colab/chap02.ipynb index ba819318..52250e76 100644 --- a/colab/chap02.ipynb +++ b/colab/chap02.ipynb @@ -43,18 +43,6 @@ " from modsim import *" ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# set the random number generator\n", - "np.random.seed(7)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -73,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -89,7 +77,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -98,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": { "scrolled": true }, @@ -737,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -745,9 +733,7 @@ "\n", "decorate(title='Olin-Wellesley Bikeshare',\n", " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')\n", - "\n", - "savefig('figs/chap02-fig01.pdf')" + " ylabel='Number of bikes')" ] }, { @@ -757,38 +743,6 @@ "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." ] }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`savefig()` saves a figure in a file." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "help(savefig)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The suffix of the filename indicates the format you want. This example saves the current figure in a PDF file named `chap01-fig01.pdf`." - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -816,7 +770,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -825,7 +779,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -879,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ @@ -899,7 +853,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/colab/chap03.ipynb b/colab/chap03.ipynb index 82a9d53a..9aae1691 100644 --- a/colab/chap03.ipynb +++ b/colab/chap03.ipynb @@ -4,32 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 3\n", + "# Chapter 3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -587,7 +598,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap04.ipynb b/colab/chap04.ipynb index 1945f357..5a790b56 100644 --- a/colab/chap04.ipynb +++ b/colab/chap04.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 4\n", + "# Chapter 4" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim library\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -659,7 +673,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap05.ipynb b/colab/chap05.ipynb index 32632ff6..2dca482e 100644 --- a/colab/chap05.ipynb +++ b/colab/chap05.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 5\n", + "# Chapter 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -51,18 +65,29 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates\n", + "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", "\n", - "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence." + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "filename = 'data/World_population_estimates.html'\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "len(tables)" ] @@ -71,6 +96,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n", + "\n", "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", "\n", "`head` selects the header and the first five rows." @@ -78,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -97,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -113,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -131,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -170,7 +197,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -195,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -205,7 +232,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -222,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "scrolled": false }, @@ -232,9 +259,7 @@ "plot(un, '--', label='UN DESA')\n", " \n", "decorate(xlabel='Year',\n", - " ylabel='World population (billion)')\n", - "\n", - "savefig('figs/chap05-fig01.pdf')" + " ylabel='World population (billion)')" ] }, { @@ -248,7 +273,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -269,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": { "scrolled": true }, @@ -280,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": { "scrolled": true }, @@ -291,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "scrolled": true }, @@ -302,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -332,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -348,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -364,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -373,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -382,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -398,7 +423,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -407,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -423,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -432,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -455,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -471,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -488,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -505,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -515,9 +540,7 @@ "\n", "decorate(xlabel='Year', \n", " ylabel='World population (billion)',\n", - " title='Constant growth')\n", - "\n", - "savefig('figs/chap05-fig02.pdf')" + " title='Constant growth')" ] }, { @@ -546,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -555,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -586,7 +609,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap06.ipynb b/colab/chap06.ipynb index 1af43b6b..6d32eff3 100644 --- a/colab/chap06.ipynb +++ b/colab/chap06.ipynb @@ -4,31 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 6\n", + "# Chapter 6" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -41,11 +53,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "filename = 'data/World_population_estimates.html'\n", + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "table2 = tables[2]\n", "table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -55,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -65,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -75,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -125,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -154,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -184,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -208,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -239,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -256,13 +283,12 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "results = run_simulation2(system)\n", - "plot_results(census, un, results, 'Proportional model')\n", - "savefig('figs/chap06-fig01.pdf')" + "plot_results(census, un, results, 'Proportional model')" ] }, { @@ -288,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -315,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -331,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -347,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -377,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -394,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -432,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -458,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -484,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": { "scrolled": false }, @@ -495,12 +521,19 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -519,7 +552,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap07.ipynb b/colab/chap07.ipynb index fb1ed01b..e8ed937c 100644 --- a/colab/chap07.ipynb +++ b/colab/chap07.ipynb @@ -4,31 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 7\n", + "# Chapter 7" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -40,11 +52,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "filename = 'data/World_population_estimates.html'\n", + "from pandas import read_html\n", + "\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "table2 = tables[2]\n", "table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -54,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -74,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -97,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -134,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -184,13 +211,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')\n", - "savefig('figs/chap07-fig01.pdf')" + "plot_results(census, un, results, 'Quadratic model')" ] }, { @@ -211,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -229,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -239,9 +265,7 @@ "decorate(xlabel='Population (billions)',\n", " ylabel='Net growth (billions)')\n", "\n", - "sns.set_style('white')\n", - "\n", - "savefig('figs/chap07-fig02.pdf')" + "sns.set_style('white')" ] }, { @@ -262,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -301,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -325,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -349,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -377,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -400,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -427,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -443,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -466,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -475,7 +499,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -484,7 +508,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -515,7 +539,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap08.ipynb b/colab/chap08.ipynb index 3c31a82b..a77508ed 100644 --- a/colab/chap08.ipynb +++ b/colab/chap08.ipynb @@ -4,31 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 8\n", + "# Chapter 8" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# If we're running on Colab, install modsimpy\n", - "# https://pypi.org/project/modsimpy/\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", + "# check if the libraries we need are installed\n", "\n", - "if IN_COLAB:\n", + "try:\n", + " import pint\n", + "except ImportError:\n", " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", " !pip install modsimpy\n", - " !mkdir figs" + " from modsim import *" ] }, { @@ -116,7 +128,7 @@ "\n", "filename = 'World_population_estimates2.csv'\n", "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates2.csv\n" + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv" ] }, { @@ -124,31 +136,6 @@ "execution_count": 6, "metadata": {}, "outputs": [], - "source": [ - "def read_table2(filename):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table2 = tables[2]\n", - " table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - " return table2" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "#table2 = read_table2()\n", - "#table2.to_csv('data/World_population_estimates2.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], "source": [ "table2 = pd.read_csv('World_population_estimates2.csv')\n", "table2.index = table2.Year\n", @@ -157,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -187,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -211,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -229,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": { "scrolled": true }, @@ -251,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -275,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": { "scrolled": false }, @@ -283,8 +270,7 @@ "source": [ "system.t_end = 2250\n", "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'World population projection')\n", - "savefig('figs/chap08-fig01.pdf')" + "plot_results(census, un, results, 'World population projection')" ] }, { @@ -296,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -305,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -321,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -344,7 +330,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -354,12 +340,12 @@ "\n", "filename = 'World_population_estimates3.csv'\n", "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates3.csv\n" + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates3.csv\n" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -372,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -382,7 +368,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -407,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -432,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -445,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -453,8 +439,7 @@ "\n", "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)\n", - "savefig('figs/chap08-fig02.pdf')" + "plot_projections(table3)" ] }, { @@ -479,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -515,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -524,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -591,6 +576,13 @@ "source": [ "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -609,7 +601,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap09.ipynb b/colab/chap09.ipynb index fe1d4db2..9e3b0cd5 100644 --- a/colab/chap09.ipynb +++ b/colab/chap09.ipynb @@ -4,26 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 9\n", + "# Chapter 9" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# import everything from SymPy.\n", - "from sympy import *\n", + "# check if the libraries we need are installed\n", "\n", - "# Set up Jupyter notebook to display math.\n", - "init_printing() " + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -72,7 +89,9 @@ "metadata": {}, "outputs": [], "source": [ - "t = symbols('t')\n", + "import sympy as sp\n", + "\n", + "t = sp.symbols('t')\n", "t" ] }, @@ -138,7 +157,7 @@ "metadata": {}, "outputs": [], "source": [ - "f = Function('f')\n", + "f = sp.Function('f')\n", "f" ] }, @@ -187,7 +206,7 @@ "metadata": {}, "outputs": [], "source": [ - "dfdt = diff(f(t), t)\n", + "dfdt = sp.diff(f(t), t)\n", "dfdt" ] }, @@ -213,7 +232,7 @@ "metadata": {}, "outputs": [], "source": [ - "alpha = symbols('alpha')\n", + "alpha = sp.symbols('alpha')\n", "alpha" ] }, @@ -230,7 +249,7 @@ "metadata": {}, "outputs": [], "source": [ - "eq1 = Eq(dfdt, alpha*f(t))\n", + "eq1 = sp.Eq(dfdt, alpha*f(t))\n", "eq1" ] }, @@ -247,7 +266,7 @@ "metadata": {}, "outputs": [], "source": [ - "solution_eq = dsolve(eq1)\n", + "solution_eq = sp.dsolve(eq1)\n", "solution_eq" ] }, @@ -266,7 +285,7 @@ "metadata": {}, "outputs": [], "source": [ - "C1, p_0 = symbols('C1 p_0')" + "C1, p_0 = sp.symbols('C1 p_0')" ] }, { @@ -301,7 +320,7 @@ "metadata": {}, "outputs": [], "source": [ - "r, K = symbols('r K')" + "r, K = sp.symbols('r K')" ] }, { @@ -317,7 +336,7 @@ "metadata": {}, "outputs": [], "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2 = sp.Eq(sp.diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", "eq2" ] }, @@ -334,7 +353,7 @@ "metadata": {}, "outputs": [], "source": [ - "solution_eq = dsolve(eq2)\n", + "solution_eq = sp.dsolve(eq2)\n", "solution_eq" ] }, @@ -389,7 +408,7 @@ "metadata": {}, "outputs": [], "source": [ - "solutions = solve(Eq(at_0, p_0), C1)\n", + "solutions = sp.solve(sp.Eq(at_0, p_0), C1)\n", "type(solutions), len(solutions)" ] }, @@ -433,7 +452,7 @@ "metadata": {}, "outputs": [], "source": [ - "particular = simplify(particular)\n", + "particular = sp.simplify(particular)\n", "particular" ] }, @@ -486,7 +505,7 @@ "metadata": {}, "outputs": [], "source": [ - "logistic = K / (1 + A * exp(-r*t))\n", + "logistic = K / (1 + A * sp.exp(-r*t))\n", "logistic" ] }, @@ -505,7 +524,7 @@ }, "outputs": [], "source": [ - "simplify(particular - logistic)" + "sp.simplify(particular - logistic)" ] }, { @@ -630,7 +649,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.7" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap10.ipynb b/colab/chap10.ipynb index e7167c43..f2e903ab 100644 --- a/colab/chap10.ipynb +++ b/colab/chap10.ipynb @@ -4,31 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 10\n", + "# Chapter 10" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", + "# check if the libraries we need are installed\n", "\n", - "from pandas import read_html" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -44,11 +56,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "filename = 'data/World_population_estimates.html'\n", + "from pandas import read_html\n", + "\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "table2 = tables[2]\n", "table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -59,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -86,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { "scrolled": true }, @@ -104,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "scrolled": true }, @@ -122,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "scrolled": false }, @@ -140,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "scrolled": true }, @@ -158,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -174,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -194,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -203,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -212,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -221,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -230,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -239,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -248,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": { "scrolled": true }, @@ -270,11 +297,11 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ - "filename = 'data/World_population_estimates.html'\n", + "filename = 'World_population_estimates.html'\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "len(tables)" ] @@ -288,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -305,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -321,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -338,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -355,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 27, "metadata": { "scrolled": false }, @@ -377,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -399,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -408,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -439,7 +466,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap11.ipynb b/colab/chap11.ipynb index e75bc7e8..887d7df7 100644 --- a/colab/chap11.ipynb +++ b/colab/chap11.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 11\n", + "# Chapter 11" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -337,8 +351,7 @@ "metadata": {}, "outputs": [], "source": [ - "plot_results(S, I, R)\n", - "savefig('figs/chap11-fig01.pdf')" + "plot_results(S, I, R)\n" ] }, { @@ -455,7 +468,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap12.ipynb b/colab/chap12.ipynb index 50a9c232..ef6f4478 100644 --- a/colab/chap12.ipynb +++ b/colab/chap12.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 12\n", + "# Chapter 12" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -325,8 +339,7 @@ "\n", "decorate(xlabel='Time (days)',\n", " ylabel='Fraction susceptible')\n", - "\n", - "savefig('figs/chap12-fig01.pdf')" + "\n" ] }, { @@ -419,8 +432,7 @@ " ylabel='Total fraction infected',\n", " title='Fraction infected vs. immunization rate',\n", " legend=False)\n", - "\n", - "savefig('figs/chap12-fig02.pdf')" + "\n" ] }, { @@ -684,8 +696,7 @@ " ylabel='Total fraction infected',\n", " title='Effect of hand washing on total infections',\n", " legend=False)\n", - "\n", - "savefig('figs/chap12-fig03.pdf')" + "\n" ] }, { @@ -821,8 +832,7 @@ " ylabel='Total fraction infected',\n", " title='Total infections vs. doses',\n", " legend=False)\n", - "\n", - "savefig('figs/chap12-fig04.pdf')" + "\n" ] }, { @@ -869,7 +879,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap13.ipynb b/colab/chap13.ipynb index d368dd4c..bff8f833 100644 --- a/colab/chap13.ipynb +++ b/colab/chap13.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 13\n", + "# Chapter 13" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": 1, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -45,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -89,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -105,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -130,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -172,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -189,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -208,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -237,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -246,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -255,8 +269,7 @@ "\n", "decorate(xlabel='Contact rate (beta)',\n", " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap13-fig01.pdf')" + "\n" ] }, { @@ -275,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -291,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -307,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -323,8 +336,7 @@ " loc='upper left')\n", "\n", "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig02.pdf')" + "plt.tight_layout()\n" ] }, { @@ -336,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -345,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -354,7 +366,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -372,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -400,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -417,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -440,7 +452,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -455,8 +467,7 @@ " ylabel='Fraction infected')\n", "\n", "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig03.pdf')" + "plt.tight_layout()\n" ] }, { @@ -470,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { "scrolled": true }, @@ -480,9 +491,7 @@ "\n", "decorate(xlabel='Recovery rate (gamma)',\n", " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')\n", - "\n", - "savefig('figs/chap13-fig04.pdf')" + " title='Fraction infected, contour plot')" ] }, { @@ -509,7 +518,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap13ode.ipynb b/colab/chap13ode.ipynb index 28d11d48..c376d88b 100644 --- a/colab/chap13ode.ipynb +++ b/colab/chap13ode.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 13\n", + "# Chapter 13" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -172,7 +186,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap14.ipynb b/colab/chap14.ipynb index c9624be2..c8522091 100644 --- a/colab/chap14.ipynb +++ b/colab/chap14.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 14\n", + "# Chapter 14" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -276,8 +290,7 @@ "\n", "decorate(xlabel='Contact number (beta/gamma)',\n", " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig01.pdf')" + "\n" ] }, { @@ -356,8 +369,7 @@ "\n", "decorate(xlabel='Contact number (c)',\n", " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig02.pdf')" + "\n" ] }, { @@ -467,7 +479,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap15.ipynb b/colab/chap15.ipynb index 4e0f0cdb..66c8b36a 100644 --- a/colab/chap15.ipynb +++ b/colab/chap15.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 15\n", + "# Chapter 15" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -310,7 +324,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap16.ipynb b/colab/chap16.ipynb index b359b505..f87abcbc 100644 --- a/colab/chap16.ipynb +++ b/colab/chap16.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 16\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -554,8 +568,7 @@ "decorate(xlabel='Time (minutes)',\n", " ylabel='Temperature (C)',\n", " loc='center left')\n", - "\n", - "savefig('figs/chap16-fig01.pdf')" + "\n" ] }, { @@ -686,8 +699,7 @@ "plot(sweep, label='final temp', color='C2')\n", "decorate(xlabel='Time added (min)',\n", " ylabel='Final temperature (C)')\n", - "\n", - "savefig('figs/chap16-fig02.pdf')" + "\n" ] }, { diff --git a/colab/chap17.ipynb b/colab/chap17.ipynb index 834f0306..1ead820b 100644 --- a/colab/chap17.ipynb +++ b/colab/chap17.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 17\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -104,8 +118,7 @@ "plot(data.insulin, 'go', label='insulin')\n", "decorate(xlabel='Time (min)',\n", " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig01.pdf')" + "\n" ] }, { @@ -189,8 +202,7 @@ "\n", "decorate(xlabel='Time (min)',\n", " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig02.pdf')" + "\n" ] }, { diff --git a/colab/chap18.ipynb b/colab/chap18.ipynb index e8e6df35..70f215fa 100644 --- a/colab/chap18.ipynb +++ b/colab/chap18.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 18\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -273,8 +287,7 @@ "\n", "decorate(xlabel='Time (min)', \n", " ylabel='Concentration (arbitrary units)')\n", - "\n", - "savefig('figs/chap18-fig01.pdf')" + "\n" ] }, { @@ -396,8 +409,7 @@ "plot(results2.G, 'C2--', label='run_ode_solver')\n", "\n", "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n", - "\n", - "savefig('figs/chap18-fig02.pdf')" + "\n" ] }, { diff --git a/colab/chap20.ipynb b/colab/chap20.ipynb index 46fc858c..3327ed2e 100644 --- a/colab/chap20.ipynb +++ b/colab/chap20.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 20\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -233,8 +247,7 @@ " decorate(xlabel='Time (s)',\n", " ylabel='Position (m)')\n", "\n", - "plot_position(results)\n", - "savefig('figs/chap20-fig01.pdf')" + "plot_position(results)\n" ] }, { diff --git a/colab/chap21.ipynb b/colab/chap21.ipynb index 54539d62..f644024c 100644 --- a/colab/chap21.ipynb +++ b/colab/chap21.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 21\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -287,8 +301,7 @@ " decorate(xlabel='Time (s)',\n", " ylabel='Position (m)')\n", " \n", - "plot_position(results)\n", - "savefig('figs/chap21-fig01.pdf')" + "plot_position(results)\n" ] }, { diff --git a/colab/chap22.ipynb b/colab/chap22.ipynb index 5a41edee..8464813a 100644 --- a/colab/chap22.ipynb +++ b/colab/chap22.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 22\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "# check if the libraries we need are installed\n", "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -717,8 +731,7 @@ "\n", "decorate(xlabel='Time (s)',\n", " ylabel='Position (m)')\n", - "\n", - "savefig('figs/chap22-fig01.pdf')" + "\n" ] }, { @@ -769,8 +782,7 @@ " decorate(xlabel='x position (m)',\n", " ylabel='y position (m)')\n", "\n", - "plot_trajectory(results)\n", - "savefig('figs/chap22-fig02.pdf')" + "plot_trajectory(results)\n" ] }, { diff --git a/colab/chap23.ipynb b/colab/chap23.ipynb index 0eca5394..918d2da3 100644 --- a/colab/chap23.ipynb +++ b/colab/chap23.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 23\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -257,8 +271,7 @@ " ylabel='Range (m)',\n", " title='Range as a function of launch angle',\n", " legend=False)\n", - "\n", - "savefig('figs/chap23-fig01.pdf')" + "\n" ] }, { diff --git a/colab/chap24.ipynb b/colab/chap24.ipynb index 6d7e6b52..9052b971 100644 --- a/colab/chap24.ipynb +++ b/colab/chap24.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 24\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -456,8 +470,7 @@ " subplot(3, 1, 3)\n", " plot_r(results)\n", "\n", - "plot_three(results)\n", - "savefig('figs/chap24-fig01.pdf')" + "plot_three(results)\n" ] }, { diff --git a/colab/chap25.ipynb b/colab/chap25.ipynb index 5c74611e..96cb2878 100644 --- a/colab/chap25.ipynb +++ b/colab/chap25.ipynb @@ -4,29 +4,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 25\n", + "# Chapter xx" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", "\n", - "Copyright 2017 Allen Downey\n", + "Copyright 2021 Allen Downey\n", "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", + "# check if the libraries we need are installed\n", "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" ] }, { @@ -467,8 +481,7 @@ "subplot(2, 1, 1)\n", "plot_theta(results)\n", "subplot(2, 1, 2)\n", - "plot_omega(results)\n", - "savefig('figs/chap25-fig01.pdf')" + "plot_omega(results)\n" ] }, { From 57aaa2a46a27eb99bcae1e92ced22b698bfba8f8 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 23 Jan 2021 11:52:35 -0500 Subject: [PATCH 014/144] Updating README --- README.md | 95 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 969d35d2..b0c6fe6c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,6 @@ # ModSimPython -Text and supporting code for Modeling and Simulation in Python -You can run the code from the repository in a browser by pressing the Binder button below. - -[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/AllenDowney/ModSimPy/master?filepath=notebooks) +Text and supporting code for *Modeling and Simulation in Python*. *Modeling and Simulation in Python* is an introduction to physical modeling using a computational approach. It is organized in three parts: @@ -23,8 +20,78 @@ Python is an ideal programming language for this material. It is a good first l [This](http://greenteapress.com/wp/modsimpy/) and other Free Books by Allen Downey are available from [Green Tea Press](http://greenteapress.com/wp). -Getting started ---------------- +## Getting started + +There are three ways to work with the code: + +* You can run the notebooks on Colab. + +* You can run them on Binder. + +* You can download them and run them in your own Jupyter environment. + +### Colab + +Use these links to run the notebooks on Colab: + +* [chap01.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap01.ipynb) + +* [chap02.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap02.ipynb) + +* [chap03.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap03.ipynb) + +* [chap04.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap04.ipynb) + +* [chap05.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap05.ipynb) + +* [chap06.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap06.ipynb) + +* [chap07.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap07.ipynb) + +* [chap08.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap08.ipynb) + +* [chap09.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap09.ipynb) + +* [chap10.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap10.ipynb) + +* [chap11.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap11.ipynb) + +* [chap12.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap12.ipynb) + +* [chap13.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap13.ipynb) + +* [chap13ode.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap13ode.ipynb) + +* [chap14.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap14.ipynb) + +* [chap15.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap15.ipynb) + +* [chap16.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap16.ipynb) + +* [chap17.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap17.ipynb) + +* [chap18.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap18.ipynb) + +* [chap20.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap20.ipynb) + +* [chap21.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap21.ipynb) + +* [chap22.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap22.ipynb) + +* [chap23.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap23.ipynb) + +* [chap24.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap24.ipynb) + +* [chap25.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap25.ipynb) + +### Binder + +You can run the code from the repository in a browser by pressing the Binder button below. + +[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/AllenDowney/ModSimPy/master?filepath=notebooks) + + +### Install Jupyter To run the examples and work on the exercises in this book, you have to: @@ -38,11 +105,9 @@ To run the examples and work on the exercises in this book, you have to: text. The next three sections provide details for these steps. I wish there -were an easier way to get started; it’s regrettable that you have to do -so much work before you write your first program. Be persistent! +were an easier way to get started; it’s regrettable that you have to do so much work before you write your first program. Be persistent! -Installing Python ------------------ +#### Installing Python You might already have Python installed on your computer, but you might not have the latest version. To use the code in this book, you need @@ -59,7 +124,7 @@ all files in your home directory, so you don’t need administrator (root) permission to install it, and if you have a version of Python already, Anaconda will not remove or modify it. -Start at [the Anaconda download page](https://www.anaconda.com/distribution/#download-section). +Start at [the Anaconda download page](https://www.anaconda.com/distribution/#download-section). Download the installer for your system and run it. You don’t need administrative privileges to install Anaconda, so I recommend you run the installer as a normal user, @@ -90,11 +155,10 @@ pip install modsimpy ``` That should be everything you need. -Copying my files ----------------- +#### Copying my files The simplest way to get the files for this book is to download a [Zip -archive from GitHub](https://github.com/AllenDowney/ModSimPy/archive/master.zip). +archive from GitHub](https://github.com/AllenDowney/ModSimPy/archive/master.zip). You will need a program like WinZip or gzip to unpack the Zip file. Make a note of the location of the files you download. @@ -153,8 +217,7 @@ git clone https://github.com/YourGitHubUserName/ModSimPy Of course, you should replace with your GitHub user name. After cloning, you should have a new directory called . -Running Jupyter ---------------- +#### Running Jupyter The code for each chapter, and starter code for the exercises, is in Jupyter notebooks. If you have not used Jupyter before, you can read From ed2ea29a86ad1dbf3e98231b4b87d3b3d09a1dbc Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 23 Jan 2021 15:44:23 -0500 Subject: [PATCH 015/144] Updating notebooks --- colab/chap16.ipynb | 4 +-- colab/chap17.ipynb | 42 ++++++++++++++++++---------- colab/chap18.ipynb | 70 +++++++++++++++++++++++++++------------------- colab/chap20.ipynb | 4 +-- colab/chap21.ipynb | 4 +-- colab/chap22.ipynb | 44 +++++++++++++++++++---------- colab/chap23.ipynb | 4 +-- colab/chap24.ipynb | 4 +-- colab/chap25.ipynb | 4 +-- 9 files changed, 111 insertions(+), 69 deletions(-) diff --git a/colab/chap16.ipynb b/colab/chap16.ipynb index f87abcbc..163d9611 100644 --- a/colab/chap16.ipynb +++ b/colab/chap16.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 16" ] }, { @@ -846,7 +846,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap17.ipynb b/colab/chap17.ipynb index 1ead820b..4e65e064 100644 --- a/colab/chap17.ipynb +++ b/colab/chap17.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 17" ] }, { @@ -54,11 +54,25 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time')" + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv(filename, index_col='time')" ] }, { @@ -70,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -88,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -106,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -139,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -155,7 +169,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "scrolled": true }, @@ -173,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -193,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -214,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -230,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -246,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -277,7 +291,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap18.ipynb b/colab/chap18.ipynb index 70f215fa..089fb4b3 100644 --- a/colab/chap18.ipynb +++ b/colab/chap18.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 18" ] }, { @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "tags": [] }, @@ -54,11 +54,25 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" + "data = pd.read_csv(filename, index_col='time');" ] }, { @@ -70,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -88,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -107,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -137,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -153,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -189,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -205,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -239,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -255,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -271,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -305,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -337,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -353,7 +367,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -369,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -385,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -401,7 +415,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -421,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -432,7 +446,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -452,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -461,7 +475,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -470,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -479,7 +493,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -499,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -537,7 +551,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap20.ipynb b/colab/chap20.ipynb index 3327ed2e..f1968b01 100644 --- a/colab/chap20.ipynb +++ b/colab/chap20.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 20" ] }, { @@ -648,7 +648,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap21.ipynb b/colab/chap21.ipynb index f644024c..ae52a9b9 100644 --- a/colab/chap21.ipynb +++ b/colab/chap21.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 21" ] }, { @@ -519,7 +519,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap22.ipynb b/colab/chap22.ipynb index 8464813a..10bc4bcf 100644 --- a/colab/chap22.ipynb +++ b/colab/chap22.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 22" ] }, { @@ -1100,11 +1100,25 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'baseball_drag.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 63, "metadata": {}, "outputs": [], "source": [ - "baseball_drag = pd.read_csv('data/baseball_drag.csv')\n", + "baseball_drag = pd.read_csv(filename)\n", "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n", "mps = mph.to(m/s)\n", "baseball_drag.index = magnitude(mps)\n", @@ -1121,7 +1135,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -1130,7 +1144,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ @@ -1139,7 +1153,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 66, "metadata": {}, "outputs": [], "source": [ @@ -1148,7 +1162,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 67, "metadata": {}, "outputs": [], "source": [ @@ -1157,7 +1171,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ @@ -1166,7 +1180,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 69, "metadata": {}, "outputs": [], "source": [ @@ -1175,7 +1189,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 70, "metadata": {}, "outputs": [], "source": [ @@ -1184,7 +1198,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 71, "metadata": {}, "outputs": [], "source": [ @@ -1193,7 +1207,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 72, "metadata": {}, "outputs": [], "source": [ @@ -1202,7 +1216,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ @@ -1211,7 +1225,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ @@ -1242,7 +1256,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap23.ipynb b/colab/chap23.ipynb index 918d2da3..713d90ae 100644 --- a/colab/chap23.ipynb +++ b/colab/chap23.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 23" ] }, { @@ -576,7 +576,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap24.ipynb b/colab/chap24.ipynb index 9052b971..a2273574 100644 --- a/colab/chap24.ipynb +++ b/colab/chap24.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 24" ] }, { @@ -645,7 +645,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/colab/chap25.ipynb b/colab/chap25.ipynb index 96cb2878..1516eaff 100644 --- a/colab/chap25.ipynb +++ b/colab/chap25.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Chapter xx" + "# Chapter 25" ] }, { @@ -949,7 +949,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.7.9" } }, "nbformat": 4, From c81c2cf5ce83aa6f99803766e757861311cb4a71 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 25 Jan 2021 08:49:03 -0500 Subject: [PATCH 016/144] Update README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index b0c6fe6c..5d66e33b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,4 @@ -# ModSimPython - -Text and supporting code for *Modeling and Simulation in Python*. - +# Modeling and Simulation in Python *Modeling and Simulation in Python* is an introduction to physical modeling using a computational approach. It is organized in three parts: From 2dc75bd7b37ccaac6cf5edfb62a08d7b85718523 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 27 Jan 2021 11:07:43 -0500 Subject: [PATCH 017/144] Revising chapters --- jupyter/chap01.ipynb | 1736 +++++++++++++++++++++++++++++++++++++++++ jupyter/chap02.ipynb | 1744 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3480 insertions(+) create mode 100644 jupyter/chap01.ipynb create mode 100644 jupyter/chap02.ipynb diff --git a/jupyter/chap01.ipynb b/jupyter/chap01.ipynb new file mode 100644 index 00000000..a00e67d7 --- /dev/null +++ b/jupyter/chap01.ipynb @@ -0,0 +1,1736 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "legislative-somalia", + "metadata": {}, + "source": [ + "# Chapter 1" + ] + }, + { + "cell_type": "markdown", + "id": "official-adrian", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "markdown", + "id": "intermediate-monte", + "metadata": {}, + "source": [ + "## Jupyter\n", + "\n", + "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", + "\n", + "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." + ] + }, + { + "cell_type": "markdown", + "id": "natural-locking", + "metadata": {}, + "source": [ + "To run a cell, hold down SHIFT and press ENTER. \n", + "\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", + "\n", + "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", + "\n", + "If you run the following cell, it checks whether the libraries you need are installed. If so, the cell produces no output. If not, you'll see updates from the installer." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "private-paste", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim as ms\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "demographic-athletics", + "metadata": {}, + "source": [ + "If the previous cell runs without producing any error messages, you are all set.\n" + ] + }, + { + "cell_type": "markdown", + "id": "worthy-singer", + "metadata": {}, + "source": [ + "## Modeling\n", + "\n", + "This book is about modeling and simulation of physical systems. The\n", + "following diagram shows what I mean by \"modeling\":\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "fantastic-transition", + "metadata": {}, + "source": [ + "Starting in the lower left, the **system** is something in the real\n", + "world we are interested in. \n", + "To model the system, we have to decide which elements of the real world to include and which we can leave out.\n", + "This process is called **abstraction**.\n", + "\n", + "The result of abstraction is a **model**, which is a description of the system that includes only the features we think are essential. A model\n", + "can be represented in the form of diagrams and equations, which can be\n", + "used for mathematical **analysis**. It can also be implemented in the\n", + "form of a computer program, which can run **simulations**.\n", + "\n", + "The result of analysis and simulation might be a **prediction** about\n", + "what the system will do, an **explanation** of why it behaves the way it\n", + "does, or a **design** intended to achieve a purpose.\n", + "\n", + "We can **validate** predictions and test designs by taking\n", + "**measurements** from the real world and comparing the **data** we get\n", + "with the results from analysis and simulation." + ] + }, + { + "cell_type": "markdown", + "id": "original-startup", + "metadata": {}, + "source": [ + "For any physical system, there are many possible models, each one\n", + "including and excluding different features, or including different\n", + "levels of detail. The goal of the modeling process is to find the model\n", + "best suited to its purpose (prediction, explanation, or design).\n", + "\n", + "Sometimes the best model is the most detailed. If we include more\n", + "features, the model is more realistic, and we expect its predictions to\n", + "be more accurate.\n", + "\n", + "But often a simpler model is better. If we include only the essential\n", + "features and leave out the rest, we get models that are easier to work\n", + "with, and the explanations they provide can be clearer and more\n", + "compelling." + ] + }, + { + "cell_type": "markdown", + "id": "talented-plastic", + "metadata": {}, + "source": [ + "As an example, suppose someone asks you why the orbit of the Earth is\n", + "elliptical. If you model the Earth and Sun as point masses (ignoring\n", + "their actual size), compute the gravitational force between them using\n", + "Newton's law of universal gravitation, and compute the resulting orbit\n", + "using Newton's laws of motion, you can show that the result is an\n", + "ellipse.\n", + "\n", + "Of course, the actual orbit of Earth is not a perfect ellipse, because\n", + "of the gravitational forces of the Moon, Jupiter, and other objects in\n", + "the solar system, and because Newton's laws of motion are only\n", + "approximately true (they don't take into account relativistic effects).\n", + "\n", + "But adding these features to the model would not improve the\n", + "explanation; more detail would only be a distraction from the\n", + "fundamental cause. However, if the goal is to predict the position of\n", + "the Earth with great precision, including more details might be\n", + "necessary." + ] + }, + { + "cell_type": "markdown", + "id": "tamil-conducting", + "metadata": {}, + "source": [ + "Choosing the best model depends on what the model is for. It is usually\n", + "a good idea to start with a simple model, even if it is likely to be too\n", + "simple, and test whether it is good enough for its purpose. Then you can\n", + "add features gradually, starting with the ones you expect to be most\n", + "essential. This process is called **iterative modeling**.\n", + "\n", + "Comparing results of successive models provides a form of **internal\n", + "validation**, so you can catch conceptual, mathematical, and software\n", + "errors. And by adding and removing features, you can tell which ones\n", + "have the biggest effect on the results, and which can be ignored.\n", + "\n", + "Comparing results to data from the real world provides **external\n", + "validation**, which is generally the strongest test." + ] + }, + { + "cell_type": "markdown", + "id": "frequent-initial", + "metadata": {}, + "source": [ + "## The falling penny myth\n", + "\n", + "Let's see an example of how models are used. You might have heard that a\n", + "penny dropped from the top of the Empire State Building would be going\n", + "so fast when it hit the pavement that it would be embedded in the\n", + "concrete; or if it hit a person, it would break their skull.\n", + "\n", + "We can test this myth by making and analyzing a model. To get started,\n", + "we'll assume that the effect of air resistance is small. This will turn out to be a bad assumption, but bear with me.\n", + "If air resistance is negligible, the primary force acting on the penny\n", + "is gravity, which causes the penny to accelerate downward.\n", + "\n", + "If the initial velocity is 0, the velocity after $t$ seconds is \n", + "\n", + "$$v = a t$$\n", + "\n", + "and the distance the penny has dropped is \n", + "\n", + "$$x = a t^2 / 2$$ \n", + "\n", + "To find the time until the penny reaches the sidewalk, we can solve for $t$:\n", + "\n", + "$$t = \\sqrt{ 2 x / a}$$ \n", + "\n", + "Plugging in the acceleration of gravity, $a = 9.8$ m/s$^2$, and the height of the Empire State Building, $x = 381$ m, we get $t = 8.8$ s. \n", + "\n", + "Then computing $v = a t$ we get a velocity on impact of $86$ m/s, which is about 190 miles per hour. That sounds like it could hurt." + ] + }, + { + "cell_type": "markdown", + "id": "covered-yacht", + "metadata": {}, + "source": [ + "Of course, these results are not exact because the model is based on\n", + "simplifications. For example, we assume that gravity is constant. In\n", + "fact, the force of gravity is different on different parts of the globe, and it gets weaker as you move away from the surface. But these differences are small, so ignoring them is probably a good choice for this scenario.\n", + "\n", + "On the other hand, ignoring air resistance is not a good choice. Once\n", + "the penny gets to about 29 m/s, the upward force of air resistance\n", + "equals the downward force of gravity, so the penny stops accelerating.\n", + "This is the **terminal velocity** of the penny in air.\n", + "\n", + "Once the penny reaches terminal velocity, it doesn't matter how much farther it falls; it hits the sidewalk at about 29 m/s.\n", + "That's much less than 86 m/s, as the simple model predicts." + ] + }, + { + "cell_type": "markdown", + "id": "basic-cincinnati", + "metadata": {}, + "source": [ + "The statistician George Box famously said \"All models are wrong, but\n", + "some are useful.\" He was talking about statistical models, but his wise words apply to all kinds of models. Our first model, which ignores air resistance, is very wrong, and probably not useful. The second model, which takes air resistance into account, is still wrong, but it's better, and it's good enough to refute the myth.\n", + "\n", + "The television show *Mythbusters* has tested the myth of the falling\n", + "penny more carefully; you can view the results at\n", + ". Their work is based on a mathematical model of motion, measurements to determine the force of air resistance on a penny, and a physical model of a human head." + ] + }, + { + "cell_type": "markdown", + "id": "accessory-therapist", + "metadata": {}, + "source": [ + "## Computation\n", + "\n", + "Let me show you how I computed the results from the\n", + "previous section using Python.\n", + "First we'll create a variable to represent acceleration due to gravity in meters per second squared (m/s^2)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "going-steps", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8" + ] + }, + { + "cell_type": "markdown", + "id": "shared-acquisition", + "metadata": {}, + "source": [ + "A **variable** is a name that corresponds to a value. In this example, the name is `a` and the value is the number `9.8`.\n", + "\n", + "Suppose we let the penny drop for $3.4$ seconds (s). I'll create a variable to represent this time:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "comparative-investigation", + "metadata": {}, + "outputs": [], + "source": [ + "t = 3.4" + ] + }, + { + "cell_type": "markdown", + "id": "disturbed-village", + "metadata": {}, + "source": [ + "Now we can compute the velocity of the penny after `t` seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "featured-procurement", + "metadata": {}, + "outputs": [], + "source": [ + "v = a * t" + ] + }, + { + "cell_type": "markdown", + "id": "convinced-differential", + "metadata": {}, + "source": [ + "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation.\n", + "\n", + "When you assign a value to a variable, Jupyter does not show the result automatically, but you can display the value of a variable like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "joined-solomon", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "33.32" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v" + ] + }, + { + "cell_type": "markdown", + "id": "excess-valuation", + "metadata": {}, + "source": [ + "After $3.4$ s, the velocity of the penny is about $33$ m/s (ignoring air resistance). Now let's see how far it would travel during that time:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "norwegian-vitamin", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "56.644" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = a * t**2 / 2\n", + "x" + ] + }, + { + "cell_type": "markdown", + "id": "discrete-stable", + "metadata": {}, + "source": [ + "It would travel about $56$ m. Now, going in the other direction, let's compute the time it takes to fall 381 m, the height of the Empire State Building." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "solar-contest", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381" + ] + }, + { + "cell_type": "markdown", + "id": "welcome-article", + "metadata": {}, + "source": [ + "For this computation, we need the square root function, which is provided by a library called NumPy.\n", + "Before we can use it, we have to import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "irish-deposit", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sqrt" + ] + }, + { + "cell_type": "markdown", + "id": "residential-victorian", + "metadata": {}, + "source": [ + "Now we can use it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "blond-graham", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8.817885349720552" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "adjacent-reading", + "metadata": {}, + "source": [ + "With no air resistance, it would take about $8.8$ s for the penny to reach the sidewalk." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "early-qualification", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "86.41527642726142" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "hungarian-tongue", + "metadata": {}, + "source": [ + "And its velocity on impact would be about $86$ m/s.\n", + "\n", + "Python displays results with about 16 digits, which gives the impression that they are very precise, but don't be fooled.\n", + "The numbers we get out are only as good as the numbers we put in.\n", + "\n", + "For example, the \"roof height\" of the Empire State Building is $380$ m [according to Wikipedia](https://en.wikipedia.org/wiki/Empire_State_Building).\n", + "I chose $h=381$ m for this example on the assumption that the observation deck is on the roof and you drop the penny from a 1 meter railing.\n", + "But that's probably not right, so we should treat this value as an approximation where only the first two digits are likely to be right.\n", + "\n", + "If the precision of the inputs is two digits, the precision of the outputs is two digits, *at most*.\n", + "That's why, if the output is `86.41527642726142`, I report it as \"about 86\"." + ] + }, + { + "cell_type": "markdown", + "id": "gothic-muscle", + "metadata": {}, + "source": [ + "## Computation with units\n", + "\n", + "The computation in the previous section uses numbers without units. \n", + "When we set `h=381`, we left out the meters, and when we set `a=9.8`, we left out the meters per second squared.\n", + "And, when we got the result `v=86`, we added back the meters per second.\n", + "\n", + "Leaving units of out computation is common practice, but it tends to cause errors, including the very expensive failure of the [Mars Climate Orbiter](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter) in 1999.\n", + "When possible, it is better to include units in the computation.\n", + "\n", + "To represent units, we'll use a Python library called [Pint](https://pint.readthedocs.io/en/latest/).\n", + "The ModSim library initializes Pint and provides an object called `units` that contains variables representing pretty much every unit you've ever heard of.\n", + "\n", + "We can import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "satellite-consultancy", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import units" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-motor", + "metadata": {}, + "source": [ + "Now we can create variables named `meter` and `second`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "contrary-robin", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "meter" + ], + "text/latex": [ + "$\\mathrm{meter}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "meter = units.meter\n", + "meter" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "relative-aircraft", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "second" + ], + "text/latex": [ + "$\\mathrm{second}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "second = units.second\n", + "second" + ] + }, + { + "cell_type": "markdown", + "id": "identified-saskatchewan", + "metadata": {}, + "source": [ + "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." + ] + }, + { + "cell_type": "markdown", + "id": "relevant-musician", + "metadata": {}, + "source": [ + "We can use `meter` and `second` to create a variable named `a` and give it the value of acceleration due to gravity. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "patent-logistics", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "9.8 meter/second2" + ], + "text/latex": [ + "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" + ], + "text/plain": [ + "9.8 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 9.8 * meter / second**2\n", + "a" + ] + }, + { + "cell_type": "markdown", + "id": "judicial-bradley", + "metadata": {}, + "source": [ + "The result is a **quantity** with two parts, called `magnitude` and `units`, which we can access like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "nearby-ministry", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9.8" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.magnitude" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "express-adelaide", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "meter/second2" + ], + "text/latex": [ + "$\\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.units" + ] + }, + { + "cell_type": "markdown", + "id": "assumed-finland", + "metadata": {}, + "source": [ + "Now we can create a quantity that represents $3.4$ s." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "formal-twenty", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "3.4 second" + ], + "text/latex": [ + "$3.4\\ \\mathrm{second}$" + ], + "text/plain": [ + "3.4 " + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = 3.4 * second\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "strong-patch", + "metadata": {}, + "source": [ + "And use it to compute the distance a penny would fall after `t` seconds with constant acceleration `a`. " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "wanted-wells", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "56.644 meter" + ], + "text/latex": [ + "$56.644\\ \\mathrm{meter}$" + ], + "text/plain": [ + "56.644 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a * t**2 / 2" + ] + }, + { + "cell_type": "markdown", + "id": "known-relationship", + "metadata": {}, + "source": [ + "Notice that the units of the result are correct.\n", + "If we create a quantity to represent the height of the Empire State Building:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "certified-sperm", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381 * meter" + ] + }, + { + "cell_type": "markdown", + "id": "married-mexico", + "metadata": {}, + "source": [ + "We can use it to compute the time to reach the sidewalk." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fossil-syria", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "8.817885349720552 second" + ], + "text/latex": [ + "$8.817885349720552\\ \\mathrm{second}$" + ], + "text/plain": [ + "8.817885349720552 " + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "superior-packet", + "metadata": {}, + "source": [ + "And the velocity of the penny on impact:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "oriental-vulnerability", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "86.41527642726142 meter/second" + ], + "text/latex": [ + "$86.41527642726142\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" + ], + "text/plain": [ + "86.41527642726142 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "complicated-welcome", + "metadata": {}, + "source": [ + "As in the previous section, the result is about $86$, but now it has the correct units, m/s.\n", + "\n", + "With Pint quantities, we can convert from one set of units to another like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "adolescent-layout", + "metadata": {}, + "outputs": [], + "source": [ + "mile = units.mile\n", + "hour = units.hour" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "extra-rendering", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "193.30546802805438 mile/hour" + ], + "text/latex": [ + "$193.30546802805438\\ \\frac{\\mathrm{mile}}{\\mathrm{hour}}$" + ], + "text/plain": [ + "193.30546802805438 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v.to(mile/hour)" + ] + }, + { + "cell_type": "markdown", + "id": "silver-learning", + "metadata": {}, + "source": [ + "If you are more familiar with miles per hour, this result might be easier to interpret.\n", + "And it might give you a sense that this model is not realistic." + ] + }, + { + "cell_type": "markdown", + "id": "hazardous-input", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces a modeling framework that consists of three steps:\n", + "\n", + "* Abstraction is the process of defining a model, deciding which elements of the real world to include and which can be left out.\n", + "\n", + "* Analysis and simulation are ways to use a model to generate predictions, explain why things behave as they to, and design things that behave as we want.\n", + "\n", + "* Validation is how we test whether the model is right, often by comparing predictions with measurements from the real world.\n", + "\n", + "As a first example, we modeled a penny dropped from the Empire State building, including gravity but ignoring air resistance.\n", + "In the exercises, you'll have a chance to try a better model, including air resistance.\n", + "\n", + "This chapter also presents Pint, a library for doing computation with units, which is convenient for converting between different units and important for avoiding catastrophic errors." + ] + }, + { + "cell_type": "markdown", + "id": "organized-senate", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "aging-offense", + "metadata": {}, + "source": [ + "**Exercise** In mathematical notation, we can write an equation like $v = a t$ and it's understood that we are multiplying $a$ and $t$.\n", + "But that doesn't work in Python. If you put two variables side-by-side, like this:\n", + "\n", + "```\n", + "v = a t\n", + "```\n", + "\n", + "you'll get a **syntax error**, which means that something is wrong with the punctuation of the program.\n", + "\n", + "Try it out in the next cell so you see what the error message looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "macro-constitution", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "33.32 meter/second" + ], + "text/latex": [ + "$33.32\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" + ], + "text/plain": [ + "33.32 " + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = 9.8 * meter / second**2\n", + "t = 3.4 * second\n", + "\n", + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "entitled-carrier", + "metadata": {}, + "source": [ + "**Exercise:** In this chapter we used the `sqrt` function from the NumPy library. NumPy also provides a variable named `pi` that contains an approximation of the mathematical constant $\\pi$.\n", + "We can import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "continuous-catalyst", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.141592653589793" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import pi\n", + "pi" + ] + }, + { + "cell_type": "markdown", + "id": "medieval-milan", + "metadata": {}, + "source": [ + "NumPy provides other functions we'll use, including `log`, `exp`, `sin`, and `cos`.\n", + "Import `sin` and `cos` from NumPy and compute\n", + "\n", + "$$sin^2 \\pi/4 + cos^2 \\pi/4$$\n", + "\n", + "Note: A mathematical identity tells us that the answer should be $1$." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "interested-graduate", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "from numpy import sin, cos\n", + "\n", + "sin(pi/4)**2 + cos(pi/4)**2" + ] + }, + { + "cell_type": "markdown", + "id": "fewer-collector", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", + "\n", + "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", + "\n", + "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "damaged-glenn", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381 * meter" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "baking-maldives", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "384.048 meter" + ], + "text/latex": [ + "$384.048\\ \\mathrm{meter}$" + ], + "text/plain": [ + "384.048 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "foot = units.foot\n", + "pole_height = 10 * foot\n", + "\n", + "h + pole_height" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "lovely-acrylic", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "1260.0 foot" + ], + "text/latex": [ + "$1260.0\\ \\mathrm{foot}$" + ], + "text/plain": [ + "1260.0 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "pole_height + h" + ] + }, + { + "cell_type": "markdown", + "id": "cooperative-bradley", + "metadata": {}, + "source": [ + "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "environmental-cover", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "t = 3.4 * second" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "hindu-possession", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "continued-pharmacy", + "metadata": {}, + "source": [ + "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", + "\n", + "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", + "\n", + "1. Start from the bottom and read up.\n", + "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", + "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", + "\n", + "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." + ] + }, + { + "cell_type": "markdown", + "id": "angry-artist", + "metadata": {}, + "source": [ + "**Exercise:** Suppose instead of dropping the penny, you throw it downward at its terminal velocity, $29$ m/s. How long would it take to fall $381$ m?" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "dressed-harrison", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "13.137931034482758 second" + ], + "text/latex": [ + "$13.137931034482758\\ \\mathrm{second}$" + ], + "text/plain": [ + "13.137931034482758 " + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "h = 381 * meter\n", + "v = 29 * meter / second\n", + "\n", + "t = h / v\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "electrical-jersey", + "metadata": {}, + "source": [ + "**Exercise:** So far we have considered two models of a falling penny:\n", + "\n", + "* If we ignore air resistance, the penny falls with constant acceleration, and we can compute the time to reach the sidewalk and the velocity of the penny when it gets there.\n", + "\n", + "* If we take air resistance into account, and drop the penny at its terminal velocity, it falls with constant velocity. \n", + "\n", + "Now let's consider a third model that includes elements of the first two: let's assume that the acceleration of the penny is `a` until the penny reaches $29$ m/s, and then $0$ m/s afterwards. What is the total time for the penny to fall $381$ m?" + ] + }, + { + "cell_type": "markdown", + "id": "economic-bahrain", + "metadata": {}, + "source": [ + "You can break this question into three parts:\n", + "\n", + "1. How long would the penny take to reach $29$ m/s with constant acceleration `a`.\n", + "2. How far would it fall during that time?\n", + "3. How long would it take to fall the remaining distance with constant velocity $29$ m/s?\n", + "\n", + "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "packed-salem", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "h = 381 * meter" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "understanding-point", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "v_terminal = 29 * meter / second " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "baking-cooling", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time to reach terminal velocity 2.9591836734693877 second\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "t1 = v_terminal / a\n", + "print('Time to reach terminal velocity', t1)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "instructional-parliament", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Height fallen in t1 42.90816326530612 meter\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "h1 = a * t1**2 / 2\n", + "print('Height fallen in t1', h1)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "breeding-sport", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time to fall remaining distance 11.658339197748065 second\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "t2 = (h - h1) / v_terminal\n", + "print('Time to fall remaining distance', t2)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "bulgarian-excuse", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total falling time 14.617522871217453 second\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "t_total = t1 + t2\n", + "print('Total falling time', t_total)" + ] + }, + { + "cell_type": "markdown", + "id": "regional-monitoring", + "metadata": {}, + "source": [ + "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that, when he threw a fastball, he was throwing the ball down; that is, the ball was leaving his hand at a downward angle.\n", + "I was skeptical; watching from the side, I thought the ball was leaving his hand at an upward angle.\n", + "\n", + "Can you think of a simple model you could use to settle the argument? What factors would you include and what could you ignore? What quantities would you have to look up or estimate?\n", + "\n", + "I suggest you convert all quantities to [SI units](https://en.wikipedia.org/wiki/International_System_of_Units): meters and seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "statutory-music", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# I suggest the following model: \n", + "\n", + "# 1. Let's ignore the motion of the ball toward home plate and\n", + "# think about how far the ball would drop while it's in flight.\n", + "\n", + "# 2. Let's ignore air resistance. Since we are only thinking \n", + "# about the relatively slow motion in the vertical direction, \n", + "# this is probably a good assumption.\n", + "\n", + "# 3. Let's also ignore the effect of spin. This is probably a\n", + "# less good assumption.\n", + "\n", + "# The distance from the pitcher's mound to home plate is about 60\n", + "# feet, but the point where the ball is released is a bit closer.\n", + "\n", + "# An average pitcher in high school might be able to throw a ball\n", + "# at 80 mph." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "antique-discussion", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "v = (80 * mile / hour).to(meter/second)\n", + "x = (60 * foot).to(meter)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "directed-manchester", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "0.5113636363636364 second" + ], + "text/latex": [ + "$0.5113636363636364\\ \\mathrm{second}$" + ], + "text/plain": [ + "0.5113636363636364 " + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "t = x / v\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "ideal-version", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "1.2813145661157026 meter" + ], + "text/latex": [ + "$1.2813145661157026\\ \\mathrm{meter}$" + ], + "text/plain": [ + "1.2813145661157026 " + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "a = 9.8 * meter / second**2\n", + "h = a * t**2 / 2\n", + "h" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "contrary-technique", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# In the time it takes the ball to reach home plate, it drops\n", + "# about 1.3 m. If the release point is at 2 m, which is plausible,\n", + "# it would cross the plate at 0.7 m, which is in the strike zone.\n", + "\n", + "# So I could be wrong -- it is plausible that the ball leaves\n", + "# the pitcher's hand at a downward angle, at least for some pitches." + ] + }, + { + "cell_type": "markdown", + "id": "upset-harvey", + "metadata": {}, + "source": [ + "**Exercise:** Suppose I run a 10K race in 44:52. What is my average page in minutes per mile?" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "alert-negative", + "metadata": {}, + "outputs": [], + "source": [ + "mile = units.mile\n", + "kilometer = units.kilometer\n", + "minute = units.minute" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "correct-cuisine", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "2692.0 second" + ], + "text/latex": [ + "$2692.0\\ \\mathrm{second}$" + ], + "text/plain": [ + "2692.0 " + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "t = 52 * second + 44 * minute\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "reflected-accuracy", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "0.003714710252600297 kilometer/second" + ], + "text/latex": [ + "$0.003714710252600297\\ \\frac{\\mathrm{kilometer}}{\\mathrm{second}}$" + ], + "text/plain": [ + "0.003714710252600297 " + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "v = 10 * kilometer / t\n", + "v" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "inner-river", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "7.220590079999998 minute/mile" + ], + "text/latex": [ + "$7.220590079999998\\ \\frac{\\mathrm{minute}}{\\mathrm{mile}}$" + ], + "text/plain": [ + "7.220590079999998 " + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "pace = (1 / v).to(minute / mile)\n", + "pace" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "abstract-musical", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "7.0 minute/mile" + ], + "text/latex": [ + "$7.0\\ \\frac{\\mathrm{minute}}{\\mathrm{mile}}$" + ], + "text/plain": [ + "7.0 " + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "# To convert to minutes and seconds, we can use np.round.\n", + "# But we haven't covered that yet.\n", + "\n", + "from numpy import round\n", + "\n", + "round(pace)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "radical-junior", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "13.235404799999895 second/mile" + ], + "text/latex": [ + "$13.235404799999895\\ \\frac{\\mathrm{second}}{\\mathrm{mile}}$" + ], + "text/plain": [ + "13.235404799999895 " + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "remainder = pace - round(pace)\n", + "remainder.to(second/mile)" + ] + }, + { + "cell_type": "markdown", + "id": "banned-surname", + "metadata": {}, + "source": [ + "## Jupyter" + ] + }, + { + "cell_type": "markdown", + "id": "american-rainbow", + "metadata": {}, + "source": [ + "### Adding and removing cells\n", + "\n", + "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", + "\n", + "Try the following exercises:\n", + "\n", + "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", + "\n", + "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", + "\n", + "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", + "\n", + "4. In the new cell, type some text, and then run it.\n", + "\n", + "5. Use the arrow buttons in the toolbar to move cells up and down.\n", + "\n", + "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", + "\n", + "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", + "\n", + "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "id": "radical-kenya", + "metadata": {}, + "source": [ + "### Restart and run all\n", + "\n", + "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", + "\n", + "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", + "\n", + "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "growing-jumping", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap02.ipynb b/jupyter/chap02.ipynb new file mode 100644 index 00000000..90a93b05 --- /dev/null +++ b/jupyter/chap02.ipynb @@ -0,0 +1,1744 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "british-hampshire", + "metadata": {}, + "source": [ + "# Chapter 2" + ] + }, + { + "cell_type": "markdown", + "id": "plastic-target", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "confirmed-melbourne", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + " \n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "parliamentary-bailey", + "metadata": {}, + "source": [ + "# Bike share\n", + "\n", + "This chapter presents a simple model of a bike share system and\n", + "demonstrates the features of Python we'll use to develop simulations of\n", + "real-world systems.\n", + "\n", + "Along the way, we'll make decisions about how to model the system. In\n", + "the next chapter we'll review these decisions and gradually improve the\n", + "model.\n", + "\n", + "## Modeling\n", + "\n", + "Imagine a bike share system for students traveling between Olin College\n", + "and Wellesley College, which are about 3 miles apart in eastern\n", + "Massachusetts.\n", + "\n", + "Suppose the system contains 12 bikes and two bike racks, one at Olin and\n", + "one at Wellesley, each with the capacity to hold 12 bikes.\n", + "\n", + "As students arrive, check out a bike, and ride to the other campus, the\n", + "number of bikes in each location changes. In the simulation, we'll need\n", + "to keep track of where the bikes are. To do that, we'll use a function called `State`, which is defined in the ModSim library.\n", + "We can import it like this." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "after-publisher", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State" + ] + }, + { + "cell_type": "markdown", + "id": "encouraging-input", + "metadata": {}, + "source": [ + "Now we can call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "organic-consequence", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "id": "varied-croatia", + "metadata": {}, + "source": [ + "The expressions in parentheses are **keyword arguments**.\n", + "They create two variables, `olin` and `wellesley`, and give them values.\n", + "\n", + "Then we call the `State` function.\n", + "The result is a `State` object, which is a collection of **state variables**.\n", + "\n", + "In this example, the state variables represent the number of\n", + "bikes at each location. The initial values are 10 and 2, indicating that there are 10 bikes at Olin and 2 at Wellesley. \n", + "\n", + "The `State` object is assigned to a new variable named `bikeshare`.\n", + "We can read the variables inside a `State` object using the **dot\n", + "operator**, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "above-woman", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "unnecessary-jewelry", + "metadata": {}, + "source": [ + "And this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "sacred-hours", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "organizational-husband", + "metadata": {}, + "source": [ + "Or, to display the state variables and their values, you can just type the name of the object:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "primary-carrier", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "namespace(olin=10, wellesley=2)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "american-worship", + "metadata": {}, + "source": [ + "These values make up the **state** of the system.\n", + "We can update the state by assigning new values to the variables. \n", + "For example, if a student moves a bike from Olin to Wellesley, we can figure out the new values and assign them:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "beautiful-priority", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin = 9\n", + "bikeshare.wellesley = 3" + ] + }, + { + "cell_type": "markdown", + "id": "adjusted-baghdad", + "metadata": {}, + "source": [ + "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", + "`olin` and add 1 to `wellesley`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "another-boating", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin -= 1\n", + "bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "finite-taste", + "metadata": {}, + "source": [ + "The result is the same either way." + ] + }, + { + "cell_type": "markdown", + "id": "fiscal-addition", + "metadata": {}, + "source": [ + "## Defining functions\n", + "\n", + "So far we have used functions defined in NumPy and ModSim. Now we're going to define our own function.\n", + "\n", + "When you are developing code in Jupyter, it is often efficient to write a few lines of code, test them to confirm they do what you intend, and then use them to define a new function. For example, these lines move a bike from Olin to Wellesley:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "miniature-milton", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin -= 1\n", + "bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "imperial-account", + "metadata": {}, + "source": [ + "Rather than repeat them every time a bike moves, we can define a new\n", + "function:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "peaceful-scroll", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "illegal-newfoundland", + "metadata": {}, + "source": [ + "`def` is a special word in Python that indicates we are defining a new\n", + "function. The name of the function is `bike_to_wellesley`. The empty\n", + "parentheses indicate that this function requires no additional\n", + "information when it runs. The colon indicates the beginning of an\n", + "indented **code block**.\n", + "\n", + "The next two lines are the **body** of the function. They have to be\n", + "indented; by convention, the indentation is 4 spaces.\n", + "\n", + "When you define a function, it has no immediate effect. The body of the\n", + "function doesn't run until you **call** the function. Here's how to call\n", + "this function:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cordless-portrait", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "potential-fourth", + "metadata": {}, + "source": [ + "When you call the function, it runs the statements in the body, which\n", + "update the variables of the `bikeshare` object; you can check by\n", + "displaying the new state." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "fabulous-hopkins", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin6
wellesley6
\n", + "
" + ], + "text/plain": [ + "namespace(olin=6, wellesley=6)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "coated-pathology", + "metadata": {}, + "source": [ + "When you call a function, you have to include the parentheses. If you\n", + "leave them out, you get this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "alternate-province", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bike_to_wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "living-national", + "metadata": {}, + "source": [ + "This result indicates that `bike_to_wellesley` is a function. You don't\n", + "have to know what `__main__` means, but if you see something like this,\n", + "it probably means that you looked up a function but you didn't actually\n", + "call it. So don't forget the parentheses." + ] + }, + { + "cell_type": "markdown", + "id": "impossible-scheme", + "metadata": {}, + "source": [ + "## Print statements\n", + "\n", + "As you write more complicated programs, it is easy to lose track of what\n", + "is going on. One of the most useful tools for debugging is the **print\n", + "statement**, which displays text in the Jupyter notebook.\n", + "\n", + "Normally when Jupyter runs the code in a cell, it displays the value of\n", + "the last line of code. For example, if you run:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "functional-handbook", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare.olin\n", + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "naval-architect", + "metadata": {}, + "source": [ + "Jupyter runs both lines, but it only displays the value of the\n", + "second. If you want to display more than one value, you can use\n", + "print statements:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "fleet-marathon", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "6\n" + ] + } + ], + "source": [ + "print(bikeshare.olin)\n", + "print(bikeshare.wellesley)" + ] + }, + { + "cell_type": "markdown", + "id": "literary-integrity", + "metadata": {}, + "source": [ + "When you call the `print` function, you can put a variable name in\n", + "parentheses, as in the previous example, or you can provide a sequence\n", + "of variables separated by commas, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "accessory-porcelain", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6 6\n" + ] + } + ], + "source": [ + "print(bikeshare.olin, bikeshare.wellesley)" + ] + }, + { + "cell_type": "markdown", + "id": "sustained-dallas", + "metadata": {}, + "source": [ + "Python looks up the values of the variables and displays them; in this\n", + "example, it displays two values on the same line, with a space between\n", + "them.\n", + "\n", + "Print statements are useful for debugging functions. For example, we can\n", + "add a print statement to `move_bike`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "stone-oliver", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " print('Moving a bike to Wellesley')\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "pharmaceutical-combat", + "metadata": {}, + "source": [ + "Each time we call this version of the function, it displays a message,\n", + "which can help us keep track of what the program is doing.\n", + "The message in this example is a **string**, which is a sequence of\n", + "letters and other symbols in quotes.\n", + "\n", + "Just like `bike_to_wellesley`, we can define a function that moves a\n", + "bike from Wellesley to Olin:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "loose-arlington", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin():\n", + " print('Moving a bike to Olin')\n", + " bikeshare.wellesley -= 1\n", + " bikeshare.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "prostate-launch", + "metadata": {}, + "source": [ + "And call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "compatible-transcript", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Olin\n" + ] + } + ], + "source": [ + "bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "clean-bleeding", + "metadata": {}, + "source": [ + "One benefit of defining functions is that you avoid repeating chunks of\n", + "code, which makes programs smaller. Another benefit is that the name you\n", + "give the function documents what it does, which makes programs more\n", + "readable." + ] + }, + { + "cell_type": "markdown", + "id": "prescribed-observer", + "metadata": {}, + "source": [ + "## If statements\n", + "\n", + "The ModSim library provides a function called `flip`, which we can import like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "elegant-doubt", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import flip" + ] + }, + { + "cell_type": "markdown", + "id": "steady-arrow", + "metadata": {}, + "source": [ + "When you call it, you provide a probability between 0 and 1, like `0.7`, as an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "improving-simulation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flip(0.7)" + ] + }, + { + "cell_type": "markdown", + "id": "brown-header", + "metadata": {}, + "source": [ + "The result is one of two values: `True` with probability 0.7 or `False`\n", + "with probability 0.3. If you run `flip` like this 100 times, you should\n", + "get `True` about 70 times and `False` about 30 times. But the results\n", + "are random, so they might differ from these expectations.\n", + "\n", + "`True` and `False` are special values defined by Python. Note that they\n", + "are not strings. There is a difference between `True`, which is a\n", + "special value, and `'True'`, which is a string.\n", + "\n", + "`True` and `False` are called **boolean** values because they are\n", + "related to Boolean algebra ().\n", + "\n", + "We can use boolean values to control the behavior of the program, using\n", + "an **if statement**:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "organizational-portable", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " print('heads')" + ] + }, + { + "cell_type": "markdown", + "id": "covered-freedom", + "metadata": {}, + "source": [ + "If the result from `flip` is `True`, the program displays the string\n", + "`'heads'`. Otherwise it does nothing.\n", + "\n", + "The syntax for `if` statements is similar to the syntax for\n", + "function definitions: the first line has to end with a colon, and the\n", + "lines inside the `if` statement have to be indented.\n", + "\n", + "Optionally, you can add an **else clause** to indicate what should\n", + "happen if the result is `False`:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "auburn-sphere", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tails\n" + ] + } + ], + "source": [ + "if flip(0.5):\n", + " print('heads')\n", + "else:\n", + " print('tails') " + ] + }, + { + "cell_type": "markdown", + "id": "collected-venice", + "metadata": {}, + "source": [ + "Now we can use `flip` to simulate the arrival of students who want to\n", + "borrow a bike. Suppose students arrive at the Olin station every 2\n", + "minutes, on average. In that case, the chance of an arrival during any\n", + "one-minute period is 50%, and we can simulate it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "incident-somalia", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "twenty-brand", + "metadata": {}, + "source": [ + "If students arrive at the Wellesley station every 3 minutes, on average,\n", + "the chance of an arrival during any one-minute period is 33%, and we can\n", + "simulate it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "variable-drain", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.33):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "loved-kentucky", + "metadata": {}, + "source": [ + "We can combine these snippets into a function that simulates a **time\n", + "step**, which is an interval of time, in this case one minute:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "smoking-spectrum", + "metadata": {}, + "outputs": [], + "source": [ + "def step():\n", + " if flip(0.5):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(0.33):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "educational-color", + "metadata": {}, + "source": [ + "Then we can simulate a time step like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "offensive-meter", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n" + ] + } + ], + "source": [ + "step()" + ] + }, + { + "cell_type": "markdown", + "id": "bridal-stage", + "metadata": {}, + "source": [ + "Even though there are no values in parentheses, we have to include them." + ] + }, + { + "cell_type": "markdown", + "id": "adult-window", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "The previous version of `step` is fine if the arrival probabilities\n", + "never change, but in reality, these probabilities vary over time.\n", + "\n", + "So instead of putting the constant values 0.5 and 0.33 in `step` we can replace them with **parameters**. Parameters are variables whose values are set when a function is called.\n", + "\n", + "Here's a version of `step` that takes two parameters, `p1` and `p2`:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "funky-macintosh", + "metadata": {}, + "outputs": [], + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "swiss-distributor", + "metadata": {}, + "source": [ + "The values of `p1` and `p2` are not set inside this function; instead,\n", + "they are provided when the function is called, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "pleased-vision", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n" + ] + } + ], + "source": [ + "step(0.5, 0.33)" + ] + }, + { + "cell_type": "markdown", + "id": "located-inspector", + "metadata": {}, + "source": [ + "The values you provide when you call the function are called\n", + "**arguments**. The arguments, `0.5` and `0.33` in this example, get\n", + "assigned to the parameters, `p1` and `p2`, in order. So running this\n", + "function has the same effect as:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "known-edgar", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n" + ] + } + ], + "source": [ + "p1 = 0.5\n", + "p2 = 0.33\n", + "\n", + "if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + "if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "periodic-heath", + "metadata": {}, + "source": [ + "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", + "\n", + "Adding parameters to a function is called **generalization**, because it makes the function more general, that is, less specialized." + ] + }, + { + "cell_type": "markdown", + "id": "indonesian-shelter", + "metadata": {}, + "source": [ + "## For loops\n", + "\n", + "At some point you will get sick of running cells over and over.\n", + "Fortunately, there is an easy way to repeat a chunk of code, the **for\n", + "loop**. Here's an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "welcome-crossing", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "Moving a bike to Wellesley\n", + "2\n", + "Moving a bike to Wellesley\n", + "3\n", + "Moving a bike to Wellesley\n" + ] + } + ], + "source": [ + "for i in range(1, 4):\n", + " print(i)\n", + " bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "motivated-study", + "metadata": {}, + "source": [ + "The syntax here should look familiar; the first line ends with a\n", + "colon, and the lines inside the `for` loop are indented. The other\n", + "elements of the loop are:\n", + "\n", + "- The words `for` and `in` are special words we have to use in a for\n", + " loop.\n", + "\n", + "- `range` is a Python function we're using here to control the number of times the loop runs.\n", + "\n", + "- `i` is a **loop variable** that gets created when the for loop runs.\n", + "\n", + "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `1`; the second time, it is `2`; the third time, it is `3`.\n", + "\n", + "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley.\n", + "\n", + "It might seem strange that the loop stops when `i` is `3`, but that's how `range` works: it includes the first argument, `1`, but not the second, `4`.\n", + "\n", + "Now, since we have moved a number of bikes around, let's start again with a new `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "passing-notification", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "id": "linear-cleaner", + "metadata": {}, + "source": [ + "We'll use this `bikeshare` in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "successful-rough", + "metadata": {}, + "source": [ + "## TimeSeries\n", + "\n", + "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", + "corresponding sequence of values. In this example, the time stamps are\n", + "integers representing minutes, and the values are the number of bikes at one location.\n", + "\n", + "We can create a new, empty `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "approved-bruce", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "results = TimeSeries()" + ] + }, + { + "cell_type": "markdown", + "id": "extensive-uniform", + "metadata": {}, + "source": [ + "And we can add a value to a `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "affected-syntax", + "metadata": {}, + "outputs": [], + "source": [ + "results[0] = bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "rational-assault", + "metadata": {}, + "source": [ + "The number in brackets is the time stamp, also called a **label**.\n", + "\n", + "We can use a `TimeSeries` inside a for loop to store the results of the\n", + "simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "optical-ordinary", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "Moving a bike to Wellesley\n", + "2\n", + "3\n", + "4\n" + ] + } + ], + "source": [ + "for i in range(1, 5):\n", + " print(i)\n", + " step(0.3, 0.2)\n", + " results[i] = bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "dutch-sheep", + "metadata": {}, + "source": [ + "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", + "Then we store the number of bikes at Olin in `results`. \n", + "We use the loop variable, `i`, as the time stamp.\n", + "\n", + "When the loop exits, `results` contains 5 time stamps, from 0 through\n", + "4, and the number of bikes at Olin at the end of each time step.\n", + "\n", + "We can display the `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "allied-hobby", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 10\n", + "1 9\n", + "2 9\n", + "3 9\n", + "4 9\n", + "dtype: int64" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "id": "found-indonesia", + "metadata": {}, + "source": [ + "The left column displays the timestamps; the right column displays the values (which might be negative, depending on the state of the system).\n", + "At the bottom, `dtype` is the type of the data in the `TimeSeries`; you can ignore this for now.\n", + "\n", + "ModSim provides a function called `display` that displays the `TimeSeries` as a table:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "compound-globe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
010
19
29
39
49
\n", + "
" + ], + "text/plain": [ + " values\n", + "0 10\n", + "1 9\n", + "2 9\n", + "3 9\n", + "4 9" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import display\n", + "\n", + "display(results)" + ] + }, + { + "cell_type": "markdown", + "id": "dated-canyon", + "metadata": {}, + "source": [ + "You don't have to use `display`, but I think it looks better." + ] + }, + { + "cell_type": "markdown", + "id": "senior-mexico", + "metadata": {}, + "source": [ + "## Plotting\n", + "\n", + "ModSim provides a function called `plot` we can use to plot\n", + "the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "persistent-replication", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAflElEQVR4nO3deXCc9Z3n8fe3dfqSD1nyoW7HNhiMcXxIjYcQ8HCEG4wBS5VkNyRkJoQdWGCXqhxbtUmmsrO7WbKTKTabpahAJlPJQCzbMZc5PJDgYggBybexic1lS77k+5BlXd/9Qx2PEC27pZb0PN39eVW5pO7+dT8ffpPxx8/Tz/N7zN0REREJm0jQAURERJJRQYmISCipoEREJJRUUCIiEkoqKBERCaX8oAMkM378eJ86dWrQMUREZAjU19cfcPeyns+HsqCmTp1KXV1d0DFERGQImNnHyZ7XIT4REQklFZSIiISSCkpEREIplN9BiYhku7a2NhoaGmhpaQk6ypApLi4mGo1SUFCQ0ngVlIhIABoaGhg1ahRTp07FzIKOM+jcnYMHD9LQ0MC0adNSeo8O8YmIBKClpYXS0tKcKCcAM6O0tLRPe4wqKBGRgORKOf1ZX/97z1lQZvakme03s83dnhtnZqvNbHvi59he3nuDmb1nZjvM7Dt9SiYiIjktlT2ofwRu6PHcd4BX3X0G8Gri8SeYWR7wf4EbgVnAl8xsVlppU9Te0cnR5rah2JSISMYyMx5++OEzj3/84x/zgx/8ILhAPZyzoNx9DXCox9O3Ab9M/P5LYHGSty4Adrj7B+7eCjydeN+g6uh0vvD3r/M/Xtw62JsSEcloRUVFrFixggMHDgQdJan+fgc1wd33ACR+licZUwHs6va4IfFcUmZ2j5nVmVldU1NTP2NBXsSITx3Hcxt209za3u/PERHJdvn5+dxzzz385Cc/+dRrH3/8Mddccw1z5szhmmuuYefOnQB87Wtf44EHHuCyyy5j+vTpLFu27Mx7HnnkES655BLmzJnD97///fTzpf0JvUv2bViv95d398eBxwHi8Xha96GvicdYVt/Aqk17WVIVTeejREQG3d8+t4V3dx8b0M+cNbmE79968TnH3XfffcyZM4dvfetbn3j+/vvv56677uKrX/0qTz75JA888AArV64EYM+ePbzxxhts27aNRYsWsWTJEl555RW2b9/O22+/jbuzaNEi1qxZw8KFC/v939DfPah9ZjYJIPFzf5IxDUCs2+MosLuf2+uTS6aOZWrpcGrrdp17sIhIDispKeGuu+7i0Ucf/cTzf/jDH/jyl78MwFe+8hXeeOONM68tXryYSCTCrFmz2LdvHwCvvPIKr7zyCvPnz6eyspJt27axffv2tLL1dw/qWeCrwP9M/HwmyZh3gBlmNg1oBL4IfLmf2+sTM6M6HuORl9/jowMnmTp+xFBsVkSkX1LZ0xlMDz30EJWVldx99929jul+inhRUdGZ3939zM/vfve7fPOb3xywXKmcZv4U8AfgQjNrMLO/oquYrjWz7cC1iceY2WQzW5UI2w7cD7wMbAWWuvuWAUt+DndWRokYLKtvGKpNiohkpHHjxlFTU8MTTzxx5rnLLruMp59+GoBf//rXXH755Wf9jOuvv54nn3ySEydOANDY2Mj+/ckOrqXunHtQ7v6lXl66JsnY3cBN3R6vAlb1O10aJo4uZuEFZSyrb+A/XXsBeZHcuiBORKQvHn74YX7605+eefzoo4/y9a9/nUceeYSysjJ+8YtfnPX91113HVu3buVzn/scACNHjuRXv/oV5eXJzqFLjf159yxM4vG4D8QNC1dt2sPf/Hotv/z6Av7ygk/drFFEJDBbt27loosuCjrGkEv2321m9e4e7zk2q5c6uuaicsYOL2CpTpYQEck4WV1QRfl53DavgtVb9nH4ZGvQcUREpA+yuqCg65qo1o5OnlnfGHQUEZFPCONXLIOpr/+9WV9QsyaXMLuihKV1OptPRMKjuLiYgwcP5kxJ/fl+UMXFxSm/JyduWFgTj/G9Z7awufEosytGBx1HRIRoNEpDQwPpLO2Waf58R91U5URBLZo7mf/2wlaW1TeooEQkFAoKClK+s2yuyvpDfABjhhdy3awJ/HZdIy1tHUHHERGRFOREQUHXYb6jp9r4l637go4iIiIpyJmC+vz545k8uphanSwhIpIRcqag8iLGkqooa7Y3sfvIqaDjiIjIOeRMQQEsqYrhDivWai9KRCTscqqgppQO59Lp41ha10BnZ25ceyAikqlyqqCg62SJnYeaefujQ0FHERGRs8i5grpx9iRGFuXrZAkRkZDLuYIaVpjHrXMns2rTHo63tAUdR0REepFzBQVQHY9yqq2DFzbuCTqKiIj0IicLan5sDOeXj9R9okREQiwnC8rMqIlHWbvzCDv2nwg6joiIJJGTBQVw+/woeRGjtl57USIiYZSzBVU2qoirLixneX0jbR2dQccREZEecragAGriUQ6cOM3r7+XO/VhERDJFThfUVTPLGT+yUCdLiIiEUE4XVEFehDsqo7y2bT8HTpwOOo6IiHST0wUFUF0Vpb3TWbmuMegoIiLSTc4X1IwJo5gXG8Nv3tmFuxaQFREJi5wvKOhaQHb7/hNsaDgadBQREUlQQQG3zJ1EcUGEWp0sISISGioooKS4gJtmT+LZ9bs51doRdBwREUEFdcaSeJTjp9t5ecveoKOIiAgqqDMunVZKbNwwXRMlIhISKqiESMSororx5vsH2XWoOeg4IiI5TwXVzZ1VUcxgWb3utisiEjQVVDcVY4Zx+fnjWVbfQGenrokSEQmSCqqH6niMxiOnePP9g0FHERHJaSqoHq6bNYGS4nydLCEiErC0CsrMHjSzzWa2xcweSvL6aDN7zsw2JMbcnc72hkJxQR6L51fw0pa9HG1uCzqOiEjO6ndBmdls4BvAAmAucIuZzegx7D7gXXefC1wJ/G8zK+zvNodKTTxGa3snz27cHXQUEZGclc4e1EXAW+7e7O7twOvA7T3GODDKzAwYCRwC2tPY5pC4eHIJMyeO0tJHIiIBSqegNgMLzazUzIYDNwGxHmN+SleR7QY2AQ+6e9L7q5vZPWZWZ2Z1TU3B3uHWzKiJx9jYcJSte44FmkVEJFf1u6DcfSvwI2A18BKwgU/vHV0PrAcmA/OAn5pZSS+f97i7x909XlZW1t9YA2bx/AoK8ozaOl0TJSIShLROknD3J9y90t0X0nX4bnuPIXcDK7zLDuBDYGY62xwq40YUcu2sCaxc30hre9KdPhERGUTpnsVXnvg5BbgDeKrHkJ3ANYkxE4ALgQ/S2eZQqo7HOHSylde27Qs6iohIzkn3OqjlZvYu8Bxwn7sfNrN7zezexOs/BC4zs03Aq8C33f1AmtscMgtnlDGhpIilOswnIjLk8tN5s7tfkeS5x7r9vhu4Lp1tBCkvYtxZGeWx199n37EWJpQUBx1JRCRnaCWJc6iOx+h0WLG2MegoIiI5RQV1DtPGj2DB1HHU1u3CXQvIiogMFRVUCpbEo3xw4CT1Hx8OOoqISM5QQaXg5s9OYnhhnhaQFREZQiqoFIwoyueWOZN4fuMeTp4O/UpNIiJZQQWVopp4jObWDlZt2hN0FBGRnKCCSlHVZ8YyffwILX0kIjJEVFApMjOWxKO8/dEhPmg6EXQcEZGsp4Lqgzsro0QMltVrL0pEZLCpoPpgQkkxV15YzvK1DXR06pooEZHBpILqo5p4lH3HTrNme7D3rBIRyXYqqD66euYExo0o1N12RUQGmQqqjwrzIyyeV8Hqd/dx6GRr0HFERLKWCqofai6J0tbhrFynBWRFRAaLCqofZk4sYU50NEu1gKyIyKBRQfVTdTzGtr3H2bL7WNBRRESykgqqnxbNmUxhfkQLyIqIDBIVVD+NHl7ADRdPZOW6RlraOoKOIyKSdVRQaaiJxzjW0s7qd/cFHUVEJOuooNJw2XmlVIwZpsN8IiKDQAWVhkjEuLMqyhs7DtB45FTQcUREsooKKk3VVVHcYbkWkBURGVAqqDTFxg3nsvNKqa3fRacWkBURGTAqqAFQE4+x69Ap/vjhoaCjiIhkDRXUALhh9kRGFedrAVkRkQGkghoAxQV53Dp3Mqs27+FYS1vQcUREsoIKaoDUxGO0tHXy/IY9QUcREckKKqgBMjc6mgsmjKS2Xof5REQGggpqgJgZNfEY63YeYfu+40HHERHJeCqoAbR4fgX5EaNW10SJiKRNBTWAxo8s4uqZ5axY20BbR2fQcUREMpoKaoDVxGMcONHK77btDzqKiEhGU0ENsCsvLKNsVJEO84mIpEkFNcDy8yLcUVnBa9v2s/94S9BxREQylgpqEFRXxejodFauaww6iohIxlJBDYLzy0dSOWUMS+sacNcCsiIi/ZFWQZnZg2a22cy2mNlDvYy50szWJ8a8ns72MklNPMaO/SdYv+tI0FFERDJSvwvKzGYD3wAWAHOBW8xsRo8xY4CfAYvc/WKguv9RM8vNcyYxrCCPpXU6WUJEpD/S2YO6CHjL3ZvdvR14Hbi9x5gvAyvcfSeAu+fMudejigu48bMTeW7Dbk61dgQdR0Qk46RTUJuBhWZWambDgZuAWI8xFwBjzez3ZlZvZnf19mFmdo+Z1ZlZXVNTUxqxwqMmHuPE6XZe3KwFZEVE+qrfBeXuW4EfAauBl4ANQHuPYflAFXAzcD3wX83sgl4+73F3j7t7vKysrL+xQuUvpo3jM6XDWar7RImI9FlaJ0m4+xPuXunuC4FDwPYeQxqAl9z9pLsfANbQ9X1VTjAzqquivPXBIXYebA46johIRkn3LL7yxM8pwB3AUz2GPANcYWb5icOAfwFsTWebmebOqihmsEy34RAR6ZN0r4NabmbvAs8B97n7YTO718zuhTOHAV8CNgJvAz93981pbjOjTBo9jCtmlLGsvoGOTl0TJSKSqvx03uzuVyR57rEejx8BHklnO5muJh7l/n9ex7/uOMDCC7Lj+zURkcGmlSSGwLWzJjBmeIEWkBUR6QMV1BAoys9j8bwKXt6ylyPNrUHHERHJCCqoIbKkKkpreyfPbtgddBQRkYygghoisytGM2tSia6JEhFJkQpqCNXEo2xuPMa7u48FHUVEJPRUUEPotnkVFOZFqNU1USIi56SCGkJjRxRy7cUTWLmukdPtWkBWRORsVFBDrLoqyuHmNl7dmjMLu4uI9IsKaohdMaOMiSXFOllCROQcVFBDLC9iLKmKsuZPTew92hJ0HBGR0FJBBWBJVZROh+VrtbKEiEhvVFABmDp+BAumjaO2bhfuWkBWRCQZFVRAauIxPjrYzDsfHQ46iohIKKmgAnLTZycyojCPWp0sISKSlAoqIMML87l17mRe2LSHE6fbg44jIhI6KqgAVcdjNLd2sGrjnqCjiIiEjgoqQJVTxjC9bISuiRIRSUIFFSAzoyYeo+7jw7zfdCLoOCIioaKCCtgd8yvIixjLdLddEZFPUEEFrLykmKsuLGN5fQPtHZ1BxxERCQ0VVAgsqYqx//hp1mxvCjqKiEhoqKBC4OqZ5ZSOKGTpOzrMJyLyZyqoECjMj3D7/Ape3baPgydOBx1HRCQUVFAhUR2P0dbhrFy/O+goIiKhoIIKiQsnjmJudLQWkBURSVBBhUh1PMa2vcfZ1Hg06CgiIoFTQYXIrXMnU5Qf0coSIiKooEJl9LACbpw9kWfX76alrSPoOCIigVJBhUxNPMaxlnZe3rI36CgiIoFSQYXMpdNLiY4dRm2drokSkdymggqZSMRYUhXlX98/QMPh5qDjiIgERgUVQkuqogAsr28MOImISHBUUCEUHTucz583ntr6XXR26pooEclNKqiQqo5HaTh8irc+OBh0FBGRQKigQur6iycyqjhf10SJSM5SQYVUcUEet82bzIub93L0VFvQcUREhpwKKsRq4jFOt3fy/EYtICsiuSetgjKzB81ss5ltMbOHzjLuEjPrMLMl6Wwv13y2YjQzJ45iqa6JEpEc1O+CMrPZwDeABcBc4BYzm5FkXB7wI+Dl/m4rV5l1XRO1YdcR3tt7POg4IiJDKp09qIuAt9y92d3bgdeB25OM+4/AcmB/GtvKWbfPryA/YtTqZAkRyTHpFNRmYKGZlZrZcOAmINZ9gJlV0FVaj53rw8zsHjOrM7O6pqamNGJll9KRRXzhogn8dl0jbR2dQccRERky/S4od99K16G71cBLwAagvcewfwC+7e7nXJrb3R9397i7x8vKyvobKyvVXBLl4MlWXtumnVARyR1pnSTh7k+4e6W7LwQOAdt7DIkDT5vZR8AS4GdmtjidbeaihTPKKB9VpMN8IpJT0j2LrzzxcwpwB/BU99fdfZq7T3X3qcAy4G/cfWU628xF+XkR7qiM8rv3mth/rCXoOCIiQyLd66CWm9m7wHPAfe5+2MzuNbN7ByCbdFMdj9LR6axYpwVkRSQ35KfzZne/IslzSU+IcPevpbOtXHde2UjinxlLbd0uvrlwOmYWdCQRkUGllSQySE08xvtNJ1m780jQUUREBp0KKoPcNGcSwwrydLKEiOQEFVQGGVmUz81zJvHcht00t/Y8o19EJLuooDJMTTzGydYOXty0N+goIiKDSgWVYS6ZOpappcN1nygRyXoqqAxjZlTHY/zxw0N8dOBk0HFERAaNCioD3VFZQcRgWb1uwyEi2UsFlYEmjR7GwgvKWFbfQEenBx1HRGRQqKAyVE08xt5jLbyx40DQUUREBoUKKkNdc1E5Y4cX6GQJEclaKqgMVZSfx23zKli9ZR+HT7YGHUdEZMCpoDJYTTxGa0cnz6zXArIikn1UUBls1uQSZleUUKuz+UQkC6mgMlxNPMaW3cfY3Hg06CgiIgNKBZXhFs2dTGFeRNdEiUjWUUFluDHDC7nu4gn8dl0jLW0dQccRERkwKqgsUBOPcfRUG/+ydV/QUUREBowKKgt8/vzxTB5dTG2dDvOJSPZQQWWBvIixpCrKmu1N7D5yKug4IiIDQgWVJZZUxXCHFWu1FyUi2UEFlSWmlA7n0unjqK1vwF0LyIpI5lNBZZGaeIyPDzbz9oeHgo4iIpI2FVQWuXH2JEYW5bNUJ0uISBZQQWWRYYV53Dp3Eqs27eF4S1vQcURE0qKCyjLV8Rin2jp4YeOeoKOIiKRFBZVl5sfGcH75SN0nSkQyngoqy5gZNfEoa3ceYcf+E0HHERHpNxVUFrp9fpS8iFFbr70oEclcKqgsVDaqiKsuLGd5fSNtHZ1BxxER6RcVVJaqiUc5cOI0r7/XFHQUEZF+UUFlqatmljN+ZKEO84lIxlJBZamCvAh3VEZ5det+Dpw4HXQcEZE+U0FlseqqKO2dzsp1jUFHERHpMxVUFpsxYRTzYmP4zTu7tICsiGQcFVSWq4nH2L7/BBsajgYdRUSkT1RQWe6WuZMoLohQq5UlRCTDpFVQZvagmW02sy1m9lCS1/+dmW1M/HnTzOamsz3pu5LiAm6aPYln1+/mVGtH0HFERFLW74Iys9nAN4AFwFzgFjOb0WPYh8Bfuvsc4IfA4/3dnvTfkniU46fbeXnL3qCjiIikLJ09qIuAt9y92d3bgdeB27sPcPc33f1w4uFbQDSN7Uk/XTqtlNi4YVpAVkQySjoFtRlYaGalZjYcuAmInWX8XwEv9vaimd1jZnVmVtfUpNUPBlIkYlRXxXjz/YPsOtQcdBwRkZT0u6DcfSvwI2A18BKwAWhPNtbMrqKroL59ls973N3j7h4vKyvrbyzpxZ1VUcxgWb3utisimSGtkyTc/Ql3r3T3hcAhYHvPMWY2B/g5cJu7H0xne9J/FWOGcfn541lW30Bnp66JEpHwS/csvvLEzynAHcBTPV6fAqwAvuLuf0pnW5K+6niMxiOnePN9/TtBRMIvP833LzezUqANuM/dD5vZvQDu/hjwPaAU+JmZAbS7ezzNbUo/XTdrAiXF+Syt28XlM8YHHUdE5KzSKih3vyLJc491+/2vgb9OZxsycIoL8lg8v4Kn39nF0eY2Rg8vCDqSiEivtJJEjqmJx2ht7+TZjbuDjiIiclYqqBxz8eQSZk4cpaWPRCT0VFA5xsyoicfY2HCUbXuPBR1HRKRXKqgctHh+BQV5Rm2drokSkfBSQeWgcSMKuXbWBH67rpHW9s6g44iIJKWCylHVVTEOnWzltW37go4iIpKUCipHXTFjPBNKiliqw3wiElIqqByVnxfhzsoov39vP/uOtQQdR0TkU1RQOaw6HqPTYcXaxqCjiIh8igoqh00bP4IFU8dRW7cLdy0gKyLhooLKcUviUT44cJL6jw+fe7CIyBBSQeW4mz87ieGFebrbroiEjgoqx40oyueWOZN4YeMeTp5Oer9JEZFAqKCEmniMk60drNq0J+goIiJnqKCEqs+MZfr4EVr6SERCRQUlmBlL4lHe/ugQHzSdCDqOiAiggpKEOyujRAyW1WsvSkTCQQUlAEwoKebKC8tZvraBjk5dEyUiwVNByRk18Sj7jp1mzfamoKOIiKig5N9cPXMC40YU6m67IhIKKig5ozA/wuJ5Fax+dx+HTrYGHUdEcpwKSj6h5pIobR3OM+u1gKyIBEsFJZ8wc2IJc6Kj+c07WkBWRIKlgpJPqa6Ksm3vcbbsPhZ0FBHJYSoo+ZRFcysozI9oAVkRCZQKSj5l9PACbrh4IivXNdLS1hF0HBHJUSooSaomHuNYSzur390XdBQRyVEqKEnqsvNKqRgzTIf5RCQwKihJKhIx7qyK8saOAzQeORV0HBHJQSoo6VV1VRR3WK4FZEUkACoo6VVs3HAuO6+UZfUNdGoBWREZYiooOauaeIydh5r544eHgo4iIjlGBSVndf3FExlVlK8FZEVkyKmg5KyGFeZx67zJrNq8h2MtbUHHEZEcooKSc6qJx2hp6+SFjXuCjiIiOUQFJec0NzqaCyaM1DVRIjKk0iooM3vQzDab2RYzeyjJ62Zmj5rZDjPbaGaV6WxPgmFm1MRjrNt5hO37jgcdR0RyRL8LysxmA98AFgBzgVvMbEaPYTcCMxJ/7gH+X3+3J8FaPL+C/IhRq2uiRGSI5Kfx3ouAt9y9GcDMXgduB/5XtzG3Af/kXTcWesvMxpjZJHfXlxkZZvzIIq6eWc6KtQ18bnopWNCJRCQMFs4oIy8yOH8hpFNQm4G/M7NS4BRwE1DXY0wF0P2Li4bEc58qKDO7h669LKZMmZJGLBksX1owhVfe3cfd//hO0FFEJCS2/fAG8iJ5g/LZ/S4od99qZj8CVgMngA1Ae49hyWo16ZIE7v448DhAPB7XsgUhdNXMcl566ApOteoWHCLSpTBv8M61S2cPCnd/AngCwMz+O117SN01ALFuj6PA7nS2KcGaObEk6AgikiPSPYuvPPFzCnAH8FSPIc8CdyXO5rsUOKrvn0REJBVp7UEByxPfQbUB97n7YTO7F8DdHwNW0fXd1A6gGbg7ze2JiEiOSPcQ3xVJnnus2+8O3JfONkREJDdpJQkREQklFZSIiISSCkpEREJJBSUiIqGkghIRkVBSQYmISChZ15ng4WJmTcDHaX7MeODAAMQZCso6eDIpr7IOnkzKm4tZP+PuZT2fDGVBDQQzq3P3eNA5UqGsgyeT8irr4MmkvMr6b3SIT0REQkkFJSIioZTNBfV40AH6QFkHTyblVdbBk0l5lTUha7+DEhGRzJbNe1AiIpLBVFAiIhJKGV9QZnaDmb1nZjvM7DtJXjczezTx+kYzqwwiZyLLubJeaWZHzWx94s/3gsiZyPKkme03s829vB6meT1X1jDNa8zMfmdmW81si5k9mGRMKOY2xayhmFszKzazt81sQyLr3yYZE4p5TWRJJW8o5rZbnjwzW2dmzyd5bXDm1t0z9g+QB7wPTAcKgQ3ArB5jbgJeBAy4FPhjiLNeCTwf9LwmsiwEKoHNvbweinlNMWuY5nUSUJn4fRTwpxD/bzaVrKGY28RcjUz8XgD8Ebg0jPPah7yhmNtuef4z8M/JMg3W3Gb6HtQCYIe7f+DurcDTwG09xtwG/JN3eQsYY2aThjooqWUNDXdfAxw6y5CwzGsqWUPD3fe4+9rE78eBrUBFj2GhmNsUs4ZCYq5OJB4WJP70PAMsFPMKKecNDTOLAjcDP+9lyKDMbaYXVAWwq9vjBj79/0CpjBkKqeb4XGK3/0Uzu3hoovVLWOY1VaGbVzObCsyn61/P3YVubs+SFUIyt4lDUOuB/cBqdw/1vKaQF0Iyt8A/AN8COnt5fVDmNtMLypI81/NfIamMGQqp5FhL15pUc4H/A6wc7FBpCMu8piJ082pmI4HlwEPufqzny0neEtjcniNraObW3TvcfR4QBRaY2eweQ0I1rynkDcXcmtktwH53rz/bsCTPpT23mV5QDUCs2+MosLsfY4bCOXO4+7E/7/a7+yqgwMzGD13EPgnLvJ5T2ObVzAro+gv/1+6+IsmQ0MztubKGbW4TOY4Avwdu6PFSaOa1u97yhmhuPw8sMrOP6Ppq4moz+1WPMYMyt5leUO8AM8xsmpkVAl8Enu0x5lngrsRZJpcCR919z1AHJYWsZjbRzCzx+wK6/u9zcMiTpiYs83pOYZrXRI4ngK3u/ve9DAvF3KaSNSxza2ZlZjYm8fsw4AvAth7DQjGvkFresMytu3/X3aPuPpWuv7dec/d/32PYoMxtfrofECR3bzez+4GX6TpL7kl332Jm9yZefwxYRdcZJjuAZuDuEGddAvwHM2sHTgFf9MQpMkPNzJ6i6yyi8WbWAHyfri9yQzWvkFLW0MwrXf8a/QqwKfH9A8B/AaZA6OY2laxhmdtJwC/NLI+uv8iXuvvzYfy7ICGVvGGZ26SGYm611JGIiIRSph/iExGRLKWCEhGRUFJBiYhIKKmgREQklFRQIiISSiooEREJJRWUiIiE0v8HXt9JK1JZmQkAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import plot\n", + "\n", + "plot(results)" + ] + }, + { + "cell_type": "markdown", + "id": "mexican-recipe", + "metadata": {}, + "source": [ + "The legend for this figure says \"None\" because we have not provided a label. Here's how we can do that:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "hollow-george", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(results, label='Olin')" + ] + }, + { + "cell_type": "markdown", + "id": "romantic-measure", + "metadata": {}, + "source": [ + "Whenever you make a figure, you should label the axes. The ModSim\n", + "library provides `decorate`, which we can use to labels the axes and give the figure a title:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "occupied-claim", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "plot(results, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "id": "practical-fruit", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces the tools we need to run simulations, record the results, and plot them.\n", + "\n", + "We used a `State` object to represent the state of the system.\n", + "Then we used the `flip` function and an `if` statement to simulate a single time step.\n", + "\n", + "We used `for` loop to simulate a series of steps, and a `TimeSeries` to record the results.\n", + "\n", + "Finally, we used `plot` and `decorate` to plot the results.\n", + "\n", + "In the next chapter, we will extend this simulation to make it a little more realistic." + ] + }, + { + "cell_type": "markdown", + "id": "bronze-adventure", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "headed-invite", + "metadata": {}, + "source": [ + "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", + "\n", + "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "compressed-utilization", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "\n", + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "cheap-panama", + "metadata": {}, + "source": [ + "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "elect-makeup", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
babson0
\n", + "
" + ], + "text/plain": [ + "namespace(olin=10, wellesley=2, babson=0)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "bikeshare = State(olin=10, wellesley=2, babson=0)\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "prescribed-white", + "metadata": {}, + "source": [ + "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", + "\n", + "It should:\n", + "\n", + "1. Create a `TimeSeries` object to hold the results.\n", + "\n", + "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", + "\n", + "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", + "\n", + "4. After the for loop, it should plot the results and\n", + "\n", + "5. Decorate the axes.\n", + "\n", + "To test your function:\n", + "\n", + "1. Create a `State` object with the initial state of the system.\n", + "\n", + "2. Call `run_simulation` with appropriate parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "strategic-reporter", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def run_simulation(p1, p2, num_steps):\n", + " results = TimeSeries()\n", + " results[0] = bikeshare.olin\n", + " \n", + " for i in range(1, num_steps):\n", + " step(p1, p2)\n", + " results[i] = bikeshare.olin\n", + " \n", + " plot(results, label='Olin')\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "adjustable-zoning", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Olin\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(0.3, 0.2, 60)" + ] + }, + { + "cell_type": "markdown", + "id": "eleven-listening", + "metadata": {}, + "source": [ + "## Opening the hood\n", + "\n", + "This section contains additional information about the functions we've used an pointers to their documentation.\n", + "\n", + "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." + ] + }, + { + "cell_type": "markdown", + "id": "liable-reliance", + "metadata": {}, + "source": [ + "The `State` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." + ] + }, + { + "cell_type": "markdown", + "id": "naked-department", + "metadata": {}, + "source": [ + "The `TimeSeries` object is based on the `Series` object defined by a library called Pandas.\n", + "The documentation is at .\n", + "\n", + "`display` works by creating another Pandas object, called a `DataFrame`, which can be displayed as a table.\n", + "We'll use `DataFrame` objects in future chapters." + ] + }, + { + "cell_type": "markdown", + "id": "derived-province", + "metadata": {}, + "source": [ + "`Series` objects provide their own `plot` function, but the syntax is different from the other functions we've used, so ModSim provides a function called `plot` just to make it consistent.\n", + "\n", + "`decorate` is based on Matplotlib, which is most widely-used plotting function for Python. Matplotlib provides separate functions for `title`, `xlabel`, and `ylabel`.\n", + "`decorate` makes them a little easier to use." + ] + }, + { + "cell_type": "markdown", + "id": "southeast-advertiser", + "metadata": {}, + "source": [ + "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", + "\n", + "You can get the source code for `flip` by running the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "tested-blond", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "def flip(p=0.5):\n", + " \"\"\"Flips a coin with the given probability.\n", + "\n", + " p: float 0-1\n", + "\n", + " returns: boolean (True or False)\n", + " \"\"\"\n", + " return np.random.random() < p\n", + "\n" + ] + } + ], + "source": [ + "from modsim import source_code\n", + "\n", + "source_code(flip)" + ] + }, + { + "cell_type": "markdown", + "id": "rational-taiwan", + "metadata": {}, + "source": [ + "You might not understand everything in this function yet, but you will." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "significant-defense", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 7ac719da92c6d9a88c61eb4f10d21cdecbfae0b8 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 28 Jan 2021 10:49:23 -0500 Subject: [PATCH 018/144] Revising chapters --- jupyter/chap01.ipynb | 202 +++--- jupyter/chap02.ipynb | 443 +++++++------ jupyter/chap03.ipynb | 1077 +++++++++++++++++++++++++++++++ jupyter/chap04.ipynb | 1208 +++++++++++++++++++++++++++++++++++ jupyter/chap05.ipynb | 1450 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 4049 insertions(+), 331 deletions(-) create mode 100644 jupyter/chap03.ipynb create mode 100644 jupyter/chap04.ipynb create mode 100644 jupyter/chap05.ipynb diff --git a/jupyter/chap01.ipynb b/jupyter/chap01.ipynb index a00e67d7..c1d987fc 100644 --- a/jupyter/chap01.ipynb +++ b/jupyter/chap01.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "legislative-somalia", + "id": "uniform-persian", "metadata": {}, "source": [ "# Chapter 1" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "official-adrian", + "id": "biblical-enhancement", "metadata": { "tags": [ "remove-cell" @@ -26,7 +26,7 @@ }, { "cell_type": "markdown", - "id": "intermediate-monte", + "id": "confirmed-budapest", "metadata": {}, "source": [ "## Jupyter\n", @@ -38,7 +38,7 @@ }, { "cell_type": "markdown", - "id": "natural-locking", + "id": "danish-scope", "metadata": {}, "source": [ "To run a cell, hold down SHIFT and press ENTER. \n", @@ -53,7 +53,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "private-paste", + "id": "asian-america", "metadata": { "tags": [ "remove-cell" @@ -78,7 +78,7 @@ }, { "cell_type": "markdown", - "id": "demographic-athletics", + "id": "copyrighted-desperate", "metadata": {}, "source": [ "If the previous cell runs without producing any error messages, you are all set.\n" @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "worthy-singer", + "id": "hourly-financing", "metadata": {}, "source": [ "## Modeling\n", @@ -99,7 +99,7 @@ }, { "cell_type": "markdown", - "id": "fantastic-transition", + "id": "structured-receiver", "metadata": {}, "source": [ "Starting in the lower left, the **system** is something in the real\n", @@ -123,7 +123,7 @@ }, { "cell_type": "markdown", - "id": "original-startup", + "id": "center-accommodation", "metadata": {}, "source": [ "For any physical system, there are many possible models, each one\n", @@ -143,7 +143,7 @@ }, { "cell_type": "markdown", - "id": "talented-plastic", + "id": "confirmed-highlight", "metadata": {}, "source": [ "As an example, suppose someone asks you why the orbit of the Earth is\n", @@ -167,7 +167,7 @@ }, { "cell_type": "markdown", - "id": "tamil-conducting", + "id": "stretch-geneva", "metadata": {}, "source": [ "Choosing the best model depends on what the model is for. It is usually\n", @@ -187,7 +187,7 @@ }, { "cell_type": "markdown", - "id": "frequent-initial", + "id": "criminal-lunch", "metadata": {}, "source": [ "## The falling penny myth\n", @@ -221,7 +221,7 @@ }, { "cell_type": "markdown", - "id": "covered-yacht", + "id": "documentary-diagnosis", "metadata": {}, "source": [ "Of course, these results are not exact because the model is based on\n", @@ -239,7 +239,7 @@ }, { "cell_type": "markdown", - "id": "basic-cincinnati", + "id": "recent-appliance", "metadata": {}, "source": [ "The statistician George Box famously said \"All models are wrong, but\n", @@ -252,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "accessory-therapist", + "id": "brief-zoning", "metadata": {}, "source": [ "## Computation\n", @@ -265,7 +265,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "going-steps", + "id": "eleven-marine", "metadata": {}, "outputs": [], "source": [ @@ -274,7 +274,7 @@ }, { "cell_type": "markdown", - "id": "shared-acquisition", + "id": "upset-myanmar", "metadata": {}, "source": [ "A **variable** is a name that corresponds to a value. In this example, the name is `a` and the value is the number `9.8`.\n", @@ -285,7 +285,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "comparative-investigation", + "id": "following-launch", "metadata": {}, "outputs": [], "source": [ @@ -294,7 +294,7 @@ }, { "cell_type": "markdown", - "id": "disturbed-village", + "id": "greek-heritage", "metadata": {}, "source": [ "Now we can compute the velocity of the penny after `t` seconds." @@ -303,7 +303,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "featured-procurement", + "id": "mature-duration", "metadata": {}, "outputs": [], "source": [ @@ -312,7 +312,7 @@ }, { "cell_type": "markdown", - "id": "convinced-differential", + "id": "qualified-diabetes", "metadata": {}, "source": [ "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation.\n", @@ -323,7 +323,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "joined-solomon", + "id": "considered-inclusion", "metadata": {}, "outputs": [ { @@ -343,7 +343,7 @@ }, { "cell_type": "markdown", - "id": "excess-valuation", + "id": "northern-saturday", "metadata": {}, "source": [ "After $3.4$ s, the velocity of the penny is about $33$ m/s (ignoring air resistance). Now let's see how far it would travel during that time:" @@ -352,7 +352,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "norwegian-vitamin", + "id": "valued-electricity", "metadata": {}, "outputs": [ { @@ -373,7 +373,7 @@ }, { "cell_type": "markdown", - "id": "discrete-stable", + "id": "yellow-business", "metadata": {}, "source": [ "It would travel about $56$ m. Now, going in the other direction, let's compute the time it takes to fall 381 m, the height of the Empire State Building." @@ -382,7 +382,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "solar-contest", + "id": "closed-month", "metadata": {}, "outputs": [], "source": [ @@ -391,7 +391,7 @@ }, { "cell_type": "markdown", - "id": "welcome-article", + "id": "fuzzy-lease", "metadata": {}, "source": [ "For this computation, we need the square root function, which is provided by a library called NumPy.\n", @@ -401,7 +401,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "irish-deposit", + "id": "nuclear-clone", "metadata": {}, "outputs": [], "source": [ @@ -410,7 +410,7 @@ }, { "cell_type": "markdown", - "id": "residential-victorian", + "id": "unlimited-swiss", "metadata": {}, "source": [ "Now we can use it like this:" @@ -419,7 +419,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "blond-graham", + "id": "quarterly-nightmare", "metadata": {}, "outputs": [ { @@ -440,7 +440,7 @@ }, { "cell_type": "markdown", - "id": "adjacent-reading", + "id": "velvet-oklahoma", "metadata": {}, "source": [ "With no air resistance, it would take about $8.8$ s for the penny to reach the sidewalk." @@ -449,7 +449,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "early-qualification", + "id": "quality-external", "metadata": {}, "outputs": [ { @@ -470,7 +470,7 @@ }, { "cell_type": "markdown", - "id": "hungarian-tongue", + "id": "human-phase", "metadata": {}, "source": [ "And its velocity on impact would be about $86$ m/s.\n", @@ -488,7 +488,7 @@ }, { "cell_type": "markdown", - "id": "gothic-muscle", + "id": "consecutive-sleeve", "metadata": {}, "source": [ "## Computation with units\n", @@ -509,7 +509,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "satellite-consultancy", + "id": "based-belief", "metadata": {}, "outputs": [], "source": [ @@ -518,7 +518,7 @@ }, { "cell_type": "markdown", - "id": "conscious-motor", + "id": "unlike-opera", "metadata": {}, "source": [ "Now we can create variables named `meter` and `second`." @@ -527,7 +527,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "contrary-robin", + "id": "russian-popularity", "metadata": {}, "outputs": [ { @@ -555,7 +555,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "relative-aircraft", + "id": "endless-paint", "metadata": {}, "outputs": [ { @@ -582,7 +582,7 @@ }, { "cell_type": "markdown", - "id": "identified-saskatchewan", + "id": "spiritual-scenario", "metadata": {}, "source": [ "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." @@ -590,7 +590,7 @@ }, { "cell_type": "markdown", - "id": "relevant-musician", + "id": "everyday-location", "metadata": {}, "source": [ "We can use `meter` and `second` to create a variable named `a` and give it the value of acceleration due to gravity. " @@ -599,7 +599,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "patent-logistics", + "id": "earlier-bandwidth", "metadata": {}, "outputs": [ { @@ -626,7 +626,7 @@ }, { "cell_type": "markdown", - "id": "judicial-bradley", + "id": "generic-bowling", "metadata": {}, "source": [ "The result is a **quantity** with two parts, called `magnitude` and `units`, which we can access like this:" @@ -635,7 +635,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "nearby-ministry", + "id": "missing-privilege", "metadata": {}, "outputs": [ { @@ -656,7 +656,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "express-adelaide", + "id": "fourth-swedish", "metadata": {}, "outputs": [ { @@ -682,7 +682,7 @@ }, { "cell_type": "markdown", - "id": "assumed-finland", + "id": "realistic-techno", "metadata": {}, "source": [ "Now we can create a quantity that represents $3.4$ s." @@ -691,7 +691,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "formal-twenty", + "id": "apart-france", "metadata": {}, "outputs": [ { @@ -718,7 +718,7 @@ }, { "cell_type": "markdown", - "id": "strong-patch", + "id": "severe-share", "metadata": {}, "source": [ "And use it to compute the distance a penny would fall after `t` seconds with constant acceleration `a`. " @@ -727,7 +727,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "wanted-wells", + "id": "alien-scout", "metadata": {}, "outputs": [ { @@ -753,7 +753,7 @@ }, { "cell_type": "markdown", - "id": "known-relationship", + "id": "wicked-indianapolis", "metadata": {}, "source": [ "Notice that the units of the result are correct.\n", @@ -763,7 +763,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "certified-sperm", + "id": "confidential-costs", "metadata": {}, "outputs": [], "source": [ @@ -772,7 +772,7 @@ }, { "cell_type": "markdown", - "id": "married-mexico", + "id": "hollow-programmer", "metadata": {}, "source": [ "We can use it to compute the time to reach the sidewalk." @@ -781,7 +781,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "fossil-syria", + "id": "studied-opera", "metadata": {}, "outputs": [ { @@ -808,7 +808,7 @@ }, { "cell_type": "markdown", - "id": "superior-packet", + "id": "seasonal-laser", "metadata": {}, "source": [ "And the velocity of the penny on impact:" @@ -817,7 +817,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "oriental-vulnerability", + "id": "exterior-greek", "metadata": {}, "outputs": [ { @@ -844,7 +844,7 @@ }, { "cell_type": "markdown", - "id": "complicated-welcome", + "id": "superior-biography", "metadata": {}, "source": [ "As in the previous section, the result is about $86$, but now it has the correct units, m/s.\n", @@ -855,7 +855,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "adolescent-layout", + "id": "antique-landing", "metadata": {}, "outputs": [], "source": [ @@ -866,7 +866,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "extra-rendering", + "id": "included-failure", "metadata": {}, "outputs": [ { @@ -892,7 +892,7 @@ }, { "cell_type": "markdown", - "id": "silver-learning", + "id": "progressive-charleston", "metadata": {}, "source": [ "If you are more familiar with miles per hour, this result might be easier to interpret.\n", @@ -901,7 +901,7 @@ }, { "cell_type": "markdown", - "id": "hazardous-input", + "id": "continuing-democrat", "metadata": {}, "source": [ "## Summary\n", @@ -922,7 +922,7 @@ }, { "cell_type": "markdown", - "id": "organized-senate", + "id": "thousand-equation", "metadata": {}, "source": [ "## Exercises" @@ -930,7 +930,7 @@ }, { "cell_type": "markdown", - "id": "aging-offense", + "id": "handmade-zoning", "metadata": {}, "source": [ "**Exercise** In mathematical notation, we can write an equation like $v = a t$ and it's understood that we are multiplying $a$ and $t$.\n", @@ -948,7 +948,7 @@ { "cell_type": "code", "execution_count": 54, - "id": "macro-constitution", + "id": "postal-marking", "metadata": {}, "outputs": [ { @@ -978,7 +978,7 @@ }, { "cell_type": "markdown", - "id": "entitled-carrier", + "id": "pressing-sugar", "metadata": {}, "source": [ "**Exercise:** In this chapter we used the `sqrt` function from the NumPy library. NumPy also provides a variable named `pi` that contains an approximation of the mathematical constant $\\pi$.\n", @@ -988,7 +988,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "continuous-catalyst", + "id": "legal-observer", "metadata": {}, "outputs": [ { @@ -1009,7 +1009,7 @@ }, { "cell_type": "markdown", - "id": "medieval-milan", + "id": "aggregate-mambo", "metadata": {}, "source": [ "NumPy provides other functions we'll use, including `log`, `exp`, `sin`, and `cos`.\n", @@ -1023,7 +1023,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "interested-graduate", + "id": "pressing-belgium", "metadata": {}, "outputs": [ { @@ -1047,7 +1047,7 @@ }, { "cell_type": "markdown", - "id": "fewer-collector", + "id": "unlimited-delivery", "metadata": {}, "source": [ "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", @@ -1060,7 +1060,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "damaged-glenn", + "id": "inner-equivalent", "metadata": {}, "outputs": [], "source": [ @@ -1070,7 +1070,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "baking-maldives", + "id": "nuclear-thirty", "metadata": {}, "outputs": [ { @@ -1102,7 +1102,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "lovely-acrylic", + "id": "available-steering", "metadata": {}, "outputs": [ { @@ -1130,7 +1130,7 @@ }, { "cell_type": "markdown", - "id": "cooperative-bradley", + "id": "aggressive-climate", "metadata": {}, "source": [ "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" @@ -1139,7 +1139,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "environmental-cover", + "id": "documentary-doctrine", "metadata": {}, "outputs": [], "source": [ @@ -1150,14 +1150,14 @@ { "cell_type": "code", "execution_count": null, - "id": "hindu-possession", + "id": "primary-partner", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "continued-pharmacy", + "id": "steady-chancellor", "metadata": {}, "source": [ "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", @@ -1173,7 +1173,7 @@ }, { "cell_type": "markdown", - "id": "angry-artist", + "id": "valid-empire", "metadata": {}, "source": [ "**Exercise:** Suppose instead of dropping the penny, you throw it downward at its terminal velocity, $29$ m/s. How long would it take to fall $381$ m?" @@ -1182,7 +1182,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "dressed-harrison", + "id": "greenhouse-reason", "metadata": {}, "outputs": [ { @@ -1214,7 +1214,7 @@ }, { "cell_type": "markdown", - "id": "electrical-jersey", + "id": "asian-murray", "metadata": {}, "source": [ "**Exercise:** So far we have considered two models of a falling penny:\n", @@ -1228,7 +1228,7 @@ }, { "cell_type": "markdown", - "id": "economic-bahrain", + "id": "detailed-minnesota", "metadata": {}, "source": [ "You can break this question into three parts:\n", @@ -1243,7 +1243,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "packed-salem", + "id": "secure-crowd", "metadata": {}, "outputs": [], "source": [ @@ -1254,7 +1254,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "understanding-point", + "id": "thirty-minneapolis", "metadata": {}, "outputs": [], "source": [ @@ -1266,7 +1266,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "baking-cooling", + "id": "premier-seeking", "metadata": {}, "outputs": [ { @@ -1287,7 +1287,7 @@ { "cell_type": "code", "execution_count": 36, - "id": "instructional-parliament", + "id": "brave-laundry", "metadata": {}, "outputs": [ { @@ -1308,7 +1308,7 @@ { "cell_type": "code", "execution_count": 37, - "id": "breeding-sport", + "id": "adjusted-consultation", "metadata": {}, "outputs": [ { @@ -1329,7 +1329,7 @@ { "cell_type": "code", "execution_count": 38, - "id": "bulgarian-excuse", + "id": "understanding-consortium", "metadata": {}, "outputs": [ { @@ -1349,7 +1349,7 @@ }, { "cell_type": "markdown", - "id": "regional-monitoring", + "id": "composed-tunnel", "metadata": {}, "source": [ "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that, when he threw a fastball, he was throwing the ball down; that is, the ball was leaving his hand at a downward angle.\n", @@ -1363,7 +1363,7 @@ { "cell_type": "code", "execution_count": 39, - "id": "statutory-music", + "id": "about-complex", "metadata": {}, "outputs": [], "source": [ @@ -1391,7 +1391,7 @@ { "cell_type": "code", "execution_count": 40, - "id": "antique-discussion", + "id": "unique-owner", "metadata": {}, "outputs": [], "source": [ @@ -1404,7 +1404,7 @@ { "cell_type": "code", "execution_count": 41, - "id": "directed-manchester", + "id": "minus-batman", "metadata": {}, "outputs": [ { @@ -1434,7 +1434,7 @@ { "cell_type": "code", "execution_count": 42, - "id": "ideal-version", + "id": "exact-vegetable", "metadata": {}, "outputs": [ { @@ -1465,7 +1465,7 @@ { "cell_type": "code", "execution_count": 43, - "id": "contrary-technique", + "id": "neutral-lightning", "metadata": {}, "outputs": [], "source": [ @@ -1481,7 +1481,7 @@ }, { "cell_type": "markdown", - "id": "upset-harvey", + "id": "jewish-secret", "metadata": {}, "source": [ "**Exercise:** Suppose I run a 10K race in 44:52. What is my average page in minutes per mile?" @@ -1490,7 +1490,7 @@ { "cell_type": "code", "execution_count": 44, - "id": "alert-negative", + "id": "virgin-cambodia", "metadata": {}, "outputs": [], "source": [ @@ -1502,7 +1502,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "correct-cuisine", + "id": "right-intention", "metadata": {}, "outputs": [ { @@ -1532,7 +1532,7 @@ { "cell_type": "code", "execution_count": 46, - "id": "reflected-accuracy", + "id": "mineral-sally", "metadata": {}, "outputs": [ { @@ -1562,7 +1562,7 @@ { "cell_type": "code", "execution_count": 47, - "id": "inner-river", + "id": "preceding-cricket", "metadata": {}, "outputs": [ { @@ -1592,7 +1592,7 @@ { "cell_type": "code", "execution_count": 50, - "id": "abstract-musical", + "id": "effective-rendering", "metadata": {}, "outputs": [ { @@ -1626,7 +1626,7 @@ { "cell_type": "code", "execution_count": 51, - "id": "radical-junior", + "id": "printable-reply", "metadata": {}, "outputs": [ { @@ -1655,7 +1655,7 @@ }, { "cell_type": "markdown", - "id": "banned-surname", + "id": "environmental-wallet", "metadata": {}, "source": [ "## Jupyter" @@ -1663,7 +1663,7 @@ }, { "cell_type": "markdown", - "id": "american-rainbow", + "id": "quality-probe", "metadata": {}, "source": [ "### Adding and removing cells\n", @@ -1691,7 +1691,7 @@ }, { "cell_type": "markdown", - "id": "radical-kenya", + "id": "suffering-intro", "metadata": {}, "source": [ "### Restart and run all\n", @@ -1706,7 +1706,7 @@ { "cell_type": "code", "execution_count": null, - "id": "growing-jumping", + "id": "weighted-quebec", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap02.ipynb b/jupyter/chap02.ipynb index 90a93b05..7b9b4c9f 100644 --- a/jupyter/chap02.ipynb +++ b/jupyter/chap02.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "british-hampshire", + "id": "million-filter", "metadata": {}, "source": [ "# Chapter 2" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "plastic-target", + "id": "expanded-rwanda", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "confirmed-melbourne", + "id": "unknown-introduction", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "parliamentary-bailey", + "id": "narrative-parcel", "metadata": {}, "source": [ "# Bike share\n", @@ -83,7 +83,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "after-publisher", + "id": "prospective-appreciation", "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "encouraging-input", + "id": "average-damages", "metadata": {}, "source": [ "Now we can call it like this:" @@ -101,7 +101,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "organic-consequence", + "id": "distinguished-legislation", "metadata": {}, "outputs": [], "source": [ @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "varied-croatia", + "id": "requested-wonder", "metadata": {}, "source": [ "The expressions in parentheses are **keyword arguments**.\n", @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "above-woman", + "id": "distinguished-black", "metadata": {}, "outputs": [ { @@ -150,7 +150,7 @@ }, { "cell_type": "markdown", - "id": "unnecessary-jewelry", + "id": "increased-footage", "metadata": {}, "source": [ "And this:" @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "sacred-hours", + "id": "becoming-anatomy", "metadata": {}, "outputs": [ { @@ -179,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "organizational-husband", + "id": "accurate-exemption", "metadata": {}, "source": [ "Or, to display the state variables and their values, you can just type the name of the object:" @@ -188,7 +188,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "primary-carrier", + "id": "incomplete-prediction", "metadata": {}, "outputs": [ { @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "american-worship", + "id": "noble-reviewer", "metadata": {}, "source": [ "These values make up the **state** of the system.\n", @@ -254,7 +254,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "beautiful-priority", + "id": "signal-satisfaction", "metadata": {}, "outputs": [], "source": [ @@ -264,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "adjusted-baghdad", + "id": "continuing-sperm", "metadata": {}, "source": [ "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "another-boating", + "id": "caring-richmond", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +284,7 @@ }, { "cell_type": "markdown", - "id": "finite-taste", + "id": "antique-remains", "metadata": {}, "source": [ "The result is the same either way." @@ -292,7 +292,7 @@ }, { "cell_type": "markdown", - "id": "fiscal-addition", + "id": "dynamic-pepper", "metadata": {}, "source": [ "## Defining functions\n", @@ -305,7 +305,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "miniature-milton", + "id": "maritime-paste", "metadata": {}, "outputs": [], "source": [ @@ -315,7 +315,7 @@ }, { "cell_type": "markdown", - "id": "imperial-account", + "id": "united-flexibility", "metadata": {}, "source": [ "Rather than repeat them every time a bike moves, we can define a new\n", @@ -325,7 +325,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "peaceful-scroll", + "id": "narrow-marshall", "metadata": {}, "outputs": [], "source": [ @@ -336,7 +336,7 @@ }, { "cell_type": "markdown", - "id": "illegal-newfoundland", + "id": "amended-territory", "metadata": {}, "source": [ "`def` is a special word in Python that indicates we are defining a new\n", @@ -356,7 +356,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "cordless-portrait", + "id": "occupational-leeds", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "potential-fourth", + "id": "governing-australia", "metadata": {}, "source": [ "When you call the function, it runs the statements in the body, which\n", @@ -376,7 +376,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "fabulous-hopkins", + "id": "played-chambers", "metadata": {}, "outputs": [ { @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "coated-pathology", + "id": "conventional-terminal", "metadata": {}, "source": [ "When you call a function, you have to include the parentheses. If you\n", @@ -441,7 +441,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "alternate-province", + "id": "determined-wednesday", "metadata": {}, "outputs": [ { @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "living-national", + "id": "heated-retail", "metadata": {}, "source": [ "This result indicates that `bike_to_wellesley` is a function. You don't\n", @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "impossible-scheme", + "id": "cutting-coating", "metadata": {}, "source": [ "## Print statements\n", @@ -488,7 +488,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "functional-handbook", + "id": "spread-majority", "metadata": {}, "outputs": [ { @@ -509,7 +509,7 @@ }, { "cell_type": "markdown", - "id": "naval-architect", + "id": "swedish-sequence", "metadata": {}, "source": [ "Jupyter runs both lines, but it only displays the value of the\n", @@ -520,7 +520,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "fleet-marathon", + "id": "liked-volunteer", "metadata": {}, "outputs": [ { @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "literary-integrity", + "id": "north-paradise", "metadata": {}, "source": [ "When you call the `print` function, you can put a variable name in\n", @@ -550,7 +550,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "accessory-porcelain", + "id": "double-washer", "metadata": {}, "outputs": [ { @@ -567,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "sustained-dallas", + "id": "abstract-muslim", "metadata": {}, "source": [ "Python looks up the values of the variables and displays them; in this\n", @@ -581,7 +581,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "stone-oliver", + "id": "mediterranean-rogers", "metadata": {}, "outputs": [], "source": [ @@ -593,7 +593,7 @@ }, { "cell_type": "markdown", - "id": "pharmaceutical-combat", + "id": "cooperative-kuwait", "metadata": {}, "source": [ "Each time we call this version of the function, it displays a message,\n", @@ -608,7 +608,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "loose-arlington", + "id": "floral-velvet", "metadata": {}, "outputs": [], "source": [ @@ -620,7 +620,7 @@ }, { "cell_type": "markdown", - "id": "prostate-launch", + "id": "chicken-feedback", "metadata": {}, "source": [ "And call it like this:" @@ -629,7 +629,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "compatible-transcript", + "id": "fitting-adventure", "metadata": {}, "outputs": [ { @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "clean-bleeding", + "id": "conditional-detector", "metadata": {}, "source": [ "One benefit of defining functions is that you avoid repeating chunks of\n", @@ -657,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "prescribed-observer", + "id": "threaded-taylor", "metadata": {}, "source": [ "## If statements\n", @@ -668,7 +668,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "elegant-doubt", + "id": "english-reply", "metadata": {}, "outputs": [], "source": [ @@ -677,7 +677,7 @@ }, { "cell_type": "markdown", - "id": "steady-arrow", + "id": "eleven-hanging", "metadata": {}, "source": [ "When you call it, you provide a probability between 0 and 1, like `0.7`, as an example:" @@ -686,13 +686,13 @@ { "cell_type": "code", "execution_count": 21, - "id": "improving-simulation", + "id": "emerging-mystery", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "False" + "True" ] }, "execution_count": 21, @@ -706,7 +706,7 @@ }, { "cell_type": "markdown", - "id": "brown-header", + "id": "compact-football", "metadata": {}, "source": [ "The result is one of two values: `True` with probability 0.7 or `False`\n", @@ -728,9 +728,17 @@ { "cell_type": "code", "execution_count": 22, - "id": "organizational-portable", + "id": "potential-denmark", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "heads\n" + ] + } + ], "source": [ "if flip(0.5):\n", " print('heads')" @@ -738,7 +746,7 @@ }, { "cell_type": "markdown", - "id": "covered-freedom", + "id": "changed-portable", "metadata": {}, "source": [ "If the result from `flip` is `True`, the program displays the string\n", @@ -755,14 +763,14 @@ { "cell_type": "code", "execution_count": 23, - "id": "auburn-sphere", + "id": "activated-butter", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "tails\n" + "heads\n" ] } ], @@ -775,7 +783,7 @@ }, { "cell_type": "markdown", - "id": "collected-venice", + "id": "sexual-neighborhood", "metadata": {}, "source": [ "Now we can use `flip` to simulate the arrival of students who want to\n", @@ -787,9 +795,17 @@ { "cell_type": "code", "execution_count": 24, - "id": "incident-somalia", + "id": "multiple-manor", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n" + ] + } + ], "source": [ "if flip(0.5):\n", " bike_to_wellesley()" @@ -797,7 +813,7 @@ }, { "cell_type": "markdown", - "id": "twenty-brand", + "id": "thrown-casting", "metadata": {}, "source": [ "If students arrive at the Wellesley station every 3 minutes, on average,\n", @@ -808,7 +824,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "variable-drain", + "id": "occupied-indianapolis", "metadata": {}, "outputs": [], "source": [ @@ -818,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "loved-kentucky", + "id": "coordinated-census", "metadata": {}, "source": [ "We can combine these snippets into a function that simulates a **time\n", @@ -828,7 +844,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "smoking-spectrum", + "id": "perceived-horizontal", "metadata": {}, "outputs": [], "source": [ @@ -842,7 +858,7 @@ }, { "cell_type": "markdown", - "id": "educational-color", + "id": "metric-classroom", "metadata": {}, "source": [ "Then we can simulate a time step like this:" @@ -851,25 +867,16 @@ { "cell_type": "code", "execution_count": 27, - "id": "offensive-meter", + "id": "stable-jamaica", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n" - ] - } - ], + "outputs": [], "source": [ "step()" ] }, { "cell_type": "markdown", - "id": "bridal-stage", + "id": "black-glance", "metadata": {}, "source": [ "Even though there are no values in parentheses, we have to include them." @@ -877,7 +884,7 @@ }, { "cell_type": "markdown", - "id": "adult-window", + "id": "respective-speed", "metadata": {}, "source": [ "## Parameters\n", @@ -893,7 +900,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "funky-macintosh", + "id": "competent-owner", "metadata": {}, "outputs": [], "source": [ @@ -907,7 +914,7 @@ }, { "cell_type": "markdown", - "id": "swiss-distributor", + "id": "written-trust", "metadata": {}, "source": [ "The values of `p1` and `p2` are not set inside this function; instead,\n", @@ -917,24 +924,16 @@ { "cell_type": "code", "execution_count": 29, - "id": "pleased-vision", + "id": "familiar-skiing", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n" - ] - } - ], + "outputs": [], "source": [ "step(0.5, 0.33)" ] }, { "cell_type": "markdown", - "id": "located-inspector", + "id": "tropical-termination", "metadata": {}, "source": [ "The values you provide when you call the function are called\n", @@ -946,17 +945,9 @@ { "cell_type": "code", "execution_count": 30, - "id": "known-edgar", + "id": "religious-failing", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n" - ] - } - ], + "outputs": [], "source": [ "p1 = 0.5\n", "p2 = 0.33\n", @@ -970,7 +961,7 @@ }, { "cell_type": "markdown", - "id": "periodic-heath", + "id": "distinguished-ridge", "metadata": {}, "source": [ "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", @@ -980,7 +971,7 @@ }, { "cell_type": "markdown", - "id": "indonesian-shelter", + "id": "laden-wisdom", "metadata": {}, "source": [ "## For loops\n", @@ -992,32 +983,32 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "welcome-crossing", + "execution_count": 62, + "id": "natural-roads", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "0\n", + "Moving a bike to Wellesley\n", "1\n", "Moving a bike to Wellesley\n", "2\n", - "Moving a bike to Wellesley\n", - "3\n", "Moving a bike to Wellesley\n" ] } ], "source": [ - "for i in range(1, 4):\n", + "for i in range(3):\n", " print(i)\n", " bike_to_wellesley()" ] }, { "cell_type": "markdown", - "id": "motivated-study", + "id": "hybrid-activation", "metadata": {}, "source": [ "The syntax here should look familiar; the first line ends with a\n", @@ -1031,51 +1022,54 @@ "\n", "- `i` is a **loop variable** that gets created when the for loop runs.\n", "\n", - "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `1`; the second time, it is `2`; the third time, it is `3`.\n", + "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `0`; the second time, it is `1`; the third time, it is `2`.\n", "\n", - "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley.\n", - "\n", - "It might seem strange that the loop stops when `i` is `3`, but that's how `range` works: it includes the first argument, `1`, but not the second, `4`.\n", - "\n", - "Now, since we have moved a number of bikes around, let's start again with a new `State` object." + "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley." ] }, { - "cell_type": "code", - "execution_count": 32, - "id": "passing-notification", + "cell_type": "markdown", + "id": "urban-brisbane", "metadata": {}, - "outputs": [], "source": [ - "bikeshare = State(olin=10, wellesley=2)" + "## TimeSeries" ] }, { "cell_type": "markdown", - "id": "linear-cleaner", + "id": "greenhouse-caribbean", + "metadata": {}, + "source": [ + "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", + "corresponding sequence of quantities.\n", + "\n", + "In this example, the time stamps will be integers representing minutes, and the quantities will be the number of bikes at one location.\n", + "\n", + "Since we have moved a number of bikes around, let's start again with a new `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "linear-magnet", "metadata": {}, + "outputs": [], "source": [ - "We'll use this `bikeshare` in the next section." + "bikeshare = State(olin=10, wellesley=2)" ] }, { "cell_type": "markdown", - "id": "successful-rough", + "id": "crucial-tract", "metadata": {}, "source": [ - "## TimeSeries\n", - "\n", - "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", - "corresponding sequence of values. In this example, the time stamps are\n", - "integers representing minutes, and the values are the number of bikes at one location.\n", - "\n", "We can create a new, empty `TimeSeries` like this:" ] }, { "cell_type": "code", - "execution_count": 33, - "id": "approved-bruce", + "execution_count": 64, + "id": "pressed-brooks", "metadata": {}, "outputs": [], "source": [ @@ -1086,16 +1080,16 @@ }, { "cell_type": "markdown", - "id": "extensive-uniform", + "id": "established-click", "metadata": {}, "source": [ - "And we can add a value to a `TimeSeries` like this:" + "And we can add a quantity like this:" ] }, { "cell_type": "code", - "execution_count": 34, - "id": "affected-syntax", + "execution_count": 65, + "id": "eligible-hormone", "metadata": {}, "outputs": [], "source": [ @@ -1104,73 +1098,75 @@ }, { "cell_type": "markdown", - "id": "rational-assault", + "id": "based-dealer", "metadata": {}, "source": [ "The number in brackets is the time stamp, also called a **label**.\n", + "In this case, label is `0` and the quantity is the number of bikes at Olin.\n", "\n", - "We can use a `TimeSeries` inside a for loop to store the results of the\n", - "simulation:" + "We can use a `TimeSeries` inside a for loop to store the results of the simulation:" ] }, { "cell_type": "code", - "execution_count": 35, - "id": "optical-ordinary", + "execution_count": 66, + "id": "renewable-coating", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "0\n", "1\n", - "Moving a bike to Wellesley\n", - "2\n", - "3\n", - "4\n" + "Moving a bike to Olin\n", + "2\n" ] } ], "source": [ - "for i in range(1, 5):\n", + "for i in range(3):\n", " print(i)\n", " step(0.3, 0.2)\n", - " results[i] = bikeshare.olin" + " results[i+1] = bikeshare.olin" ] }, { "cell_type": "markdown", - "id": "dutch-sheep", + "id": "common-senegal", "metadata": {}, "source": [ "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", "Then we store the number of bikes at Olin in `results`. \n", - "We use the loop variable, `i`, as the time stamp.\n", + "We use the loop variable, `i`, to compute the time stamp, `i+1`.\n", "\n", - "When the loop exits, `results` contains 5 time stamps, from 0 through\n", - "4, and the number of bikes at Olin at the end of each time step.\n", + "The first time through the loop, the value of `i` is `0`, so the time stamp is `1`.\n", + "The last time, the value of `i` is `2`, so the time stamp is `3`.\n", + "\n", + "When the loop exits, `results` contains 4 time stamps, from 0 through\n", + "3, and the number of bikes at Olin at the end of each time step.\n", "\n", "We can display the `TimeSeries` like this:" ] }, { "cell_type": "code", - "execution_count": 36, - "id": "allied-hobby", + "execution_count": 67, + "id": "fewer-blocking", "metadata": {}, "outputs": [ { "data": { "text/plain": [ + "Time\n", "0 10\n", - "1 9\n", - "2 9\n", - "3 9\n", - "4 9\n", - "dtype: int64" + "1 10\n", + "2 11\n", + "3 11\n", + "Name: Quantity, dtype: int64" ] }, - "execution_count": 36, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" } @@ -1181,19 +1177,20 @@ }, { "cell_type": "markdown", - "id": "found-indonesia", + "id": "prescription-induction", "metadata": {}, "source": [ - "The left column displays the timestamps; the right column displays the values (which might be negative, depending on the state of the system).\n", + "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", + "\n", "At the bottom, `dtype` is the type of the data in the `TimeSeries`; you can ignore this for now.\n", "\n", - "ModSim provides a function called `display` that displays the `TimeSeries` as a table:" + "ModSim provides a function called `show` that displays the `TimeSeries` as a table:" ] }, { "cell_type": "code", - "execution_count": 37, - "id": "compound-globe", + "execution_count": 68, + "id": "divine-local", "metadata": {}, "outputs": [ { @@ -1217,7 +1214,11 @@ " \n", " \n", " \n", - " values\n", + " Quantity\n", + " \n", + " \n", + " Time\n", + " \n", " \n", " \n", " \n", @@ -1227,55 +1228,51 @@ " \n", " \n", " 1\n", - " 9\n", + " 10\n", " \n", " \n", " 2\n", - " 9\n", + " 11\n", " \n", " \n", " 3\n", - " 9\n", - " \n", - " \n", - " 4\n", - " 9\n", + " 11\n", " \n", " \n", "\n", "" ], "text/plain": [ - " values\n", - "0 10\n", - "1 9\n", - "2 9\n", - "3 9\n", - "4 9" + " Quantity\n", + "Time \n", + "0 10\n", + "1 10\n", + "2 11\n", + "3 11" ] }, - "execution_count": 37, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from modsim import display\n", + "from modsim import show\n", "\n", - "display(results)" + "show(results)" ] }, { "cell_type": "markdown", - "id": "dated-canyon", + "id": "conditional-sandwich", "metadata": {}, "source": [ - "You don't have to use `display`, but I think it looks better." + "You don't have to use `show`, but I think it looks better." ] }, { "cell_type": "markdown", - "id": "senior-mexico", + "id": "parental-treasure", "metadata": {}, "source": [ "## Plotting\n", @@ -1286,13 +1283,13 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "persistent-replication", + "execution_count": 69, + "id": "weekly-producer", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1311,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "mexican-recipe", + "id": "serial-report", "metadata": {}, "source": [ "The legend for this figure says \"None\" because we have not provided a label. Here's how we can do that:" @@ -1319,13 +1316,13 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "hollow-george", + "execution_count": 70, + "id": "sublime-treatment", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAgpElEQVR4nO3deXTU9b3/8eebJBB2hIQ1QFjC5q6pa1UUkICteq1tta1XrS21VattrdLf/Z1f772/c3sBqdpqbS9VKq3+tItarYUAAooUN9xZEhL2QCABZCeQ5f37I2NPmiZkmGTyne/M63EOZ2a+85nk9T3fhBffmeE95u6IiIgkmg5BBxAREWmKCkpERBKSCkpERBKSCkpERBKSCkpERBJSetABmpKVleW5ublBxxARkXbw7rvv7nb37MbbE7KgcnNzWbVqVdAxRESkHZjZlqa26yk+ERFJSCooERFJSCooERFJSAn5GlRTqqurKSsro6qqKugobSozM5OcnBwyMjKCjiIiklBCU1BlZWV0796d3NxczCzoOG3C3dmzZw9lZWUMGzYs6DgiIgklNE/xVVVV0adPn6QpJwAzo0+fPkl3Vigi0hZaLCgzm2tmFWa2usG2L5rZGjOrM7P8Ezy2wMyKzazUzKa3NmwyldOnknGfRETaQjRnUE8CBY22rQauA5Y39yAzSwN+AUwBxgE3mtm42GKKiEiqafE1KHdfbma5jbatgxb/9X8eUOruGyNrnwWuAdbGGjZoZWVl3HHHHaxdu5a6ujo+97nP8cADD7By5Upmz57Nyy+/zEsvvcTatWuZPr3VJ4wiSeeJFZv4cNu+oGNIG5r9xTPpmB6fV4vi+SaJQcC2BrfLgPObW2xm04BpAEOGDIljrNi4O9dddx3f/va3efHFF6mtrWXatGn827/9G1ddddXf11199dVcffXVASYVSUwrN+zm/768lgE9M8nMSAs6jrQRJ34fehvPgmrq9KrZPXH3OcAcgPz8/IT7mN+lS5eSmZnJrbfeCkBaWhoPPfQQw4YN4/LLL//7uieffJJVq1bx6KOPcsstt9CjRw9WrVrFzp07mTVrFtdff31QuyASGHdn5oIiBvbMZOm941VQEpV4FlQZMLjB7RxgR1t84f/4yxrW7jjQFl/q78YN7MGPP39qs/evWbOGc8899x+29ejRgyFDhlBaWtrs48rLy1mxYgVFRUVcffXVKihJSQtW7+TDsv08cP0ZKieJWjzfZv4OkGdmw8ysI3AD8FIcv19cuXuTr7k1t/1T1157LR06dGDcuHHs2rUrnhFFElJ1bR0PLCxmVL9uXHdOTtBxJERaPIMys2eA8UCWmZUBPwb2Ao8A2cBfzewDd59sZgOBx919qrvXmNmdwEIgDZjr7mvaIvSJznTi5dRTT+W55577h20HDhxg27ZtjBgxotnHderU6e/X3RPumUuRuHv2nW1s2n2YJ27OJ62D/luFRK/FMyh3v9HdB7h7hrvnuPsT7v5C5Hond+/n7pMja3e4+9QGj53v7qPcfYS7/1c8dyTeJkyYwJEjR/jtb38LQG1tLT/4wQ+45ZZb6NKlS8DpRBLT4WM1/OyVEs7L7c0VY/oGHUdCJjSTJIJmZrzwwgv88Y9/JC8vj1GjRpGZmclPfvKToKOJJKwnVmxi96FjTJ86Rv8pXU6aJeLTTvn5+d74AwvXrVvH2LFjA0oUX8m8b5K69hw6xqWzlnFJXja/uunclh8gKcvM3nX3f5pKpDMoEYmLR5aWUlVTxw8LRgcdRUJKBSUibW7rniM8/dYWvpQ/mBHZ3YKOIyEVqoJKxKcjWysZ90nkp4uLSetg3DMxL+goEmKhKajMzEz27NmTVH+hf/p5UJmZmUFHEWkzq7fv58UPdnDbZ4fRr4d+tiV2ofnAwpycHMrKyqisrAw6Spv69BN1RZLFzMIienXJ4FuXNf//A0WiEZqCysjI0KfOiiS410sqeb1kN//7qrH0yMwIOo6EXGie4hORxFZX58wsLGJQr87cdOHQoONIElBBiUibePnjclZvP8C9k0fRKV0DYaX1VFAi0mrHa+qYvbCYsQN6cM2Zg4KOI0lCBSUirfbM21vZuvcI9xeMpoMGwkobUUGJSKscOlbDz5eUcOHwPlw2KjvoOJJEVFAi0ipzlm9kz+HjTJ+igbDStlRQIhKzioNVPP76Rq46fQBnDu4VdBxJMiooEYnZI0tKOV5Tx72TNRBW2p4KSkRismn3YZ55eys3njeEYVldg44jSUgFJSIxmb2omI7pHbhrwsigo0iSUkGJyEn7cNs+/vpROd+4ZDh9u2sgrMSHCkpEToq7M2NBEX26duSbl2g+psSPCkpETsrykt28sXEPd10xku4aCCtxpIISkajV1dWfPQ3u3ZmvnK+BsBJfKigRidqLH25nXfkB7r1yNB3T9deHxJd+wkQkKsdqapm9cD2nDerB588YGHQcSQEqKBGJylNvbmX7vqNMLxirgbDSLlRQItKiA1XVPLq0hEvysvhsXlbQcSRFqKBEpEVzXtvIJ0equb9gTNBRJIWooETkhCoOVPH4io1cfeZAThvUM+g4kkJUUCJyQg8vKaG2zrn3Sg2ElfalghKRZm2oPMTv39nGV88fypA+XYKOIylGBSUizXqgsJjM9A7ceYUGwkr7U0GJSJPe2/oJhWt2Mu3SEWR16xR0HElBKigR+Sfuzoz5RWR168Q3NBBWAqKCEpF/sqy4grc37+XuiXl07ZQedBxJUS0WlJnNNbMKM1vdYFtvM1tsZiWRy1Oaeez3zGyNma02s2fMTB8cI5LgauucmQuKye3ThRs+MzjoOJLCojmDehIoaLRtOrDE3fOAJZHb/8DMBgHfBfLd/TQgDbihVWlFJO5eeH87xbsO8sPJY8hI05MsEpwWf/rcfTmwt9Hma4B5kevzgGubeXg60NnM0oEuwI7YYopIe6iqruXBRcWcmdOTqaf3DzqOpLhY/3nUz93LASKXfRsvcPftwGxgK1AO7Hf3Rc19QTObZmarzGxVZWVljLFEpDV+98YWduyv4v4pYzDTQFgJVtzO3yOvS10DDAMGAl3N7GvNrXf3Oe6e7+752dnZ8YolIs3Yf6SaR5eVctmobC4aoYGwErxYC2qXmQ0AiFxWNLFmIrDJ3SvdvRp4Hrgoxu8nInH2y9c2cKBKA2ElccRaUC8BN0eu3wy82MSarcAFZtbF6p8rmACsi/H7iUgcle8/ym/+tol/OWsQ4wb2CDqOCBDd28yfAd4ARptZmZndBswAJplZCTApchszG2hm8wHc/S3gT8B7wMeR7zUnLnshIq3y8OIS3OF7k0YFHUXk71r8H3jufmMzd01oYu0OYGqD2z8GfhxzOhGJu5JdB/nju9u49eJhDO6tgbCSOPSfHERS3KyFxXTtmM4dl2sgrCQWFZRIClu1eS+L1+7i9vEj6N21Y9BxRP6BCkokRbk7MxYU0bd7J269ODfoOCL/RAUlkqIWr93Fqi2fcM/EUXTpqIGwknhUUCIpqKa2jlkLixme3ZUv5ecEHUekSSookRT03HtllFYc4r7JY0jXQFhJUPrJFEkxR4/X8tDiEs4e0ovJp/YLOo5Is1RQIinmyZWb2XmgiukFGggriU0FJZJC9h05zmOvljJhTF/OH94n6DgiJ6SCEkkhj726gUPHarhPA2ElBFRQIili+76jPLlyM184J4fR/bsHHUekRSookRTx4KL1gAbCSniooERSQNHOAzz/fhm3XJTLoF6dg44jEhUVlEgKmFVYTPdO6Xxn/Iigo4hETQUlkuTe3LiHpUUVfOfykfTqooGwEh4qKJEk9ulA2P49Mrnlotyg44icFBWUSBJbuGYnH2zbx/cnjSIzIy3oOCInRQUlkqRqauuYVVhMXt9uXHfOoKDjiJw0FZRIkvrDqjI27j7MfQUaCCvhpJ9akSR05HgND7+ynvyhpzBxbN+g44jERAUlkoTmrthExcFj/GiqBsJKeKmgRJLM3sPH+dVrG7lyXD/OHdo76DgiMVNBiSSZR5eWcuR4DfcVjA46ikirqKBEksi2vUf43Zub+VL+YEb21UBYCTcVlEgSeXDxejqYcc9EDYSV8FNBiSSJNTv28+cPtvP1zw6jf8/MoOOItJoKSiRJzCospkdmBrdfpoGwkhxUUCJJYGXpbl5bX8mdl4+kZ+eMoOOItAkVlEjI1dU5MwqLGNSrMzddODToOCJtRgUlEnLzV5fzUdl+DYSVpKOCEgmx6to6HlhYzJj+3bn2bA2EleSighIJsWff3sqWPUe4v2AMaR000kiSiwpKJKQOH6vhZ0tKOH9Yb8aPzg46jkibU0GJhNTjr29i96HjTJ+igbCSnFosKDOba2YVZra6wbbeZrbYzEoil6c089heZvYnMysys3VmdmFbhhdJVbsPHWPO8g1MOa0/Zw9p8tdPJPSiOYN6EihotG06sMTd84AlkdtN+RlQ6O5jgDOBdTHmFJEGHl1aSlVNHfdO1kBYSV4tFpS7Lwf2Ntp8DTAvcn0ecG3jx5lZD+BS4InI1znu7vtakVVEgC17DvP0W1v48mcGMyK7W9BxROIm1teg+rl7OUDksqmP7BwOVAK/MbP3zexxM+va3Bc0s2lmtsrMVlVWVsYYSyT5zV60nvQOHbhnQl7QUUTiKp5vkkgHzgF+6e5nA4dp/qlA3H2Ou+e7e352tt6RJNKUj8v285cPd/CNS4bRt4cGwkpyi7WgdpnZAIDIZUUTa8qAMnd/K3L7T9QXlojEaGZhEad0yWDapcODjiISd7EW1EvAzZHrNwMvNl7g7juBbWb26au4E4C1MX4/kZT3ekklK0p3c9cVeXTP1EBYSX7RvM38GeANYLSZlZnZbcAMYJKZlQCTIrcxs4FmNr/Bw+8Cnjazj4CzgJ+0cX6RlFBX58xYUETOKZ356gVDgo4j0i7SW1rg7jc2c9eEJtbuAKY2uP0BkB9rOBGp95ePdrBmxwEe/vJZdErXQFhJDZokIZLgjtfUMXtRMWMH9ODqMwcGHUek3aigRBLc029tYdveo0yfMoYOGggrKUQFJZLADlZV88jSUi4e2YdL87KCjiPSrlRQIgns18s3svfwce4v0EBYST0qKJEEVXGwil+/vonPnTGAM3J6BR1HpN2poEQS1M+XlFBdW8e9V2ogrKQmFZRIAtpYeYhn3t7GV84fQm5WsyMsRZKaCkokAf100Xo6pXfgris0EFZSlwpKJMF8sG0ff/24nG9eMpzs7p2CjiMSGBWUSAJxd2YsWEdWt458UwNhJcWpoEQSyKvrK3lz416+OyGPbp1anEQmktRUUCIJorbOmbmgiKF9unDDZzQQVkQFJZIgXvxgO0U7D3LvlaPpmK5fTRH9FogkgKrqWn66aD2nD+rJVacPCDqOSEJQQYkkgKfe3ML2fRoIK9KQCkokYAeqqnl0WSmX5GVx8UgNhBX5lApKJGD/89oG9h2p5v6CMUFHEUkoKiiRAO06UMUTKzZxzVkDOW1Qz6DjiCQUFZRIgB5+ZT21da6BsCJNUEGJBKS04hC/f2cbX7tgKIN7dwk6jkjCUUGJBOSBhUV06ZjOnZePDDqKSEJSQYkE4N0tn7BwzS6+delw+nTTQFiRpqigRNqZe/1Io6xunbjtkmFBxxFJWCookXa2tKiCtzfv5Z6JeXTpqIGwIs1RQYm0o9o6Z2ZhEcOyuvLlzwwOOo5IQlNBibSj598rY/2uQ/xw8mgy0vTrJ3Ii+g0RaSdV1bU8uHg9Zw7uxZTT+gcdRyThqaBE2sm8lZsp31/Fj6aMwUwDYUVaooISaQf7j1Tzi2WlXD46mwuG9wk6jkgoqKBE2sFjr5Vy8FgN92kgrEjUVFAicbZj31F+87fN/MvZgxg7oEfQcURCQwUlEmcPv7IeHL4/aVTQUURCRQUlEkfrdx3kT++W8a8XDiXnFA2EFTkZLRaUmc01swozW91gW28zW2xmJZHLU07w+DQze9/MXm6r0CJhMauwmK4d07lDA2FFTlo0Z1BPAgWNtk0Hlrh7HrAkcrs5dwPrYkonEmLvbN7LK+t2cfv4EZzStWPQcURCp8WCcvflwN5Gm68B5kWuzwOubeqxZpYDXAU8HntEkfBxd/57/jr69ejE1y/WQFiRWMT6GlQ/dy8HiFz2bWbdw8B9QF2M30cklBat3cV7W/fxvYmj6NwxLeg4IqEUtzdJmNnngAp3fzfK9dPMbJWZraqsrIxXLJG4q6mtY1ZhESOyu3L9uTlBxxEJrVgLapeZDQCIXFY0seZi4Goz2ww8C1xhZk819wXdfY6757t7fnZ2doyxRIL3p3fL2FB5mPsKxpCugbAiMYv1t+cl4ObI9ZuBFxsvcPcfuXuOu+cCNwBL3f1rMX4/kVA4eryWh15ZzzlDenHluH5BxxEJtWjeZv4M8AYw2szKzOw2YAYwycxKgEmR25jZQDObH8/AIonsNys3sevAMaZPGauBsCKt1OLHebr7jc3cNaGJtTuAqU1sfxV49SSziYTKJ4eP88tXNzBxbF/OG9Y76DgioacnyEXayGOvlnJYA2FF2owKSqQNlH1yhHkrt3D9uTmM6tc96DgiSUEFJdIGHly8HjO4Z6IGwoq0FRWUSCutKz/AC+9v55aLcxnYq3PQcUSShgpKpJVmFRbRvVM637lMA2FF2pIKSqQV3tiwh2XFldxx+Uh6dskIOo5IUlFBicTI3ZlRWMSAnpncfFFu0HFEko4KSiRGhat38uG2fXxv0igyMzQQVqStqaBEYlBdW8cDC4sZ1a8bXzhHA2FF4kEFJRKD37+zjY27D3N/wRjSOmikkUg8qKBETtLhYzU8/EoJ5+X25ooxzX0Umoi0lgpK5CTNXbGJ3YeOcf+UMRoIKxJHKiiRk7Dn0DH+Z/lGJp/aj3OHnhJ0HJGkpoISOQmPLivlyPEafjhZA2FF4k0FJRKlbXuP8NSbW/jyZwYzsm+3oOOIJD0VlEiUfrqomLQOxt0TNBBWpD2ooESisHr7fv78wQ6+fvEw+vfMDDqOSEpQQYlEYWZhEb26ZHD7+BFBRxFJGSookRasKNnN6yW7ufPykfTI1EBYkfaighI5gbo6Z2ZhEYN6deamC4cGHUckpaigRE7grx+X8/H2/fzgylF0StdAWJH2pIISacbxmjpmLypmTP/uXHPWoKDjiKQcFZRIM559Zytb9hzh/ikaCCsSBBWUSBMOHavh50tKuGB4b8aPyg46jkhKUkGJNOHx1zey+9Bxpk8Zq4GwIgFRQYk0UnnwGHOWb+Sq0wdw1uBeQccRSVkqKJFGHllawrGaOu6dPDroKCIpTQUl0sDm3Yf5f29t5cbzBjMsq2vQcURSmgpKpIHZi4rJSOvAdyfkBR1FJOWpoEQiPirbx8sflfPNS4bRt7sGwooETQUlArg7MxYU0btrR7556fCg44gIKigRAF4v2c3KDXu464qRdNdAWJGEoIKSlFdXV3/2NLh3Z75y/pCg44hIhApKUt5fPtrB2vID3HvlaA2EFUkgLRaUmc01swozW91gW28zW2xmJZHLU5p43GAzW2Zm68xsjZnd3dbhRVrrWE0tDyws5tSBPfj8GQODjiMiDURzBvUkUNBo23RgibvnAUsitxurAX7g7mOBC4A7zGxcK7KKtLmn39xK2SdHmT5lDB00EFYkobRYUO6+HNjbaPM1wLzI9XnAtU08rtzd34tcPwisA/SZBZIwDlRV88jSEj47MotL8jQQViTRxPoaVD93L4f6IgL6nmixmeUCZwNvnWDNNDNbZWarKisrY4wlEr1fL9/IJ0equb9gTNBRRKQJcX+ThJl1A54D7nH3A82tc/c57p7v7vnZ2frXrMRXxYEqHn99E58/cyCn5/QMOo6INCHWgtplZgMAIpcVTS0yswzqy+lpd38+xu8l0uZ+tqSE6to67r1yVNBRRKQZsRbUS8DNkes3Ay82XmD1H6LzBLDO3R+M8fuItLmNlYd49p1tfPX8IQzto4GwIokqmreZPwO8AYw2szIzuw2YAUwysxJgUuQ2ZjbQzOZHHnoxcBNwhZl9EPkzNS57IXISZi8qJjO9A3dpIKxIQktvaYG739jMXROaWLsDmBq5vgLQ+3Yloby/9RPmf7yT700cRVa3TkHHEZET0CQJSRnuzn8vKCKrW0e+ccmwoOOISAtUUJIyXi2u5O1Ne7l7Qh5dO7X45IGIBEwFJSmhts6ZWVhEbp8u3HCeBsKKhIEKSlLCn9/fTtHOg9w7eTQZafqxFwkD/aZK0quqruXBxes5I6cnU08bEHQcEYmSCkqS3lNvbmH7vqNML9BAWJEwUUFJUtt/tJpHl5Vy2ahsLhqZFXQcETkJKihJar96bQP7j2ogrEgYqaAkae3cX8XcFZu49qxBjBvYI+g4InKSVFCStB5+ZT3u8P1JGggrEkYqKElKpRUH+cOqbXztgqEM7t0l6DgiEgMVlCSlWYXFdOmYzp1XjAw6iojESAUlSefdLXtZtHYXt182nN5dOwYdR0RipIKSpOLuzFhQRN/unfj6ZzUQViTMVFCSVJasq+CdzZ9wz8RRdOmogbAiYaaCkqRRU1vHzMIihmd15Uv5OUHHEZFWUkFJ0nj+ve2UVBzivoLRpGsgrEjo6bdYksKnA2HPGtyLyaf2DzqOiLQBFZQkhSdXbmbngSqmTxmDmQbCiiQDFZSE3r4jx3lsWSlXjOnLBcP7BB1HRNqICkpC75evbuDgsRruKxgddBQRaUMqKAm1HfuO8puVm7nu7BzG9NdAWJFkooKSUHto8XoAvn+lBsKKJBsVlIRW8c6DPPdeGbdclMugXp2DjiMibUwFJaE1q7CIrp3S+c74EUFHEZE4UEFJKL21cQ9Liir4zviR9OqigbAiyUgFJaHj7swoLKJ/j0xuvTg36DgiEicqKAmdhWt28f7WfXxvUh6ZGWlBxxGROFFBSajU1NYxa2ERI/t24wvnaCCsSDJTQUmo/PHdMjZWHua+yRoIK5Ls9BsuoXH0eC0PLV5P/tBTmDSuX9BxRCTOVFASGnP/tomKg8c0EFYkRaigJBT2Hj7Or17dwKRx/cjP7R10HBFpByooCYVfLCvl8PEa7pusgbAiqaLFgjKzuWZWYWarG2zrbWaLzawkcnlKM48tMLNiMys1s+ltGVxSx7a9R/jdG1v44rmDyevXPeg4ItJOojmDehIoaLRtOrDE3fOAJZHb/8DM0oBfAFOAccCNZjauVWklJT20eD1mcM+kvKCjiEg7Sm9pgbsvN7PcRpuvAcZHrs8DXgXub7TmPKDU3TcCmNmzkcetjT1udP7zL2vZfehYvL+NtIM6d/76cTnfunQEA3pqIKxIKmmxoJrRz93LAdy93Mz6NrFmELCtwe0y4PzmvqCZTQOmAQwZMiTGWPXW7zrI9n1HW/U1JHFcPCKLb1+mgbAiqSbWgopGU+8D9uYWu/scYA5Afn5+s+ui8dQ3mu1BEREJiVjfxbfLzAYARC4rmlhTBgxucDsH2BHj9xMRkRQTa0G9BNwcuX4z8GITa94B8sxsmJl1BG6IPE5ERKRF0bzN/BngDWC0mZWZ2W3ADGCSmZUAkyK3MbOBZjYfwN1rgDuBhcA64A/uviY+uyEiIskmmnfx3djMXROaWLsDmNrg9nxgfszpREQkZWmShIiIJCQVlIiIJCQVlIiIJCQVlIiIJCQVlIiIJCRzb9XQhrgws0pgSyu/TBawuw3iJLpU2M9U2EfQfiabVNjPttrHoe6e3XhjQhZUWzCzVe6eH3SOeEuF/UyFfQTtZ7JJhf2M9z7qKT4REUlIKigREUlIyVxQc4IO0E5SYT9TYR9B+5lsUmE/47qPSfsalIiIhFsyn0GJiEiIqaBERCQhhb6gzKzAzIrNrNTMpjdxv5nZzyP3f2Rm5wSRszWi2MfxZrbfzD6I/Pk/QeRsDTOba2YVZra6mftDfxwhqv0M/bEEMLPBZrbMzNaZ2Rozu7uJNaE+plHuY+iPp5llmtnbZvZhZD//o4k18TmW7h7aP0AasAEYDnQEPgTGNVozFVhA/UfQXwC8FXTuOOzjeODloLO2cj8vBc4BVjdzf6iP40nsZ+iPZWQ/BgDnRK53B9Yn4e9mNPsY+uMZOT7dItczgLeAC9rjWIb9DOo8oNTdN7r7ceBZ4JpGa64Bfuv13gR6ffpx9SERzT6GnrsvB/aeYEnYjyMQ1X4mBXcvd/f3ItcPUv+hpYMaLQv1MY1yH0MvcnwORW5mRP40fnddXI5l2AtqELCtwe0y/vkHJJo1iSza/BdGTsEXmNmp7ROtXYX9OJ6MpDqWZpYLnE39v7wbSppjeoJ9hCQ4nmaWZmYfABXAYndvl2PZ4ifqJjhrYlvjZo9mTSKLJv971M+yOmRmU4E/A3nxDtbOwn4co5VUx9LMugHPAfe4+4HGdzfxkNAd0xb2MSmOp7vXAmeZWS/gBTM7zd0bvo4al2MZ9jOoMmBwg9s5wI4Y1iSyFvO7+4FPT8HdfT6QYWZZ7RexXYT9OEYlmY6lmWVQ/xf30+7+fBNLQn9MW9rHZDqeAO6+D3gVKGh0V1yOZdgL6h0gz8yGmVlH4AbgpUZrXgL+NfIukwuA/e5e3t5BW6HFfTSz/mZmkevnUX9c97R70vgK+3GMSrIcy8g+PAGsc/cHm1kW6mMazT4mw/E0s+zImRNm1hmYCBQ1WhaXYxnqp/jcvcbM7gQWUv9ut7nuvsbMbo/c/ytgPvXvMCkFjgC3BpU3FlHu4/XAt82sBjgK3OCRt9aEhZk9Q/07nrLMrAz4MfUvxibFcfxUFPsZ+mMZcTFwE/Bx5LULgP8FDIGkOabR7GMyHM8BwDwzS6O+YP/g7i+3x9+zGnUkIiIJKexP8YmISJJSQYmISEJSQYmISEJSQYmISEJSQYmISEJSQYnEiZn1aTDFeqeZbY9cP2RmjwWdTyTR6W3mIu3AzP4dOOTus4POIhIWOoMSaWeRzwh6OXL9381snpktMrPNZnadmc0ys4/NrDAySgczO9fMXjOzd81sYZimfovESgUlErwRwFXUf2TBU8Aydz+d+skDV0VK6hHgenc/F5gL/FdQYUXaS6hHHYkkiQXuXm1mH1M/zqowsv1jIBcYDZwGLI6MdUsDQjOzTiRWKiiR4B0DcPc6M6tuMKutjvrfUQPWuPuFQQUUCYKe4hNJfMVAtpldCPUf8RDWD74TORkqKJEE5+7HqZ+KPdPMPgQ+AC4KNJRIO9DbzEVEJCHpDEpERBKSCkpERBKSCkpERBKSCkpERBKSCkpERBKSCkpERBKSCkpERBLS/wfEBGRrQIHfsgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -1342,7 +1339,7 @@ }, { "cell_type": "markdown", - "id": "romantic-measure", + "id": "julian-security", "metadata": {}, "source": [ "Whenever you make a figure, you should label the axes. The ModSim\n", @@ -1351,13 +1348,13 @@ }, { "cell_type": "code", - "execution_count": 40, - "id": "occupied-claim", + "execution_count": 71, + "id": "helpful-pilot", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1380,7 +1377,7 @@ }, { "cell_type": "markdown", - "id": "practical-fruit", + "id": "false-thumb", "metadata": {}, "source": [ "## Summary\n", @@ -1399,7 +1396,7 @@ }, { "cell_type": "markdown", - "id": "bronze-adventure", + "id": "sweet-cartoon", "metadata": {}, "source": [ "## Exercises" @@ -1407,7 +1404,7 @@ }, { "cell_type": "markdown", - "id": "headed-invite", + "id": "destroyed-trainer", "metadata": {}, "source": [ "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", @@ -1418,7 +1415,7 @@ { "cell_type": "code", "execution_count": 41, - "id": "compressed-utilization", + "id": "olympic-adjustment", "metadata": {}, "outputs": [ { @@ -1440,7 +1437,7 @@ }, { "cell_type": "markdown", - "id": "cheap-panama", + "id": "aquatic-taxation", "metadata": {}, "source": [ "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." @@ -1449,7 +1446,7 @@ { "cell_type": "code", "execution_count": 42, - "id": "elect-makeup", + "id": "crucial-myanmar", "metadata": {}, "outputs": [ { @@ -1511,7 +1508,7 @@ }, { "cell_type": "markdown", - "id": "prescribed-white", + "id": "parliamentary-cherry", "metadata": {}, "source": [ "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", @@ -1537,8 +1534,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "id": "strategic-reporter", + "execution_count": 72, + "id": "overall-command", "metadata": {}, "outputs": [], "source": [ @@ -1548,9 +1545,9 @@ " results = TimeSeries()\n", " results[0] = bikeshare.olin\n", " \n", - " for i in range(1, num_steps):\n", + " for i in range(num_steps):\n", " step(p1, p2)\n", - " results[i] = bikeshare.olin\n", + " results[i+1] = bikeshare.olin\n", " \n", " plot(results, label='Olin')\n", " decorate(title='Olin-Wellesley Bikeshare',\n", @@ -1560,51 +1557,37 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "adjustable-zoning", + "execution_count": 73, + "id": "forbidden-salem", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Moving a bike to Olin\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n" + "Moving a bike to Olin\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1624,7 +1607,7 @@ }, { "cell_type": "markdown", - "id": "eleven-listening", + "id": "sensitive-insertion", "metadata": {}, "source": [ "## Opening the hood\n", @@ -1636,7 +1619,7 @@ }, { "cell_type": "markdown", - "id": "liable-reliance", + "id": "rolled-fundamental", "metadata": {}, "source": [ "The `State` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." @@ -1644,19 +1627,19 @@ }, { "cell_type": "markdown", - "id": "naked-department", + "id": "indonesian-wiring", "metadata": {}, "source": [ "The `TimeSeries` object is based on the `Series` object defined by a library called Pandas.\n", "The documentation is at .\n", "\n", - "`display` works by creating another Pandas object, called a `DataFrame`, which can be displayed as a table.\n", + "`show` works by creating another Pandas object, called a `DataFrame`, which can be displayed as a table.\n", "We'll use `DataFrame` objects in future chapters." ] }, { "cell_type": "markdown", - "id": "derived-province", + "id": "embedded-narrative", "metadata": {}, "source": [ "`Series` objects provide their own `plot` function, but the syntax is different from the other functions we've used, so ModSim provides a function called `plot` just to make it consistent.\n", @@ -1667,7 +1650,7 @@ }, { "cell_type": "markdown", - "id": "southeast-advertiser", + "id": "tested-appearance", "metadata": {}, "source": [ "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", @@ -1678,7 +1661,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "tested-blond", + "id": "relative-oliver", "metadata": {}, "outputs": [ { @@ -1705,7 +1688,7 @@ }, { "cell_type": "markdown", - "id": "rational-taiwan", + "id": "sharp-bottle", "metadata": {}, "source": [ "You might not understand everything in this function yet, but you will." @@ -1714,7 +1697,7 @@ { "cell_type": "code", "execution_count": null, - "id": "significant-defense", + "id": "smooth-causing", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap03.ipynb b/jupyter/chap03.ipynb new file mode 100644 index 00000000..57f108f3 --- /dev/null +++ b/jupyter/chap03.ipynb @@ -0,0 +1,1077 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "missing-intention", + "metadata": {}, + "source": [ + "# Chapter 3" + ] + }, + { + "cell_type": "markdown", + "id": "comprehensive-extreme", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "electrical-charlotte", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "handy-occurrence", + "metadata": {}, + "source": [ + "To paraphrase two Georges, \"All models are wrong, but some models are\n", + "more wrong than others.\" In this chapter, I demonstrate the process we\n", + "use to make models less wrong.\n", + "\n", + "As an example, we'll review the bikeshare model from the previous\n", + "chapter, consider its strengths and weaknesses, and gradually improve\n", + "it. We'll also see ways to use the model to understand the behavior of\n", + "the system and evaluate designs intended to make it work better." + ] + }, + { + "cell_type": "markdown", + "id": "authentic-supplier", + "metadata": {}, + "source": [ + "## Iterative modeling\n", + "\n", + "The model we have so far is simple, but it is based on unrealistic\n", + "assumptions. Before you go on, take a minute to review the model from\n", + "the previous chapter. What assumptions is it based on? Make a list of\n", + "ways this model might be unrealistic; that is, what are the differences between the model and the real world?\n", + "\n", + "Here are some of the differences on my list:\n", + "\n", + "- In the model, a student is equally likely to arrive during any\n", + " one-minute period. In reality, this probability varies depending on time of day, day of the week, etc.\n", + "\n", + "- The model does not account for travel time from one bike station to another.\n", + "\n", + "- The model does not check whether a bike is available, so it's\n", + " possible for the number of bikes to be negative (as you might have\n", + " noticed in some of your simulations)." + ] + }, + { + "cell_type": "markdown", + "id": "constant-kennedy", + "metadata": {}, + "source": [ + "Some of these modeling decisions are better than others. For example,\n", + "the first assumption might be reasonable if we simulate the system for a short period of time, like one hour.\n", + "\n", + "The second assumption is not very realistic, but it might not affect the results very much, depending on what we use the model for.\n", + "\n", + "On the other hand, the third assumption seems problematic, and it is\n", + "relatively easy to fix. In this chapter, we will.\n", + "\n", + "This process, starting with a simple model, identifying the most\n", + "important problems, and making gradual improvements, is called\n", + "**iterative modeling**.\n", + "\n", + "For any physical system, there are many possible models, based on\n", + "different assumptions and simplifications. It often takes several\n", + "iterations to develop a model that is good enough for the intended\n", + "purpose, but no more complicated than necessary." + ] + }, + { + "cell_type": "markdown", + "id": "arranged-bahamas", + "metadata": {}, + "source": [ + "## More than one State object\n", + "\n", + "Before we go on, I want to make a few changes to the code from the\n", + "previous chapter. First I'll generalize the functions we wrote so they\n", + "take a `State` object as a parameter. Then, I'll make the code more\n", + "readable by adding documentation.\n", + "\n", + "Here is one of the functions from the previous chapter, `bike_to_wellesley`:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "outside-darkness", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "widespread-monitor", + "metadata": {}, + "source": [ + "When this function is called, it modifies `bikeshare`. As long as there\n", + "is only one `State` object, that's fine, but what if there is more than\n", + "one bike share system in the world? Or what if we want to run more than\n", + "one simulation?\n", + "\n", + "This function would be more flexible if it took a `State` object as a\n", + "parameter. Here's what that looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "central-vegetable", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "finite-silence", + "metadata": {}, + "source": [ + "The name of the parameter is `state` rather than `bikeshare` as a\n", + "reminder that the value of `state` could be any `State` object, not just\n", + "`bikeshare`.\n", + "\n", + "This version of `bike_to_wellesley` requires a `State` object as a\n", + "parameter, so we have to provide one when we call it:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "statistical-conviction", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "bike_to_wellesley(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "still-commons", + "metadata": {}, + "source": [ + "Again, the argument we provide gets assigned to the parameter, so this\n", + "function call has the same effect as:\n", + "\n", + "```\n", + "state = bikeshare \n", + "state.olin -= 1 \n", + "state.wellesley += 1\n", + "```\n", + "\n", + "Now we can create as many `State` objects as we want:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "facial-tunnel", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare1 = State(olin=10, wellesley=2)\n", + "bikeshare2 = State(olin=2, wellesley=10)" + ] + }, + { + "cell_type": "markdown", + "id": "active-gilbert", + "metadata": {}, + "source": [ + "And update them independently:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "static-african", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley(bikeshare1)\n", + "bike_to_wellesley(bikeshare2)" + ] + }, + { + "cell_type": "markdown", + "id": "honey-elder", + "metadata": {}, + "source": [ + "Changes in `bikeshare1` do not affect `bikeshare2`, and vice versa. So\n", + "we can simulate different bike share systems, or run multiple\n", + "simulations of the same system." + ] + }, + { + "cell_type": "markdown", + "id": "animated-parliament", + "metadata": {}, + "source": [ + "## Documentation\n", + "\n", + "Another problem with the code we have so far is that it contains no\n", + "**documentation**. Documentation is text we add to a program to help\n", + "other programmers read and understand it. It has no effect on the\n", + "program when it runs.\n", + "\n", + "There are two forms of documentation, **docstrings** and **comments**:\n", + "\n", + "* A docstring is a string in triple-quotes that appears at the beginning of a function.\n", + "\n", + "* A comment is a line of text that begins with a hash symbol, `#`.\n", + "\n", + "Here's a version of `bike_to_olin` with a docstring and a comment." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "sticky-macedonia", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " # We decrease one state variable and increase the\n", + " # other, so the total number of bikes is unchanged.\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "returning-faith", + "metadata": {}, + "source": [ + "Docstrings follow a conventional format:\n", + "\n", + "- The first line is a single sentence that describes what the function does.\n", + "\n", + "- The following lines explain what the parameters are.\n", + "\n", + "A function's docstring should include the information someone needs to\n", + "know to *use* the function; it should not include details about how the function works.\n", + "\n", + "Comments provide details about how the function works, especially if there is something that would not be obvious to someone reading the program." + ] + }, + { + "cell_type": "markdown", + "id": "frank-influence", + "metadata": {}, + "source": [ + "## Negative bikes\n", + "\n", + "The changes we've made so far improve the quality of the code, but we\n", + "haven't done anything to improve the quality of the model yet. Let's do that now.\n", + "\n", + "Currently the simulation does not check whether a bike is available when a customer arrives, so the number of bikes at a location can be\n", + "negative. That's not very realistic. Here's a version of\n", + "`bike_to_olin` that fixes the problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fitted-carnival", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " if state.wellesley == 0:\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "signal-baking", + "metadata": {}, + "source": [ + "The first line checks whether the number of bikes at Wellesley is zero. If so, it uses a **return statement**, which causes the function to end immediately, without running the rest of the statements. So if there are no bikes at Wellesley, we \"return\" from `bike_to_olin` without changing the state.\n", + "\n", + "We can test it by initializing the state with no bikes at Wellesley And calling `bike_to_olin`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "moral-bench", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=12, wellesley=0)\n", + "bike_to_olin(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "imperial-disposal", + "metadata": {}, + "source": [ + "The state of the system should be unchanged." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "latest-boards", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin12
wellesley0
\n", + "
" + ], + "text/plain": [ + "namespace(olin=12, wellesley=0)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "substantial-english", + "metadata": {}, + "source": [ + "No more negative bikes (at least at Wellesley)." + ] + }, + { + "cell_type": "markdown", + "id": "marked-talent", + "metadata": {}, + "source": [ + "## Comparison operators\n", + "\n", + "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True` if they are equal and `False` otherwise.\n", + "\n", + "It is easy to confuse the equals operators with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "typical-characterization", + "metadata": {}, + "outputs": [], + "source": [ + "x = 5" + ] + }, + { + "cell_type": "markdown", + "id": "dependent-athens", + "metadata": {}, + "source": [ + "On the other hand, the following statement checks whether `x` is `5` and\n", + "returns `True` or `False`. It does not create `x` or change its value." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "living-baseball", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x == 5" + ] + }, + { + "cell_type": "markdown", + "id": "small-adventure", + "metadata": {}, + "source": [ + "You can use the equals operator in an `if` statement, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cordless-consideration", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "yes, x is 5\n" + ] + } + ], + "source": [ + "if x == 5:\n", + " print('yes, x is 5')" + ] + }, + { + "cell_type": "markdown", + "id": "mineral-azerbaijan", + "metadata": {}, + "source": [ + "If you make a mistake and use `=` in an `if` statement, like this:\n", + "\n", + "```\n", + "if x = 5:\n", + " print('yes, x is 5')\n", + "```\n", + "\n", + "That's a **syntax error**, which means that the structure of the program is invalid. Python will print an error message and the program won't run." + ] + }, + { + "cell_type": "markdown", + "id": "empty-lecture", + "metadata": {}, + "source": [ + "The equals operator is one of the **comparison operators**. The others\n", + "are:\n", + "\n", + "| Operation \t| Symbol \t|\n", + "|-----------------------\t|--------\t|\n", + "| Less than \t| `<` \t|\n", + "| Greater than \t| `>` \t|\n", + "| Less than or equal \t| `<=` \t|\n", + "| Greater than or equal \t| `>=` \t|\n", + "| Equal \t| `==` \t|\n", + "| Not equal \t| `!=` \t|" + ] + }, + { + "cell_type": "markdown", + "id": "caroline-advocacy", + "metadata": {}, + "source": [ + "## Metrics\n", + "\n", + "Getting back to the bike share system, at this point we have the ability to simulate the behavior of the system. Since the arrival of customers is random, the state of the system is different each time we run a\n", + "simulation. Models like this are called random or **stochastic**; models\n", + "that do the same thing every time they run are **deterministic**.\n", + "\n", + "Suppose we want to use our model to predict how well the bike share\n", + "system will work, or to design a system that works better. First, we\n", + "have to decide what we mean by \"how well\" and \"better\".\n", + "\n", + "From the customer's point of view, we might like to know the probability of finding an available bike. From the system-owner's point of view, we\n", + "might want to minimize the number of customers who don't get a bike when\n", + "they want one, or maximize the number of bikes in use. Statistics like\n", + "these that quantify how well the system works are called **metrics**.\n", + "\n", + "As a simple example, let's measure the number of unhappy customers.\n", + "Here's a version of `bike_to_olin` that keeps track of the number of\n", + "customers who arrive at a station with no bikes:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "champion-gibson", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "living-leather", + "metadata": {}, + "source": [ + "If a customer arrives at the Wellesley station and finds no bike\n", + "available, `bike_to_olin` updates `wellesley_empty` which counts the\n", + "number of unhappy customers.\n", + "\n", + "This function only works if we initialize `wellesley_empty` when we\n", + "create the `State` object, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "aging-evolution", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=12, wellesley=0, \n", + " wellesley_empty=0)" + ] + }, + { + "cell_type": "markdown", + "id": "painted-province", + "metadata": {}, + "source": [ + "We can test it by calling `bike_to_olin`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "exciting-feature", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "bike_to_olin(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "integral-wheat", + "metadata": {}, + "source": [ + "There should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "aware-technology", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin12
wellesley0
wellesley_empty1
\n", + "
" + ], + "text/plain": [ + "namespace(olin=12, wellesley=0, wellesley_empty=1)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "appropriate-steps", + "metadata": {}, + "source": [ + "Looks good!" + ] + }, + { + "cell_type": "markdown", + "id": "harmful-criminal", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter, we wrote several versions of `bike_to_olin`:\n", + "\n", + "* We added a parameter, `state`, so we can work with more than one `State` object.\n", + "\n", + "* We added a docstring that explains how to use the function and a comment that explains how it works.\n", + "\n", + "* We used a conditional operator, `==`, to check whether a bike is available, in order to avoid negative bikes.\n", + "\n", + "* We added a state variable, `wellesley_empty`, to count the number of unhappy customers, which is a metric we'll use to quantify how well the system works.\n", + "\n", + "In the exercises, you'll update `bike_to_wellesley` the same way and test it by running a simulation." + ] + }, + { + "cell_type": "markdown", + "id": "gothic-backing", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "limited-tamil", + "metadata": {}, + "source": [ + "Here's the code we have so far, with docstrings, all in one place." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "standing-garbage", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries, plot, decorate\n", + "\n", + "def run_simulation(state, p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " state: State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[0] = state.olin\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " results[i+1] = state.olin\n", + " \n", + " plot(results, label='Olin')\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "durable-vacuum", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import flip\n", + "\n", + "def step(state, p1, p2):\n", + " \"\"\"Simulate one time step.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley ride\n", + " p2: probability of a Wellesley->Olin ride\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "peripheral-maximum", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "exclusive-audio", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "useful-gabriel", + "metadata": {}, + "source": [ + "**Exercise:** Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add one to `olin_empty`.\n", + "\n", + "To test it, create a `State` that initializes `olin` and `olin_empty` to `0`, run `bike_to_wellesley`, and check the result." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "violent-grant", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "acceptable-stress", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "bikeshare = State(olin=0, wellesley=12,\n", + " olin_empty=0, wellesley_empty=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "measured-suggestion", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "bike_to_wellesley(bikeshare)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "collected-column", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin0
wellesley12
olin_empty1
wellesley_empty0
\n", + "
" + ], + "text/plain": [ + "namespace(olin=0, wellesley=12, olin_empty=1, wellesley_empty=0)" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "understanding-humor", + "metadata": {}, + "source": [ + "**Exercise:** Now run the simulation a few times and confirm that the number of bikes is never negative. What's the final state of the system?" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "quantitative-threat", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "bikeshare = State(olin=10, wellesley=2,\n", + " olin_empty=0, wellesley_empty=0)\n", + "\n", + "run_simulation(bikeshare, 0.3, 0.2, 60)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "hindu-reverse", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin0
wellesley12
olin_empty2
wellesley_empty0
\n", + "
" + ], + "text/plain": [ + "namespace(olin=0, wellesley=12, olin_empty=2, wellesley_empty=0)" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "institutional-dublin", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap04.ipynb b/jupyter/chap04.ipynb new file mode 100644 index 00000000..d9ca99f7 --- /dev/null +++ b/jupyter/chap04.ipynb @@ -0,0 +1,1208 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "killing-desire", + "metadata": {}, + "source": [ + "# Chapter 4" + ] + }, + { + "cell_type": "markdown", + "id": "younger-hobby", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "satellite-sociology", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "concrete-jackson", + "metadata": {}, + "source": [ + "Here the code from previous chapters we'll reuse." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fifth-mongolia", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import flip\n", + "\n", + "def step(state, p1, p2):\n", + " \"\"\"Simulate one time step.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley ride\n", + " p2: probability of a Wellesley->Olin ride\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "duplicate-evolution", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "parental-veteran", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "outer-delivery", + "metadata": {}, + "source": [ + "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the arrival rate of customers at bike stations.\n", + "\n", + "We also discuss a program development strategy, called incremental\n", + "development, that might help you write programs faster and spend less\n", + "time debugging." + ] + }, + { + "cell_type": "markdown", + "id": "aggressive-cambridge", + "metadata": {}, + "source": [ + "## Functions that return values\n", + "\n", + "We have seen several functions that return values; for example, when you run `sqrt`, it returns a number you can assign to a variable." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "assisted-assault", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.4142135623730951" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import sqrt\n", + "\n", + "root_2 = sqrt(2)\n", + "root_2" + ] + }, + { + "cell_type": "markdown", + "id": "polar-marshall", + "metadata": {}, + "source": [ + "When you run `State`, it returns a new `State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "upper-closer", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "namespace(olin=10, wellesley=2)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import State\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "qualified-complaint", + "metadata": {}, + "source": [ + "Not all functions have return values. For example, when you run `step`,\n", + "it updates a `State` object, but it doesn't return a value.\n", + "\n", + "To write functions that return values, we can use a `return` statement, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "exceptional-philosophy", + "metadata": {}, + "outputs": [], + "source": [ + "def add_five(x):\n", + " return x + 5" + ] + }, + { + "cell_type": "markdown", + "id": "sporting-japan", + "metadata": {}, + "source": [ + "`add_five` takes a parameter, `x`, which could be any number. It\n", + "computes `x + 5` and returns the result. So if we run it like this, the\n", + "result is `8`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "differential-cooperation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add_five(3)" + ] + }, + { + "cell_type": "markdown", + "id": "pending-detail", + "metadata": {}, + "source": [ + "As a more useful example, here's a version of `run_simulation` that\n", + "creates a `State` object, runs a simulation, and then returns the\n", + "`State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "historic-hollow", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "def run_simulation(p1, p2, num_steps):\n", + " state = State(olin=10, wellesley=2,\n", + " olin_empty=0, wellesley_empty=0)\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " \n", + " return state" + ] + }, + { + "cell_type": "markdown", + "id": "corporate-watershed", + "metadata": {}, + "source": [ + "We can call `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "sustained-centre", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = run_simulation(0.3, 0.2, 60)" + ] + }, + { + "cell_type": "markdown", + "id": "assumed-bosnia", + "metadata": {}, + "source": [ + "The result is a `State` object that represents the final state of the system, including the metrics we'll use to evaluate the performance of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "relevant-colonial", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1\n" + ] + } + ], + "source": [ + "print(final_state.olin_empty, \n", + " final_state.wellesley_empty)" + ] + }, + { + "cell_type": "markdown", + "id": "eight-singapore", + "metadata": {}, + "source": [ + "The simulation we just ran starts with `olin=10` and `wellesley=2`, and uses the values `p1=0.3`, `p2=0.2`, and `num_steps=60`. \n", + "These five values are **parameters of the model**, which are quantities that determine the behavior of the system.\n", + "\n", + "It is easy to get the parameters of a model confused with the parameters of a function. \n", + "In fact, it is common for the parameters of the model to appear as parameters in functions. \n", + "\n", + "For example, the previous version of `run_simulation` takes `p1`, `p2`, and `num_steps` as parameters.\n", + "So we can call `run_simulation` with different parameters and see how\n", + "the metrics, like the number of unhappy customers, depend on the\n", + "parameters. But before we do that, we need a new version of a `for` loop." + ] + }, + { + "cell_type": "markdown", + "id": "better-violation", + "metadata": {}, + "source": [ + "## Loops and arrays\n", + "\n", + "In `run_simulation`, we use this `for` loop:\n", + "\n", + "```\n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + "```\n", + "\n", + "In this example, `range` creates a sequence of numbers from 0 to `num_steps` (including `0` but not `num_steps`). \n", + "Each time through the loop, the next number in the sequence gets assigned to the loop variable, `i`.\n", + "\n", + "But `range` only works with integers; to get a sequence of non-integer\n", + "values, we can use `linspace`, which is defined NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "mexican-cocktail", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0. , 0.25, 0.5 , 0.75, 1. ])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import linspace\n", + "\n", + "p1_array = linspace(0, 1, 5)\n", + "p1_array" + ] + }, + { + "cell_type": "markdown", + "id": "upper-christianity", + "metadata": {}, + "source": [ + "The arguments indicate where the sequence should start and stop, and how\n", + "many elements it should contain. In this example, the sequence contains\n", + "`5` equally-spaced numbers, starting at `0` and ending at `1`.\n", + "\n", + "The result is a NumPy **array**, which is a new kind of object we have\n", + "not seen before. An array is a container for a sequence of numbers.\n", + "\n", + "We can use an array in a `for` loop like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "broadband-prairie", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0\n", + "0.25\n", + "0.5\n", + "0.75\n", + "1.0\n" + ] + } + ], + "source": [ + "for p1 in p1_array:\n", + " print(p1)" + ] + }, + { + "cell_type": "markdown", + "id": "hired-community", + "metadata": {}, + "source": [ + "When this loop runs, it\n", + "\n", + "1. Gets the first value from the array and assigns it to `p1`.\n", + "\n", + "2. Runs the body of the loop, which prints `p1`.\n", + "\n", + "3. Gets the next value from the array and assigns it to `p1`.\n", + "\n", + "4. Runs the body of the loop, which prints `p1`.\n", + "\n", + "And so on, until it gets to the end of the array. This will come in handy in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "fuzzy-blend", + "metadata": {}, + "source": [ + "## Sweeping parameters\n", + "\n", + "If we know the actual values of parameters like `p1` and `p2`, we can\n", + "use them to make specific predictions, like how many bikes will be at\n", + "Olin after one hour.\n", + "\n", + "But prediction is not the only goal; models like this are also used to\n", + "explain why systems behave as they do and to evaluate alternative\n", + "designs. For example, if we observe the system and notice that we often run out of bikes at a particular time, we could use the model to figure out why that happens. And if we are considering adding more bikes, or another station, we could evaluate the effect of various \"what if\" scenarios.\n", + "\n", + "As an example, suppose we have enough data to estimate that `p2` is\n", + "about `0.2`, but we don't have any information about `p1`. We could run simulations with a range of values for `p1` and see how the results vary. This process is called **sweeping** a parameter, in the sense that the value of the parameter \"sweeps\" through a range of possible values.\n", + "\n", + "Now that we know about loops and arrays, we can use them like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "oriented-mistress", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0 0\n", + "0.12 0\n", + "0.24 0\n", + "0.36 0\n", + "0.48 7\n", + "0.6 7\n" + ] + } + ], + "source": [ + "p1_array = linspace(0, 0.6, 6)\n", + "p2 = 0.2\n", + "num_steps = 60\n", + "\n", + "for p1 in p1_array:\n", + " final_state = run_simulation(p1, p2, num_steps)\n", + " print(p1, final_state.olin_empty)" + ] + }, + { + "cell_type": "markdown", + "id": "terminal-warren", + "metadata": {}, + "source": [ + "Each time through the loop, we run a simulation with a different value\n", + "of `p1` and the same value of `p2`, `0.2`. Then we print `p1` and the\n", + "number of unhappy customers at Olin.\n", + "\n", + "To save and plot the results, we can use a `SweepSeries` object, which\n", + "is similar to a `TimeSeries`; the difference is that the labels in a\n", + "`SweepSeries` are parameter values rather than time values.\n", + "\n", + "We can create an empty `SweepSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "foster-forestry", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import SweepSeries\n", + "\n", + "sweep = SweepSeries()" + ] + }, + { + "cell_type": "markdown", + "id": "crazy-storm", + "metadata": {}, + "source": [ + "And add values like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "hollywood-municipality", + "metadata": {}, + "outputs": [], + "source": [ + "for p1 in p1_array:\n", + " final_state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1] = final_state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "id": "daily-recipient", + "metadata": {}, + "source": [ + "The result is a `SweepSeries` that maps from each value of `p1` to the\n", + "resulting number of unhappy customers. Then we can plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cooked-intent", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import plot\n", + "\n", + "plot(sweep, label='Olin')" + ] + }, + { + "cell_type": "markdown", + "id": "opened-medicare", + "metadata": {}, + "source": [ + "NumPy provides functions that compute a variety of summary statistics, like `mean`, `median`, and `std` (which computes standard deviation).\n", + "\n", + "We can use `mean` to compute the average of the values in a series, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "rural-shark", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.166666666666667" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import mean\n", + "\n", + "mean(sweep)" + ] + }, + { + "cell_type": "markdown", + "id": "hydraulic-baseball", + "metadata": {}, + "source": [ + "In this example, computing the mean might not be useful, but in the exercises below, it will be." + ] + }, + { + "cell_type": "markdown", + "id": "portuguese-selection", + "metadata": {}, + "source": [ + "## Incremental development\n", + "\n", + "When you start writing programs that are more than a few lines, you\n", + "might find yourself spending more and more time debugging. The more code you write before you start debugging, the harder it is to find the problem.\n", + "\n", + "**Incremental development** is a way of programming that tries to\n", + "minimize the pain of debugging. The fundamental steps are:\n", + "\n", + "1. Always start with a working program. If you have an example from a\n", + " book, or a program you wrote that is similar to what you are working\n", + " on, start with that. Otherwise, start with something you *know* is\n", + " correct, like `x=5`. Run the program and confirm that it does what\n", + " you expect.\n", + "\n", + "2. Make one small, testable change at a time. A \"testable\" change is\n", + " one that displays something or has some other effect you can check.\n", + " Ideally, you should know what the correct answer is, or be able to\n", + " check it by performing another computation.\n", + "\n", + "3. Run the program and see if the change worked. If so, go back to\n", + " Step 2. If not, you will have to do some debugging, but if the\n", + " change you made was small, it shouldn't take long to find the\n", + " problem.\n", + "\n", + "When this process works, your changes usually work the first time, or if they don't, the problem is obvious. In practice, there are two problems with incremental development:\n", + "\n", + "- Sometimes you have to write extra code to generate visible output\n", + " that you can check. This extra code is called **scaffolding**\n", + " because you use it to build the program and then remove it when you\n", + " are done. That might seem like a waste, but time you spend on\n", + " scaffolding is almost always time you save on debugging.\n", + "\n", + "- When you are getting started, it might not be obvious how to choose\n", + " the steps that get from `x=5` to the program you are trying to\n", + " write. You will see more examples of this process as we go along,\n", + " and you will get better with experience.\n", + "\n", + "If you find yourself writing more than a few lines of code before you\n", + "start testing, and you are spending a lot of time debugging, try\n", + "incremental development." + ] + }, + { + "cell_type": "markdown", + "id": "indonesian-assumption", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "attempted-confidence", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "prerequisite-sunglasses", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", + "\n", + "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "restricted-destruction", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def make_state():\n", + " state = State(olin=10, wellesley=2)\n", + " return state" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "fallen-jungle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "init = make_state()" + ] + }, + { + "cell_type": "markdown", + "id": "classified-clerk", + "metadata": {}, + "source": [ + "**Exercise:** Read the documentation of `linspace` at <>.\n", + "Then use it to make an array of 101 equally spaced points between 0 and 1 (including both)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "dimensional-gentleman", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,\n", + " 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,\n", + " 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,\n", + " 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,\n", + " 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,\n", + " 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,\n", + " 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,\n", + " 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,\n", + " 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,\n", + " 0.99, 1. ])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "p1_array = linspace(0, 1, 101)\n", + "p1_array" + ] + }, + { + "cell_type": "markdown", + "id": "local-stretch", + "metadata": {}, + "source": [ + "**Exercise:** Wrap the code from this chapter in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", + "\n", + "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "underlying-samoa", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def sweep_p1(p1_array):\n", + " p2 = 0.2\n", + " num_steps = 60\n", + " sweep = SweepSeries()\n", + " \n", + " for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1] = state.olin_empty\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "auburn-junction", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "from modsim import decorate\n", + "\n", + "p1_array = linspace(0, 1, 101)\n", + "sweep = sweep_p1(p1_array)\n", + "plot(sweep, label='Olin')\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ] + }, + { + "cell_type": "markdown", + "id": "mineral-missile", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "false-lightning", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def sweep_p2(p2_array):\n", + " p1 = 0.5\n", + " num_steps = 60\n", + " sweep = SweepSeries()\n", + " \n", + " for p2 in p2_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep[p2] = state.olin_empty\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "neural-detail", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "p2_array = linspace(0, 1, 101)\n", + "sweep = sweep_p2(p2_array)\n", + "plot(sweep, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Wellesley (p2 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ] + }, + { + "cell_type": "markdown", + "id": "junior-neighbor", + "metadata": {}, + "source": [ + "## Optional Exercises\n", + "\n", + "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now." + ] + }, + { + "cell_type": "markdown", + "id": "marked-scale", + "metadata": {}, + "source": [ + "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", + "\n", + "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", + "\n", + "`num_runs` specifies how many times it should call `run_simulation`.\n", + "\n", + "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`.\n", + "At the end, it should return the `TimeSeries`.\n", + "\n", + "Test your function with parameters\n", + "\n", + "```\n", + "p1 = 0.3\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 10\n", + "```\n", + "\n", + "Display the resulting `TimeSeries` and use the `mean` function from NumPy to compute the average number of unhappy customers." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "facial-grass", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def run_multiple_simulations(p1, p2, num_steps, num_runs):\n", + " totals = TimeSeries()\n", + " \n", + " for i in range(num_runs):\n", + " state = run_simulation(p1, p2, num_steps)\n", + " totals[i] = state.olin_empty + state.wellesley_empty\n", + " \n", + " return totals" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "tropical-stream", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Quantity
Time
07
13
21
33
44
55
62
73
80
90
\n", + "
" + ], + "text/plain": [ + " Quantity\n", + "Time \n", + "0 7\n", + "1 3\n", + "2 1\n", + "3 3\n", + "4 4\n", + "5 5\n", + "6 2\n", + "7 3\n", + "8 0\n", + "9 0" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "from modsim import show\n", + "\n", + "p1 = 0.3\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 10\n", + "totals = run_multiple_simulations(p1, p2, num_steps, num_runs)\n", + "show(totals)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "documentary-murder", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.8" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "mean(totals)" + ] + }, + { + "cell_type": "markdown", + "id": "ecological-andrews", + "metadata": {}, + "source": [ + "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", + "\n", + "```\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 20\n", + "```\n", + "\n", + "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", + "\n", + "What value of `p1` minimizes the average number of unhappy customers?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "urban-parts", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "p1_array = linspace(0, 1, 20)\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 20\n", + "\n", + "sweep = SweepSeries()\n", + "for p1 in p1_array:\n", + " totals = run_multiple_simulations(p1, p2, num_steps, num_runs)\n", + " sweep[p1] = mean(totals)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "inappropriate-cooperation", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot(sweep, label='total', color='green')\n", + " \n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " ylabel='Average total unhappy customers')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "premier-complaint", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap05.ipynb b/jupyter/chap05.ipynb new file mode 100644 index 00000000..00bb7e44 --- /dev/null +++ b/jupyter/chap05.ipynb @@ -0,0 +1,1450 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "manual-spirit", + "metadata": {}, + "source": [ + "# Chapter 5" + ] + }, + { + "cell_type": "markdown", + "id": "intimate-lambda", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "respected-auditor", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "motivated-cleaner", + "metadata": {}, + "source": [ + "In this chapter..." + ] + }, + { + "cell_type": "markdown", + "id": "modern-holder", + "metadata": {}, + "source": [ + "# World population\n", + "\n", + "In 1968 Paul Erlich published *The Population Bomb*, in which he\n", + "predicted that world population would grow quickly during the 1970s,\n", + "that agricultural production could not keep up, and that mass starvation\n", + "in the next two decades was inevitable (see\n", + "). As someone who grew up during those\n", + "decades, I am happy to report that those predictions were wrong.\n", + "\n", + "But world population growth is still a topic of concern, and it is an\n", + "open question how many people the earth can sustain while maintaining\n", + "and improving our quality of life.\n", + "\n", + "In this chapter and the next, we use tools from the previous chapters to\n", + "explain world population growth since 1950 and generate predictions for\n", + "the next 50-100 years.\n", + "\n", + "For background on world population growth, watch this video from the\n", + "American Museum of Natural History ." + ] + }, + { + "cell_type": "markdown", + "id": "lyric-norwegian", + "metadata": {}, + "source": [ + "## World Population Data\n", + "\n", + "The Wikipedia article on world population contains tables with estimates of world population from prehistory to the present, and projections for the future ()." + ] + }, + { + "cell_type": "markdown", + "id": "sharp-study", + "metadata": {}, + "source": [ + "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "false-future", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "markdown", + "id": "tender-ethics", + "metadata": {}, + "source": [ + "To read this data, we will use Pandas, which provides functions for\n", + "working with data. The function we'll use is `read_html`, which can read a web page and extract data from any tables it contains. Before we can use it, we have to import it. You have already seen this import\n", + "statement:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "rising-trader", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "id": "higher-warner", + "metadata": {}, + "source": [ + "Now we can use it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "emerging-clause", + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'World_population_estimates.html'\n", + "tables = read_html(filename,\n", + " header=0, \n", + " index_col=0,\n", + " decimal='M')" + ] + }, + { + "cell_type": "markdown", + "id": "recovered-philadelphia", + "metadata": {}, + "source": [ + "The arguments are:\n", + "\n", + "- `filename`: The name of the file (including the directory it's in)\n", + " as a string. This argument can also be a URL starting with `http`.\n", + "\n", + "- `header`: Indicates which row of each table should be considered the\n", + " header, that is, the set of labels that identify the columns. In\n", + " this case it is the first row (numbered 0).\n", + "\n", + "- `index_col`: Indicates which column of each table should be\n", + " considered the **index**, that is, the set of labels that identify\n", + " the rows. In this case it is the first column, which contains the\n", + " years.\n", + "\n", + "- `decimal`: Normally this argument is used to indicate which\n", + " character should be considered a decimal point, because some\n", + " conventions use a period and some use a comma. In this case I am\n", + " abusing the feature by treating `M` as a decimal point, which allows\n", + " some of the estimates, which are expressed in millions, to be read\n", + " as numbers.\n", + "\n", + "The result, which is assigned to `tables`, is a sequence that contains\n", + "one `DataFrame` for each table. A `DataFrame` is an object, defined by\n", + "Pandas, that represents tabular data.\n", + "\n", + "To select a `DataFrame` from `tables`, we can use the bracket operator\n", + "like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "judicial-samba", + "metadata": {}, + "outputs": [], + "source": [ + "table2 = tables[2]" + ] + }, + { + "cell_type": "markdown", + "id": "ethical-proportion", + "metadata": {}, + "source": [ + "This line selects the third table (numbered 2), which contains\n", + "population estimates from 1950 to 2016.\n", + "\n", + "We can use `head` to display the first few lines of the table." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "superior-colombia", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
United States Census Bureau (2017)[28]Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2007)[24]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
Year
195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
19512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
19522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
19532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
19542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " United States Census Bureau (2017)[28] \\\n", + "Year \n", + "1950 2557628654 \n", + "1951 2594939877 \n", + "1952 2636772306 \n", + "1953 2682053389 \n", + "1954 2730228104 \n", + "\n", + " Population Reference Bureau (1973–2016)[15] \\\n", + "Year \n", + "1950 2.516000e+09 \n", + "1951 NaN \n", + "1952 NaN \n", + "1953 NaN \n", + "1954 NaN \n", + "\n", + " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", + "Year \n", + "1950 2.525149e+09 \n", + "1951 2.572851e+09 \n", + "1952 2.619292e+09 \n", + "1953 2.665865e+09 \n", + "1954 2.713172e+09 \n", + "\n", + " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n", + "Year \n", + "1950 2.544000e+09 2.527960e+09 2.400000e+09 \n", + "1951 2.571663e+09 NaN NaN \n", + "1952 2.617949e+09 NaN NaN \n", + "1953 2.665959e+09 NaN NaN \n", + "1954 2.716927e+09 NaN NaN \n", + "\n", + " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", + "Year \n", + "1950 2.527000e+09 2.500000e+09 2.400000e+09 \n", + "1951 NaN NaN NaN \n", + "1952 NaN NaN NaN \n", + "1953 NaN NaN NaN \n", + "1954 NaN NaN NaN \n", + "\n", + " Durand (1974)[22] Clark (1967)[23] \n", + "Year \n", + "1950 NaN 2.486000e+09 \n", + "1951 NaN NaN \n", + "1952 NaN NaN \n", + "1953 NaN NaN \n", + "1954 NaN NaN " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table2.head()" + ] + }, + { + "cell_type": "markdown", + "id": "collectible-chapter", + "metadata": {}, + "source": [ + "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", + "\n", + "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", + "\n", + "`NaN` is a special value that indicates missing data." + ] + }, + { + "cell_type": "markdown", + "id": "illegal-hollow", + "metadata": {}, + "source": [ + "The column labels are long strings, which makes them hard to work with.\n", + "We can replace them with shorter strings like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "interim-trouble", + "metadata": {}, + "outputs": [], + "source": [ + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "intense-mileage", + "metadata": {}, + "source": [ + "Now we can select a column from the `DataFrame` using the dot operator,\n", + "like selecting a state variable from a `State` object.\n", + "\n", + "Here are the estimates from the United States Census Bureau:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "resident-engineer", + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9" + ] + }, + { + "cell_type": "markdown", + "id": "disciplinary-advocacy", + "metadata": {}, + "source": [ + "The result is a Pandas `Series`, which is similar to the `TimeSeries` and `SweepSeries` objects we've been using.\n", + "\n", + "The number `1e9` is a shorter way to write `1000000000` or one billion.\n", + "When we divide a `Series` by a number, it divides all of the elements of the `Series`.\n", + "From here on, we'll express population estimates in terms of billions.\n", + "\n", + "We can use `tail` to see the last few elements of the `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "african-calvin", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "2012 7.013871\n", + "2013 7.092128\n", + "2014 7.169968\n", + "2015 7.247893\n", + "2016 7.325997\n", + "Name: census, dtype: float64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "census.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "waiting-stack", + "metadata": {}, + "source": [ + "The left column is the **index** of the `Series`; in this example it contains the dates.\n", + "The right column contains the **values**, which are population estimates.\n", + "In 2016 the world population was about 7.3 billion.\n", + "\n", + "Here are the estimates from the United Nations\n", + "Department of Economic and Social Affairs (U.N. DESA):" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ruled-hearing", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "2012 7.080072\n", + "2013 7.162119\n", + "2014 7.243784\n", + "2015 7.349472\n", + "2016 NaN\n", + "Name: un, dtype: float64" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "un = table2.un / 1e9\n", + "un.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "incoming-summit", + "metadata": {}, + "source": [ + "The most recent estimate we have from the U.N. is for 2015, so the value for 2016 is `NaN`.\n", + "\n", + "Now we can plot the estimates like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "marine-sudan", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import plot, decorate\n", + "\n", + "plot(census, style=':', label='US Census')\n", + "plot(un, style='--', label='UN DESA')\n", + "\n", + "decorate(ylabel='World population (billion)')" + ] + }, + { + "cell_type": "markdown", + "id": "czech-fitness", + "metadata": {}, + "source": [ + "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", + "\n", + "The `label` argument provides the strings that appear in the legend.\n", + "\n", + "The lines overlap almost completely, but it looks like the most recent estimates diverge slightly.\n", + "In the next section, we'll quantify these differences." + ] + }, + { + "cell_type": "markdown", + "id": "adolescent-graduate", + "metadata": {}, + "source": [ + "## Absolute and relative errors\n", + "\n", + "Estimates of world population from the U.S. Census and the U.N. DESA differ slightly.\n", + "One way to characterize this difference is **absolute error**, which is the absolute value of the difference between the two.\n", + "\n", + "To compute absolute value, we can import `abs` from NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "resident-matthew", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import abs" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "resident-bonus", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "2012 0.066201\n", + "2013 0.069991\n", + "2014 0.073816\n", + "2015 0.101579\n", + "2016 NaN\n", + "dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "abs_error = abs(un - census)\n", + "abs_error.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "removed-friendly", + "metadata": {}, + "source": [ + "When you subtract two `Series` objects, the result is a new `Series`.\n", + "Because one of the estimates from 2016 is `NaN`, the result is `NaN`.\n", + "\n", + "To summarize the results, we can compute the **mean absolute error**." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "executive-luxury", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.029034508242424265" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import mean\n", + "\n", + "mean(abs_error)" + ] + }, + { + "cell_type": "markdown", + "id": "empty-kuwait", + "metadata": {}, + "source": [ + "On average, the estimates differ by about 0.029 billion.\n", + "But we can also use `max` to compute the maximum absolute error." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "wicked-paste", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.10157921199999986" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import max\n", + "\n", + "max(abs_error)" + ] + }, + { + "cell_type": "markdown", + "id": "vulnerable-olympus", + "metadata": {}, + "source": [ + "In the worst case, they differ by about 0.1 billion.\n", + "\n", + "Now 0.1 billion is a lot of people, so that might sound like a serious discrepancy.\n", + "But counting everyone is the world is hard, and we should not expect the estimates to be exact.\n", + "\n", + "Another way to quantify the magnitude of the difference is **relative error**, which is the size of the error divided by the estimates themselves." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "negative-championship", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "2012 0.943860\n", + "2013 0.986888\n", + "2014 1.029514\n", + "2015 1.401500\n", + "2016 NaN\n", + "dtype: float64" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rel_error = abs_error / census * 100\n", + "rel_error.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "supposed-canberra", + "metadata": {}, + "source": [ + "I multiplied by 100 so we can interpret the results as a percentage. In 2015, the difference between the estimates is about 1.4%, and that happens to be the maximum.\n", + "\n", + "Again, we can summarize the results by computing the mean." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "statutory-leadership", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5946585816022846" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean(rel_error)" + ] + }, + { + "cell_type": "markdown", + "id": "fluid-syria", + "metadata": {}, + "source": [ + "The mean relative error is about 0.6%.\n", + "So that's not bad.\n", + "\n", + "You might wonder why I divided by `census` rather than `un`.\n", + "In general, if you think one estimate is better than the other, you put the better one in the denominator.\n", + "In this case, I don't know which is better, so I put the smaller one in the denominator, which makes the computed errors a little bigger." + ] + }, + { + "cell_type": "markdown", + "id": "confident-people", + "metadata": {}, + "source": [ + "## Modeling Population Growth\n", + "\n", + "Suppose we want to predict world population growth over the next 50 or\n", + "100 years. We can do that by developing a model that describes how\n", + "populations grow, fitting the model to the data we have so far, and then using the model to generate predictions.\n", + "\n", + "In the next few sections I demonstrate this process starting with simple models and gradually improving them.\n", + "\n", + "Although there is some curvature in the plotted estimates, it looks like world population growth has been close to linear since 1960 or so. So we'll start with a model that has constant growth.\n", + "\n", + "To fit the model to the data, we'll compute the average annual growth\n", + "from 1950 to 2016. Since the UN and Census data are so close, we'll use the Census data.\n", + "\n", + "We can select a value from a `Series` using the bracket operator:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "afraid-tennessee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.557628654" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "census[1950]" + ] + }, + { + "cell_type": "markdown", + "id": "trained-canyon", + "metadata": {}, + "source": [ + "So we can get the total growth during the interval like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "artistic-suicide", + "metadata": {}, + "outputs": [], + "source": [ + "total_growth = census[2016] - census[1950]" + ] + }, + { + "cell_type": "markdown", + "id": "advisory-mortality", + "metadata": {}, + "source": [ + "The numbers in brackets are called **labels**, because they label the\n", + "rows of the `Series`.\n", + "\n", + "In this example, the labels 2016 and 1950 are part of the data, so it\n", + "would be better not to make them part of the program. \n", + "Putting values like these in the program is called **hard coding**; it is considered bad practice because if the data change in the future, we have to change the program (see ).\n", + "\n", + "It would be better to get the labels from the `Series`.\n", + "We can do that by selecting the index from `census` and then selecting the first element." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "authorized-rough", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1950" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_0 = census.index[0]\n", + "t_0" + ] + }, + { + "cell_type": "markdown", + "id": "concerned-belgium", + "metadata": {}, + "source": [ + "So `t_0` is the label of the first element, which is 1950.\n", + "We can get the label of the last element like this." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "forced-trunk", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2016" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_end = census.index[-1]\n", + "t_end" + ] + }, + { + "cell_type": "markdown", + "id": "driving-humor", + "metadata": {}, + "source": [ + "The value `-1` indicates the last element; `-2` indicates the second to last element, and so on.\n", + "\n", + "The difference between `t_0` and `t_end` is the elapsed time between them." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "vocal-weather", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "66" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "elapsed_time = t_end - t_0\n", + "elapsed_time" + ] + }, + { + "cell_type": "markdown", + "id": "accurate-interaction", + "metadata": {}, + "source": [ + "Now we can use `t_0` and `t_end` to select the population at the beginning and end of the interval." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "finnish-sentence", + "metadata": {}, + "outputs": [], + "source": [ + "p_0 = census[t_0]\n", + "p_end = census[t_end]" + ] + }, + { + "cell_type": "markdown", + "id": "looking-board", + "metadata": {}, + "source": [ + "And compute the total growth during the interval." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "viral-indian", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4.768368055" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "total_growth = p_end - p_0\n", + "total_growth" + ] + }, + { + "cell_type": "markdown", + "id": "active-pierce", + "metadata": {}, + "source": [ + "Finally, we can compute average annual growth." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "vietnamese-adrian", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.07224800083333333" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "annual_growth = total_growth / elapsed_time\n", + "annual_growth" + ] + }, + { + "cell_type": "markdown", + "id": "occupied-indiana", + "metadata": {}, + "source": [ + "From 1950 to 2016, world population grew by about 0.07 billion people per year, on average.\n", + "The next step is to use this estimate to simulate population growth." + ] + }, + { + "cell_type": "markdown", + "id": "underlying-oliver", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "Our simulation will start with the observed population in 1950, `p_0`,\n", + "and add `annual_growth` each year. To store the results, we'll use a\n", + "`TimeSeries` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "opposed-above", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "results = TimeSeries(time='Year', quantity='Population')" + ] + }, + { + "cell_type": "markdown", + "id": "motivated-point", + "metadata": {}, + "source": [ + "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", + "These names don't affect the computation, but they appear when we display or plot the `TimeSeries`.\n", + "\n", + "We can set the first value in the new `TimeSeries` like this." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "architectural-techno", + "metadata": {}, + "outputs": [], + "source": [ + "results[t_0] = p_0" + ] + }, + { + "cell_type": "markdown", + "id": "absent-anthony", + "metadata": {}, + "source": [ + "Here's what it looks like so far." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "every-arkansas", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Population
Year
19502.557629
\n", + "
" + ], + "text/plain": [ + " Population\n", + "Year \n", + "1950 2.557629" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import show\n", + "\n", + "show(results)" + ] + }, + { + "cell_type": "markdown", + "id": "diagnostic-testimony", + "metadata": {}, + "source": [ + "Now we set the rest of the values by simulating annual growth:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "dedicated-system", + "metadata": {}, + "outputs": [], + "source": [ + "for t in range(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "markdown", + "id": "classical-uncertainty", + "metadata": {}, + "source": [ + "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", + "\n", + "Inside the loop, we compute the population for the next year by adding the population for the current year and `annual_growth`. \n", + "\n", + "The last time through the loop, the value of `t` is 2015, so the last label in `results` is 2016.\n", + "\n", + "Here's what the results look like, compared to the estimates." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "trained-canvas", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "plot(census, style=':', label='US Census')\n", + "plot(un, style='--', label='UN DESA')\n", + "plot(results, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth')" + ] + }, + { + "cell_type": "markdown", + "id": "opening-fabric", + "metadata": {}, + "source": [ + "The keyword argument `color='gray'` specifies the color of the line.\n", + "\n", + "From 1950 to 1990, the model does not fit the data particularly well; after that, it's pretty good." + ] + }, + { + "cell_type": "markdown", + "id": "portuguese-party", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter is a first step toward modeling changes in world population growth during the last 70 years.\n", + "\n", + "We used Pandas to read data from a web page and store the results in a `DataFrame`.\n", + "From the `DataFrame` we selected two `Series` objects and used them to compute absolute and relative errors.\n", + "\n", + "Then we computed average population growth and used it to build a simple model with constant annual growth.\n", + "The model fits recent data pretty well; nevertheless, there are two reasons we should be skeptical:\n", + "\n", + "* There is no obvious mechanism that could cause population growth to be constant from year to year. Changes in population are determined by the fraction of people who die and the fraction of people who give birth, so we expect them to depend on the current population.\n", + "\n", + "* According to this model, world population would keep growing at the same rate forever, and that does not seem reasonable.\n", + "\n", + "In the next chapter we'll consider other models that might fit the data better and make more credible predictions." + ] + }, + { + "cell_type": "markdown", + "id": "terminal-house", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "gross-puzzle", + "metadata": {}, + "source": [ + "Here's the code from this chapter all in one place." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "binding-monitoring", + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = census.index[0]\n", + "t_end = census.index[-1]\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = census[t_0]\n", + "p_end = census[t_end]\n", + "\n", + "total_growth = p_end - p_0\n", + "annual_growth = total_growth / elapsed_time\n", + "\n", + "results = TimeSeries(time='Year', quantity='Population')\n", + "results[t_0] = p_0\n", + "\n", + "for t in range(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "another-concentration", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(census, style=':', label='US Census')\n", + "plot(un, style='--', label='UN DESA')\n", + "plot(results, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth')" + ] + }, + { + "cell_type": "markdown", + "id": "fiscal-edwards", + "metadata": {}, + "source": [ + "**Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", + "\n", + "Suggestions: \n", + "\n", + "1. Define `t_1` to be 1970 and `p_1` to be the population in 1970. Use `t_1` and `p_1` to compute annual growth, but use `t_0` and `p_0` to run the simulation. \n", + "\n", + "2. You might want to add a constant to the starting value to match the data better." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "spanish-number", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.07854997754347826" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "t_0 = census.index[0]\n", + "t_1 = 1970\n", + "t_end = census.index[-1]\n", + "elapsed_time = t_end - t_1\n", + "\n", + "p_0 = census[t_0]\n", + "p_1 = census[t_1]\n", + "p_end = census[t_end]\n", + "\n", + "total_growth = p_end - p_1\n", + "annual_growth = total_growth / elapsed_time\n", + "annual_growth" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "optimum-material", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "results = TimeSeries(time='Year', quantity='Population')\n", + "results[t_0] = p_0 - 0.45\n", + "\n", + "for t in range(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "formal-shade", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot(census, style=':', label='US Census')\n", + "plot(un, style='--', label='UN DESA')\n", + "plot(results, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "close-villa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d9c52ef8eb6854d90589fa323c5607fdea36a57d Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 28 Jan 2021 19:16:53 -0500 Subject: [PATCH 019/144] Revising chapters --- jupyter/chap02.ipynb | 212 ++++----- jupyter/chap05.ipynb | 160 +++---- jupyter/chap06.ipynb | 783 +++++++++++++++++++++++++++++++ jupyter/chap07.ipynb | 907 ++++++++++++++++++++++++++++++++++++ jupyter/chap08.ipynb | 1049 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2925 insertions(+), 186 deletions(-) create mode 100644 jupyter/chap06.ipynb create mode 100644 jupyter/chap07.ipynb create mode 100644 jupyter/chap08.ipynb diff --git a/jupyter/chap02.ipynb b/jupyter/chap02.ipynb index 7b9b4c9f..41748cef 100644 --- a/jupyter/chap02.ipynb +++ b/jupyter/chap02.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "million-filter", + "id": "friendly-reserve", "metadata": {}, "source": [ "# Chapter 2" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "expanded-rwanda", + "id": "rental-baptist", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "unknown-introduction", + "id": "framed-placement", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "narrative-parcel", + "id": "disabled-nurse", "metadata": {}, "source": [ "# Bike share\n", @@ -83,7 +83,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "prospective-appreciation", + "id": "aggregate-carbon", "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "average-damages", + "id": "scientific-connectivity", "metadata": {}, "source": [ "Now we can call it like this:" @@ -101,7 +101,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "distinguished-legislation", + "id": "reflected-tumor", "metadata": {}, "outputs": [], "source": [ @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "requested-wonder", + "id": "pressed-fighter", "metadata": {}, "source": [ "The expressions in parentheses are **keyword arguments**.\n", @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "distinguished-black", + "id": "sixth-wilderness", "metadata": {}, "outputs": [ { @@ -150,7 +150,7 @@ }, { "cell_type": "markdown", - "id": "increased-footage", + "id": "military-credits", "metadata": {}, "source": [ "And this:" @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "becoming-anatomy", + "id": "surprising-beverage", "metadata": {}, "outputs": [ { @@ -179,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "accurate-exemption", + "id": "mathematical-daughter", "metadata": {}, "source": [ "Or, to display the state variables and their values, you can just type the name of the object:" @@ -188,7 +188,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "incomplete-prediction", + "id": "yellow-consultancy", "metadata": {}, "outputs": [ { @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "noble-reviewer", + "id": "artificial-strand", "metadata": {}, "source": [ "These values make up the **state** of the system.\n", @@ -254,7 +254,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "signal-satisfaction", + "id": "documented-coach", "metadata": {}, "outputs": [], "source": [ @@ -264,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "continuing-sperm", + "id": "blank-pittsburgh", "metadata": {}, "source": [ "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "caring-richmond", + "id": "ahead-intro", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +284,7 @@ }, { "cell_type": "markdown", - "id": "antique-remains", + "id": "suited-laser", "metadata": {}, "source": [ "The result is the same either way." @@ -292,7 +292,7 @@ }, { "cell_type": "markdown", - "id": "dynamic-pepper", + "id": "retained-sauce", "metadata": {}, "source": [ "## Defining functions\n", @@ -305,7 +305,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "maritime-paste", + "id": "raised-conviction", "metadata": {}, "outputs": [], "source": [ @@ -315,7 +315,7 @@ }, { "cell_type": "markdown", - "id": "united-flexibility", + "id": "impaired-teddy", "metadata": {}, "source": [ "Rather than repeat them every time a bike moves, we can define a new\n", @@ -325,7 +325,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "narrow-marshall", + "id": "covered-algorithm", "metadata": {}, "outputs": [], "source": [ @@ -336,7 +336,7 @@ }, { "cell_type": "markdown", - "id": "amended-territory", + "id": "marine-smith", "metadata": {}, "source": [ "`def` is a special word in Python that indicates we are defining a new\n", @@ -356,7 +356,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "occupational-leeds", + "id": "sublime-question", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "governing-australia", + "id": "lucky-scope", "metadata": {}, "source": [ "When you call the function, it runs the statements in the body, which\n", @@ -376,7 +376,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "played-chambers", + "id": "divine-algeria", "metadata": {}, "outputs": [ { @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "conventional-terminal", + "id": "interracial-farmer", "metadata": {}, "source": [ "When you call a function, you have to include the parentheses. If you\n", @@ -441,7 +441,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "determined-wednesday", + "id": "worst-tomato", "metadata": {}, "outputs": [ { @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "heated-retail", + "id": "racial-france", "metadata": {}, "source": [ "This result indicates that `bike_to_wellesley` is a function. You don't\n", @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "cutting-coating", + "id": "deluxe-scoop", "metadata": {}, "source": [ "## Print statements\n", @@ -488,7 +488,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "spread-majority", + "id": "awful-laundry", "metadata": {}, "outputs": [ { @@ -509,7 +509,7 @@ }, { "cell_type": "markdown", - "id": "swedish-sequence", + "id": "ignored-yugoslavia", "metadata": {}, "source": [ "Jupyter runs both lines, but it only displays the value of the\n", @@ -520,7 +520,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "liked-volunteer", + "id": "infectious-hayes", "metadata": {}, "outputs": [ { @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "north-paradise", + "id": "valued-religious", "metadata": {}, "source": [ "When you call the `print` function, you can put a variable name in\n", @@ -550,7 +550,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "double-washer", + "id": "foreign-collins", "metadata": {}, "outputs": [ { @@ -567,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "abstract-muslim", + "id": "controversial-overall", "metadata": {}, "source": [ "Python looks up the values of the variables and displays them; in this\n", @@ -581,7 +581,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "mediterranean-rogers", + "id": "polish-outdoors", "metadata": {}, "outputs": [], "source": [ @@ -593,7 +593,7 @@ }, { "cell_type": "markdown", - "id": "cooperative-kuwait", + "id": "sufficient-stone", "metadata": {}, "source": [ "Each time we call this version of the function, it displays a message,\n", @@ -608,7 +608,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "floral-velvet", + "id": "scientific-edinburgh", "metadata": {}, "outputs": [], "source": [ @@ -620,7 +620,7 @@ }, { "cell_type": "markdown", - "id": "chicken-feedback", + "id": "flying-evaluation", "metadata": {}, "source": [ "And call it like this:" @@ -629,7 +629,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "fitting-adventure", + "id": "rotary-carry", "metadata": {}, "outputs": [ { @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "conditional-detector", + "id": "active-rocket", "metadata": {}, "source": [ "One benefit of defining functions is that you avoid repeating chunks of\n", @@ -657,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "threaded-taylor", + "id": "wanted-facing", "metadata": {}, "source": [ "## If statements\n", @@ -668,7 +668,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "english-reply", + "id": "protected-stewart", "metadata": {}, "outputs": [], "source": [ @@ -677,7 +677,7 @@ }, { "cell_type": "markdown", - "id": "eleven-hanging", + "id": "finished-attention", "metadata": {}, "source": [ "When you call it, you provide a probability between 0 and 1, like `0.7`, as an example:" @@ -686,7 +686,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "emerging-mystery", + "id": "substantial-azerbaijan", "metadata": {}, "outputs": [ { @@ -706,7 +706,7 @@ }, { "cell_type": "markdown", - "id": "compact-football", + "id": "progressive-objective", "metadata": {}, "source": [ "The result is one of two values: `True` with probability 0.7 or `False`\n", @@ -728,7 +728,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "potential-denmark", + "id": "blond-prophet", "metadata": {}, "outputs": [ { @@ -746,7 +746,7 @@ }, { "cell_type": "markdown", - "id": "changed-portable", + "id": "fallen-hurricane", "metadata": {}, "source": [ "If the result from `flip` is `True`, the program displays the string\n", @@ -763,7 +763,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "activated-butter", + "id": "experimental-dispute", "metadata": {}, "outputs": [ { @@ -783,7 +783,7 @@ }, { "cell_type": "markdown", - "id": "sexual-neighborhood", + "id": "statistical-tooth", "metadata": {}, "source": [ "Now we can use `flip` to simulate the arrival of students who want to\n", @@ -795,7 +795,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "multiple-manor", + "id": "protective-information", "metadata": {}, "outputs": [ { @@ -813,7 +813,7 @@ }, { "cell_type": "markdown", - "id": "thrown-casting", + "id": "breathing-joseph", "metadata": {}, "source": [ "If students arrive at the Wellesley station every 3 minutes, on average,\n", @@ -824,7 +824,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "occupied-indianapolis", + "id": "better-suggestion", "metadata": {}, "outputs": [], "source": [ @@ -834,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "coordinated-census", + "id": "smooth-doctrine", "metadata": {}, "source": [ "We can combine these snippets into a function that simulates a **time\n", @@ -844,7 +844,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "perceived-horizontal", + "id": "reserved-polls", "metadata": {}, "outputs": [], "source": [ @@ -858,7 +858,7 @@ }, { "cell_type": "markdown", - "id": "metric-classroom", + "id": "asian-absorption", "metadata": {}, "source": [ "Then we can simulate a time step like this:" @@ -867,7 +867,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "stable-jamaica", + "id": "hired-colors", "metadata": {}, "outputs": [], "source": [ @@ -876,7 +876,7 @@ }, { "cell_type": "markdown", - "id": "black-glance", + "id": "isolated-principle", "metadata": {}, "source": [ "Even though there are no values in parentheses, we have to include them." @@ -884,7 +884,7 @@ }, { "cell_type": "markdown", - "id": "respective-speed", + "id": "accompanied-ceremony", "metadata": {}, "source": [ "## Parameters\n", @@ -900,7 +900,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "competent-owner", + "id": "accomplished-incentive", "metadata": {}, "outputs": [], "source": [ @@ -914,7 +914,7 @@ }, { "cell_type": "markdown", - "id": "written-trust", + "id": "governmental-intelligence", "metadata": {}, "source": [ "The values of `p1` and `p2` are not set inside this function; instead,\n", @@ -924,7 +924,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "familiar-skiing", + "id": "bound-welsh", "metadata": {}, "outputs": [], "source": [ @@ -933,7 +933,7 @@ }, { "cell_type": "markdown", - "id": "tropical-termination", + "id": "simplified-popularity", "metadata": {}, "source": [ "The values you provide when you call the function are called\n", @@ -945,7 +945,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "religious-failing", + "id": "potential-hardware", "metadata": {}, "outputs": [], "source": [ @@ -961,7 +961,7 @@ }, { "cell_type": "markdown", - "id": "distinguished-ridge", + "id": "severe-bride", "metadata": {}, "source": [ "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", @@ -971,7 +971,7 @@ }, { "cell_type": "markdown", - "id": "laden-wisdom", + "id": "naughty-natural", "metadata": {}, "source": [ "## For loops\n", @@ -984,7 +984,7 @@ { "cell_type": "code", "execution_count": 62, - "id": "natural-roads", + "id": "posted-bruce", "metadata": {}, "outputs": [ { @@ -1008,7 +1008,7 @@ }, { "cell_type": "markdown", - "id": "hybrid-activation", + "id": "combined-handle", "metadata": {}, "source": [ "The syntax here should look familiar; the first line ends with a\n", @@ -1029,7 +1029,7 @@ }, { "cell_type": "markdown", - "id": "urban-brisbane", + "id": "spanish-turner", "metadata": {}, "source": [ "## TimeSeries" @@ -1037,7 +1037,7 @@ }, { "cell_type": "markdown", - "id": "greenhouse-caribbean", + "id": "arabic-parts", "metadata": {}, "source": [ "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", @@ -1051,7 +1051,7 @@ { "cell_type": "code", "execution_count": 63, - "id": "linear-magnet", + "id": "naval-earthquake", "metadata": {}, "outputs": [], "source": [ @@ -1060,7 +1060,7 @@ }, { "cell_type": "markdown", - "id": "crucial-tract", + "id": "everyday-mechanics", "metadata": {}, "source": [ "We can create a new, empty `TimeSeries` like this:" @@ -1069,7 +1069,7 @@ { "cell_type": "code", "execution_count": 64, - "id": "pressed-brooks", + "id": "hispanic-honolulu", "metadata": {}, "outputs": [], "source": [ @@ -1080,7 +1080,7 @@ }, { "cell_type": "markdown", - "id": "established-click", + "id": "encouraging-auckland", "metadata": {}, "source": [ "And we can add a quantity like this:" @@ -1089,7 +1089,7 @@ { "cell_type": "code", "execution_count": 65, - "id": "eligible-hormone", + "id": "colonial-fireplace", "metadata": {}, "outputs": [], "source": [ @@ -1098,7 +1098,7 @@ }, { "cell_type": "markdown", - "id": "based-dealer", + "id": "racial-arrival", "metadata": {}, "source": [ "The number in brackets is the time stamp, also called a **label**.\n", @@ -1110,7 +1110,7 @@ { "cell_type": "code", "execution_count": 66, - "id": "renewable-coating", + "id": "impressive-hours", "metadata": {}, "outputs": [ { @@ -1133,7 +1133,7 @@ }, { "cell_type": "markdown", - "id": "common-senegal", + "id": "minimal-credits", "metadata": {}, "source": [ "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", @@ -1152,7 +1152,7 @@ { "cell_type": "code", "execution_count": 67, - "id": "fewer-blocking", + "id": "finnish-lighting", "metadata": {}, "outputs": [ { @@ -1177,7 +1177,7 @@ }, { "cell_type": "markdown", - "id": "prescription-induction", + "id": "expensive-territory", "metadata": {}, "source": [ "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", @@ -1190,7 +1190,7 @@ { "cell_type": "code", "execution_count": 68, - "id": "divine-local", + "id": "right-bulletin", "metadata": {}, "outputs": [ { @@ -1264,7 +1264,7 @@ }, { "cell_type": "markdown", - "id": "conditional-sandwich", + "id": "statutory-copyright", "metadata": {}, "source": [ "You don't have to use `show`, but I think it looks better." @@ -1272,7 +1272,7 @@ }, { "cell_type": "markdown", - "id": "parental-treasure", + "id": "widespread-clinic", "metadata": {}, "source": [ "## Plotting\n", @@ -1284,7 +1284,7 @@ { "cell_type": "code", "execution_count": 69, - "id": "weekly-producer", + "id": "computational-council", "metadata": {}, "outputs": [ { @@ -1308,7 +1308,7 @@ }, { "cell_type": "markdown", - "id": "serial-report", + "id": "asian-sword", "metadata": {}, "source": [ "The legend for this figure says \"None\" because we have not provided a label. Here's how we can do that:" @@ -1317,7 +1317,7 @@ { "cell_type": "code", "execution_count": 70, - "id": "sublime-treatment", + "id": "touched-retailer", "metadata": {}, "outputs": [ { @@ -1339,7 +1339,7 @@ }, { "cell_type": "markdown", - "id": "julian-security", + "id": "expired-state", "metadata": {}, "source": [ "Whenever you make a figure, you should label the axes. The ModSim\n", @@ -1349,7 +1349,7 @@ { "cell_type": "code", "execution_count": 71, - "id": "helpful-pilot", + "id": "nominated-sister", "metadata": {}, "outputs": [ { @@ -1377,7 +1377,7 @@ }, { "cell_type": "markdown", - "id": "false-thumb", + "id": "aboriginal-audio", "metadata": {}, "source": [ "## Summary\n", @@ -1396,7 +1396,7 @@ }, { "cell_type": "markdown", - "id": "sweet-cartoon", + "id": "protective-hearts", "metadata": {}, "source": [ "## Exercises" @@ -1404,7 +1404,7 @@ }, { "cell_type": "markdown", - "id": "destroyed-trainer", + "id": "meaning-honduras", "metadata": {}, "source": [ "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", @@ -1415,7 +1415,7 @@ { "cell_type": "code", "execution_count": 41, - "id": "olympic-adjustment", + "id": "occasional-phone", "metadata": {}, "outputs": [ { @@ -1437,7 +1437,7 @@ }, { "cell_type": "markdown", - "id": "aquatic-taxation", + "id": "enormous-hacker", "metadata": {}, "source": [ "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." @@ -1446,7 +1446,7 @@ { "cell_type": "code", "execution_count": 42, - "id": "crucial-myanmar", + "id": "atlantic-newman", "metadata": {}, "outputs": [ { @@ -1508,7 +1508,7 @@ }, { "cell_type": "markdown", - "id": "parliamentary-cherry", + "id": "ignored-landscape", "metadata": {}, "source": [ "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", @@ -1535,7 +1535,7 @@ { "cell_type": "code", "execution_count": 72, - "id": "overall-command", + "id": "generic-works", "metadata": {}, "outputs": [], "source": [ @@ -1558,7 +1558,7 @@ { "cell_type": "code", "execution_count": 73, - "id": "forbidden-salem", + "id": "distributed-tampa", "metadata": {}, "outputs": [ { @@ -1607,7 +1607,7 @@ }, { "cell_type": "markdown", - "id": "sensitive-insertion", + "id": "caroline-labor", "metadata": {}, "source": [ "## Opening the hood\n", @@ -1619,7 +1619,7 @@ }, { "cell_type": "markdown", - "id": "rolled-fundamental", + "id": "undefined-harrison", "metadata": {}, "source": [ "The `State` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." @@ -1627,7 +1627,7 @@ }, { "cell_type": "markdown", - "id": "indonesian-wiring", + "id": "august-functionality", "metadata": {}, "source": [ "The `TimeSeries` object is based on the `Series` object defined by a library called Pandas.\n", @@ -1639,7 +1639,7 @@ }, { "cell_type": "markdown", - "id": "embedded-narrative", + "id": "numerical-cliff", "metadata": {}, "source": [ "`Series` objects provide their own `plot` function, but the syntax is different from the other functions we've used, so ModSim provides a function called `plot` just to make it consistent.\n", @@ -1650,7 +1650,7 @@ }, { "cell_type": "markdown", - "id": "tested-appearance", + "id": "overall-novel", "metadata": {}, "source": [ "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", @@ -1661,7 +1661,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "relative-oliver", + "id": "offshore-czech", "metadata": {}, "outputs": [ { @@ -1688,7 +1688,7 @@ }, { "cell_type": "markdown", - "id": "sharp-bottle", + "id": "european-cooling", "metadata": {}, "source": [ "You might not understand everything in this function yet, but you will." @@ -1697,7 +1697,7 @@ { "cell_type": "code", "execution_count": null, - "id": "smooth-causing", + "id": "familiar-future", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap05.ipynb b/jupyter/chap05.ipynb index 00bb7e44..2d73f78a 100644 --- a/jupyter/chap05.ipynb +++ b/jupyter/chap05.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "manual-spirit", + "id": "virtual-fireplace", "metadata": {}, "source": [ "# Chapter 5" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "intimate-lambda", + "id": "valid-islam", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "respected-auditor", + "id": "driven-transcript", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "motivated-cleaner", + "id": "imposed-israel", "metadata": {}, "source": [ "In this chapter..." @@ -60,7 +60,7 @@ }, { "cell_type": "markdown", - "id": "modern-holder", + "id": "handmade-direction", "metadata": {}, "source": [ "# World population\n", @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "lyric-norwegian", + "id": "guilty-kenya", "metadata": {}, "source": [ "## World Population Data\n", @@ -96,7 +96,7 @@ }, { "cell_type": "markdown", - "id": "sharp-study", + "id": "raised-calendar", "metadata": {}, "source": [ "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" @@ -105,7 +105,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "false-future", + "id": "thrown-violence", "metadata": {}, "outputs": [], "source": [ @@ -119,7 +119,7 @@ }, { "cell_type": "markdown", - "id": "tender-ethics", + "id": "representative-canal", "metadata": {}, "source": [ "To read this data, we will use Pandas, which provides functions for\n", @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "rising-trader", + "id": "lined-footage", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "higher-warner", + "id": "amber-batman", "metadata": {}, "source": [ "Now we can use it like this:" @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "emerging-clause", + "id": "authentic-singer", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "recovered-philadelphia", + "id": "julian-intranet", "metadata": {}, "source": [ "The arguments are:\n", @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "judicial-samba", + "id": "recreational-albania", "metadata": {}, "outputs": [], "source": [ @@ -205,7 +205,7 @@ }, { "cell_type": "markdown", - "id": "ethical-proportion", + "id": "postal-breeding", "metadata": {}, "source": [ "This line selects the third table (numbered 2), which contains\n", @@ -217,7 +217,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "superior-colombia", + "id": "conservative-investigation", "metadata": {}, "outputs": [ { @@ -404,7 +404,7 @@ }, { "cell_type": "markdown", - "id": "collectible-chapter", + "id": "adolescent-password", "metadata": {}, "source": [ "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", @@ -416,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "illegal-hollow", + "id": "naughty-macintosh", "metadata": {}, "source": [ "The column labels are long strings, which makes them hard to work with.\n", @@ -426,7 +426,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "interim-trouble", + "id": "suspected-integer", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "intense-mileage", + "id": "about-mistress", "metadata": {}, "source": [ "Now we can select a column from the `DataFrame` using the dot operator,\n", @@ -449,7 +449,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "resident-engineer", + "id": "cleared-protection", "metadata": {}, "outputs": [], "source": [ @@ -458,7 +458,7 @@ }, { "cell_type": "markdown", - "id": "disciplinary-advocacy", + "id": "rational-sweden", "metadata": {}, "source": [ "The result is a Pandas `Series`, which is similar to the `TimeSeries` and `SweepSeries` objects we've been using.\n", @@ -473,7 +473,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "african-calvin", + "id": "portable-knowing", "metadata": {}, "outputs": [ { @@ -499,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "waiting-stack", + "id": "contemporary-telephone", "metadata": {}, "source": [ "The left column is the **index** of the `Series`; in this example it contains the dates.\n", @@ -513,7 +513,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "ruled-hearing", + "id": "revolutionary-prescription", "metadata": {}, "outputs": [ { @@ -540,7 +540,7 @@ }, { "cell_type": "markdown", - "id": "incoming-summit", + "id": "cleared-institution", "metadata": {}, "source": [ "The most recent estimate we have from the U.N. is for 2015, so the value for 2016 is `NaN`.\n", @@ -551,7 +551,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "marine-sudan", + "id": "sharp-woman", "metadata": {}, "outputs": [ { @@ -578,7 +578,7 @@ }, { "cell_type": "markdown", - "id": "czech-fitness", + "id": "detected-evidence", "metadata": {}, "source": [ "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", @@ -591,7 +591,7 @@ }, { "cell_type": "markdown", - "id": "adolescent-graduate", + "id": "afraid-patio", "metadata": {}, "source": [ "## Absolute and relative errors\n", @@ -605,7 +605,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "resident-matthew", + "id": "norwegian-spank", "metadata": {}, "outputs": [], "source": [ @@ -615,7 +615,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "resident-bonus", + "id": "married-account", "metadata": {}, "outputs": [ { @@ -642,7 +642,7 @@ }, { "cell_type": "markdown", - "id": "removed-friendly", + "id": "polyphonic-agency", "metadata": {}, "source": [ "When you subtract two `Series` objects, the result is a new `Series`.\n", @@ -654,7 +654,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "executive-luxury", + "id": "british-dayton", "metadata": {}, "outputs": [ { @@ -676,7 +676,7 @@ }, { "cell_type": "markdown", - "id": "empty-kuwait", + "id": "spectacular-distance", "metadata": {}, "source": [ "On average, the estimates differ by about 0.029 billion.\n", @@ -686,7 +686,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "wicked-paste", + "id": "administrative-store", "metadata": { "scrolled": true }, @@ -710,7 +710,7 @@ }, { "cell_type": "markdown", - "id": "vulnerable-olympus", + "id": "saved-smell", "metadata": {}, "source": [ "In the worst case, they differ by about 0.1 billion.\n", @@ -724,7 +724,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "negative-championship", + "id": "embedded-procurement", "metadata": { "scrolled": true }, @@ -753,7 +753,7 @@ }, { "cell_type": "markdown", - "id": "supposed-canberra", + "id": "geographic-ordering", "metadata": {}, "source": [ "I multiplied by 100 so we can interpret the results as a percentage. In 2015, the difference between the estimates is about 1.4%, and that happens to be the maximum.\n", @@ -764,7 +764,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "statutory-leadership", + "id": "compressed-survivor", "metadata": {}, "outputs": [ { @@ -784,7 +784,7 @@ }, { "cell_type": "markdown", - "id": "fluid-syria", + "id": "statistical-violence", "metadata": {}, "source": [ "The mean relative error is about 0.6%.\n", @@ -797,7 +797,7 @@ }, { "cell_type": "markdown", - "id": "confident-people", + "id": "insured-swing", "metadata": {}, "source": [ "## Modeling Population Growth\n", @@ -819,7 +819,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "afraid-tennessee", + "id": "absent-minimum", "metadata": {}, "outputs": [ { @@ -839,7 +839,7 @@ }, { "cell_type": "markdown", - "id": "trained-canyon", + "id": "cooked-beast", "metadata": {}, "source": [ "So we can get the total growth during the interval like this:" @@ -848,7 +848,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "artistic-suicide", + "id": "historic-buddy", "metadata": {}, "outputs": [], "source": [ @@ -857,7 +857,7 @@ }, { "cell_type": "markdown", - "id": "advisory-mortality", + "id": "sufficient-oracle", "metadata": {}, "source": [ "The numbers in brackets are called **labels**, because they label the\n", @@ -874,7 +874,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "authorized-rough", + "id": "focused-maryland", "metadata": {}, "outputs": [ { @@ -895,7 +895,7 @@ }, { "cell_type": "markdown", - "id": "concerned-belgium", + "id": "special-fireplace", "metadata": {}, "source": [ "So `t_0` is the label of the first element, which is 1950.\n", @@ -905,7 +905,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "forced-trunk", + "id": "employed-commission", "metadata": {}, "outputs": [ { @@ -926,7 +926,7 @@ }, { "cell_type": "markdown", - "id": "driving-humor", + "id": "supreme-finder", "metadata": {}, "source": [ "The value `-1` indicates the last element; `-2` indicates the second to last element, and so on.\n", @@ -937,7 +937,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "vocal-weather", + "id": "critical-carrier", "metadata": {}, "outputs": [ { @@ -958,7 +958,7 @@ }, { "cell_type": "markdown", - "id": "accurate-interaction", + "id": "difficult-banks", "metadata": {}, "source": [ "Now we can use `t_0` and `t_end` to select the population at the beginning and end of the interval." @@ -967,7 +967,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "finnish-sentence", + "id": "executive-pressure", "metadata": {}, "outputs": [], "source": [ @@ -977,7 +977,7 @@ }, { "cell_type": "markdown", - "id": "looking-board", + "id": "unnecessary-pontiac", "metadata": {}, "source": [ "And compute the total growth during the interval." @@ -986,7 +986,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "viral-indian", + "id": "classical-proportion", "metadata": {}, "outputs": [ { @@ -1007,7 +1007,7 @@ }, { "cell_type": "markdown", - "id": "active-pierce", + "id": "acknowledged-tenant", "metadata": {}, "source": [ "Finally, we can compute average annual growth." @@ -1016,7 +1016,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "vietnamese-adrian", + "id": "double-short", "metadata": {}, "outputs": [ { @@ -1037,7 +1037,7 @@ }, { "cell_type": "markdown", - "id": "occupied-indiana", + "id": "compound-linux", "metadata": {}, "source": [ "From 1950 to 2016, world population grew by about 0.07 billion people per year, on average.\n", @@ -1046,7 +1046,7 @@ }, { "cell_type": "markdown", - "id": "underlying-oliver", + "id": "moved-spotlight", "metadata": {}, "source": [ "## Simulation\n", @@ -1059,7 +1059,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "opposed-above", + "id": "imperial-gardening", "metadata": {}, "outputs": [], "source": [ @@ -1070,7 +1070,7 @@ }, { "cell_type": "markdown", - "id": "motivated-point", + "id": "virgin-network", "metadata": {}, "source": [ "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", @@ -1082,7 +1082,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "architectural-techno", + "id": "suburban-deficit", "metadata": {}, "outputs": [], "source": [ @@ -1091,7 +1091,7 @@ }, { "cell_type": "markdown", - "id": "absent-anthony", + "id": "checked-neutral", "metadata": {}, "source": [ "Here's what it looks like so far." @@ -1100,7 +1100,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "every-arkansas", + "id": "defensive-fifty", "metadata": {}, "outputs": [ { @@ -1159,7 +1159,7 @@ }, { "cell_type": "markdown", - "id": "diagnostic-testimony", + "id": "economic-profession", "metadata": {}, "source": [ "Now we set the rest of the values by simulating annual growth:" @@ -1168,7 +1168,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "dedicated-system", + "id": "upset-amsterdam", "metadata": {}, "outputs": [], "source": [ @@ -1178,7 +1178,7 @@ }, { "cell_type": "markdown", - "id": "classical-uncertainty", + "id": "underlying-biology", "metadata": {}, "source": [ "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", @@ -1193,7 +1193,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "trained-canvas", + "id": "experimental-investigation", "metadata": {}, "outputs": [ { @@ -1223,17 +1223,17 @@ }, { "cell_type": "markdown", - "id": "opening-fabric", + "id": "younger-abuse", "metadata": {}, "source": [ - "The keyword argument `color='gray'` specifies the color of the line.\n", + "The keyword argument `color='gray'` specifies the color of the line. For details on color specification see .\n", "\n", - "From 1950 to 1990, the model does not fit the data particularly well; after that, it's pretty good." + "From 1950 to 1990, the model does not fit the data particularly well, but after that, it's pretty good." ] }, { "cell_type": "markdown", - "id": "portuguese-party", + "id": "similar-characterization", "metadata": {}, "source": [ "## Summary\n", @@ -1255,7 +1255,7 @@ }, { "cell_type": "markdown", - "id": "terminal-house", + "id": "equivalent-louis", "metadata": {}, "source": [ "## Exercises" @@ -1263,7 +1263,7 @@ }, { "cell_type": "markdown", - "id": "gross-puzzle", + "id": "excessive-cream", "metadata": {}, "source": [ "Here's the code from this chapter all in one place." @@ -1272,7 +1272,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "binding-monitoring", + "id": "foreign-support", "metadata": {}, "outputs": [], "source": [ @@ -1296,7 +1296,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "another-concentration", + "id": "inner-harvest", "metadata": {}, "outputs": [ { @@ -1324,7 +1324,7 @@ }, { "cell_type": "markdown", - "id": "fiscal-edwards", + "id": "narrative-state", "metadata": {}, "source": [ "**Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", @@ -1339,7 +1339,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "spanish-number", + "id": "happy-empire", "metadata": {}, "outputs": [ { @@ -1373,7 +1373,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "optimum-material", + "id": "tutorial-fundamentals", "metadata": {}, "outputs": [], "source": [ @@ -1389,7 +1389,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "formal-shade", + "id": "beautiful-harvest", "metadata": {}, "outputs": [ { @@ -1420,7 +1420,7 @@ { "cell_type": "code", "execution_count": null, - "id": "close-villa", + "id": "liberal-escape", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap06.ipynb b/jupyter/chap06.ipynb new file mode 100644 index 00000000..b049a5c5 --- /dev/null +++ b/jupyter/chap06.ipynb @@ -0,0 +1,783 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "plain-cincinnati", + "metadata": {}, + "source": [ + "# Chapter 6" + ] + }, + { + "cell_type": "markdown", + "id": "corrected-chart", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "operational-landscape", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "statutory-baking", + "metadata": {}, + "source": [ + "In the previous chapter we simulated a model of world population with\n", + "constant growth. In this chapter we see if we can make a better model\n", + "with growth proportional to the population.\n", + "\n", + "But first, we'll improve the code from the previous chapter by\n", + "encapsulating it in a function and using `System` objects." + ] + }, + { + "cell_type": "markdown", + "id": "handled-seating", + "metadata": {}, + "source": [ + "Here's the code that reads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "lovely-blake", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "alleged-manufacturer", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "negative-shakespeare", + "metadata": {}, + "source": [ + "## System objects\n", + "\n", + "Like a `State` object, a `System` object contains variables and their\n", + "values. The difference is:\n", + "\n", + "- `State` objects contain state variables that get updated in the course of a simulation.\n", + "\n", + "- `System` objects contain **system parameters**, which usually don't get updated over the course of a simulation.\n", + "\n", + "For example, in the bike share model, state variables include the number of bikes at each location, which get updated whenever a customer moves a bike. System parameters include the number of locations, total number of bikes, and arrival rates at each location.\n", + "\n", + "In the population model, the only state variable is the population.\n", + "System parameters include the annual growth rate, the initial time and\n", + "population, and the end time.\n", + "\n", + "Suppose we have the following variables, as computed in the previous\n", + "chapter (assuming `table2` is the `DataFrame` we read from the file):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "complimentary-drain", + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9\n", + "\n", + "t_0 = census.index[0]\n", + "t_end = census.index[-1]\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = census[t_0]\n", + "p_end = census[t_end]\n", + "\n", + "total_growth = p_end - p_0\n", + "annual_growth = total_growth / elapsed_time" + ] + }, + { + "cell_type": "markdown", + "id": "exotic-proportion", + "metadata": {}, + "source": [ + "Some of these are parameters we need to simulate the system; others are temporary values we can discard. \n", + "To distinguish between them, we'll put the parameters we need into a `System` object like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "european-southeast", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " annual_growth=annual_growth)" + ] + }, + { + "cell_type": "markdown", + "id": "innocent-chapter", + "metadata": {}, + "source": [ + "`t0` and `t_end` are the first and last years; `p_0` is the initial\n", + "population, and `annual_growth` is the estimated annual growth.\n", + "\n", + "Here's what `system` looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "corresponding-chapter", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
System
t_01950.0
t_end2016.0
p_02.557629
annual_growth0.072248
\n", + "
" + ], + "text/plain": [ + "namespace(t_0=1950,\n", + " t_end=2016,\n", + " p_0=2.557628654,\n", + " annual_growth=0.07224800083333333)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system" + ] + }, + { + "cell_type": "markdown", + "id": "modified-observation", + "metadata": {}, + "source": [ + "Next we'll wrap the code from the previous chapter in a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "patient-adobe", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "def run_simulation1(system):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " results[t+1] = results[t] + system.annual_growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "realistic-switzerland", + "metadata": {}, + "source": [ + "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", + "\n", + "Inside the loop, it stores the results in a `TimeSeries` which it returns at the end.\n", + "\n", + "The following function plots the results along with the estimates\n", + "`census` and `un`:" + ] + }, + { + "cell_type": "markdown", + "id": "durable-convertible", + "metadata": {}, + "source": [ + "\n", + "\n", + "Here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "critical-cooper", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation1(system)" + ] + }, + { + "cell_type": "markdown", + "id": "under-dealing", + "metadata": {}, + "source": [ + "Here's the code we used in the previous chapter to plot the results, wrapped in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "sublime-desperate", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import plot, decorate\n", + "\n", + "def plot_results(results, title):\n", + " plot(census, style=':', label='US Census')\n", + " plot(un, style='--', label='UN DESA')\n", + " plot(results, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ] + }, + { + "cell_type": "markdown", + "id": "worst-muslim", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "announced-appendix", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABJu0lEQVR4nO3dd3zV1fnA8c+TvclmhhHCDCPsFTYEFBFkCm6r1r212l/rqFXbauuo1oqto6IIbtRqQhZ7SCDsvcMMCQnZ657fH/dCA0JyCbnJTXjer9d9cb/r3OfcaJ6c8z3fc8QYg1JKKeVsXOo7AKWUUupCNEEppZRySpqglFJKOSVNUEoppZySJiillFJOSROUUkopp6QJSqlGTESeE5G59R0HgIikisgddp5rRCTK0TEp56YJStU5EZktImtFJF9EjorIjyIS68DPGyEiGbVY3q0isqy2yqsttV1PpeqbJihVp0TkUeB14CWgKdAa+AcwqR7Dqlci4lbfMSjljDRBqTojIk2APwD3GWO+MsYUGGPKjDHfGWOesJ3jKSKvi8gR2+t1EfG0HRshIhki8piInLC1vm6rVP7VIrJVRPJE5LCIPC4ivsCPQAtbiy1fRFqISH8RWSkiObZy3hIRj0plGRG5W0R2icgpEXlbrLoA/wQG2crKuUhd24nIElssibbr59qOtbWV/ysROQgki4iLiPxORA7Y6vYf2/eFiHwkIo/Z3re0XXuvbTtKRLIvVk9bOB628vJEZIuI9K3iZ2RE5F5bvfNE5AURaW/7rk6LyILzvqc7RWS3LYaFlT4TERkrIttFJFdE3gLkvM+6XUS22b7feBFpU9V/P+oKZIzRl77q5AWMB8oBtyrO+QOwCggHwoAVwAu2YyNs1/8BcAeuBgqBINvxo8BQ2/sgoHel6zLO+5w+wEDADWgLbAMernTcAN8DgVhbeZnAeNuxW4Fl1dR1JfAq4AHEAqeBubZjbW3l/wfwBbyB24HdQCTgB3wFfGw7/3bgO9v72cAeYH6lY99WUc/ngGLbd+UKvAysqiJuAywEAoBooARIssXVBNgK3GI7dxRwEugNeAJ/B5bYjoXa6jzN9rN6xPazu8N2fLKtvl1sP4PfASvOiyOqvv+b1Vf9vuo9AH1dOS/gBuBYNefsAa6utD0O2G97PwIoolKCA04AA23vDwK/BgLOK/MXv7gv8LkPA19X2jZAbKXtBcBTtvdVJihbQisHfCrtm3uBBBVZ6XgScG+l7U5Ame2Xd3sgB2uPxz9tdcywnfcR8OjF6mlLUImVtrsCRVXEboAhlbbTgN9U2v4r8Lrt/b+Bv1Q65meLuS1wM5USIdbWU0alBPUj8KtKx12w/rHRplIcmqCu8Jd28am6lAWEVnPPpQVwoNL2Adu+s2UYY8orbRdi/cUIMBVrS+GAiCwWkUEX+xAR6Sgi34vIMRE5jfWeWOh5px27yOdUpwWQbYwprLTv0AXOq7zvQvV2A5oaY/YA+UAMMBRry+6IiHQChgOLq4nn/Hp4VfMzOF7pfdEFts98D+fEbIzJx/ozbmk7dqjSMcO59W0DvGHrYs0BsrEmsZbV1EVdQTRBqbq0Emt30+QqzjmC9ZfXGa1t+6pljPnZGDMJa/fgN1hbPWD9a/x87wDbgQ7GmADgt5x3j6Sqj6rm+FEgWER8Ku2LqKacC9W7nP8lh8VYu8s8jDGHbds3Y+3KTLczrtp2Tsy2+2AhwGGs30FEpWPCud/BIeDXxpjASi9vY8yKugldNQSaoFSdMcbkAs8Ab4vIZBHxERF3EblKRP5iO20e8DsRCRORUNv51T7HIyIeInKDiDQxxpRhvf9RYTt8HAg5M+jAxt92Tr6IdAbuuYSqHAdaVR4scF49DwBrgedscQ0CJlZT5jzgEdvgCj+sLbr5lVqLi4H7gSW27VTgAaxdjVXV05E+BW4TkRixDmR5CVhtjNkP/ABEi8gUW2vtQaBZpWv/CTwtItFgHUAjItPrKG7VQGiCUnXKGPM34FGsN8Uzsf4lfT/WFg/AH7H+ct8IbALW2fbZ4yZgv63L7m7gRttnbseaAPbaupRaAI9jHXCQB7wHzL+EaiQDW4BjInLyIufcAAzC2uX1R1v5JVWU+T7wMdYEtA9rS/OBSscXY02qZxLUMsCn0vbF6ukwxpgk4PfAl1hbTO2B623HTgLTgT9h/Q46AMsrXfs18GfgM9vPazNwlSPjVQ2PWLuGlVKOJCLzge3GmGfrOxalGgptQSnlACLSz/b8kIuIjMf6IPI39RyWUg2KPsGulGM0w/osUwjW4dX3GGPW129ISjUs2sWnlFLKKWkXn1JKKafkVF18oaGhpm3btvUdhlJKqTqUlpZ20hgTdv5+p0pQbdu2Ze3atfUdhlJKqTokIgcutF+7+JRSSjklTVBKKaWckiYopZRSTsmp7kFdSFlZGRkZGRQXF9d3KI2Sl5cXrVq1wt3dvb5DUUqpczh9gsrIyMDf35+2bdtinRBZ1RZjDFlZWWRkZNCuXbv6Dkcppc7h9F18xcXFhISEaHJyABEhJCREW6dKKafk9AkK0OTkQPrdKqWcVYNIUEoppepRaUG9fKwmqGrs37+fbt26nbPvueee49VXXwVg1apVDBgwgJiYGLp06cJzzz13wXLWrFnDsGHD6NSpE507d+aOO+6gsLDwgucqpZRT2bgAcjPO2XXy5EnWrVvn0I91+kESzu6WW25hwYIF9OzZk4qKCnbs2PGLc44fP8706dP57LPPGDRoEMYYvvzyS/Ly8vDx8blAqUopVc/KSyF7L4R3hj63QlkRAHn5BSxbuoS1a9fi6elJdHQ0np6eDglBW1CX6cSJEzRv3hwAV1dXunbt+otz3n77bW655RYGDRoEWO/7TJs2jaZNm1JQUMDtt99Ov3796NWrF99++y0AH374IVOmTGH8+PF06NCBJ598EoCKigpuvfVWunXrRvfu3XnttdcAGDFixNlpok6ePMmZOQ23bNlC//79iYmJoUePHuzatcuh34dSqhEoyIKPJ8OHV0NRDohQ4erJ94lL+PNfX2fNzz/Tq1cv7rvvPoclJ2iACWrmuyv5fO0hAMoqLMx8dyVfr7c2PYtKK5j57kq+23AEgNPFZcx8dyU/bT4KQHZBKTPfXUni1uMAnMi7/NFrjzzyCJ06deK6667j3XffveCIuM2bN9OnT58LXv/iiy8yatQofv75Z1JSUnjiiScoKLD296anpzN//nw2bdrE/PnzOXToEOnp6Rw+fJjNmzezadMmbrvttirj++c//8lDDz1Eeno6a9eupVWrVpddZ6VUI3Z8K7w3Ag6nwVV/wXg1Yfv27bzzzjukLU+hzLMJQydezzXXXIOvr69DQ9EuvmpcbJTbmf3PPPMMN9xwAwkJCXz66afMmzeP1NRUu8tPSEhg4cKFZ+9pFRcXc/DgQQBGjx5NkyZNAOjatSsHDhwgOjqavXv38sADDzBhwgTi4uKqLH/QoEG8+OKLZGRkMGXKFDp06GB3bEqpK4gxsOY9SHwOPP3htv9y3K0V/3n7PQqzjhISEsKsWbPo0KFDnY3+bXAJav6vB5197+7qcs62t4frOdsBXu7nbAf7epyzHe7vVe3nhYSEcOrUqXP2ZWdnn/Nga/v27bnnnnu48847CQsLIysri5CQkLPHo6OjSUtLY9KkSb8o/8z9qE6dOp2zf/Xq1ec0nV1dXSkvLycoKIgNGzYQHx/P22+/zYIFC3j//fdxc3PDYrEAnNOKmz17NgMGDOCHH35g3Lhx/Otf/2LUqFHV1lspdYURgUOroPUA8se8Qsrabaxf/wMubh5kB3XlgVsmEmzH78za1OC6+Oqan58fzZs3JykpCbAmp59++onY2FgAfvjhB86sSrxr1y5cXV0JDAw8p4z777+fjz76iNWrV5/dN3fuXI4dO8a4ceP4+9//fraM9eurXhX85MmTWCwWpk6dygsvvHB2FE3btm1JS0sD4Isvvjh7/t69e4mMjOTBBx/k2muvZePGjZfxbSilGpXyEkh5GU5ss25OeIOUiEd49V/zWbd+Pf379+fRhx/k9Qem1XlyggbYgqoP//nPf7jvvvt47LHHAHj22Wdp3749AB9//DGPPPIIPj4+uLm58cknn+Dq6nrO9U2bNuWzzz7j8ccf58SJE7i4uDBs2DCmTJnC73//ex5++GF69OiBMYa2bdvy/fffXzSWw4cPc9ttt51tLb388ssAPP7448yYMYOPP/74nBbS/PnzmTt3Lu7u7jRr1oxnnnmmVr8bpVQDdXA1LHwATu7AuLix5UQFiYmJ5Obmku8ZRuvuAxk/vne9hihn/nJ3Bn379jXnL1i4bds2unTpUk8RXRn0O1bqClKSB4nPw8//giYRHB74B77ZcJKTx48QFhbO+PHjaNO2Ha4udTfLjIikGWP6nr9fW1BKKXUlWf1P+Plf5MbcQ1J5LzYlbMTT24cN0p5nJlxNZJvg+o7wLE1QSinV2OVnQt4RaN6T0j53sfxUS5Zu2osxO4iNjSU2Nhbj4oaXu2v1ZdUhTVBKKdVYGQMbPoP4pzE+YWyInUNScjL5+fmU+Ldkr0c7fj9yFC512J13KRyWoESkEzC/0q5I4BljzOuO+kyllFI2pw7A94/AniQOhI3hR4ZxfOFCwps1Z8aMGQSGNcPHw81pkxM4MEEZY3YAMQAi4gocBr521OcppZSyOb4F/jWWbAJY1Oxpth8vwdevghUVkcyMHkJERER9R2iXuuriGw3sMcYcqKPPU0qpK09pAXj4UuzfjiXhd7H6mCvmZAUjR45k0KBBzC4op0Wgd31Habe6elD3emDehQ6IyF0islZE1mZmZtZROParbrmNW2+9lZYtW1JSUgKcO1Hr+VxdXYmJiSE6OpqePXvyt7/97ezzTKmpqTRp0oSYmJizr8TERMA6X190dDQ9evQgJibmnAd+y8vLCQ0N5emnn67tqiulGoryEkh+EcvrMfy8LJm/v/02K48ILiFt+LqkGx179sfd3b1BJSeogxaUiHgA1wIX/A1qjJkDzAHrc1COjscRXF1def/997nnnnuqPM/b25v09HTAOgv67Nmzyc3N5fnnnwdg6NChv3hId+XKlXz//fesW7cOT09PTp48SWlp6dnjCQkJdOrUiQULFvDSSy/pCrlKXWkOrITvHmT3yVISvGaSmbSU0OYtufHGGwkMCefm/BKaNan7WSBqQ120oK4C1hljjtfBZ9WLhx9+mNdee43y8nK7rwkPD2fOnDm89dZbVPWw9NGjRwkNDT07L19oaCgtWrQ4e3zevHk89NBDtG7dmlWrVtW8EkqphsVSAT88RuYHs/kkpy+fyBTKfMJJc+3MBs+eNG/eHG8PVyKCG+6ac3VxD2oWF+neq5EPJvxyX/Rk6H8nlBbCJ9N/eTxmNvS6wbrGyYKbzz122w+XHVLr1q2JjY3l448/ZuLEiXZfFxkZicVi4cSJEwAsXbqUmJiYs8e//PJL4uLi+MMf/kDHjh0ZM2YMM2fOZPjw4QAUFRWRlJTEu+++S05ODvPmzTu75pRSqnErLC4hZa8LaXILLuLB2LEjGDBgAKOP5dMu1LHLYNQVh7agRMQHGAt85cjPcaTqlts447e//S2vvPLK2XtK9qrceho6dCjp6elnX+3bt8fPz4+0tDTmzJlDWFgYM2fO5MMPPwTg+++/Z+TIkfj4+DB16lS+/vprKioqLq2CSqmGI+8Y5QtuZ0XC17z55puknfInLDKaj/O6UhzcHldXV7q1bIKvZ+N4xNWhtTDGFAIh1Z54Kapq8Xj4VH3cN+SSW0z2LLcBEBUVRUxMDAsWLLC77L179+Lq6kp4eDjbtm276Hmurq6MGDGCESNG0L17dz766CNuvfVW5s2bx/Lly88OysjKyiIlJYUxY8bYX0GllPMzBpP2Edvj/82i8n6cYiNhLdswfdIEQkJC6bTzBCM7hdd3lLVOl9uoRnXLbVT2f//3f2dH91UnMzOTu+++m/vvv7/KgQ07duw4Z5n29PR02rRpw+nTp1m2bBkHDx5k//797N+/n7fffpt582qvN1Up5QRO7uLonBl89P0yFpSPwS24NfsDe/N5TltCQkJxcRFGdW7aKAdINY52oINVtdxGZdHR0fTu3fvsGk3nKyoqIiYmhrKyMtzc3Ljpppt49NFHzx4//x7U7373O9q1a8cDDzxATk4Obm5uREVFMWfOHL766itGjRp1zqKGkyZN4sknn6SkpOSc/UqphikvL4/kzz8l/UQ07m4ujB09joED+jHyeD5+ns49C0Rt0OU2lH7HSjmZsn0rWbFpD8s3H6SiooJ2UR35wwYvXpreh2l9WtV3eLVOl9tQSiknZ4py2fT5yyTtLee0+BMWEcn1kycQHBxM99gcerRqUt8h1ilNUEop5QQOLZ1HfOoKDltCae5rITO4D+8ccOcmH38AekYE1m+A9UATlFJK1aOcnBwSv57LloNZ+IkfYwdGMyhuKkdyi7mhsBR/L/f6DrHeaIJSSql6UFJUyLJF37Fy4y5EhEFRQTy9sy0nC9oyWISWgd60bGBz59U2TVBKKVWHLBYL6Yu/J3nZagosHkS2j+TaidfSpEkTyjcdpW/boPoO0WloglJKqTqyb8dW4hfO53ihCxEuOfTo2Jm7NwbRc4ShRxO4unvz+g7RqWiCqkNt27Zl7dq1hIaGXtY5SqmGJSsri0U//cCO3ftoYvK4trUQc/0L5Lv481izA3Rs6l/fITolTVBKKeUgRUVFLE5O4ud163Fzc2NUG2FpUTQvl3ZlvncQ/iLcNzKqvsN0WpqgqrF//37Gjx9PbGwsq1atomfPntx22208++yznDhxgk8++YSoqChuv/129u7di4+PD3PmzKFHjx5kZWUxa9YsMjMz6d+//zkTw86dO5c333yT0tJSBgwYwD/+8Q9cXV3rsaZKqdpSUVHB2p/XsDh5EcVlFfToFMnoCVPw9/cnO/0wXZxoggRn1qAS1E8//cSxY8dqtcxmzZoxfvz4Ks/ZvXs3n3/+OXPmzKFfv358+umnLFu2jIULF/LSSy8RERFBr169+Oabb0hOTubmm28mPT2d559/ntjYWJ555hl++OEH5syZA1hnbpg/fz7Lly/H3d2de++9l08++YSbb765yjiUUs7NGMOuXbtI+O9CsnILaGcOMKxZIY/s6YTn/nyu6u7PpJiW9R1mg9GgElR9adeuHd27dwes8+2NHj0aEaF79+7s37+fAwcO8OWXXwIwatQosrKyyM3NZcmSJXz1lXWlkQkTJhAUZB2dk5SURFpaGv369QOs3QDh4Y1vJmKlriTHjx8nISGBvXv3EkI213tupOOE+6noMpm2X25qcMutO4MGlaCqa+k4SuWJV11cXM5uu7i4UF5ejpvbL7/GMzMLX2iGYWMMt9xyCy+//LKDIlZK1ZWCggKSk5NZv349np6ejI8UmpQV83Tuk3zaOQ4vN1demxlT32E2SLrcRi0YNmwYn3zyCQCpqamEhoYSEBBwzv4ff/zx7LpSo0eP5osvvji7km52djYHDhyon+CVUjVSXl7O8uXLefONN0hfl0b/js144IEHGHDj78ka9iLNw5tSXKYLiF6OBtWCclbPPfcct912Gz169MDHx4ePPvoIsC7LMWvWLHr37s3w4cNp3bo1AF27duWPf/wjcXFxWCwW3N3defvtt2nTpk19VkMpZQdjDFu3biUxcRE5Obl0ZB9j3H/m+1O3MHftUe4a1p4hUaEMidJHRS6XLreh9DtWyk6HDx8mISGBgwcPEu6Sy7iKRUR26w/jXuS+hUeIiQjkzmGR9R1mg6PLbSilVA2dPn2apKQkNm7ciK+vL9d0D6bL/m951fUe7h3/K0L9PHlrduNc1bY+VZmgRGQQcCMwFGgOFAGbgR+AucaYXIdHqJRS9aS0tJTly5ezYsUKTEU5Q6ICGTrtbjzd3dl9fBYpn2xmck4RoX6empwc4KIJSkR+BI4A3wIvAicAL6AjMBL4VkT+ZoxZ6OggjTH6w3cQZ+riVcpZGGPYuHEjSUlJ5OXlEe1xhNFl/yWrYASvp+zjN+M7E9U8lKRHhzf6ZdfrU1UtqJuMMSfP25cPrLO9/ioiDr8L6OXlRVZWFiEhIZqkapkxhqysLLy8vOo7FKWcxoEDB0hISODIkSO08C5lmvmK1t5uMGUOr2+P4MDR01RYDK4uosnJwS6aoC6QnGp0zuVq1aoVGRkZZGZmOvqjrkheXl60atWqvsNQqt6dOnWKxMREtm7dSkBAANcN6US3FQ+QHDaLkkm/o0OrcP6vvQV3V9E/lutItYMkRGQK8GcgHBDbyxhjAhwcGwDu7u60a9euLj5KKXUFKi4uZunSpaxevRoXgRFR/gyecT/u7u6c6j6Yp97byZNHS+jQCjzc9NHRumTPKL6/ABONMdscHYxSStUVi8XCunXrSElJobCwkJigQkZlf4zHsRBe+XEkT0+MIahpa5Y82QIfDx3wXB/s+daPa3JSSjUme/bsIT4+nszMTNoEeTCu9Bua5xyC2Af40G0a3608xh0jSwj399LkVI/s+ebXish84Bug5MxOY8xXjgpKKaUcITMzk4SEBHbv3k1QUBDTxw+l80/TORbcl3WD36V3n/7cUGFh+qBO+HpqYqpv9vwEAoBCIK7SPgNoglJKNQiFhYWkpqaydu1aPNzdGds5gP5T78XNzY3SiFRmz81k0AEvevcBd1cX3F31XpMzqDZBGWNuq4tAlFKqtlVUVLBmzRqWLFlCSUkJfVp5MeLYv/DZkc2//9uTWyaMwKNFdz6/p4RQP4/6Dledx55RfK2AvwNDsLaclgEPGWMyHBybUkrViDGGHTt2sGjRIrKzs2nfIoS44mTCD66C9qNY2uEJ/rQwhx7dc+jfLpgwf8/qC1V1zp4uvg+AT4Hptu0bbfvGOioopZSqqWPHjhEfH8/+/fsJDQ1l9owpdFg4kVIXb9YPfJNe424mFkjpWEREsE99h6uqYE+CCjPGfFBp+0MRedhB8SilVI3k5eWRnJxMeno63t7eXNUjnL4T78TFzQ38PueuHwo4tt2F/8aBi4tocmoA7ElQJ0XkRmCebXsWkGVP4SISCPwL6Ia1e/B2Y8zKGsSplFIXVFZWxsqVK1m2bBkVFRUM6tqaYcffx2vDRha7+REz5nqaRPTjpeuLCPB21+mJGhB7EtTtwFvAa1iTzArbPnu8AfxkjJkmIh6A/smilKoVxhi2bNlCYmIiubm5dI5qy1hWELzlVWjSmoxx73HrQh+eCc7gtiHtaBHoXd8hq0tkzyi+g8C1l1qwiAQAw4BbbeWUAqWXWo5SSp0vIyOD+Ph4MjIyaNasGZMnTaJtwi2YE9vZ1eVeOlz3e1p5+LAwIpduLetkVjblAFUtt/GkMeYvIvJ3rC2ncxhjHqym7EggE/hARHoCaVhH/xWc9zl3AXcBZ5dEV0qpC8nNzSUxMZHNmzfj5+fHtYM703Po1bh4+cOE13hteSbvbYaVE90I9IDurZrUd8jqMlx0yXcRmWiM+U5EbrnQcWPMR1UWLNIXWAUMMcasFpE3gNPGmN9f7JoLLfmulFKlpaUsW7aMlSutt7AH9elObO43eGz7kiN9f0PF4IeJCPYhK7+E7IJSOjT1r+eI1aW45CXfjTHf2f6tMhFVIQPIMMastm1/ATxVw7KUUlcgi8XChg0bSE5OJj8/n27RXRkTlEGTVXeDqaAk9jdcs7Q7Iwt38dcZPQnx8yTET59paiyq6uL7jgt07Z1hjKnyvpQx5piIHBKRTsaYHcBoYGuNI1VKXVH2799PfHw8x44do1WrVsycOZNWaS/D0rlktRpDyNS/4hnUlrfbZel9pkaqqkESr9ZC+Q8An9hG8O0FdNokpVSVsrOzWbRoEdu3b6dJkyZMvXo00Z07IP5NweMBUl0GcuvyYL7Ka0LvIBjUPqS+Q1YOUlUX3+LLLdwYkw78ol9RKaXOV1xczOLFi1mzZg1ubm6MGjGCgW5bcU+cRen+cRwe+QbtwjszcHwH/t76OL0iAus7ZOVgVXXxbaLqLr4eDolIKXVFqaioIC0tjdTUVIqKiujVqxejOgXjl/IUHNuEaT+aB4/EcejTdXz/QCxe7q5M7NmivsNWdaCqLr5r6iwKpdQVadeuXSQkJHDy5EnatWtHXFwczY4lw7ybKfdthsu0j3CJnsTNe7Lw83JDRGeBuJJU1cV3oC4DUUpdOU6cOEFCQgJ79uwhODiY62fOpGPrpohPEPiN5WTMvYxd25ffFPbmehEGR4XWd8iqHlTVxbfMGBMrInlYu/qk8r/GGB02o5S6JAUFBaSkpLBu3To8PT0ZN24c/SKDcf3pCVhWQO7sH2jiF0bIpBe5zX83ozqH13fIqh5d9EHd+qAP6irVOJWXl59dOLC0tJR+/foxfMggfNa/B0teATdPFre+h9/s70vCYyMJ8HKv75BVHbrkB3XPu7g3EIttwUJjzPpajk8p1QgZY9i2bRuJiYmcOnWKDh06MHbsWMJc8+HjcZC5HUuXybhc/WeCcr2YFHwUdxddbl1Z2bOi7jNYFyv8yrbrQxH53BjzR4dGppRq0I4cOUJCQgIHDhwgPDycG2+8kfaRkSACZX5YfMN5zczGEjiOJ/yb0cMferQKrO+wlROxpwU1C+hljCkGEJE/AesATVBKqV/Iy8sjKSmJDRs24OPjw4QJE+jduzcuO36AD+6DG78ED19cbv2O099upkMTXQZDXZg9CWo/4AUU27Y9gT2OCkgp1TCVlZWxYsUKli9fjsViYfDgwQwdOhSvshz4/GbY9h3FodE8Miee384eT0SwD89P6lbfYSsnVtUovjPLbJQAW0RkkW17LLCsbsJTSjk7YwwbN24kKSmJvLw8unbtypgxYwgKDIT1H0PC76C8BMY8R3aXX7Hjw3UczS3WJddVtapqQZ0ZTpcGfF1pf6rDolFKNSgHDx4kPj6eI0eO0KJFC6ZNm/a/dd0sFkj/lFP+nZjX7HHujR1HCyDxkeG67LqyS1UP6tZ0mQ2lVCN36tQpEhMT2bp1K/7+/kyePJkePXogxgKr/gnR14F/U7j+Uz5cdoL4rSe4uaQcP083TU7KbtUttzEH+MkYU3besUisS7nvN8a879AIlVJOo6SkhKVLl7Jq1SpcXFwYPnw4gwcPxsPDAzJ3wrf3QcYa0vYcwWXoI/RqHcx9owK5f3RH3F11+Li6NFV18d0JPAq8LiLZWJdv9wLaAbuBt4wx3zo+RKVUfbNYLKxfv56UlBQKCgro2bMno0aNIiAgACrKYenfIPVP4OFD8cR/ct9PYYzzO0yv1kF4uGliUjVTVRffMeBJ4EkRaQs0B4qAncaYwroJTylV3/bu3Ut8fDwnTpwgIiKCWbNm0bJly/+dkPoyLH2VjGZjaDH7bbwCmvF1VBHNArzqL2jVKNg1k4QxZj/W4eZKqSvEyZMnWbRoETt37iQwMJDp06fTpUsX64ziFeVQdAr8wmDgPaSVtmLq4nD+c8yVYQHQXJ9tUrXArgSllLpyFBYWsnjxYtauXYubmxtjxoxhwIABuLnZfl1k7oRv7sFiLOyY8BVdWobSe/ytfN7lFP3aBtdv8KpR0QSllAKsCwf+/PPPLF68mJKSEnr37s3IkSPx9fW1nmCpgFXvQPIL4O7NB03u490P1rLkN6PwcnfV5KRqnSYopa5wxhh27txJQkIC2dnZtG/fnri4OMLDKy11kXccvrgNDiynosNVuF77BoPyvOlUUIqXu2v9Ba8aNXsmix0CPAe0sZ1/Zj2oSMeGppRytGPHjpGQkMC+ffsICQlh9uzZREVF/XLlWk9/KkqLeMXzISR4Fr/xb0pX//qJWV057GlB/Rt4BOuMEhWODUcpVRfy8/NJTk5m/fr1eHt7M378ePr27Yura6XWUP4JSP0TljHP4+Llj+tdybgv2smg9iH1F7i6otiToHKNMT86PBKllMOVl5ezatUqli5dSnl5OQMGDGD48OF4e5836m7b9/Ddg1hK8nhiSxsevvNOIoJ9eCyuU/0Erq5I9iSoFBF5Bet6UCVndhpj1jksKqVUrTLGsHXrVhITE8nJyaFTp06MHTuWkJDzWkOlBfDT07DuI2jWg5Nj32RffCEFpeX1E7i6otmToAbY/q28HK8BRtV+OEqp2nb48GHi4+M5dOgQTZs25eabb6Zdu3YXPvn7RzEb57Oi6U0MueNvhLt58NW9dRuvUmdUm6CMMSPrIhClVO3Kzc0lKSmJTZs24evry8SJE4mJicHl/CXVLRVQVgie/jDiKb6oGM6HRyOYX+GCn47zVfXInlF8TYBngWG2XYuBPxhjch0ZmFKqZkpLS1m2bBkrV67EGENsbCyxsbF4enr+8uTcw/D1r8ku8+Dw+PfpHtGOyVPaMMmgc+ipemfP30fvA5uBGbbtm4APgCmOCkopdemMMaSnp5OcnEx+fj7dunVj9OjRBAYGXviCrQth4QOYijLeMbeyL2kX/7q1n846rpyGPQmqvTFmaqXt50Uk3UHxKKVqYP/+/cTHx3Ps2DFatmzJjBkziIiIuPDJpQUQ/1tI+xDTohcy9d9MLw8nIkhXuFXOxZ4EVSQiscaYZXD2wd0ix4allLJHdnY2iYmJbNu2jYCAAKZMmUK3bt1++aBtZWVFlG37kX+XTySox/PMDGlPx7oLWSm72ZOg7gE+st2LEiAb62KFSql6UlxczJIlS1i9ejWurq6MHDmSQYMG4e7ufuELjIHNX1LccSJevqG4PfgzHmuzuTqmVd0GrtQlsGcUXzrQU0QCbNunHR2UUurCLBYLaWlppKamUlhYSExMDKNGjcLfv4p5hwpOwjf3wq54/uz+EA8+/DuCfJtwe2yTugtcqRqoasn3G40xc0Xk0fP2A2CM+ZuDY1NKVbJ7924SEhLIzMykbdu2xMXF0bx586ov2rsYvroLirI5Ovh5srOGUVXvn1LOpKoWlG2OfS70p5mxp3AR2Q/kYZ3Dr9wY07fqK5RS58vMzCQhIYHdu3cTFBTEjBkz6Ny5c9X3mQBWvYP56WlOebch+M5kmjfrzht1E7JStaKqJd/ftb1NNMYsr3zMNlDCXiONMSdrEpxSV7KCggJSU1NJS0vDw8ODuLg4+vfvf+6ErlWJGMCaoIl86H8nb4V3QxfFUA2NPYMk/g70tmOfUqoWlJeXs2bNGpYsWUJpaSl9+/ZlxIgR+PhUPwzcbFzAjg0r8bn6RVq37E3MfR/yD1eX6ltbSjmhqu5BDQIGA2Hn3YcKALv/GDNAgogY4F1jzJwaR6pUI2eMYfv27SxatIhTp04RFRVFXFwcYWFh1V9cfBr++wSy8TMKTGe+Xr6Tp6+NwdNN202q4aqqBeUB+NnOqXwf6jQwzc7yhxhjjohIOLBIRLYbY5ZUPkFE7gLuAmjdurXdgSvVmBw9epT4+HgOHDhAWFgYN9xwA1FRUXZdazLWUjr/NjzzM2DE0wR0+jW/aRro2ICVqgNiTNXjHUSkjTHmwGV/kMhzQL4x5tWLndO3b1+zdu3ay/0opRqMvLw8kpOTSU9Px8fHhxEjRtCnT59fTuh6McWnKf1rNCdKPciKe5ueQ8Y7NmClHEBE0i40iM6ee1CFtvWgogGvMzuNMVUutyEivoCLMSbP9j4O+MOlha1U41RWVsbKlStZtmwZFouFQYMGMWzYMLy8vKq/GDCnj5LjEkyQXwAu189lxdFgpgyMdnDUStUtexLUJ8B84BrgbuAWINOO65oCX9tuzroBnxpjfqphnEo1CsYYNm/eTGJiIqdPn6ZLly6MGTOG4OBgewuA9E8o/e5x3vO4gwcfex6v9sOZ0d6xcStVH+xJUCHGmH+LyEPGmMXAYhFZXN1Fxpi9QM/LjlCpRuLQoUPEx8dz+PBhmjdvzpQpU2jTpo3d15v8TPj+EWT7dxSFD6Bl1HideVw1avYkqDLbv0dFZAJwBNAJvJSyU05ODomJiWzZsgV/f38mTZpEz549L2nod/HWeEq+uAs/k4/rmOcJHPwAN7joCD3VuNmToP5omyj2MazPPwUAjzg0KqUagZKSkrMLB4oIw4YNY8iQIXh4eFxyWZ6uFjLdQljR/19cFTvWAdEq5XyqHcVXl3QUn2oMLBbL2YUDCwoK6NGjB6NGjaJJk0ubnPXwup9IWbaMCb96hiBfD+vS7NpqUo3QJY/iE5G/U8Wce8aYB2spNqUajb1795KQkMDx48eJiIhg1qxZtGzZ8tIKKcmHpOdpuWYOA6U1+47fT1BkM01O6opTVRefNmWUslNWVhYJCQns3LmTwMBApk2bRteuXS95iqH1ixfSfuVTBBQfgQH30HrE7/Dw9nNQ1Eo5t6omi/2oLgNRqiEqKipi8eLF/Pzzz7i5uTF69GgGDhyIm5s9t3fPk3uYHim3cswlHK+bf8AjcgiXfrdKqcaj2v+LRCSFC3T1VfegrlKNWUVFBWvXrmXx4sUUFxfTq1cvRo4ciZ/fpbV2KiyGbxNTiOnVn8iwlpRN/4SwyKHaalIK+0bxPV7pvRcwFSh3TDhKOTdjDLt27SIhIYGsrCwiIyOJi4ujadOml15YUQ6lPzzNlM2fsiD3bSKn34hX9FW1H7RSDZQ9S76nnbdruT0P6irV2Bw/fpyEhAT27t1LSEgIs2bNokOHDpd8n6m4rIINCXMZsO0lvAsyye19P9PHT3FQ1Eo1XPZ08VWeg8UF6AM0c1hESjmZ/Px8UlJSWL9+PZ6enowbN45+/frZv3DgeQ59eDsDDn9DUUg03rPn06RFTO0GrFQjYU8XXxrWe1CCtWtvH/ArRwallDMoLy9n1apVLF26lPLycvr378/w4cPx9va+5LJO5ZeQmV9Cx2YBtOs1ikNNOxAx4Tfg6u6AyJVqHOzp4mtXF4Eo5SyMMWzdupXExERycnLo2LEjY8eOJTQ0tGblZe4kY87tLHIbySNP/gG3vrcQUcsxK9UY2dPF5wXcC8RibUktA94xxhQ7ODal6tzhw4dJSEjg4MGDNG3alJtuuonIyMgalXUoM4eWW97FZemrdHH1ImRQlC69rtQlsKeL7z9AHtZ5+ABmAR8D0x0VlFJ17fTp0yQlJbFx40Z8fX2ZOHEiMTEx9i8ceJ5DG1Ip/uo+XCQDoqfgNv5PtPCvwUg/pa5g9iSoTsaYystmpIjIBkcFpFRdKi0tZcWKFSxfvhxjDLGxscTGxuLp6Vmj8opKK/D2cKWVdwl5XhWcumouQTETazlqpa4M9iSo9SIy0BizCkBEBgDLHRuWUo5ljGHjxo0kJSWRl5dHdHQ0Y8aMITAwsKYFsurrt1i9ZRc3PfoqwR3HEfDEBnCrWaJTStmXoAYAN4vIQdt2a2CbiGwCjDGmh8OiU8oBDhw4QEJCAkeOHKFly5ZMnz6diIiaD1uoOLED1/8+xsD9Swn16YXrmYlXNDkpdVnsSVDjHR6FUnXg1KlTJCYmsnXrVgICArjuuuvo3r17jQcuWIrzWfTuE4zJWQCevnDN60T1vgVqeN9KKXUue4aZHxCRnsBQ266lxhi9B6UajOLiYpYuXcrq1atxcXFhxIgRDB48GHf3mj2DVFZhwd3VBZfcA4w5NZ9dTa+m802vgV9YLUeu1JXNnmHmDwF3Al/Zds0VkTnGmL9XcZlS9c5isbBu3TpSUlIoLCwkJiaGkSNHEhAQUOMy09LXseS7j5h094tENo3G9aH1dA5qU4tRK6XOsKeL71fAAGNMAYCI/BlYyf+GnSvldPbs2UN8fDyZmZm0adOGcePG0bx58xqXV1ZcgPvKN+i97HWiLS4czX8AwqJAk5NSDmNPghKgotJ2hW2fUk4nMzOThIQEdu/eTVBQEDNmzKBz5841f0DWGD7+8B9cdfhNQsuPId2m4RX3Au0CWtRu4EqpX7AnQX0ArBaRr7EmpknAvx0alVKXqLCwkNTUVNauXYuHhwdjx46lf//+NVs4kP/dZ6LoFDMzXuK0Z1Mss7/HJXJo9RcrpWqFPYMk/iYiqVinOgK4zRiz3qFRKWWniooK1qxZw5IlSygpKaFPnz6MGDECX1/fGpe5+9BRvv/PK/Sf+RSDo8LxuONHQsO76MSuStWxS/nzUgAL2r2nnIAxhh07drBo0SKys7Np3749cXFxhIeH17jM4tIyvLZ9SfuEZ3i47Dg7Tl0FjIXm+qifUvXBnlF8z2Cdd+9LrMnpAxH53BjzR0cHp9SFHDt2jPj4ePbv309oaCg33HADUVFRl1Xm+59/zaAdf6JL+XakZR+YNY9OrfrUUsRKqZqwpwU1C+h1ZvZyEfkTsA7QBKXqVF5e3tmFA729vbn66qvp06dPjSd0zS8px9vdFVcszNz/LEgeZdf8HffeN+rDtko5AXsS1H7ACzizvIYnsMdRASl1vrKyMlauXMmyZcuoqKhg4MCBDB8+HC8vrxqXeSgzl4/feZFO4+5g6oCO+N70KQRGgFeTWoxcKXU57ElQJcAWEVmEdT2oscAyEXkTwBjzoAPjU1cwYwybN28mKSmJ3NxcOnfuzNixYwkODq5xmSfzSwg9voJWPz3Fby3bOVTQEegIzbrVXuBKqVphT4L62vY6I9UxoSj1P4cOHSIhIYGMjAyaNWvG5MmTadu27WWV+c43yXTa8CdGmdVIUFu4fh4Rna6qlXiVUrXPnmHmH9VFIEoB5OTkkJSUxObNm/Hz8+Paa68lJiamxg/aZuaV4OPhiq+nGzec+CvesoHy4f+H25AHwb3mXYRKKcer2VOMStWykpISli1bxqpVqwAYNmwYQ4YMwcPDo8Zlnswr5sVX/0LnfqO5+5ohBEx5w5qUmrSqrbCVUg6kCUrVK4vFQnp6OikpKeTn59O9e3dGjx5NkyY1G6xgjGHXiXw6ymFCf/oNr0sqp0wpMARCL28oulKqbjk8QYmIK7AWOGyMucbRn6cajn379pGQkMCxY8do1aoVM2fOpFWry2vdvP3TenxWvkoHt3jEwxeueoWgvrfXUsRKqbp00QQlIt/BmaVBf8kYc62dn/EQsA2o+RoHqlHJyspi0aJF7NixgyZNmjB16lSio6NrfJ/paG4Rri5CuL8Xtxb9B1+X/2J63oSMeRZ8Q2s5eqVUXamqBfWq7d8pQDNgrm17FtZno6olIq2ACcCLwKM1C1E1FkVFRSxZsoQ1a9bg5ubGqFGjGDhwYI0XDgQoLC3n4dc/pldkOE/dNBm/sU9B/5sQnQVCqQbvognKGLMYQEReMMYMq3ToOxFZYmf5rwNPAv4XO0FE7gLuAmjdurWdxaqGpKKigrS0NFJTUykqKqJXr16MGjUKPz+/GpVnjGHLkdN0Czb4pLzIZ+ZfFJmxwGTwb2Z9KaUaPHvuQYWJSKQxZi+AiLQDql3bWkSuAU4YY9JEZMTFzjPGzAHmAPTt2/eiXYqq4THGsGvXLhYtWsTJkydp164dcXFxNGt2eQnkszUHWLfwbV72/xK3klNIv1/hM/K3tRS1UspZ2JOgHgFSRWSvbbst8Gs7rhsCXCsiV2OdKilAROYaY26sUaSqQTlx4gQJCQns2bOH4OBgrr/+ejp27Fjj+0x5xWXkFJYREezDdZYEZrnPwRI2AK5+VWcbV6qREmOqb7SIiCfQ2ba53RhTckkfYm1BPV7dKL6+ffuatWvXXkrRyskUFBSQkpLCunXr8PT0ZPjw4fTr1w9XV9cal2mMYcbrP9LGNYtXHrgRKSuCHf+FblOhpivlKqWchoikGWP6nr+/qlF8Uy5yqL2IYIz5qtaiUw1eeXk5q1evZunSpZSWltKvXz+GDx+Oj49Pjcvck5lPZIg3sv5jPil6Fot3CGJuAA8f6D6tFqNXSjmjqrr4JlZxzAB2JyhjTCo6h1+jZIxh27ZtJCYmcurUKTp06EBcXByhoZc3vHvNvmxeem8uHzZdQOCpTXi0GQJXv6LLYCh1BalqFN9tIuICTDPGLKjDmFQDceTIEeLj4zl48CDh4eHceOONtG/fvsblWSyGo6eLaRnoTR/Zwdcez2BKw2DKe9B9unbnKXWFqXKQhDHGIiL3A5qg1FmnT58mOTmZDRs24OPjw4QJE+jdu3eNFw4848nP13N87wbee/xmvFoPgHEvIb1uBC99xlupK5E9o/gWicjjwHyg4MxOY0y2w6JSTqmsrIwVK1awfPlyLBYLQ4YMITY29rIWDswtLMPbwxWPo2k8f/xh3CsO4F56LfiGwKB7azF6pVRDY0+COjOR2X2V9hkgsvbDUc7IGMPGjRtJSkoiLy+Prl27MmbMGIKCgi6r3My8Ema/tpA3w76ly/Hv8PVvAZPfAJ+aL0iolGo87FkPql1dBKKc08GDB4mPj+fIkSO0aNGCadOmXfaMH/kl5fh5uhFGDt/LQ7hnlsKQh2HYE+BZs9kllFKNT7UJSkTcgXuAM9MdpQLvGmPKHBiXqmenTp0iMTGRrVu34u/vz+TJk+nRo0eNH7Q9Y8HaQ/znh1Tef2Q64QFN8Rz1G+g0QZfCUEr9gj1dfO8A7sA/bNs32fbd4aigVP0pKSlhyZIlrF69GhcXF4YPH87gwYMva+FAi8VQWmHBq+AIV29/mqnmvxTkxEBAdxjyUO0Fr5RqVOxJUP2MMT0rbSeLyAZHBaTqh8ViYf369aSkpFBQUEDPnj0ZNWoUAQGXN4KuwmK4ec5ibjULGZv1KX4AI35DQHNtMSmlqmZPgqoQkfbGmD0AIhIJVDg2LFWX9u7dS3x8PCdOnKB169bMnj2bFi1aXFaZxWUVeLm74mrK+XvuQwQX7YeukyHuBQjUWeuVUtWzJ0E9AaTYJosVoA1wm0OjUnXi5MmTLFq0iJ07dxIYGMj06dPp0qXLZd9nWrU3i+fnJvDaXRPo3CyA4JH3Q2hHiBxeS5Erpa4EVc3F9zCwHFgMdAA6YU1QlzxZrHIuRUVFpKamsnbtWtzd3RkzZgwDBgzAzc2ev1curqS8As+yPGK2/JnvLf/ixGF/aHYN9L+zliJXSl1JqvqN1Ap4A+ss5huBFVgT1iFAE1QDVFFRwc8//8zixYspKSmhd+/ejBw5El9f38su+/++Sify0NfcXjIXr8Is6HMLzTsPrIWolVJXqqrm4nscQEQ8gL7AYKwP7b4nIjnGmK51E6K6XMYYdu7cSUJCAtnZ2URGRhIXF0fTpk0vq9yCknJ8PFwREe478jQtTq3ARAyEm76C5j2rL0AppapgT5+ONxAANLG9jgCbHBmUqj3Hjh0jISGBffv2ERoayuzZs4mKirrs+0zbj53msTnf89i0EYzq2oIWw24H+RWiazQppWpJVfeg5gDRQB6wGmsX39+MMafqKDZ1GfLz80lOTmb9+vV4e3tz1VVX0adPn8teODC7oJQQ9zI6bHqNb8xbZB55HrreCz2m12L0SilVdQuqNeAJ7AIOAxlATh3EpC5DWVkZq1atYtmyZZSXlzNw4ECGDRuGt7f3ZZf92y/TCd79JY+7fY5r/jFcu8+gRb9JtRC1Ukr9UlX3oMaLtR8oGuv9p8eAbiKSDaw0xjxbRzEqOxhj2LJlC4mJieTm5tKpUyfGjh1LSEjIZZV7MKuQ5oFeuLu68MjpVwgv/gHTsh/MnAsR/WopeqWU+qXq1oMywGYRyQFyba9rgP6AJignkZGRQXx8PBkZGTRt2pRJkybRrt3lz/G7+0QeD7zxKTePG8ysYd0JH3kPFExDoq/T+0xKKYer6h7Ug1hbTkOAMqxDzFcC76ODJJxCbm4uSUlJbNq0CV9fXyZOnEhMTMxlLRxYXFbBruP5dPfPp/3Kl/nB/ROKCh4CukO7obUXvFJKVaOqFlRb4AvgEWPM0boJR9mjtLSUZcuWsXLlSowxxMbGEhsbi6en52WX/cLny+mw8z26uSUgxoIMvBvfYQ/WQtRKKXVpqroH9WhdBqKqZ4whPT2d5ORk8vPz6datG6NHjyYwMPCyyl226yTdWgYQ6OPBbyrew5/vkOjrYcTTENSmdoJXSqlLdHlz26g6s3//fuLj4zl27BgtW7ZkxowZREREXHa5B49nk/jhH9g9cDK3ThxFwFXPQsVT0DS6FqJWSqma0wTl5LKzs1m0aBHbt28nICCAKVOm0K1bt8t60PZQdiHr9h1nkkmh9ZJXec79MOX+EcAoXThQKeU0NEE5qeLi4rMLB7q6ujJy5EgGDRqEu7v7ZZe94pt3GHLwHSATWvWHyf/ArZ3ONK6Uci6aoJyMxWIhLS2N1NRUCgsL6dWrFyNHjsTf37/GZZZVWJi3cg9DO7egXagvk4IzcCluDmPfgagxOmRcKeWUNEE5kd27d5OQkEBmZiZt27Zl3LhxNGvW7PIKLSumeNUHjE18haXHXqLdtOvxmvASuHlpYlJKOTVNUE4gMzOThIQEdu/eTXBwMDNnzqRTp06XdZ9p054MspfOYXjWAvzzjuLeoh/TB7S3HnS//GmPlFLK0TRB1aPCwkJSUlJIS0vD09OTuLg4+vfvf1kTugJgDK2+uJruRQcoax2L+5Q5eLUdqi0mpVSDogmqHpSXl7NmzRqWLFlCaWkpffv2ZcSIEfj4+NS4zMIT+1nz9Rt4jX6agVHh+F79PIV+LfBpN6AWI1dKqbqjCaoOGWPYvn07ixYt4tSpU0RFRREXF0dYWFiNyyzYn4Zv2jt4b/6KWAPfbRsOUZPx6H4dHrUYu1JK1TVNUHXk6NGjxMfHc+DAAcLCwrjhhhuIirqMZ44KTrL7nRlE5adhPPyRgfdQ2vsurgvTmR+UUo2DJigHy8vLIzk5mfT0dHx8fJgwYQK9e/eu0YSuu4+cJHHJEm6dOgkv7yCCvF1Z3fRBek95FHffIGreQaiUUs7HYQlKRLyAJVgXPXQDvriS1pAqKytjxYoVLF++HIvFwuDBgxk6dCheXl52l1FabmHZ7kyiA8tpuuNTWq/8JzOLStiRMYie7ZoTct8iLm+1J6WUcl6ObEGVAKOMMfki4g4sE5EfjTGrHPiZ9c4Yw6ZNm0hKSuL06dN06dKFsWPHEhQUZNf1xWUVFJSUE+LnyclDOzg297cM81gOlhLcosbg0+9eera9zGejlFKqAXBYgrItdphv23S3vYyjPs8ZHDp0iPj4eA4fPkzz5s2ZMmUKbdrYf0+owmIY+Zdk4jr68/z0gbRwPc31nssx3WfC4PtwCe/M5S+ooZRSDYND70GJiCuQBkQBbxtjVl/gnLuAuwBat27tyHAcJicnh8TERLZs2YK/vz+TJk2iZ8+edj1o+/X6DNYdyOGFq9riumEe8R5vUVg2GBgIEf1xeWw7+AQ7vhJKKeVkHJqgjDEVQIyIBAJfi0g3Y8zm886ZA8wB6Nu3b4NqYZWUlLB06VJWrVqFiDBs2DCGDBmCh0fVA7x3n8ijfZgfIsLpwzvov+MjzLZkpCSPgBa9CegZZz1RRJOTUuqKVSej+IwxOSKSCowHNldzutOzWCxnFw4sKCigR48ejB49moCAgGqvTdp2nDs+WsMndwxkcFQYN5nvcCn5AbpOhgG/hlb9dMYHpZTCsaP4woAyW3LyBsYAf3bU59WVffv2ER8fz/Hjx4mIiGDWrFm0bNnyoueXV1hYsDaD5oFejIxwY1jWfNKD5uBq3gXCcBn+JIx4Cvx14INSSlXmyBZUc+Aj230oF2CBMeZ7B36eQ2VlZZGQkMDOnTsJDAxk2rRpdO3a9aL3mUrLLXi4ueAiwuLUBH7lmQT5ybiXF9MkYiB42J6DCmhRh7VQSqmGw5Gj+DYCvRxVfl0pKipi8eLF/Pzzz7i5uTF69GgGDhyIm9vFv7p3Uvew4OeDLHp0OG6mjHd4ESkogZ6zoN+voFn3OqyBUko1TDqTxEVUVFSwdu1aUlNTKSkpoXfv3owYMQI/P79fnFtWYSF+yzGGdwzDP3cnEw//g8mWNRSVLsPf2xOXWfMgvAt4NamHmiilVMOkCeo8xhh27tzJokWLyMrKIjIykri4OJo2bXrBc0WEbQeOkTr/dQaGr8b/VDqtXD2h6ySgCPCE1gPrvB5KKdXQaYKq5Pjx48THx7Nv3z5CQkKYNWsWHTp0+MV9JovF8NBn62kf7MnD46PpXrKOV93fxbh0gLg/Qs/Z4KuTECml1OXQBAXk5+eTkpLC+vXr8fT0ZPz48fTt2/echQNzCktZfzCHka3dcNn0OU8dfI8jxcOBvyIdx8FtPyGtB+oQcaWUqiVXdIIqLy9n1apVLF26lPLycvr378/w4cPx9rYuiX6mCw/gu6/mErrzM4z7eqSilJbNe9Ky3yBrQa7u0GZQfVVDKaUapSsyQRlj2Lp1K4mJieTk5NCpUyfGjBlDaGjo2XM2HMrh5U9/4rlbrqZzswCmkoiHzy4k5g6IuQGadavHGiilVON3xSWow4cPEx8fz6FDh2jatCk33XQTkZGRlFVY+Db9MG28S4jJSSR63Sd8VpTOtpMp0Kw3PpNeA+8gcNN1apVSqi5cMQnq9OnTJCUlsXHjRnx9fZk4cSLduvfgRH4pAHLqAP7f3kU31oEpx61pdxj3El0i21oL8P/lKD6llFKO0+gTVGlpKcuXL2fFihUYYxgyZAhDhw7F08ODP/zzI/ILi/jLY/fg5hvIML/DuHa9C3rN1odplVKqnjXaBGWMYcOGDSQnJ5OXl0d0dDRlTaP5cPVGRrq+Dpvm80z2HrLD+mPM3Yh3EG6PbtFReEop5SQaZYI6cOAA8fHxHD16lAqvIK6bfgO9ukaR8cn9zMr/GBYDbYfC0EcJ7nLt/5KSJiellHIajSpBHTp2gk+/+oHizIME+PszokdrCjYsoMRyNQCteo2F1u2g+wwIjKjnaJVSSlWl0SQoYwwLv/qSghOZdG1SwNTyz3DfcATjE4L4ZwJRtumHlFJKNQSNJkGJCNeNHoD/vGvwzyuBDuMg5hWkQ5wODVdKqQao0SQogBadesPUNyFyBPiGVnu+Ukop59WoEhQA3afVdwRKKaVqgUt9B6CUUkpdiCYopZRSTkkTlFJKKaekCUoppZRT0gSllFLKKWmCUkop5ZQ0QSmllHJKmqCUUko5JTHG1HcMZ4lIJnDgMosJBU7WQjjOROvk/BpbfUDr1FA0hjq1McaEnb/TqRJUbRCRtcaYvvUdR23SOjm/xlYf0Do1FI2xTmdoF59SSimnpAlKKaWUU2qMCWpOfQfgAFon59fY6gNap4aiMdYJaIT3oJRSSjUOjbEFpZRSqhHQBKWUUsopOX2CEpH3ReSEiGyutK+niKwUkU0i8p2IBNj2txWRIhFJt73+WemaPrbzd4vImyIi9VEfWyx218l2rIft2BbbcS/b/gZZJxG5odLPKF1ELCISYzvWUOvkLiIf2fZvE5GnK13jFHW6xPp4iMgHtv0bRGREpWucoj62WCJEJMX2nW8RkYds+4NFZJGI7LL9G1Tpmqdtse8QkXGV9jtFvS61TiISYjs/X0TeOq8sp6hTjRljnPoFDAN6A5sr7fsZGG57fzvwgu1928rnnVfOGmAQIMCPwFUNpE5uwEagp207BHBtyHU677ruwN5G8HOaDXxme+8D7AfaOlOdLrE+9wEf2N6HA2mAizPVxxZLc6C37b0/sBPoCvwFeMq2/yngz7b3XYENgCfQDtjjbP8/1aBOvkAscDfw1nllOUWdavpy+haUMWYJkH3e7k7AEtv7RcDUqsoQkeZAgDFmpbH+1P4DTK7lUO12iXWKAzYaYzbYrs0yxlQ08DpVNguYBw3+52QAXxFxA7yBUuC0M9XpEuvTFUiyXXcCyAH6OlN9bLEdNcass73PA7YBLYFJwEe20z7ifzFOwvqHRIkxZh+wG+jvTPW61DoZYwqMMcuA4srlOFOdasrpE9RFbAautb2fDkRUOtZORNaLyGIRGWrb1xLIqHROhm2fM7lYnToCRkTiRWSdiDxp29+Q61TZTGwJioZdpy+AAuAocBB41RiTjfPX6WL12QBMEhE3EWkH9LEdc9r6iEhboBewGmhqjDkK1l/4WFuBYI31UKXLzsTvlPWys04X45R1uhQNNUHdDtwnImlYm8Cltv1HgdbGmF7Ao8Cntj71C/W7Otv4+ovVyQ1r8/0G27/XichoGnadABCRAUChMebMPZGGXKf+QAXQAmvX0WMiEonz1+li9Xkf6y+0tcDrwAqgHCetj4j4AV8CDxtjTld16gX2mSr215tLqNNFi7jAvnr/WV0Kt/oOoCaMMduxdn0hIh2BCbb9JUCJ7X2aiOzB2gLJAFpVKqIVcKQuY67OxeqENfbFxpiTtmP/xXofYS4Nt05nXM//Wk/QsH9Os4GfjDFlwAkRWQ70BZbixHWq4v+lcuCRM+eJyApgF3AKJ6uPiLhj/UX+iTHmK9vu4yLS3Bhz1NbVdcK2P4NzW/Jn4neq//YusU4X41R1qokG2YISkXDbvy7A74B/2rbDRMTV9j4S6ID1BvxRIE9EBtpGsdwMfFsvwV/ExeoExAM9RMTHdn9jOLC1gdfpzL7pwGdn9jXwOh0ERomVLzAQ2O7sdari/yUfWz0QkbFAuTHG6f67s8Xwb2CbMeZvlQ4tBG6xvb+F/8W4ELheRDxtXZcdgDXOVK8a1OmCnKlONVbfozSqe2H9C/soUIb1L4JfAQ9hHdmyE/gT/5sRYyqwBWv/+TpgYqVy+mLtb98DvHXmGmevk+38G2312gz8pZHUaQSw6gLlNMg6AX7A57af01bgCWer0yXWpy2wA+sN+kSsyyE4VX1sscRi7bbaCKTbXldjHe2ahLXVlwQEV7rm/2yx76DSqDZnqVcN67Qf6wCYfNvPtqsz1ammL53qSCmllFNqkF18SimlGj9NUEoppZySJiillFJOSROUUkopp6QJSimllFPSBKWUA9mei1omIldV2jdDRH6qz7iUagh0mLlSDiYi3bA+I9ULcMX6XMt4Y8yeGpTlaoypqN0IlXJOmqCUqgMi8hesk8n62v5tg3WpETfgOWPMt7aJQT+2nQNwvzFmhVjXYnoW60O2McaYrnUbvVL1QxOUUnXANm3QOqyTsX4PbDHGzBWRQKxr9vTCOnuAxRhTLCIdgHnGmL62BPUD0M1Yl4hQ6orQICeLVaqhMcYUiMh8rFPRzAAmisjjtsNeQGusE3m+JdbVhSuwTnR8xhpNTupKowlKqbpjsb0EmGqM2VH5oIg8BxwHemIdwFR5AbqCOopRKaeho/iUqnvxwAO2GaYRkV62/U2Ao8YYC3AT1gEVSl2xNEEpVfdeANyBjSKy2bYN8A/gFhFZhbV7T1tN6oqmgySUUko5JW1BKaWUckqaoJRSSjklTVBKKaWckiYopZRSTkkTlFJKKaekCUoppZRT0gSllFLKKf0/aY7Uc0wD2boAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(results, 'Constant growth model')" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-immigration", + "metadata": {}, + "source": [ + "It might not be obvious that using functions and `System` objects is a\n", + "big improvement, and for a simple model that we run only once, maybe\n", + "it's not. But as we work with more complex models, and when we run many simulations with different parameters, we'll see that the organization of the code makes a big difference.\n", + "\n", + "Now let's see if we can improve the model." + ] + }, + { + "cell_type": "markdown", + "id": "european-massachusetts", + "metadata": {}, + "source": [ + "## Proportional growth model\n", + "\n", + "The biggest problem with the constant growth model is that it doesn't\n", + "make any sense. It is hard to imagine how people all over the world\n", + "could conspire to keep population growth constant from year to year.\n", + "\n", + "On the other hand, if some fraction of the population dies each year,\n", + "and some fraction gives birth, we can compute the net change in the\n", + "population like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "biblical-evans", + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation2(system):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " births = system.birth_rate * results[t]\n", + " deaths = system.death_rate * results[t]\n", + " results[t+1] = results[t] + births - deaths\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "neutral-singapore", + "metadata": {}, + "source": [ + "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", + "\n", + "For the death rate, I'll use 7.7 deaths per 1000 people, which was roughly the global death rate in 2020 (see ).\n", + "I chose the birth rate by hand to fit the data." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "alert-enzyme", + "metadata": {}, + "outputs": [], + "source": [ + "system.death_rate = 7.7 / 1000\n", + "system.birth_rate = 25 / 1000" + ] + }, + { + "cell_type": "markdown", + "id": "bacterial-convergence", + "metadata": {}, + "source": [ + "Then I ran the simulation and plotted the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "mechanical-phone", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABGo0lEQVR4nO3dd1hUV/rA8e87QwdBBayI2BsKKLbYS4yxRo0aY5rpyaZvks3uZpPspmxPdjflt3E3xcQYNU0Tjb03VFTsGkWxYgEVlQ5zfn/M4CICjsZhBng/zzMPM/eee+97UHg55557jhhjUEoppTyNxd0BKKWUUqXRBKWUUsojaYJSSinlkTRBKaWU8kiaoJRSSnkkTVBKKaU8kiYopW4wEZkoIgsr4Dqfisgbrr5OKdeNEhEjIl5OlL1PRFZXRFyq6tEEpSoFEUkRkWwRuSgiJ0XkExEJ8oC4rvhlbYz5whgzyJ1xKVUVaIJSlclwY0wQ0BHoDLxcsoAzf9XfKBV5LaWqI01QqtIxxhwD5gHRAI4WzC9EZB+wz7HtIRHZLyJnROR7EWlQdLyj/FMickBE0kTkryJiceyziMjLInJIRE6JyGciEuLYV9RaekBEDgNLgZWO055ztO66l+zWEpGbRGSjiGQ4vt5UbN9yEXldRNaIyAURWSgiYcX2fyUiJxzHrhSRds58jxwxrBGRd0TknKOuNzm2H3HU7d5i5UMcdT3tqPvLxb4nVhH5m+N7dQAYWuJaISLykYikisgxEXlDRKzOxKlUeTRBqUpHRBoBQ4AtxTbfBnQF2opIf+CPwDigPnAImF7iNKOAeOytsZHA/Y7t9zle/YCmQBDwXolj+wBtgFuA3o5tNY0xQcaYdSVirQ3MBf4FhAJvA3NFJLRYsTuBSUAdwAd4vti+eUALx77NwBelfU/K0BXY5rjuNOzfg85Ac+Au4L1i3aTvAiGOOvcB7nHEBPAQMAyIw/49u73EdaYABY7zxgGDgAevIU6lSmeM0Ze+PP4FpAAXgXPYE84HgL9jnwH6Fyv7EfCXYp+DgHwgqlj5wcX2Pw4scbxfAjxebF8rx7FeQJTj2KbF9hdt8yq27T5gteP93cCGEnVZB9zneL8ceLlELPPL+B7UdFwrxPH5U+CNMsreB+wr9rm949i6xbalA7GAFcgF2hbb9wiw3PF+KfBosX2DiuoM1HUc619s/wRgWcnvhb70da0v7UNXlcltxpjFZew7Uux9A+ytDQCMMRdFJB1oiD3RlSx/yHFM0bGHSuwr+kVc2rWupuT5is7ZsNjnE8XeZ2FPqDi6yd4ExgLhgM1RJgzIcOLaJ4u9zwYwxpTcFuQ4nw9X1rsoxgZc+f0q0hjwBlJFpGibhWv7HilVKu3iU1VF8Wn5j2P/xQmAiARi7+Y6VqxMo2LvIx3HXHGsY18Bl/+yN2W8L03J8xWd81gpZUu6E3v340Ds3W9Rju1S1gHXKQ17K7FkvYtiTOXK71eRI9hbUGHGmJqOV7Axxql7ZUqVRxOUqoqmAZNEJFZEfIG3gPXGmJRiZV4QkVqO+1lPAzMc278EnhWRJo77M28BM4wxBWVc6zT2lk3TMvb/CLQUkTtFxEtExgNtgTlO1KMG9l/+6UCAI5YbzhhTCMwE3hSRGiLSGHgOmOooMhN4SkQiRKQW8FKxY1OBhcDfRSTYMcikmYj0cUWsqnrRBKWqHGPMEuB3wDfY//pvBtxRothsYBOQhH0Qw0eO7R8Dn2MfnXcQyAGeLOdaWdi74dY4Rst1K7E/HfsAg19iTzQvAsOMMWlOVOUz7N1px4BdQIITx1yvJ4FM4ACwGnuS/9ix7z/AAmAr9q7Tb0scew/2LsJdwFnga+yDU5T6WcQYXbBQVS8iYoAWxpj97o5FKVU2bUEppZTySJqglFJKeSTt4lNKKeWRtAWllFLKI3nUg7phYWEmKirK3WEopZSqQJs2bUozxoSX3O5RCSoqKorExER3h6GUUqoCiUjJ2VYA7eJTSinloTRBKaWU8kiaoJRSSnkkl96DEpFnsa8LY4DtwCRjTM61nCM/P5+jR4+Sk3NNhykn+fn5ERERgbe3t7tDUUqpy7gsQYlIQ+Ap7GvMZIvITOzzoX16Lec5evQoNWrUICoqimLT+asbwBhDeno6R48epUmTJu4ORymlLuPqLj4vwF9EvLDPxnz8KuWvkJOTQ2hoqCYnFxARQkNDtXWqlPJILktQxphjwN+Aw9hnlM4wxiwsWU5EHhaRRBFJPH36dKnn0uTkOvq9VUp5KpclKMe6MSOBJthX5AwUkbtKljPGTDbGxBtj4sPDr3hOSymllAc6d+4c27Ztc+k1XNnFNxA4aIw5bYzJx76GzE0uvJ5LpKSkEB0dfdm21157jb/97W8AJCQk0LVrV2JjY2nTpg2vvfZaqefZsGEDvXv3plWrVrRu3ZoHH3yQrKwsV4evlFI3XFpaGp988gnz58936S0CV47iOwx0E5EAIBsYAFS5aSLuvfdeZs6cSUxMDIWFhezdu/eKMidPnmTs2LFMnz6d7t27Y4zhm2++4cKFCwQEBLghaqWUuj6pqalMnToVEeHee+/Fz8/PZddy5T2o9dhX1tyMfYi5BZjsquu5y6lTp6hf3754qNVqpW3btleUef/997n33nvp3r07YL/vc/vtt1O3bl0yMzO5//776dy5M3FxccyePRuATz/9lNGjRzN48GBatGjBiy++CEBhYSH33Xcf0dHRtG/fnnfeeQeAvn37XpomKi0tjaI5DXfu3EmXLl2IjY2lQ4cO7Nu3z6XfD6VU1XXkyBGmTJmCt7c3kyZNom7dui69nktH8RljXjXGtDbGRBtj7jbG5P7cc47/cB1fJR4BIL/QxvgP1/HdlqMAZOcVMv7Ddfyw1T5Y8HxOPuM/XMf8HakAnMnMY/yH61i86yQApy78/Kbps88+S6tWrRg1ahQffvhhqc3dHTt20KlTp1KPf/PNN+nfvz8bN25k2bJlvPDCC2RmZgKQlJTEjBkz2L59OzNmzODIkSMkJSVx7NgxduzYwfbt25k0aVK58f373//m6aefJikpicTERCIiIn52nZVS1U9ycjKff/45gYGBTJo0idDQUJdfU2eSuIqyRrkVbX/llVdITExk0KBBTJs2jcGDB1/T+RcuXMif/vQnYmNj6du3Lzk5ORw+fBiAAQMGEBISgp+fH23btuXQoUM0bdqUAwcO8OSTTzJ//nyCg4PLPX/37t156623+POf/8yhQ4fw9/e/pviUUmrPnj18+eWX1K5dm0mTJhESElIh1610CWrGI90ZG98IAG+rhRmPdGdUnL1V4O9jZcYj3Rke0wCAYD9vZjzSncHR9i642oE+zHikOwPb2puldWpcve80NDSUs2fPXrbtzJkzhIWFXfrcrFkzHnvsMZYsWcLWrVtJT0+/rHy7du3YtGlTqecvuh+VlJREUlIShw8fpk2bNgD4+vpeKme1WikoKKBWrVps3bqVvn378v777/Pggw8C4OXlhc1mA7isFXfnnXfy/fff4+/vzy233MLSpUuvWmellCqSlJTEzJkzqV+/Pvfeey9BQUEVdu1Kl6AqWlBQEPXr12fJkiWAPTnNnz+fnj17AjB37lyKViXet28fVquVmjVrXnaOJ554gilTprB+/fpL26ZOncqJEye45ZZbePfddy+dY8uWLeXGk5aWhs1mY8yYMbz++uts3rwZsC9VUpQEv/7660vlDxw4QNOmTXnqqacYMWKEy4eFKqWqjnXr1jF79myaNGnC3XffXeE9MB61HpSn+uyzz/jFL37BL3/5SwBeffVVmjVrBsDnn3/Os88+S0BAAF5eXnzxxRdYrdbLjq9bty7Tp0/n+eef59SpU1gsFnr37s3o0aP53e9+xzPPPEOHDh0wxhAVFcWcOXPKjOXYsWNMmjTpUmvpj3/8IwDPP/8848aN4/PPP6d///6Xys+YMYOpU6fi7e1NvXr1eOWVV27o90YpVfUYY1i2bBmrVq2ibdu2jBo1Ci+vik8XUvSXuyeIj483JRcs3L1796UuL+Ua+j1WShWx2WzMmzePxMRE4uLiGDZsGBaLazvbRGSTMSa+5HZtQSmllALsj7HMmjWLHTt20KNHDwYMGODW6dA0QSmllCIvL4+ZM2eSnJzMgAEDLt1ndydNUEopVc1lZWUxbdo0jh8/zogRI4iLi3N3SIAmKKWUqtbOnTvH1KlTycjIYPz48bRq1crdIV2iCUoppaqpU6dOMXXqVPLy8rjrrrto3Lixu0O6jCYopZSqho4cOcK0adPw8vKqkHn1roc+qHsVV1tu47777qNhw4bk5tqnGSw+UWtJVquV2NhY2rVrR0xMDG+//fal55mWL19OSEgIsbGxl16LFy8G7PP1tWvXjg4dOhAbG3vZA78FBQWEhYXx61//+kZXXSlVRe3Zs4fPPvuMgIAAHnjgAY9MTqAtqBvCarXy8ccf89hjj5Vbzt/fn6SkJMDetL7zzjvJyMjg97//PQC9evW64iHddevWMWfOHDZv3oyvry9paWnk5eVd2r9w4UJatWrFzJkzeeutt3SFXKVUuRITE/nxxx9p0KABd955p0cv+aMtqBvgmWee4Z133qGgoMDpY+rUqcPkyZN57733KO9h6dTUVMLCwi7NyxcWFkaDBg0u7f/yyy95+umniYyMJCEh4foroZSq0opmh5g7dy7Nmzfnnnvu8ejkBJWxBfXJ0Cu3tbsNujwEeVnwxdgr98feCXETITMdZt5z+b5Jc392SJGRkfTs2ZPPP/+c4cOHO31c06ZNsdlsnDp1CoBVq1YRGxt7af8333zDoEGD+MMf/kDLli0ZOHAg48ePp0+fPgBkZ2ezZMkSPvzwQ86dO8eXX355ac0ppZQqYrPZmDNnDlu2bCE2Npbhw4e7fHaIG8HzI3Szqy23UeQ3v/kNf/3rXy/dU3JW8dZTr169Ls1qnpSURLNmzQgKCmLTpk1MnjyZ8PBwxo8fz6effgrAnDlz6NevHwEBAYwZM4bvvvuOwsLCa6ugUqpKy8vLY8aMGWzZsoVevXoxYsSISpGcoDK2oMpr8fgElL8/MPSaW0xlLbfRpEmTy7Y1b96c2NhYZs6c6fS5Dxw4gNVqpU6dOuzevbvMclarlb59+9K3b1/at2/PlClTuO+++/jyyy9Zs2bNpUEZ6enpLFu2jIEDBzpfQaVUlXXx4kW+/PJLUlNTGTp0KPHxV0x359EqRxp1o6stt1Hcb3/720uj+67m9OnTPProozzxxBPlDmzYu3fvZcu0JyUl0bhxY86fP8/q1as5fPgwKSkppKSk8P777/Pll19eYw2VUlVRWloaH330EadOnWL8+PHXn5wy0yDZPevIVb4WlBuUt9xGce3ataNjx46X1mgqKTs7m9jYWPLz8/Hy8uLuu+/mueeeu7S/5D2ol19+mSZNmvDkk09y7tw5vLy8aN68OZMnT+bbb7+lf//+ly1qOHLkSF588UVyc3Mv266Uql4OHz7M9OnTEZFLj8Jcl4Or4NuHoCAHntkBvvbFCg+nZ/Hn+Xt4bUQ7wmu47neNLreh9HusVBWya9cuvv32W0JCQpg4cSK1a9e+9pPYCmHlX2HFn6F2U7j9E6jf4dLulLRMRv/fWv4xPpbeLcN/dsy63IZSSlVhxhgSEhJYuHAhERER3HHHHQQGBl77iQpyYeoYSFkFHe6AoX8H3yD+tWQfZzLzeG1EO6LCAln7Un/8vK1XP9/PoAlKKaUqueKLDLZp04ZRo0bh7e19bScxBkTAyxcaxEHsndg6TMBisd8jP5+dT0Z2PjabwWIRlycn0EESSilVqeXl5TF9+nQSExPp3r07Y8eOvfbkdGA5/LsnHHXcYhn0OjvrDGXA2yvYdfw8AL8Z0oZ3xsdeSlgVQVtQSilVSV24cIFp06Zx8uRJhgwZQufOna/tBOnJsPBl2Psj1IyEvExy8gvx87YSUTOAOjV8ySmwP1tZkYmpiCYopZSqhE6ePMm0adPIzs5mwoQJtGjR4tpOsOyPsOrv9i69ga9B18d4ftZeUpduZOoDXQkJ8GbGI+6dmUYTlFJKVTL79u3j66+/xtfXl0mTJlG/fn3nDrQVgljs95q8/SFmPGldf0Vo3UaICPGNa3E2KwibAasHzDut96AqUFRUFGlpaT+7jFKq+tqwYQNffvkltWvX5sEHH3Q+OR1cCR/2hp3f2j/3eJotcW/Q472dLN1jnw/0ji6RPNa3GVY3dOeVRltQSilVCdhsNhYsWMCGDRto1aoVo0ePxsfH5+oHnjkAC38He+ZASCT5XoEcS8skKiyQ6IYh3N2tMS3r1nB9Ba6Dy1pQItJKRJKKvc6LyDOuup6rpKSk0Lp1ax588EGio6OZOHEiixcvpkePHrRo0YINGzZw5swZbrvtNjp06EC3bt3Ytm0bYJ8bb9CgQcTFxfHII49cNjHs1KlT6dKlC7GxsTzyyCM6yatSqky5ublMnz6dDRs20K1bN8aNG+dcclr7LrzfFZKXQf+X4YkNPJIQyv2fbqSg0Ia31cLLw9rSqLZnLrvhshaUMWYvEAsgIlbgGPDdzznn/PnzOXHixM8Prph69eoxePDgcsvs37+fr776ismTJ9O5c2emTZvG6tWr+f7773nrrbdo1KgRcXFxzJo1i6VLl3LPPfeQlJTE73//e3r27Mkrr7zC3LlzmTx5MmCfuWHGjBmsWbMGb29vHn/8cb744gvuueeecuNQSlU/RUvpnD592rkJX22FYGxg9YbgBhB9O0mtnqJty1b4eFl4qFdT8gptHtONV56K6uIbACQbYw5V0PVuqCZNmtC+fXvAPt/egAEDEBHat29PSkoKhw4d4ptvvgGgf//+pKenk5GRwcqVK/n2W3t/79ChQ6lVqxYAS5YsYdOmTZeGhGZnZ1OnTh031Ewp5ckOHz7MjBkzsNls3HXXXTRt2rT8A1LWwPyXIHo09HwWosewNWQAt72/hjdHBTCxa2O6NwutmOBvgIpKUHcApU6zLSIPAw+DfeG/8lytpeMqxSdetVgslz5bLBYKCgrw8rry21g0Q3lpM5UbY7j33nv54x//6KKIlVKV3datW/nhhx8ICQlhwoQJhIWFlV34bAosegV2zYbgCM76RbBj32l6tQinQ0QI74yP4dZoJwdTeBCXj+ITER9gBPBVafuNMZONMfHGmPjw8J8/6aA79O7dmy+++AKA5cuXExYWRnBw8GXb582bd2ldqQEDBvD1119fWkn3zJkzHDpUKRuXSqkbzBjD4sWLmTVrFo0aNeLBBx8sPzlt+hTe6wL7FkG/38ITG3lhZxS/nLmVvAIbIsKouIgKmZroRquIFtStwGZjzMkKuJZbvPbaa0yaNIkOHToQEBDAlClTAPuyHBMmTKBjx4706dPnUguxbdu2vPHGGwwaNAibzYa3tzfvv/8+jRs3dmc1lFJulpuby3fffcfevXvp2LEjQ4YMwWotJbHYbFCQDT6BUKcdhW1G8lXNB7glviO1fHz47dC2eFkEH6/K/SSRy5fbEJHpwAJjzCdXK6vLbbiHfo+Vcr+zZ88yffp0Tp8+zS233EKXLl1KX8w0ZTXM/zU07ATD/wHA3hMXGPzPlbw+Mpq7ulW+P3TdstyGiAQANwOPuPI6SilVmaWkpDBz5kyMMUycOLHUBVE5c8B+n2n3DxAcwXafDqxfdYAHezWlVb0aLHymNy089Hmm61VughKR7sBdQC+gPpAN7ADmAlONMRnlHW+MyQIqz5ARpZSqYImJicybN4/atWtzxx13EBpayq/M7V/DrMcwFm+k38tw0xNMn7Of9TuPcE/3KHy8LFUuOUE5CUpE5gHHgdnAm8ApwA9oCfQDZovI28aY710dpDGm9Kau+tk8aUVlpaqTwsJCFixYwMaNG2nRogWjR4/Gz8+vWIECyMmAwFBo1IWzzUfzi9TB/KHNzTT39uelW1vj723Fy1q57zOVp7wW1N3GmJKTwl0ENjtefxeRcoaW3Bh+fn6kp6cTGhqqSeoGM8aQnp5++Q+FUsrlMjMz+eqrrzh06BA33XQTAwYMwGIplmiSl8KC30JQXXLu+Bq/mpHYhv+LzE83kpGdB0ANv2tc86kScvkgiWtR2iCJ/Px8jh49Sk5Ojpuiqtr8/PyIiIi49gXOlFLXJTU1lRkzZpCZmcnw4cPp0KHD/3ae/sm+PtO+BVCzMf/1n8Q6nx58NKmL+wKuANc9SEJERgN/BuoA4ngZY0zwDY+yFN7e3jRp0qQiLqWUUi61fft2vv/+ewICApg0aRINGjT4386982D6RIx3AHLzH6Dro/huTKV7ga3a3uZwZhTfX4Dhxpjdrg5GKaWqIpvNxpIlS1i7di2RkZGMHTuWoKAgKMiF88egdlOI6smJdvczemsX/lKnPz29fLm7e5S7Q3crZxLUSU1OSil1fbKysvj2229JTk4mPj6ewYMHY7VYYOcsWPwqxuJD6sRlNKhdg5oj/8xA7900DvXM2cUrmjMJKlFEZgCzgNyijcaYb10VlFJKVQUnTpxgxowZXLhwgWHDhtGpUyc4mmgfAHEkAeq05R25m4WfbWbuU73w87byh5HR7g7bYziToIKBLGBQsW0G0ASllFJlKLrf5O/vz3333UdERAQcWA6fjaTAPxwZ+g+sne4hbl86bfNtVILVLyrcVROUMWZSRQSilFJVQWFhIYsWLWL9+vX2+03DBxGUdQSIgKheHOv6CoNWNOZVujLOYqVfK11qpyzOjOKLAN4FemBvOa0GnjbGHHVxbEopValcvHiRr7/+mkOHDtElvhODah3G+lEPbOJF0phVdGxWnwaDn+NXNQ8xuH09d4fr8Zzp4vsEmAaMdXy+y7HtZlcFpZRSlc2RI0f46quvyM7O5rbOjYjZ9zKcPQhN+/L7nAnMm76T1b+qi4+XhXuq+eg8ZzmToMJLzET+qYg846J4lFKqUjHGsHHjRhYsWEBISAgPDOtOve9GcT64BV7jZhDQ5hYmnLzAeBuVfvmLiuZMgkoTkbv434q4E4B014WklFKVQ15eHnPmzGH79u20rBvIbfc+hL+/P4dzptD3Oysvn2nF/SK0rlch8xpUOc4kqPuB94B3sN+DWuvYppRS1VZ6ejozp0/jVFo6/VhH9zN7+WHrcEZ3a0Vk19uYXucM8Y1ruTvMSs2ZUXyHsS/ZrpRSCti1dTOzf/gBa2EOE5lP8/gBvJLxEguXHmVofHN8vax0aVLb3WFWeuUtt/GiMeYvIvIu9pbTZYwxT7k0MqWU8jCFhYUsXryYhIQEGnKCuOA0Akd8Bs3a89TFXH5pteDrVcoS7eq6lNeCKpreKLGcMkopVfUZw/nN3/D18u0cuWihS5cuxLZpwsCPU3j1TE3GNYOwIF93R1nllJmgjDE/OL5OqbhwlFLKw6SsIfmHt/k2vTn54oO1URy33norAGteakrNAB83B1h1ldfF9wOldO0VMcbofSmlVNV17gi2Ob9kxf4LrJSuhAf7kNW0HxtOQE5+IX7eVk1OLlZeF9/fKiwKpZTyFLZCsFi5mAdfp4RzSNrRqFlL7h5/O1iseFmkWq7N5A7ldfGtqMhAlFLKrbLOwKq/w5EN7O3zAT/Mnk2uNOBQUEv6dO6jq067QXldfNspv4uvQ1n7lFKq0sjLhIQPYM2/sOVl8pX/RHZPm0Z4WBj33HMP4eHh2mJyk/K6+IZVWBRKKeUOp3bDZyPh4knONx3Od7k9SDl+Cq+wxtw76Q6CAvzcHWG1Vl4X36GKDEQppSqEzQYZh6FWFNRuRka9bjz/U3uijtkQc5aRI0cSExOjrSYPUObMhSKy2vH1goicL/m14kJUSqkbJHkp/Kcf5qNb2H/0FDaLFxvr3UOENYugoCAeeughYmNjNTl5iPJaUD0dX2tUXDhKKeUCxzbD4tfg4AoIacQU/3uZOmU9d9Q7xbGjR+nYsSODBw/WgRAexpnJYhGRjkBPHAsWGmO2uDQqpZS6UY5thv/0I8+3Fgx8E59uDxG2div9Vi/h9CkYM2YM0dHR7o5SleKqi5OIyCvAFCAUCMO+HtTLzpxcRGqKyNciskdEdotI958XrlJKOeH8cdg9x/6+QRzHev2Jjhl/5XPbLfwwbyGbls2jbp1wHn30UU1OHsyZFtQEIM4YkwMgIn8CNgNvOHHsP4H5xpjbRcQHCLjuSJVS6mqyzsCaf8D6Dym0+LIwuzW3dmxOwwGP8WbALo5sXsjmtDR69OhBv379sFp1YldP5kyCSgH8gBzHZ18g+WoHiUgw0Bu4D8AYkwfkXU+QSilVrrwsWP9/sPqfkHseOozntfMjWTT/EP3bN2Hrlk1sX7IQf39/7rrrLpo1a+buiJUTyntQt2iZjVxgp4gscny+GVjtxLmbAqeBT0QkBtgEPG2MyfzZUSulVHFnDmCWvM7+mj2oPe51Qpt15PGMbB7JzeGbr2awb98+WrRowYgRIwgKCnJ3tMpJ5bWgipbZ2AR8V2z78ms4d0fgSWPMehH5J/AS8LvihUTkYeBhgMjISCdPrZSq1mw22DULTmyDga9BvWhS71rF0E+P8ubZcMYCmaePMWvWLHJychg8eDBdunTR4eOVjBhT5mxGP+/EIvWABGNMlONzL+AlY8zQso6Jj483iYm6/JRSqhzJy+xDxlOTOBfckv+2+g/PD40FIO1iLjX9rCxZsoSEhATCw8MZM2YMdevWdWvIqnwisskYE19y+9WW25iMfZBDfol9TbHfW0oxxnxc2vHGmBMickREWhlj9gIDgF0/ow5KqerszAGY8ywcWA4hkXDbv/ngaDRbjlwgv9CGt9WCLSuD/079lpMnT9K5c2duvvlmfbapEiuvi+8h4DngHyJyBvv9JD+gCbAfeM8YM/sq538S+MIxgu8AMOnnh6yUqlYcy1/gHUhBWjKfBz1MlzEv0C6yDr+MLsTHan9aJiEhgcWLF+Pn58eECRNo2bKlmwNXP1d5M0mcAF4EXhSRKKA+kA38ZIzJcubkxpgk4Ipmm1JKXVVmGqz4C5zaReHd32OtUZfMRxKZ8Z8NRGVDO8DXy8qFCxeYNWsWBw4coGXLlowYMYLAwEB3R69uAKdmkjDGpGAfbq6UUq6VlwUJ79uHjOdnsjV8OP/4eDUfP9iLkEA/5j3d69Jgh127djFnzhzy8/MZOnQonTp10oEQVYhTCUoppSrEiR3wxVi4cBzTaggy8DV2HPCj8cmL5BcafLzsq9nm5OQwb948tm3bRoMGDRg1ahRhYWHujl7dYJqglFLul5kOgaEQ2oyLYe15NusxxnYYx6DwekwMv7zowYMHmTVrFhcuXKB379707t1bZ4SoojRBKaXc5+QuWPQ7SPuJc/evpWZwDfzumk6Nb7ZRL+TyxQILCgouDR8PDQ3lgQceoGHDhm4KXFWEqyYoEekBvAY0dpQXwBhjmro2NKVUlXXxNCx7EzZPAd8aLAi9m799mMDcZwfg42Xh7XGxlxU/fvw4s2bN4vTp0zp8vBpxpgX1EfAs9hklCl0bjlKqyjv9E/ynPyY/C1v8g1j7/Rr/o4WMPXHlOqiFhYWsXLmSVatWERQUxMSJE2nevLkbglbu4EyCyjDGzHN5JEqpqssY+4O2oc0grAUX2t/NxMQWjAzpxwMBtendEnq3vPxm06lTp/juu+84ceIEHTp0YPDgwfj7+7upAsodnElQy0Tkr8C32CeOBcAYs9llUSmlqo7UrTDvJczJHRyZuJrIyMYEDXuLfn776FMiKQHYbDbWrVvHsmXL8PX1Zdy4cbRp08YNgSt3cyZBdXV8Lf7ArQH63/hwlFJVxsVTsOQPsGUqBNRmXv3H+c3Hu1j+Yn1qBvjw7M1XzvSQlpbG7NmzOXr0KK1bt2bYsGH60G01dtUEZYzpVxGBKKWqkIun4N1OmPwscuMfxW/ASzTLsPKrw2ep4Xfl4AabzUZCQgLLli3Dy8uL0aNHEx0drQ/dVnPOjOILAV7FvvggwArgD8aYDFcGppSqhE7/BOEtIagOWd2fZ8zSGnQ33XjFvyat/KFVvRpXHJKens7s2bM5cuQIrVq1YtiwYbpmkwKc6+L7GNgBjHN8vhv4BBjtqqCUUpVMejIs+C1m3wL23DaPNjHdCOj7NPcHHaFH89JneLDZbKxfv56lS5fi5eXFqFGjaN++vbaa1CXOJKhmxpgxxT7/XkSSXBSPUqoyycuElX+Dde+B1Yc1UU/w0IxTzI/IpHFoIGPjG5V62OnTp5k9ezbHjh2jZcuWDBs2jBo1rmxdqerNmQSVLSI9jTGr4dKDu9muDUsp5fEK8uDfPeHMATJbjyVw6Bu0kVr8OTmdyNoBpR5is9lYs2YNK1aswMfHR+81qXI5k6AeA6Y47kUJcAb7YoVKqero/HEIbgBePuR3fYJHF2bhU3AT/1ejHqHAiJgGpR528uRJZs+eTWpqKm3btuXWW2/Ve02qXM6M4ksCYkQk2PH5yse9lVJVn6M7z6x9l/39P6RFzzF4d32AiSEnaV0vuMzDCgoKWLlyJWvWrMHf35+xY8fStm3bCgxcVVblLfl+lzFmqog8V2I7AMaYt10cm1LKU+ydDz++ABmHOdJoBBPm5PJ+g3S6Ng2lf+u6ZR52+PBhfvjhB9LS0oiJiWHQoEEEBJTe/adUSeW1oIqejivtzqVxQSxKKU/0/ZOw+TNya7XEd9I86jbsygtbjtGpca0yD8nLy2PJkiVs2LCBkJAQnUNPXZfylnz/0PF2sTFmTfF9joESSqmqqjAfxAIWK6ZxDz7bY+EbM5LZkd3xFWF858gyD923bx9z584lIyODLl260L9/f3x9fSsweFVVODNI4l2goxPblFJVwdFN8MNTHG4yjoaDnsIacwctggbylp93uaPtLl68yIIFC9ixYwfh4eHcf//9NGpU+jBzpZxR3j2o7sBNQHiJ+1DBgC5fqVRVk3sBlr4J6/9NXkBdXlt5nlvDjjI2vhE3NSt7OXVjDElJSSxcuJD8/Hz69u1Lz549dZVb9bOV14LyAYIcZYrfhzoP3O7KoJRSFezAcsysx+H8caTzg3gP+B2Dt59nWIfSh4wXSU9PZ86cOaSkpBAZGcnw4cMJCys7mSl1Lcq7B7UCWCEinxpjDlVgTEqpiiYWTub68GvrG7w78FGCfL0Y1zmkzOIFBQWsXr2a1atX4+XlxbBhw+jYsaM+cKtuKGfuQWU51oNqB/gVbTTG6HIbSlVWxkDSNLLTD2N6v0BAk96k372U8edyCfQpv2suJSWFOXPmkJ6eTnR0NLfccos+cKtcwpkE9QUwAxgGPArcC5x2ZVBKKRc6cwB+eAYOrmAH7ViaN5xfDYmmXURt2kWUfVhWVhaLFi0iKSmJmjVr6tBx5XLOJKhQY8xHIvJ0sW6/Fa4OTCl1gxUWQMIHmGVvIRYvGPo2SVl9GNmqTrmHGWPYsmULixcvJjc3l549e9K7d2+8va9c10mpG8mZBJXv+JoqIkOB40A5f2cppTzSuUMULvkDKwpjaHX/hzRs3JyHrnLIyZMnmTt3LkeOHCEyMpKhQ4dSp075CU2pG8WZBPWGY6LYX2J//ikYeNalUSmlboyCXMzuOeS0ug3/0Gak372UldssdApvXO5heXl5LF++nISEBPz8/Bg5ciQxMTE6CEJVKGcmi53jeJsBXNPy7yKSAlwACoECY0z8tQaolLpORzZgZj+BpO3ln5F5vHT/BOo06cBrTco+xBjD7t27WbBgAefPnycuLo6BAwfq/HnKLcp7UPddyplzzxjzlJPX6GeMSbvWwJRS1yn3IrYlr2PZ8CES3JD5Me/SsF53jDHltoDS09OZN28eycnJ1K1bl9tvv11nglBuVV4LKrHColBK3RjGkPPfW/E7vY1Tre+izqg/Mdi3/JVq8/PzWbVqFWvXrsXLy4vBgwfTuXNnLBZLBQWtVOnKe1B3yg04vwEWiogBPjTGTL4B51RKlZR1BuMbjFi9oPcLvL46jaE3jaJOOcnJGMOePXtYsGABGRkZdOjQgZtvvlmfaVIeQ4wpf+UMEVlGKV19zjyoKyINjDHHRaQOsAh40hizskSZh4GHASIjIzsdOqSTVijlNGNg+9fk/PAC0/0ncM8zb2GxXH0gQ1paGvPnzyc5OZk6depw6623EhUV5fp4lSqFiGwqbYyCM6P4ni/23g8YAxQ4c1FjzHHH11Mi8h3QBVhZosxkYDJAfHy8rjOllLPOHMTMfQ5JXkpWzfYcDe5IZl4BNfzKfj4pLy+PFStWkJCQgLe3t3bnKY/mzCi+TSU2rXHmQV0RCQQsxpgLjveDgD9cX5hKqeKy1k/BOv8FLFYvvG/9K7Xi7+dla9k/zsYYtm/fzuLFi7lw4QKxsbEMGDBAu/OUR7tqghKR2sU+WoBOQD0nzl0X+M4xasgLmGaMmX89QSql7IzNhlgs+IVFkegbT2r31xjZtQvldeqlpqYyb948jhw5Qv369Rk3bhwREfqsvfJ8znTxbcJ+D0qwd+0dBB642kHGmANAzM+KTilll3WGY9+8xIbUAgY/8x/8m/Wh8696lztsPDMzkyVLlrBlyxYCAwMZMWIEsbGx+rCtqjSc6eIr57E+pZRL2WyYpC+Qxa/SIPscNr/bSLuQQ6PQwDITTWFhIRs3bmT58uXk5+fTrVs3+vTpg5+fX6nllfJUznTx+QGPAz2xt6RWA/9njMlxcWxKVWv5J/dy5NP7aZq9Axp1RYa+zei67cpMTMYY9u3bx8KFC0lPT6dZs2YMHjxYFxBUlZYzXXyfYZ+u6F3H5wnA58BYVwWlVHVWaDNYLYK31ULt/BMsafUqA8Y/AxZLmfeaTp8+zYIFC0hOTiY0NJQJEybQokUL7c5TlZozCaqVMab4vaRlIrLVVQEpVW3ZbOxd9B/2blxMt6c+p05YC0Je2sUAL98yD8nKymL58uUkJibi4+PDLbfcQufOnbFay190UKnKwJkEtUVEuhljEgBEpCuwxrVhKVV9GGPIO7IF34W/otXRDVh9WpN5IQOC/ZAyklNhYSEbNmxg5cqV5Obm0qlTJ/r166eTuqoqxZkE1RW4R0QOOz5HArtFZDtgjDEdXBadUlWcLfMMyz54gn6ZP0JgGIz8gOYxE6CMB2eLpidatGgRZ8+epXnz5tx88826RpOqkpxJUINdHoVS1czF3AKCfL2wCHTLS2Bv1ETa3PEW+IWUeczx48dZuHAhhw4dIjw8XJdcV1WeM8PMD4lIDNDLsWmVMUbvQSl1nXau+JojS/9LxIPTiG5Um8AXttPGJ7DM8ufOnWPp0qVs376dgIAAhgwZQqdOnXR6IlXlOTPM/GngIeBbx6apIjLZGPNuOYcppYqx2QwXj+0keMVrtNu/iDq+EeQXngZqQxnJKScnh1WrVrF+/XpEhJ49e9KzZ098fcseNKFUVeJMF98DQFdjTCaAiPwZWMf/hp0rpcqTe5Fl7z1O3ws/YHyDkEFvEN7lEfDyKbV40YO2K1euJDs7m5iYGPr160dISNndf0pVRc4kKMG+ZHuRQsc2pVQ5jp/Lpn6IfSReZ3aSEjWOpre/AUHhpZY3xrBz506WLl3K2bNnadKkCTfffDP169ev4MiV8gzOJKhPgPWO5TIEGAl85NKolKrMjCF55RecWfIvdo+exoDY5gQ/vZbgcp5nOnjwIIsWLSI1NZW6desyceJEmjVrpg/aqmrNmUESb4vIcuxTHQFMMsZscWlUSlVCNpshfc9qwtf+gWZHNxAc2AxLTceMYGUkpxMnTrBkyRL2799PcHAwt912G+3bt9cBEErhXAuqiAA2tHtPqSvlZbHt3TuIvbACE1QPGfEu4bETwVL6jA5nz55l2bJlbN++HT8/PwYOHEjXrl3x8rqWH0mlqjZnRvG9gn3evW+wJ6dPROQrY8wbrg5OKU+373gajcJr4eftT6MQb3Y1+AWtR/0G8St9IcDMzExWrlxJYmIiFouFHj160KNHD/z9/Ss4cqU8nxhT/irrIrIbiCuavVxE/IHNxpg2NzqY+Ph4k5iYeKNPq9SNl5dJ2uJ3YP2HLOvzFWP7dwNjoIx7Rjk5Oaxbt46EhATy8/OJi4ujT58+BAcHV3DgSnkeEdlkjIkvud2Z/oQUwA8oWl7DF0i+caEpVXkknzxH7oYptN37PmEXT3KkXn8GtXYsZ1FKcsrPz2fjxo2sXr2a7Oxs2rZtS79+/XQJDKWc4EyCygV2isgi7OtB3QysFpF/ARhjnnJhfEp5joJc/P7bm2b5hzARXZBxn9EoslupRQsLC9myZQsrV67kwoULNGvWjP79+9OgQYMKDlqpysuZBPWd41VkuWtCUcrzpF/M5Zsf5zNmyGBCg3wJ6jSOjDrtCIm7rdQWk81mY/v27axYsYKzZ88SERHB6NGjiYqKqvDYlarsrnoPqiLpPSjlUY5uImve7wg4toZV/b6iV59BZRY1xrB7926WLVtGWloa9erVo1+/frpooFJO+Dn3oJSqVqb9MJ9OBz6g1dkVBASEkdn/TXrd1KfUskXLrC9btowTJ04QFhbG2LFjadOmjSYmpX4mTVBKATn5hfh5WyEvi1FJD4KxYfr+Bun+OIG+Na4ob4whOTmZZcuWcfz4cWrVqqUP2Sp1g2mCUtXexm07SPjuPW599C80rxuM74TPsTSIgYDaV5Q1xnDw4EGWL1/OkSNHCAkJYfjw4cTExOgy60rdYGUmKBH5AfuovVIZY0a4JCKlKsD5nHwyz56k/rb/I37jf+lo8jlx9n6o2wVL835XlDfGkJKSwooVKzh06BDBwcEMHTqUuLg4TUxKuUh5Lai/Ob6OBuoBUx2fJ2B/NkqpSsmWm8m3f3+W8QXfA7lIhzuw9v0VDWtFXVG2ZGKqUaMGgwcPplOnTjotkVIuVuZPmDFmBYCIvG6M6V1s1w8istLlkSl1A53PyWfetuOM6xyJxerFOO/V5EX0w3/IaxDe6orypSWmW2+9lY4dO2piUqqCOPOTFi4iTY0xBwBEpAlQ+oI2Snmiwnx2ff8PWu6Yzu56P9I2si4BTyWA35XTDBljOHDgACtXruTw4cOamJRyI2d+4p4FlovIAcfnKOARl0Wk1A2Qk1/Ih8t/YmDhatrtfY9uZ1PIrB9PYHCevUCJ5GSMYf/+/axcuZKjR48SHBysiUkpN3NmPaj5ItICaO3YtMcYk+vsBUTECiQCx4wxw64vTKWcY4xBRPDKTmPYuvE0sx2Ceu3hzq8IbHHzFbM/GGPYu3cvq1at4vjx44SEhDBs2DBiYmI0MSnlZuWN4htdxq5mIoIx5lsnr/E0sBvQaZuVS32z6Sg/rtnEh78YjleNOjRu0xnavAptR0GJZ5NsNhu7du1i1apVnDp1ilq1ajFixAg6dOigo/KU8hDl/Yk4vJx9BrhqghKRCGAo8Cbw3LWFptTV5eQXIgK+p3fQZ+NvGXp2IxlpmwitG4HX2I+uKF9YWMj27dtZvXo16enphIWFMWrUKKKjo/UBW6U8THmj+CaJiAW43Rgz8zrP/w/gReDKR/EdRORh4GGAyMjI67yMqo5OXcjhsX99xV9rz6HpyfmE+dWEgb/Fr3boFWXz8/PZsmULa9euJSMjg3r16umUREp5uHI72Y0xNhF5ArjmBCUiw4BTxphNItK3nGtMBiaDfbLYa72Oql4KbYbk0xdpWbcG4eYMMwuegXRv6PVLuOkp8K95WfmcnBw2btxIQkICWVlZNGrUiCFDhugkrkpVAs7cBV4kIs8DM4DMoo3GmDNXOa4HMEJEhmBf8DBYRKYaY+667mhVtfenbxM4u2Mhr7z0G4KDG2Ad8U9ofjPUqHtZuYsXL7J+/Xo2btxIbm4uzZs3p2fPnjRu3NhNkSulrpUzS74fLGWzMcY0dfoi9hbU81cbxafLbajSrN2fRuswb2rv+ITCVW8jeRfh6W1YakZcUfbMmTOsXbuWpKQkCgsLadu2LT179qR+/fpuiFwp5YzrXm7DGNPENSEpdXVH0s7z/Sd/on3gbMg7hbX5zTDgFSiRnFJTU1mzZg27du3CYrEQExPDTTfdRGjolfejlFKVw1UTlIh4A48BRdMdLQc+NMbkO3sRY8xydCVe5aTk0xfZdOgs4+Ib0cgnkzf9PkPCO8DNn0BUz0vlimZ9WLt2LQcOHMDHx4fu3bvTrVs3atQoc1yOUqqScOYe1P8B3sAHjs93O7Y96KqgVPW2Yv5X+CfP52L0VIKC62N9dBWEtbz0kG1hYSG7du1izZo1nDx5kqCgIAYMGEB8fDx+fn5ujl4pdaM4k6A6G2Niin1eKiJbXRWQqn7O5+Tz/rL93NXoDI02/4X7DyynsEYE1vx08Kt3aTLX3NxctmzZQkJCAhkZGYSFhTFixAjat2+vsz4oVQU581NdKCLNjDHJACLSFCh0bViqOinIOEHH9c/QaH0C+NeGW/6INf5+8La3hs6fP8/69evZtGkTubm5REZGcuutt9KyZUsdKq5UFeZMgnoBWOaYLFaAxsAkl0alqrw5246TsP8kb4yOo3at2gysdQravwg3PXlpItcTJ06wbt06duzYgTGGtm3b0r17dxo2bOjm6JVSFaG8ufieAdYAK4AWQCvsCeqaJotVqkjRIw2SdYaIDW/yYOoqLg5eT1BAINYnE8FixRjDT3v3kpCQQEpKCt7e3nTu3JmuXbtSq1YtN9dAKVWRymtBRQD/xD6L+TZgLfaEdQTQBKWuSWpGNr/6YjWv111J472fEJOfCTETEMkF/MkrKGTr1s2sX7+e9PR0goODGThwIB07dsTf39/d4Sul3KC8ufieBxARHyAeuAm4H/iPiJwzxrStmBBVZZaTX4ift5XQnMO8d/p+gk+dhzbDkf6/g/BWZGRksHHNYjZt2kROTg4NGjRgzJgxtGnTRmcVV6qac+YelD/2pTJCHK/jwHZXBqWqhr/+uIODuxJ577l78QlvgXencRB3J6ZBR44ePcr6r79m165dALRp04auXbvSqFEjHfiglALKvwc1GWgHXADWY+/ie9sYc7aCYlOVUGpGNuEBXnjt/o7Hd76ONecseZkj8atRi8LBf2bXrl2s//G/HD9+HD8/P7p3707nzp2pWbOmu0NXSnmY8lpQkYAvsA84BhwFzlVATKqS2nfiPP947x3eqvk9IRf3E1g3Gkb8hQvGSsLy5SQmJpKZmUloaChDhgwhJiYGHx8fd4etlPJQ5d2DGiz2vpZ22O8//RKIFpEzwDpjzKsVFKPyYOkXc0k+nUmXJrVpbkvmfa+3yfduhhnzEcdCurAhMZGdM/+JzWajRYsWdO3alaZNm2o3nlLqqq62HpQBdojIOSDD8RoGdAE0QSk++vwzvNN2EPebd/BuEEf+HTPZkRnGxnWbSE39BF9fXzp37kyXLl2oXbu2u8NVSlUi5d2Degp7y6kHkI99iPk64GN0kES1dTYzj0/WHOThJqcJWvMnXjy5ivwaEWSeOc3GpG1s2bKV7OxswsPDGTp0KB06dNBuPKXUdSmvBRUFfA08a4xJrZhwlKdLO7SDTqufJmjtNkxAHfZ3+j0bz4ex74N/IyK0bt2aLl260LhxY+3GU0r9LOXdg3quIgNRnskYwxtzdxNoyeO5IbG0qB9KvaBzrGn4GxLTfDm3OYPAwAJ69epFp06dCAkJcXfISqkqQqeAVqXKyMonJMAbOZzAHXtexiZeHI7+D5s2bWZn3ngK9+fQuHFdBg68mdatW+tDtUqpG04TlLrC7C1Hmf3tF3wQuRyOJXLWpzObfLpz6hP7oIeOHTsSHx9PnTp13B2qUqoK0wSlAPsqtl4WoXFoIH0uzCXe+hELTnVlp9cT5OdD/bC6DO8fT3R0tA56UEpVCE1QipycbD56/480bBBB146d2bSzkBMyEW/xpl10Ozp37kyDBg3cHaZSqprRBFVNbT+awcrtyTxeYxVpa2fSjfrsOOHF3LlzqVu3LkOGDKF9+/a6hLpSym00QVVTaUvfJfrACv5Na07JILy9LbSL7kB8fDwNGjTQIeJKKbfTBFVNnDqfw3tTZxLfpjkFZ0+w65CNQulJg7AQhnXrRXR0NL6+vu4OUymlLtEEVcWdz8rG7PyB3avmE3o+hC2nD+Lr60tcx0506tSJevXquTtEpZQqlSaoKqogL4+ZH7xKTkY6R019jDQmKtSbfjcNoE2Hjnh7e7s7RKWUKpcmqCrEGMOSFSvIycxi184dZGf7EShhdG/dgE4DRlM7LNzdISqllNM0QVUBmefS2L5kBpt3H+R0YQ1ELLRt24bY9m1p2qI1FovF3SEqpdQ10wRVSRUWFrI3aT0rFn5PWp4vNizUt9qIbeBN39EPEhKqszwopSo3TVCViDGGrbt+YtOmDZw5eYKsrCwCsdHMN52BtwynTuwg0OHhSqkqwmUJSkT8gJXYl433Ar7WVXivXW5BIQm7j2JNTWJb0mZOZ1sQY6NV23Z0jIujSYMwvAJruTtMpZS64VzZgsoF+htjLoqIN7BaROYZYxJceM0q4eT5HAKshgP7f2LZ4vlkXMgGERpxgkFhFup3upXGXYfrw7RKqSrNZQnKsVz8RcdHb8fLuOp6lZ3NZgDDj2uSWLhoIeE+BdgKCwnxhe4+u4mJ60zdXq9DkN5bUkpVDy69ByUiVmAT0Bx43xizvpQyDwMPA0RGRroyHI90PjuPR/69iK41zlBwOoXMPBsRlmyaNaxPl4Gjiagbhnj5go7EU0pVMy5NUMaYQiBWRGoC34lItDFmR4kyk4HJAPHx8dWihbV0z0mOnzhNQ3Oa7du20vp8BhfPF9DKHKB9zSxadB2MNXYc+Ou9JaVU9VUho/iMMedEZDkwGNhxleJV0rmsPCwFOezYsYMVy1djyc/mgAhNoqLoxUbaRNXHr/PzUD9WR+IppRSuHcUXDuQ7kpM/MBD4s6uu56mysrL4ZO4q9uzYRpglC4AIc4J23odp/4vPqVGzNpi7NSkppVQJrmxB1QemOO5DWYCZxpg5LryexziensHHc9dSp+AUJ44ewhhDa8sZos1uomvlEdppJLR/GUJq2w/Q5KSUUldw5Si+bUCcq87vac5dzGL7zj0cP/gT+/b9RKHNcMbXh5tuuonoul7UPTQHifsjNOioCUkppZygM0n8DPn5+fz000/s3LmTnbv3YMEQJDnE23bSznKAiAHPIp0H2gu37+vWWJVSqrLRBHWN8vPz2bdvHwtWJ3LuxCEsxkZgYCDxll20L9xOZKMoLDHjoO0IHYWnlFI/gyYoJ+Tl5bF1525WbEgiL+0o+QUF+Eke0Ryi3R2v0rpFMywHlkFYS6jZyN3hKqVUlaAJqgy5ubns3L2XvXt2c/BAMvn5+XibXDrIXtqZvTSu6Yulwxho2sj+EG3zAe4OWSmlqhRNUMVkZ2fz008/sWvXLpKTkyksLMTq7UNcTAyt/c/ScPOf8I25HYl+Bep10MEOSinlQtU+QV28eJE9e/awZ88ekpMPAIZgax7xhbtoY/Zijb2PiCFDwVYI/SZqUlJKqQpSLRPU2bNn2bNnD+s2b+NC2gkAateqSVc2E2120zDQB2l3G7R72T4sHMBidV/ASilVDVWLBGWM4eTJk6zfsp0dO3dTkHkWgNqWi7QmlZse+isR9eshSaFQt51ON6SUUh6gyiYom83Gnv0HWLlxG9mnj3A+4xwAtU06ndhBa/ZTs1Y9pN1tSP169oQUd5d7g1ZKKXVJlUpQF7Kymb92K7lpRzh++CDZ2dlgDCHh9Rg2bBhNzq+nxu5FeEePhDYjILyVu0NWSilVhiqVoD6b8ilpp07hZTG09TlBK5NIM1Kw9vkIr+hOYDpCv8fdHaZSSiknVKkENbBbDD6zHyay8BjW2h2h3X3QduT/Hp7V+0pKKVVpVKkE1SruJpDfQlRPndFBKaUquSqVoACIneDuCJRSSt0AFncHoJRSSpVGE5RSSimPpAlKKaWUR9IEpZRSyiNpglJKKeWRNEEppZTySJqglFJKeSRNUEoppTySGGPcHcMlInIaOPQzTxMGpN2AcDyJ1snzVbX6gNapsqgKdWpsjAkvudGjEtSNICKJxph4d8dxI2mdPF9Vqw9onSqLqlinItrFp5RSyiNpglJKKeWRqmKCmuzuAFxA6+T5qlp9QOtUWVTFOgFV8B6UUkqpqqEqtqCUUkpVAZqglFJKeSSPT1Ai8rGInBKRHcW2xYjIOhHZLiI/iEiwY3uUiGSLSJLj9e9ix3RylN8vIv8Scd/679dSJ8e+Do59Ox37/RzbK2WdRGRisX+jJBGxiUisY19lrZO3iExxbN8tIr8udoxH1Oka6+MjIp84tm8Vkb7FjvGI+jhiaSQiyxzf850i8rRje20RWSQi+xxfaxU75teO2PeKyC3FtntEva61TiIS6ih/UUTeK3Euj6jTdTPGePQL6A10BHYU27YR6ON4fz/wuuN9VPFyJc6zAegOCDAPuLWS1MkL2AbEOD6HAtbKXKcSx7UHDlSBf6c7gemO9wFAChDlSXW6xvr8AvjE8b4OsAmweFJ9HLHUBzo63tcAfgLaAn8BXnJsfwn4s+N9W2Ar4As0AZI97efpOuoUCPQEHgXeK3Euj6jT9b48vgVljFkJnCmxuRWw0vF+ETCmvHOISH0g2Bizztj/1T4DbrvBoTrtGus0CNhmjNnqODbdGFNYyetU3ATgS6j0/04GCBQRL8AfyAPOe1KdrrE+bYEljuNOAeeAeE+qjyO2VGPMZsf7C8BuoCEwEpjiKDaF/8U4EvsfErnGmIPAfqCLJ9XrWutkjMk0xqwGcoqfx5PqdL08PkGVYQcwwvF+LNCo2L4mIrJFRFaISC/HtobA0WJljjq2eZKy6tQSMCKyQEQ2i8iLju2VuU7FjceRoKjcdfoayARSgcPA34wxZ/D8OpVVn63ASBHxEpEmQCfHPo+tj4hEAXHAeqCuMSYV7L/wsbcCwR7rkWKHFcXvkfVysk5l8cg6XYvKmqDuB34hIpuwN4HzHNtTgUhjTBzwHDDN0adeWr+rp42vL6tOXtib7xMdX0eJyAAqd50AEJGuQJYxpuieSGWuUxegEGiAvevolyLSFM+vU1n1+Rj7L7RE4B/AWqAAD62PiAQB3wDPGGPOl1e0lG2mnO1ucw11KvMUpWxz+7/VtfBydwDXwxizB3vXFyLSEhjq2J4L5DrebxKRZOwtkKNARLFTRADHKzLmqymrTthjX2GMSXPs+xH7fYSpVN46FbmD/7WeoHL/O90JzDfG5AOnRGQNEA+swoPrVM7PUgHwbFE5EVkL7APO4mH1ERFv7L/IvzDGfOvYfFJE6htjUh1dXacc249yeUu+KH6P+r93jXUqi0fV6XpUyhaUiNRxfLUALwP/dnwOFxGr431ToAX2G/CpwAUR6eYYxXIPMNstwZehrDoBC4AOIhLguL/RB9hVyetUtG0sML1oWyWv02Ggv9gFAt2APZ5ep3J+lgIc9UBEbgYKjDEe9//OEcNHwG5jzNvFdn0P3Ot4fy//i/F74A4R8XV0XbYANnhSva6jTqXypDpdN3eP0rjaC/tf2KlAPva/CB4AnsY+suUn4E/8b0aMMcBO7P3nm4Hhxc4Tj72/PRl4r+gYT6+To/xdjnrtAP5SRerUF0go5TyVsk5AEPCV499pF/CCp9XpGusTBezFfoN+MfblEDyqPo5YemLvttoGJDleQ7CPdl2CvdW3BKhd7JjfOmLfS7FRbZ5Sr+usUwr2ATAXHf+2bT2pTtf70qmOlFJKeaRK2cWnlFKq6tMEpZRSyiNpglJKKeWRNEEppZTySJqglFJKeSRNUEq5kOO5qNUicmuxbeNEZL4741KqMtBh5kq5mIhEY39GKg6wYn+uZbAxJvk6zmU1xhTe2AiV8kyaoJSqACLyF+yTyQY6vjbGvtSIF/CaMWa2Y2LQzx1lAJ4wxqwV+1pMr2J/yDbWGNO2YqNXyj00QSlVARzTBm3GPhnrHGCnMWaqiNTEvmZPHPbZA2zGmBwRaQF8aYyJdySouUC0sS8RoVS1UCkni1WqsjHGZIrIDOxT0YwDhovI847dfkAk9ok83xP76sKF2Cc6LrJBk5OqbjRBKVVxbI6XAGOMMXuL7xSR14CTQAz2AUzFF6DLrKAYlfIYOopPqYq3AHjSMcM0IhLn2B4CpBpjbMDd2AdUKFVtaYJSquK9DngD20Rkh+MzwAfAvSKSgL17T1tNqlrTQRJKKaU8kraglFJKeSRNUEoppTySJiillFIeSROUUkopj6QJSimllEfSBKWUUsojaYJSSinlkf4fBVgsPxBoUg8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results = run_simulation2(system)\n", + "plot_results(results, 'Proportional model')" + ] + }, + { + "cell_type": "markdown", + "id": "optical-republican", + "metadata": {}, + "source": [ + "The proportional model fits\n", + "the data well from 1950 to 1965, but not so well after that. Overall,\n", + "the **quality of fit** is not as good as the constant growth model,\n", + "which is surprising, because it seems like the proportional model is\n", + "more realistic.\n", + "\n", + "In the next chapter we'll try one more time to find a model that makes\n", + "sense and fits the data. But first, I want to make a few more\n", + "improvements to the code." + ] + }, + { + "cell_type": "markdown", + "id": "requested-package", + "metadata": {}, + "source": [ + "## Factoring out the update function\n", + "\n", + "`run_simulation1` and `run_simulation2` are nearly identical except for the body of the `for` loop, where we compute the population for the next year.\n", + "\n", + "Rather than repeat identical code, we can separate the things that\n", + "change from the things that don't. First, I'll pull out the update code from `run_simulation2` and make it a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "found-prediction", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func1(pop, t, system):\n", + " births = system.birth_rate * pop\n", + " deaths = system.death_rate * pop\n", + " return births - deaths" + ] + }, + { + "cell_type": "markdown", + "id": "excellent-trinity", + "metadata": {}, + "source": [ + "This function takes as arguments the current population, current year,\n", + "and a `System` object; it returns the net population growth during the current year.\n", + "\n", + "This update function does not use `t`, so we could leave it out. But we will see other functions that need it, and it is convenient if they all take the same parameters, used or not.\n", + "\n", + "Now we can write a function that runs any model:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "extended-investing", + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, growth_func):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "comprehensive-proposal", + "metadata": {}, + "source": [ + "This function demonstrates a feature we have not seen before: it takes a\n", + "function as a parameter! When we call `run_simulation`, the second\n", + "parameter is a function, like `growth_func1`, that computes the\n", + "population for the next year.\n", + "\n", + "Here's how we call it:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "arbitrary-python", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func1)" + ] + }, + { + "cell_type": "markdown", + "id": "incident-cancellation", + "metadata": {}, + "source": [ + "Passing a function as an argument is the same as passing any other\n", + "value. The argument, which is `growth_func1` in this example, gets\n", + "assigned to the parameter, which is called `growth_func`. Inside\n", + "`run_simulation`, we can run `growth_func` just like any other function.\n", + "\n", + "Each time through the loop, `run_simulation` calls `growth_func1` to compute net growth, and uses it to compute the population during the next year." + ] + }, + { + "cell_type": "markdown", + "id": "acknowledged-short", + "metadata": {}, + "source": [ + "## Combining birth and death\n", + "\n", + "We can simplify the code slightly by combining births and deaths to compute the net growth rate. \n", + "Instead of two parameters, `birth_rate` and `death_rate`, we can write the update function in terms of a single parameter that represents the difference:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "impressed-laundry", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = system.birth_rate - system.death_rate" + ] + }, + { + "cell_type": "markdown", + "id": "veterinary-heading", + "metadata": {}, + "source": [ + "The name of this parameter, `alpha`, is the conventional name for a\n", + "proportional growth rate.\n", + "\n", + "Here's the modified version of `growth_func1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "floating-singer", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func2(pop, t, system):\n", + " return system.alpha * pop" + ] + }, + { + "cell_type": "markdown", + "id": "instant-motion", + "metadata": {}, + "source": [ + "And here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "professional-business", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func2)" + ] + }, + { + "cell_type": "markdown", + "id": "ordinary-exhibition", + "metadata": {}, + "source": [ + "The results are the same as the previous versions, but now the code is organized in a way that makes it easy to explore other models." + ] + }, + { + "cell_type": "markdown", + "id": "satellite-money", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter, we wrapped the code from the previous chapter in functions and used a `System` object to store the parameters of the system.\n", + "\n", + "We explored a new model of population growth, where the number of births and deaths is proportional to the current population. This model seems more realistic, but it turns out not to fit the data particularly well.\n", + "\n", + "In the next chapter, we'll try one more model, which is based on the assumption that the population can't keep growing forever.\n", + "But first, you might want to work on some exercises." + ] + }, + { + "cell_type": "markdown", + "id": "north-bicycle", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "communist-cycle", + "metadata": {}, + "source": [ + "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", + "\n", + "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use.\n", + "\n", + "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "silver-farming", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def growth_func3(pop, t, system):\n", + " \"\"\"Compute the population next year.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " if t < 1980:\n", + " return system.alpha1 * pop\n", + " else:\n", + " return system.alpha2 * pop" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "capable-texas", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "system.alpha1 = 19 / 1000\n", + "system.alpha2 = 15 / 1000\n", + "\n", + "results = run_simulation(system, growth_func3)\n", + "plot_results(results, \n", + " 'Proportional model, parameter changes over time')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "popular-ireland", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# Using two parameters, we can make the model fit the data better.\n", + "# But it still seems like the shape of the function is not right." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "indian-sitting", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap07.ipynb b/jupyter/chap07.ipynb new file mode 100644 index 00000000..648f2181 --- /dev/null +++ b/jupyter/chap07.ipynb @@ -0,0 +1,907 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "dutch-anime", + "metadata": {}, + "source": [ + "# Chapter 7" + ] + }, + { + "cell_type": "markdown", + "id": "legitimate-middle", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "smart-vault", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "nervous-associate", + "metadata": {}, + "source": [ + "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", + "\n", + "There are a few things we could try to improve the model:\n", + "\n", + "- Maybe net growth depends on the current population, but the\n", + " relationship is quadratic, not linear.\n", + "\n", + "- Maybe the net growth rate varies over time.\n", + "\n", + "In this chapter, we'll explore the first option.\n", + "In the exercises, you will have a chance to try the second. " + ] + }, + { + "cell_type": "markdown", + "id": "configured-custom", + "metadata": {}, + "source": [ + "Here's the code that reads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "retired-essence", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "italic-remains", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "automated-impossible", + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9" + ] + }, + { + "cell_type": "markdown", + "id": "chinese-bundle", + "metadata": {}, + "source": [ + "And here are the functions from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "incoming-clause", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "def run_simulation(system, growth_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " growth_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "worst-referral", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import plot, decorate\n", + "\n", + "def plot_results(timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, style=':', label='US Census')\n", + " plot(un, style='--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ] + }, + { + "cell_type": "markdown", + "id": "funky-bristol", + "metadata": {}, + "source": [ + "## Quadratic growth\n", + "\n", + "It makes sense that net growth should depend on the current population, but maybe it's not a linear relationship, like this:\n", + "\n", + "```\n", + "net_growth = system.alpha * pop\n", + "```\n", + "\n", + "Maybe it's a quadratic relationship, like this:\n", + "\n", + "```\n", + "net_growth = system.alpha * pop + system.beta * pop**2\n", + "```\n", + "\n", + "We can test that conjecture with a new update function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "coastal-crazy", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func_quad(pop, t, system):\n", + " return system.alpha * pop + system.beta * pop**2" + ] + }, + { + "cell_type": "markdown", + "id": "closing-wrist", + "metadata": {}, + "source": [ + "Here's the `System` object we'll use, initialized with `t_0`, `p_0`, and `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "formed-touch", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "t_0 = census.index[0]\n", + "p_0 = census[t_0]\n", + "t_end = census.index[-1]\n", + "\n", + "system = System(t_0=t_0,\n", + " p_0=p_0,\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "id": "single-punishment", + "metadata": {}, + "source": [ + "Now we have to add the parameters `alpha` and `beta` .\n", + "I chose the following values by trial and error; we'll see better ways to do it later." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "equivalent-monster", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = 25 / 1000\n", + "system.beta = -1.8 / 1000" + ] + }, + { + "cell_type": "markdown", + "id": "incoming-cradle", + "metadata": {}, + "source": [ + "And here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "prescription-assurance", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func_quad)" + ] + }, + { + "cell_type": "markdown", + "id": "toxic-european", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "instant-malawi", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(results, 'Quadratic model')" + ] + }, + { + "cell_type": "markdown", + "id": "unexpected-davis", + "metadata": {}, + "source": [ + "The model fits the data well over the whole range, with just a bit of space between them in the 1960s.\n", + "\n", + "Of course, we should expect the quadratic model to fit better than the\n", + "constant and proportional models because it has two parameters we can\n", + "choose, where the other models have only one. In general, the more\n", + "parameters you have to play with, the better you should expect the model\n", + "to fit.\n", + "\n", + "But fitting the data is not the only reason to think the quadratic model\n", + "might be a good choice. It also makes sense; that is, there is a\n", + "legitimate reason to expect the relationship between growth and\n", + "population to have this form.\n", + "\n", + "To understand it, let's look at net growth as a function of population." + ] + }, + { + "cell_type": "markdown", + "id": "opened-paint", + "metadata": {}, + "source": [ + "## Net growth\n", + "\n", + "Let's plot the relationship between growth and population in the quadratic model.\n", + "\n", + "I'll use `linspace` to make an array of 101 populations from 0 to 15 billion." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "wanted-malta", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "pop_array = linspace(0, 15, 101)" + ] + }, + { + "cell_type": "markdown", + "id": "exempt-techno", + "metadata": {}, + "source": [ + "Now I'll use the quadratic model to compute net growth for each population." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "reduced-creature", + "metadata": {}, + "outputs": [], + "source": [ + "growth_array = (system.alpha * pop_array + \n", + " system.beta * pop_array**2)" + ] + }, + { + "cell_type": "markdown", + "id": "color-surfing", + "metadata": {}, + "source": [ + "I'll put the results in a `Series` with `pop_array` and the index and `growth_array` as the values." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "powered-productivity", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import Series\n", + "\n", + "growth_series = Series(growth_array, index=pop_array)" + ] + }, + { + "cell_type": "markdown", + "id": "spare-complexity", + "metadata": {}, + "source": [ + "Now we can plot the `Series` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "growing-butler", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot(growth_series, label='growth')\n", + "\n", + "decorate(xlabel='Population (billions)',\n", + " ylabel='Net growth (billions)',\n", + " title='Growth vs. Population')" + ] + }, + { + "cell_type": "markdown", + "id": "placed-conservative", + "metadata": {}, + "source": [ + "Note that the x-axis is not time, as in the previous figures, but population. We can divide this curve into four regimes of behavior:\n", + "\n", + "- When the population is less than 3-4 billion, net growth is\n", + " proportional to population, as in the proportional model. In this\n", + " regime, the population grows slowly because the population is small.\n", + "\n", + "- Between 4 billion and 10 billion, the population grows quickly\n", + " because there are a lot of people.\n", + "\n", + "- Above 10 billion, population grows more slowly; this behavior models\n", + " the effect of resource limitations that decrease birth rates or\n", + " increase death rates.\n", + "\n", + "- Above 14 billion, resources are so limited that the death rate\n", + " exceeds the birth rate and net growth becomes negative.\n", + "\n", + "Just below 14 billion, there is a point where net growth is 0, which\n", + "means that the population does not change. At this point, the birth and death rates are equal, so the population is in **equilibrium**." + ] + }, + { + "cell_type": "markdown", + "id": "spread-ranking", + "metadata": {}, + "source": [ + "## Equilibrium\n", + "\n", + "To find the equilibrium point, we can find the roots, or zeros, of this equation: \n", + "\n", + "$$\\Delta p = \\alpha p + \\beta p^2$$ \n", + "\n", + "where $\\Delta p$ is net\n", + "population growth, $p$ is current population, and $\\alpha$ and $\\beta$\n", + "are the parameters of the model. We can rewrite the right hand side like\n", + "this: \n", + "\n", + "$$\\Delta p = p (\\alpha + \\beta p)$$ \n", + "\n", + "which is $0$ when $p=0$ or $p=-\\alpha/\\beta$.\n", + "We can use the parameters of the system to compute the second equilibrium point:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "foreign-emperor", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "13.88888888888889" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "-system.alpha / system.beta" + ] + }, + { + "cell_type": "markdown", + "id": "enormous-casting", + "metadata": {}, + "source": [ + "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", + "\n", + "In the context of population modeling, the quadratic model is more\n", + "conventionally written like this: \n", + "\n", + "$$\\Delta p = r p (1 - p / K)$$ \n", + "\n", + "This is the same model; it's just a different way to **parameterize** it. Given $\\alpha$ and $\\beta$, we can compute $r=\\alpha$ and $K=-\\alpha/\\beta$.\n", + "\n", + "In this version, it is easier to interpret the parameters: $r$ is the\n", + "maximum growth rate, observed when $p$ is small, and $K$ is the\n", + "equilibrium point. $K$ is also called the **carrying capacity**, since\n", + "it indicates the maximum population the environment can sustain." + ] + }, + { + "cell_type": "markdown", + "id": "opened-possession", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter we implemented a quadratic growth model where net growth depends on the current population and the population squared.\n", + "\n", + "This model fits the data well, and we saw one reason why: it is based on the assumption that there is a limit to the number of people the Earth can support.\n", + "\n", + "In the next chapter we'll use the models we have developed to generate\n", + "predictions.\n", + "But first, I want to warn you about a few things that can go wrong when you write functions." + ] + }, + { + "cell_type": "markdown", + "id": "baking-ability", + "metadata": {}, + "source": [ + "## Dysfunctions\n", + "\n", + "When people learn about functions, there are a few things they often\n", + "find confusing. In this section I present and explain some common\n", + "problems.\n", + "\n", + "As an example, suppose you want a function that takes a\n", + "`System` object, with variables `alpha` and `beta`, and computes the\n", + "carrying capacity, `-alpha/beta`. \n", + "Here's a good solution:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "interracial-speed", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ] + } + ], + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "attempted-infection", + "metadata": {}, + "source": [ + "Now let's see all the ways that can go wrong." + ] + }, + { + "cell_type": "markdown", + "id": "detailed-trainer", + "metadata": {}, + "source": [ + "Dysfunction \\#1: Not using parameters. In the following version, the\n", + "function doesn't take any parameters; when `sys1` appears inside the\n", + "function, it refers to the object we create outside the function." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "wooden-collect", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ] + } + ], + "source": [ + "def carrying_capacity():\n", + " K = -sys1.alpha / sys1.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity()\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "settled-scale", + "metadata": {}, + "source": [ + "This version actually works, but it is not as versatile as it could be.\n", + "If there are several `System` objects, this function can only work with one of them, and only if it is named `sys1`." + ] + }, + { + "cell_type": "markdown", + "id": "unnecessary-stack", + "metadata": {}, + "source": [ + "Dysfunction \\#2: Clobbering the parameters. When people first learn\n", + "about parameters, they often write functions like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "committed-better", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ] + } + ], + "source": [ + "# WRONG\n", + "def carrying_capacity(system):\n", + " system = System(alpha=0.025, beta=-0.0018)\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.03, beta=-0.002)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "terminal-wheat", + "metadata": {}, + "source": [ + "In this example, we have a `System` object named `sys1` that gets passed\n", + "as an argument to `carrying_capacity`. But when the function runs, it\n", + "ignores the argument and immediately replaces it with a new `System`\n", + "object. As a result, this function always returns the same value, no\n", + "matter what argument is passed.\n", + "\n", + "When you write a function, you generally don't know what the values of\n", + "the parameters will be. Your job is to write a function that works for\n", + "any valid values. If you assign your own values to the parameters, you\n", + "defeat the whole purpose of functions." + ] + }, + { + "cell_type": "markdown", + "id": "interpreted-perfume", + "metadata": {}, + "source": [ + "Dysfunction \\#3: No return value. Here's a version that computes the\n", + "value of `K` but doesn't return it." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "crude-window", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "# WRONG\n", + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "logical-enemy", + "metadata": {}, + "source": [ + "A function that doesn't have a return statement actually returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause." + ] + }, + { + "cell_type": "markdown", + "id": "concerned-space", + "metadata": {}, + "source": [ + "Dysfunction \\#4: Ignoring the return value. Finally, here's a version\n", + "where the function is correct, but the way it's used is not.\n", + "\n", + "```\n", + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "carrying_capacity(sys1)\n", + "print(K)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "better-karen", + "metadata": {}, + "source": [ + "In this example, `carrying_capacity` runs and returns `K`, but the\n", + "return value doesn't get displayed or assigned to a variable.\n", + "If we try to print `K`, we get a `NameError`, because `K` only exists inside the function.\n", + "\n", + "When you call a function that returns a value, you should do something\n", + "with the result." + ] + }, + { + "cell_type": "markdown", + "id": "metropolitan-blackjack", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "vital-seven", + "metadata": {}, + "source": [ + "**Exercise:** In a previous section, we saw a different way to parameterize the quadratic model:\n", + "\n", + "$$ \\Delta p = r p (1 - p / K) $$\n", + "\n", + "where $r=\\alpha$ and $K=-\\alpha/\\beta$. \n", + "\n", + "Write a version of `growth_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "twelve-amplifier", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.025, 13.88888888888889)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "system.r = system.alpha\n", + "system.K = -system.alpha/system.beta\n", + "\n", + "system.r, system.K" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "yellow-horse", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def growth_func_quad2(pop, t, system):\n", + " return system.r * pop * (1 - pop / system.K)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "animal-drink", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MHr0aPz8/Jx2PK1BXadTp07RuHFjADw9PYmMjPzZNh9++CETJ06kd+/egP26z+23307Dhg3Jzs7mwQcfpHv37nTp0oU5c+YA8PnnnzNu3DhGjBhBq1atePnllwEoLi7mgQceoEOHDnTs2JH33nsPgJiYmAvDRJ0+fZqSMQ137NhBjx49iIqKolOnTuzdu9ep50MpVfXYbDYSEhL497//zYkTJxgzZgz33nsvderUcepxK12CmjA5nm8SjwBQWGxjwuR4vt+cCkBuQTETJsczb8sxAM7nFTJhcjyLth8HICO7gAmT41n200kATmVef9X0ueeeo02bNtx2221Mnjy5zOru9u3b6datW5nvf+uttxg0aBAbN25k5cqVvPTSS2Rn22duT05OZubMmWzbto2ZM2dy5MgRkpOTOXr0KNu3b2fbtm1MmjSp3Pg+/vhjnnnmGZKTk0lMTCQkJOS6y6yUqj5Onz7N559/zuLFiwkPD+fxxx+nS5cuFdLBqtIlqIp2uQ+hZPnrr79OYmIiw4YN46uvvmLEiBFXtf8lS5bwl7/8haioKGJiYsjLy+PwYfvEuIMHD6Z27dr4+fkRGRnJoUOHiIiI4MCBAzz11FMsWrSIWrVqlbv/3r178/bbb/POO+9w6NAhatSocVXxKaWqJ5vNRlxcHJMnTyYtLY1bb72Vu++++4p/c26kSncNauYjvS889/b0uOh1DR/Pi17X8vO+6HW9AJ+LXjeoeeW206CgIM6cOXPRsoyMjItubG3RogWPPfYYv/rVrwgODiY9PZ2goKAL69u3b09SUhJjx4792f5Lrke1adPmouXr16/H19f3wmtPT0+KioqoW7cuW7ZsYfHixXz44YfMmjWLTz/9FC8vL2w2G8BFtbh77rmHnj17smDBAoYPH84nn3zCoEGDrlhupVT1lZaWxpw5czh69Chtw5syMvgYNTt1ggq+LUVrUFcQGBhI48aNWb58OWBPTosWLaJfv34ALFiwgJJZiffu3Yunp+fP2mWffPJJpk6dyvr16y8smzZtGidOnGD48OG8//77F/axefPmcuM5ffo0NpuN8ePH8+abb7Jp0ybAPlVJUlISAN9+++2F7Q8cOEBERARPP/00Y8aMYevWrddxNpRSVVlxcTFr165l8uTJZGRkML5XOHce+T01t38JmScubJdbUMydH8dzJMO5PZEr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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "results = run_simulation(system, growth_func_quad2)\n", + "plot_results(results, 'Quadratic model, alternate parameters')" + ] + }, + { + "cell_type": "markdown", + "id": "early-mortgage", + "metadata": {}, + "source": [ + "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "domestic-ukraine", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "p0_array = linspace(1, 25, 11)\n", + "\n", + "for p_0 in p0_array:\n", + " system.p_0 = p_0\n", + " results = run_simulation(system, growth_func_quad)\n", + " plot(results, label='_nolegend')\n", + "\n", + "decorate(xlabel='Year',\n", + " ylabel='Population (billions)',\n", + " title='Projections with hypothetical starting populations')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "commercial-respondent", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap08.ipynb b/jupyter/chap08.ipynb new file mode 100644 index 00000000..49664fb6 --- /dev/null +++ b/jupyter/chap08.ipynb @@ -0,0 +1,1049 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "sophisticated-translation", + "metadata": {}, + "source": [ + "# Chapter 8" + ] + }, + { + "cell_type": "markdown", + "id": "amino-creation", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "korean-spine", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "rental-constitution", + "metadata": {}, + "source": [ + "In the previous chapter we developed a quadratic model of world\n", + "population growth from 1950 to 2016. It is a simple model, but it fits\n", + "the data well and the mechanisms it's based on are plausible.\n", + "\n", + "In this chapter we'll use the quadratic model to generate projections of future growth, and compare our results to projections from actual\n", + "demographers." + ] + }, + { + "cell_type": "markdown", + "id": "ambient-concentration", + "metadata": {}, + "source": [ + "Here's the code that downloads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "portable-heather", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "markdown", + "id": "brave-championship", + "metadata": {}, + "source": [ + "And reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "apart-waste", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "powerful-heather", + "metadata": {}, + "outputs": [], + "source": [ + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "pending-alliance", + "metadata": {}, + "source": [ + "## Generating Projections" + ] + }, + { + "cell_type": "markdown", + "id": "colored-framework", + "metadata": {}, + "source": [ + "Now let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", + "\n", + "Here's the code we'll need from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "acute-compiler", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "def run_simulation(system, growth_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " growth_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "northern-seafood", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func_quad(pop, t, system):\n", + " return system.alpha * pop + system.beta * pop**2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "stuck-influence", + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "un = table2.un / 1e9" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "covered-suicide", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "t_0 = census.index[0]\n", + "p_0 = census[t_0]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "occasional-denmark", + "metadata": {}, + "outputs": [], + "source": [ + "system = System(t_0=t_0,\n", + " p_0=p_0,\n", + " t_end=2100)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "available-microwave", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = 25 / 1000\n", + "system.beta = -1.8 / 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "arranged-sailing", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func_quad)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "generous-renewal", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Quantity
Time
209612.462519
209712.494516
209812.525875
209912.556607
210012.586719
\n", + "
" + ], + "text/plain": [ + " Quantity\n", + "Time \n", + "2096 12.462519\n", + "2097 12.494516\n", + "2098 12.525875\n", + "2099 12.556607\n", + "2100 12.586719" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import show\n", + "\n", + "show(results.tail())" + ] + }, + { + "cell_type": "markdown", + "id": "promising-fantasy", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "prostate-brush", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import plot\n", + "\n", + "plot(results, color='gray', label='model')" + ] + }, + { + "cell_type": "markdown", + "id": "killing-relief", + "metadata": {}, + "source": [ + "According to the model, population growth will slow gradually after 2020, approaching 12.5 billion by 2100.\n", + "\n", + "I am using the word \"projection\" deliberately, rather than\n", + "\"prediction\", with the following distinction: \"prediction\" implies\n", + "something like \"this is what we should reasonably expect to happen, at\n", + "least approximately\"; \"projection\" implies something like \"if this\n", + "model is actually a good description of what is happening in this\n", + "system, and if nothing in the future causes the parameters of the model to change, this is what would happen.\"\n", + "\n", + "Using \"projection\" leaves open the possibility that there are important things in the real world that are not captured in the model. It also suggests that, even if the model is good, the parameters we estimate based on the past might be different in the future.\n", + "\n", + "The quadratic model we've been working with is based on the assumption\n", + "that population growth is limited by the availability of resources; in\n", + "that scenario, as the population approaches carrying capacity, birth\n", + "rates fall and death rates rise because resources become scarce.\n", + "\n", + "If that assumption is valid, we might be able to use actual population\n", + "growth to estimate carrying capacity, especially if we observe the\n", + "transition into the regime where the growth rate starts to fall.\n", + "\n", + "But in the case of world population growth, those conditions don't\n", + "apply. Over the last 50 years, the net growth rate has leveled off, but not yet started to fall, so we don't have enough data to make a credible estimate of carrying capacity. And resource limitations are probably *not* the primary reason growth has slowed. As evidence, consider:\n", + "\n", + "- First, the death rate is not increasing; rather, it has declined\n", + " from 1.9% in 1950 to 0.8% now (see ).\n", + " So the decrease in net growth is due entirely to declining birth\n", + " rates.\n", + "\n", + "- Second, the relationship between resources and birth rate is the\n", + " opposite of what the model assumes; as nations develop and people\n", + " become more wealthy, birth rates tend to fall.\n", + "\n", + "We should not take too seriously the idea that this model can estimate\n", + "carrying capacity. But the predictions of a model can be credible even\n", + "if the assumptions of the model are not strictly true. For example,\n", + "population growth might behave *as if* it is resource limited, even if\n", + "the actual mechanism is something else.\n", + "\n", + "In fact, demographers who study population growth often use models\n", + "similar to ours. In the next section, we'll compare our projections to\n", + "theirs." + ] + }, + { + "cell_type": "markdown", + "id": "opposed-folks", + "metadata": {}, + "source": [ + "## Projections" + ] + }, + { + "cell_type": "markdown", + "id": "advisory-sheffield", + "metadata": {}, + "source": [ + "From the same page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "spoken-calculation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
United States Census Bureau (2015)[28]Population Reference Bureau (1973-2015)[15]United Nations Department of Economic and Social Affairs (2015)[16]
Year
20167.334772e+09NaN7.432663e+09
20177.412779e+09NaNNaN
20187.490428e+09NaNNaN
20197.567403e+09NaNNaN
20207.643402e+09NaN7.758157e+09
\n", + "
" + ], + "text/plain": [ + " United States Census Bureau (2015)[28] \\\n", + "Year \n", + "2016 7.334772e+09 \n", + "2017 7.412779e+09 \n", + "2018 7.490428e+09 \n", + "2019 7.567403e+09 \n", + "2020 7.643402e+09 \n", + "\n", + " Population Reference Bureau (1973-2015)[15] \\\n", + "Year \n", + "2016 NaN \n", + "2017 NaN \n", + "2018 NaN \n", + "2019 NaN \n", + "2020 NaN \n", + "\n", + " United Nations Department of Economic and Social Affairs (2015)[16] \n", + "Year \n", + "2016 7.432663e+09 \n", + "2017 NaN \n", + "2018 NaN \n", + "2019 NaN \n", + "2020 7.758157e+09 " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table3 = tables[3]\n", + "table3.head()" + ] + }, + { + "cell_type": "markdown", + "id": "hispanic-episode", + "metadata": {}, + "source": [ + "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", + "\n", + "The column names are long strings; for convenience, I'll replace them with abbreviations." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "corrected-denial", + "metadata": {}, + "outputs": [], + "source": [ + "table3.columns = ['census', 'prb', 'un']" + ] + }, + { + "cell_type": "markdown", + "id": "explicit-tiffany", + "metadata": {}, + "source": [ + "The following function plots projections from the U.N. DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "lyric-cinema", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import plot, decorate\n", + "\n", + "def plot_projections(table):\n", + " \"\"\"Plot world population projections.\n", + " \n", + " table: DataFrame with columns 'un' and 'census'\n", + " \"\"\"\n", + " census_proj = table.census / 1e9\n", + " un_proj = table.un / 1e9\n", + " prb_proj = table.prb / 1e9\n", + " \n", + " plot(census_proj.dropna(), style=':', label='US Census')\n", + " plot(un_proj.dropna(), style='--', label='UN DESA')" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-method", + "metadata": {}, + "source": [ + "Here are their projections compared to the results of the logistic model." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "neutral-material", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_projections(table3)\n", + "plot(results, color='gray', label='model')" + ] + }, + { + "cell_type": "markdown", + "id": "rough-patent", + "metadata": {}, + "source": [ + "The U.N. DESA expects the world population to reach 11 billion around 2100, and then level off.\n", + "Projections by U.S. Census are a little lower, and they only go until 2050.\n", + "\n", + "Real demographers expect world population to grow more slowly than our model projects, probably because their models are broken down by region and country, where conditions are different, and they take into account expected economic development.\n", + "\n", + "Nevertheless, their projections are qualitatively similar to ours, and\n", + "theirs differ from each other almost as much as they differ from ours.\n", + "So the results from this model, simple as it is, are not entirely unreasonable.\n" + ] + }, + { + "cell_type": "markdown", + "id": "rising-procurement", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "\n", + "You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." + ] + }, + { + "cell_type": "markdown", + "id": "complex-forwarding", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate more realistic projections, by extrapolating observed changes in growth rate.\n", + "\n", + "To compute past growth rates, we'll use a function called `diff`, which computes the difference between successive elements in a `Series`. For example, here are the changes from one year to the next in `census`:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "involved-delivery", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "1950 NaN\n", + "1951 0.037311\n", + "1952 0.041832\n", + "1953 0.045281\n", + "1954 0.048175\n", + "Name: census, dtype: float64" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diff = census.diff()\n", + "diff.head()" + ] + }, + { + "cell_type": "markdown", + "id": "executed-cheat", + "metadata": {}, + "source": [ + "The first element is `NaN` because we don't have the data for 1945, so we can't compute the first difference.\n", + "\n", + "If we divide these differences by the populations, the result is an estimate of the growth rate during each year: " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "promotional-poker", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Year\n", + "1950 NaN\n", + "1951 0.014378\n", + "1952 0.015865\n", + "1953 0.016883\n", + "1954 0.017645\n", + "Name: census, dtype: float64" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alpha = census.diff() / census\n", + "alpha.head()" + ] + }, + { + "cell_type": "markdown", + "id": "incoming-tribute", + "metadata": {}, + "source": [ + "The following function computes and plots the growth rates for the `census` and `un` estimates:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "historical-program", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_alpha():\n", + " alpha_census = census.diff() / census\n", + " plot(alpha_census, style='.', label='US Census')\n", + "\n", + " alpha_un = un.diff() / un\n", + " plot(alpha_un, style='.', label='UN DESA')\n", + "\n", + " decorate(xlabel='Year', label='Net growth rate')" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-consensus", + "metadata": {}, + "source": [ + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "rough-manual", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAArsElEQVR4nO3deZhcdZ3v8fe3qzsERCEmgDFbJ6RJSFgCaZpkNJoEhOBC5ooLy2gAuTxBwrAzLI7i48igqNxRcsmNGllNZBSHDHJZDKjBoU3SEBiymbZvQhqjCTGAipB09/f+UaeaSvWpzqnu6qpzqj6v56mnqs75nZPfL91d3/rt5u6IiIjETU25MyAiIhJGAUpERGJJAUpERGJJAUpERGJJAUpERGKpttwZKMSwYcO8vr6+3NkQEZEiamlpecXdD8s9nqgAVV9fz5o1a8qdDRERKSIz2xp2XE18IiISS5EClJnNMbNNZtZqZteHnDcz+3Zw/gUzOzE4PsrMnjKzDWa2zswuz7rmNjPbGKT/qZkdWrRSiYhI4u03QJlZClgInAFMAs4xs0k5yc4AGoLHxcCdwfEO4Gp3PxqYBlyade0TwDHufhzwW+CGfpZFREQqSJQ+qCag1d3bAMxsGTAXWJ+VZi5wj6fXTWo2s0PNbLi7bwe2A7j7n81sAzACWO/uj2dd3wx8ov/FERHpu71799Le3s6bb75Z7qxUpMGDBzNy5Ejq6uoipY8SoEYA27LetwMnR0gzgiA4AZhZPXAC8JuQf+NC4Edh/7iZXUy6Vsbo0aMjZFdEpG/a29t55zvfSX19PWZW7uxUFHdn165dtLe3M3bs2EjXROmDCvsp5a4w22saMzsY+Alwhbu/vs+FZjeRbgq8P+wfd/fF7t7o7o2HHdZjFKKISNG8+eabDB06VMFpAJgZQ4cOLah2GqUG1Q6Myno/Evh91DRmVkc6ON3v7g/mZHge8FHgFNey6iISAwpOA6fQ/9soNajVQIOZjTWzQcDZwPKcNMuBzwaj+aYBr7n7dkvn5vvABnf/Vk5G5wD/BJzp7m8UlGspipatu1n4VCstW3eXOysiIj3sN0C5ewewAHgM2AA84O7rzGy+mc0Pkj0CtAGtwHeBzwfH3wd8BphtZmuDx4eDc3cA7wSeCI4vKlqppIfcYNSydTfnfa+Zbz6+ifO+16wgJRIDW7Zs4Zhjjtnn2M0338w3vvENAJqbmzn55JOZMmUKRx99NDfffHPofVatWsUHPvABJkyYwMSJE7nooot4443k1QMirSTh7o+QDkLZxxZlvXbg0pDrnia8fwp3H19QTqXPMsFoT0cXg2pruP+iaTS37WJPRxddDns7umhu28XUMUPKnVUR6cW8efN44IEHOP744+ns7GTTpk090vzxj3/kk5/8JMuWLWP69Om4Oz/5yU/485//zEEHHVSGXPedVpKoAmHBaNq4oQyqrSFlUFdbw7RxQ8udTZFEKmVT+Y4dOxg+fDgAqVSKSZNyp6TCwoULmTdvHtOnTwfS/T6f+MQnOOKII/jrX//KhRdeyEknncQJJ5zAQw89BMBdd93Fxz/+cebMmUNDQwPXXXcdAJ2dnZx//vkcc8wxHHvssdx+++0AzJw5s3vZuVdeeYXMGqnr1q2jqamJKVOmcNxxx7F58+Z+lTdRa/FJ32SC0d6Oru5gNHXMkO6aVOa9iBQmrHViIP+WrrzySiZMmMDMmTOZM2cO8+bNY/DgwfukefHFF5k3b17o9V/96leZPXs2S5Ys4dVXX6WpqYlTTz0VgLVr1/Lcc89xwAEHMGHCBC677DJ27NjByy+/zIsvvgjAq6++2mv+Fi1axOWXX855553Hnj176Ozs7Fd5VYOqAplgdNVpE/b5A5o6ZgiXzhqv4CTSR2GtE/2Rb5Rb5vgXv/hF1qxZw2mnncYPf/hD5syZU9D9H3/8cW699VamTJnCzJkzefPNN3nppZcAOOWUUzjkkEMYPHgwkyZNYuvWrYwbN462tjYuu+wyHn30Ud71rnf1ev/p06dzyy238LWvfY2tW7dy4IEHFpS/XApQVULBSKT4it1UPnToUHbv3rep8E9/+hPDhg3rfn/kkUdyySWXsGLFCp5//nl27do3KE6ePJmWlpbQ+2f6o9auXcvatWt56aWXOProowE44IADutOlUik6OjoYMmQIzz//PDNnzmThwoVcdNFFANTW1tLV1QWwz7ymc889l+XLl3PggQdy+umn8+STT/bjf0MBSkSkz/K1TvTVwQcfzPDhw1mxYgWQDk6PPvoo73//+wH42c9+RmbK6ObNm0mlUhx66KH73GPBggXcfffd/OY3by/ac9999/GHP/yB008/ne985zvd93juued6zc8rr7xCV1cXZ511Fl/5yld49tlngfTWR5kg+OMf/7g7fVtbG+PGjeMf//EfOfPMM3nhhRf68b+hPigRkX6ZOmZIUVsm7rnnHi699FKuvvpqAL70pS9x5JFHAnDvvfdy5ZVXctBBB1FbW8v9999PKpXa5/ojjjiCZcuWcc0117Bjxw5qamr4wAc+wMc//nH++Z//mSuuuILjjjsOd6e+vp6HH344b15efvllLrjggu7a0r/+678CcM011/CpT32Ke++9l9mzZ3en/9GPfsR9991HXV0d73nPe/jiF7/Yr/8LS9ICDo2Nja4NC0VkoGzYsKG7yUsGRtj/sZm1uHtjblo18YmISCwpQImISCwpQImISCwpQImISCwpQImISCwpQImISCwpQImIxMT+tts4//zzGTFiBG+99Raw70KtuVKpFFOmTGHy5Mkcf/zxfOtb3+qez/SLX/yCQw45hClTpnQ/fv7znwPp9fomT57Mcccdx5QpU/aZ8NvR0cGwYcO44YYbil30UJqoKyKSIKlUiiVLlnDJJZf0mu7AAw9k7dq1QHoV9HPPPZfXXnuNL3/5ywDMmDGjxyTdZ555hocffphnn32WAw44gFdeeYU9e/Z0n3/88ceZMGECDzzwALfccsuA7z6sGpSISH9sWwUrv5l+LoErrriC22+/nY6OjsjXHH744SxevJg77riD3hZn2L59O8OGDetel2/YsGG8973v7T6/dOlSLr/8ckaPHk1zc3PfCxGRApSISF9tWwV3nwlPfjX9XIIgNXr0aN7//vdz7733FnTduHHj6OrqYseOHQCsXLlynya+3/3ud5x22mls27aNo446is9//vP88pe/7L7+b3/7GytWrOCjH/0o55xzDkuXLi1qucIoQMk+Srn5mkjibVkJnXvAO9PPW1b263b7224j48Ybb+S2227r7lOKKrv2NGPGjO5VzdeuXcuRRx7JwQcfTEtLC4sXL+awww7j05/+NHfddRcADz/8MLNmzeKggw7irLPO4qc//Wm/93vaH/VBSbeibL62bVX6j7R+BoxqGpiMisRF/QxIDUoHp9Sg9Pt+yLfdxtixY/c5Nn78eKZMmcIDDzwQ+d5tbW2kUikOP/xwNmzYkDddKpVi5syZzJw5k2OPPZa7776b888/n6VLl/LrX/+6e1DGrl27eOqpp7o3PBwIClDSLWzztYICVKa5I/PHOm85jGpi4+qfs3v9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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_alpha()" + ] + }, + { + "cell_type": "markdown", + "id": "acute-ratio", + "metadata": {}, + "source": [ + "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", + "\n", + "We can model the decline by fitting a line to this data and extrapolating into the future.\n", + "\n", + "Here's a function that takes a time stamp and computes a line that roughly fits the growth rates since 1970." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "color-pricing", + "metadata": {}, + "outputs": [], + "source": [ + "def alpha_func(t):\n", + " intercept = 0.02\n", + " slope = -0.00021\n", + " return intercept + slope * (t - 1970)" + ] + }, + { + "cell_type": "markdown", + "id": "duplicate-parliament", + "metadata": {}, + "source": [ + "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "approximate-calcium", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "t_array = linspace(1960, 2020, 5)\n", + "alpha_array = alpha_func(t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "transparent-madison", + "metadata": {}, + "source": [ + "To plot the results, I'll put them into a `Series` object." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "looking-yield", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import Series\n", + "\n", + "alpha_series = Series(alpha_array, index=t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "graphic-persian", + "metadata": {}, + "source": [ + "Here's what it looks like, compared to the data." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "focal-luther", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABB9UlEQVR4nO3dd3iUZbr48e89Mwm9BAgQkpDQERCBQChK74ihBAuyEKTGta7uurqe35brnN2zu66757hyDBGiIiiWEIiI9F4iEECkSggJBBEQUUAEUp7fHzOJIUySSZ2Z5P5cV66Zed/nfed5IJl7ni7GGJRSSilPY3F3BpRSSilnNEAppZTySBqglFJKeSQNUEoppTySBiillFIeyebuDJREkyZNTGhoqLuzoZRSqpwkJyd/a4zxd3bOqwJUaGgoe/fudXc2lFJKlRMRSS/snDbxKaWU8kgaoJRSSnkkDVBKKaU8klf1QSmlVEXJzMwkIyODGzduuDsrVVLNmjUJCgrCx8fH5Ws0QCmlFJCRkUG9evUIDQ1FRNydnSrFGMOlS5fIyMigVatWLl+nTXxKKQXcuHGDxo0ba3CqACJC48aNS1w71QCllFIOGpwqTmn+bTVAKaWU8kguBSgRGSUix0UkRURedHJeROQ1x/mDItLDcTxYRDaJyFEROSwiz+S75hUROeZInyAiDcutVFXI+vXr2b17N7pvl1JVW1paGl26dLnt2B//+Ef+8Y9/AJCUlETv3r3p1q0bd911F3/84x+d3mf37t0MGDCADh060LFjR2bNmsX169crOvsVothBEiJiBeYBw4EMYI+IJBpjjuRLNhpo5/jpDbzheMwCnjfG7BORekCyiKxzXLsOeMkYkyUifwNeAn5bjmXzejk5OVy4cIEdO3aQmppKREQEtWvXdne2lFJuEBUVxYcffsg999xDdnY2x48fvyPN+fPnefDBB1m6dCl9+/bFGEN8fDxXr171ys8OV2pQ4UCKMSbVGHMLWAqMK5BmHLDI2CUBDUUkwBhzzhizD8AYcxU4CgQ6Xq81xmQ5rk8CgsqhPFWKxWJh8uTJjBw5kpSUFGJiYjh16pS7s6WUckhOv8y8TSkkp1+u8Pe6cOECAQEBAFitVjp16nRHmnnz5hEVFUXfvn0Be7/PpEmTaNasGT/++CMzZsygV69edO/enRUrVgDw9ttvM3HiREaNGkW7du144YUXAMjOzmb69Ol06dKFu+++m3/9618ADBo0KG/JuW+//Zbc9VEPHz5MeHg43bp1o2vXrpw4caLMZXZlmHkgcCbf6wzstaPi0gQC53IPiEgo0B343Ml7zAA+cPbmIjIHmAPQsmVLF7JbtYgIffr0ISQkhPj4eBYtWkT//v0ZOHAgVqvV3dlTqtpKTr/MlAVJ3MrKwddmYcmsPoSF+FXY+/3qV7+iQ4cODBo0iFGjRhEVFUXNmjVvS3Po0CGioqKcXv/nP/+ZIUOGEBcXx/fff094eDjDhg0D4MCBA+zfv58aNWrQoUMHnnrqKS5cuMDZs2c5dOgQAN9//32R+YuJieGZZ55hypQp3Lp1i+zs7DKX2ZUalLOhFwU7RIpMIyJ1gXjgWWPMldsuFHkZe1PgEmdvboyJNcb0NMb09Pd3uuBttRAQEMCcOXPo1q0b27Zt4+233y72F0YpVXGSUi9xKyuHHAOZWTkkpV4q0/0KG+WWe/z3v/89e/fuZcSIEbz33nuMGjWqRPdfu3Ytf/3rX+nWrRuDBg3ixo0bnD59GoChQ4fSoEEDatasSadOnUhPT6d169akpqby1FNPsXr1aurXr1/k/fv27ctf/vIX/va3v5Genk6tWrVKlD9nXAlQGUBwvtdBwNeuphERH+zBaYkxZln+i0QkChgLTDE6CqBYvr6+jBs3jsjISC5evEhMTEzetxtXVWaThFJVWZ/WjfG1WbAK+Ngs9GnduEz3a9y4MZcv3/53+d1339GkSZO8123atOHxxx9nw4YNfPHFF1y6dHtQ7Ny5M8nJyU7vn9sfdeDAAQ4cOMDp06e56667AKhRo0ZeOqvVSlZWFn5+fnzxxRcMGjSIefPmMWvWLABsNhs5OTkAt81revTRR0lMTKRWrVqMHDmSjRs3luFfw86VALUHaCcirUTEF3gESCyQJhGY5hjN1wf4wRhzTuyhfyFw1Bjzz/wXiMgo7IMiIowx3jnExE26dOnC3Llz8ff3Jz4+nhUrVnDr1q070hUMRrlNEq+uPc6UBUkapJQqg7AQP5bM6sNzIzqUS/Ne3bp1CQgIYMOGDYA9OK1evZr77rsPgE8//TRvNO+JEyewWq00bNjwtns8+eSTvPPOO3z++c89KYsXL+abb75h5MiR/Pvf/867x/79+4vMz7fffktOTg6RkZH853/+J/v27QPs2x7lBsGPP/44L31qaiqtW7fm6aefJiIigoMHD5bhX8Ou2D4oxyi7J4E1gBWIM8YcFpFox/kYYBUwBkgBrgOPOS6/F5gKfCkiBxzHfmeMWQW8DtQA1jmqsEnGmOgyl6ia8PPzY/r06WzZsoVt27Zx5swZIiMj8zpRnbWPO2uSqMg2c6WqurAQv3L9G1q0aBFPPPEEzz//PAB/+MMfaNOmDQDvvvsuv/rVr6hduzY2m40lS5bc0Q/drFkzli5dyq9//WsuXLiAxWJhwIABTJw4kf/3//4fzz77LF27dsUYQ2hoKCtXriw0L2fPnuWxxx7Lqy3993//NwC//vWveeihh3j33XcZMmRIXvoPPviAxYsX4+PjQ/Pmzfn9739f5n8P8aaWtZ49exrdsPBOp06dIiEhgevXrzNs2DB69+7N/20+yatrj5NjwCrw3IgO9GndmCkLksjMysGnEjp1lfImR48ezWvyUhXD2b+xiCQbY3o6S6+LxVYBrVq1Ijo6msTERNasWUNqairdewzE12bJC0Z9WjfOa5JISr2U91oppTyVBqgqonbt2jz88MPs3buXNWvWcO7cOf5nzDBO3qhzWzAq7yYJpZSqKLoWXxUiIvTq1YvZs2dTq1YtPl+7nPZZp+gWVPTwUKWU8kQaoKqgZs2aMXv2bMLCwti5cydxcXF899137s6WUkqViAaoKsrHx4exY8fy0EMP8d133zF//vxyGfaplFKVRQNUFXfXXXcRHR1N8+bNSUhIICEhgZs3b7o7W0opVSwNUNVAgwYNiIqKYuDAgXz55ZfMnz+fr78uuBiIUsqdittuY/r06QQGBuZ9wcy/UGtBVquVbt260blzZ+655x7++c9/5s1n2rx5Mw0aNKBbt255P+vXrwfs6/V17tyZrl270q1bt9sm/GZlZdGkSRNeeuml8i56oTRAVRMWi4VBgwYRFRVFdnY2CxcuZMeOHbrPlFJexGq1EhcXV2y6WrVqceDAAQ4fPsy6detYtWoVf/rTn/LO9+/fP2/JowMHDjBs2DB27drFypUr2bdvHwcPHmT9+vUEB/+8gt3atWvp0KEDH374YaV9bmiAqmZCQkKIjo6mQ4cOrF+/nsWLF3Pt2jV3Z0sp73RmN2x71f5YCZ599ln+9a9/kZWVVXxih6ZNmxIbG8vrr79eZGA5d+4cTZo0yVuXr0mTJrRo0SLv/Pvvv88zzzxDy5YtSUpKKn0hSkADVDVUq1YtHnzwQcaOHcvp06d54403ymXvFqWqlTO74Z0I2Phn+2MlBKmWLVty33338e6775boutatW+dtgAqwbdu225r4Tp48yYgRIzhz5gzt27fnl7/8JVu2bMm7/qeffmLDhg2MHTuWyZMn8/7775druQqjAaqaEhHCwsKYM2cOdevW5b333mPNmjUl+mamVLWWtg2yb4HJtj+mbSvT7YrbbiPX7373O1555ZW8PiVX5a89FWzia9OmDXXr1iU5OZnY2Fj8/f15+OGHefvttwFYuXIlgwcPpnbt2kRGRpKQkFAu+z0VRwNUNefv78/s2bPp1asXSUlJLFy4kG+//dbd2VLK84X2B6sviNX+GNq/TLdzZbsNgLZt29KtWzc+/PBDl++dmpqK1WqladOmRaazWq0MGjSIP/3pT7z++uvEx8cD9ua99evXExoaSlhYGJcuXWLTpk0uv39paYBS2Gw2xowZwyOPPMIPP/xAbGws+/fv1wEUShUlOByiEmHIy/bH4PAy3a647Tbye/nll/NG9xXn4sWLREdH8+STTxZaSwM4fvz4bU39Bw4cICQkhCtXrrB9+3ZOnz5NWloaaWlpzJs3r1Ka+XQtPpWnQ4cOREdHk5CQQGJiIqmpqdx///13bCutlHIIDi9zYMqvqO028uvcuTM9evTI26OpoJ9++olu3bqRmZmJzWZj6tSpPPfcc3nnc/ugcv3Hf/wHrVq14qmnnuL777/HZrPRtm1bYmNjWbZsGUOGDLltU8Nx48bxwgsvcPPmzduOlzfdbkPdIScnhx07drBp0yYaNGhAZGQkQUFB7s6WUhVKt9uoeCXdbkOb+NQdO+9aLBb69+/PY4/Z952Mi4tj27ZtzjtlK3mYrVKq+tAmvmrO2c67udtxBAcHM3fuXFauXMnGjRtJTU1lwoQJ1K/vWB09d5ht9i17J7GjHf7YnvVcPrIRv05D6NhrmBtLp5TyZlqDquacbQMPP9eqDp//icjISCIiIjh79iwxMTEcP37cfrGTYbbH9qwnZOVkeqW+QcjKyRzbs96NpVNKeTOtQVVzfVo3vmPnXae1qu7dCfa5TPyaHSxdupRevXox4q5+2Ky+P9egQvtzeeNy2pKFTXLAZHH5yEYopBaVnH5Zd/dVShVKA1Q152wb+HmbUu6oVYVZTtBk+aPMzM5mvfTn8z1w+nQzIiOW4P/DAfsckOBw/DpdITP1TTBZZGLDr9MQp+9bVNOiUkqBBijFndvAO6tVkbYCsm9hM9mMYjNtuvZmecpVYj9JYtSoUfQI6oEAHXsN4xjv39EHVbC25KxpUQOUUio/DVDqDs5qVVgcs+YdzXnteg4methdLF++nJUrV3Ly5EkeeOABatWqZQ9K+Zr1ktMv88qCRYSZw7yysTO/mTXNeRBUqpoTEZ577jleffVVAP7xj39w7do1/vjHP7o3Y26iAUo5VbBWlTdrPm1bXnNePeAXv/gFO3fuZOPGjZw9e5bIyEhatmx5271O7d/EW5b/wocsMkng0/3BTBo/8c4gqFQ1V6NGDZYtW8ZLL710xxJH1ZGO4lOuCw6H/s/fNnN+3+nvOXCrGf3GPIjVauXtt99m8+bNt82Z6ms9go9j4IQPWfS1HgHsQfCJwW01OCnlYLPZmDNnDv/617/uOJeens7QoUPp2rUrQ4cO5fTp04B9I8Onn36afv360bp1az7++OO8a1555RV69epF165d+cMf/lBp5SgvWoNSzp3ZfVttyZmCAx3eiXqYr7/cyZYtW0hLS2PChAk0aNCAwG4jyDnwb3KyM7HYfAjsNqKSC6NUyaxevZpvvvmmXO/ZvHlzRo0aVWy6J554gq5du/LCCy/cdvzJJ59k2rRpREVFERcXx9NPP83y5csB+15O27dv59ixY0RERDBp0iTWrl3LiRMn2L17N8YYIiIi2Lp1KwMGDCjXclUkl2pQIjJKRI6LSIqIvOjkvIjIa47zB0Wkh+N4sIhsEpGjInJYRJ7Jd00jEVknIiccj/o12lO4uM9NwYEOe89cZcKECUyYMIFz584RExPD0aNHITgcy/RPsAx9Gcv0T34OeLoKhVJ3qF+/PtOmTeO111677fiuXbt49NFHAZg6dSrbt2/POzd+/HgsFgudOnXi/PnzgH0H3LVr19K9e3d69OjBsWPHvG7ft2JrUCJiBeYBw4EMYI+IJBpjjuRLNhpo5/jpDbzheMwCnjfG7BORekCyiKxzXPsisMEY81dH0HsR+G05lk2VlrN9bpzUogob6NC1a1eCgoKIj4/nww8/JCwsjJEjR+KT/x6FrEKhlCdwpaZTkZ599ll69OiRt9yYM/lXJs+/YGvu+qrGGF566SXmzp1bcRmtYK7UoMKBFGNMqjHmFrAUGFcgzThgkbFLAhqKSIAx5pwxZh+AMeYqcBQIzHfNO47n7wDjy1YUVW4K2eem4Jp9uaP9nhvR4Y55TI0aNWLGjBn069eP5ORk3nzzzbxvdkC5b/amVFXSqFEjHnroIRYuXJh3rF+/fixduhSAJUuWON2GI7+RI0cSFxfHtWvXADh79mzejrrewpU+qEDgTL7XGdhrR8WlCQTO5R4QkVCgO/C541AzY8w5AGPMORFxupOWiMwB5gB3jA5TFcTJiL3CJtbeMdovH6vVyvDhw2ndujUJCQksWLCAESNG0LNnTyT09mHrZd3sTamq5vnnn+f111/Pe/3aa68xY8YMXnnlFfz9/XnrrbeKvH7EiBEcPXqUvn37Avb9phYvXlzspoWexJUA5WyHq4J7dBSZRkTqAvHAs8aYK65nD4wxsUAs2LfbKMm1qgwK7HNTlom1bdq04fHHH2f58uWsWrWKkydPEhERQe0CQVCp6i63tgPQrFkzrl+/nvc6NDSUjRs33nFN7rbszu7xzDPP8Mwzz+CtXGniywCC870OAr52NY2I+GAPTkuMMcvypTkvIgGONAGAd9U9q5nc/iarUKqJtXXq1OHRRx9l5MiRnDhxgpiYGNKym94xbF0HTiilcrkSoPYA7USklYj4Ao8AiQXSJALTHKP5+gA/OJrtBFgIHDXG/NPJNVGO51HAilKXQlW4ovqbXCUi9OnTh1mzZuHr68s777zDxo0bf54zdWY3OW8/QM6G/yLn7Qc0SClVzRXbxGeMyRKRJ4E1gBWIM8YcFpFox/kYYBUwBkgBrgO5Q0/uBaYCX4rIAcex3xljVgF/BT4UkZnAaeDBciuVqhBF9TeVREBAAHPmzOGzzz5j27ZtnDp1isjISH48sJZmWbewSQ5ZWbc4d2Atgdr0pyqRMea20XGq/JRm93bd8l25NCm3ohw6dIiVK1cC4N+8KY+e+q1jSSQbn3afz6TxEys1P6r6OnXqFPXq1aNx48YapMqZMYZLly5x9epVWrVqddu5orZ815Ukqjs3z0fq0qULgYGBLFu2jIz0M/yO5wjITmOfdOI33QdXWj6UCgoKIiMjg4sXL7o7K1VSzZo1CQoKKtE1GqCqOxcn5VYkPz8/pk+fzubNm9m+fTu36nRkzrDRukafqlQ+Pj53fLtX7qWLxVZ3hUzKrWxWq5WhQ4cybdo0atsMO1d9yOeff25vt9aRfUpVS9oHVQk8fmtzN/ZBOXP9+nVWrFjBV199Rbtgf8ad/Tt1cq7okkhKVUFF9UFpgKpgurV56Rhj2LNnD2vXfEatnGtMMJ/RWr6GIS/b504ppaqEogKUNvFVMGcrMMCd69qp24kI4eHhzHrgXmpyi3dlEuulP9kt73V31pRSlUQHSVQwZyt+a63Kdc27DWNOgzqsXr+RHV/3IG3dISZObE+jRo3cnTWlVAXTGlQFc7YCQ2G1qkrhhQMODlo6crrtw/QYNJpLly4xf/58Dh486O5sKaUqmNagKkHBFRgK20epwnnhHkwFa5sLHpnMid0bSEhIIDU1ldGjR9+2F45SqurQAOUGubWqSh/Z5wFznkqqYG3ziwu3eDwqiq2fvM/WA19w5tQJIh+eQosWLdydVaVUOdMmPjcJC/HjicFtK7fvyUPmPJWEs1XULWf3MujL54niI7KunGfhwgXs3LmzVGt9KaU8lw4zr248bM6TK+6YR7btVdj4ZzDZ/CS1+cT/CY5ezKZNmzaMHz+eunXrujvLSikX6TwoVbUU6Esz01aQfMHKmjVrqFGjBuPGjaNdu3buzqVSygUaoFTV46QmeOHCBeLj47lw4QJ9+vRh6NCh2GzazaqUJ9MAVYk8alkjL2zOK6vMzEzWrVvHnj17CAgIIDIyksaNK2mUpFKqxDRAVRKPmoDrhUPKy9OxY8dITEwkKyuLMWPGcM899+geP0p5IF3qqIIUXK7IrRNwC3I2pLwa6dixI9HR0bRo0YIVK1awbNkybty44e5sKaVKQBvoS8lZbcltE3CdyR1SnluD8oIh5SXhtCm1QJNm/fr1mTZtGtu3b2fz5s1kZGQQGRlZ4k3TlFLuUb0CVDn2yTirLT0xuK17JuDCnWULDrc361XBPiinTamWE06bNC0WCwMGDKBVq1bEx8cTFxfH4MGDuffee7FYtAFBKU9WfQJUOffJFFZbKrisUYUoGIwKK1vuTxXj7MtBmK3oVTKCg4OJjo5m5cqVbNy4kVOnTjFhwgTq1avnxpIopYpSfQJUOS/zU2nLFbkSjLxwCaOycPrlwFJ8k2bNmjWJjIykdevWrF69mjfeeIPx48fTvn17N5RCKVWc6hOgKqBPpsJrS64Goyre31SQ8y8HrjVpigg9evSgZcuWfPzxx7z//vuEh4czfPjwUs+Z8qipBUpVIdUnQHlDn0zB2pKrwcgbylbOnH45KEGTZpMmTZg1axbr16/n888/Jz09ncjISPz9/UuUD4+aWqBUFVN9AhR4dp+Ms9pSSYKRJ5fNQ9lsNkaNGkXr1q1ZsWIFsbGxjB49mu7du7s8Z8ppf1hlBahqOBFbVS/VK0B5EldqS/2f12BUCdq3b090dDQJCQl88sknnDx5kgceeICaNWsWe63u7aVUxdEA5Q6u1pZAg1FZuVjLqFevHlOnTmXHjh1s2rSJs2fPEhkZSXBwcJG3d9tgmWo2MEZVTy4FKBEZBfwvYAUWGGP+WuC8OM6PAa4D040x+xzn4oCxwAVjTJd813QDYoCaQBbwS2OM9+xDXhYlqS2p0ithLUNEuO+++/LmTL311lsMHDiQ/v37Fzlnyi2DZQr7QqPNfqoKKXamoohYgXnAaKATMFlEOhVINhpo5/iZA7yR79zbwCgnt/478CdjTDfg947XVdOZ3fY9jM444m9hGwcGh9sDlX6wlI9SLvcUGBjI3Llz6dKlC5s3b2bRokVcuXKlgjNbhMJqS1GJMOTlnwNvbiDb+Gf745nq8X1PVV2u1KDCgRRjTCqAiCwFxgFH8qUZBywy9pVnk0SkoYgEGGPOGWO2ikiok/saoL7jeQPg69IWwqMV9i1ea0sVrwzD72vUqMHEiRNp06YNq1atIiYmhoiICDp27FiBGXYoWAtytflXm/1UFeNKgAoEzuR7nQH0diFNIHCuiPs+C6wRkX9gr8n1c5ZIROZgr5XRsmVLF7LrYQr70CjnviWdi+NEOXwRuOeeewgKCiI+Pp4PPviAnj17MmLECHx8fCogw5TtC001mw+nqj5XApSz8bYF9+hwJU1BjwO/MsbEi8hDwEJg2B03MSYWiAX7dhvFZ9fDVMKHhs7FKUI5fBFo3LgxM2fOZMOGDezatYv09HQmTZpE06ZNyymT+ZTlC43WzFUV48pqmRlA/qFMQdzZHOdKmoKigGWO5x9hb0r0fgX7m5z1FZQzj9rmo4qyWq2MGDGCKVOmcP36dd5880327NlDmfdTc7V/0lXaj6mqEFdqUHuAdiLSCjgLPAI8WiBNIvCko3+qN/CDMaao5j2wB7CBwGZgCHCiBPkuP+U56slNi7Z61DYfbuRyM2cZ/s/btm1LdHQ0K1asYNWqVaSmphIREUGtWrVKnmHtn1SqSMUGKGNMlog8CazBPsw8zhhzWESiHedjgFXYh5inYB9m/lju9SLyPjAIaCIiGcAfjDELgdnA/4qIDbiBo5+pUpVgGLJLH35u6qSutLk4HszlZs5ymOBat25dHn30UZKSkli/fj0xMTFMmDCB0NDQkmW6kvonlfJWLs2DMsaswh6E8h+LyffcAE8Ucu3kQo5vB8JczmlFcDGguPzh58ZO6krZ5sODubzkUDl9iRAR+vbtS2hoKB9//DGLFi2if//+DBw4sPA5U66OzlNKAdV9JQkXPyAK/fAr500CdSRe6bnczFnOQSEgIIC5c+fy2WefsXXrVk6dOsXEiRNpePUr1/bsqozmPJ28q7yUlLmTtxL17NnT7N27t3xv6uyPt8Cx3BpU7odfUTu4lpaOxCu7yuiDKup+X2a3YeWuowg5PJD1KZ1zjt2+TcrGP9trbmK1D5rp/3zZ39uVvOmafcqDiUiyMaans3PVuwYFd7b3O/mDDgsJZ3mED5ePbMSv0xA6hvjBtvLtb3LrqthVhMvNnM76eFwNWkVsIHm31ZegCUuJX7uNj6+M5KRpwajsrfi6c88unbyrvJgGqIIKWR6n45pf2F+fiYPmRayFVko6Es+NCqtllGI3Y7/vknls4nA2vf0XdtCD0wQxqd49NHfX6Dzt51JeTANUQc7+oCthcVcdiedGha3ZV8rdjA/ktGNB1lC6kcI3Vn/e/GQXI27Ww9qsHZ9nNaJPTuPKGx2kw9aVF9MAVVBhf9CVsBVGdR+J5zaufilxcQPJpE0p7M5qS5JpS+2sTH7R4iKrV6/mbM4utt0K5d+2GuXSx+hyn5sOW1deSgOUMwX/oPVbaNXm6pcSF3czzt9cm2OrwYgHItm8fRfNU5KJqHGE7ZmtytzHqINqVHWgAcpV+i20anPypeTYyMU/D4wpwW7GzpprRfrxxPEb9LWkMNznKxpcrkd2diusVmupsquDalR1oAFKVWmlnVuWnH6ZKYmZ3Mq6F9+UTJY0vVyi6ws214aF+DFv1hB2nehMnYuHOPllMm999w0TJ06kUaNGJSoTFD6oxm1D7ZWqABqgVJVVWDOYKx/iFVFD+TlodeTw4bv45JNPmD9/PmPHjuXuu+8utiz58+ysllaZyz0pVRk0QKkqq7BV3l35EK/oYf+dO3cmMDCQZcuWsWzZMk6ePMno0aOpUaPGHWkLCzwFa2mVvdyTUhXNle02qp3k9MvM25RCcvpld2dFlUFukLEKeUHG1a1Jcmsoz43oUGEDEBo2bMj06dMZMGAABw8eJDY2lq+/vnOXGlfz7Ky8TpV1Sw+lKonWoArQ0VFVR2Fzy1ytGVXGsH+LxcLgwYNp1aoVy5YtY+HChXTo0Y8LtVrSt00TwkL8XK7NuTyXTkelKi+ha/EVMG9TCq+uPU6OAavAcyM68MTgthX6nqpyeeqivNevX2fRB/GcP53K2ez67DZtWDirv8v9Zkp5I12LrwR0yaGqz1nNyBMCQO3atckK6UPSySx62s4wii/ZurchYSEDylSb84SyKVUaGqAK0CWHqh9Patbt26YJr29qzoVb9Rjgm8qVQ5tYW+8GQ4cOLdWcKU8qm1IlpQHKCV1yqHrxpEmv+b8g9Wo5kIvHdrNr1y7S0tKIjIykceOS1eg9qWxKlZQGKFXteVqz7m1fkNrcT5s2bVixYgXz589nzJgx3HPPPYiIS/cq84RepdxIB0kohfs+sF193ytXrrBs2TLS09O5++67uf/++53OmXLlPbTZT3kSHSShVDHc0axbkkBRv359pk2bxvbt29m8eTMZGRlERkYSGBhY7PuUekKvUm6mE3WVchNXJ+DmslgsDBgwgOnTp5OTk0NcXBzbt2+npK0gLk/oVcrNtAallJuUtu+rZcuWREdH88knn7BhwwZOnTrF+PHjqVevnkvX60hV5S20D0qpEijvvqqy3M8Yw/79+1m9ejU+Pj6MGzeO9u3blz4zusK5coOi+qA0QCnlIk8dXPDtt9/y8ccfc/78ecLDwxk+fDg2WwkbR3SFc+UmRQUo7YNSykUl7TOqLE2aNGHWrFn07t2b3bt3s2DBAr799tuS3cTZCudKuZlLAUpERonIcRFJEZEXnZwXEXnNcf6giPTIdy5ORC6IyCEn1z3luO9hEfl72YqiVMXy5MEFNpuNUaNGMXnyZK5evUpsbCz79u1zfQCFrnCuPFCxTXwiYgW+AoYDGcAeYLIx5ki+NGOAp4AxQG/gf40xvR3nBgDXgEXGmC75rhkMvAzcb4y5KSJNjTEXisqLNvEpd/OGCa5Xr14lISGBU6dO0alTJx544AFq1qxZ/IXaB6XcoKzzoMKBFGNMquNmS4FxwJF8acZhD0AGSBKRhiISYIw5Z4zZKiKhTu77OPBXY8xNgOKCk1KewBuWwapXrx5Tp05lx44dbNy4kbNnzxIZGUlwcHDRFwaHa2BSHsWVJr5A4Ey+1xmOYyVNU1B7oL+IfC4iW0Skl7NEIjJHRPaKyN6LFy+6kF2llIhw3333MWPGDESEt956i61bt5KTk+PurCnlMlcClLNFvwq2C7qSpiAb4Af0AX4DfChOFhgzxsQaY3oaY3r6+/u7kN2S0d1zVVUWFBTE3Llz6dy5M5s2bWLRokVcuXLF3dlSyiWuBKgMIH/bQBBQcF9qV9I4u+8yY7cbyAGauJCfcpM7bPjVtceZsiBJg5SqkmrWrMnEiRMZN24cX3/9NTExMRw7dszd2VKqWK4EqD1AOxFpJSK+wCNAYoE0icA0x2i+PsAPxphzxdx3OTAEQETaA75ACcfGlo2nDhtWqryJCN26dWPu3Lk0bNiQDz74gE8//ZTMzEx3Z02pQhUboIwxWcCTwBrgKPChMeawiESLSLQj2SogFUgB3gR+mXu9iLwP7AI6iEiGiMx0nIoDWjuGny8Fokwlzxr25GHDSlWExo0bM3PmTPr27cvevXtZsGABFy7o+CTlmar9ShLeMGxYqYqQkpLC8uXLuXnzJiNHjiQsLOzOfaZ06LmqYLrUkVLKqWvXrrF8+XJOnjxJx44diYiIoFatWvaTuvyRqgS61JFSyqm6desyZcoUhg8fzldffUVMTAzp6en2k2nbMNk3wWRjdPkj5QYaoJSq5kSEfv36MXPmTGw2G++88w6bNm3iiG9XbuTYyDIWbuRYOVbzHndnVVUzuh+UUgqAc5m1oOMwAs9/ydatW7HV9+fLzBfpIcfZbe5i8LVQOro7k6pa0QCllCqwlUg9/j5kJF/u2kgb3xw+y+zPOWsTXtJRrqqSaROfUuqOOYFnaMIvH3+cpv5NGOSbym87/UjXFnXdnU1VzWiAUko5nRPo5+fHk9Gzuffeezn91WFiY2P55ptv3J1VVY3oMHOlFFD0nMDU1FQSEhL46aefGD58OOHh4XfOmVKqFHQelFKqzH788UdWrFjBiRMnaN++PePGjaN27druzpbycjoPSilVZnXq1GHy5MmM7H0XJ098xRuvv8apU6fcnS1VhWmAUkq5TDL20Gfv08wyS6jx0zcsWrSIDRs2kJ2d7e6sqSpIA5RSynVp2yD7Fs3NeebwHt0DbGzfvp233nqLy5d1uxpVvjRAKaVcF9rfvi6fWPG1WogYPZxJkybx7bffMn/+fL788kt351BVITpRVynluuBwjo1czOUjG/HrNISOweF0BgIDA1m2bBnLli0jNTWV0aNH4+vr6+7cKi+nAUop5bLk9MtMSczkVta9+KZksqTpZcJC/GjYsCHTp09ny5YtbN26ldOnTzNp0iQCAgLcnWXlxbSJTynlsqJ2obZYLAwePJioqCgyMzNZsGABu3btwpumsijPogFKKeUyV3ahDg0NJTo6mvbt27N27Vree+89rl275obcKm+nE3WVUiXi6i7Uxhj27t3LmjVrqFmzJhMmTKBNmzaVmFPlDXQlCaVUxSpia/jz588THx/PxYsX6devH0OGDMFqtbopo8rTFBWgdJCEUqpsitkavlmzZsyePZs1a9awc+dO0tLSmDhxIo0b6/YdqmjVqg8qOf0y8zalkJyuEwqVKjeOybuYbPujk63hfXx8GDt2LA899BDfffcdsbGxfPHFF27IbDV2Zjdse9X+6CWqTQ3q9g3ZLCyZ1afI9nOllItyJ+/m1qBC+xea9K677qJFixYsW7aM5cuXc/LkSe6//35q1KhRiRmuhoqp5XqqalODKmp4rFKqDByTd3eFRnNs5OJiP/gaNGhAVFQUgwYN4tChQ8yfP5+zZ89WUmarKRdquZ6o2gQoV4bHKqVKLjn9MuMTM5ly7F7GJ2a61IRusVgYOHAg06dPJycnh7i4OHbs2KFzpipKviWqiqvlepJq08QXFuLHkll9XBoeq5RynbPWCVf/vlq2bMncuXNZuXIl69evJzU1lfHjx1OvXr0KznU1Exxub9YrZKSlp9Jh5kqpMsnt383MysEnX/+uq/OlwD5nav/+/Xz22Wf4+voyfvx42rVrV0klUO5U5g0LRWSUiBwXkRQRedHJeRGR1xznD4pIj3zn4kTkgogcKuTevxYRIyJNXC2QUspz5LZOPDeiw23B6ZUFi7i+4e+8smBRsc1+IkKPHj2YM2cO9erV47333mP16tVkZWVVUimUJyq2iU9ErMA8YDiQAewRkURjzJF8yUYD7Rw/vYE3HI8AbwOvA4uc3DvYcd/TpS+CUsrdwkL8bqslndq/ibcs/4UPWWSSwKf7gwkLmVjsffz9/Zk1axbr1q3j888/Jz09ncjISJo00e+v1ZErNahwIMUYk2qMuQUsBcYVSDMOWGTskoCGIhIAYIzZCnxXyL3/BbwAeE87o1KqWH2tR/AhC5vk4EMWfa1Hir/IwWazMXr0aB555BF++OEHYmNj2b9/vw6gqIZcCVCBwJl8rzMcx0qa5jYiEgGcNcYUOVtPROaIyF4R2Xvx4kUXslu16ORi5Y0Cu43AYvMlBysWmy+B3UYAJft97tChA9HR0QQGBpKYmEh8fDw3btyo6KwrD+LKKD5xcqzgVxlX0vycWKQ28DIworg3N8bEArFgHyRRXPqqRCcXK68VHI5l+ie3jRorze9z/fr1mTp1Kjt27GDTpk1kZGQQGRlJcHBwJRVEuZMrNagMIP9vQxDwdSnS5NcGaAV8ISJpjvT7RKS5C/mpNnRysfJqweHQ//m8Ic2l/X22WCz079+fGTNmICK89dZbbN26lZycnIrMvfIArgSoPUA7EWklIr7AI0BigTSJwDTHaL4+wA/GmHOF3dAY86UxpqkxJtQYE4o9wPUwxnxTumJUTTq5WFUlZf19DgoKYu7cuXTu3JlNmzbx7rvvcuXKlQrKrfIELs2DEpExwP8AViDOGPNnEYkGMMbEiIhgH6k3CrgOPGaM2eu49n1gENAEOA/8wRizsMD904Cexphvi8pHdZwHVZK5JEp5uvL4fTbG8MUXX7Bq1SpsNhsRERF07NixnHOqKovuB6WU8gxF7BtVUpcuXeLjjz/mm2++oVevXgwfPhwfH59yyqiqLLoflFLK/cp5Re3GjRszc+ZMNmzYQFJSEunp6UyaNAl/f/9yzLRyp2qzWKxSys0qYEVtm83GyJEjmTJlCj/++COxsbHs3btX50xVERqglFKVo5AVtctjrl/btm2Jjo4mJCSETz/9lI8++oiffvqpvHKu3ET7oJRSladAH1R5z/UzxrBr1y42bNhA3bp1mThxIiEhIeVYAFXeyrxYrPIsurqE8lrlNDeqMCJCv379mDlzJjabjXfeeYfNmzfrnCkvpYMkvIyuLqGqkty5UblbdZTXXL8WLVowZ84cPvvsM7Zs2cKpU6eYOHEiDRo0KJf7q8qhNSgvo6tLqKokLMSP5RE+LO64g+URPuX6ZatGjRqMHz+eCRMm8M033xATE8ORI64vWqvcT2tQXqaivnEq5RZndtNxzS/so/rOxEHzsg09d6Zr164EBQURHx/PRx99RI8ePRg1apTOmfICGqC8jG5dr6oUZ0PPK2A78kaNGjFjxgw2bdrEjh07OH36NJMmTaJZs2bl/l6q/GgTnxcKC/HjicFtNTgp71eBQ88LslqtDBs2jKlTp3Ljxg3efPNNdu/erXOmPJgOM1dKuVcFDz135scff2TFihWcOHGC9u3bM27cOGrXrl2u76Fco8PMlVKeq4KHnjtTp04dJk+ezMiRIzl58iQxMTGcOnWq3N9HlY0GKKWUR+nTujHhthSesK2gly2lwgYCiQh9+vRh5syZ+Pr6smjRIjZs2EB2dnaFvJ8qOR0koZTyKGGWE7zn+xfHorIrsFj6AuEVtvVMQEAAc+bMYfXq1Wzfvp20tDQmTpyIn5/28bqb1qCUUp4lbRuWnEws5GDJyYS0bXn9Uq+uPc6UBUnlvoqKr68vERERREZGcvHiRebPn8+hQ4fK9T1UyWmAUkp5Ficj+yprgnqXLl2Ijo7G39+f+Ph4VqxYwa1btyrkvVTxtIlPKeVZgsPte0XlG9nXJ+cy4bYUwsxhkqUzfVr3q7C3b9iwIY899hibN29m27ZtnDlzhsjISAICAirsPZVzOsxcKeX5zuwm5+0H8jY7tEz/JG9IekVOWk9LS2PZsmVcv36dYcOG0bt3b0Sk3N+nOtMddZVS3s3RLwU5kNsvldOuwudLhYaGEh0dTWJiImvWrCE1NZVx48ZRp06dcn0f5Zz2QSmlPF8h/VKds48RbVlBl+xjef1S5b0KRe3atXn44YcZM2YMqampxMTEcPLkyXK5tyqaNvEppbxDgRUnju1ZT8jKyfiQRSY20se+z49Nwyq0VnX+/Hni4+O5ePEi/fr1Y8iQIVit1nK7f3WkK0kopbxfgRUnOt74gpqWLGySQ01LNh1vfFHhtapmzZoxe/ZswsLC2LlzJ3FxcXz33XdlLppyTvuglFLeKbQ/Yq0B2bcQR7Pf0G/SmOHzl59rVXXvJjm9cbnWqnx8fBg7dixt2rQhMTGR+fPnc//999O1a9dyLJwCrUEppbxV7nD0IS/bH4PDS1SrKqu77rqL6OhomjdvTkJCAgkJCdy8ebNc7q3stAallPJeweG37x/lYq0K2nJsz3ouH9mIX6chdOw1rFRv36BBA6Kioti6dStbt27NmzMVGBhYPuWr5lyqQYnIKBE5LiIpIvKik/MiIq85zh8UkR75zsWJyAUROVTgmldE5JgjfYKINCxzaZRS1ZuLtarcARa9Ut8gZOVkju1Zb7/+zG7Y9qr90UUWi4VBgwYxffp0srOziYuLY8eOHbrPVDkoNkCJiBWYB4wGOgGTRaRTgWSjgXaOnznAG/nOvQ2McnLrdUAXY0xX4CvgpZJmXiml7lBgMEVerUqsebWqy0c24oM9aPmQxeUjG/MmA+ds+C/7pODcIOVi0GrZsiXR0dF06NCB9evXs3jxYq5evVrBha3aXKlBhQMpxphUY8wtYCkwrkCaccAiY5cENBSRAABjzFbgjmEuxpi1xpgsx8skIKi0hVBKqUI5qVX5dRpCJjayjIVMbPh1GsLZA2vJybqFhRxysm5x9sDakgWtM7uptff/eLBPCGPHjuX06dPExMRw4sQJ95S7CnClDyoQOJPvdQbQ24U0gcA5F/MxA/jAxbRKKVUyBfqqOvYaxjHev60P6uPlV7gfGxh7X9Wu7E70PbCWZlm3sEkOWVm3OHdgLYFw57JLAO9E5PV9hUUl0nLOHD5+/13ee+89+nQOZej4Kdhs2u1fEq78azlbeKpg46oraZzfXORlIAtYUsj5OdibDWnZsqUrt1RKqWJ17DUM8g2OaNV9MI8l/0fegrS/6T6YXftxLWg1rIXJvomYHEz2LSRtG/6hMPuHV1lLOEmHIe2bfxP5yFSa/JR624RjVThXAlQGEJzvdRDwdSnS3EFEooCxwFBTSI+iMSYWiAX7ShIu5FcppUosLMSP38yaRlLqJX6Tt/isa0GrS836hOTY7CMFjZX0mvfQMW0b1pzrjDEbaS2nSfwhgtj5MYzOXkc386W9P8zR5FhwlQxl50qA2gO0E5FWwFngEeDRAmkSgSdFZCn25r8fjDFFNu+JyCjgt8BAY8z1EudcKaXKWViI322TeF0NWhtSL7Ex83f0lqPsNncx+Foo1CUvaIWY0wwb0JMv9+0n8fshpJoW3J+9iZpp2+xv5GgeJH/QUsUHKGNMlog8CawBrECcMeawiEQ7zscAq4AxQApwHXgs93oReR8YBDQRkQzgD8aYhcDrQA1gnWP5+iRjTHQ5lk0ppcrMtaAF/7Z25EBWe3xsFl5q3ZgNqdwetLI68Pj4Jmx7509sMb3IoAWRtbsQlLbNHpxMtv0xbZvWqhx0sVillCoHBfemyt2mPjMrBx/HEksAryxYRDdOcNXajBoWw+Ae7bh3/3NYcm7+XIOCalOr0v2glFKqgjmraS2Z1ee2oDVvUwq7s9qSZNpSMyuLqODLbEz+itSA3zGh9Q3qdxhoD0TbXtVaFRqglFKqwhQMWn1aN8bXZiEzKwdsvgwfE4H1cjqfffYZMd/bGBfcgA7w8/5XuTWo0P724FRNalW5NEAppVQlcVarIrQRwcHBxMfHs3TpUnr16sWIESOwRSXeXluqhrUq7YNSSikPkJWVxYYNG0hKSqJp06ZMmjQJf3//nxM4q0GB19eqdMNCpZTycDabjZEjR/Loo49y7do1YmNjSU5O/nnRWSdLNuFsBGAVogFKKaU8SLt27YiOjqZly5asXLmSjz76iJ9++sl+0slCuFh9Qaw/91VBqVZl90TaxKeUUh7IGMPOnTvZuHEjdevWJTIy0vlybwX7oLxsMIU28SmllJfZd/p7DtxqRr8xD2K1Wnn77bfZvHkzOTk5tycsWKuqQs1+OopPKaU8TO4k31tZOfjaLLwT9TBff7mTLVu2sGP/EQaOGMt9nQtZPNvZEHUvpTUopZTyMEmpl7iVlUOOgcysHPaeuUrLHoPYld2an364xGcfLWLllj2APZjN25RCcvpl+8XOBlN4Ka1BKaWUh8k/odfHZqFP68YkpV7iq8xGnKU2g3xTSd68iotfn+YfR2rwU5bg61hOKSzE7479r7yVBiillPIwTif0Ar42C9ezarIhpxO/62o4eSiZEZaabKY1V7Jqk5R66baVK7ydBiillPJArqzttzogiM1rV/FAjaPsz2lJ71Z9gTsXrvVWGqCUUspLFAxao/p1o34jfzav/ZSel9NJSVpL5s0BPLb4i7wBFnnNfl5IA5RSSnmxfh0D6dthNklJSaxfv54Tp07jlxPMOVOfzKycvGY/b6xVaYBSSikvJyL07duX0NBQliz9kJE3v+JLSwBHCKJP68Z3DFv3llqVDjNXSqkqIiAggKefeJyW7TrR1XaOxwPO0KaB3DFsPSn1EuBkiLqH0RqUUkpVIb6+vsyY8iCHDh1i5cqVxMTE0LnP4DuGrXtDrUoDlFJKVUFdunQhMDCQZcuWsW/Lal64qxPXm95N33bN8nb3LVir8rQApU18SilVRfn5+TF9+nTuu+8+zpw4AsfWE1jjJvDzZGCrkFer8jS6mrlSSlUDp06dIiEhgevXrzNs2DB69+7NvtPfu31kX1GrmWuAUkqpauL69eusWLGCr776inbt2jFu3Djq1Knj1jzpdhtKKaWoXbs2jzzyCKNHjyY1NZWYmBhSU1Pdna1CaYBSSik3q8zh3iJCeHg4s2fPpmbNmrz77rusX7+e7OzsCn/vktJRfEop5UbuGu7drFkz5syZw5o1a9ixYwdpaWlMnDiRRo0aVfh7u0prUEop5UaFTaKtDD4+PowdO5YHH3yQS5cuMX/+fA4ePFhp718clwKUiIwSkeMikiIiLzo5LyLymuP8QRHpke9cnIhcEJFDBa5pJCLrROSE49GzBuArpVQl8ITh3p06dSI6OprmzZuTkJDA8uXLuXnzZqXno6BiR/GJiBX4ChgOZAB7gMnGmCP50owBngLGAL2B/zXG9HacGwBcAxYZY7rku+bvwHfGmL86gp6fMea3ReVFR/EppaoiT1nINScnh61bt7J161b8/PyIjIykRYsWFfqeZR3FFw6kGGNSjTG3gKXAuAJpxmEPQMYYkwQ0FJEAAGPMVuA7J/cdB7zjeP4OMN6FvCilVJUTFuLHE4Pbun0lB4vFwqBBg4iKiiIrK4uFCxeyc+dO3DUdyZUAFQicyfc6w3GspGkKamaMOQfgeGzqLJGIzBGRvSKy9+LFiy5kVymlVFmEhIQQHR1Nhw4dWLduHUuWLOHatWuVng9XApQ4OVYwnLqSplSMMbHGmJ7GmJ7+/v7lcUullFLFqFWrFg8++CD3338/6enpxMTEkJKSUql5cCVAZQDB+V4HAV+XIk1B53ObAR2PF1zIi1JKqUoiIvTs2ZPZs2dTp04dlixZwpo1a8jKyqqU93clQO0B2olIKxHxBR4BEgukSQSmOUbz9QF+yG2+K0IiEOV4HgWsKEG+lVJKVZKmTZsya9YsevXqRVJSEnFxcVy6VPHD4YsNUMaYLOBJYA1wFPjQGHNYRKJFJNqRbBWQCqQAbwK/zL1eRN4HdgEdRCRDRGY6Tv0VGC4iJ7CPEPxrOZVJKaVUOfPx8WHMmDE8/PDDfP/998yfP58DBw5U6HvqYrFKKaVK5MqVKyQkJBAcHMyQIUPKdK+ihpnrUkdKKaVKpH79+kydOrXC30cDlFJKqRKzWCp+pTxdi08ppZRH0gCllFLKI2mAUkop5ZE0QCmllPJIGqCUUkp5JA1QSimlPJIGKKWUUh5JA5RSSimP5FVLHYnIRSC9BJc0Ab6toOxUJi2HZ9FyeBYth2cpaTlCjDFO91LyqgBVUiKyt7A1nryJlsOzaDk8i5bDs5RnObSJTymllEfSAKWUUsojVfUAFevuDJQTLYdn0XJ4Fi2HZym3clTpPiillFLeq6rXoJRSSnkpDVBKKaU8klcFKBGJE5ELInIo37F7RGSXiHwpIp+ISH3H8VAR+UlEDjh+YvJdE+ZInyIir4mIeGo5HOe6Os4ddpyv6W3lEJEp+f4vDohIjoh088Jy+IjIO47jR0XkpXzXeFM5fEXkLcfxL0RkkAeVI1hENjn+fQ+LyDOO441EZJ2InHA8+uW75iVHfo+LyEhPKEtJyyEijR3pr4nI6wXu5U3lGC4iyY78JovIkHz3Klk5jDFe8wMMAHoAh/Id2wMMdDyfAfyn43lo/nQF7rMb6AsI8Bkw2oPLYQMOAvc4XjcGrN5WjgLX3Q2keun/x6PAUsfz2kAaEOqF5XgCeMvxvCmQDFg8pBwBQA/H83rAV0An4O/Ai47jLwJ/czzvBHwB1ABaASc94W+kFOWoA9wHRAOvF7iXN5WjO9DC8bwLcLa05ai0X7py/McKLfAHeIWfB3sEA0ecpSvwj30s3+vJwHwPLscYYLG3l6PANX8B/uyN5XDk7xPsXxwaO/5YG3lhOeYBv8iXbgMQ7inlKFCmFcBw4DgQkO/35rjj+UvAS/nSr3F8CHpUWYorR75008kXoLy1HI7jAlzC/uWhxOXwqia+QhwCIhzPH8T+R5irlYjsF5EtItLfcSwQyMiXJsNxzN0KK0d7wIjIGhHZJyIvOI57Wznyexh43/Hc28rxMfAjcA44DfzDGPMd3leOL4BxImITkVZAmOOcR5VDREKxfyP/HGhmjDkH4Hhs6kgWCJzJd1lunj2mLC6WozDeXI5IYL8x5ialKEdVCFAzgCdEJBl79fOW4/g5oKUxpjvwHPCeo/3dWZunJ4y1L6wcNuzV/imOxwkiMhTvKwcAItIbuG6Mye0n8bZyhAPZQAvszUnPi0hrvK8ccdg/IPYC/wPsBLLwoHKISF0gHnjWGHOlqKROjpkijleqEpSj0Fs4Oebx5RCRzsDfgLm5h5wkK7IctpJm0tMYY44BIwBEpD1wv+P4TeCm43myiJzEXhvJAILy3SII+Loy8+xMYeXAnt8txphvHedWYe9nWIx3lSPXI/xcewLv+/94FFhtjMkELojIDqAnsA0vKocxJgv4VW46EdkJnAAu4wHlEBEf7B+GS4wxyxyHz4tIgDHmnIgEABccxzO4vaaem2e3/26VsByF8bpyiEgQkABMM8acdBwucTm8vgYlIk0djxbgP4AYx2t/EbE6nrcG2mHvmD8HXBWRPo4RJNOwt6m6VWHlwN6e3lVEaouIDRiIvR/B28qRe+xBYGnuMS8sx2lgiNjVAfpgb1f3qnI4fp/qOJ4PB7KMMR7xe+V434XAUWPMP/OdSgSiHM+j8uUrEXhERGo4mivbAbvdXZZSlMMpbyuHiDQEPsXeL7gjN3GpyuGujrZSds69j73pLhN7NJ4JPIO9o/or4K/83CEcCRzG3ta+D3gg3316Ym+bPwm8nnuNJ5bDkf4XjrIcAv7uxeUYBCQ5uY/XlAOoC3zk+P84AvzGS8sRir2T+yiwHvuWB55SjvuwN/0cBA44fsZgH5SyAXtNbwPQKN81Lzvye5x8I8PcWZZSliMN+A645vg/7ORt5cD+RejHfGkPAE1LUw5d6kgppZRH8vomPqWUUlWTBiillFIeSQOUUkopj6QBSimllEfSAKWUUsojaYBSqpI45k5tF5HR+Y49JCKr3ZkvpTyVDjNXqhKJSBfs86i6A1bsc0RGmZ9n25fkXlZjTHb55lApz6EBSqlKJiJ/xz6RsY7jMQT7FiQ24I/GmBWORTnfdaQBeNIYs1Ps+zb9AfuE3G7GmE6Vm3ulKo8GKKUqmWOJoX3YF25dCRw2xix2LBGzG3vtygA5xpgbItIOeN8Y09MRoD4FuhhjTrkj/0pVFq9fLFYpb2OM+VFEPsC+nM1DwAMi8mvH6ZpAS+yLaL4u9l2Hs7EvdJxrtwYnVR1ogFLKPXIcPwJEGmOO5z8pIn8EzgP3YB/MdCPf6R8rKY9KuZWO4lPKvdYATzlWd0ZEujuONwDOGWNygKnYB1QoVa1ogFLKvf4T8AEOisghx2uA/wOiRCQJe/Oe1ppUtaODJJRSSnkkrUEppZTySBqglFJKeSQNUEoppTySBiillFIeSQOUUkopj6QBSimllEfSAKWUUsoj/X8O6TsrKH8M1AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_alpha()\n", + "plot(alpha_series, color='gray')" + ] + }, + { + "cell_type": "markdown", + "id": "raising-anthony", + "metadata": {}, + "source": [ + "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", + "\n", + "Now, as an exercise, you can use this function to make a projection of world population until 2100.\n", + "\n", + "1. Create a `System` object that includes `alpha_func` as a system variable.\n", + "\n", + "2. Define a growth function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", + "\n", + "3. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", + "\n", + "4. Compare your projections with those from the US Census and UN." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "bigger-crystal", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "t_0 = 1960\n", + "t_end = 2100\n", + "p_0 = census[t_0]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "overhead-ethics", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha_func=alpha_func)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "verified-friday", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def growth_func_alpha(pop, t, system):\n", + " return system.alpha_func(t) * pop" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "fatal-status", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.06725033332680001" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "growth_func_alpha(p_0, t_0, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "balanced-pierre", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "results = run_simulation(system, growth_func_alpha);" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "relevant-sessions", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot_projections(table3)\n", + "plot(results, color='gray', label='model')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "informal-myrtle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# If the net growth rate continues to decrease linearly,\n", + "# world population will peak around 2065 at about 9.8 billion,\n", + "# and then start to decline." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "bridal-spread", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2066, 9.75910331482456)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results.idxmax(), results.max()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "annual-carbon", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 66f233e8e40e45b3794e7576246cff234f6ec6d5 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 29 Jan 2021 15:01:31 -0500 Subject: [PATCH 020/144] Revising chapters --- jupyter/chap02.ipynb | 387 ++++++------ jupyter/chap03.ipynb | 194 +++--- jupyter/chap04.ipynb | 156 ++--- jupyter/chap05.ipynb | 311 +++++----- jupyter/chap06.ipynb | 144 ++--- jupyter/chap07.ipynb | 182 +++--- jupyter/chap08.ipynb | 256 ++++---- jupyter/chap09.ipynb | 1378 ++++++++++++++++++++++++++++++++++++++++++ jupyter/chap10.ipynb | 656 ++++++++++++++++++++ 9 files changed, 2833 insertions(+), 831 deletions(-) create mode 100644 jupyter/chap09.ipynb create mode 100644 jupyter/chap10.ipynb diff --git a/jupyter/chap02.ipynb b/jupyter/chap02.ipynb index 41748cef..3c23b290 100644 --- a/jupyter/chap02.ipynb +++ b/jupyter/chap02.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "friendly-reserve", + "id": "victorian-latitude", "metadata": {}, "source": [ "# Chapter 2" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "rental-baptist", + "id": "cathedral-glasgow", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "framed-placement", + "id": "burning-chorus", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "disabled-nurse", + "id": "above-denial", "metadata": {}, "source": [ "# Bike share\n", @@ -83,7 +83,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "aggregate-carbon", + "id": "wrapped-workplace", "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "markdown", - "id": "scientific-connectivity", + "id": "accredited-evanescence", "metadata": {}, "source": [ "Now we can call it like this:" @@ -101,7 +101,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "reflected-tumor", + "id": "incorrect-comparison", "metadata": {}, "outputs": [], "source": [ @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "pressed-fighter", + "id": "living-wayne", "metadata": {}, "source": [ "The expressions in parentheses are **keyword arguments**.\n", @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "sixth-wilderness", + "id": "brief-diversity", "metadata": {}, "outputs": [ { @@ -150,7 +150,7 @@ }, { "cell_type": "markdown", - "id": "military-credits", + "id": "intermediate-midwest", "metadata": {}, "source": [ "And this:" @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "surprising-beverage", + "id": "designed-brazilian", "metadata": {}, "outputs": [ { @@ -179,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "mathematical-daughter", + "id": "phantom-oklahoma", "metadata": {}, "source": [ "Or, to display the state variables and their values, you can just type the name of the object:" @@ -188,7 +188,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "yellow-consultancy", + "id": "impaired-potter", "metadata": {}, "outputs": [ { @@ -212,7 +212,7 @@ " \n", " \n", " \n", - " values\n", + " State\n", " \n", " \n", " \n", @@ -243,7 +243,7 @@ }, { "cell_type": "markdown", - "id": "artificial-strand", + "id": "fleet-beijing", "metadata": {}, "source": [ "These values make up the **state** of the system.\n", @@ -254,7 +254,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "documented-coach", + "id": "floppy-trainer", "metadata": {}, "outputs": [], "source": [ @@ -264,7 +264,7 @@ }, { "cell_type": "markdown", - "id": "blank-pittsburgh", + "id": "natural-gossip", "metadata": {}, "source": [ "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "ahead-intro", + "id": "hungarian-bride", "metadata": {}, "outputs": [], "source": [ @@ -284,7 +284,7 @@ }, { "cell_type": "markdown", - "id": "suited-laser", + "id": "radical-mills", "metadata": {}, "source": [ "The result is the same either way." @@ -292,7 +292,7 @@ }, { "cell_type": "markdown", - "id": "retained-sauce", + "id": "controversial-opportunity", "metadata": {}, "source": [ "## Defining functions\n", @@ -305,7 +305,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "raised-conviction", + "id": "vertical-drawing", "metadata": {}, "outputs": [], "source": [ @@ -315,7 +315,7 @@ }, { "cell_type": "markdown", - "id": "impaired-teddy", + "id": "approximate-rolling", "metadata": {}, "source": [ "Rather than repeat them every time a bike moves, we can define a new\n", @@ -325,7 +325,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "covered-algorithm", + "id": "significant-nutrition", "metadata": {}, "outputs": [], "source": [ @@ -336,7 +336,7 @@ }, { "cell_type": "markdown", - "id": "marine-smith", + "id": "generous-tracker", "metadata": {}, "source": [ "`def` is a special word in Python that indicates we are defining a new\n", @@ -356,7 +356,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "sublime-question", + "id": "moving-jurisdiction", "metadata": {}, "outputs": [], "source": [ @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "lucky-scope", + "id": "meaningful-christmas", "metadata": {}, "source": [ "When you call the function, it runs the statements in the body, which\n", @@ -376,7 +376,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "divine-algeria", + "id": "proper-symposium", "metadata": {}, "outputs": [ { @@ -400,7 +400,7 @@ " \n", " \n", " \n", - " values\n", + " State\n", " \n", " \n", " \n", @@ -431,7 +431,7 @@ }, { "cell_type": "markdown", - "id": "interracial-farmer", + "id": "eleven-brook", "metadata": {}, "source": [ "When you call a function, you have to include the parentheses. If you\n", @@ -441,7 +441,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "worst-tomato", + "id": "identical-yacht", "metadata": {}, "outputs": [ { @@ -461,7 +461,7 @@ }, { "cell_type": "markdown", - "id": "racial-france", + "id": "premier-youth", "metadata": {}, "source": [ "This result indicates that `bike_to_wellesley` is a function. You don't\n", @@ -472,7 +472,7 @@ }, { "cell_type": "markdown", - "id": "deluxe-scoop", + "id": "brazilian-medicare", "metadata": {}, "source": [ "## Print statements\n", @@ -488,7 +488,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "awful-laundry", + "id": "heavy-patrol", "metadata": {}, "outputs": [ { @@ -509,7 +509,7 @@ }, { "cell_type": "markdown", - "id": "ignored-yugoslavia", + "id": "ancient-projection", "metadata": {}, "source": [ "Jupyter runs both lines, but it only displays the value of the\n", @@ -520,7 +520,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "infectious-hayes", + "id": "french-preference", "metadata": {}, "outputs": [ { @@ -539,7 +539,7 @@ }, { "cell_type": "markdown", - "id": "valued-religious", + "id": "original-hollywood", "metadata": {}, "source": [ "When you call the `print` function, you can put a variable name in\n", @@ -550,7 +550,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "foreign-collins", + "id": "alternative-keyboard", "metadata": {}, "outputs": [ { @@ -567,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "controversial-overall", + "id": "described-produce", "metadata": {}, "source": [ "Python looks up the values of the variables and displays them; in this\n", @@ -581,7 +581,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "polish-outdoors", + "id": "robust-holly", "metadata": {}, "outputs": [], "source": [ @@ -593,7 +593,7 @@ }, { "cell_type": "markdown", - "id": "sufficient-stone", + "id": "vital-lender", "metadata": {}, "source": [ "Each time we call this version of the function, it displays a message,\n", @@ -608,7 +608,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "scientific-edinburgh", + "id": "fifteen-atmosphere", "metadata": {}, "outputs": [], "source": [ @@ -620,7 +620,7 @@ }, { "cell_type": "markdown", - "id": "flying-evaluation", + "id": "requested-glasgow", "metadata": {}, "source": [ "And call it like this:" @@ -629,7 +629,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "rotary-carry", + "id": "matched-narrow", "metadata": {}, "outputs": [ { @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "active-rocket", + "id": "sitting-semiconductor", "metadata": {}, "source": [ "One benefit of defining functions is that you avoid repeating chunks of\n", @@ -657,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "wanted-facing", + "id": "enhanced-maintenance", "metadata": {}, "source": [ "## If statements\n", @@ -668,7 +668,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "protected-stewart", + "id": "active-graduate", "metadata": {}, "outputs": [], "source": [ @@ -677,7 +677,7 @@ }, { "cell_type": "markdown", - "id": "finished-attention", + "id": "adopted-train", "metadata": {}, "source": [ "When you call it, you provide a probability between 0 and 1, like `0.7`, as an example:" @@ -686,7 +686,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "substantial-azerbaijan", + "id": "illegal-metropolitan", "metadata": {}, "outputs": [ { @@ -706,7 +706,7 @@ }, { "cell_type": "markdown", - "id": "progressive-objective", + "id": "appropriate-funds", "metadata": {}, "source": [ "The result is one of two values: `True` with probability 0.7 or `False`\n", @@ -728,17 +728,9 @@ { "cell_type": "code", "execution_count": 22, - "id": "blond-prophet", + "id": "excessive-murder", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "heads\n" - ] - } - ], + "outputs": [], "source": [ "if flip(0.5):\n", " print('heads')" @@ -746,7 +738,7 @@ }, { "cell_type": "markdown", - "id": "fallen-hurricane", + "id": "seventh-profile", "metadata": {}, "source": [ "If the result from `flip` is `True`, the program displays the string\n", @@ -763,14 +755,14 @@ { "cell_type": "code", "execution_count": 23, - "id": "experimental-dispute", + "id": "fundamental-nursing", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "heads\n" + "tails\n" ] } ], @@ -783,7 +775,7 @@ }, { "cell_type": "markdown", - "id": "statistical-tooth", + "id": "recovered-chemical", "metadata": {}, "source": [ "Now we can use `flip` to simulate the arrival of students who want to\n", @@ -795,7 +787,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "protective-information", + "id": "twenty-health", "metadata": {}, "outputs": [ { @@ -813,7 +805,7 @@ }, { "cell_type": "markdown", - "id": "breathing-joseph", + "id": "difficult-construction", "metadata": {}, "source": [ "If students arrive at the Wellesley station every 3 minutes, on average,\n", @@ -824,9 +816,17 @@ { "cell_type": "code", "execution_count": 25, - "id": "better-suggestion", + "id": "played-character", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Olin\n" + ] + } + ], "source": [ "if flip(0.33):\n", " bike_to_olin()" @@ -834,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "smooth-doctrine", + "id": "standard-party", "metadata": {}, "source": [ "We can combine these snippets into a function that simulates a **time\n", @@ -844,7 +844,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "reserved-polls", + "id": "ecological-colon", "metadata": {}, "outputs": [], "source": [ @@ -858,7 +858,7 @@ }, { "cell_type": "markdown", - "id": "asian-absorption", + "id": "amateur-exposure", "metadata": {}, "source": [ "Then we can simulate a time step like this:" @@ -867,7 +867,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "hired-colors", + "id": "mediterranean-german", "metadata": {}, "outputs": [], "source": [ @@ -876,7 +876,7 @@ }, { "cell_type": "markdown", - "id": "isolated-principle", + "id": "sought-mobile", "metadata": {}, "source": [ "Even though there are no values in parentheses, we have to include them." @@ -884,7 +884,7 @@ }, { "cell_type": "markdown", - "id": "accompanied-ceremony", + "id": "organic-proportion", "metadata": {}, "source": [ "## Parameters\n", @@ -900,7 +900,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "accomplished-incentive", + "id": "hollywood-shopping", "metadata": {}, "outputs": [], "source": [ @@ -914,7 +914,7 @@ }, { "cell_type": "markdown", - "id": "governmental-intelligence", + "id": "encouraging-arkansas", "metadata": {}, "source": [ "The values of `p1` and `p2` are not set inside this function; instead,\n", @@ -924,16 +924,25 @@ { "cell_type": "code", "execution_count": 29, - "id": "bound-welsh", + "id": "buried-alert", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n" + ] + } + ], "source": [ "step(0.5, 0.33)" ] }, { "cell_type": "markdown", - "id": "simplified-popularity", + "id": "aggregate-dynamics", "metadata": {}, "source": [ "The values you provide when you call the function are called\n", @@ -945,9 +954,17 @@ { "cell_type": "code", "execution_count": 30, - "id": "potential-hardware", + "id": "recognized-denmark", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Moving a bike to Wellesley\n" + ] + } + ], "source": [ "p1 = 0.5\n", "p2 = 0.33\n", @@ -961,7 +978,7 @@ }, { "cell_type": "markdown", - "id": "severe-bride", + "id": "raised-museum", "metadata": {}, "source": [ "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", @@ -971,7 +988,7 @@ }, { "cell_type": "markdown", - "id": "naughty-natural", + "id": "scenic-african", "metadata": {}, "source": [ "## For loops\n", @@ -983,8 +1000,8 @@ }, { "cell_type": "code", - "execution_count": 62, - "id": "posted-bruce", + "execution_count": 31, + "id": "polish-river", "metadata": {}, "outputs": [ { @@ -1008,7 +1025,7 @@ }, { "cell_type": "markdown", - "id": "combined-handle", + "id": "compatible-conspiracy", "metadata": {}, "source": [ "The syntax here should look familiar; the first line ends with a\n", @@ -1029,7 +1046,7 @@ }, { "cell_type": "markdown", - "id": "spanish-turner", + "id": "breeding-groove", "metadata": {}, "source": [ "## TimeSeries" @@ -1037,21 +1054,21 @@ }, { "cell_type": "markdown", - "id": "arabic-parts", + "id": "flexible-projection", "metadata": {}, "source": [ "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", "corresponding sequence of quantities.\n", "\n", - "In this example, the time stamps will be integers representing minutes, and the quantities will be the number of bikes at one location.\n", + "In this example, the time stamps are integers representing minutes, and the quantities are the number of bikes at one location.\n", "\n", "Since we have moved a number of bikes around, let's start again with a new `State` object." ] }, { "cell_type": "code", - "execution_count": 63, - "id": "naval-earthquake", + "execution_count": 32, + "id": "every-consultation", "metadata": {}, "outputs": [], "source": [ @@ -1060,7 +1077,7 @@ }, { "cell_type": "markdown", - "id": "everyday-mechanics", + "id": "cross-sharp", "metadata": {}, "source": [ "We can create a new, empty `TimeSeries` like this:" @@ -1068,8 +1085,8 @@ }, { "cell_type": "code", - "execution_count": 64, - "id": "hispanic-honolulu", + "execution_count": 33, + "id": "changing-planet", "metadata": {}, "outputs": [], "source": [ @@ -1080,7 +1097,7 @@ }, { "cell_type": "markdown", - "id": "encouraging-auckland", + "id": "attractive-revision", "metadata": {}, "source": [ "And we can add a quantity like this:" @@ -1088,8 +1105,8 @@ }, { "cell_type": "code", - "execution_count": 65, - "id": "colonial-fireplace", + "execution_count": 34, + "id": "aquatic-richardson", "metadata": {}, "outputs": [], "source": [ @@ -1098,19 +1115,18 @@ }, { "cell_type": "markdown", - "id": "racial-arrival", + "id": "searching-funeral", "metadata": {}, "source": [ "The number in brackets is the time stamp, also called a **label**.\n", - "In this case, label is `0` and the quantity is the number of bikes at Olin.\n", "\n", "We can use a `TimeSeries` inside a for loop to store the results of the simulation:" ] }, { "cell_type": "code", - "execution_count": 66, - "id": "impressive-hours", + "execution_count": 35, + "id": "english-titanium", "metadata": {}, "outputs": [ { @@ -1118,6 +1134,8 @@ "output_type": "stream", "text": [ "0\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", "1\n", "Moving a bike to Olin\n", "2\n" @@ -1127,13 +1145,13 @@ "source": [ "for i in range(3):\n", " print(i)\n", - " step(0.3, 0.2)\n", + " step(0.6, 0.6)\n", " results[i+1] = bikeshare.olin" ] }, { "cell_type": "markdown", - "id": "minimal-credits", + "id": "prospective-joining", "metadata": {}, "source": [ "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", @@ -1151,8 +1169,8 @@ }, { "cell_type": "code", - "execution_count": 67, - "id": "finnish-lighting", + "execution_count": 36, + "id": "indonesian-singing", "metadata": {}, "outputs": [ { @@ -1166,7 +1184,7 @@ "Name: Quantity, dtype: int64" ] }, - "execution_count": 67, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1177,7 +1195,7 @@ }, { "cell_type": "markdown", - "id": "expensive-territory", + "id": "small-encoding", "metadata": {}, "source": [ "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", @@ -1189,8 +1207,8 @@ }, { "cell_type": "code", - "execution_count": 68, - "id": "right-bulletin", + "execution_count": 37, + "id": "verbal-bikini", "metadata": {}, "outputs": [ { @@ -1251,7 +1269,7 @@ "3 11" ] }, - "execution_count": 68, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1264,7 +1282,7 @@ }, { "cell_type": "markdown", - "id": "statutory-copyright", + "id": "visible-montgomery", "metadata": {}, "source": [ "You don't have to use `show`, but I think it looks better." @@ -1272,89 +1290,24 @@ }, { "cell_type": "markdown", - "id": "widespread-clinic", + "id": "following-contrary", "metadata": {}, "source": [ "## Plotting\n", "\n", - "ModSim provides a function called `plot` we can use to plot\n", - "the results:" + "`results` provides a function called `plot` we can use to plot\n", + "the results, and the ModSim library provides `decorate`, which we can use to label the axes and give the figure a title:" ] }, { "cell_type": "code", - "execution_count": 69, - "id": "computational-council", + "execution_count": 38, + "id": "saved-hands", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import plot\n", - "\n", - "plot(results)" - ] - }, - { - "cell_type": "markdown", - "id": "asian-sword", - "metadata": {}, - "source": [ - "The legend for this figure says \"None\" because we have not provided a label. Here's how we can do that:" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "touched-retailer", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results, label='Olin')" - ] - }, - { - "cell_type": "markdown", - "id": "expired-state", - "metadata": {}, - "source": [ - "Whenever you make a figure, you should label the axes. The ModSim\n", - "library provides `decorate`, which we can use to labels the axes and give the figure a title:" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "nominated-sister", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1368,7 +1321,7 @@ "source": [ "from modsim import decorate\n", "\n", - "plot(results, label='Olin')\n", + "results.plot()\n", "\n", "decorate(title='Olin-Wellesley Bikeshare',\n", " xlabel='Time step (min)', \n", @@ -1377,7 +1330,7 @@ }, { "cell_type": "markdown", - "id": "aboriginal-audio", + "id": "limited-interstate", "metadata": {}, "source": [ "## Summary\n", @@ -1396,7 +1349,7 @@ }, { "cell_type": "markdown", - "id": "protective-hearts", + "id": "fallen-surprise", "metadata": {}, "source": [ "## Exercises" @@ -1404,7 +1357,7 @@ }, { "cell_type": "markdown", - "id": "meaning-honduras", + "id": "capital-internship", "metadata": {}, "source": [ "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", @@ -1414,8 +1367,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "occasional-phone", + "execution_count": 39, + "id": "helpful-zambia", "metadata": {}, "outputs": [ { @@ -1424,7 +1377,7 @@ "2" ] }, - "execution_count": 41, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1437,7 +1390,7 @@ }, { "cell_type": "markdown", - "id": "enormous-hacker", + "id": "dirty-multiple", "metadata": {}, "source": [ "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." @@ -1445,8 +1398,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "id": "atlantic-newman", + "execution_count": 40, + "id": "beneficial-mainland", "metadata": {}, "outputs": [ { @@ -1470,7 +1423,7 @@ " \n", " \n", " \n", - " values\n", + " State\n", " \n", " \n", " \n", @@ -1494,7 +1447,7 @@ "namespace(olin=10, wellesley=2, babson=0)" ] }, - "execution_count": 42, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1508,7 +1461,7 @@ }, { "cell_type": "markdown", - "id": "ignored-landscape", + "id": "christian-madrid", "metadata": {}, "source": [ "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", @@ -1534,8 +1487,8 @@ }, { "cell_type": "code", - "execution_count": 72, - "id": "generic-works", + "execution_count": 41, + "id": "former-frost", "metadata": {}, "outputs": [], "source": [ @@ -1549,7 +1502,7 @@ " step(p1, p2)\n", " results[i+1] = bikeshare.olin\n", " \n", - " plot(results, label='Olin')\n", + " results.plot()\n", " decorate(title='Olin-Wellesley Bikeshare',\n", " xlabel='Time step (min)', \n", " ylabel='Number of bikes')" @@ -1557,37 +1510,51 @@ }, { "cell_type": "code", - "execution_count": 73, - "id": "distributed-tampa", + "execution_count": 42, + "id": "spare-honduras", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Olin\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", + "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Wellesley\n", "Moving a bike to Olin\n", "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n" + "Moving a bike to Wellesley\n", + "Moving a bike to Olin\n", + "Moving a bike to Wellesley\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1607,7 +1574,7 @@ }, { "cell_type": "markdown", - "id": "caroline-labor", + "id": "instructional-finnish", "metadata": {}, "source": [ "## Opening the hood\n", @@ -1619,7 +1586,7 @@ }, { "cell_type": "markdown", - "id": "undefined-harrison", + "id": "digital-stretch", "metadata": {}, "source": [ "The `State` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." @@ -1627,7 +1594,7 @@ }, { "cell_type": "markdown", - "id": "august-functionality", + "id": "declared-collar", "metadata": {}, "source": [ "The `TimeSeries` object is based on the `Series` object defined by a library called Pandas.\n", @@ -1639,7 +1606,7 @@ }, { "cell_type": "markdown", - "id": "numerical-cliff", + "id": "comfortable-pillow", "metadata": {}, "source": [ "`Series` objects provide their own `plot` function, but the syntax is different from the other functions we've used, so ModSim provides a function called `plot` just to make it consistent.\n", @@ -1650,7 +1617,7 @@ }, { "cell_type": "markdown", - "id": "overall-novel", + "id": "banner-policy", "metadata": {}, "source": [ "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", @@ -1660,8 +1627,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "offshore-czech", + "execution_count": 43, + "id": "agricultural-midwest", "metadata": {}, "outputs": [ { @@ -1688,7 +1655,7 @@ }, { "cell_type": "markdown", - "id": "european-cooling", + "id": "running-membership", "metadata": {}, "source": [ "You might not understand everything in this function yet, but you will." @@ -1697,7 +1664,7 @@ { "cell_type": "code", "execution_count": null, - "id": "familiar-future", + "id": "junior-lindsay", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap03.ipynb b/jupyter/chap03.ipynb index 57f108f3..3854e10c 100644 --- a/jupyter/chap03.ipynb +++ b/jupyter/chap03.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "missing-intention", + "id": "signal-format", "metadata": {}, "source": [ "# Chapter 3" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "comprehensive-extreme", + "id": "welcome-gentleman", "metadata": { "tags": [ "remove-cell" @@ -26,8 +26,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "electrical-charlotte", + "execution_count": 62, + "id": "backed-christianity", "metadata": { "tags": [ "remove-cell" @@ -41,18 +41,16 @@ " import pint\n", "except ImportError:\n", " !pip install pint\n", - " import pint\n", " \n", "try:\n", " import modsim\n", "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" + " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "handy-occurrence", + "id": "coral-steering", "metadata": {}, "source": [ "To paraphrase two Georges, \"All models are wrong, but some models are\n", @@ -67,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "authentic-supplier", + "id": "twelve-length", "metadata": {}, "source": [ "## Iterative modeling\n", @@ -91,7 +89,7 @@ }, { "cell_type": "markdown", - "id": "constant-kennedy", + "id": "sweet-heater", "metadata": {}, "source": [ "Some of these modeling decisions are better than others. For example,\n", @@ -114,7 +112,7 @@ }, { "cell_type": "markdown", - "id": "arranged-bahamas", + "id": "female-salem", "metadata": {}, "source": [ "## More than one State object\n", @@ -129,8 +127,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "outside-darkness", + "execution_count": 63, + "id": "embedded-heavy", "metadata": {}, "outputs": [], "source": [ @@ -141,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "widespread-monitor", + "id": "artificial-remains", "metadata": {}, "source": [ "When this function is called, it modifies `bikeshare`. As long as there\n", @@ -155,8 +153,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "central-vegetable", + "execution_count": 64, + "id": "unusual-advancement", "metadata": {}, "outputs": [], "source": [ @@ -167,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "finite-silence", + "id": "serial-mortality", "metadata": {}, "source": [ "The name of the parameter is `state` rather than `bikeshare` as a\n", @@ -180,8 +178,8 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "statistical-conviction", + "execution_count": 65, + "id": "packed-hungarian", "metadata": {}, "outputs": [], "source": [ @@ -193,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "still-commons", + "id": "fewer-rhythm", "metadata": {}, "source": [ "Again, the argument we provide gets assigned to the parameter, so this\n", @@ -210,8 +208,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "facial-tunnel", + "execution_count": 66, + "id": "right-assessment", "metadata": {}, "outputs": [], "source": [ @@ -221,7 +219,7 @@ }, { "cell_type": "markdown", - "id": "active-gilbert", + "id": "occupied-navigator", "metadata": {}, "source": [ "And update them independently:" @@ -229,8 +227,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "static-african", + "execution_count": 67, + "id": "cleared-advocacy", "metadata": {}, "outputs": [], "source": [ @@ -240,7 +238,7 @@ }, { "cell_type": "markdown", - "id": "honey-elder", + "id": "brown-ferry", "metadata": {}, "source": [ "Changes in `bikeshare1` do not affect `bikeshare2`, and vice versa. So\n", @@ -250,7 +248,7 @@ }, { "cell_type": "markdown", - "id": "animated-parliament", + "id": "magnetic-packing", "metadata": {}, "source": [ "## Documentation\n", @@ -271,8 +269,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "sticky-macedonia", + "execution_count": 68, + "id": "moral-parallel", "metadata": {}, "outputs": [], "source": [ @@ -289,7 +287,7 @@ }, { "cell_type": "markdown", - "id": "returning-faith", + "id": "therapeutic-utility", "metadata": {}, "source": [ "Docstrings follow a conventional format:\n", @@ -306,7 +304,7 @@ }, { "cell_type": "markdown", - "id": "frank-influence", + "id": "american-clear", "metadata": {}, "source": [ "## Negative bikes\n", @@ -321,8 +319,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "fitted-carnival", + "execution_count": 69, + "id": "divine-leisure", "metadata": {}, "outputs": [], "source": [ @@ -335,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "signal-baking", + "id": "decimal-denver", "metadata": {}, "source": [ "The first line checks whether the number of bikes at Wellesley is zero. If so, it uses a **return statement**, which causes the function to end immediately, without running the rest of the statements. So if there are no bikes at Wellesley, we \"return\" from `bike_to_olin` without changing the state.\n", @@ -345,8 +343,8 @@ }, { "cell_type": "code", - "execution_count": 11, - "id": "moral-bench", + "execution_count": 70, + "id": "choice-cooking", "metadata": {}, "outputs": [], "source": [ @@ -356,7 +354,7 @@ }, { "cell_type": "markdown", - "id": "imperial-disposal", + "id": "persistent-denmark", "metadata": {}, "source": [ "The state of the system should be unchanged." @@ -364,8 +362,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "latest-boards", + "execution_count": 71, + "id": "twelve-moderator", "metadata": {}, "outputs": [ { @@ -409,7 +407,7 @@ "namespace(olin=12, wellesley=0)" ] }, - "execution_count": 12, + "execution_count": 71, "metadata": {}, "output_type": "execute_result" } @@ -420,7 +418,7 @@ }, { "cell_type": "markdown", - "id": "substantial-english", + "id": "criminal-general", "metadata": {}, "source": [ "No more negative bikes (at least at Wellesley)." @@ -428,7 +426,7 @@ }, { "cell_type": "markdown", - "id": "marked-talent", + "id": "gorgeous-found", "metadata": {}, "source": [ "## Comparison operators\n", @@ -440,8 +438,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "typical-characterization", + "execution_count": 72, + "id": "level-burns", "metadata": {}, "outputs": [], "source": [ @@ -450,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "dependent-athens", + "id": "weighted-monster", "metadata": {}, "source": [ "On the other hand, the following statement checks whether `x` is `5` and\n", @@ -459,8 +457,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "living-baseball", + "execution_count": 73, + "id": "civic-remains", "metadata": {}, "outputs": [ { @@ -469,7 +467,7 @@ "True" ] }, - "execution_count": 14, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -480,7 +478,7 @@ }, { "cell_type": "markdown", - "id": "small-adventure", + "id": "forward-perth", "metadata": {}, "source": [ "You can use the equals operator in an `if` statement, like this:" @@ -488,8 +486,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "cordless-consideration", + "execution_count": 74, + "id": "affecting-naples", "metadata": {}, "outputs": [ { @@ -507,7 +505,7 @@ }, { "cell_type": "markdown", - "id": "mineral-azerbaijan", + "id": "consolidated-anatomy", "metadata": {}, "source": [ "If you make a mistake and use `=` in an `if` statement, like this:\n", @@ -522,7 +520,7 @@ }, { "cell_type": "markdown", - "id": "empty-lecture", + "id": "twelve-defensive", "metadata": {}, "source": [ "The equals operator is one of the **comparison operators**. The others\n", @@ -540,7 +538,7 @@ }, { "cell_type": "markdown", - "id": "caroline-advocacy", + "id": "center-sequence", "metadata": {}, "source": [ "## Metrics\n", @@ -565,8 +563,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "champion-gibson", + "execution_count": 75, + "id": "arbitrary-ferry", "metadata": {}, "outputs": [], "source": [ @@ -580,7 +578,7 @@ }, { "cell_type": "markdown", - "id": "living-leather", + "id": "severe-contact", "metadata": {}, "source": [ "If a customer arrives at the Wellesley station and finds no bike\n", @@ -593,8 +591,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "aging-evolution", + "execution_count": 76, + "id": "cardiovascular-montgomery", "metadata": {}, "outputs": [], "source": [ @@ -604,7 +602,7 @@ }, { "cell_type": "markdown", - "id": "painted-province", + "id": "computational-prior", "metadata": {}, "source": [ "We can test it by calling `bike_to_olin`:" @@ -612,8 +610,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "exciting-feature", + "execution_count": 77, + "id": "cosmetic-above", "metadata": { "scrolled": true }, @@ -624,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "integral-wheat", + "id": "pleased-gasoline", "metadata": {}, "source": [ "There should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." @@ -632,8 +630,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "aware-technology", + "execution_count": 78, + "id": "bulgarian-palestine", "metadata": {}, "outputs": [ { @@ -681,7 +679,7 @@ "namespace(olin=12, wellesley=0, wellesley_empty=1)" ] }, - "execution_count": 19, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } @@ -692,7 +690,7 @@ }, { "cell_type": "markdown", - "id": "appropriate-steps", + "id": "revised-associate", "metadata": {}, "source": [ "Looks good!" @@ -700,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "harmful-criminal", + "id": "native-kidney", "metadata": {}, "source": [ "## Summary\n", @@ -720,7 +718,7 @@ }, { "cell_type": "markdown", - "id": "gothic-backing", + "id": "impaired-cyprus", "metadata": {}, "source": [ "## Exercises" @@ -728,7 +726,7 @@ }, { "cell_type": "markdown", - "id": "limited-tamil", + "id": "careful-hacker", "metadata": {}, "source": [ "Here's the code we have so far, with docstrings, all in one place." @@ -736,12 +734,12 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "standing-garbage", + "execution_count": 79, + "id": "wrong-internet", "metadata": {}, "outputs": [], "source": [ - "from modsim import TimeSeries, plot, decorate\n", + "from modsim import TimeSeries, decorate\n", "\n", "def run_simulation(state, p1, p2, num_steps):\n", " \"\"\"Simulate the given number of time steps.\n", @@ -758,7 +756,7 @@ " step(state, p1, p2)\n", " results[i+1] = state.olin\n", " \n", - " plot(results, label='Olin')\n", + " results.plot(label='Olin')\n", " decorate(title='Olin-Wellesley Bikeshare',\n", " xlabel='Time step (min)', \n", " ylabel='Number of bikes')" @@ -766,8 +764,8 @@ }, { "cell_type": "code", - "execution_count": 48, - "id": "durable-vacuum", + "execution_count": 80, + "id": "instrumental-copyright", "metadata": {}, "outputs": [], "source": [ @@ -789,8 +787,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "id": "peripheral-maximum", + "execution_count": 81, + "id": "improved-renaissance", "metadata": {}, "outputs": [], "source": [ @@ -808,8 +806,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "exclusive-audio", + "execution_count": 82, + "id": "unavailable-maker", "metadata": {}, "outputs": [], "source": [ @@ -824,7 +822,7 @@ }, { "cell_type": "markdown", - "id": "useful-gabriel", + "id": "bigger-rapid", "metadata": {}, "source": [ "**Exercise:** Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add one to `olin_empty`.\n", @@ -834,8 +832,8 @@ }, { "cell_type": "code", - "execution_count": 51, - "id": "violent-grant", + "execution_count": 83, + "id": "phantom-carter", "metadata": {}, "outputs": [], "source": [ @@ -855,8 +853,8 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "acceptable-stress", + "execution_count": 84, + "id": "adopted-contrary", "metadata": {}, "outputs": [], "source": [ @@ -868,8 +866,8 @@ }, { "cell_type": "code", - "execution_count": 53, - "id": "measured-suggestion", + "execution_count": 85, + "id": "comparable-natural", "metadata": {}, "outputs": [], "source": [ @@ -880,8 +878,8 @@ }, { "cell_type": "code", - "execution_count": 54, - "id": "collected-column", + "execution_count": 86, + "id": "attractive-amendment", "metadata": {}, "outputs": [ { @@ -933,7 +931,7 @@ "namespace(olin=0, wellesley=12, olin_empty=1, wellesley_empty=0)" ] }, - "execution_count": 54, + "execution_count": 86, "metadata": {}, "output_type": "execute_result" } @@ -946,7 +944,7 @@ }, { "cell_type": "markdown", - "id": "understanding-humor", + "id": "possible-initial", "metadata": {}, "source": [ "**Exercise:** Now run the simulation a few times and confirm that the number of bikes is never negative. What's the final state of the system?" @@ -954,13 +952,13 @@ }, { "cell_type": "code", - "execution_count": 60, - "id": "quantitative-threat", + "execution_count": 87, + "id": "immune-shock", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -982,8 +980,8 @@ }, { "cell_type": "code", - "execution_count": 61, - "id": "hindu-reverse", + "execution_count": 88, + "id": "sporting-collectible", "metadata": {}, "outputs": [ { @@ -1035,7 +1033,7 @@ "namespace(olin=0, wellesley=12, olin_empty=2, wellesley_empty=0)" ] }, - "execution_count": 61, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } @@ -1047,7 +1045,7 @@ { "cell_type": "code", "execution_count": null, - "id": "institutional-dublin", + "id": "owned-fitting", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap04.ipynb b/jupyter/chap04.ipynb index d9ca99f7..45528b03 100644 --- a/jupyter/chap04.ipynb +++ b/jupyter/chap04.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "killing-desire", + "id": "existing-guidance", "metadata": {}, "source": [ "# Chapter 4" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "younger-hobby", + "id": "hawaiian-detective", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "satellite-sociology", + "id": "informed-defendant", "metadata": { "tags": [ "remove-cell" @@ -41,18 +41,16 @@ " import pint\n", "except ImportError:\n", " !pip install pint\n", - " import pint\n", " \n", "try:\n", " import modsim\n", "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" + " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "concrete-jackson", + "id": "caring-gnome", "metadata": {}, "source": [ "Here the code from previous chapters we'll reuse." @@ -61,7 +59,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "fifth-mongolia", + "id": "stylish-raising", "metadata": {}, "outputs": [], "source": [ @@ -84,7 +82,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "duplicate-evolution", + "id": "wound-bottle", "metadata": {}, "outputs": [], "source": [ @@ -103,7 +101,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "parental-veteran", + "id": "prescribed-affect", "metadata": {}, "outputs": [], "source": [ @@ -121,10 +119,10 @@ }, { "cell_type": "markdown", - "id": "outer-delivery", + "id": "atlantic-collectible", "metadata": {}, "source": [ - "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the arrival rate of customers at bike stations.\n", + "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the Customer rate of customers at bike stations.\n", "\n", "We also discuss a program development strategy, called incremental\n", "development, that might help you write programs faster and spend less\n", @@ -133,7 +131,7 @@ }, { "cell_type": "markdown", - "id": "aggressive-cambridge", + "id": "strategic-newspaper", "metadata": {}, "source": [ "## Functions that return values\n", @@ -144,7 +142,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "assisted-assault", + "id": "imposed-pregnancy", "metadata": {}, "outputs": [ { @@ -167,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "polar-marshall", + "id": "unsigned-recipe", "metadata": {}, "source": [ "When you run `State`, it returns a new `State` object:" @@ -176,7 +174,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "upper-closer", + "id": "accessible-wallace", "metadata": {}, "outputs": [ { @@ -234,7 +232,7 @@ }, { "cell_type": "markdown", - "id": "qualified-complaint", + "id": "missing-pendant", "metadata": {}, "source": [ "Not all functions have return values. For example, when you run `step`,\n", @@ -246,7 +244,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "exceptional-philosophy", + "id": "minimal-supervisor", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +254,7 @@ }, { "cell_type": "markdown", - "id": "sporting-japan", + "id": "sized-intensity", "metadata": {}, "source": [ "`add_five` takes a parameter, `x`, which could be any number. It\n", @@ -267,7 +265,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "differential-cooperation", + "id": "warming-program", "metadata": {}, "outputs": [ { @@ -287,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "pending-detail", + "id": "rental-representation", "metadata": {}, "source": [ "As a more useful example, here's a version of `run_simulation` that\n", @@ -298,7 +296,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "historic-hollow", + "id": "sitting-cleveland", "metadata": {}, "outputs": [], "source": [ @@ -316,7 +314,7 @@ }, { "cell_type": "markdown", - "id": "corporate-watershed", + "id": "minimal-ability", "metadata": {}, "source": [ "We can call `run_simulation` like this:" @@ -325,7 +323,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "sustained-centre", + "id": "difficult-shepherd", "metadata": {}, "outputs": [], "source": [ @@ -334,7 +332,7 @@ }, { "cell_type": "markdown", - "id": "assumed-bosnia", + "id": "charming-wheel", "metadata": {}, "source": [ "The result is a `State` object that represents the final state of the system, including the metrics we'll use to evaluate the performance of the system:" @@ -343,7 +341,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "relevant-colonial", + "id": "tough-sweet", "metadata": {}, "outputs": [ { @@ -361,7 +359,7 @@ }, { "cell_type": "markdown", - "id": "eight-singapore", + "id": "aggregate-lightweight", "metadata": {}, "source": [ "The simulation we just ran starts with `olin=10` and `wellesley=2`, and uses the values `p1=0.3`, `p2=0.2`, and `num_steps=60`. \n", @@ -378,7 +376,7 @@ }, { "cell_type": "markdown", - "id": "better-violation", + "id": "valuable-aircraft", "metadata": {}, "source": [ "## Loops and arrays\n", @@ -400,7 +398,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "mexican-cocktail", + "id": "bound-juice", "metadata": {}, "outputs": [ { @@ -423,7 +421,7 @@ }, { "cell_type": "markdown", - "id": "upper-christianity", + "id": "ordered-colleague", "metadata": {}, "source": [ "The arguments indicate where the sequence should start and stop, and how\n", @@ -439,7 +437,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "broadband-prairie", + "id": "commercial-methodology", "metadata": {}, "outputs": [ { @@ -461,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "hired-community", + "id": "finnish-budapest", "metadata": {}, "source": [ "When this loop runs, it\n", @@ -479,7 +477,7 @@ }, { "cell_type": "markdown", - "id": "fuzzy-blend", + "id": "crazy-belize", "metadata": {}, "source": [ "## Sweeping parameters\n", @@ -501,7 +499,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "oriented-mistress", + "id": "working-chair", "metadata": {}, "outputs": [ { @@ -529,7 +527,7 @@ }, { "cell_type": "markdown", - "id": "terminal-warren", + "id": "chicken-mainstream", "metadata": {}, "source": [ "Each time through the loop, we run a simulation with a different value\n", @@ -546,7 +544,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "foster-forestry", + "id": "instrumental-session", "metadata": {}, "outputs": [], "source": [ @@ -557,7 +555,7 @@ }, { "cell_type": "markdown", - "id": "crazy-storm", + "id": "listed-orleans", "metadata": {}, "source": [ "And add values like this:" @@ -566,7 +564,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "hollywood-municipality", + "id": "hollywood-technical", "metadata": {}, "outputs": [], "source": [ @@ -577,7 +575,7 @@ }, { "cell_type": "markdown", - "id": "daily-recipient", + "id": "instructional-showcase", "metadata": {}, "source": [ "The result is a `SweepSeries` that maps from each value of `p1` to the\n", @@ -586,13 +584,13 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "cooked-intent", + "execution_count": 49, + "id": "hollywood-spirit", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAApWElEQVR4nO3deXxU9b3/8deHLISwQ8KWBMMSdmRJRKVSF1xRQRBalbZa23Ktdf1pvdbeq2iv1tvWq22t7bVqtb2ola2C4o4bUsUkrGGNiGTYkrAFCCHLfH9/JCpFkCGZmXNm8n4+HjyYOXNmzvubgfnk+z3f+R5zziEiIuI3LbwOICIicjQqUCIi4ksqUCIi4ksqUCIi4ksqUCIi4kuJ0TxYWlqay87OjuYhRUTE5woKCsqdc+lHbo9qgcrOziY/Pz+ahxQREZ8zs8+Otl1DfCIi4ksqUCIi4ksqUCIi4ktRPQd1NDU1NQQCAaqqqryOEnYpKSlkZmaSlJTkdRQRkZjjeYEKBAK0bduW7OxszMzrOGHjnGPnzp0EAgF69erldRwRkZjj+RBfVVUVnTt3jqviBGBmdO7cOS57hiIi0XDcAmVmT5lZqZmtOmL7jWa2zsyKzOxXTQkRb8Xpc/HaLhGRaAilB/U0cOHhG8zsbGACcLJzbjDwm/BHExGR5uy4Bco59x6w64jNPwYedM4datinNALZoiYQCDBhwgRycnLo06cPN998M9XV1bzzzjtccsklAMybN48HH3zQ46QiIv5w19yVzCkMRPQYjT0H1Q8YY2Yfmdm7ZnbKsXY0s2lmlm9m+WVlZY08XOQ455g0aRKXXXYZGzZsYP369ezfv5+f//zn/7Lf+PHjufPOOz1KKSLiH4s2lPPsR5vZuudgRI/T2AKVCHQETgN+Crxgxzjh4px73DmX55zLS0//ylJLnlu4cCEpKSl8//vfByAhIYGHH36Yp556isrKyi/2e/rpp7nhhhsAuOaaa7jpppsYPXo0vXv3ZtasWZ5kFxGJtpq6INPnF9GzUyo/HNM7osdq7DTzADDH1V8vfomZBYE0oEldpHvnF7F6a0VTXuIrBvVoxz2XDj7m40VFReTm5v7Ltnbt2tGzZ0+Ki4uP+bxt27axaNEi1q5dy/jx45k8eXLYMouI+NUzizdRXLqfJ76XR0pSQkSP1dge1D+AcwDMrB+QDJSHKVNUOeeOOtvuWNs/d9lll9GiRQsGDRrEjh07IhlRRMQXSiuqeOTNDZzdP52xA7tE/HjH7UGZ2XPAWUCamQWAe4CngKcapp5XA1c39Kaa5Ot6OpEyePBgZs+e/S/bKioqKCkpoU+fPsd8XsuWLb+4HYami4j43oOvrqW6Nsjdlw6OytdoQpnFd6VzrrtzLsk5l+mce9I5V+2c+45zbohzbqRzbmHEk0bI2LFjqays5K9//SsAdXV13HbbbVxzzTWkpqZ6nE5ExB8KPtvFnMIt/GBML3qltY7KMT1fScJrZsbcuXOZOXMmOTk59OvXj5SUFB544AGvo4mI+EJd0HHPvCK6tUvhhrP7Ru24Fs3hqby8PHfkBQvXrFnDwIEDo5Yh2uK9fSIS/579aDN3zV3Jb68YzoThGWF/fTMrcM7lHbm92fegRETk2PZUVvPr19Yyqlcnxg/rEdVjq0CJiMgx/c8b69l7sIbpUZoYcThfFKh4nQUXr+0SkeZh9dYK/u/Dz/jOaScxqEe7qB/f8wKVkpLCzp074+7D/PPrQaWkpHgdRUTkhDnnmD6viPatkvh/5/XzJIPnFyzMzMwkEAjgx3X6murzK+qKiMSaecu3smTTLh6YOJQOqcmeZPC8QCUlJemKsyIiPnLgUC0PLFjDkIx2fPuULM9yeF6gRETEXx59u5gdFYd4bGouCS28u/Cq5+egRETEPz4tP8AT729k0sgMck/q6GkWFSgREfnCffOLaJmYwJ0XDfA6igqUiIjUe2vNDt5eV8bNY3Po0tb7GcgqUCIiQlVNHfe9tJo+6a25enS213EATZIQERHgyUWf8tnOSv72g1EkJ/qj7+KPFCIi4pmtew7y6MJiLhzcjTE56V7H+YIKlIhIM3f/gjUEnePnF/vrygsqUCIizdjiT8p5ecU2fnxWH7I6+esirSpQIiLNVG1dkHvnrSazYyuuO7OP13G+4rgFysyeMrNSM1t1lMduNzNnZmmRiSciIpHytw8/Y92OffzHxYNISUrwOs5XhNKDehq48MiNZpYFnAdsDnMmERGJsPL9h/ifN9YzJieNCwZ39TrOUR23QDnn3gN2HeWhh4E7gPi6ToaISDPw61fXcbC6jns8uBBhqBp1DsrMxgNbnHPLQ9h3mpnlm1l+PF5SQ0Qk1iwv2cMLBSV8/xvZ9O3Sxus4x3TCBcrMUoGfA3eHsr9z7nHnXJ5zLi893T/z60VEmqNg0HH3vCLS2rTkprE5Xsf5Wo3pQfUBegHLzWwTkAkUmlm3cAYTEZHwm1UYYHnJHu68cABtU5K8jvO1TnipI+fcSqDL5/cbilSec648jLlERCTMKqpq+NWraxnZswMTR2R4Hee4Qplm/hzwT6C/mQXM7AeRjyUiIuH2yBsb2HmgmvsmDKGFhxciDNVxe1DOuSuP83h22NKIiEhErN+xj2f+uYkrTunJkIz2XscJiVaSEBGJc845ps8rok3LRH56QX+v44RMBUpEJM69smo7iz/ZyW3n96NT62Sv44RMBUpEJI4drK7j/pfXMKBbW64a1dPrOCdEFywUEYljf3ynmC17DvL3aaeRmBBbfZLYSisiIiHbvLOSP723kfHDenBq785exzlhKlAiInHqvpdWk9jCuGucvy5EGCoVKBGROPTOulLeXLODG8/JoVv7FK/jNIoKlIhInKmuDXLf/NX0SmvNtWdkex2n0VSgRETizFMffMrG8gPcfekgWib670KEoVKBEhGJIzsqqvj9Wxs4d2AXzu7f5fhP8DEVKBGROPLLBWuoCTr+85JBXkdpMhUoEZE48fGmXfxj2VamjenNSZ1bex2nyVSgRETiQF3Qcc+LRfRon8L1Z/fxOk5YqECJiMSBZ5dsZvW2Cu66eCCpyfGxSJAKlIhIjNt9oJqHXl/H6b07c/HQ7l7HCRsVKBGRGPeb19exr6qW6eMHY+b/CxGGSgVKRCSGrdqyl2eXbOa7p51E/25tvY4TVqFc8v0pMys1s1WHbfu1ma01sxVmNtfMOkQ0pYiIfMXnFyLslJrMref18zpO2IXSg3oauPCIbW8AQ5xzJwPrgZ+FOZeIiBzHP5ZtIf+z3dxxYX/at0ryOk7YHbdAOefeA3Ydse1151xtw90PgcwIZBMRkWPYf6iWXy5Yy7DM9kzJzfI6TkSE4xzUtcArYXgdEREJ0e/f2kDpvkNMHz+YFi3iZ2LE4ZpUoMzs50AtMONr9plmZvlmll9WVtaUw4mICFBcup+nPviUKbmZjOjZ0es4EdPoAmVmVwOXAFOdc+5Y+znnHnfO5Tnn8tLT0xt7OBERoX5ixL3zi0hJSuCOCwd4HSeiGlWgzOxC4N+B8c65yvBGEhGRY3l99Q7e31DOref2I71tS6/jRFQo08yfA/4J9DezgJn9AHgUaAu8YWbLzOxPEc4pItLsVdXU8YuXVtOvaxu+e/pJXseJuOMu2OScu/Iom5+MQBYREfka//vuRgK7D/Lsj04lKSH+11mI/xaKiMSBwO5KHnunmIuHdmd0nzSv40SFCpSISAy4/+U1mMFdFw/0OkrUqECJiPjcB8XlvLJqOz85qy8ZHVp5HSdqVKBERHyspi7IPfOK6NkplR99s7fXcaJKBUpExMeeWbyJ4tL9/Oclg0hJSvA6TlSpQImI+FTZvkP89s0NnNkvnXMHdvE6TtSpQImI+NR/v7qWqto67rl0UFxdiDBUKlAiIj5UuHk3swoCXHtGL3qnt/E6jidUoEREfCYYrL8QYZe2LbnxnByv43hGBUpExGdeyC9hRWAvd40bSJuWx13wJ26pQImI+Mjeyhp+9do6TsnuyIThPbyO4ykVKBERH3n4zfXsqaxm+vjBzXJixOFUoEREfGLt9gr+9uFnXHVqTwb3aO91HM+pQImI+IBzjnteLKJdSiK3n9/f6zi+oAIlIuID81ds46NPd3H7Bf3pkJrsdRxfUIESEfHYgUO1PPDyGoZktOOKU3p6Hcc3mu/8RRERn/jD28Vsr6jiD1NHkNCieU+MOJx6UCIiHtpUfoAn3v+USSMyyD2pk9dxfOW4BcrMnjKzUjNbddi2Tmb2hpltaPi7Y2RjiojEp/teWk1yYgvuvGiA11F8J5Qe1NPAhUdsuxN4yzmXA7zVcF9ERE7AwrU7WLi2lJvG9qVLuxSv4/jOcQuUc+49YNcRmycAzzTcfga4LLyxRETi26HaOu6bv5re6a25ZnQvr+P4UmPPQXV1zm0DaPj7mBcqMbNpZpZvZvllZWWNPJyISHx54v1P2bSzkumXDiY5UdMBjibiPxXn3OPOuTznXF56enqkDyci4nvb9h7k0YXFnD+oK9/sp8/FY2lsgdphZt0BGv4uDV8kEZH49sCCtQSd4z8vGeR1FF9rbIGaB1zdcPtq4MXwxBERiW8fbtzJ/OVb+bcz+5DVKdXrOL4WyjTz54B/Av3NLGBmPwAeBM4zsw3AeQ33RUTka9TWBZk+r4iMDq348Zl9vI7je8ddScI5d+UxHhob5iwiInFtxkebWbt9H3+cOpJWyQlex/E9TR0REYmCnfsP8dDr6/hG385cOKSb13FiggqUiEgU/Ob1dVRW1zH9Ul2IMFQqUCIiEbYisIfnPy7h6tHZ5HRt63WcmKECJSISQcGg4555RXRu3ZKbz83xOk5MUYESEYmg2YUBlm7ew50XDaBdSpLXcWKKCpSISIRUVNXw36+uZUTPDkwakeF1nJijCxaKiETIb9/cwM4D1fzlmlG00IUIT5h6UCIiEbBhxz6eWbyJK07JYmhme6/jxCQVKBGRMHPOMX1+EanJCdx+fn+v48QsFSgRkTB7ddV2PijeyW3n96dzm5Zex4lZKlAiImF0sLqO/3p5DQO6tWXqqT29jhPTNElCRCSM/vjuJ2zZc5Dnp51GYoL6AE2hn56ISJiU7KrkT+9+wqXDenBa785ex4l5KlAiImHyi5dWk2DGXeMGeB0lLqhAiYiEwXvry3h99Q5uOKcv3du38jpOXFCBEhFpouraINPnF5HdOZUfjunldZy4oQIlItJETy/+lI1lB7j70kG0TNSFCMNFBUpEpAlKK6r47ZsbOGdAF84Z0NXrOHGlSQXKzG41syIzW2Vmz5lZSriCiYjEggdfWUtNnePuSwZ5HSXuNLpAmVkGcBOQ55wbAiQAV4QrmIiI3xV8tos5S7fwwzG9yE5r7XWcuNPUIb5EoJWZJQKpwNamRxIR8b+6oOPuF4vo3j6FG87p63WcuNToAuWc2wL8BtgMbAP2OudeP3I/M5tmZvlmll9WVtb4pCIiPvL8x5sp2lrBXeMGkpqsRXkioSlDfB2BCUAvoAfQ2sy+c+R+zrnHnXN5zrm89PT0xicVEfGJ3Qeq+fVr6zitdycuObm713HiVlOG+M4FPnXOlTnnaoA5wOjwxBIR8a+H3ljHvqpapo8fjJkuRBgpTSlQm4HTzCzV6t+hscCa8MQSEfGnoq17efajzXz3tJMY0K2d13HiWlPOQX0EzAIKgZUNr/V4mHKJiPiOc47p84rokJrMref28zpO3GvSmT3n3D3APWHKIiLiay8u28rHm3bz4KShtE9N8jpO3NNKEiIiIdh/qJYHFqzh5Mz2fCsvy+s4zYLmRoqIhOD3CzdQuu8Q//vdXFq00MSIaFAPSkTkOD4p289Tiz5lcm4mI3p29DpOs6ECJSLyNZxz3Dd/NSmJCfz7hboQYTSpQImIfI0315Ty7voybj43h/S2Lb2O06yoQImIHENVTR2/eGk1OV3acPXobK/jNDuaJCEicgx/fm8jm3dVMuOHp5KUoN/no00/cRGRo1i9tYJH3y7moiHd+EbfNK/jNEsqUCIiR9hXVcP1Mwpo3yqJX1w2xOs4zZaG+EREDuOc487ZKynZfZDnfnQaaW00McIr6kGJiBzmmcWbeHnlNn56QX9G9erkdZxmTQVKRKTBspI93L9gDWMHdGHamN5ex2n2VKBERIA9ldX8ZEYhXdqm8NC3hmk5Ix/QOSgRafaCQcdtLyyndF8VL/zb6XRITfY6kqAelIgIj7+/kbfWlnLXuIFaa89HVKBEpFlb8ukufv3aOsYN7cY1Wi3CV1SgRKTZKt9/iBufKySrYysevPxkzHTeyU9UoESkWaoLOm55fhm7K2v4w9SRtEvRFXL9pkkFysw6mNksM1trZmvM7PRwBRMRiaRHFxazqLice8cPZnCP9l7HkaNo6iy+3wKvOucmm1kykBqGTCIiEbVoQzmPvLWeiSMyuOIUXb7drxpdoMysHfBN4BoA51w1UB2eWCIikbGjooqbn19K3/Q23D9xiM47+VhThvh6A2XAX8xsqZk9YWatj9zJzKaZWb6Z5ZeVlTXhcCIiTVNbF+TGZ5dSWV3HY1NHkpqsr4L6WVMKVCIwEvijc24EcAC488idnHOPO+fynHN56enpTTiciEjTPPTGepZs2sUDk4aQ07Wt13HkOJpSoAJAwDn3UcP9WdQXLBER31m4dgd/fOcTrhyVxcQRmV7HkRA0ukA557YDJWbWv2HTWGB1WFKJiIRRYHclt/59OYO6t+OeSwd7HUdC1NQB2BuBGQ0z+DYC3296JBGR8KmuDfKTZ5dSF3Q8NnUkKUkJXkeSEDWpQDnnlgF54YkiIhJ+v3xlDctL9vDY1JFkp31lHpf4mFaSEJG49crKbfzlg01cMzqbcUO7ex1HTpAKlIjEpU3lB7hj1gqGZXXgrnEDvY4jjaACJSJxp6qmjutnFNKihfGHq0aQnKiPulikb6mJSNy5d/5qVm+r4Mmr88jsqBXYYpV+rRCRuDJ3aYDnlmzmujP7MHZgV6/jSBOoQIlI3NiwYx93zVnFqOxO3H5+P6/jSBOpQIlIXKisruX6GYWkJifwuytHkJigj7dYp3NQIhLznHP8x9xVFJft52/Xnkq39ileR5Iw0K8YIhLz/v5xCXOWbuHmsTmckZPmdRwJExUoEYlpRVv3cve8Is7om8aN5+R4HUfCSAVKRGLWvqoafjKjkA6tknjkiuEktNDFB+OJzkGJSExyznHn7JWU7D7Icz86jbQ2Lb2OJGGmHpSIxKRnFm/i5ZXb+OkF/RnVq5PXcSQCVKBEJOYsK9nD/QvWMHZAF6aN6e11HIkQFSgRiSl7Kqv5yYxCurRN4aFvDaOFzjvFLZ2DEpGYEQw6bnthOaX7qph53Wg6pCZ7HUkiSD0oEYkZf35/I2+tLeXn4wYyPKuD13EkwppcoMwswcyWmtlL4QgkInI0Sz7dxa9eW8e4od24enS213EkCsLRg7oZWBOG1xEROary/Ye48blCsjq24sHLT8ZM552agyYVKDPLBC4GnghPHBGRf1UXdNzy/DJ2V9bwh6kjaZeS5HUkiZKm9qAeAe4Agk2PIiLyVY8uLGZRcTn3jh/M4B7tvY4jUdToAmVmlwClzrmC4+w3zczyzSy/rKyssYcTkWbog+JyHnlrPZNGZHDFKVlex5Eoa0oP6hvAeDPbBDwPnGNm/3fkTs65x51zec65vPT09CYcTkSakx0VVdz8/FL6prfhvyYO0XmnZqjRBco59zPnXKZzLhu4AljonPtO2JKJSLNVWxfkxmeXcuBQHY9NHUlqsr6y2RzpXRcR33nojfUs2bSLh789jJyubb2OIx4JS4Fyzr0DvBOO1xKR5m3h2h388Z1PuHJUFhNHZHodRzyklSRExDcCuyu59e/LGdS9HfdcOtjrOOIxFSgR8YXq2iA3PLuUuqDjsakjSUlK8DqSeEznoETEF375yhqWlezhsakjyU5r7XUc8QH1oETEc6+s3MZfPtjENaOzGTe0u9dxxCdUoETEU5vKD3DHrBUMy+rAXeMGeh1HfEQFSkQ8U1VTx/UzCmnRwvjDVSNITtRHknxJ56BExDP3zl/N6m0VPHl1HpkdU72OIz6jX1dExBNzlwZ4bslmrjuzD2MHdvU6jviQCpSIRN2GHfu4a84qRmV34vbz+3kdR3xKBUpEoqqyupbrZxSSmpzA768aQWKCPobk6HQOSkSixjnHf8xdRXHZfv527al0bZfidSTxMf3qIiJR8/ePS5izdAs3j83hjJw0r+OIz6lAiUhUFG3dy93zijijbxo3npPjdRyJASpQIhJx+6pq+MmMQjqmJvHIFcNJaKGLD8rx6RyUiESUc447Z6+kZPdBnvvRaaS1ael1JIkR6kGJSEQ9s3gTL6/cxk8v6M+oXp28jiMxRAVKRCJmWcke7l+whrEDujBtTG+v40iMUYESkYjYU1nNT2YU0qVtCg99axgtdN5JTlCjC5SZZZnZ22a2xsyKzOzmcAYTkdgVDDpue2E5pfuq+MPUkXRITfY6ksSgpkySqAVuc84VmllboMDM3nDOrQ5TNhGJUX9+fyNvrS1l+qWDGJ7Vwes4EqMa3YNyzm1zzhU23N4HrAEywhVMJFwOVtfxetF21m6v8DpKs7Dk01386rV1jBvajatHZ3sdR2JYWKaZm1k2MAL46CiPTQOmAfTs2TMchxM5LucchZt3M6sgwEvLt7HvUC0AQzPaMzk3k/HDetCxtYadwq18/yFufK6QrI6tePDykzHTeSdpPHPONe0FzNoA7wL3O+fmfN2+eXl5Lj8/v0nHE/k62/YeZE7hFmYXBNhYfoBWSQmMG9qdCcN78EnZfmYVBCjaWkFyQgvOHdSFybmZfDMnXQuWhkFd0HH1U0tYsmkXc68fzeAe7b2OJDHCzAqcc3lHbm9SD8rMkoDZwIzjFSeRSKmqqeP11TuYVRBg0YYygg5GZXfiurP6MG5od9q0rP9n/s1+6Xz/G71YvbWCWQUB/rFsCwtWbie9bUsmjchgcm4mOV3betya2PXowmIWFZfzy0lDVZwkLBrdg7L6vvszwC7n3C2hPEc9KAkX5xzLSvYwqyDAvOVb2VdVS0aHVlw+MoNJIzPJTmt93Neorg3y9rpSZuYHeHtdKXVBx7CsDvVDgCf3oH1qUhRaEh8+KC7nO09+xMThGTz0rWEa2pMTcqweVFMK1BnA+8BKINiw+S7n3IJjPUcFSpqqtKKKOUu3MKsgQHHpflKSWnDRkO5Mzs3k9N6dG/1dm7J9h3hxWf3rrt2+j+TEFpw/qCuTczMZk5OuteO+xo6KKi7+3ft0TE3mxRu+QWqyVlCTExP2AtUYKlDSGIdq63hzdSmzCkp4d339EF7uSR2ZkpvJuJO70y4lfD0d5xxFWyuYmV/Ci8u3sqeyhq7tWjJpZCaTczPpk94mbMeKB7V1Qa7680es3LKXeTd8Q0Ok0igqUBJTnHOs2lLBzIISXly2lb0Ha+jWLoXLczO4fGQmvaNQKA7V1rFwTSkzCwK8u76MuqBjZM8OTM7N4pJh4S2Mseq/X13LH9/5hIe/PYyJIzK9jiMxSgVKYsLnQ20z8wOs21E/1HbB4G5Myc3kG33TPBtqK62oYu7SLcxsGFpsmdiCC4d0Y0puFqf36dwshwAXrt3BtU/nc+Wonvxy0lCv40gMU4ES36quDbJwbf0Q3tvr6nsqwxsmK1w6rAftW/mnp+KcY3lgL7MKSpi3bCsVVbX0aJ/yxRBgKJMz4kFgdyUX/24RGR1aMef60aQkJXgdSWKYCpT4TtHWvcwqCPDisq3sOlBNl7YtmTgygym5mfTt4v9zGVU1dbzRML39/Ybp7adkd2RKbhbjTv5yenu8qa4N8q3//SfFpft56cYzmk1RlshRgRJf2Ln/EC8u28qsggCrt9V/Yfa8QV2ZnJfJmL5pMfuF2e17q5izNMCsggAby+q/IHzR0G5Mzs3ktF6Nn13oR/fOL+IvH2zisakjGTe0u9dxJA6oQIlnauqCvLOujFkFJSxcW0pNnePkzC+XHIqnla7rl1ja07DE0lb2Haols2MrLm8YAszqlOp1xCZ5ZeU2fjyjkGtGZzN9/GCv40icUIGSqFu3fR8z80v4x7ItlO+vJq1NMhNHZHB5biYDurXzOl7EHayu4/XV2+tXuCguxzk4tVcnpuRlcdGQbrSOsSHATeUHuPT3i+jdpQ0z/+10khNjs7cr/qMCJVGxp7L6iyG8lVv2kpRgjB1Q/4XXM/unkxSjQ3hNtWXPQeYW1g8BbtpZSWpyAhcPrf+C8ahenXy/8kJVTR2THlvMlj0HefmmM8jsGNs9QfEXFSiJmNq6IO9vKGdmQQlvri6lui7I4B7tmJybyYThGXTSquFfcM6R/9luZuUHeGnFVg5U19GzUyqTczOZNDLDtx/8P5uzkueWbObJq/MYO7Cr13EkzqhASdht2LGPWQUB5izdQtm+Q3Rqncxlw+sXXR3UI/6H8JqqsrqWV1fVDwEu/mQnZjC6T2cm52Zy4eDutEr2x9TtuUsD3Pr35Vx3Zh/uvGiA13EkDqlASVjsraxh/oqtzCwIsLxkDwktjLP7d2FKXiZn9++i8xKNVLKrkjmFW5hVWELJroO0aZnIJSfXDwHmntTRsyHADTv2Mf7RDxia0Z5nf3RqzM6yFH9TgZJGqws6FhWXM6sgwGtF26muDTKgW9svhvDS27b0OmLcCAYdSzbtYmZ+gAUrt3Gwpo5eaa2ZnJvJxBEZ9OjQKmpZKqtrmfDoB+w6UM2Cm8fQtV1K1I4tzYsKlJywT8r2M7sgwJzCLWyvqKJDahIThvVgSl4Wg3u08/2J/Vi3/1Atr6zcxsyCAEs+3YUZnNE3jcm5mVwwuFtEV29wznHbC8uZu2wLf7v2VM7ISYvYsURUoCQkFVU1vLxiGzPzSyjcXD+Ed2a/dKbkZnLOwC60TPTHeZHm5rOdB5hdEGB24Ra27DlI25RELh3Wgym5mQzP6hD2XxaeX7KZO+es5JZzc7jl3H5hfW2RI6lAyTEFg47Fn+xkVkEJrxZtp6omSN8ubZjSMKzURUM7vhEMOj7cuJOZBQFeWbWNqpogfdJbMzk3i0kjM8IyDFe0dS8TH1vMqOxOPHPtqGa5EK5ElwqUfMWm8gPMLgwwuyDA1r1VtEtJZPzwHkzOzWJYZnsN4fncvobe7qyCAPmf7aaF1V/WfkpuFmMHdmnUEOC+qhou/f0iDtbU8fJNY0hro/OLEnkqUALUn9dY0PChtmTTLloYjMlJZ3JuJucN6qpVqWPUxrL9zC6sP1+4bW8V7VslMX5YD6bkZTI0I7RfNpxz3PDsUl4t2s5zPzqNUb06RSG5iApUsxYMOj76dBczC0p4ZeV2DtbU0Tu9fmbYpBGZdGuvIbx4URd0fHDYjMtDtUH6dW3DlNwsJozoQZe2x36vn1m8iXvmFXHnRQO47sw+UUwtzV1ECpSZXQj8FkgAnnDOPfh1+6tARVfJrkpmFQSYXRggsPsgbVsmcsmwHkzOzWRkz/CfWBd/2XuwhpdW1C87tXTz599Zq+8tnzOg6798Z21ZyR6m/Gkx38xJ58/fy4ur1dfF/8JeoMwsAVgPnAcEgI+BK51zq4/1HBWoyKusruWVlduZWVDChxujOzVZ/Ku4dB+zCrYwpzBA6b5DdExNYkLDqh+ZHVtx8e8WAfDyTWfE1eryEhsiUaBOB6Y75y5ouP8zAOfcL4/1nKYWqKqaOu6YtaLRz493h2rrWLShnAPVdWR3rl/fbeLITDKi+OVO8bfauiDvNwwBvlG0g+q6IO1SEjlYU8fM60YzPKuD1xGlGTpWgWrKev8ZQMlh9wPAqUc58DRgGkDPnj2bcDhwDlZu2duk14hnBlx8cnem5GWR5+HyOOJfiQktOLt/F87u34U9ldXMX76V+Su2MXlkpoqT+E5TelBTgAuccz9suP9dYJRz7sZjPUdDfCIicqRj9aCasvJjAMg67H4msLUJryciIvKFphSoj4EcM+tlZsnAFcC88MQSEZHmrtHnoJxztWZ2A/Aa9dPMn3LOFYUtmYiINGtNmSSBc24BsCBMWURERL6gq4+JiIgvqUCJiIgvqUCJiIgvqUCJiIgvqUCJiIgvRfVyG2ZWBnwWhpdKA8rD8DqxQG2NT2pr/GpO7Q1XW09yzqUfuTGqBSpczCz/aMtixCO1NT6prfGrObU30m3VEJ+IiPiSCpSIiPhSrBaox70OEEVqa3xSW+NXc2pvRNsak+egREQk/sVqD0pEROKcCpSIiPiSbwuUmV1oZuvMrNjM7jzK42Zmv2t4fIWZjfQiZ7iE0N4BZvZPMztkZrd7kTFcQmjr1Ib3dIWZLTazYV7kDIcQ2jqhoZ3LzCzfzM7wImc4HK+th+13ipnVmdnkaOYLpxDe17PMbG/D+7rMzO72Imc4hPK+NrR3mZkVmdm7YTu4c853f6i/vtQnQG8gGVgODDpin3HAK4ABpwEfeZ07wu3tApwC3A/c7nXmCLd1NNCx4fZFsfrehtjWNnx5LvhkYK3XuSPV1sP2W0j9ZXome507gu/rWcBLXmeNUls7AKuBng33u4Tr+H7tQY0Cip1zG51z1cDzwIQj9pkA/NXV+xDoYGbdox00TI7bXudcqXPuY6DGi4BhFEpbFzvndjfc/RDIjHLGcAmlrftdw/9qoDUQq7OWQvk/C3AjMBsojWa4MAu1rfEglLZeBcxxzm2G+s+qcB3crwUqAyg57H6gYduJ7hMr4qktx3Oibf0B9T3lWBRSW81sopmtBV4Gro1StnA7blvNLAOYCPwpirkiIdR/w6eb2XIze8XMBkcnWtiF0tZ+QEcze8fMCszse+E6eJOuqBtBdpRtR/5mGco+sSKe2nI8IbfVzM6mvkDF6nmZkNrqnJsLzDWzbwK/AM6NdLAICKWtjwD/7pyrMzva7jEjlLYWUr++3H4zGwf8A8iJdLAICKWtiUAuMBZoBfzTzD50zq1v6sH9WqACQNZh9zOBrY3YJ1bEU1uOJ6S2mtnJwBPARc65nVHKFm4n9L46594zsz5mluaci7XFRkNpax7wfENxSgPGmVmtc+4fUUkYPsdtq3Ou4rDbC8zssTh+XwNAuXPuAHDAzN4DhgFNLlCen4Q7xom5RGAj0IsvT8wNPmKfi/nXSRJLvM4dyfYetu90YnuSRCjvbU+gGBjtdd4otLUvX06SGAls+fx+LP05kX/DDfs/TexOkgjlfe122Ps6Ctgcr+8rMBB4q2HfVGAVMCQcx/dlD8o5V2tmNwCvUT+L5CnnXJGZXdfw+J+onwU0jvoPskrg+17lbapQ2mtm3YB8oB0QNLNbqJ9NU3Gs1/WjEN/bu4HOwGMNv23XuhhcHTrEtl4OfM/MaoCDwLddw//6WBJiW+NCiG2dDPzYzGqpf1+viNf31Tm3xsxeBVYAQeAJ59yqcBxfSx2JiIgv+XUWn4iINHMqUCIi4ksqUCIi4ksqUCIi4ksqUCIi4ksqUCJHaFhpe5mZrTKzmWaW6oNMZ5nZaK9ziESTCpTIVx10zg13zg0BqoHrQnmSmUXye4VnUb/Ke8ginEck4vQ9KJEjmNl+51ybhtvXUX8ZjFeA/6D+2/Q7ganOuR1mNh3oAWQD5cBdwN+oX5kc4Abn3GIzOwu4F9gBDAfmACuBm6lfv+wy59wnZpZO/WKqPRuefwv1q0t8CNQBZdSvCL72yP2ccx8cmcc5d1W4fi4i0abfsESOoaEHchHwKrAIOM0558zsh8AdwG0Nu+YCZzjnDjYMB57nnKsysxzgOerXoIP69ckGAruoXz7mCefcKDO7mfqicwvwW+Bh59wiM+sJvOacG2hmfwL2O+d+05Dt2SP3a3jtf8kTqZ+NSDSoQIl8VSszW9Zw+33gSaA/8PeGa44lA58etv+8w4pBEvComQ2nvsfT77D9PnbObQMws0+A1xu2rwTObrh9LjDosNW+25lZ26Nk/Lr95qk4STxQgRL5qoPOueGHbzCz3wP/45yb1zBcN/2whw8cdvtW6ofxhlF/jrfqsMcOHXY7eNj9IF/+X2wBnH5kgTnK5Sm+br8DR+4sEos0SUIkNO2pPxcEcPVx9tvmnAsC36V+gc0T8Tpww+d3GnpiAPuAtiHsJxI3VKBEQjMdmGlm71M/GeJYHgOuNrMPqR/eO9HezE1AnpmtMLPVfDmDcD4wsWH6+5iv2U8kbmgWn4iI+JJ6UCIi4ksqUCIi4ksqUCIi4ksqUCIi4ksqUCIi4ksqUCIi4ksqUCIi4kv/H92C+k4Yxi4LAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -604,14 +602,18 @@ } ], "source": [ - "from modsim import plot\n", + "from modsim import decorate\n", "\n", - "plot(sweep, label='Olin')" + "sweep.plot(label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Customer rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" ] }, { "cell_type": "markdown", - "id": "opened-medicare", + "id": "intense-start", "metadata": {}, "source": [ "NumPy provides functions that compute a variety of summary statistics, like `mean`, `median`, and `std` (which computes standard deviation).\n", @@ -622,7 +624,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "rural-shark", + "id": "contemporary-enough", "metadata": {}, "outputs": [ { @@ -644,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "hydraulic-baseball", + "id": "owned-senior", "metadata": {}, "source": [ "In this example, computing the mean might not be useful, but in the exercises below, it will be." @@ -652,7 +654,7 @@ }, { "cell_type": "markdown", - "id": "portuguese-selection", + "id": "korean-christianity", "metadata": {}, "source": [ "## Incremental development\n", @@ -699,7 +701,7 @@ }, { "cell_type": "markdown", - "id": "indonesian-assumption", + "id": "nominated-assault", "metadata": {}, "source": [ "## Summary" @@ -707,7 +709,7 @@ }, { "cell_type": "markdown", - "id": "attempted-confidence", + "id": "appreciated-preview", "metadata": {}, "source": [ "## Exercises" @@ -715,7 +717,7 @@ }, { "cell_type": "markdown", - "id": "prerequisite-sunglasses", + "id": "primary-quest", "metadata": {}, "source": [ "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", @@ -726,7 +728,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "restricted-destruction", + "id": "reflected-freedom", "metadata": {}, "outputs": [], "source": [ @@ -740,7 +742,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "fallen-jungle", + "id": "north-formation", "metadata": {}, "outputs": [], "source": [ @@ -751,7 +753,7 @@ }, { "cell_type": "markdown", - "id": "classified-clerk", + "id": "robust-blair", "metadata": {}, "source": [ "**Exercise:** Read the documentation of `linspace` at <>.\n", @@ -761,7 +763,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "dimensional-gentleman", + "id": "collected-butter", "metadata": {}, "outputs": [ { @@ -793,7 +795,7 @@ }, { "cell_type": "markdown", - "id": "local-stretch", + "id": "fleet-debut", "metadata": {}, "source": [ "**Exercise:** Wrap the code from this chapter in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", @@ -804,7 +806,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "underlying-samoa", + "id": "authorized-sarah", "metadata": {}, "outputs": [], "source": [ @@ -825,7 +827,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "auburn-junction", + "id": "romance-wisdom", "metadata": {}, "outputs": [ { @@ -844,19 +846,17 @@ "source": [ "# Solution\n", "\n", - "from modsim import decorate\n", - "\n", "p1_array = linspace(0, 1, 101)\n", "sweep = sweep_p1(p1_array)\n", - "plot(sweep, label='Olin')\n", + "sweep.plot(label='Olin')\n", "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " xlabel='Customer rate at Olin (p1 in customers/min)', \n", " ylabel='Number of unhappy customers')" ] }, { "cell_type": "markdown", - "id": "mineral-missile", + "id": "developmental-broad", "metadata": {}, "source": [ "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" @@ -865,7 +865,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "false-lightning", + "id": "norman-banana", "metadata": {}, "outputs": [], "source": [ @@ -886,7 +886,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "neural-detail", + "id": "mexican-robert", "metadata": {}, "outputs": [ { @@ -907,16 +907,16 @@ "\n", "p2_array = linspace(0, 1, 101)\n", "sweep = sweep_p2(p2_array)\n", - "plot(sweep, label='Olin')\n", + "sweep.plot(label='Olin')\n", "\n", "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Wellesley (p2 in customers/min)', \n", + " xlabel='Customer rate at Wellesley (p2 in customers/min)', \n", " ylabel='Number of unhappy customers')" ] }, { "cell_type": "markdown", - "id": "junior-neighbor", + "id": "separate-mention", "metadata": {}, "source": [ "## Optional Exercises\n", @@ -926,7 +926,7 @@ }, { "cell_type": "markdown", - "id": "marked-scale", + "id": "bearing-orbit", "metadata": {}, "source": [ "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", @@ -953,7 +953,7 @@ { "cell_type": "code", "execution_count": 42, - "id": "facial-grass", + "id": "accredited-salmon", "metadata": {}, "outputs": [], "source": [ @@ -972,7 +972,7 @@ { "cell_type": "code", "execution_count": 43, - "id": "tropical-stream", + "id": "visible-allowance", "metadata": {}, "outputs": [ { @@ -1084,7 +1084,7 @@ { "cell_type": "code", "execution_count": 44, - "id": "documentary-murder", + "id": "spatial-fundamentals", "metadata": {}, "outputs": [ { @@ -1106,7 +1106,7 @@ }, { "cell_type": "markdown", - "id": "ecological-andrews", + "id": "structural-expense", "metadata": {}, "source": [ "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", @@ -1125,7 +1125,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "urban-parts", + "id": "reverse-emphasis", "metadata": { "scrolled": true }, @@ -1147,7 +1147,7 @@ { "cell_type": "code", "execution_count": 46, - "id": "inappropriate-cooperation", + "id": "broad-latitude", "metadata": { "scrolled": true }, @@ -1168,17 +1168,17 @@ "source": [ "# Solution\n", "\n", - "plot(sweep, label='total', color='green')\n", + "sweep.plot(label='total', color='green')\n", " \n", "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " xlabel='Customer rate at Olin (p1 in customers/min)', \n", " ylabel='Average total unhappy customers')" ] }, { "cell_type": "code", "execution_count": null, - "id": "premier-complaint", + "id": "powerful-planner", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap05.ipynb b/jupyter/chap05.ipynb index 2d73f78a..39cea07e 100644 --- a/jupyter/chap05.ipynb +++ b/jupyter/chap05.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "virtual-fireplace", + "id": "wicked-mozambique", "metadata": {}, "source": [ "# Chapter 5" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "valid-islam", + "id": "inclusive-theater", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "driven-transcript", + "id": "legislative-rating", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "imposed-israel", + "id": "therapeutic-genealogy", "metadata": {}, "source": [ "In this chapter..." @@ -60,7 +60,7 @@ }, { "cell_type": "markdown", - "id": "handmade-direction", + "id": "informal-contractor", "metadata": {}, "source": [ "# World population\n", @@ -86,7 +86,7 @@ }, { "cell_type": "markdown", - "id": "guilty-kenya", + "id": "dying-browse", "metadata": {}, "source": [ "## World Population Data\n", @@ -96,7 +96,7 @@ }, { "cell_type": "markdown", - "id": "raised-calendar", + "id": "continuing-cancellation", "metadata": {}, "source": [ "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" @@ -105,7 +105,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "thrown-violence", + "id": "convenient-stroke", "metadata": {}, "outputs": [], "source": [ @@ -119,7 +119,7 @@ }, { "cell_type": "markdown", - "id": "representative-canal", + "id": "acknowledged-bracelet", "metadata": {}, "source": [ "To read this data, we will use Pandas, which provides functions for\n", @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "lined-footage", + "id": "israeli-finding", "metadata": {}, "outputs": [], "source": [ @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "amber-batman", + "id": "regulation-parade", "metadata": {}, "source": [ "Now we can use it like this:" @@ -148,7 +148,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "authentic-singer", + "id": "instant-beverage", "metadata": {}, "outputs": [], "source": [ @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "julian-intranet", + "id": "dried-immunology", "metadata": {}, "source": [ "The arguments are:\n", @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "recreational-albania", + "id": "driving-wrapping", "metadata": {}, "outputs": [], "source": [ @@ -205,7 +205,7 @@ }, { "cell_type": "markdown", - "id": "postal-breeding", + "id": "simplified-convert", "metadata": {}, "source": [ "This line selects the third table (numbered 2), which contains\n", @@ -217,7 +217,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "conservative-investigation", + "id": "running-alcohol", "metadata": {}, "outputs": [ { @@ -404,7 +404,7 @@ }, { "cell_type": "markdown", - "id": "adolescent-password", + "id": "valid-editing", "metadata": {}, "source": [ "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", @@ -416,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "naughty-macintosh", + "id": "plastic-senate", "metadata": {}, "source": [ "The column labels are long strings, which makes them hard to work with.\n", @@ -426,7 +426,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "suspected-integer", + "id": "engaging-regular", "metadata": {}, "outputs": [], "source": [ @@ -437,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "about-mistress", + "id": "communist-crowd", "metadata": {}, "source": [ "Now we can select a column from the `DataFrame` using the dot operator,\n", @@ -449,7 +449,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "cleared-protection", + "id": "amended-negative", "metadata": {}, "outputs": [], "source": [ @@ -458,7 +458,7 @@ }, { "cell_type": "markdown", - "id": "rational-sweden", + "id": "absent-heart", "metadata": {}, "source": [ "The result is a Pandas `Series`, which is similar to the `TimeSeries` and `SweepSeries` objects we've been using.\n", @@ -473,7 +473,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "portable-knowing", + "id": "graduate-specialist", "metadata": {}, "outputs": [ { @@ -499,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "contemporary-telephone", + "id": "brilliant-brook", "metadata": {}, "source": [ "The left column is the **index** of the `Series`; in this example it contains the dates.\n", @@ -513,7 +513,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "revolutionary-prescription", + "id": "linear-admission", "metadata": {}, "outputs": [ { @@ -540,7 +540,7 @@ }, { "cell_type": "markdown", - "id": "cleared-institution", + "id": "mental-sussex", "metadata": {}, "source": [ "The most recent estimate we have from the U.N. is for 2015, so the value for 2016 is `NaN`.\n", @@ -551,12 +551,39 @@ { "cell_type": "code", "execution_count": 11, - "id": "sharp-woman", + "id": "ordered-garage", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import decorate\n", + "\n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)') " + ] + }, + { + "cell_type": "markdown", + "id": "invisible-mouse", + "metadata": {}, + "source": [ + "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", + "The `label` argument provides the string that appears in the legend.\n", + "\n", + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "periodic-weekend", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -568,30 +595,22 @@ } ], "source": [ - "from modsim import plot, decorate\n", - "\n", - "plot(census, style=':', label='US Census')\n", - "plot(un, style='--', label='UN DESA')\n", - "\n", - "decorate(ylabel='World population (billion)')" + "plot_estimates()\n", + "decorate(title='World Population Estimates')" ] }, { "cell_type": "markdown", - "id": "detected-evidence", + "id": "labeled-magic", "metadata": {}, "source": [ - "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", - "\n", - "The `label` argument provides the strings that appear in the legend.\n", - "\n", - "The lines overlap almost completely, but it looks like the most recent estimates diverge slightly.\n", + "The lines overlap almost completely, but the most recent estimates diverge slightly.\n", "In the next section, we'll quantify these differences." ] }, { "cell_type": "markdown", - "id": "afraid-patio", + "id": "tender-summer", "metadata": {}, "source": [ "## Absolute and relative errors\n", @@ -604,8 +623,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "norwegian-spank", + "execution_count": 13, + "id": "secondary-player", "metadata": {}, "outputs": [], "source": [ @@ -614,8 +633,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "married-account", + "execution_count": 14, + "id": "caring-garlic", "metadata": {}, "outputs": [ { @@ -630,7 +649,7 @@ "dtype: float64" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -642,7 +661,7 @@ }, { "cell_type": "markdown", - "id": "polyphonic-agency", + "id": "bridal-extraction", "metadata": {}, "source": [ "When you subtract two `Series` objects, the result is a new `Series`.\n", @@ -653,8 +672,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "british-dayton", + "execution_count": 15, + "id": "corresponding-emerald", "metadata": {}, "outputs": [ { @@ -663,7 +682,7 @@ "0.029034508242424265" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -676,7 +695,7 @@ }, { "cell_type": "markdown", - "id": "spectacular-distance", + "id": "identical-archive", "metadata": {}, "source": [ "On average, the estimates differ by about 0.029 billion.\n", @@ -685,8 +704,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "administrative-store", + "execution_count": 16, + "id": "headed-witch", "metadata": { "scrolled": true }, @@ -697,7 +716,7 @@ "0.10157921199999986" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -710,7 +729,7 @@ }, { "cell_type": "markdown", - "id": "saved-smell", + "id": "composite-partnership", "metadata": {}, "source": [ "In the worst case, they differ by about 0.1 billion.\n", @@ -723,8 +742,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "embedded-procurement", + "execution_count": 17, + "id": "advisory-complex", "metadata": { "scrolled": true }, @@ -741,7 +760,7 @@ "dtype: float64" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -753,7 +772,7 @@ }, { "cell_type": "markdown", - "id": "geographic-ordering", + "id": "greater-register", "metadata": {}, "source": [ "I multiplied by 100 so we can interpret the results as a percentage. In 2015, the difference between the estimates is about 1.4%, and that happens to be the maximum.\n", @@ -763,8 +782,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "compressed-survivor", + "execution_count": 18, + "id": "frank-owner", "metadata": {}, "outputs": [ { @@ -773,7 +792,7 @@ "0.5946585816022846" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -784,7 +803,7 @@ }, { "cell_type": "markdown", - "id": "statistical-violence", + "id": "peaceful-fleece", "metadata": {}, "source": [ "The mean relative error is about 0.6%.\n", @@ -797,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "insured-swing", + "id": "vietnamese-excuse", "metadata": {}, "source": [ "## Modeling Population Growth\n", @@ -818,8 +837,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "absent-minimum", + "execution_count": 19, + "id": "undefined-sauce", "metadata": {}, "outputs": [ { @@ -828,7 +847,7 @@ "2.557628654" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -839,7 +858,7 @@ }, { "cell_type": "markdown", - "id": "cooked-beast", + "id": "precise-correlation", "metadata": {}, "source": [ "So we can get the total growth during the interval like this:" @@ -847,8 +866,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "historic-buddy", + "execution_count": 20, + "id": "postal-debate", "metadata": {}, "outputs": [], "source": [ @@ -857,7 +876,7 @@ }, { "cell_type": "markdown", - "id": "sufficient-oracle", + "id": "dutch-sample", "metadata": {}, "source": [ "The numbers in brackets are called **labels**, because they label the\n", @@ -873,8 +892,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "focused-maryland", + "execution_count": 21, + "id": "functional-trick", "metadata": {}, "outputs": [ { @@ -883,7 +902,7 @@ "1950" ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -895,7 +914,7 @@ }, { "cell_type": "markdown", - "id": "special-fireplace", + "id": "empty-siemens", "metadata": {}, "source": [ "So `t_0` is the label of the first element, which is 1950.\n", @@ -904,8 +923,8 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "employed-commission", + "execution_count": 22, + "id": "acoustic-south", "metadata": {}, "outputs": [ { @@ -914,7 +933,7 @@ "2016" ] }, - "execution_count": 21, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -926,7 +945,7 @@ }, { "cell_type": "markdown", - "id": "supreme-finder", + "id": "express-metallic", "metadata": {}, "source": [ "The value `-1` indicates the last element; `-2` indicates the second to last element, and so on.\n", @@ -936,8 +955,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "id": "critical-carrier", + "execution_count": 23, + "id": "planned-remains", "metadata": {}, "outputs": [ { @@ -946,7 +965,7 @@ "66" ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -958,7 +977,7 @@ }, { "cell_type": "markdown", - "id": "difficult-banks", + "id": "bridal-royal", "metadata": {}, "source": [ "Now we can use `t_0` and `t_end` to select the population at the beginning and end of the interval." @@ -966,8 +985,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "executive-pressure", + "execution_count": 24, + "id": "quarterly-aggregate", "metadata": {}, "outputs": [], "source": [ @@ -977,7 +996,7 @@ }, { "cell_type": "markdown", - "id": "unnecessary-pontiac", + "id": "driven-castle", "metadata": {}, "source": [ "And compute the total growth during the interval." @@ -985,8 +1004,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "classical-proportion", + "execution_count": 25, + "id": "prescription-optics", "metadata": {}, "outputs": [ { @@ -995,7 +1014,7 @@ "4.768368055" ] }, - "execution_count": 24, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1007,7 +1026,7 @@ }, { "cell_type": "markdown", - "id": "acknowledged-tenant", + "id": "accepted-auditor", "metadata": {}, "source": [ "Finally, we can compute average annual growth." @@ -1015,8 +1034,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "id": "double-short", + "execution_count": 26, + "id": "convertible-patch", "metadata": {}, "outputs": [ { @@ -1025,7 +1044,7 @@ "0.07224800083333333" ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1037,7 +1056,7 @@ }, { "cell_type": "markdown", - "id": "compound-linux", + "id": "japanese-merit", "metadata": {}, "source": [ "From 1950 to 2016, world population grew by about 0.07 billion people per year, on average.\n", @@ -1046,7 +1065,7 @@ }, { "cell_type": "markdown", - "id": "moved-spotlight", + "id": "public-verification", "metadata": {}, "source": [ "## Simulation\n", @@ -1058,8 +1077,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "id": "imperial-gardening", + "execution_count": 27, + "id": "duplicate-leave", "metadata": {}, "outputs": [], "source": [ @@ -1070,7 +1089,7 @@ }, { "cell_type": "markdown", - "id": "virgin-network", + "id": "expired-salmon", "metadata": {}, "source": [ "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", @@ -1081,8 +1100,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "id": "suburban-deficit", + "execution_count": 28, + "id": "convenient-thong", "metadata": {}, "outputs": [], "source": [ @@ -1091,7 +1110,7 @@ }, { "cell_type": "markdown", - "id": "checked-neutral", + "id": "constant-casino", "metadata": {}, "source": [ "Here's what it looks like so far." @@ -1099,8 +1118,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "id": "defensive-fifty", + "execution_count": 29, + "id": "israeli-surveillance", "metadata": {}, "outputs": [ { @@ -1146,7 +1165,7 @@ "1950 2.557629" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1159,7 +1178,7 @@ }, { "cell_type": "markdown", - "id": "economic-profession", + "id": "stretch-snapshot", "metadata": {}, "source": [ "Now we set the rest of the values by simulating annual growth:" @@ -1167,8 +1186,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "upset-amsterdam", + "execution_count": 30, + "id": "attended-morris", "metadata": {}, "outputs": [], "source": [ @@ -1178,7 +1197,7 @@ }, { "cell_type": "markdown", - "id": "underlying-biology", + "id": "signed-colleague", "metadata": {}, "source": [ "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", @@ -1192,13 +1211,13 @@ }, { "cell_type": "code", - "execution_count": 30, - "id": "experimental-investigation", + "execution_count": 31, + "id": "wrong-brooks", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABIb0lEQVR4nO3dd1zUR/rA8c+w9CYdGwiIFQv2hl3RxBiNNZqeu+SX3pNLrqTcXZK7S+5SLrlcTC6JF43RdGMKSFOxg2LvBUVFkCa97fz+2NVDo7gCyy74vF+vfbHfNvsMKA8z3/nOKK01QgghhL1xsHUAQgghxKVIghJCCGGXJEEJIYSwS5KghBBC2CVJUEIIIeySJCghhBB2SRKUEOKqKKVeVEotsnUcovWTBCVaBaXUfKVUmlKqRCl1Sin1k1IqxoqfN0YpldWE5d2plEptqvKaSlPXU4irIQlKtHhKqSeAN4FXgGAgFPgXMM2GYdmUUsrR1jEI0ViSoESLppRqA/wReFBr/bXWulRrXa21/l5r/bT5HBel1JtKqZPm15tKKRfzsTFKqSyl1JNKqRxz6+uuOuVfr5TarZQqVkqdUEo9pZTyAH4C2ptbbCVKqfZKqcFKqfVKqUJzOe8opZzrlKWVUvcppQ4opQqUUu8qkx7Av4Fh5rIKL1PXcKXUanMsCebrF5mPhZnL/5VS6hiQpJRyUEr9XimVaa7bf83fL5RSC5VST5rfdzBf+4B5O1IplX+5eprDcTaXV6yU2qWUGthkP1QhzCRBiZZuGOAKfFPPOb8DhgLRQF9gMPD7OsfbAm2ADsCvgHeVUr7mY/8B/k9r7QX0ApK01qXAdcBJrbWn+XUSqAUeBwLMcY0HHrgolhuAQeY45gCTtNZ7gPuA9eayfC5Tj8+ATYA/8CJw2yXOGQ30ACYBd5pfY4EIwBN4x3zeKmBMnWsOm78CjALW1FNPgBuBzwEfYHmdcoVoMpKgREvnD5zRWtfUc84twB+11jla61zgJS785V5tPl6ttf4RKAG61TnWUynlrbUu0FpvudyHaK3TtdYbtNY1WuujwPv875f+OX/RWhdqrY8ByZiS5hUppUIxJbbntdZVWutUTInhYi+aW5Hl5nr/Q2t9WGtdAjwH3Gzu/lsFjFRKOWBKSH8DRpjLGG0+Xp9UrfWPWuta4FNMCVeIJiUJSrR0eUDAFe65tAcy62xnmvedL+OiBFeGqbUBMBO4HshUSq1SSg273IcopboqpVYopbKVUmcx3RMLuOi07Mt8zpW0B/K11mV19h2/xHl1912q3o5AsNb6EKZEHA2MBFYAJ5VS3bAsQV1cD1e57yWamiQo0dKtByqA6fWccxLoVGc71LzvirTWm7XW04Ag4Ftg2blDlzj9PWAv0EVr7Q38FlCWfM5lyqvrFOCnlHKvsy/kCuVcqt41wGnz9ipgFuCstT5h3r4d8AUyLIxLCKuRBCVaNK11EfA8pvtG05VS7kopJ6XUdUqpv5lPWwL8XikVqJQKMJ9/xed4lFLOSqlblFJttNbVwFlM95nA9Eve/9ygAzMv8zklSqnuwP1XUZXTQMe6gyouqmcmkAa8aI5rGDD1CmUuAR43D67wxNSiW1qntbgKeAhYbd5OAR7G1H1XXz2FaBbSJBctntb6H0qp05gGPiwGioF04GXzKX8GvIHt5u0vzPsscRvwjlLKAOwDbjV/5l6l1BLgsPlYT+ApYAHwDLAVWAqMs/BzkoBdQLZSyqi1vrhrEEz3lD7B1K25yVy+oZ4yP8LUzbca00CSOEwJ6JxVmJLquQSVCrjX2b5cPYVoFkoWLBSiZVJKLQX2aq1fsHUsQliDdPEJ0UIopQYppTqbn2+ajOlB5G9tHJYQViNdfEK0HG2BrzENrc8C7tdab7VtSEJYj3TxCSGEsEvSxSeEEMIu2VUXX0BAgA4LC7N1GEIIIZpRenr6Ga114MX77SpBhYWFkZaWZuswhBBCNCOlVOal9ksXnxBCCLskCUoIIYRdkgQlhBDCLtnVPahLqa6uJisri4qKCluH0iq5urrSsWNHnJycbB2KEEJcwO4TVFZWFl5eXoSFhaGUpRNDC0torcnLyyMrK4vw8HBbhyOEEBew+y6+iooK/P39JTlZgVIKf39/aZ0KIeyS3ScoQJKTFcn3Vghhr1pEghJCCGFDVaU2+VhJUFdw9OhRevXqdcG+F198kddffx2ADRs2MGTIEKKjo+nRowcvvvjiJcvZtGkTo0aNolu3bnTv3p1f//rXlJWVXfJcIYSwK9uXQVHWBbvOnDnDli1brPqxdj9Iwt7dcccdLFu2jL59+1JbW8u+fft+cc7p06eZPXs2n3/+OcOGDUNrzVdffUVxcTHu7u6XKFUIIWyspgryD0NQdxhwJ1SXA1BcUkrqmtWkpaXh4uJCVFQULi4uVglBWlCNlJOTQ7t27QAwGAz07PnLBUffffdd7rjjDoYNGwaY7vvMmjWL4OBgSktLufvuuxk0aBD9+vXju+++A+CTTz5hxowZTJ48mS5duvDMM88AUFtby5133kmvXr3o3bs3b7zxBgBjxow5P03UmTNnODen4a5duxg8eDDR0dH06dOHAwcOWPX7IYRoBUrz4NPp8Mn1UF4ISlFrcGFFwmr++vc32bR5M/369ePBBx+0WnKCFpig5r6/ni/SjgNQXWtk7vvr+WarqelZXlXL3PfX8/22kwCcrahm7vvr+XnnKQDyS6uY+/56EnafBiCnuPGj1x5//HG6devGTTfdxPvvv3/JEXE7d+5kwIABl7z+5ZdfZty4cWzevJnk5GSefvppSktN/b0ZGRksXbqUHTt2sHTpUo4fP05GRgYnTpxg586d7Nixg7vuuqve+P7973/z6KOPkpGRQVpaGh07dmx0nYUQrdjp3fDBGDiRDtf9De3ahr179/Lee++RvjaZapc2jJx6MzfccAMeHh5WDUW6+K7gcqPczu1//vnnueWWW4iPj+ezzz5jyZIlpKSkWFx+fHw8y5cvP39Pq6KigmPHjgEwfvx42rRpA0DPnj3JzMwkKiqKw4cP8/DDDzNlyhRiY2PrLX/YsGG8/PLLZGVlMWPGDLp06WJxbEKIa4jWsOkDSHgRXLzgrh857diR/777AWV5p/D392fevHl06dKl2Ub/trgEtfT/hp1/72RwuGDbzdlwwba3q9MF234ezhdsB3m5XvHz/P39KSgouGBffn7+BQ+2du7cmfvvv5977rmHwMBA8vLy8Pf3P388KiqK9PR0pk2b9ovyz92P6tat2wX7N27ceEHT2WAwUFNTg6+vL9u2bSMuLo53332XZcuW8dFHH+Ho6IjRaAS4oBU3f/58hgwZwg8//MCkSZP48MMPGTdu3BXrLYS4xigFxzdA6BBKJrxGctoetm79AQdHZ/J9e/LwHVPxs+B3ZlNqcV18zc3T05N27dqRmJgImJLTzz//TExMDAA//PAD51YlPnDgAAaDAR8fnwvKeOihh1i4cCEbN248v2/RokVkZ2czadIk/vnPf54vY+vW+lfwPnPmDEajkZkzZ/KnP/3p/CiasLAw0tPTAfjyyy/Pn3/48GEiIiJ45JFHuPHGG9m+fXsjvhtCiFalphKSX4WcPabNKW+RHPI4r3+4lC1btzJ48GCeeOwR3nx4VrMnJ2iBLShb+O9//8uDDz7Ik08+CcALL7xA586dAfj00095/PHHcXd3x9HRkcWLF2MwGC64Pjg4mM8//5ynnnqKnJwcHBwcGDVqFDNmzOAPf/gDjz32GH369EFrTVhYGCtWrLhsLCdOnOCuu+4631p69dVXAXjqqaeYM2cOn3766QUtpKVLl7Jo0SKcnJxo27Ytzz//fJN+b4QQLdSxjbD8YTizD+3gyK6cWhISEigqKqLEJZDQ3kOZPLm/TUNU5/5ytwcDBw7UFy9YuGfPHnr06GGjiK4N8j0W4hpSWQwJL8HmD6FNCCeG/pFvt53hzOmTBAYGMXnyJDqFhWNwaL5ZZpRS6VrrgRfvlxaUEEJcSzb+GzZ/SFH0/STW9GNH/HZc3NzZpjrz/JTriejkZ+sIz5MEJYQQrV1JLhSfhHZ9qRpwL2sLOrBmx2G03kdMTAwxMTFoB0dcnQxXLqsZSYISQojWSmvY9jnEPYd2D2RbzAISk5IoKSmh0qsDh53D+cPYcTg0Y3fe1bBaglJKdQOW1tkVATyvtX7TWp8phBDCrCATVjwOhxLJDJzAT4zi9PLlBLVtx5w5c/AJbIu7s6PdJiewYoLSWu8DogGUUgbgBPCNtT5PCCGE2eld8OFE8vFmZdvn2Hu6Eg/PWtbVRjA3agQhISG2jtAizdXFNx44pLXObKbPE0KIa09VKTh7UOEVzuqge9mYbUCfqWXs2LEMGzaM+aU1tPdxs3WUFmuuB3VvBpZc6oBS6l6lVJpSKi03N7eZwrHclZbbuPPOO+nQoQOVlZXAhRO1XsxgMBAdHU1UVBR9+/blH//4x/nnmVJSUmjTpg3R0dHnXwkJCYBpvr6oqCj69OlDdHT0BQ/81tTUEBAQwHPPPdfUVRdCtBQ1lZD0MsY3o9mcmsQ/332X9ScVDv6d+KayF137DsbJyalFJSdohhaUUsoZuBG45G9QrfUCYAGYnoOydjzWYDAY+Oijj7j//vvrPc/NzY2MjAzANAv6/PnzKSoq4qWXXgJg5MiRv3hId/369axYsYItW7bg4uLCmTNnqKqqOn88Pj6ebt26sWzZMl555RVZIVeIa03mevj+EQ6eqSLedS65iWsIaNeBW2+9FR//IG4vqaRtm+afBaIpNEcL6jpgi9b6dDN8lk089thjvPHGG9TU1Fh8TVBQEAsWLOCdd96hvoelT506RUBAwPl5+QICAmjfvv3540uWLOHRRx8lNDSUDRs2NLwSQoiWxVgLPzxJ7sfzWVw4kMVqBtXuQaQburPNpS/t2rXDzdlAiF/LXXOuOe5BzeMy3XsN8vGUX+6Lmg6D74GqMlg8+5fHo+dDv1tMa5wsu/3CY3f90OiQQkNDiYmJ4dNPP2Xq1KkWXxcREYHRaCQnJweANWvWEB0dff74V199RWxsLH/84x/p2rUrEyZMYO7cuYwePRqA8vJyEhMTef/99yksLGTJkiXn15wSQrRuZRWVJB92IF3dgYNyZuLEMQwZMoTx2SWEB1h3GYzmYtUWlFLKHZgIfG3Nz7GmKy23cc5vf/tbXnvttfP3lCxVt/U0cuRIMjIyzr86d+6Mp6cn6enpLFiwgMDAQObOncsnn3wCwIoVKxg7dizu7u7MnDmTb775htra2quroBCi5SjOpmbZ3ayL/4a3336b9AIvAiOi+LS4JxV+nTEYDPTq0AYPl9bxiKtVa6G1LgP8r3ji1aivxePsXv9xD/+rbjFZstwGQGRkJNHR0Sxbtszisg8fPozBYCAoKIg9e/Zc9jyDwcCYMWMYM2YMvXv3ZuHChdx5550sWbKEtWvXnh+UkZeXR3JyMhMmTLC8gkII+6c1On0he+P+w8qaQRSwncAOnZg9bQr+/gF025/D2G5Bto6yyclyG1dwpeU26vrd7353fnTfleTm5nLffffx0EMP1TuwYd++fRcs056RkUGnTp04e/YsqampHDt2jKNHj3L06FHeffddlixput5UIYQdOHOAUwvmsHBFKstqJuDoF8pRn/58URiGv38ADg6Kcd2DW+UAqdbRDrSy+pbbqCsqKor+/fufX6PpYuXl5URHR1NdXY2joyO33XYbTzzxxPnjF9+D+v3vf094eDgPP/wwhYWFODo6EhkZyYIFC/j6668ZN27cBYsaTps2jWeeeYbKysoL9gshWqbi4mKSvviMjJwonBwdmDh+EkOHDGLs6RI8Xex7FoimIMttCPkeC2Fnqo+sZ92OQ6zdeYza2lrCI7vyx22uvDJ7ALMGdLR1eE1OltsQQgg7p8uL2PHFqyQeruGs8iIwJIKbp0/Bz8+P3jGF9OnYxtYhNitJUEIIYQeOr1lCXMo6ThgDaOdhJNdvAO9lOnGbuxcAfUN8bBugDUiCEkIIGyosLCThm0XsOpaHp/Jk4tAohsXO5GRRBbeUVeHl6mTrEG1GEpQQQthAZXkZqSu/Z/32AyilGBbpy3P7wzhTGsZwpejg40aHFjZ3XlOTBCWEEM3IaDSSsWoFSakbKTU6E9E5ghun3kibNm2o2XGKgWG+tg7RbkiCEkKIZnJk327ili/ldJkDIQ6F9Onanfu2+9J3jKZPG7i+dztbh2hXJEE1o7CwMNLS0ggICGjUOUKIliUvL4+VP//AvoNHaKOLuTFUEX3znyhx8OLJtpl0DfaydYh2SRKUEEJYSXl5OauSEtm8ZSuOjo6M66RYUx7Fq1U9Wermi5dSPDg20tZh2i1JUFdw9OhRJk+eTExMDBs2bKBv377cddddvPDCC+Tk5LB48WIiIyO5++67OXz4MO7u7ixYsIA+ffqQl5fHvHnzyM3NZfDgwRdMDLto0SLefvttqqqqGDJkCP/6178wGAw2rKkQoqnU1taStnkTq5JWUlFdS59uEYyfMgMvLy/yM07Qw44mSLBnLSpB/fzzz2RnZzdpmW3btmXy5Mn1nnPw4EG++OILFixYwKBBg/jss89ITU1l+fLlvPLKK4SEhNCvXz++/fZbkpKSuP3228nIyOCll14iJiaG559/nh9++IEFCxYAppkbli5dytq1a3FycuKBBx5g8eLF3H777fXGIYSwb1prDhw4QPyPy8krKiVcZzKqbRmPH+qGy9ESruvtxbToDrYOs8VoUQnKVsLDw+nduzdgmm9v/PjxKKXo3bs3R48eJTMzk6+++gqAcePGkZeXR1FREatXr+brr00rjUyZMgVfX9PonMTERNLT0xk0aBBg6gYICmp9MxELcS05ffo08fHxHD58GH/yudllO12nPERtj+mEfbWjxS23bg9aVIK6UkvHWupOvOrg4HB+28HBgZqaGhwdf/ltPDez8KVmGNZac8cdd/Dqq69aKWIhRHMpLS0lKSmJrVu34uLiwuQIRZvqCp4reobPusfi6mjgjbnRtg6zRZLlNprAqFGjWLx4MQApKSkEBATg7e19wf6ffvrp/LpS48eP58svvzy/km5+fj6ZmZm2CV4I0SA1NTWsXbuWt996i4wt6Qzu2paHH36YIbf+gbxRL9MuKJiKallAtDFaVAvKXr344ovcdddd9OnTB3d3dxYuXAiYluWYN28e/fv3Z/To0YSGhgLQs2dP/vznPxMbG4vRaMTJyYl3332XTp062bIaQggLaK3ZvXs3CQkrKSwsoitHmOC0mRUFd7Ao7RT3jurMiMgARkTKoyKNJcttCPkeC2GhEydOEB8fz7FjxwhyKGJS7Uoieg2GSS/z4PKTRIf4cM+oCFuH2eLIchtCCNFAZ8+eJTExke3bt+Ph4cENvf3ocfQ7XjfczwOTf0WApwvvzG+dq9raUr0JSik1DLgVGAm0A8qBncAPwCKtdZHVIxRCCBupqqpi7dq1rFu3Dl1bw4hIH0bOug8XJycOnp5H8uKdTC8sJ8DTRZKTFVw2QSmlfgJOAt8BLwM5gCvQFRgLfKeU+ofWerm1g9Rayw/fSuypi1cIe6G1Zvv27SQmJlJcXEyU80nGV/9IXukY3kw+wm8mdyeyXQCJT4xu9cuu21J9LajbtNZnLtpXAmwxv/6ulLL6XUBXV1fy8vLw9/eXJNXEtNbk5eXh6upq61CEsBuZmZnEx8dz8uRJ2rtVMUt/TaibI8xYwJt7Q8g8dZZao8bgoCQ5WdllE9QlklODzmmsjh07kpWVRW5urrU/6prk6upKx44dbR2GEDZXUFBAQkICu3fvxtvbm5tGdKPXuodJCpxH5bTf06VjEL/rbMTJoOSP5WZyxUESSqkZwF+BIECZX1pr7W3l2ABwcnIiPDy8OT5KCHENqqioYM2aNWzcuBEHBWMivRg+5yGcnJwo6D2cZz/YzzOnKunSEZwd5dHR5mTJKL6/AVO11nusHYwQQjQXo9HIli1bSE5OpqysjGjfMsblf4pztj+v/TSW56ZG4xscyupn2uPuLAOebcGS7/ppSU5CiNbk0KFDxMXFkZubSydfZyZVfUu7wuMQ8zCfOM7i+/XZ/HpsJUFerpKcbMiS73yaUmop8C1QeW6n1vprawUlhBDWkJubS3x8PAcPHsTX15fZk0fS/efZZPsNZMvw9+k/YDC31BqZPawbHi6SmGzNkp+AN1AGxNbZpwFJUEKIFqGsrIyUlBTS0tJwdnJiYndvBs98AEdHR6pCUpi/KJdhma70HwBOBgecDHKvyR5cMUFpre9qjkCEEKKp1dbWsmnTJlavXk1lZSUDOroyJvtD3Pfl858f+3LHlDE4t+/NF/dXEuDpbOtwxUUsGcXXEfgnMAJTyykVeFRrnWXl2IQQokG01uzbt4+VK1eSn59P5/b+xFYkEXRsA3Qex5ouT/OX5YX06V3I4HA/Ar1crlyoaHaWdPF9DHwGzDZv32reN9FaQQkhRENlZ2cTFxfH0aNHCQgIYP6cGXRZPpUqBze2Dn2bfpNuJwZI7lpOiJ+7rcMV9bAkQQVqrT+us/2JUuoxK8UjhBANUlxcTFJSEhkZGbi5uXFdnyAGTr0HB0dH8PyCe38oJXuvAz/GgoODkuTUAliSoM4opW4Flpi35wF5lhSulPIBPgR6YeoevFtrvb4BcQohxCVVV1ezfv16UlNTqa2tZVjPUEad/gjXbdtZ5ehJ9ISbaRMyiFduLsfbzUmmJ2pBLElQdwPvAG9gSjLrzPss8Rbws9Z6llLKGZA/WYQQTUJrza5du0hISKCoqIjukWFMZB1+u16HNqFkTfqAO5e787xfFneNCKe9j5utQxZXyZJRfMeAG6+2YKWUNzAKuNNcThVQdbXlCCHExbKysoiLiyMrK4u2bdsyfdo0wuLvQOfs5UCPB+hy0x/o6OzO8pAienVollnZhBXUt9zGM1rrvyml/omp5XQBrfUjVyg7AsgFPlZK9QXSMY3+K73oc+4F7gXOL4kuhBCXUlRUREJCAjt37sTT05Mbh3en78jrcXD1gilv8MbaXD7YCeunOuLjDL07trF1yKIRLrvku1Jqqtb6e6XUHZc6rrVeWG/BSg0ENgAjtNYblVJvAWe11n+43DWXWvJdCCGqqqpITU1l/XrTLexhA3oTU/Qtznu+4uTA31A7/DFC/NzJK6kkv7SKLsFeNo5YXI2rXvJda/29+Wu9iageWUCW1nqjeftL4NkGliWEuAYZjUa2bdtGUlISJSUl9IrqyQTfLNpsuA90LZUxv+GGNb0ZW3aAv8/pi7+nC/6e8kxTa1FfF9/3XKJr7xytdb33pbTW2Uqp40qpblrrfcB4YHeDIxVCXFOOHj1KXFwc2dnZdOzYkblz59Ix/VVYs4i8jhPwn/l3XHzDeDc8T+4ztVL1DZJ4vQnKfxhYbB7BdxiQaZOEEPXKz89n5cqV7N27lzZt2jDz+vFEde+C8goG54dJcRjKnWv9+Lq4Df19YVhnf1uHLKykvi6+VY0tXGudAfyiX1EIIS5WUVHBqlWr2LRpE46OjowbM4ahjrtxSphH1dFJnBj7FuFB3Rk6uQv/DD1NvxAfW4csrKy+Lr4d1N/F18cqEQkhrim1tbWkp6eTkpJCeXk5/fr1Y1w3PzyTn4XsHejO43nkZCzHP9vCiodjcHUyMLVve1uHLZpBfV18NzRbFEKIa9KBAweIj4/nzJkzhIeHExsbS9vsJFhyOzUebXGYtRCHqGncfigPT1dHlJJZIK4l9XXxZTZnIEKIa0dOTg7x8fEcOnQIPz8/bp47l66hwSh3X/CcyJnoB5iYNpDflPXnZqUYHhlg65CFDdTXxZeqtY5RShVj6upTdb9qrWXYjBDiqpSWlpKcnMyWLVtwcXFh0qRJDIrww/Dz05BaStH8H2jjGYj/tJe5y+sg47oH2TpkYUOXfVDXFuRBXSFap5qamvMLB1ZVVTFo0CBGjxiG+9YPYPVr4OjCqtD7+c3RgcQ/ORZvVydbhyya0VU/qHvRxf2BGMwLFmqttzZxfEKIVkhrzZ49e0hISKCgoIAuXbowceJEAg0l8OkkyN2Lscd0HK7/K75FrkzzO4WTgyy3LkwsWVH3eUyLFX5t3vWJUuoLrfWfrRqZEKJFO3nyJPHx8WRmZhIUFMStt95K54gIUAqqPTF6BPGGno/RZxJPe7Wljxf06ehj67CFHbGkBTUP6Ke1rgBQSv0F2AJIghJC/EJxcTGJiYls27YNd3d3pkyZQv/+/XHY9wN8/CDc+hU4e+Bw5/ec/W4nXdrIMhji0ixJUEcBV6DCvO0CHLJWQEKIlqm6upp169axdu1ajEYjw4cPZ+TIkbhWF8IXt8Oe76kIiOLxBXH8dv5kQvzceWlaL1uHLexYfaP4zi2zUQnsUkqtNG9PBFKbJzwhhL3TWrN9+3YSExMpLi6mZ8+eTJgwAV8fH9j6KcT/HmoqYcKL5Pf4Ffs+2cKpogpZcl1cUX0tqHPD6dKBb+rsT7FaNEKIFuXYsWPExcVx8uRJ2rdvz6xZs/63rpvRCBmfUeDVjSVtn+KBmEm0BxIeHy3LrguL1PegbkOX2RBCtHIFBQUkJCSwe/duvLy8mD59On369EFpI2z4N0TdBF7BcPNnfJKaQ9zuHG6vrMHTxVGSk7DYlZbbWAD8rLWuvuhYBKal3I9qrT+yaoRCCLtRWVnJmjVr2LBhAw4ODowePZrhw4fj7OwMufvhuwchaxPph07iMPJx+oX68eA4Hx4a3xUngwwfF1envi6+e4AngDeVUvmYlm93BcKBg8A7WuvvrB+iEMLWjEYjW7duJTk5mdLSUvr27cu4cePw9vaG2hpY8w9I+Qs4u1Mx9d88+HMgkzxP0C/UF2dHSUyiYerr4ssGngGeUUqFAe2AcmC/1rqsecITQtja4cOHiYuLIycnh5CQEObNm0eHDh3+d0LKq7DmdbLaTqD9/Hdx9W7LN5HltPV2tV3QolWwaCYJrfVRTMPNhRDXiDNnzrBy5Ur279+Pj48Ps2fPpkePHqYZxWtroLwAPANh6P2kV3Vk5qog/pttYJQ3tJNnm0QTsChBCSGuHWVlZaxatYq0tDQcHR2ZMGECQ4YMwdHR/Osidz98ez9GbWTflK/p0SGA/pPv5IseBQwK87Nt8KJVkQQlhABMCwdu3ryZVatWUVlZSf/+/Rk7diweHh6mE4y1sOE9SPoTOLnxcZsHef/jNFb/ZhyuTgZJTqLJSYIS4hqntWb//v3Ex8eTn59P586diY2NJSiozlIXxafhy7sgcy21Xa7DcONbDCt2o1tpFa5OBtsFL1o1SyaLHQG8CHQyn39uPagI64YmhLC27Oxs4uPjOXLkCP7+/syfP5/IyMhfrlzr4kVtVTmvuTyK8pvHb7yC6ellm5jFtcOSFtR/gMcxzShRa91whBDNoaSkhKSkJLZu3YqbmxuTJ09m4MCBGAx1WkMlOZDyF4wTXsLB1QvDvUk4rdzPsM7+tgtcXFMsSVBFWuufrB6JEMLqampq2LBhA2vWrKGmpoYhQ4YwevRo3NwuGnW3ZwV8/wjGymKe3tWJx+65hxA/d56M7WabwMU1yZIElayUeg3TelCV53ZqrbdYLSohRJPSWrN7924SEhIoLCykW7duTJw4EX//i1pDVaXw83OwZSG07cOZiW9zJK6M0qoa2wQurmmWJKgh5q91l+PVwLimD0cI0dROnDhBXFwcx48fJzg4mNtvv53w8PBLn7ziCfT2pawLvo0Rv/4HQY7OfP1A88YrxDlXTFBa67HNEYgQomkVFRWRmJjIjh078PDwYOrUqURHR+Nw8ZLqxlqoLgMXLxjzLF/WjuaTUyEsrXXAU8b5ChuyZBRfG+AFYJR51yrgj1rrImsGJoRomKqqKlJTU1m/fj1aa2JiYoiJicHFxeWXJxedgG/+j/xqZ05M/ojeIeFMn9GJaRqZQ0/YnCV/H30E7ATmmLdvAz4GZlgrKCHE1dNak5GRQVJSEiUlJfTq1Yvx48fj4+Nz6Qt2L4flD6Nrq3lP38mRxAN8eOcgmXVc2A1LElRnrfXMOtsvKaUyrBSPEKIBjh49SlxcHNnZ2XTo0IE5c+YQEhJy6ZOrSiHut5D+Cbp9P9TM/zC7JogQX1nhVtgXSxJUuVIqRmudCucf3C23blhCCEvk5+eTkJDAnj178Pb2ZsaMGfTq1euXD9rWVV1O9Z6f+E/NVHz7vMRc/850bb6QhbCYJQnqfmCh+V6UAvIxLVYohLCRiooKVq9ezcaNGzEYDIwdO5Zhw4bh5OR06Qu0hp1fUdF1Kq4eATg+shnntHyuj+7YvIELcRUsGcWXAfRVSnmbt89aOyghxKUZjUbS09NJSUmhrKyM6Ohoxo0bh5dXPfMOlZ6Bbx+AA3H81elRHnns9/h6tOHumDbNF7gQDVDfku+3aq0XKaWeuGg/AFrrf1g5NiFEHQcPHiQ+Pp7c3FzCwsKIjY2lXbt29V90eBV8fS+U53Nq+Evk542ivt4/IexJfS0o8xz7XOpPM21J4Uqpo0Axpjn8arTWA+u/QghxsdzcXOLj4zl48CC+vr7MmTOH7t2713+fCWDDe+ifn6PArRN+9yTRrm1v3mqekIVoEvUt+f6++W2C1npt3WPmgRKWGqu1PtOQ4IS4lpWWlpKSkkJ6ejrOzs7ExsYyePDgCyd0rU/IEDb5TuUTr3t4J6gXsiiGaGksGSTxT6C/BfuEEE2gpqaGTZs2sXr1aqqqqhg4cCBjxozB3f3Kw8D19mXs27Ye9+tfJrRDf6If/IR/GRyu3NoSwg7Vdw9qGDAcCLzoPpQ3WPzHmAbilVIaeF9rvaDBkQrRymmt2bt3LytXrqSgoIDIyEhiY2MJDAy88sUVZ+HHp1HbP6dUd+ebtft57sZoXByl3SRarvpaUM6Ap/mcuvehzgKzLCx/hNb6pFIqCFiplNqrtV5d9wSl1L3AvQChoaEWBy5Ea3Lq1Cni4uLIzMwkMDCQW265hcjISIuu1VlpVC29C5eSLBjzHN7d/o/fBPtYN2AhmoHSuv7xDkqpTlrrzEZ/kFIvAiVa69cvd87AgQN1WlpaYz9KiBajuLiYpKQkMjIycHd3Z8yYMQwYMOCXE7peTsVZqv4eRU6VM3mx79J3xGTrBiyEFSil0i81iM6Se1Bl5vWgogDXczu11vUut6GU8gActNbF5vexwB+vLmwhWqfq6mrWr19PamoqRqORYcOGMWrUKFxdXa98MaDPnqLQwQ9fT28cbl7EulN+zBgaZeWohWheliSoxcBS4AbgPuAOINeC64KBb8w3Zx2Bz7TWPzcwTiFaBa01O3fuJCEhgbNnz9KjRw8mTJiAn5+fpQVAxmKqvn+KD5x/zSNPvoRr59HM6WzduIWwBUsSlL/W+j9KqUe11quAVUqpVVe6SGt9GOjb6AiFaCWOHz9OXFwcJ06coF27dsyYMYNOnTpZfL0uyYUVj6P2fk950BA6RE6WmcdFq2ZJgqo2fz2llJoCnARkAi8hLFRYWEhCQgK7du3Cy8uLadOm0bdv36sa+l2xO47KL+/FU5dgmPASPsMf5hYHGaEnWjdLEtSfzRPFPonp+Sdv4HGrRiVEK1BZWXl+4UClFKNGjWLEiBE4OztfdVkuBiO5jv6sG/wh18VMtEK0QtifK47ia04yik+0Bkaj8fzCgaWlpfTp04dx48bRps3VTc56YsvPJKemMuVXz+Pr4Wxaml1aTaIVuupRfEqpf1LPnHta60eaKDYhWo3Dhw8THx/P6dOnCQkJYd68eXTo0OHqCqksgcSX6LBpAUNVKEdOP4RvRFtJTuKaU18XnzRlhLBQXl4e8fHx7N+/Hx8fH2bNmkXPnj2veoqhrauW03n9s3hXnIQh9xM65vc4u3laKWoh7Ft9k8UubM5AhGiJysvLWbVqFZs3b8bR0ZHx48czdOhQHB0tub17kaIT9Em+k2yHIFxv/wHniBFc/d0qIVqPK/4vUkolc4muvis9qCtEa1ZbW0taWhqrVq2ioqKCfv36MXbsWDw9r661U2vUfJeQTHS/wUQEdqB69mICI0ZKq0kILBvF91Sd967ATKDGOuEIYd+01hw4cID4+Hjy8vKIiIggNjaW4ODgqy+svJCqH55jxs7PWFb0LhGzb8U16rqmD1qIFsqSJd/TL9q11pIHdYVobU6fPk18fDyHDx/G39+fefPm0aVLl6u+z1RRXcu2+EUM2fMKbqW5FPV/iNmTZ1gpaiFaLku6+OrOweIADADaWi0iIexMSUkJycnJbN26FRcXFyZNmsSgQYMsXzjwIsc/uZshJ76l3D8Kt/lLadM+umkDFqKVsKSLLx3TPSiFqWvvCPArawYlhD2oqalhw4YNrFmzhpqaGgYPHszo0aNxc3O76rIKSirJLamka1tvwvuN43hwF0Km/AYMTlaIXIjWwZIuvvDmCEQIe6G1Zvfu3SQkJFBYWEjXrl2ZOHEiAQEBDSsvdz9ZC+5mpeNYHn/mjzgOvIOQJo5ZiNbIki4+V+ABIAZTSyoVeE9rXWHl2IRodidOnCA+Pp5jx44RHBzMbbfdRkRERIPKOp5bSIdd7+Ow5nV6GFzxHxYpS68LcRUs6eL7L1CMaR4+gHnAp8BsawUlRHM7e/YsiYmJbN++HQ8PD6ZOnUp0dLTlCwde5Pi2FCq+fhAHlQVRM3Cc/BfaezVgpJ8Q1zBLElQ3rXXdZTOSlVLbrBWQEM2pqqqKdevWsXbtWrTWxMTEEBMTg4uLS4PKK6+qxc3ZQEe3Sopdaym4bhG+0VObOGohrg2WJKitSqmhWusNAEqpIcBa64YlhHVprdm+fTuJiYkUFxcTFRXFhAkT8PHxaWiBbPjmHTbuOsBtT7yOX9dJeD+9DRwbluiEEJYlqCHA7UqpY+btUGCPUmoHoLXWfawWnRBWkJmZSXx8PCdPnqRDhw7Mnj2bkJCGD1uozdmH4ccnGXp0DQHu/TCcm3hFkpMQjWJJgpps9SiEaAYFBQUkJCSwe/duvL29uemmm+jdu3eDBy4YK0pY+f7TTChcBi4ecMObRPa/Axp430oIcSFLhplnKqX6AiPNu9ZoreUelGgxKioqWLNmDRs3bsTBwYExY8YwfPhwnJwa9gxSda0RJ4MDDkWZTChYyoHg6+l+2xvgGdjEkQtxbbNkmPmjwD3A1+Zdi5RSC7TW/6znMiFszmg0smXLFpKTkykrKyM6OpqxY8fi7e3d4DLTM7aw+vuFTLvvZSKCozA8upXuvp2aMGohxDmWdPH9ChiitS4FUEr9FVjP/4adC2F3Dh06RFxcHLm5uXTq1IlJkybRrl27BpdXXVGK0/q36J/6JlFGB06VPAyBkSDJSQirsSRBKaC2znateZ8Qdic3N5f4+HgOHjyIr68vc+bMoXv37g1/QFZrPv3kX1x34m0CarJRvWbhGvsnwr3bN23gQohfsCRBfQxsVEp9gykxTQP+Y9WohLhKZWVlpKSkkJaWhrOzMxMnTmTw4MENWziQ/91noryAuVmvcNYlGOP8FThEjLzyxUKIJmHJIIl/KKVSME11BHCX1nqrVaMSwkK1tbVs2rSJ1atXU1lZyYABAxgzZgweHh4NLvPg8VOs+O9rDJ77LMMjg3D+9U8EBPWQiV2FaGZX8+elAoxI956wA1pr9u3bx8qVK8nPz6dz587ExsYSFBTU4DIrqqpx3fMVneOf57Hq0+wruA6YCO3kUT8hbMGSUXzPY5p37ytMyeljpdQXWus/Wzs4IS4lOzubuLg4jh49SkBAALfccguRkZGNKvOjL75h2L6/0KNmL6rDAJi3hG4dBzRRxEKIhrCkBTUP6Hdu9nKl1F+ALYAkKNGsiouLzy8c6ObmxvXXX8+AAQMaPKFrSWUNbk4GDBiZe/QFUMVU3/BPnPrfKg/bCmEHLElQRwFX4NzyGi7AIWsFJMTFqqurWb9+PampqdTW1jJ06FBGjx6Nq6trg8s8nlvEp++9TLdJv2bmkK543PYZ+ISAa5smjFwI0RiWJKhKYJdSaiWm9aAmAqlKqbcBtNaPWDE+cQ3TWrNz504SExMpKiqie/fuTJw4ET8/vwaXeaakkoDT6+j487P81riX46Vdga7QtlfTBS6EaBKWJKhvzK9zUqwTihD/c/z4ceLj48nKyqJt27ZMnz6dsLCwRpX53rdJdNv2F8bpjSjfMLh5CSHdrmuSeIUQTc+SYeYLmyMQIQAKCwtJTExk586deHp6cuONNxIdHd3gB21ziytxdzbg4eLILTl/x01to2b073Ac8Qg4NbyLUAhhfQ17ilGIJlZZWUlqaiobNmwAYNSoUYwYMQJnZ+cGl3mmuIKXX/8b3QeN574bRuA94y1TUmrTsanCFkJYkSQoYVNGo5GMjAySk5MpKSmhd+/ejB8/njZtGjZYQWvNgZwSuqoTBPz8G95UKRToKmAEBDRuKLoQonlZPUEppQxAGnBCa32DtT9PtBxHjhwhPj6e7OxsOnbsyNy5c+nYsXGtm3d/3or7+tfp4hiHcvaA617Dd+DdTRSxEKI5XTZBKaW+h3NLg/6S1vpGCz/jUWAP0PA1DkSrkpeXx8qVK9m3bx9t2rRh5syZREVFNfg+06micgwOiiAvV+4s/y8eDj+i+96GmvACeAQ0cfRCiOZSXwvqdfPXGUBbYJF5ex6mZ6OuSCnVEZgCvAw80bAQRWtRXl7O6tWr2bRpE46OjowbN46hQ4c2eOFAgLKqGh5781P6RQTx7G3T8Zz4LAy+DSWzQAjR4l02QWmtVwEopf6ktR5V59D3SqnVFpb/JvAM4HW5E5RS9wL3AoSGhlpYrGhJamtrSU9PJyUlhfLycvr168e4cePw9PRsUHlaa3adPEsvP4178st8rj+kXE8EpoNXW9NLCNHiWXIPKlApFaG1PgyglAoHrri2tVLqBiBHa52ulBpzufO01guABQADBw68bJeiaHm01hw4cICVK1dy5swZwsPDiY2NpW3bxiWQzzdlsmX5u7zq9RWOlQWoQb/CfexvmyhqIYS9sCRBPQ6kKKUOm7fDgP+z4LoRwI1KqesxTZXkrZRapLW+tUGRihYlJyeH+Ph4Dh06hJ+fHzfffDNdu3Zt8H2m4opqCsuqCfFz5yZjPPOcFmAMHALXvy6zjQvRSimtr9xoUUq5AN3Nm3u11pVX9SGmFtRTVxrFN3DgQJ2WlnY1RQs7U1paSnJyMlu2bMHFxYXRo0czaNAgDAZDg8vUWjPnzZ/oZMjjtYdvRVWXw74foddMaOhKuUIIu6GUStdaD7x4f32j+GZc5lBnpRRa66+bLDrR4tXU1LBx40bWrFlDVVUVgwYNYvTo0bi7uze4zEO5JUT4u6G2fsri8hcwuvmj9C3g7A69ZzVh9EIIe1RfF9/Ueo5pwOIEpbVOQebwa5W01uzZs4eEhAQKCgro0qULsbGxBAQ0bnj3piP5vPLBIj4JXoZPwQ6cO42A61+TZTCEuIbUN4rvLqWUAzBLa72sGWMSLcTJkyeJi4vj2LFjBAUFceutt9K5c+cGl2c0ak6draCDjxsD1D6+cX4eXRUIMz6A3rOlO0+Ia0y9gyS01kal1EOAJChx3tmzZ0lKSmLbtm24u7szZcoU+vfv3+CFA8955outnD68jQ+euh3X0CEw6RVUv1vBVZ7xFuJaZMkovpVKqaeApUDpuZ1a63yrRSXsUnV1NevWrWPt2rUYjUZGjBhBTExMoxYOLCqrxs3ZgPOpdF46/RhOtZk4Vd0IHv4w7IEmjF4I0dJYkqDOTWT2YJ19Goho+nCEPdJas337dhITEykuLqZnz55MmDABX1/fRpWbW1zJ/DeW83bgd/Q4/T0eXu1h+lvg3vAFCYUQrYcl60GFN0cgwj4dO3aMuLg4Tp48Sfv27Zk1a1ajZ/woqazB08WRQApZoR7FKbcKRjwGo54Gl4bNLiGEaH2umKCUUk7A/cC56Y5SgPe11tVWjEvYWEFBAQkJCezevRsvLy+mT59Onz59Gvyg7TnL0o7z3x9S+Ojx2QR5B+My7jfQbYoshSGE+AVLuvjeA5yAf5m3bzPv+7W1ghK2U1lZyerVq9m4cSMODg6MHj2a4cOHN2rhQKNRU1VrxLX0JNfvfY6Z+kdKC6PBuzeMeLTpghdCtCqWJKhBWuu+dbaTlFLbrBWQsA2j0cjWrVtJTk6mtLSUvn37Mm7cOLy9GzeCrtaouX3BKu7Uy5mY9xmeAGN+g3c7aTEJIepnSYKqVUp11lofAlBKRQC11g1LNKfDhw8TFxdHTk4OoaGhzJ8/n/bt2zeqzIrqWlydDBh0Df8sehS/8qPQczrE/gl8ZNZ6IcSVWZKgngaSzZPFKqATcJdVoxLN4syZM6xcuZL9+/fj4+PD7Nmz6dGjR6PvM204nMdLi+J5494pdG/rjd/YhyCgK0SMbqLIhRDXgvrm4nsMWAusAroA3TAlqKueLFbYl/LyclJSUkhLS8PJyYkJEyYwZMgQHB0t+Xvl8ipranGpLiZ6119ZYfyQnBNe0PYGGHxPE0UuhLiW1PcbqSPwFqZZzLcD6zAlrOOAJKgWqLa2ls2bN7Nq1SoqKyvp378/Y8eOxcPDo9Fl/+7rDCKOf8PdlYtwLcuDAXfQrvvQJohaCHGtqm8uvqcAlFLOwEBgOKaHdj9QShVqrXs2T4iisbTW7N+/n/j4ePLz84mIiCA2Npbg4OBGlVtaWYO7swGlFA+efI72BevQIUPhtq+hXd8rFyCEEPWwpE/HDfAG2phfJ4Ed1gxKNJ3s7Gzi4+M5cuQIAQEBzJ8/n8jIyEbfZ9qbfZYnF6zgyVljGNezPe1H3Q3qVyhZo0kI0UTquwe1AIgCioGNmLr4/qG1Lmim2EQjlJSUkJSUxNatW3Fzc+O6665jwIABjV44ML+0Cn+narrseINv9TvknnwJej4AfWY3YfRCCFF/CyoUcAEOACeALKCwGWISjVBdXc2GDRtITU2lpqaGoUOHMmrUKNzc3Bpd9m+/ysDv4Fc85fgFhpJsDL3n0H7QtCaIWgghfqm+e1CTlakfKArT/acngV5KqXxgvdb6hWaKUVhAa82uXbtISEigqKiIbt26MXHiRPz9/RtV7rG8Mtr5uOJkcODxs68RVPEDusMgmLsIQgY1UfRCCPFLV1oPSgM7lVKFQJH5dQMwGJAEZSeysrKIi4sjKyuL4OBgpk2bRnh44+f4PZhTzMNvfcbtk4Yzb1RvgsbeD6WzUFE3yX0mIYTV1XcP6hFMLacRQDWmIebrgY+QQRJ2oaioiMTERHbs2IGHhwdTp04lOjq6UQsHVlTXcuB0Cb29Sui8/lV+cFpMeemjQG8IH9l0wQshxBXU14IKA74EHtdan2qecIQlqqqqSE1NZf369WitiYmJISYmBhcXl0aX/acv1tJl/wf0coxHaSNq6H14jHqkCaIWQoirU989qCeaMxBxZVprMjIySEpKoqSkhF69ejF+/Hh8fHwaVW7qgTP06uCNj7szv6n9AC++R0XdDGOeA99OTRO8EEJcpcbNbSOazdGjR4mLiyM7O5sOHTowZ84cQkJCGl3usdP5JHzyRw4Onc6dU8fhfd0LUPssBEc1QdRCCNFwkqDsXH5+PitXrmTv3r14e3szY8YMevXq1agHbY/nl7HlyGmm6WRCV7/Oi04nqPEKAcbJwoFCCLshCcpOVVRUnF840GAwMHbsWIYNG4aTk1Ojy1737XuMOPYekAsdB8P0f+EYLjONCyHsiyQoO2M0GklPTyclJYWysjL69evH2LFj8fLyanCZ1bVGlqw/xMju7QkP8GCaXxYOFe1g4nsQOUGGjAsh7JIkKDty8OBB4uPjyc3NJSwsjEmTJtG2bdvGFVpdQcWGj5mY8Bprsl8hfNbNuE55BRxdJTEJIeyaJCg7kJubS3x8PAcPHsTPz4+5c+fSrVu3Rt1n2nEoi/w1Cxidtwyv4lM4tR/E7CGdTQedGj/tkRBCWJskKBsqKysjOTmZ9PR0XFxciI2NZfDgwY2a0BUAren45fX0Ls+kOjQGpxkLcA0bKS0mIUSLIgnKBmpqati0aROrV6+mqqqKgQMHMmbMGNzd3RtcZlnOUTZ98xau459jaGQQHte/RJlne9zDhzRh5EII0XwkQTUjrTV79+5l5cqVFBQUEBkZSWxsLIGBgQ0us/RoOh7p7+G282tiNHy/ZzRETse59004N2HsQgjR3CRBNZNTp04RFxdHZmYmgYGB3HLLLURGNuKZo9IzHHxvDpEl6WhnL9TQ+6nqfy83BcrMD0KI1kESlJUVFxeTlJRERkYG7u7uTJkyhf79+zdoQteDJ8+QsHo1d86chqubL75uBjYGP0L/GU/g5OFLwzsIhRDC/lgtQSmlXIHVmBY9dAS+vJbWkKqurmbdunWsXbsWo9HI8OHDGTlyJK6urhaXUVVjJPVgLlE+NQTv+4zQ9f9mbnkl+7KG0Te8Hf4PrqRxqz0JIYT9smYLqhIYp7UuUUo5AalKqZ+01hus+Jk2p7Vmx44dJCYmcvbsWXr06MHEiRPx9fW16PqK6lpKK2vw93ThzPF9ZC/6LaOc14KxEsfICbgPeoC+YY18NkoIIVoAqyUo82KHJeZNJ/NLW+vz7MHx48eJi4vjxIkTtGvXjhkzZtCpk+X3hGqNmrF/SyK2qxcvzR5Ke8NZbnZZi+49F4Y/iENQdxq/oIYQQrQMVr0HpZQyAOlAJPCu1nrjJc65F7gXIDQ01JrhWE1hYSEJCQns2rULLy8vpk2bRt++fS160PabrVlsySzkT9eFYdi2hDjndyirHg4MhZDBODy5F9z9rF8JIYSwM1ZNUFrrWiBaKeUDfKOU6qW13nnROQuABQADBw5sUS2syspK1qxZw4YNG1BKMWrUKEaMGIGzc/0DvA/mFNM50BOlFGdP7GPwvoXoPUmoymK82/fHu2+s6USlJDkJIa5ZzTKKT2tdqJRKASYDO69wut0zGo3nFw4sLS2lT58+jB8/Hm9v7ytem7jnNL9euInFvx7K8MhAbtPf41D5A/ScDkP+DzoOkhkfhBAC647iCwSqzcnJDZgA/NVan9dcjhw5QlxcHKdPnyYkJIR58+bRoUOHy55fU2tkWVoW7XxcGRviyKi8pWT4LsCg3wcCcRj9DIx5Frxk4IMQQtRlzRZUO2Ch+T6UA7BMa73Cip9nVXl5ecTHx7N//358fHyYNWsWPXv2vOx9pqoaI86ODjgoxaqUeH7lkgglSTjVVNAmZCg4m5+D8m7fjLUQQoiWw5qj+LYD/axVfnMpLy9n1apVbN68GUdHR8aPH8/QoUNxdLz8t+69lEMs23yMlU+MxlFX8x4vo0oroe88GPQraNu7GWsghBAtk8wkcRm1tbWkpaWRkpJCZWUl/fv3Z8yYMXh6ev7i3OpaI3G7shndNRCvov1MPfEvphs3UV6VipebCw7zlkBQD3BtY4OaCCFEyyQJ6iJaa/bv38/KlSvJy8sjIiKC2NhYgoODL3muUoo9mdmkLH2ToUEb8SrIoKPBBXpOA8oBFwgd2uz1EEKIlk4SVB2nT58mLi6OI0eO4O/vz7x58+jSpcsv7jMZjZpHP99KZz8XHpscRe/KLbzu9D7aoQvE/hn6zgcPmYRICCEaQxIUUFJSQnJyMlu3bsXFxYXJkyczcODACxYOLCyrYuuxQsaGOuKw4wuePfYBJytGA39HdZ0Ed/2MCh0qQ8SFEKKJXNMJqqamhg0bNrBmzRpqamoYPHgwo0ePxs3NtCT6uS48gO+/XkTA/s/RTltRtVV0aNeXDoOGmQoyOEGnYbaqhhBCtErXZILSWrN7924SEhIoLCykW7duTJgwgYCAgPPnbDteyKuf/cyLd1xP97bezCQBZ/cDqOhfQ/Qt0LaXDWsghBCt3zWXoE6cOEFcXBzHjx8nODiY2267jYiICKprjXyXcYJObpVEFyYQtWUxn5dnsOdMMrTtj/u0N8DNFxxlnVohhGgO10yCOnv2LImJiWzfvh0PDw+mTp1Kr959yCmpAkAVZOL13b30YgvoGhyDe8OkV+gREWYqwOuXo/iEEEJYT6tPUFVVVaxdu5Z169ahtWbEiBGMHDkSF2dn/vjvhZSUlfO3J+/H0cOHUZ4nMPS8F/rNl4dphRDCxlptgtJas23bNpKSkiguLiYqKorq4Cg+2bidsYY3YcdSns8/RH7gYLS+D+Xmi+MTu2QUnhBC2IlWmaAyMzOJi4vj1KlT1Lr6ctPsW+jXM5KsxQ8xr+RTWAWEjYSRT+DX48b/JSVJTkIIYTdaVYI6np3DZ1//QEXuMby9vBjTJ5TSbcuoNF4PQMd+EyE0HHrPAZ8QG0crhBCiPq0mQWmtWf71V5Tm5NKzTSkzaz7HadtJtLs/yisXiDRPPySEEKIlaDUJSinFTeOH4LXkBryKK6HLJIh+DdUlVoaGCyFEC9RqEhRA+279YebbEDEGPAKueL4QQgj71aoSFAC9Z9k6AiGEEE3AwdYBCCGEEJciCUoIIYRdkgQlhBDCLkmCEkIIYZckQQkhhLBLkqCEEELYJUlQQggh7JIkKCGEEHZJaa1tHcN5SqlcILORxQQAZ5ogHHsidbJ/ra0+IHVqKVpDnTpprQMv3mlXCaopKKXStNYDbR1HU5I62b/WVh+QOrUUrbFO50gXnxBCCLskCUoIIYRdao0JaoGtA7ACqZP9a231AalTS9Ea6wS0wntQQgghWofW2IISQgjRCkiCEkIIYZfsPkEppT5SSuUopXbW2ddXKbVeKbVDKfW9UsrbvD9MKVWulMowv/5d55oB5vMPKqXeVkopW9THHIvFdTIf62M+tst83NW8v0XWSSl1S52fUYZSyqiUijYfa6l1clJKLTTv36OUeq7ONXZRp6usj7NS6mPz/m1KqTF1rrGL+phjCVFKJZu/57uUUo+a9/sppVYqpQ6Yv/rWueY5c+z7lFKT6uy3i3pdbZ2UUv7m80uUUu9cVJZd1KnBtNZ2/QJGAf2BnXX2bQZGm9/fDfzJ/D6s7nkXlbMJGAYo4CfguhZSJ0dgO9DXvO0PGFpynS66rjdwuBX8nOYDn5vfuwNHgTB7qtNV1udB4GPz+yAgHXCwp/qYY2kH9De/9wL2Az2BvwHPmvc/C/zV/L4nsA1wAcKBQ/b2/6kBdfIAYoD7gHcuKssu6tTQl923oLTWq4H8i3Z3A1ab368EZtZXhlKqHeCttV6vTT+1/wLTmzhUi11lnWKB7VrrbeZr87TWtS28TnXNA5ZAi/85acBDKeUIuAFVwFl7qtNV1qcnkGi+LgcoBAbaU33MsZ3SWm8xvy8G9gAdgGnAQvNpC/lfjNMw/SFRqbU+AhwEBttTva62TlrrUq11KlBRtxx7qlND2X2CuoydwI3m97OBkDrHwpVSW5VSq5RSI837OgBZdc7JMu+zJ5erU1dAK6XilFJblFLPmPe35DrVNRdzgqJl1+lLoBQ4BRwDXtda52P/dbpcfbYB05RSjkqpcGCA+Zjd1kcpFQb0AzYCwVrrU2D6hY+pFQimWI/Xuexc/HZZLwvrdDl2Waer0VIT1N3Ag0qpdExN4Crz/lNAqNa6H/AE8Jm5T/1S/a72Nr7+cnVyxNR8v8X89Sal1Hhadp0AUEoNAcq01ufuibTkOg0GaoH2mLqOnlRKRWD/dbpcfT7C9AstDXgTWAfUYKf1UUp5Al8Bj2mtz9Z36iX26Xr228xV1OmyRVxin81/VlfD0dYBNITWei+mri+UUl2BKeb9lUCl+X26UuoQphZIFtCxThEdgZPNGfOVXK5OmGJfpbU+Yz72I6b7CItouXU652b+13qClv1zmg/8rLWuBnKUUmuBgcAa7LhO9fxfqgEeP3eeUmodcAAowM7qo5RywvSLfLHW+mvz7tNKqXZa61Pmrq4c8/4sLmzJn4vfrv7tXWWdLseu6tQQLbIFpZQKMn91AH4P/Nu8HaiUMpjfRwBdMN2APwUUK6WGmkex3A58Z5PgL+NydQLigD5KKXfz/Y3RwO4WXqdz+2YDn5/b18LrdAwYp0w8gKHAXnuvUz3/l9zN9UApNRGo0Vrb3b87cwz/AfZorf9R59By4A7z+zv4X4zLgZuVUi7mrssuwCZ7qlcD6nRJ9lSnBrP1KI0rvTD9hX0KqMb0F8GvgEcxjWzZD/yF/82IMRPYhan/fAswtU45AzH1tx8C3jl3jb3XyXz+reZ67QT+1krqNAbYcIlyWmSdAE/gC/PPaTfwtL3V6SrrEwbsw3SDPgHTcgh2VR9zLDGYuq22Axnm1/WYRrsmYmr1JQJ+da75nTn2fdQZ1WYv9WpgnY5iGgBTYv7Z9rSnOjX0JVMdCSGEsEstsotPCCFE6ycJSgghhF2SBCWEEMIuSYISQghhlyRBCSGEsEuSoISwIvNzUalKqevq7JujlPrZlnEJ0RLIMHMhrEwp1QvTM1L9AAOm51oma60PNaAsg9a6tmkjFMI+SYISohkopf6GaTJZD/PXTpiWGnEEXtRaf2eeGPRT8zkAD2mt1ynTWkwvYHrINlpr3bN5oxfCNiRBCdEMzNMGbcE0GesKYJfWepFSygfTmj39MM0eYNRaVyilugBLtNYDzQnqB6CXNi0RIcQ1oUVOFitES6O1LlVKLcU0Fc0cYKpS6inzYVcgFNNEnu8o0+rCtZgmOj5nkyQnca2RBCVE8zGaXwqYqbXeV/egUupF4DTQF9MAproL0JU2U4xC2A0ZxSdE84sDHjbPMI1Sqp95fxvglNbaCNyGaUCFENcsSVBCNL8/AU7AdqXUTvM2wL+AO5RSGzB170mrSVzTZJCEEEIIuyQtKCGEEHZJEpQQQgi7JAlKCCGEXZIEJYQQwi5JghJCCGGXJEEJIYSwS5KghBBC2KX/BxAo6E+EzPpPAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1210,20 +1229,14 @@ } ], "source": [ - "from modsim import decorate\n", - "\n", - "plot(census, style=':', label='US Census')\n", - "plot(un, style='--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" ] }, { "cell_type": "markdown", - "id": "younger-abuse", + "id": "automated-albany", "metadata": {}, "source": [ "The keyword argument `color='gray'` specifies the color of the line. For details on color specification see .\n", @@ -1233,7 +1246,7 @@ }, { "cell_type": "markdown", - "id": "similar-characterization", + "id": "unnecessary-million", "metadata": {}, "source": [ "## Summary\n", @@ -1255,7 +1268,7 @@ }, { "cell_type": "markdown", - "id": "equivalent-louis", + "id": "advanced-ivory", "metadata": {}, "source": [ "## Exercises" @@ -1263,7 +1276,7 @@ }, { "cell_type": "markdown", - "id": "excessive-cream", + "id": "hearing-today", "metadata": {}, "source": [ "Here's the code from this chapter all in one place." @@ -1271,8 +1284,8 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "foreign-support", + "execution_count": 32, + "id": "terminal-reynolds", "metadata": {}, "outputs": [], "source": [ @@ -1295,13 +1308,13 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "inner-harvest", + "execution_count": 33, + "id": "organizational-memphis", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1313,18 +1326,14 @@ } ], "source": [ - "plot(census, style=':', label='US Census')\n", - "plot(un, style='--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" ] }, { "cell_type": "markdown", - "id": "narrative-state", + "id": "ecological-welsh", "metadata": {}, "source": [ "**Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", @@ -1338,8 +1347,8 @@ }, { "cell_type": "code", - "execution_count": 33, - "id": "happy-empire", + "execution_count": 34, + "id": "rising-anger", "metadata": {}, "outputs": [ { @@ -1348,7 +1357,7 @@ "0.07854997754347826" ] }, - "execution_count": 33, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1372,8 +1381,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "tutorial-fundamentals", + "execution_count": 35, + "id": "false-handbook", "metadata": {}, "outputs": [], "source": [ @@ -1388,13 +1397,13 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "beautiful-harvest", + "execution_count": 36, + "id": "political-loading", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -1408,19 +1417,15 @@ "source": [ "# Solution\n", "\n", - "plot(census, style=':', label='US Census')\n", - "plot(un, style='--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model, t1=1970')" ] }, { "cell_type": "code", "execution_count": null, - "id": "liberal-escape", + "id": "improved-sigma", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap06.ipynb b/jupyter/chap06.ipynb index b049a5c5..26cdf959 100644 --- a/jupyter/chap06.ipynb +++ b/jupyter/chap06.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "plain-cincinnati", + "id": "creative-motel", "metadata": {}, "source": [ "# Chapter 6" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "corrected-chart", + "id": "parental-symposium", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "operational-landscape", + "id": "compound-church", "metadata": { "tags": [ "remove-cell" @@ -52,7 +52,7 @@ }, { "cell_type": "markdown", - "id": "statutory-baking", + "id": "quality-spectrum", "metadata": {}, "source": [ "In the previous chapter we simulated a model of world population with\n", @@ -65,7 +65,7 @@ }, { "cell_type": "markdown", - "id": "handled-seating", + "id": "ranking-tamil", "metadata": {}, "source": [ "Here's the code that reads the data." @@ -74,7 +74,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "lovely-blake", + "id": "annoying-herald", "metadata": {}, "outputs": [], "source": [ @@ -89,7 +89,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "alleged-manufacturer", + "id": "shared-offense", "metadata": {}, "outputs": [], "source": [ @@ -104,7 +104,7 @@ }, { "cell_type": "markdown", - "id": "negative-shakespeare", + "id": "therapeutic-merchant", "metadata": {}, "source": [ "## System objects\n", @@ -129,7 +129,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "complimentary-drain", + "id": "numerous-university", "metadata": {}, "outputs": [], "source": [ @@ -149,7 +149,7 @@ }, { "cell_type": "markdown", - "id": "exotic-proportion", + "id": "starting-cooling", "metadata": {}, "source": [ "Some of these are parameters we need to simulate the system; others are temporary values we can discard. \n", @@ -159,7 +159,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "european-southeast", + "id": "colonial-domestic", "metadata": {}, "outputs": [], "source": [ @@ -173,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "innocent-chapter", + "id": "fleet-beaver", "metadata": {}, "source": [ "`t0` and `t_end` are the first and last years; `p_0` is the initial\n", @@ -185,7 +185,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "corresponding-chapter", + "id": "floral-routine", "metadata": {}, "outputs": [ { @@ -251,7 +251,7 @@ }, { "cell_type": "markdown", - "id": "modified-observation", + "id": "combined-banking", "metadata": {}, "source": [ "Next we'll wrap the code from the previous chapter in a function:" @@ -260,7 +260,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "patient-adobe", + "id": "pacific-challenge", "metadata": {}, "outputs": [], "source": [ @@ -278,7 +278,7 @@ }, { "cell_type": "markdown", - "id": "realistic-switzerland", + "id": "technological-medicine", "metadata": {}, "source": [ "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", @@ -291,7 +291,7 @@ }, { "cell_type": "markdown", - "id": "durable-convertible", + "id": "grateful-terror", "metadata": {}, "source": [ "\n", @@ -302,43 +302,40 @@ { "cell_type": "code", "execution_count": 8, - "id": "critical-cooper", + "id": "electoral-breach", "metadata": {}, "outputs": [], "source": [ - "results = run_simulation1(system)" + "results1 = run_simulation1(system)" ] }, { "cell_type": "markdown", - "id": "under-dealing", + "id": "ordinary-sound", "metadata": {}, "source": [ - "Here's the code we used in the previous chapter to plot the results, wrapped in a function." + "Here's the function we used in the previous chapter to plot the estimates." ] }, { "cell_type": "code", "execution_count": 9, - "id": "sublime-desperate", + "id": "peripheral-cassette", "metadata": {}, "outputs": [], "source": [ - "from modsim import plot, decorate\n", + "from modsim import decorate\n", "\n", - "def plot_results(results, title):\n", - " plot(census, style=':', label='US Census')\n", - " plot(un, style='--', label='UN DESA')\n", - " plot(results, color='gray', label='model')\n", - " \n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" + " ylabel='World population (billion)') " ] }, { "cell_type": "markdown", - "id": "worst-muslim", + "id": "warming-audience", "metadata": {}, "source": [ "And here are the results." @@ -347,12 +344,12 @@ { "cell_type": "code", "execution_count": 10, - "id": "announced-appendix", + "id": "capable-diana", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -364,12 +361,14 @@ } ], "source": [ - "plot_results(results, 'Constant growth model')" + "results1.plot(label='model', color='gray')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" ] }, { "cell_type": "markdown", - "id": "competitive-immigration", + "id": "exposed-witness", "metadata": {}, "source": [ "It might not be obvious that using functions and `System` objects is a\n", @@ -381,7 +380,7 @@ }, { "cell_type": "markdown", - "id": "european-massachusetts", + "id": "geographic-hormone", "metadata": {}, "source": [ "## Proportional growth model\n", @@ -398,7 +397,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "biblical-evans", + "id": "laughing-wesley", "metadata": {}, "outputs": [], "source": [ @@ -416,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "neutral-singapore", + "id": "educated-portugal", "metadata": {}, "source": [ "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", @@ -428,7 +427,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "alert-enzyme", + "id": "wired-brief", "metadata": {}, "outputs": [], "source": [ @@ -438,7 +437,7 @@ }, { "cell_type": "markdown", - "id": "bacterial-convergence", + "id": "sufficient-contest", "metadata": {}, "source": [ "Then I ran the simulation and plotted the results:" @@ -447,12 +446,12 @@ { "cell_type": "code", "execution_count": 13, - "id": "mechanical-phone", + "id": "looking-trace", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABIW0lEQVR4nO3dd1iUV/bA8e+hgwgqYBdRVCwoqNh7jd2oUWNMjJreeza7m+JuytZfsrtJdjemmhgTjUk0auy9oWKLPYpdEQUrvcz9/TGDiwg4KsMMcD7PMw/z9nNnxMN9733vFWMMSimllKtxc3YASimlVGE0QSmllHJJmqCUUkq5JE1QSimlXJImKKWUUi5JE5RSSimXpAlKVUgiMl5ElpTCdb4QkbccfZ2SICJTRGS6k2PoKSIn7dzX6fEqx9IEpUqMiBwVkXQRSRGRRBH5XET8XSCuMBExIuKRt84Y87Uxpr8z4wIQkVoi8rGInLZ9bodtSa2pg69rdyIo5hzG9j175FvnISJnRUQfsFS3TROUKmlDjTH+QBugHfBqwR3y/4fmaKV5rZslIkHABsAP6AZUxvq5rQb6FXGMq5XnIjAw3/Ig4IJzQlHljSYo5RDGmFPAQiASrv61/YSIHAQO2tY9JCKHROS8iPwkIrXzjrft/7StRpEkIn8TETfbNjcReVVEjtn+Wv9SRAJt2/JqSw+IyHFgBbDGdtqLtlpKJxGZKCLr8l2vs4hsEZFLtp+d821bJSJvish6EbkiIktEJDjf9u9E5Izt2DUi0sLOj+k54DJwnzEm3lhdNMZ8box5v6jy3KD800TkBdv7OrZjH7ctN7J91pVs301t2+eRku+z97Kd74qI7BGRmBuU4StgQr7lCcCX+XcQkdq27/e87ft+KN82X1uN8YKI7MX6R03BY78XkXMickREnrbzs1XlgCYo5RAiUg/rX9Pb862+E+gANBeR3sCfgDFALeAY8G2B04wAYrDWKoYDk23rJ9pevYCGgD/wQYFjewDNgDuA7rZ1VYwx/saYjQVirQYsAP4FBAHvAgtsNZw89wCTgOqAF/Bivm0Lgca2bduArwv7TArRF/jRGGOxY9/85ZlI0eVfDfTMd8xh20+wfg5rjTGpWGs9p22fh78x5rRtn2FYv4cqwE9c/7kWNAfoLiJVRKQK1prg3AL7fAOcBGoDdwHviEgf27Y3gHDb6w7g/ryDbH+QzAN2AnWAPsCzInLHDWJS5YUxRl/6KpEXcBRIwXrb5xjwb8DXts0AvfPt+ynw13zL/kA2EJZv/wH5tj8OLLe9Xw48nm9bhO1YDyDMdmzDfNvz1nnkWzcRWGd7fx+wuUBZNgITbe9XAa8WiGVREZ9BFdu1Am3LXwBvFbHvIeDRfMvDbJ/dFWBJgdjzl6e48ofbzuEG/Bd4BDhp228a8Lztfc+89fnOMwVYlm+5OZBezPdtgEbAJ7brPAp8bFtnbPvUA3KByvmO+xPwhe394QLf88P54u0AHC9wzd8Cn+eLd7qz/93ry3EvrUGpknanMaaKMaa+MeZxY0x6vm0n8r2vjTWJAWCMSQGSsf6lXNj+x2zHXHes7b0HUKOIY2+k4Pnyzpk/ljP53qdhTaiIiLuI/FlE4kXkMtYkDRDMjSVjrT0CYIz5yRhTBeutP68C+xb52ZGv/MaYeKx/JERjrc3MB06LSATWmtTqG8RUsJw+drR7fYn11t51t/dssZ43xlwpEG+dfNsLfs956mO9DXkx7wX8jmu/Z1WOaYJSpSl/z67TWP8DAsDWLhIEnMq3T71870Ntx1x3rG1bDpBYxLVu1KOs4PnyznmqkH0Lugfr7ce+QCDWGg+A2HHscuDOvLa1Gyjys+P68q/GeivNy1jbAldjTR5VgR2FnO92rcWaaGsA6wpsOw1UE5HKBeLN+2wTuP57znMCOGL7gyfvVdkYM6gEY1cuTBOUcpYZwCQRiRYRb+AdYJMx5mi+fV4Skaq29qxngJm29d8Az4lIA7F2Y38HmGmMySniWucAC9b2msL8DDQRkXts3aTHYr29Nd+OclQGMrHWhvxssdjrXaxJ4ysRCRerylhrP8W5UflXA0/yv84hq4CnsN7SzLWtSwSC8jpX3A5jjAGGAsNs7/NvO4G1p+KfRMRHRFoBD/C/drpZwG9t33NdW5x5NgOXReQ3ts4U7iISKSLXdKRQ5ZcmKOUUxpjlwGvA91j/ig4H7i6w21xgK9a/+hdgbbcC+Axr77E1wBEgg2v/Yyt4rTTgbWC97VZRxwLbk4EhwAtYE83LwBBjTJIdRfkS622pU8BeINaOY/KumwR0tMW/Dmvb0w6sSe+xYg69UflX286Rl6DWYU2eecsYY/ZjTXSHbZ9JbW6DMWaPMWZPEZvHYa1ZngZ+BN4wxiy1bfsD1s/vCLDEVq68c+ZiTXzRtu1JWNu7bjupqrJBCvzBo5RLEOuDno2NMYecHYtSyjm0BqWUUsolaYJSSinlkvQWn1JKKZekNSillFIuyaUGngwODjZhYWHODkMppVQp2rp1a5IxJqTgepdKUGFhYcTFxTk7DKWUUqVIRAqO5ALoLT6llFIuShOUUkopl6QJSimllEtyaBuUiDwHPIh1YMpdwCRjTMbNnCM7O5uTJ0+SkXFThyk7+fj4ULduXTw9PZ0dilJKXcNhCUpE6gBPA82NMekiMgvrWGtf3Mx5Tp48SeXKlQkLC0PEngGilb2MMSQnJ3Py5EkaNGjg7HCUUuoajr7F5wH42uaT8eN/0yXYLSMjg6CgIE1ODiAiBAUFae1UKeWSHJagbPPQ/B04jnW06kvGmCUF9xORh0UkTkTizp07V+i5NDk5jn62SilX5bAEJSJVsU7k1gDrrJmVROTegvsZY6YaY2KMMTEhIdc9p6WUUsoFXbx4kV9++cWh13DkLb6+WGfDPGeMyQZ+ADo78HouLywsjKSk4qcYsmcfpZRypqSkJD7//HMWLVrk0CYCR/biOw50FBE/IB3oA+gwEUopVYYlJCQwffp0RIT7778fHx8fh13LkW1Qm4DZwDasXczdgKmOup6jHD16lKZNm/Lggw8SGRnJ+PHjWbZsGV26dKFx48Zs3ryZ8+fPc+edd9KqVSs6dux4tdqbnJxM//79ad26NY888gj5R46fPn067du3Jzo6mkceeYTc3NyiQlBKKZdw4sQJpk2bhqenJ5MmTaJGjRoOvZ5Dn4MyxrwBvFFS51u0aBFnzpwpqdMBULNmTQYMGFDsPocOHeK7775j6tSptGvXjhkzZrBu3Tp++ukn3nnnHerVq0fr1q2ZM2cOK1asYMKECezYsYM//OEPdO3alddff50FCxYwdao1P+/bt4+ZM2eyfv16PD09efzxx/n666+ZMGFCiZZNKaVKSnx8PDNnzqRy5cpMmDCBwMBAh1/TpQaLdVUNGjSgZcuWALRo0YI+ffogIrRs2ZKjR49y7Ngxvv/+ewB69+5NcnIyly5dYs2aNfzwww8ADB48mKpVqwKwfPlytm7dSrt27QBIT0+nevXqTiiZUkrd2P79+5k9ezbBwcHce++9+Pv7l8p1y1SCulFNx1G8vb2vvndzc7u67ObmRk5ODh4e13+Med23C+vGbYzh/vvv509/+pODIlZKqZKxY8cOfvrpJ+rUqcM999yDr69vqV1bx+IrAd27d+frr78GYNWqVQQHBxMQEHDN+oULF3LhwgUA+vTpw+zZszl79iwA58+f59ixQkebV0opp9m4cSNz586lQYMG3HfffaWanKCM1aBc1ZQpU5g0aRKtWrXCz8+PadOmAfDGG28wbtw42rRpQ48ePQgNDQWgefPmvPXWW/Tv3x+LxYKnpycffvgh9evXd2YxlFIKsN7lWblyJWvXrqV58+aMGDGi0DtFjib5e5Y5W0xMjCk4YeG+ffto1qyZkyKqGPQzVkrlsVgsLFy4kLi4OFq3bs2QIUNwc3PszTYR2WqMiSm4XmtQSimlAMjNzWXOnDns3r2bLl26XO0Q5iyaoJRSSpGVlcWsWbOIj4+nT58+dO3a1dkhaYJSSqmKLi0tjRkzZnD69GmGDRtG69atnR0SoAlKKaUqtIsXLzJ9+nQuXbrE2LFjiYiIcHZIV2mCUkqpCurs2bNMnz6drKws7r33XpfrSawJSimlKqATJ04wY8YMPDw8SmVcvVuhD+rewNGjR4mMjLxm3ZQpU/j73/8OQGxsLB06dCA6OppmzZoxZcqUQs+zefNmunfvTkRExNXBZ9PS0hwdvlJKXWf//v18+eWX+Pn58cADD7hkcgKtQd22+++/n1mzZhEVFUVubi4HDhy4bp/ExERGjx7Nt99+S6dOnTDG8P3333PlyhX8/PycELVSqqKKi4vj559/pnbt2txzzz0u/X+Q1qBu09mzZ6lVqxYA7u7uNG/e/Lp9PvzwQ+6//346deoEWMfnu+uuu6hRowapqalMnjyZdu3a0bp1a+bOnQvAF198wciRIxkwYACNGzfm5ZdfBqzPKUycOJHIyEhatmzJe++9B0DPnj3Je8g5KSmJsLAwAPbs2XN1Wo9WrVpx8OBBh34eSinXlDc6xIIFC2jUqBETJkxw6eQEZTBBjf1oI9/FnQAgO9fC2I828uP2kwCkZ+Uy9qONzNt5GoDLGdmM/Wgji3YnAHA+NYuxH21k2d5EAM5euf2ZIJ977jkiIiIYMWIEH330UaGzS+7evZu2bdsWevzbb79N79692bJlCytXruSll14iNTUVsA7SOHPmTHbt2sXMmTM5ceIEO3bs4NSpU+zevZtdu3YxadKkYuP773//yzPPPMOOHTuIi4ujbt26t11mpVTZYrFYmDdvHmvWrCE6Opq7774bLy8vZ4d1Q2UuQZW2op6izlv/+uuvExcXR//+/ZkxY8ZNj7i+ZMkS/vznPxMdHU3Pnj3JyMjg+PHjgHVQ2cDAQHx8fGjevDnHjh2jYcOGHD58mKeeeopFixYREBBQ7Pk7derEO++8w1/+8heOHTtW6oM9KqWcKysri5kzZ7J9+3a6devGsGHDHD50UUkpc21QMx/pdPW9p7vbNcu+Xu7XLAf4eF6zXK2S1zXL1SvfeKrioKCgq6OQ5zl//jwNGjS4uhweHs5jjz3GQw89REhICMnJyQQFBV3d3qJFC7Zu3crw4cOvO39ee1TBZw82bdp0zTQf7u7u5OTkULVqVXbu3MnixYv58MMPmTVrFp999hkeHh5YLBaAa2px99xzDx06dGDBggXccccdfPLJJ/Tu3fuG5VZKlX0pKSl88803JCQkMHjwYGJirhvuzqWVjTTqRP7+/tSqVYvly5cD1uS0aNGiq8OALFiw4OpU7gcPHsTd3Z0qVapcc44nn3ySadOmsWnTpqvrpk+fzpkzZ7jjjjt4//33r55j+/btxcaTlJSExWJh1KhRvPnmm2zbtg2AsLAwtm7dCsDs2bOv7n/48GEaNmzI008/zbBhw65OR6+UKt+SkpL49NNPOXv2LGPHjr315JSaBPErSjY4O2mCssOXX37JW2+9RXR0NL179+aNN94gPDwcgK+++oqIiAiio6O57777+Prrr3F3d7/m+Bo1avDtt9/y4osvEhERQbNmzVi7di0BAQG89tprZGdn06pVKyIjI3nttdeKjeXUqVP07NmT6OhoJk6ceHXSwxdffJH//Oc/dO7cmaSkpKv7z5w5k8jISKKjo9m/f79OK69UBXD8+HE+++wzsrKymDhx4q2PDnFkLfy3K8yeDJkp/zt/chpPfL2Nc1cySyjiwul0G0o/Y6XKkb179/LDDz8QGBjI+PHjqVat2s2fxJILa/4Gq/8C1RrCXZ9DrVZXNx9NSmXkfzbwj7HRdG8Sctsx63QbSilVjhljiI2NZcmSJdStW5e7776bSpUq3fyJcjJh+ig4uhZa3Q2D/w+8/fnX8oOcT81iyrAWhAVXYsMrvfHxdL/x+W6DJiillCrj8k8y2KxZM0aMGIGnp+fNncQYEAEPb6jdGqLvwdJqHG5u1h7Ll9OzuZSejcVicHMThycn0DYopZQq07Kysvj222+Ji4ujU6dOjB49+uaT0+FV1ramk7Ymlv5vsqf6YPq8u5q9py8D8LtBzXhvbPTVhFUatAallFJl1JUrV5gxYwaJiYkMGjSIdu3a3dwJkuNhyatw4GeoEgpZqWRk5+Lj6U7dKn5Ur+xNRk4uQKkmpjyaoJRSqgxKTExkxowZpKenM27cOBo3bnxzJ1j5J1j7f9Zben2nQIfHeHHOARJWbGH6Ax0I9Lv2OVJn0ASllFJlzMGDB5k9ezbe3t5MmjTp6nigN2TJBXGztjV5+kLUWJI6/IagGvUQEWLqV+VCmj8WA+6lX2G6jrZB3cCNptuYOHEiderUITPT+jxA/oFaC3J3dyc6OpoWLVoQFRXFu+++e3X0h1WrVhEYGEh0dPTV17JlywDreH0tWrSgVatWREdHX/PAb05ODsHBwfz2t78t6aIrpVzQ5s2b+eabb6hWrRoPPvig/cnpyBr4qDvs+cG63OUZtrd+iy4f7GHF/rMA3N0+lMd6huPuhNt5hdEaVAlwd3fns88+47HHHit2P19fX3bs2AFYR0G/5557uHTpEn/4wx8A6NatG/Pnz7/mmI0bNzJ//ny2bduGt7c3SUlJZGVlXd2+ZMkSIiIimDVrFu+8806RYwcqpco2i8XC4sWL2bx5MxEREYwcOdK+AV/PH4Ylr8H++RAYSrZHJU4lpRIWXInIOoHc17E+TWpUdnwBboHDalAiEiEiO/K9LovIs466njM9++yzvPfee+Tk5Nh9TPXq1Zk6dSoffPABxT0snZCQQHBw8NVx+YKDg6ldu/bV7d988w3PPPMMoaGhxMbG3nohlFIuKzMzk2+//ZbNmzfTsWNHxowZY19y2vA+fNgB4ldC71fhyc08EhvE5C+2kJNrwdPdjVeHNKdeNdecdsNhNShjzAEgGkBE3IFTwI+3feLPB1+/rsWd0P4hyEqDr0dfvz36Hmg9HlKTYVaBoX4mLbjtkEJDQ+natStfffUVQ4cOtfu4hg0bYrFYOHvWWr1eu3Yt0dHRV7d///339O/fnz/+8Y80adKEvn37MnbsWHr06AFAeno6y5cv56OPPuLixYt88803V+ecUkqVD3m/2+fOnbNvwFdLLhgLuHtCQG2IvIsdEU/TvEkEXh5uPNStIVm5Fpe5jVec0mqD6gPEG2OOldL1SsyNptvI87vf/Y6//e1vV9uU7JW/9tStWzd27Nhx9RUeHo6/vz9bt25l6tSphISEMHbsWL744gsA5s+fT69evfDz82PUqFH8+OOP5Obm3lwBlVIu6/jx43z88cdcvnyZe++998bJ6eh6mNoTNn5gXY4cxc6YP3Hnl4f5bqt1Hr1O4UH0aBJSJpoDSqsN6m7gm8I2iMjDwMNgrYncUHE1Hi+/4rdXCrrpGpM9020ANGrUiOjoaGbNmmX3uQ8fPoy7uzvVq1dn3759Re7n7u5Oz5496dmzJy1btmTatGlMnDiRb775hvXr11/tlJGcnMzKlSvp27ev/QVUSrmknTt3Mm/ePAIDAxk3bhzBwcFF73zhKCx9HfbOhYC6XPCpy+6D5+jWOIRWdQN5b2wUAyPt7EzhQhxegxIRL2AY8F1h240xU40xMcaYmJCQ2x90sKTdaLqN/H7/+99f7d13I+fOnePRRx/lySefLPYvmQMHDlwzTfuOHTuoX78+ly9fZt26dRw/fpyjR49y9OhRPvzwQ775ptC/A5RSZYQxhmXLljFnzhzq1avHgw8+WHxy2voFfNAeDi6FXr+HJ7fw0p4wXpi1k6wcCyLCiNZ1S2VoopJWGjWogcA2Y0xiKVzLIb788kueeOIJXnjhBYBrptvIr0WLFrRp0+bqHE0FpaenEx0dTXZ2Nh4eHtx33308//zzV7cXbIN69dVXadCgAU899RQXL17Ew8ODRo0aMXXqVH744Qd69+59zaSGw4cP5+WXXyYzM/Oa9UqpsiEzM5Mff/yRAwcO0KZNGwYNGnTd9D0AWCyQkw5elaB6C3KbDee7Kg9wR0wbqnp58fvBzfFwE7w8yvaTRA6fbkNEvgUWG2M+v9G+Ot2Gc+hnrJTzXbhwgW+//ZZz585xxx130L59+8LvrhxdB4t+C3XawtB/AHDgzBUG/HMNbw6P5N6O9Us38BLglOk2RMQP6Ac84sjrKKVUWXb06FFmzZqFMYbx48cXeoeG84et7Uz75kFAXXZ5tWLT2sM82K0hETUrs+TZ7jR20eeZblWxCUpEOgH3At2AWkA6sBtYAEw3xlwq7nhjTBoQVDKhKqVU+RMXF8fChQupVq0ad999N0FBhfyXuWs2zHkM4+aJ9HoVOj/Jt/MPsWnPCSZ0CsPLw63cJScoJkGJyELgNDAXeBs4C/gATYBewFwRedcY85OjgzTGlIkukWWRK82orFRFkpuby+LFi9myZQuNGzdm5MiR+Pj45NshBzIuWXsf12vPhUYjeSJhAH9s1o9Gnr68MrApvp7ueLiX7Xam4hRXg7rPGJNUYF0KsM32+j8RKaZrScnw8fEhOTmZoKAgTVIlzBhDcnLytb8USimHS01N5bvvvuPYsWN07tyZPn364OaWL9HEr4DFvwf/GmTcPRufKqFYhv6L1C+2cCndOtRZZZ+bnPOpDHJ4J4mbUVgniezsbE6ePElGRoaToirffHx8qFu37s1PcKaUuiUJCQnMnDmT1NRUhg4dSqtWrf638dyv1vmZDi6GKvX5xHcSG7268Omk9s4LuBTccicJERkJ/AWoDojtZYwxASUeZSE8PT2veyhWKaXKol27dvHTTz/h5+fHpEmTrhlXkwML4dvxGE8/pN8focOjeG9JoFOOpcI2c9jTi++vwFBjTNFDHSillCqSxWJh+fLlbNiwgdDQUEaPHo2/vz/kZMLlU1CtIYR15UyLyYzc2Z6/Vu9NVw9v7usU5uzQncqeBJWoyUkppW5NWloaP/zwA/Hx8cTExDBgwADc3dxgzxxY9gbGzYuE8SupXa0yVYb/hb6e+6gf5Jqji5c2exJUnIjMBOYAmXkrjTE/OCoopZQqD86cOcPMmTO5cuUKQ4YMoW3btnAyztoB4kQsVG/Oe3IfS77cxoKnu+Hj6c4fh0fe+MQVhD0JKgBIA/rnW2cATVBKKVWEvPYmX19fJk6cSN26deHwKvhyODm+Icjgf+DedgKtDybTPNtCGZj9otTdMEEZYyaVRiBKKVUe5ObmsnTpUjZt2mRtbxraH/+0E0BdCOvGqQ6v0391fd6gA2Pc3OkVUd3ZIbsse3rx1QXeB7pgrTmtA54xxpx0cGxKKVWmpKSkMHv2bI4dO0aHmDb0r3oct0+7YBEPdoxaS5vwWtQe8Dy/qXKMAS1rOjtcl2fPLb7PgRlA3lS199rW9XNUUEopVdacOHGC7777jvS0NO5vV4Wwg6/BhSPQsCd/yBjHwm/3sO43NfDycGNCBe+dZy97ElRIgZHIvxCRZx0Uj1JKlSnGGLZs2cLixYsJDAzk0aHtCPpxDJcDGuMxZiZ+ze5gXOIVxloo89NflDZ7ElSSiNzL/2bEHQckOy4kpZQqG7Kyspg/fz6nf1lNv5qGqPtfxNfXl+MZ0+j5ozuvno9gsghNa5bKuAbljj0JajLwAfAe1jaoDbZ1SilVYSUnJzPvm09pkTSfEbKL3AuB/LTzCUZ2jCC0w518W/08MfWrOjvMMs2eXnzHsU7ZrpRSCti3M45zP73BPbmb8ZRcJOYB/nhpMEtWnGRwTCO8Pdxp36Cas8Ms84qbbuNlY8xfReR9rDWnaxhjnnZoZEop5WJyc3NZtmwZBzf+zGNsYF9AV4KGv0Ot8JY8nZLJC+5ueHsUMkW7uiXF1aDyhjeKK2YfpZQq/4whbdssDq/6mtiUtrTvMIBzzR5n7GdHeON8FcaEQ7C/t7OjLHeKTFDGmHm2n9NKLxyllHIxR9eTMf9l/JJ2U5XqXKn3OAMHDgBg/SsNqOLn5eQAy6/ibvHNo5Bbe3mMMdoupZQqvy6ewCx4Hjm4hCz82Vh5JBsaPsHxxGwysnPx8XTX5ORgxd3i+3upRaGUUq7Ckgtu7qRkQ+7hrXyZMxJpMpBHxo2gq5s7Hm5SIedmcobibvGtLs1AlFLKqdLOw9r/gxObOdD938z7aS5pPMC6wHb8rkO0zjrtBMXd4ttF8bf4WhW1TSmlyoysVIj9N6z/FyYrhY0+3Xnliw2Mqe3LhAkTeC0kRGtMTlLcLb4hpRaFUko5w9l98OVwSEkkO7wfP2fE8P3xSkTUrMrEyWPx9/NxdoQVWnG3+I6VZiBKKVUqLBa4dByqhkG1cC7V7Mij+1vjf8yPBm7JPD+qG1FRUVprcgFFjlwoIutsP6+IyOWCP0svRKWUKiHxK+DjXphP7+DQybNY3DzYXHMCVwggLMCNhx56iOjoaE1OLqK4GlRX28/KpReOUko5wKltsGwKHFkNgfWY5ns/U6dtY2KN0yScOsEjHdowYMAA7QjhYuwZLBYRaQN0xTZhoTFmu0OjUkqpknJqG3zciyzvqtD3bbw6PkTA+j20XrOBpLNXGDVqFJGRkc6OUhXihpOTiMjrwDQgCAjGOh/Uq/acXESqiMhsEdkvIvtEpNPthauUUna4fBr2zbe+r92aU93+TJtLf+NLywDmLVzCrlXzaF3Lh8cee1STkwuzpwY1DmhtjMkAEJE/A9uAt+w49p/AImPMXSLiBfjdcqRKKXUjaedh/T9g00fkunmzJL0pA9s0ok6fx5jie4DT2xazLTmJLl260KtXL9zddWBXV2ZPgjoK+AAZtmVvIP5GB4lIANAdmAhgjMkCsm4lSKWUKlZWGmz6D6z7J2RehlZjmXJ5OEsXHaN3ywbs3L6V/SuW4Ovry7333kt4eLizI1Z2KO5B3bxpNjKBPSKy1LbcD1hnx7kbAueAz0UkCtgKPGOMSb3tqJVSKr/zhzHL3+RQlS5UG/MmQeFtePxSOo9kZfD9dzM5ePAgjRs3ZtiwYfj7+zs7WmWn4mpQedNsbAV+zLd+1U2cuw3wlDFmk4j8E3gFeC3/TiLyMPAwQGhoqJ2nVkpVaBYL7J0DZ36BvlOgZiQJ965l8BcneftCCKOB1HOnmDNnDhkZGQwYMID27dtr9/EyRowpcjSj2zuxSE0g1hgTZlvuBrxijBlc1DExMTEmLk6nn1JKFSN+pbXLeMIOLgY04ZOIj3lxcDQASSmZVPFxZ/ny5cTGxhISEsKoUaOoUaOGU0NWxRORrcaYmILrbzTdxlSsnRyyC2xriLVt6agx5rPCjjfGnBGREyISYYw5APQB9t5GGZRSFdn5wzD/OTi8CgJD4c7/8u+TkWw/cYXsXAue7m5Y0i7xyfQfSExMpF27dvTr10+fbSrDirvF9xDwPPAPETmPtT3JB2gAHAI+MMbMvcH5nwK+tvXgOwxMuv2QlVIVim36CzwrkZMUz1f+D9N+1Eu0CK3OC5G5eLlbn5aJjY1l2bJl+Pj4MG7cOJo0aeLkwNXtKm4kiTPAy8DLIhIG1ALSgV+NMWn2nNwYswO4rtqmlFI3lJoEq/8KZ/eSe99PuFeuQeojccz8eDNh6dAC8PZw58qVK8yZM4fDhw/TpEkThg0bRqVKlZwdvSoBdo0kYYw5irW7uVJKOVZWGsR+aO0ynp3KzpCh/OOzdXz2YDcCK/mw8JluVzs77N27l/nz55Odnc3gwYNp27atdoQoR+xKUEopVSrO7IavR8OV05iIQUjfKew+7EP9xBSycw1eHtbZbDMyMli4cCG//PILtWvXZsSIEQQHBzs7elXCNEEppZwvNRkqBUFQOCnBLXku7TFGtxpD/5CajA+5dtcjR44wZ84crly5Qvfu3enevbuOCFFOaYJSSjlP4l5Y+hok/crFyRuoElAZn3u/pfL3v1Az8NrJAnNycq52Hw8KCuKBBx6gTp06TgpclYYbJigR6QJMAerb9hfAGGMaOjY0pVS5lXIOVr4N26aBd2UWB93H3z+KZcFzffDycOPdMdHX7H769GnmzJnDuXPntPt4BWJPDepT4DmsI0rkOjYcpVS5d+5X+Lg3JjsNS8yDuPf6Lb4ncxl95vp5UHNzc1mzZg1r167F39+f8ePH06hRIycErZzBngR1yRiz0OGRKKXKL2OsD9oGhUNwY660vI/xcY0ZHtiLB/yq0b0JdG9ybWPT2bNn+fHHHzlz5gytWrViwIAB+Pr6OqkAyhnsSVArReRvwA9YB44FwBizzWFRKaXKj4SdsPAVTOJuToxfR2hoffyHvEMvn4P0KJCUACwWCxs3bmTlypV4e3szZswYmjVr5oTAlbPZk6A62H7mf+DWAL1LPhylVLmRchaW/xG2Twe/aiys9Ti/+2wvq16uRRU/L57rd/1ID0lJScydO5eTJ0/StGlThgwZog/dVmA3TFDGmF6lEYhSqhxJOQvvt8Vkp5EZ8yg+fV4h/JI7vzl+gco+13dusFgsxMbGsnLlSjw8PBg5ciSRkZH60G0FZ08vvkDgDayTDwKsBv5ojLnkyMCUUmXQuV8hpAn4Vyet04uMWlGZTqYjr/tWIcIXImpWvu6Q5ORk5s6dy4kTJ4iIiGDIkCE6Z5MC7LvF9xmwGxhjW74P+BwY6aiglFJlTHI8LP495uBi9t+5kGZRHfHr+QyT/U/QpVHhIzxYLBY2bdrEihUr8PDwYMSIEbRs2VJrTeoqexJUuDFmVL7lP4jIDgfFo5QqS7JSYc3fYeMH4O7F+rAneWjmWRbVTaV+UCVGx9Qr9LBz584xd+5cTp06RZMmTRgyZAiVK19fu1IVmz0JKl1Euhpj1sHVB3fTHRuWUsrl5WTBf7vC+cOkNh1NpcFv0Uyq8pf4ZEKr+RV6iMViYf369axevRovLy9ta1LFsidBPQZMs7VFCXAe62SFSqmK6PJpCKgNHl5kd3iSR5ek4ZXTmf9UrkkQMCyqdqGHJSYmMnfuXBISEmjevDkDBw7UtiZVLHt68e0AokQkwLZ8/ePeSqnyz3Y7z2x4n0O9P6Jx11F4dniA8YGJNK0ZUORhOTk5rFmzhvXr1+Pr68vo0aNp3rx5KQauyqripny/1xgzXUSeL7AeAGPMuw6OTSnlKg4sgp9fgkvHOVFvGOPmZ/Jh7WQ6NAyid9MaRR52/Phx5s2bR1JSElFRUfTv3x8/v8Jv/ylVUHE1qLyn4wpruTQOiEUp5Yp+egq2fUlm1SZ4T1pIjTodeGn7KdrWr1rkIVlZWSxfvpzNmzcTGBioY+ipW1LclO8f2d4uM8asz7/N1lFCKVVe5WaDuIGbO6Z+F77c78b3ZjhzQzvhLcLYdqFFHnrw4EEWLFjApUuXaN++Pb1798bb27sUg1flhT2dJN4H2tixTilVHpzcCvOe5niDMdTp/zTuUXfT2L8v7/h4FtvbLiUlhcWLF7N7925CQkKYPHky9eoV3s1cKXsU1wbVCegMhBRohwoAdPpKpcqbzCuw4m3Y9F+y/GowZc1lBgafZHRMPTqHFz2dujGGHTt2sGTJErKzs+nZsyddu3bVWW7VbSuuBuUF+Nv2yd8OdRm4y5FBKaVK2eFVmDmPw+XTSLsH8ezzGgN2XWZIq8K7jOdJTk5m/vz5HD16lNDQUIYOHUpwcNHJTKmbUVwb1GpgtYh8YYw5VooxKaVKm7iRmOnFb93f4v2+j+Lv7cGYdoFF7p6Tk8O6detYt24dHh4eDBkyhDZt2ugDt6pE2dMGlWabD6oF4JO30hij020oVVYZAztmkJ58HNP9JfwadCf5vhWMvZhJJa/ib80dPXqU+fPnk5ycTGRkJHfccYc+cKscwp4E9TUwExgCPArcD5xzZFBKKQc6fxjmPQtHVrObFqzIGspvBkXSom41WtQt+rC0tDSWLl3Kjh07qFKlinYdVw5nT4IKMsZ8KiLP5Lvtt9rRgSmlSlhuDsT+G7PyHcTNAwa/y460HgyPqF7sYcYYtm/fzrJly8jMzKRr1650794dT8/r53VSqiTZk6CybT8TRGQwcBoo5u8spZRLuniM3OV/ZHVuFBGTP6JO/UY8dINDEhMTWbBgASdOnCA0NJTBgwdTvXrxCU2pkmJPgnrLNlDsC1iffwoAnnNoVEqpkpGTidk3n4yIO/ENCif5vhWs+cWNtiH1iz0sKyuLVatWERsbi4+PD8OHDycqKko7QahSZc9gsfNtby8BNzX9u4gcBa4AuUCOMSbmZgNUSt2iE5sxc59Ekg7wz9AsXpk8juoNWjGlQdGHGGPYt28fixcv5vLly7Ru3Zq+ffvq+HnKKYp7UPd9ihlzzxjztJ3X6GWMSbrZwJRStygzBcvyN3Hb/BESUIdFUe9Tp2YnjDHF1oCSk5NZuHAh8fHx1KhRg7vuuktHglBOVVwNKq7UolBKlQxjyPhkID7nfuFs03upPuLPDPAufqba7Oxs1q5dy4YNG/Dw8GDAgAG0a9cONze3UgpaqcIV96DutBI4vwGWiIgBPjLGTC2BcyqlCko7j/EOQNw9oPtLvLkuicGdR1C9mORkjGH//v0sXryYS5cu0apVK/r166fPNCmXIcYUP3OGiKykkFt99jyoKyK1jTGnRaQ6sBR4yhizpsA+DwMPA4SGhrY9dkwHrVDKbsbArtlkzHuJb33HMeHZd3Bzu3FHhqSkJBYtWkR8fDzVq1dn4MCBhIWFOT5epQohIlsL66NgTy++F/O99wFGATn2XNQYc9r286yI/Ai0B9YU2GcqMBUgJiZG55lSyl7nj2AWPI/EryCtSktOBrQhNSuHyj5FP5+UlZXF6tWriY2NxdPTU2/nKZdmTy++rQVWrbfnQV0RqQS4GWOu2N73B/54a2EqpfJL2zQN90Uv4ebugefAv1E1ZjKvuhf962yMYdeuXSxbtowrV64QHR1Nnz599Haecmk3TFAiUi3fohvQFqhpx7lrAD/aeg15ADOMMYtuJUillJWxWBA3N3yCw4jzjiGh0xSGd2hPcTf1EhISWLhwISdOnKBWrVqMGTOGunX1WXvl+uy5xbcVaxuUYL21dwR44EYHGWMOA1G3FZ1SyirtPKe+f4XNCTkMePZjfMN70O433YvtNp6amsry5cvZvn07lSpVYtiwYURHR+vDtqrMsOcWXzGP9SmlHMpiwez4Gln2BrXTL2LxuZOkKxnUC6pUZKLJzc1ly5YtrFq1iuzsbDp27EiPHj3w8fEpdH+lXJU9t/h8gMeBrlhrUuuA/xhjMhwcm1IVWnbiAU58MZmG6buhXgdk8LuMrNGiyMRkjOHgwYMsWbKE5ORkwsPDGTBggE4gqMose27xfYl1uKL3bcvjgK+A0Y4KSqmKLNdicHcTPN3dqJZ9huURb9Bn7LPg5lZkW9O5c+dYvHgx8fHxBAUFMW7cOBo3bqy381SZZk+CijDG5G9LWikiOx0VkFIVlsXCgaUfc2DLMjo+/RXVgxsT+Mpe+nh4F3lIWloaq1atIi4uDi8vL+644w7atWuHu3vxkw4qVRbYk6C2i0hHY0wsgIh0ANY7NiylKg5jDFkntuO95DdEnNyMu1dTUq9cggAfpIjklJuby+bNm1mzZg2ZmZm0bduWXr166aCuqlyxJ0F1ACaIyHHbciiwT0R2AcYY08ph0SlVzllSz7Py30/SK/VnqBQMw/9No6hxUMSDs3nDEy1dupQLFy7QqFEj+vXrp3M0qXLJngQ1wOFRKFXBpGTm4O/tgZtAx6xYDoSNp9nd74BPYJHHnD59miVLlnDs2DFCQkJ0ynVV7tnTzfyYiEQB3Wyr1hpjtA1KqVu0Z/VsTqz4hLoPziCyXjUqvbSLZl6Vitz/4sWLrFixgl27duHn58egQYNo27atDk+kyj17upk/AzwE/GBbNV1Ephpj3i/mMKVUPhaLIeXUHgJWT6HFoaVU965Ldu45oBoUkZwyMjJYu3YtmzZtQkTo2rUrXbt2xdu76E4TSpUn9tziewDoYIxJBRCRvwAb+V+3c6VUcTJTWPnB4/S8Mg/j7Y/0f4uQ9o+Ah1ehu+c9aLtmzRrS09OJioqiV69eBAYWfftPqfLIngQlWKdsz5NrW6eUKsbpi+nUCrT2xGvHHo6GjaHhXW+Bf0ih+xtj2LNnDytWrODChQs0aNCAfv36UatWrVKOXCnXYE+C+hzYZJsuQ4DhwKcOjUqpsswY4td8zfnl/2LfyBn0iW5EwDMbCCjmeaYjR46wdOlSEhISqFGjBuPHjyc8PFwftFUVmj2dJN4VkVVYhzoCmGSM2e7QqJQqgywWQ/L+dYRs+CPhJzcTUCkctyq2EcGKSE5nzpxh+fLlHDp0iICAAO68805atmypHSCUwr4aVB4BLOjtPaWul5XGL+/fTfSV1Rj/msiw9wmJHg9uhY/ocOHCBVauXMmuXbvw8fGhb9++dOjQAQ+Pm/mVVKp8s6cX3+tYx937Hmty+lxEvjPGvOXo4JRydQdPJ1EvpCo+nr7UC/Rkb+0naDrid4hP4RMBpqamsmbNGuLi4nBzc6NLly506dIFX1/fUo5cKdcnxhQ/y7qI7ANa541eLiK+wDZjTLOSDiYmJsbExcWV9GmVKnlZqSQtew82fcTKHt8xundHMAaKaDPKyMhg48aNxMbGkp2dTevWrenRowcBAQGlHLhSrkdEthpjYgqut+d+wlHAB8ibXsMbiC+50JQqO+ITL5K5eRrND3xIcEoiJ2r2pn9T23QWhSSn7OxstmzZwrp160hPT6d58+b06tVLp8BQyg72JKhMYI+ILMU6H1Q/YJ2I/AvAGPO0A+NTynXkZOLzSXfCs49h6rZHxnxJvdCOhe6am5vL9u3bWbNmDVeuXCE8PJzevXtTu3btUg5aqbLLngT1o+2VZ5VjQlHK9SSnZPL9z4sYNWgAQf7e+Lcdw6XqLQhsfWehNSaLxcKuXbtYvXo1Fy5coG7duowcOZKwsLBSj12psu6GbVClSduglEs5uZW0ha/hd2o9a3t9R7ce/Yvc1RjDvn37WLlyJUlJSdSsWZNevXrppIFK2eF22qCUqlBmzFtE28P/JuLCavz8gknt/TbdOvcodN+8adZXrlzJmTNnCA4OZvTo0TRr1kwTk1K3SROUUkBGdi4+nu6QlcaIHQ+CsWB6/g7p9DiVvCtft78xhvj4eFauXMnp06epWrWqPmSrVAnTBKUqvC2/7Cb2xw8Y+OhfaVQjAO9xX+FWOwr8ql23rzGGI0eOsGrVKk6cOEFgYCBDhw4lKipKp1lXqoQVmaBEZB7WXnuFMsYMc0hESpWCyxnZpF5IpNYv/yFmyye0MdmcuTAZarTHrVGv6/Y3xnD06FFWr17NsWPHCAgIYPDgwbRu3VoTk1IOUlwN6u+2nyOBmsB02/I4rM9GKVUmWTJT+eH/nmNszk9AJtLqbtx7/oY6VcOu27dgYqpcuTIDBgygbdu2OiyRUg5W5G+YMWY1gIi8aYzpnm/TPBFZ4/DIlCpBlzOyWfjLaca0C8XN3YMxnuvIqtsL30FTICTiuv0LS0wDBw6kTZs2mpiUKiX2/KaFiEhDY8xhABFpABQ+oY1Srig3m70//YMmu79lX82faR5aA7+nY8Hn+mGGjDEcPnyYNWvWcPz4cU1MSjmRPb9xzwGrROSwbTkMeMRhESlVAjKyc/lo1a/0zV1HiwMf0PHCUVJrxVApIMu6Q4HkZIzh0KFDrFmzhpMnTxIQEKCJSSkns2c+qEUi0hhoalu13xiTae8FRMQdiANOGWOG3FqYStnHGIOI4JGexJCNYwm3HIOaLeGe76jUuN91oz8YYzhw4ABr167l9OnTBAYGMmTIEKKiojQxKeVkxfXiG1nEpnARwRjzg53XeAbYB+iwzcqhvt96kp/Xb+WjJ4biUbk69Zu1g2ZvQPMRUODZJIvFwt69e1m7di1nz56latWqDBs2jFatWmmvPKVcRHF/Ig4tZpsBbpigRKQuMBh4G3j+5kJT6sYysnMRAe9zu+mx5fcMvrCFS0lbCapRF4/Rn163f25uLrt27WLdunUkJycTHBzMiBEjiIyM1AdslXIxxfXimyQibsBdxphZt3j+fwAvA9c/im8jIg8DDwOEhobe4mVURXT2SgaP/es7/lZtPg0TFxHsUwX6/h6fakHX7Zudnc327dvZsGEDly5dombNmjokkVIurtib7MYYi4g8Cdx0ghKRIcBZY8xWEelZzDWmAlPBOljszV5HVSy5FkP8uRSa1KhMiDnPrJxnIdkTur0AnZ8G3yrX7J+RkcGWLVuIjY0lLS2NevXqMWjQIB3EVakywJ5W4KUi8iIwE0jNW2mMOX+D47oAw0RkENYJDwNEZLox5t5bjlZVeH/+IZYLu5fw+iu/IyCgNu7D/gmN+kHlGtfsl5KSwqZNm9iyZQuZmZk0atSIrl27Ur9+fSdFrpS6WfZM+X6kkNXGGNPQ7otYa1Av3qgXn063oQqz4VASTYM9qbb7c3LXvotkpcAzv+BWpe51+54/f54NGzawY8cOcnNzad68OV27dqVWrVpOiFwpZY9bnm7DGNPAMSEpdWMnki7z0+d/pmWluZB1FvdG/aDP61AgOSUkJLB+/Xr27t2Lm5sbUVFRdO7cmaCg69ujlFJlww0TlIh4Ao8BecMdrQI+MsZk23sRY8wqdCZeZaf4cylsPXaBMTH1qOeVyts+XyIhraDf5xDW9ep+eaM+bNiwgcOHD+Pl5UWnTp3o2LEjlSsX2S9HKVVG2NMG9R/AE/i3bfk+27oHHRWUqthWL/oO3/hFpEROxz+gFu6ProXgJlcfss3NzWXv3r2sX7+exMRE/P396dOnDzExMfj4+Dg5eqVUSbEnQbUzxkTlW14hIjsdFZCqeC5nZPPhykPcW+889bb9lcmHV5FbuS7u2cngU/PqYK6ZmZls376d2NhYLl26RHBwMMOGDaNly5Y66oNS5ZA9v9W5IhJujIkHEJGGQK5jw1IVSc6lM7TZ9Cz1NsWCbzW440+4x0wGT2tt6PLly2zatImtW7eSmZlJaGgoAwcOpEmTJtpVXKlyzJ4E9RKw0jZYrAD1gUkOjUqVe/N/OU3soUTeGtmaalWr0bfqWWj5MnR+6upArmfOnGHjxo3s3r0bYwzNmzenU6dO1KlTx8nRK6VKQ3Fj8T0LrAdWA42BCKwJ6qYGi1UqT94jDZJ2nrqb3+bBhLWkDNiEv18l3J+KAzd3jDH8euAAsbGxHD16FE9PT9q1a0eHDh2oWrWqk0uglCpNxdWg6gL/xDqK+S/ABqwJ6wSgCUrdlIRL6fzm63W8WWMN9Q98TlR2KkSNQyQT8CUrJ5edO7exadMmkpOTCQgIoG/fvrRp0wZfX19nh6+UcoLixuJ7EUBEvIAYoDMwGfhYRC4aY5qXToiqLMvIzsXH052gjON8cG4yAWcvQ7OhSO/XICSCS5cusWX9MrZu3UpGRga1a9dm1KhRNGvWTEcVV6qCs6cNyhfrVBmBttdpYJcjg1Llw99+3s2RvXF88Pz9eIU0xrPtGGh9D6Z2G06ePMmm2bPZu3cvAM2aNaNDhw7Uq1dPOz4opYDi26CmAi2AK8AmrLf43jXGXCil2FQZlHApnRA/Dzz2/cjje97EPeMCWanD8alcldwBf2Hv3r1s+vkTTp8+jY+PD506daJdu3ZUqVLF2aErpVxMcTWoUMAbOAicAk4CF0shJlVGHTxzmX988B7vVPmJwJRDVKoRCcP+yhXjTuyqVcTFxZGamkpQUBCDBg0iKioKLy8vZ4etlHJRxbVBDRDrvZYWWNufXgAiReQ8sNEY80YpxahcWHJKJvHnUmnfoBqNLPF86PEu2Z7hmFGfcapKOzZviWPPrH9isVho3LgxHTp0oGHDhnobTyl1QzeaD8oAu0XkInDJ9hoCtAc0QSk+/epLPJN20/p37+FZuzU5d89id2o1tmzcTkLC53h7e9OuXTvat29PtWrVnB2uUqoMKa4N6mmsNacuQDbWLuYbgc/QThIV1oXULD5ff4SHG5zDf/2feTlxLdmV65J64Sxbtu9i+/adpKenExISwuDBg2nVqpXexlNK3ZLialBhwGzgOWNMQumEo1xd0rHdtF33DP4bfsFUqk5S2xdYfqk+Bz78CBGhadOmtG/fnvr16+ttPKXUbSmuDer50gxEuSZjDG8t2EcltyyeHxRN41pBNPA/w9E6k1lwrjZJ29KoVOkc3bp1o23btgQGBjo7ZKVUOaFDQKtCXUrLJtDPEzkey937X8W4eXA88mO2bt3G3sz7yDlkqF8/hJ792tG0aVN9qFYpVeI0QanrzN1+krk/fM2/Q1fhc2oDYV5V2OLVmaWffYa3jw+t28YQExND9erVnR2qUqoc0wSlAOssth5uQv2gSvRI+Znh7u+QmliVpe692ZzVgpDgUIb2jiEyMlI7PSilSoUmKEVGRjqffvgn6tSuR4c2MezanUYQ/dgnrWjaMopJ7dpRu3ZtZ4eplKpgNEFVULtOXmLNrngeD1iHx/oPeIdEdiU054cFidSoUYNag39D/5YtdQp1pZTTaIKqoC6s+CcT4v+NSDonqMtmj7vwiRzKg7baknYRV0o5myaoCuLs5Qzen/4d0U2bIBdP4XZkL0cklPiQAYR2HM6dkZF4e3s7O0yllLpKE1Q5dzktHfc9P+K19l+8eXkf088M4qRfFC1j7qN627a0qlnT2SEqpVShNEGVUznZWcz/4AU6XFxALUnmPIFsqjaK6C4PMbZVDJ6ens4OUSmliqUJqhwxxrBs1Uoy0jLYt2c3w1NXc96tGmeaPkT9Pg/SITjE2SEqpZTdNEGVA6kXz3Fm2X/w3vcdPXJO8QK/oUfLcDwiZ9C4SXPc3NycHaJSSt00TVBlVG5uLvE71xO/8H26Za0lXNK54FGd9XUe5K27JhFYTUd5UEqVbZqgyhBjDNv3HiR2y2ZSzyXglZrAo2YlO3za0WTgE1SNGkwv7R6ulConHJagRMQHWIN12ngPYLbOwnvzMnNyWb//NIGn1uO+Yzrhadu4YGnC2cgniGlzJ+61X6NDparODlMppUqcI2tQmUBvY0yKiHgC60RkoTEm1oHXLBcSL2fg5244fOhX1i+ZRdsry2jrth8LbiRW70yjtg/Ru8NwfZhWKVWuOSxB2aaLT7EtetpexlHXK+ssFgMYfly3i88WrqOBdyYhcoUeXvuJ8L7I5bYvE9D1IWr5a9uSUqpicGgblIi4A1uBRsCHxphNhezzMPAwQGhoqCPDcUmX07MY+591tPdPplvy93TM3Moo77OsDn2ahv0epm7NYMTdG7QnnlKqghFrRcfBFxGpAvwIPGWM2V3UfjExMSYuLs7h8Tjbiv2JHDtznjBzhv2/xNEkeSHdZSeekkNGlcZ4dXwQt6ix4KttS0qp8k9EthpjYgquL5VefMaYiyKyChgAFJmgyrOLaVm45WSwe/dupi3dQdWsUxz38qZhgzA6kIE0mAAxE/CpFQ3atqSUUg7txRcCZNuSky/QF/iLo67nqtLS0nhvXhyzdpzhDe/ZxLCLaZwm268yGU/8QuUq1cDcp0lJKaUKcGQNqhYwzdYO5QbMMsbMd+D1XMbp5Mv8dd52QnNPk3LqII1z97PFewleZJNTtRG0nYJnyzF4BlazHqDJSSmlruPIXny/AK0ddX5XczElne17DnD2yH6Sf91AdFYCp3xb0LlzV6JrdMbzeG2IHodH7TaakJRSyg46ksRtyM7O5tdff2XPnr1M257Ene7rGOW1kWqWZCxenkj/gUi7vtadW/Z1brBKKVXGaIK6SdnZ2Rw8eJAv1hxg28nLdPU4SuVKvnzn+0/8LCmYel2g1Vjcmg/TXnhKKXUbNEHZISsri2279zMrNp7a57cRkbOXiRzhGc8ULo5dQLMm4bgdbgvBTZAq9ZwdrlJKlQuaoIqQmZnJrn0H2Lf/ACcOH8Qr4wx3mm10dd+DGxZMtXCk5UTqhNezPkTbqI+zQ1ZKqXJFE1Q+6enp/Prrr+zdu5f4g/u5nJlKlndN+rWNoo1fCEHbViCtnoHIEUjNVtrZQSmlHKjCJ6iUlBT279/P/v37mbP/El1lJ8O9tzLWHMHNM5dTMa9SZ9BgsORCzwc1KSmlVCmpkAnqwoUL7N+/n7lxhzmQmEK05xlCqlZmusef8SET4x+KNH8CWtxJndptrAe5uTs3aKWUqmAqRIIyxpCYmMiabXtZuCuByPTtNOcQE+QkmR5uBD84l7q1ayI7qkONFogON6SUUk5XbhOUxWJh36Ej/LTpV9ySDpFx+TzVck7zlMTRxu2QdZ+gCKTFnUjtmtaE1PpeJ0etlFIqT7lKUClpGfywfg+ZySe4cPxX0lIv4JeTTGqNDgwb0pkmVzbgs3cPRL4KzYbhFhLh7JCVUkoVoVwlqE8+n8ack+485L2C0b67qSLHwBNyeg/GI7ItmDbQ8ylnh6mUUsoO5SpBDe3cjGfnDrUuVIuBFg9D8+F45D08q+1KSilVZpSrBBXeujvIfyGsK+iIDkopVaaVqwQFQPQ4Z0eglFKqBLg5OwCllFKqMJqglFJKuSRNUEoppVySJiillFIuSROUUkopl6QJSimllEvSBKWUUsolaYJSSinlksQY4+wYrhKRc8Cx2zxNMJBUAuG4Ei2T6ytv5QEtU1lRHspU3xgTUnClSyWokiAiccaYGGfHUZK0TK6vvJUHtExlRXksUx69xaeUUsolaYJSSinlkspjgprq7AAcQMvk+spbeUDLVFaUxzIB5bANSimlVPlQHmtQSimlygFNUEoppVySyycoEflMRM6KyO5866JEZKOI7BKReSISYFsfJiLpIrLD9vpvvmPa2vY/JCL/EnHe/O83Uybbtla2bXts231s68tkmURkfL7vaIeIWEQk2ratrJbJU0Sm2dbvE5Hf5jvGJcp0k+XxEpHPbet3ikjPfMe4RHlssdQTkZW2z3yPiDxjW19NRJaKyEHbz6r5jvmtLfYDInJHvvUuUa6bLZOIBNn2TxGRDwqcyyXKdMuMMS79AroDbYDd+dZtAXrY3k8G3rS9D8u/X4HzbAY6AQIsBAaWkTJ5AL8AUbblIMC9LJepwHEtgcPl4Hu6B/jW9t4POAqEuVKZbrI8TwCf295XB7YCbq5UHlsstYA2tveVgV+B5sBfgVds618B/mJ73xzYCXgDDYB4V/t9uoUyVQK6Ao8CHxQ4l0uU6VZfLl+DMsasAc4XWB0BrLG9XwqMKu4cIlILCDDGbDTWb+1L4M4SDtVuN1mm/sAvxpidtmOTjTG5ZbxM+Y0DvoEy/z0ZoJKIeAC+QBZw2ZXKdJPlaQ4stx13FrgIxLhSeWyxJRhjttneXwH2AXWA4cA0227T+F+Mw7H+IZFpjDkCHALau1K5brZMxphUY8w6ICP/eVypTLfK5RNUEXYDw2zvRwP18m1rICLbRWS1iHSzrasDnMy3z0nbOldSVJmaAEZEFovINhF52ba+LJcpv7HYEhRlu0yzgVQgATgO/N0Ycx7XL1NR5dkJDBcRDxFpALS1bXPZ8ohIGNAa2ATUMMYkgPU/fKy1QLDGeiLfYXnxu2S57CxTUVyyTDejrCaoycATIrIVaxU4y7Y+AQg1xrQGngdm2O6pF3bf1dX61xdVJg+s1ffxtp8jRKQPZbtMAIhIByDNGJPXJlKWy9QeyAVqY7119IKINMT1y1RUeT7D+h9aHPAPYAOQg4uWR0T8ge+BZ40xl4vbtZB1ppj1TnMTZSryFIWsc/p3dTM8nB3ArTDG7Md66wsRaQIMtq3PBDJt77eKSDzWGshJoG6+U9QFTpdmzDdSVJmwxr7aGJNk2/Yz1naE6ZTdMuW5m//VnqBsf0/3AIuMMdnAWRFZD8QAa3HhMhXzu5QDPJe3n4hsAA4CF3Cx8oiIJ9b/yL82xvxgW50oIrWMMQm2W11nbetPcm1NPi9+l/q3d5NlKopLlelWlMkalIhUt/10A14F/mtbDhERd9v7hkBjrA3wCcAVEelo68UyAZjrlOCLUFSZgMVAKxHxs7Vv9AD2lvEy5a0bDXybt66Ml+k40FusKgEdgf2uXqZifpf8bOVARPoBOcYYl/t3Z4vhU2CfMebdfJt+Au63vb+f/8X4E3C3iHjbbl02Bja7UrluoUyFcqUy3TJn99K40QvrX9gJQDbWvwgeAJ7B2rPlV+DP/G9EjFHAHqz3z7cBQ/OdJwbr/fZ44IO8Y1y9TLb977WVazfw13JSpp5AbCHnKZNlAvyB72zf017gJVcr002WJww4gLWBfhnW6RBcqjy2WLpivW31C7DD9hqEtbfrcqy1vuVAtXzH/N4W+wHy9WpzlXLdYpmOYu0Ak2L7bpu7Uplu9aVDHSmllHJJZfIWn1JKqfJPE5RSSimXpAlKKaWUS9IEpZRSyiVpglJKKeWSNEEp5UC256LWicjAfOvGiMgiZ8alVFmg3cyVcjARicT6jFRrwB3rcy0DjDHxt3Aud2NMbslGqJRr0gSlVCkQkb9iHUy2ku1nfaxTjXgAU4wxc20Dg35l2wfgSWPMBrHOxfQG1odso40xzUs3eqWcQxOUUqXANmzQNqyDsc4H9hhjpotIFaxz9rTGOnqAxRiTISKNgW+MMTG2BLUAiDTWKSKUqhDK5GCxSpU1xphUEZmJdSiaMcBQEXnRttkHCMU6kOcHYp1dOBfrQMd5NmtyUhWNJiilSo/F9hJglDHmQP6NIjIFSASisHZgyj8BXWopxaiUy9BefEqVvsXAU7YRphGR1rb1gUCCMcYC3Ie1Q4VSFZYmKKVK35uAJ/CLiOy2LQP8G7hfRGKx3t7TWpOq0LSThFJKKZekNSillFIuSROUUkopl6QJSimllEvSBKWUUsolaYJSSinlkjRBKaWUckmaoJRSSrmk/wdYz5UVN9TjwwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -464,13 +463,15 @@ } ], "source": [ - "results = run_simulation2(system)\n", - "plot_results(results, 'Proportional model')" + "results2 = run_simulation2(system)\n", + "results2.plot(label='model', color='gray')\n", + "plot_estimates()\n", + "decorate(title='Proportional Growth Model')" ] }, { "cell_type": "markdown", - "id": "optical-republican", + "id": "suited-costs", "metadata": {}, "source": [ "The proportional model fits\n", @@ -486,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "requested-package", + "id": "appropriate-checkout", "metadata": {}, "source": [ "## Factoring out the update function\n", @@ -500,7 +501,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "found-prediction", + "id": "handmade-permit", "metadata": {}, "outputs": [], "source": [ @@ -512,7 +513,7 @@ }, { "cell_type": "markdown", - "id": "excellent-trinity", + "id": "fabulous-bankruptcy", "metadata": {}, "source": [ "This function takes as arguments the current population, current year,\n", @@ -526,7 +527,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "extended-investing", + "id": "civilian-accused", "metadata": {}, "outputs": [], "source": [ @@ -543,7 +544,7 @@ }, { "cell_type": "markdown", - "id": "comprehensive-proposal", + "id": "failing-assist", "metadata": {}, "source": [ "This function demonstrates a feature we have not seen before: it takes a\n", @@ -557,7 +558,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "arbitrary-python", + "id": "wicked-seeking", "metadata": {}, "outputs": [], "source": [ @@ -566,7 +567,7 @@ }, { "cell_type": "markdown", - "id": "incident-cancellation", + "id": "simple-camel", "metadata": {}, "source": [ "Passing a function as an argument is the same as passing any other\n", @@ -579,7 +580,7 @@ }, { "cell_type": "markdown", - "id": "acknowledged-short", + "id": "spectacular-paradise", "metadata": {}, "source": [ "## Combining birth and death\n", @@ -591,7 +592,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "impressed-laundry", + "id": "impressive-model", "metadata": {}, "outputs": [], "source": [ @@ -600,7 +601,7 @@ }, { "cell_type": "markdown", - "id": "veterinary-heading", + "id": "modern-uncertainty", "metadata": {}, "source": [ "The name of this parameter, `alpha`, is the conventional name for a\n", @@ -612,7 +613,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "floating-singer", + "id": "familiar-helena", "metadata": {}, "outputs": [], "source": [ @@ -622,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "instant-motion", + "id": "understanding-typing", "metadata": {}, "source": [ "And here's how we run it:" @@ -631,7 +632,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "professional-business", + "id": "independent-effectiveness", "metadata": {}, "outputs": [], "source": [ @@ -640,7 +641,7 @@ }, { "cell_type": "markdown", - "id": "ordinary-exhibition", + "id": "everyday-delicious", "metadata": {}, "source": [ "The results are the same as the previous versions, but now the code is organized in a way that makes it easy to explore other models." @@ -648,7 +649,7 @@ }, { "cell_type": "markdown", - "id": "satellite-money", + "id": "attractive-steps", "metadata": {}, "source": [ "## Summary\n", @@ -663,7 +664,7 @@ }, { "cell_type": "markdown", - "id": "north-bicycle", + "id": "looking-douglas", "metadata": {}, "source": [ "## Exercises" @@ -671,7 +672,7 @@ }, { "cell_type": "markdown", - "id": "communist-cycle", + "id": "compliant-preserve", "metadata": {}, "source": [ "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", @@ -684,7 +685,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "silver-farming", + "id": "minus-recommendation", "metadata": { "scrolled": false }, @@ -710,12 +711,12 @@ { "cell_type": "code", "execution_count": 21, - "id": "capable-texas", + "id": "headed-amsterdam", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABImUlEQVR4nO3dd3hUVfrA8e+bRgqQAAkQSggdqaH3jnQFREFFVNQVde113XVddy2rq+vu/lZ3FbuiUkQssCDSCT0JIQlNqaGFkEAoIT3n98e9wQFThjKZSfJ+nmeezNz6npmbeeece+49YoxBKaWU8jRe7g5AKaWUKo4mKKWUUh5JE5RSSimPpAlKKaWUR9IEpZRSyiNpglJKKeWRNEFVQiIyRUSWlMN+PhaRl1y9nyshIpEiYkTEx92xVGYV4VioKESkv4jscnccnkATlJNEZL+IZInIWRE5JiIfiUh1D4jrV1/AxpjPjTHD3RmXu9if0zB3x+FumpgrDvtzalH02hizxhjT2p0xeQpNUJfmOmNMdaAL0B147uIFyvMLobJ8+YilUh+LFa2MleXY8iT6nl66CvMP40mMMYeBRUB7OP8L6Lci8jPwsz3tNyKyW0ROiMh3ItKgaH17+YdFZK+IpInI60VfXiLiJSLPicgBEUkVkU9FJNieV/Sr+G4RSQaWA6vtzWbYtbveInKniEQ77K+PiGwWkVP23z4O81aKyIsislZEzojIEhEJdZg/V0RS7HVXi0g7Z94jEfEWkb/b5dsnIg86/qK39/uyiKwFzgHNSopTRAaLSKLDtpeKyCaH19EiMl5EPgMigO/t9+Jph5CmiEiyHc8fnCmDve39IvKsiGwXkZN2zdnfnldLRBaIyHF73gIRaXTRe3txGaeJyA77vd4rItMdlh8kIodE5Gn7sz9ql2u0iPxkH0u/d1jeS0R+JyJ7RCRdROaISG179q+OC3udu+z9nxSRH0SkicP2fnUcF/N+9BORdSKSISIHReROh9m1RGShXbaNItLcYb1/2cufFpFYEenvMO8FO/ZP7XW3iUg3h/ldRGSLPW+uiMwWh+ZEERkrIvF2TOtEpKPDvGdE5LC97i4RGVpCuYLt/R8X63/vOfv9rWZvt73DsmFitabUdWL/++0YEoBMuShJiUjR57TV/pwmFx0HF23jKRFJEJFMEflAROqJyCK7XEtFpJbD8r0cPqOtIjKouDJXCMYYfTjxAPYDw+znjYFtwIv2awP8CNQGAoAhQBpWTasa8G9gtcO2DLDCXj4C+Am4x553F7AbaAZUB74GPrPnRdrrfgoE2fsqmubjsP07gWj7eW3gJDAV8AFusV/XseevBPYAreztrQReddjWXUANuxz/BOId5n0MvFTC+3UfsB1oBNQCljrGae8nGWhnx1WvpDgBfyALCLXnpQBH7LgC7Hl1Lv6cLnrP3rOX7QTkANdcwueeZH/mtYG1RWW2Y5sIBNqxzAW+cVj34jL6AmOA5oAAA7ESVxd7+UFAPvC8vexvgOPAF/b22wHZQDN7+UeBDfZ7XA14F/jyonI7HhfjsY6ta+x4ngPWXXRcnj+Oi3kvIoAz9mfja5c/yuFYOAH0sLf9OTDLYd3b7OV9gCfsz9DfnveCXa7RgDfwV2CDPc8POAA8Yu/zBiDX4TPoAqQCPe1177A/s2pAa+Ag0MDhPWlewuf8KfCt/T5HYv1P3m3P+xB42WHZ3wKLy9q/w/ETj3X8/Oo9dXjfWzi8HgQcuugY3ID1P9LQ3l8c0Nku53LgT/ayDYF0+730Aq61X4e5+zv0sr533R1ARXnYB8lZIMP+h/lP0QFnH2BDHJb9APibw+vqQB4Q6bD8SIf5DwDL7OfLgAcc5rW21/Xhly+dZg7zi6aVlKCmApsuKst64E77+UrguYtiWVzCexBi7yvYfv0xJSeo5cB0h9fD+HWC+ovD/LLiXIP15dQLWALMAUYCg4GEiz6n4hJUI4dpm4CbL+Fzv8/h9WhgTwnLRgEnHV5fUMYS1vkGeMR+Pggr2Xrbr2vYsfd0WD4WGG8/3wEMdZgXXsyx4nhcLML+0rVfe2ElyCbFHcfFxPosML+EeR8D71/0Pu0sZVsngU728xeApQ7z2gJZ9vMBwGFAHOZH80uC+i/2D0WH+buwkn8LrC/zYYBvKbF4Y/1oaeswbTqw0uHY3eswby1we1n7dzh+7irjGHAmQU1xeD0P+K/D64ewfxgBz2D/oHWY/wNwhzPHu6c9tInv0ow3xoQYY5oYYx4wxmQ5zDvo8LwBVhIDwBhzFutXTMMSlj9gr/Orde3nRTWM4tYty8XbK9qmYywpDs/PYSXUoma6V+0mpNNY/yhg1WSc2a9jnMXFXOJ7Vkycq7D+cQfYz1difQkNtF+XpdgyOqnYz0pEAkXkXbtJ6DRWs1qIiHiXsC4iMkpENtjNdRlYX+SO72e6MabAfl50fB1zmJ/lEHsTYL7dlJOBlbAKuPBYcdQE+JfD8iewanIlHZcXa4xV2y5Jie+xiDxhNy2esvcdzIXlvnhdf7s5rAFw2NjftMXE2AR4oqhM9rYbY9WadmPVMl8AUkVkljg0tTsI5ZeaWhHHY285ECAiPe0m0Shgfln7LyHey3XxMVDaMXHTRfH0w/rxUuFogrp6HP+BjmAdKACISBBW88Zhh2UaOzyPsNf51br2vHwuPCBNCc+Lc/H2irZ5uJhlL3YrMA7rF2Qw1q9ysL7UynIUq+mpSONilinxPSsmzosT1CqKT1BlvR+Xo6TP6gmsGm5PY0xNOza48P05H4+IVMP69fsGUM8YEwL8D+fez+IcBEbZP5qKHv7GOkda3PtwEKtW67h8gDFmXXHxlrB+81LmF8s+3/QMMAmoZZf7FM4fRw1FxHFZx8/jIFbzm2OZAo0xXwIYY74wxvTDOrYM8Fox+0jDqnle/H932N5GIVaN/Ras/4kFxpgzzuzf5opjsiQHsWpQjvEEGWNeLccYrhpNUK7xBTBNRKLsL6VXgI3GmP0Oyzwl1kn2xljt67Pt6V8Cj4lIU7G6sb8CzDbG5Jewr+NAIdY5q+L8D2glIreKiI+ITMZqQlngRDlqYDV9pGOdZ3nFiXWKzAEeEZGGIhKC9QVVmrLiXIeVDHpgNQVuw/pC6ckvHQLASuQlvRe/Yp+QLusL5Lci0kisDgi/55fPqgbWr9cMe96fytiOH9Y5g+NAvoiMAq7kcoB3gJftX/VFJ+/H2fOKOy7eAZ4Vu6OL3THgpkvY3+fAMBGZZH9GdUQkyon1amD9yDoO+IjI80BNJ/e5HqtW+KC9z3FYx0CR94D77NqNiEiQiIwRkRoi0lpEhtj/g9lYn1XBxTuwa6xzsN7LGvb7+Tgw02GxL4DJwBT7eZn7d7J8cInHbBlmAteJyAi7BcTfPsYblbmmB9IE5QLGmGXAH7F+LR/F+tV580WLfYt1PiEeWIh13gqsE7KfYX3p7sP6x3qolH2dA14G1tpV+l4XzU8HxmL92k8HngbGGmPSnCjKp1hNHYexOjxscGKdIu9hnStKALZgJaB8ivmCcCZOY0wm1onhbcaYXHu19cABY0yqw6b+CjxnvxdPOhFnY3s7pfnCLste+1HUg+yfWB0v0rDem8WlbcT+1f0w1pfhSaxf4985EWNJ/mWvv0REztgx9LT39avjwhgzH6sGMctukkwCRjm7M2NMMlaT5BNYzYPxWJ1OyvID1vmvn7COp2ycbPayP+sbgLuxzv/ehvWjJceeH4PVmeQtrPd0N9Y5WLB+DLyK9fmkAHWxfmAU5yEgE+vzjcb6zD90iGOjPb+BXZai6aXt31kvAJ/Yn9OkS1z3AsaYg1itHr/H+kFwEHiKCvpdLxc27aryYP9ib2m3kVcJdm3hHWPMxc14biUi7wNzjTE/lDB/P1YPy6XlGpgqkYhsxDqWPnJ3LMq19MIx5RIiEoDVw24J1kn7P/HLiWWPYYy5x90xqNKJyECsnnFpWE1sHSmjtqoqhwpZ7VMVggB/xmr22ILVw+x5t0akKqrWwFasjhVPADcaY466NyRVHrSJTymllEfSGpRSSimP5FHnoEJDQ01kZKS7w1BKKVWOYmNj04wxYRdP96gEFRkZSUxMjLvDUEopVY5E5OK7yADaxKeUUspDaYJSSinlkTRBKaWU8kgedQ6qOHl5eRw6dIjs7Gx3h1Ip+fv706hRI3x9fd0dilJKXcDjE9ShQ4eoUaMGkZGRXHhDY3WljDGkp6dz6NAhmjZt6u5wlFLqAh7fxJednU2dOnU0ObmAiFCnTh2tnSqlPJLHJyhAk5ML6XurlPJUFSJBKaWU8iwZGRkkJCS4dB+aoMpRZGQkaWmlD8PkzDJKKeVOycnJvPfeeyxevNilpwg8vpOEUkopzxEfH8+CBQsIDg7mlltuwd/f32X70hpUGfbv30+bNm245557aN++PVOmTGHp0qX07duXli1bsmnTJk6cOMH48ePp2LEjvXr1Ol/tTU9PZ/jw4XTu3Jnp06fjeOf4mTNn0qNHD6Kiopg+fToFBcUONKuUUh6hsLCQH3/8kW+//ZaIiAjuueceQkNDXbrPClWDWrx4MSkpKVd1m/Xr12fkyJGlLrN7927mzp3LjBkz6N69O1988QXR0dF89913vPLKKzRu3JjOnTvzzTffsHz5cm6//Xbi4+P585//TL9+/Xj++edZuHAhM2bMAGDHjh3Mnj2btWvX4uvrywMPPMDnn3/O7bffflXLppRSV0NOTg5ff/01P/30E926dWPkyJF4e3u7fL8VKkG5S9OmTenQoQMA7dq1Y+jQoYgIHTp0YP/+/Rw4cIB58+YBMGTIENLT0zl16hSrV6/m66+/BmDMmDHUqlULgGXLlhEbG0v37t0ByMrKom7dum4omVJKle7kyZPMmjWL48ePM3r06PPfW+WhQiWosmo6rlKtWrXzz728vM6/9vLyIj8/Hx+fX7+NRd23i+vGbYzhjjvu4K9//auLIlZKqSu3b98+5s6dizGG2267jWbNmpXr/vUc1FUwYMAAPv/8cwBWrlxJaGgoNWvWvGD6okWLOHnyJABDhw7lq6++IjU1FYATJ05w4ECxd5tXSqlyZ4xh8+bNfPbZZwQFBfGb3/ym3JMTVLAalKd64YUXmDZtGh07diQwMJBPPvkEgD/96U/ccsstdOnShYEDBxIREQFA27Zteemllxg+fDiFhYX4+vry9ttv06RJE3cWQymlKCgoYNGiRcTGxtKyZUsmTpx4QStSeRLHnmXu1q1bN3PxgIU7duzgmmuucVNEVYO+x0opgMzMTObOncuBAwfo27cvQ4YMwcvL9Q1tIhJrjOl28XStQSmllOLo0aPMmjWLc+fOMWHCBDp27OjukDRBKaVUVZeYmMh3331HYGAg06ZNo0GDBu4OCdAEpZRSVVZhYSHLli1j3bp1REREMGnSJIKCgtwd1nmaoJRSqgrKyspi3rx57Nmzp+yLbwvywLv8BzXVbuZKKVXFHDt2jPfee499+/YxduxYxowZU3Jyiv0E/tsHzp24YPLxMzkuj1MTlFJKVSFJSUl88MEH5OXlceedd9K1a9fSVzgaDzUbgkOP76TDp+j72nLW7nbtyAuaoMqwf/9+2rdvf8G0F154gTfeeAOADRs20LNnT6Kiorjmmmt44YUXit3Opk2bGDBgAK1btz5/89lz5865OnyllAKs801Llixh3rx51K9fn3vvvZfGjRsXv/CJfXBsu/V85Gtw2zwKA2qTnG59Z7UNr8l9A5rRPKy6S2PWc1BX6I477mDOnDl06tSJgoICdu3a9atljh07xk033cSsWbPo3bs3xhjmzZvHmTNnCAwMdEPUSqmq5Ny5c3z11Vfs27eP7t27M2LEiJKb9HYtgq+nQ51m8JsV4OMHwNNzt7J2dxrLnxhEgJ83jw9v7fK4tQZ1hVJTUwkPDwfA29ubtm3b/mqZt99+mzvuuIPevXsD1v35brzxRurVq0dmZiZ33XUX3bt3p3Pnznz77bcAfPzxx9xwww2MHDmSli1b8vTTTwPWVd533nkn7du3p0OHDvzjH/8AYNCgQRRd5JyWlkZkZCQA27ZtOz+sR8eOHfn5559d+n4opTzLkSNHmDFjBsnJyYwbN47Ro0cXn5xOH4Wv7oYvb4bakXDTxxw8mUV2njUU0C09IvjdqDb4+5Zf2qhwCWryu+uZG3MQgLyCQia/u575Ww4BkJVbwOR31/P91iMAnM7OY/K761mcdBSAE5m5TH53PUu3HwMg9cyVjwT52GOP0bp1ayZMmMC7775b7OiSSUlJJbbzvvzyywwZMoTNmzezYsUKnnrqKTIzMwFrYLDZs2eTmJjI7NmzOXjwIPHx8Rw+fJikpCQSExOZNm1aqfG98847PPLII8THxxMTE0OjRo2uuMxKqYohLi6ODz/8EIC77rqLqKio4hdMSYK3usGO72HA03DXEg5LPYa+uYr31+wFoGuTWoyLaljsDbBdpcIlqPJW0odRNP35558nJiaG4cOH88UXX1zyHdeXLFnCq6++SlRUFIMGDSI7O5vk5GTAuqlscHAw/v7+tG3blgMHDtCsWTP27t3LQw89xOLFi6lZs2ap2+/duzevvPIKr732GgcOHCAgIOCS4lNKVTz5+fl8//33fP/99zRp0oR77723+Itvzx63/ta9BrrcQcH9G9je5iHw9adhSAB/GH0NN3Yt4TxVOahwCWr29N7c1M16w3y9vZg9vTcTOlu1ggA/b2ZP7811nawPoqa/L7On92Zke6sJrnaQH7On92ZY23oA1K1R9lDFderUOX8X8iInTpy4YCTJ5s2bc//997Ns2TK2bt1Kenr6Bcu3a9eO2NjYYrdfdD4qPj6e+Ph4kpOTz98Xz/EGjd7e3uTn51OrVi22bt3KoEGDePvtt7nnnnsA8PHxobCwEOCCWtytt97Kd999R0BAACNGjGD58uVlllkpVXGdOnWKjz76iLi4OPr168eUKVN+fa779BH46i54u4fVfdzLG0a+wmubcrjxnXXnu5Df0SeS+sGuG9K9LBUuQZW36tWrEx4ezrJlywArOS1evJh+/foBsHDhwvNDuf/88894e3sTEhJywTYefPBBPvnkEzZu3Hh+2syZM0lJSWHEiBH8+9//Pr+NLVu2lBpPWloahYWFTJw4kRdffJG4uDgAIiMjzyfBr7766vzye/fupVmzZjz88MNcf/3154ejV0pVPnv27GHGjBmkp6czefJkhg4deuHNXgvyYO3/wVvdYedC6Dmdg2fM+YQ0pWcEr07sSGh1PzeV4ELai88Jn376Kb/97W954oknAGsYjebNmwPw2Wef8dhjjxEYGIiPjw+ff/75r05A1qtXj1mzZvHkk0+SmpqKl5cXAwYM4IYbbuCPf/wjjz76KB07dsQYQ2RkJAsWLCgxlsOHDzNt2rTztaWiQQ+ffPJJJk2axGeffcaQIUPOLz979mxmzpyJr68v9evX5/nnn7+q741Syv2MMaxevZqVK1dSt25dJk2aRJ06dS5cKPsUvH8tpO2CViNh5KucDmzEqL8u5/qoBrwyoQNN6gTRpI7n3OpIh9tQ+h4rVYFlZWXx9ddfs3v3bjp27MiYMWPw83OoAeVlga997nnRMxREDiTWvxc9mtYGYEHCEbpH1qZeTfc15ZU03IbLmvhEpLWIxDs8TovIo67an1JKVTVHjhzh3XffZd++fYwZM4bx48f/kpwK8mDdv+HNtpC225o26jXeT23N5Bnr2Z16BoCxHRu4NTmVxmVNfMaYXUAUgIh4A4eB+a7an1JKVRXGGGJjY1m8eDHVq1dn2rRpNGzY8JcF9q2B/z0Jx3dCyxEcOVtAtjlLs7Dq3Nwjgoa1Alx+F4irobzOQQ0F9hhjDpTT/pRSqlLKzc1lwYIFJCYm0qJFCyZMmPBLLz1j4JsHYOsXEBIBt8wir8UIbnhtBdeEn+KjaT0IDvBlbEfPGO+pLOWVoG4GvixuhojcC9wLEBERUU7hKKVUxXP8+HHmzJlDeno6gwcPpn///tY1mYUFVldxEahRn8L+T7EibCpDWkXgK8LfJ3WqEDWmi7m8m7mI+AHXA3OLm2+MmWGM6WaM6RYWFubqcJRSqkLaunUr7733HllZWUydOpUBAwZYyWnfGvhvX9i32lpw2J/4ptad3P1FEuv3WNdk9m0R6tbrmS5XedSgRgFxxphj5bAvpZSqVPLy8li0aBFbtmyhSZMmTJw4kRo1algX2y55DpLmQUgTUk5lcST5JF0ianFdpwbU8Peld/M6Ze/Ag5XHhbq3UELzXkVQ1nAbd955Jw0bNiQnx7rQzfFGrRfz9vYmKiqKdu3a0alTJ958883z1zOtXLmS4OBgoqKizj+WLl0KWPfra9euHR07diQqKuqCC37z8/MJDQ3l2WefvdpFV0q5WVpaGu+//z5btmyhX79+3H777VZy2vSedbHtjgUw6FnMAxuYtiqQ579NwhiDr7cX17atV673zXMFl9agRCQQuBaY7sr9uJu3tzcffvgh999/f6nLBQQEEB8fD1h3Qb/11ls5deoUf/7znwHo37//ry7SXb9+PQsWLCAuLo5q1aqRlpZGbm7u+flLliyhdevWzJkzh1deeaXCH5BKKUtCQgILFizA19eXKVOm0KJFi18GDTSFFDbpx+JGjzCsby/8fLx4/caO1K1RrVJ9B7i0BmWMOWeMqWOMOeXK/bjbo48+yj/+8Q/y8/OdXqdu3brMmDGDt956i9Iulj569CihoaHn78sXGhp6wU0fv/zySx555BEiIiLYsGHD5RdCKeUR8vLy+O6775g/fz7h4eFMnz6dFqHVYM7tEP+5tVCPe1nf820eWHSSxdtSAGjfMJi6Hno90+WqeLc6+mjMr6e1Gw89fgO55+Dzm349P+pW6DwFMtOtD9nRtIVXHFJERAT9+vXjs88+47rrrnN6vWbNmlFYWEhqaioAa9asueB2+PPmzWP48OH85S9/oVWrVgwbNozJkyczcOBAwLqCfNmyZbz77rtkZGTw5Zdfnh9zSilV8Rw/fpyvvvqK1NRU+vXrx+D+vfHa8Das/jsG2Obbnl2Fh5jYtRF9mtdhzvTedI+s5e6wXUZvFluGsobbKPL73/+e119//fw5JWc51p769+9//q7m8fHxNG/enOrVqxMbG8uMGTMICwtj8uTJfPzxxwAsWLCAwYMHExgYyMSJE5k/fz4FBQWXVkCllNsZY9iyZQvvvfceZ8+eZcqUKQxt6oPXf/vA8peg5bXIg5t4/eQg5sQcxBiDiNCjae1K1aR3sYpXgyqtxuMXWPr8oDqXXGMqabiNpk2bXjCtRYsWREVFMWfOHKe3vXfvXry9valbty47duwocTlvb28GDRrEoEGD6NChA5988gl33nknX375JWvXrj3fKSM9PZ0VK1YwbNgw5wuolHKrnJwcFi5cSGJiIk2bNmXChAlWR4if9pBnvHi30RtMGXsHtYL8+Mfk+gQH+FbqpORIa1BlKGu4DUd/+MMfzvfuK8vx48e57777ePDBB0s92Hbt2nXBMO3x8fE0adKE06dPEx0dTXJyMvv372f//v28/fbbfPllhe0wqVSVc/ToUWbMmEFSUhJD+vdiasMD1Ih7x5rZagR7Jy3jvcNN2HbkNGCNaeftVTWSE1TEGpQblDbchqN27drRpUuX82M0XSwrK4uoqCjy8vLw8fFh6tSpPP744+fnX3wO6rnnnqNp06Y89NBDZGRk4OPjQ4sWLZgxYwZff/01Q4YMuWBQw3HjxvH000+Tk5NzwXSllGcxxrBp0yZ+/PFHAgMCuH9AfcLiHofTh9jbeCLf5/7EI9e2onWDWqx/dgiBflXzq1qH21D6HitVjjIzM/n222/5+eef6RpZk1H5S/A+uA7qd4DRb/CH2CB+Tj3LF/f0xMe7ajRylTTcRtVMy0op5QZ79+5l/vz5ZGVlMWrUKLpHBGA+fYu59R+ny4RHaV4vmD+GF1DNx6vKnGcqTakJSkR6A7cB/YFwIAtIAhYCMyv79U1KKXU1FBQUsHLlStauWc2A6vvo3qYmQT16AJB+bxyvvbWZ546cpXm9YPx9vcvYWtVRYoISkUXAEeBb4GUgFfAHWgGDgW9F5E1jzHeuDrKoS6W6+jypiVepyujEiRN8/fXXeB3axCMBGwg+e4ATx3rwt69j+fMNXQkNCSb6mcGamIpRWg1qqjEm7aJpZ4E4+/F3EQl1WWQ2f39/0tPTqVOnjiapq8wYQ3p6Ov7+levqc6U8gTGGhIQEVi2cw7CC5bRlO/g2gjEfMietExvjj3A6O4+a/r6anEpQYoIqJjld1jJXqlGjRhw6dIjjx4+7eldVkr+/P40aNXJ3GEpVKtnZ2SxcuJCkpCTaNKxH6/RjLKtxB4FDnqR3mwjuLijkNwOaV6ku45ejzE4SInID8BpQFxD7YYwxNV0cGwC+vr6/uihWKaU8VfKBAyTMfonW57YSNvh1+vXvT272Xbz8nximpBXQG/CtIr3zrpQzvfj+BlxnjCn5VgdKKVXFFRQUELvwI+rG/YOxHCKjegs+3ptL3/6Cf2B1Fj86AD8fTUyXwpkEdUyTk1JKlezEkX2kzpxO93MbyfWpQd7QvxEdOJqE5Xs5djqbBiEBmpwugzMJKkZEZgPfADlFE40xX7sqKKWUqgiMMcTFxbFs8QLuzv+ZpdXHc7bP00zo3Y4xxjCyfcMqc7GtKziToGoC54DhDtMMoAlKKVU1GUN2/DwyfnydxeeuJaJ5a3xGb+TDeXvpk+UHWCMe+HhrJ4grUWaCMsZMK49AlFKqQjiawLn5jxKYGkshYfxUrTkP33QzNfx9mXlPmPbMu4rKrHuKSCMRmS8iqSJyTETmiYj2S1ZKVS255yiY/wDm3QGQuo3VNcfz07j/cTywBcfPWGc/NDldXc408X0EfAEUDVV7mz3tWlcFpZRSHsMYEOFgShqybS3rCgaxMXwqr907Dh8fHwZGtdSbCLiIMwkqzBjzkcPrj0XkURfFo5RSnsEYSJqHWfN3Vkc+waqY7QTXuIOfGveidaMwfHysr09NTq7jTIJKE5HbgKKR8G4B0l0XklJKudnBzfDDs3BoM0e9GvLmoaOMj+rEreNG6lhr5ciZBHUX8BbwD6zee+vsaUopVbkU5MM390HiXHL8arHEaySxfj2R4Hb0H9Rdk1M5c6YXXzJwfTnEopRS7pGfCz5+4O1DdgF8LWOZmTmIOzsF89SYMQQFBbk7wiqptOE2njbG/E1E/o1Vc7qAMeZhl0amlFKuVpAPWz6Fla+ROWkO21JyWLq7GVtNXXp1vIYbb+yNl5deaOsupdWgim5vFFPKMkopVTH9vBSWPAfHd3AytCtT311HE59MereM4MHrr6dmzXK5H7YqRWnDbXxv//2k/MJRSikXMwZmTYFdCykIiWR/txf4fGsOuV7VGTm4C2MH9tCeeR6itCa+7ymmaa+IMUbPSymlKo5zJyCgFohA4+58mdqIGSd7MjAmiaZNI3l43HWEhIS4O0rloLQmvjfKLQqllHKV3HOw/i2I/icnxrxLSMcxxAcOZFnGBhpznJGjRtKzh9aaPFFpTXyryjMQpZS6qgoLIWEWLHsRzhzhVOQoJs09TpfouQSl76R/ZCTXX389tWrVcnekqgSlNfElUnoTX8eyNi4iIcD7QHt7W3cZY9ZfephKKXWJvpwMPy8hp24UfhPf56c0f2rs24pPRjKjR4+mW7duWmvycKU18Y29Ctv/F7DYGHOjiPgBgVdhm0opVby03VCrCXj7Qqdb+PhMd95N78Q9K/dw6MA+xjeL5Prr79FaUwVRWhPfgSvZsIjUBAYAd9rbywVyr2SbSilVrMw0WPlXiPmIlL5/JmTgA1RrNwGv5LV0OBbPsSNnGDNmDF27dtVaUwVSWhNftDGmn4icwWqeE8e/xpiyLhJoBhwHPhKRTkAs8IgxJvPqhK6UqvLysmHjf2HNm5Cbyal2tzF2WShT8rYTkhJDcnIyA1u0YOzYqQQHB7s7WnWJSqtB9bP/1riCbXcBHjLGbBSRfwG/A/7ouJCI3AvcCxAREXGZu1JKVUlz74CfFpPReCgh1/+V6rVbMD53FSdiFpDr58W4cePo1KmT1poqKGduFouIdAH6YdWgoo0xW5xY7RBwyBiz0X79FVaCuoAxZgYwA6Bbt24ldspQSikAkjdCWCvrmqZ+j/Ne3kj+uSec+ZmBrPj6fQpSUmjfpg2jR4+mRo3L/X2tPIEzI+o+D3wC1AFCscaDeq6s9YwxKcBBEWltTxoKbL+CWJVSVdnJ/TD3TvhwOEcW/53UM9kQ0ZPBI2/ggQ5ezPr0I86cOcNNN93E5MmTNTlVAs7UoG4BOhtjsgFE5FUgDnjJiXUfAj63e/DtBaZdbqBKqSoq+zSs+Tts+A94+XC291OMXN2WSb57mdohiMXff096ejpRUVEMHz6cgIAAd0esrhJnEtR+wB/Itl9XA/Y4s3FjTDzQ7XICU0opAP73JCTM5nCT8TSc+Feq12zAGw0OcXrPFj7+OI6QkBCmTp1Ks2bN3B2puspK68VXNMxGDrBNRH60X18LRJdPeEqpKmnvKgiJgNpNYeAzfGZG8kKsP6sLQji1fTuJSxaRmZlJnz59GDhwIH5+fu6OWLlAaTWoomE2YoH5DtNXuiwapVTVdmKfNQTGzgWktrqV08P+Rou6zbl+VATN2qWy5ofv2LVrF+Hh4dx6662Eh4e7O2LlQqV1M9dhNpRS5SPnLES/CeveAi8fcgf+gbGr29JLdvPPyZ3YmRjH6uXLMcZw7bXX0qtXLx1IsAooa7iNGVi3Ksq7aF4zrDtE7DfGfOjSCJVSld+av0P0mxxsdB2NbnoNv+CGvNP8JCFk8sEHH3DkyBFatGjB6NGj9TZFVUhpTXy/AR4H/ikiJ7DuCuEPNAV2A28ZY751fYhKqUrpSLz1t0EU9HmIJfmduXelN/NPBdIuIJe0nZtZsGEDgYGBTJw4kXbt2ukFt1WMGFP2tbEiEgmEA1nAT8aYc64Iplu3biYmRkeYV6pSO3cClv0FYj/mXOMB7Lr2EzpH1CKvoJC4AycJyUtj0aJFnDp1ii5dujBs2DDtOl7JiUisMeZXPb6dupOEMWY/VndzpZS6PIUFEPsxLH8Rsk9jet7HbTsGUPD9dr55oA/nzp5h/+al7Ny5k7CwMKZNm6a3P6vinEpQSil1xeK/gIWPkx7Wk5q3v4lveHv+0vEUYdV9Wb9+PStXrsQYw9ChQ+nduzfe3t7ujli5mSYopZTrZKbBib3QuAd0upkdp30Ztbg6bx4N4YZwCC48zfwvF3Ls2DFatmzJ6NGjCQkJcXfUykNoglJKXX2FBRD7ESx7kQK/6my+fjm9WtSjzcDJfFT/ON0bB/Hdd9+xZcsWatasyaRJk2jTpo12glAXKDNBiUhf4AWgib180XhQel8RpdSvHY6DBY/B0XiI7M9f8u9k4awEop8ZQjUfL4LPHeI/by8lJydH7wShSuVMDeoD4DGsO0oUuDYcpVSFdjQB3htCbkAo+de9Q2CXm7k9LZNbCwwZ6cdZuHAhhw4dokmTJowePZq6deu6O2LlwZxJUKeMMYtcHolSqmIyBtJ+tsZoqt+Bk4NeYdAPYdye3pEnRGhQ3ZsVK1YQExNDYGAg48ePp2PHjtqcp8rkTIJaISKvA19j3TgWAGNMnMuiUkpVDOl7YOHjmOSNJI7/kY7tO1Br0AP8ve4x+jSvw5YtW1i6dClZWVl0796dwYMH4+/v7+6oVQXhTILqaf91vIjKAEOufjhKqQohPxfW/R+s+hv4VGNZ44d44IsDLHuyOY1rB9KuViFfzvyEQ4cO0bhxY0aPHk39+vXdHbWqYMpMUMaYweURiFKqgsjLhveGQOo2slteh/91rxPlVZv/23+C2tUMCxYsIDY2lsDAQMaNG0enTp20OU9dFmd68QUDfwIG2JNWAX8xxpxyZWBKKQ+Tnws+fuDrT8E11/O7k+PIKBjKezXDqV1YSGj2Yd5++zOys7Pp0aOHNuepK+ZME9+HQBIwyX49FfgIuMFVQSmlPMzOhfC/p0gf9S51rumP9+DfMajOUVrUrU5ycjKLFi0iJSWFyMhIRo4cSb169dwdsaoEnElQzY0xEx1e/1lE4l0Uj1LKk5xNhf89Bdu/ITOkDdNmJvLUnW3o3zKM/pFBLF36I4mJidSsWZMbb7yRtm3banOeumqcSVBZItLPGBMN5y/czXJtWEopt0uYg/nfU5CXhQz5I949HqTX8n20qhvE6tWriY6OprCwkP79+9OvXz+92FZddc4kqPuBT+xzUQKcwBqsUClVmZ0+wn6vCF4OvJ93+t5MNS9hQlOY9fF7ZGRk0KZNG4YPH64DCCqXcaYXXzzQSURq2q9PuzoopZQbGANxn5DnH4r3NWPw6vMQP4dMotfJbI6lprLsxyXs27ePsLAwpk6dSrNmercz5VqlDfl+mzFmpog8ftF0AIwxb7o4NqVUeclIhu8ehr0riPbpz7HMjtzcI4K+TYPJ3R/HB+/FUa1aNUaOHEn37t3x8vJyd8SqCiitBhVk/61RzLyyh+FVSnk+YyD2I8ySP1p3gR7zJgv2dmZsTT/Wr1/PqlWryM3NpXv37gwaNEhHtlXlqsQEZYx513661Biz1nGe3VFCKVXR7V0BCx4jwTeKZnd/SPV6zbi35k/8+ONXpKen07x5c0aMGEFYWJi7I1VVkDOdJP4NdHFimlKqIjAGju+Cum2g2WD2jfiIZzbU4S8nvdm55DP27dtHaGgot9xyCy1bttRu48ptSjsH1RvoA4RddB6qJqBjMStVEZ06DN8/TP7eaGZ1/4rbRvUnrMNw7ktdzqI5nxAQEMCoUaPo2rWrDrmu3K60GpQfUN1exvE81GngRlcGpZS6yoyBrbNg0TNQmMd3daezKNmLRqtWsX7dOvLz8+nVqxcDBgzQ80zKY5R2DmoVsEpEPjbGHCjHmJRSV1NhAYWzb8dr1wJyGvTAb+I7NNx3ii6rVrJq5RmuueYahg0bRu3atd0dqVIXcOYc1Dl7PKh2wPk7PxpjdLgNpSoCL28yqzfhv4W3URA6ldpfLSUlJYWGDRty0003EhER4e4IlSqWMwnqc2A2MBa4D7gDOO7MxkVkP3AGa6j4fGNMt9LXUEpdFedOkL/wKdbVnsCAoWPJ6vkoQenLSEv8gazgYCZOnEi7du20A4TyaM4kqDrGmA9E5BGHZr9Vl7CPwcaYtMuMTyl1qXYthu8fQTLT+CG3JjuPF5LyUzx+fn4MGzaMnj174uPjzL++Uu7lzFGaZ/89KiJjgCNAI9eFpJS6LFkZZC94Bv9tsygMu4aNLZ7kTMJZUncn0LNnT/r3709gYKC7o1TKac4kqJfsG8U+gXX9U03gMSe3b4AlImKAd40xMy5eQETuBe4FtC1cqStgts7Cd9scZnrfwLGzrTi79QgD27dnyJAhekNXVSGJMa67a5GINDDGHBGRusCPwEPGmNUlLd+tWzcTExPjsniUqnSyT3FsXxKhrXqzfVsCP/7vGw5mBRDVrD7Dhg2jYcOG7o5QqTKJSGxxfRRKu1D335Ryzz1jzMNl7dQYc8T+myoi84EeQIkJSil1CX5aQt63DyNns3is+gvUOZdMvXr1+e2Nw2jevLl2gFAVXmlNfFdUlRGRIMDLGHPGfj4c+MuVbFMpBZw7Qe7CZ/DbNoezvuG8UTCVet6ZXDdhAh06dNDEpCqN0i7U/eQKt10PmG//s/gAXxhjFl/hNpWq2s6kcPZfvfHPy2CF9GKL7yAmDhtC165dtWeeqnTKPKJFZAXFNPWVdaGuMWYv0OnyQ1NKFcnPyeLk2WzWR28kIK8Ni+nNyAED+G3f3lSrVs3d4SnlEs785HrS4bk/MBHId004SqkLFBZyZu0Mcpf9lecL7qdhtXy69X6Ev/TvT1BQUNnrK1WBOTPke+xFk9Ze4oW6SqnLcDY5kbx506l1ahsJhc25pnEod0y+ieDgYHeHplS5cKaJz/EOkl5AV6C+yyJSqorLzc0l9sPH6XJ0Fl54EdPwTiInPMfDOmigqmKcaeKLxToHJVhNe/uAu10ZlFJVUX5+Phs2xbBhXTQ9z2xng1dnQq7/K9066y0sVdXkTBNf0/IIRKmqqqCggMSNK0n54XUWFfSgS8vmNLnxAyIi9V9PVW3ONPH5Aw8A/bBqUtHAf40x2S6OTalKrbCwkNi4LZxa8X/0yVxMe8nFq0k3rr39dr2WSSmca+L7FGvIjH/br28BPgNuclVQSlVmhYWFJCUlsXrxPPqeXcAwr91khXXC+8Z3GF6vrbvDU8pjOJOgWhtjHK9nWiEiW10VkFKVlTGGbdu2sWLlKk6kpzEoaA/NvI9zeMDfaTjwLvDycneISnkUZxLUFhHpZYzZACAiPYG1rg1LqcrDGMP27dtZtXIlOSmJpHnV4pZJt9GuTSsk9yzBAXqncaWK40yC6gncLiLJ9usIYIeIJALGGNPRZdEpVYEVJaYVK1fhc3wb433W0MD7ADtr9iWy1UuItzdoclKqRM4kqJEuj0KpSqQoMa1evZrUY0doV5jIDV6rEL/aMPrftIm6TZvzlHKCM93MD4hIJ6C/PWmNMUbPQSl1kcLCwl8SU+pxwsJCmdornCYb3uJQy9uIuOFFCAhxd5hKVRjOdDN/BPgN8LU9aaaIzDDG/LuU1ZSqMop65a1Zs4a0tDRqVsujum8ed959L0HVfKDHKCJq6zVNSl0qZ5r47gZ6GmMyAUTkNWA9v3Q7V6rKOnToEAsXLiQlJYWmtf24rdFWgg8u44hPYzKznyPIvwZoclLqsjiToAQocHhdYE9TqsrKyspi2bJlxMbGUiOwGl2qH2HUyfn4nPKCQb+nQZ+HwC/Q3WEqVaE5k6A+AjbaQ7YLMA74wKVRKeWhjDEkJiayZMkSzmaeo1fPngxpVxefD4byU52htJn6Dwhp7O4wlaoUnOkk8aaIrMS61RHANGPMFpdGpZQHSk1NZdGiRezfv5+w6lDd6yhd+w7Gr0Y1zEMxtKnT3N0hKlWpXMoY0QIUos17qorJyclh1apVrN+wkVo+2TwUnkTtIys54R3K2TMnoEY4oslJqavOmV58z2Pdd28eVnL6SETmGmNecnVwSrlT0fVMP/zwA9mn02gpB7gp7wd8U31g4DPU7vsItf10VFulXMWZGtQtQOeiu5eLyKtAHKAJSlVax48fZ9GiRSTuOUSLBnW4eexg6swey7GGo2k08RUIbuTuEJWq9JxJUPsBf6BoeI1qwB5XBaSUO+Xk5LBy5Uo2bdxILY7Tu3AvrcfMpEGjWvB4Ao2C6rg7RKWqDGcSVA6wTUR+xBoP6logWkT+D8AY87AL41OqXBhjSEhI4JsflhOSuZcHqm+gTuZPpFdvim+1TKAWaHJSqlw5k6Dm248iK10TilLuceTIERYvXszx5F30LoxluNdmoC6M/Sd1Ok8F70vpS6SUulqc6Wb+SXkEolR5O3v2LIt+XM53cfvpUCOHEWMn0HL1j5xs8wS1hj4O1aq7O0SlqjT9aaiqnIKCAjZu3Mi6VctonJXI72UHZ8f9j6jWjaHLZoK8vN0dolIKTVCqCjHGsOunn/i/+WvpeW4FD/itJtArg4yIawlp6G8tpMlJKY+hCUpVCampqSxZsoSjuxN4zCykpdchqN8drn2RkCa93R2eUqoYJSYoEfkeq9desYwx17skIqWuonPnzvH+NytYuu0gvWqcZsiICTTcd4zCji/j1W4ciN4YRSlPVVoN6g377w1AfWCm/foWrGujlPJYReeZ4ld9T/fsaKb57ObwhJW0ad0aemuNSamKoMQEZYxZBSAiLxpjBjjM+l5EVrs8MqUugzGGLYnbeH5eDL8xXzPdey1ePt4U9nyANk3C3R2eUuoSOHMOKkxEmhlj9gKISFMgzNkdiIg3EAMcNsaMvbwwlSrb7v3JrFmxjOMHdjFTPiNYMpGON8OQ5/DWWxMpVeE4k6AeA1aKyF77dSQw/RL28QiwA6h5aaEp5ZyMjAxe/nIFu5OT6VqrgFHX3UTNzDCk5TAI7+Tu8JRSl8mZC3UXi0hLoI09aacxJseZjYtII2AM8DLw+GVHqVQx0k6dIXrtOk7Efsv9BauJrHaI9InLCWveBejq7vCUUleotF58N5Qwq7mIYIz52ont/xN4GqhRyn7uBe4FiIiIcGKTqqrLz89n9bqNvLpoO7/3/ZzxXlsoDAzDa+g/CYvs6O7wlFJXSWk1qOtKmWeAUhOUiIwFUo0xsSIyqMQNGTMDmAHQrVu3Eru1K1VYWMiC6Dj2xkVzLuM43/h/QDUvA32fxqvvw1CtxN9BSqkKqLRefNNExAu40Rgz5zK23Re4XkRGYw3XUVNEZhpjbrvMWFUVZYxhz549vPbVWrxP7yUivDE33349gVndoVF3CG7o7hCVUi5Q6jkoY0yhiDwIXHKCMsY8CzwLYNegntTkpC5VzI69RK+Jpv6RH3nVax11/NLIH7sIn6bNgGbuDk8p5ULO9OL7UUSeBGYDmUUTjTEnXBaVqvLS0tL4cdkKvoo/xB/9viBKfsLUagnD38InUi+0VaoqcCZB3WX//a3DNMMl/Hw1xqxEx5FSTkg7cZJ3vl1D4cF4qvl48WnQe/j7eMGQN5Cud4K3r7tDVEqVE2e6mTctj0BU1ZaZmUl0dDSz1+2kWf4u6nccxZSxQwg6MQLCWoF/sLtDVEqVszITlIj4AvcDRbc7Wgm8a4zJc2FcqorIzs5m1g9rSdwaz2Cznv/4bsJfTmG6TkSCgiCou7tDVEq5iTNNfP8FfIH/2K+n2tPucVVQqvLLzc1l48aNREevJflsFk/7zqUph6FBbxj+EtKom7tDVEq5mTMJqrsxxvF+MctFZKurAlKVW35+Pus2buaD5duILDhM65bNeejYPwjw9oNrP4NrrtMhMJRSgHMJqkBEmhtj9gCISDOgwLVhqcomPz+fLVu2sGbNGg5nnOXawnhqDHuGcYN6wsn+UCMcfPzcHaZSyoM4k6CeAlbYN4sVoAkwzaVRqUqjoKCA+Ph4vlgaQ3ZmBveGbKKD7xoAvBrcZy1Uq4kbI1RKearS7sX3KLAWWAW0BFpjJSinbxarqq6CggISEhJYvXo1J0+epBHHmeb9HSGnT0OHSTD0jxCi915USpWstBpUI+BfWHcxTwDWYSWsg4AmKFWsosS0aMVa1p4IYFTjIKZMGU2jtb/DjygY/iI0iHJ3mEqpCqC0e/E9CSAifkA3oA/WRbvviUiGMaZt+YSoKgLHGlNGRgaNa+TzJ68l5HX+Ny1btoQmn4JvoHaAUEo5zZlzUAFYgw0G248jQKIrg1IVR9E5pujoaDal+RAZlM+zDWOpfmgVBTXr4x2aZS3oF+TeQJVSFU5p56BmAO2AM8BGrCa+N40xJ8spNuXB8vPziYuLY+3atZw+fZqGDRpwV80VDM5chKQGwZA/4t3rAfALdHeoSqkKqrQaVARQDfgZOAwcAjLKISblwXJzc88npuTTBSRJBC+OH0XvTq0pWLQH4TfIwKchKNTdoSqlKrjSzkGNFBHBqkX1AZ4A2ovICWC9MeZP5RSj8gDZ2dls3ryZDRs2cDYzixZNGnBT5EGCE5/kcPb7iLTBZ9Rf9RyTUuqqKWs8KAMkiUgGcMp+jAV6AJqgqoBz586xYcMGNm3aRE5ODlt823NdrQSmnvwHHDiEaT6E4KZ2d3FNTkqpq6i0c1APY9Wc+gJ5WF3M1wMfop0kKr3Tp0+zbt064uLiOJEj9GjXnH59+yJzbiX8ZDymQWdk/H+QZgPdHapSqpIqrQYVCXwFPGaMOVo+4Sh3S09PJzo6moSEBIwxmAYdSNm7i5Y9htCgYSgMvg/8ghC9Z55SysVKOwf1eHkGotzryJEjrF27lu3bt5PpFUiLVp259RoI2PgvvP02kXmiBUTeCFG3uDtUpVQV4cx1UKqSMsawd+9e1q5dy759+6hWrRp9+vRhwaYkBux5heo7tkGNBjD2nwR1GufucJVSVYwmqCqosLCQbdu2sW7dOlJSUiAghDMR/Xhqch8C/f3ol/g0foVZMOwN6HI7+FRzd8hKqSpIE1QVkpuby5YtW9iwYQMZGRnUqVOH66+7jnNHt5Oz8UX2p35B28gGBNw+F0Iaa2JSSrmVJqgq4MyZM2zatImYmBiys7MJb9iY5FpRjKy9m86bHoaURPJrNsCn2nGgAYS2cHfISimlCaoyS01NZf369SQmJlJQUEDrNtfQt09vGtWpzuG/96PR3kNQpwWM+w8+HW7SAQOVUh5FE1QlU9TxYcOGDezevRsfHx86d+5MZlB9tmxazbgJDRA/b8KjroWmA6DtOPDydnfYSin1K5qgKon8/HwSExPZsGEDqampVK9enb4DBtG1ZX1qbf+M/LUfMyE/m4yTNxNQLxzv6/7p7pCVUqpUmqAquLNnzxITE0NMTAyZmZnUq1ePcePG0TTUn3UfPk3N1WuBQnzaTYA+DxFWL9zdISullFM0QVVQKSkpbNiwgaSkJAoKCmjVqhVdu3YlG286tmoO6XsYLLEcb3Ub9Uc8BrUi3R2yUkpdEk1QFUhhYSG7du1i48aNHDhwAF9fX7p06UKvqGuovX8hJ78aR1xOOGlPLSK0TnP8f7eb+r4B7g5bKaUuiyaoCiArK4u4uDg2b97MqVOnCA4OZtiwYUTW8ePQj28REvcD5GcREN6D0KZTqRNk98bT5KSUqsA0QXmwlJQUNm3aRGJiIvn5+URGRtK93yDCG0fSrF4IZ5e8TGjaQg42uY4mox7FP7wTndwdtFJKXSUuS1Ai4g+sxhqV1wf4Sgc5LFtBQQE7d+5k06ZNJCcn4+3tQ9M2HRjetTmhyQtJXXAD34c/RLPpj1G9/2/J7vkbmgTXdXfYSil11bmyBpUDDDHGnBURXyBaRBYZYza4cJ8V1pkzZ4iLiyMmJoYzZ85Su3Ytrh02jDVJu2j003uEbV8PhXn41OvL8B4drJUCQvDXVjylVCXlsgRlj8Z71n7paz+Mq/ZXERljOHDgAJs3b2bnzp0UFhZyonZbNnsHsfKBEfh5e9Fp/QP4FqZjut+DdL+bOqEtqePuwJVSqhy49ByUiHgDsUAL4G1jzMZilrkXuBcgIiLCleF4jOzsbBISEti8eTP7Uk+zg0bc2a0Hw1sGcG7zZwScWknm2Rj8QoIJmvol1GoCfkHuDlsppcqVSxOUMaYAiBKREGC+iLQ3xiRdtMwMYAZAt27dKnUN68iRI9ZFtQk7yMkvoGWjugwd2IfAld8xYu8GasYmEewbCB0mgk+utVK9tu4NWiml3KRcevEZYzJEZCUwEkgqY/FKJTc3l6SkJGJjYzly5Aji48dX2e0Z0zqEe6b2h8OxjFr9Pvi2g1GvQ8dJEBDi7rCVUsrtXNmLLwzIs5NTADAMeM1V+/M0KSkpxMbGkpiYyK5zgWT6h/HMsH50ZCcPb3wJfDsD/aFBF5i+Gup3BBF3h62UUh7DlTWocOAT+zyUFzDHGLPAhftzO8fa0q5DaYT4FtK+fTvCMtJpdvgLuizfiBTkEBLeCVr3s1YSgXC9ekkppS7myl58CUBnV23fUxhjOHLkCHFxcSQlJZGbm8vp6k3YkBPO67eOoE/rcAoWPIlXylak8x3QeSqEd3R32Eop5fH0ThKXKSsri4SEBOLi4jhy7DhJhY3o3aQ5DzZNJXj/XHzORJNR+C0QjveQ38OIF/XWQ0opdQk0QV0CYwz79u1jy5YtJG7fyal8H9o2qs2Ea/vQZ/lbDD28Eb+D56BWUxj8HCGN2lgrBtZ2b+BKKVUBaYJyQkZGBvHx8cTHx3Pq1Cn8/f1J9Q3Fz+ssd999D16FeRTGPIlX5A0QNQUiemuHB6WUukKaoEqQl5fHjh07iI+PZ9++fRwuqEmadwj/aptKo/SlSEoCWTWaIDwGPn54PRQHXl7uDlsppSoNTVAOjDEcPHiQ+Ph4tiZtZ092IM1DvBk0aBARxxbTZPuf8dpmoEFnGPEKAe1v/CUpaXJSSqmrShMUVhNeQkICW+K3cuzEKUJ8C+hfN4fuyUs50eZZBg4cCHsNhNWADjdBaEt3h6yUUpVelU1QOTk5bN++nYSEBPbv34+YAk4UejE5MI5ehTHI4UzyatTFq4V996Vmg6yHUkqpclGlElRhYSF79+4lISGBnTt3suVcCN4+Xtw/eBBRrSOp/m5XCgsDkfY3Qocb8W3SF7y83R22UkpVSZU+QRljSElJYevWrfy4ZQ/bzgYwNXAzU0JSeLQwlhSfRkT0i8bH2wvu+QHveh3Ax8/dYSulVJVXaRPUyZMnWROzlfmxB6mfnUygdyEDA4/yO9+FhOVlQEYgtBlFs/YTwdvu4NCwq1tjVkop9YtKlaDST53h02Xx5B7bS/axfQSaU/QuOAZRtzF1zGB8t8/F++fT0P4GaDVCx1hSSikPVqkS1MzPv2DBQeGBgBWMCtxK4LnDGD9fpNM0CAiArrdbD6WUUh6vUiWo8f078Mi8UZhCQer2gw5PI9dcr7caUkqpCqhSJagmHfpA4QykaX+o2cDd4SillLoClSpBAdBpsrsjUEopdRXo/XmUUkp5JE1QSimlPJImKKWUUh5JE5RSSimPpAlKKaWUR9IEpZRSyiNpglJKKeWRNEEppZTySGKMcXcM54nIceDAFW4mFEi7CuF4Ei2T56ts5QEtU0VRGcrUxBgTdvFEj0pQV4OIxBhjurk7jqtJy+T5Klt5QMtUUVTGMhXRJj6llFIeSROUUkopj1QZE9QMdwfgAlomz1fZygNapoqiMpYJqITnoJRSSlUOlbEGpZRSqhLQBKWUUsojeXyCEpEPRSRVRJIcpnUSkfUikigi34tITXt6pIhkiUi8/XjHYZ2u9vK7ReT/RETcUR47FqfLZM/raM/bZs/3t6dXyDKJyBSHzyheRApFJMqeV1HL5Csin9jTd4jIsw7reESZLrE8fiLykT19q4gMcljHI8pjx9JYRFbY7/k2EXnEnl5bRH4UkZ/tv7Uc1nnWjn2XiIxwmO4R5brUMolIHXv5syLy1kXb8ogyXTZjjEc/gAFAFyDJYdpmYKD9/C7gRft5pONyF21nE9AbEGARMKqClMkHSAA62a/rAN4VuUwXrdcB2FsJPqdbgVn280BgPxDpSWW6xPL8FvjIfl4XiAW8PKk8dizhQBf7eQ3gJ6At8Dfgd/b03wGv2c/bAluBakBTYI+n/T9dRpmCgH7AfcBbF23LI8p0uQ+Pr0EZY1YDJy6a3BpYbT//EZhY2jZEJByoaYxZb6xP7VNg/FUO1WmXWKbhQIIxZqu9broxpqCCl8nRLcCXUOE/JwMEiYgPEADkAqc9qUyXWJ62wDJ7vVQgA+jmSeWxYztqjImzn58BdgANgXHAJ/Zin/BLjOOwfkjkGGP2AbuBHp5UrkstkzEm0xgTDWQ7bseTynS5PD5BlSAJuN5+fhPQ2GFeUxHZIiKrRKS/Pa0hcMhhmUP2NE9SUplaAUZEfhCROBF52p5ekcvkaDJ2gqJil+krIBM4CiQDbxhjTuD5ZSqpPFuBcSLiIyJNga72PI8tj4hEAp2BjUA9Y8xRsL7wsWqBYMV60GG1ovg9slxOlqkkHlmmS1FRE9RdwG9FJBarCpxrTz8KRBhjOgOPA1/YberFtbt6Wv/6ksrkg1V9n2L/nSAiQ6nYZQJARHoC54wxRedEKnKZegAFQAOspqMnRKQZnl+mksrzIdYXWgzwT2AdkI+HlkdEqgPzgEeNMadLW7SYaaaU6W5zCWUqcRPFTHP7Z3UpfNwdwOUwxuzEavpCRFoBY+zpOUCO/TxWRPZg1UAOAY0cNtEIOFKeMZelpDJhxb7KGJNmz/sf1nmEmVTcMhW5mV9qT1CxP6dbgcXGmDwgVUTWAt2ANXhwmUr5X8oHHitaTkTWAT8DJ/Gw8oiIL9YX+efGmK/tycdEJNwYc9Ru6kq1px/iwpp8UfwedexdYplK4lFluhwVsgYlInXtv17Ac8A79uswEfG2nzcDWmKdgD8KnBGRXnYvltuBb90SfAlKKhPwA9BRRALt8xsDge0VvExF024CZhVNq+BlSgaGiCUI6AXs9PQylfK/FGiXAxG5Fsg3xnjccWfH8AGwwxjzpsOs74A77Od38EuM3wE3i0g1u+myJbDJk8p1GWUqlieV6bK5u5dGWQ+sX9hHgTysXwR3A49g9Wz5CXiVX+6IMRHYhtV+Hgdc57Cdbljt7XuAt4rW8fQy2cvfZpcrCfhbJSnTIGBDMdupkGUCqgNz7c9pO/CUp5XpEssTCezCOkG/FGs4BI8qjx1LP6xmqwQg3n6Mxurtugyr1rcMqO2wzh/s2Hfh0KvNU8p1mWXaj9UB5qz92bb1pDJd7kNvdaSUUsojVcgmPqWUUpWfJiillFIeSROUUkopj6QJSimllEfSBKWUUsojaYJSyoXs66KiRWSUw7RJIrLYnXEpVRFoN3OlXExE2mNdI9UZ8Ma6rmWkMWbPZWzL2xhTcHUjVMozaYJSqhyIyN+wbiYbZP9tgjXUiA/wgjHmW/vGoJ/ZywA8aIxZJ9ZYTH/Cusg2yhjTtnyjV8o9NEEpVQ7s2wbFYd2MdQGwzRgzU0RCsMbs6Yx194BCY0y2iLQEvjTGdLMT1EKgvbGGiFCqSqiQN4tVqqIxxmSKyGysW9FMAq4TkSft2f5ABNaNPN8Sa3ThAqwbHRfZpMlJVTWaoJQqP4X2Q4CJxphdjjNF5AXgGNAJqwOT4wB0meUUo1IeQ3vxKVX+fgAesu8wjYh0tqcHA0eNMYXAVKwOFUpVWZqglCp/LwK+QIKIJNmvAf4D3CEiG7Ca97TWpKo07SShlFLKI2kNSimllEfSBKWUUsojaYJSSinlkTRBKaWU8kiaoJRSSnkkTVBKKaU8kiYopZRSHun/ASS1/xdfdDvJAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -732,15 +733,16 @@ "system.alpha1 = 19 / 1000\n", "system.alpha2 = 15 / 1000\n", "\n", - "results = run_simulation(system, growth_func3)\n", - "plot_results(results, \n", - " 'Proportional model, parameter changes over time')" + "results3 = run_simulation(system, growth_func3)\n", + "results3.plot(label='model', color='gray')\n", + "plot_estimates()\n", + "decorate(title='Proportional growth, parameter changes over time')" ] }, { "cell_type": "code", - "execution_count": null, - "id": "popular-ireland", + "execution_count": 22, + "id": "preliminary-carnival", "metadata": {}, "outputs": [], "source": [ @@ -753,7 +755,7 @@ { "cell_type": "code", "execution_count": null, - "id": "indian-sitting", + "id": "median-policy", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap07.ipynb b/jupyter/chap07.ipynb index 648f2181..e331b338 100644 --- a/jupyter/chap07.ipynb +++ b/jupyter/chap07.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "dutch-anime", + "id": "regular-director", "metadata": {}, "source": [ "# Chapter 7" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "legitimate-middle", + "id": "disciplinary-occasion", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "smart-vault", + "id": "similar-wellington", "metadata": { "tags": [ "remove-cell" @@ -41,18 +41,16 @@ " import pint\n", "except ImportError:\n", " !pip install pint\n", - " import pint\n", " \n", "try:\n", " import modsim\n", "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" + " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "nervous-associate", + "id": "indie-scoop", "metadata": {}, "source": [ "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", @@ -70,7 +68,7 @@ }, { "cell_type": "markdown", - "id": "configured-custom", + "id": "qualified-houston", "metadata": {}, "source": [ "Here's the code that reads the data." @@ -79,7 +77,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "retired-essence", + "id": "major-arkansas", "metadata": {}, "outputs": [], "source": [ @@ -94,7 +92,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "italic-remains", + "id": "intense-columbus", "metadata": {}, "outputs": [], "source": [ @@ -110,7 +108,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "automated-impossible", + "id": "wound-necklace", "metadata": {}, "outputs": [], "source": [ @@ -120,7 +118,7 @@ }, { "cell_type": "markdown", - "id": "chinese-bundle", + "id": "intended-matrix", "metadata": {}, "source": [ "And here are the functions from the previous chapter." @@ -129,7 +127,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "incoming-clause", + "id": "former-accuracy", "metadata": {}, "outputs": [], "source": [ @@ -156,30 +154,22 @@ { "cell_type": "code", "execution_count": 6, - "id": "worst-referral", + "id": "duplicate-insert", "metadata": {}, "outputs": [], "source": [ - "from modsim import plot, decorate\n", + "from modsim import decorate\n", "\n", - "def plot_results(timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, style=':', label='US Census')\n", - " plot(un, style='--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" + " ylabel='World population (billion)')" ] }, { "cell_type": "markdown", - "id": "funky-bristol", + "id": "champion-retreat", "metadata": {}, "source": [ "## Quadratic growth\n", @@ -202,7 +192,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "coastal-crazy", + "id": "sized-hawaiian", "metadata": {}, "outputs": [], "source": [ @@ -212,7 +202,7 @@ }, { "cell_type": "markdown", - "id": "closing-wrist", + "id": "amateur-strand", "metadata": {}, "source": [ "Here's the `System` object we'll use, initialized with `t_0`, `p_0`, and `t_end`." @@ -221,7 +211,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "formed-touch", + "id": "interstate-canal", "metadata": {}, "outputs": [], "source": [ @@ -238,7 +228,7 @@ }, { "cell_type": "markdown", - "id": "single-punishment", + "id": "acting-transportation", "metadata": {}, "source": [ "Now we have to add the parameters `alpha` and `beta` .\n", @@ -248,7 +238,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "equivalent-monster", + "id": "banned-dallas", "metadata": {}, "outputs": [], "source": [ @@ -258,7 +248,7 @@ }, { "cell_type": "markdown", - "id": "incoming-cradle", + "id": "supreme-wellington", "metadata": {}, "source": [ "And here's how we run it:" @@ -267,7 +257,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "prescription-assurance", + "id": "positive-scheme", "metadata": {}, "outputs": [], "source": [ @@ -276,7 +266,7 @@ }, { "cell_type": "markdown", - "id": "toxic-european", + "id": "satisfied-density", "metadata": {}, "source": [ "And here are the results." @@ -285,12 +275,12 @@ { "cell_type": "code", "execution_count": 11, - "id": "instant-malawi", + "id": "flush-fellowship", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -302,12 +292,14 @@ } ], "source": [ - "plot_results(results, 'Quadratic model')" + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Quadratic Growth Model')" ] }, { "cell_type": "markdown", - "id": "unexpected-davis", + "id": "organized-combining", "metadata": {}, "source": [ "The model fits the data well over the whole range, with just a bit of space between them in the 1960s.\n", @@ -328,7 +320,7 @@ }, { "cell_type": "markdown", - "id": "opened-paint", + "id": "powerful-century", "metadata": {}, "source": [ "## Net growth\n", @@ -341,7 +333,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "wanted-malta", + "id": "excited-catch", "metadata": {}, "outputs": [], "source": [ @@ -352,7 +344,7 @@ }, { "cell_type": "markdown", - "id": "exempt-techno", + "id": "tracked-guide", "metadata": {}, "source": [ "Now I'll use the quadratic model to compute net growth for each population." @@ -361,7 +353,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "reduced-creature", + "id": "classical-badge", "metadata": {}, "outputs": [], "source": [ @@ -371,36 +363,34 @@ }, { "cell_type": "markdown", - "id": "color-surfing", + "id": "quantitative-differential", "metadata": {}, "source": [ - "I'll put the results in a `Series` with `pop_array` and the index and `growth_array` as the values." + "To plot the growth rate versus population, we can import the `plot` function from Matplotlib:" ] }, { "cell_type": "code", "execution_count": 14, - "id": "powered-productivity", + "id": "interim-consent", "metadata": {}, "outputs": [], "source": [ - "from pandas import Series\n", - "\n", - "growth_series = Series(growth_array, index=pop_array)" + "from matplotlib.pyplot import plot" ] }, { "cell_type": "markdown", - "id": "spare-complexity", + "id": "published-average", "metadata": {}, "source": [ - "Now we can plot the `Series` like this:" + "And use it like this." ] }, { "cell_type": "code", "execution_count": 15, - "id": "growing-butler", + "id": "received-crossing", "metadata": {}, "outputs": [ { @@ -417,7 +407,7 @@ } ], "source": [ - "plot(growth_series, label='growth')\n", + "plot(pop_array, growth_array, label='growth')\n", "\n", "decorate(xlabel='Population (billions)',\n", " ylabel='Net growth (billions)',\n", @@ -426,7 +416,7 @@ }, { "cell_type": "markdown", - "id": "placed-conservative", + "id": "plastic-wisdom", "metadata": {}, "source": [ "Note that the x-axis is not time, as in the previous figures, but population. We can divide this curve into four regimes of behavior:\n", @@ -451,7 +441,7 @@ }, { "cell_type": "markdown", - "id": "spread-ranking", + "id": "relevant-detection", "metadata": {}, "source": [ "## Equilibrium\n", @@ -474,7 +464,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "foreign-emperor", + "id": "lightweight-entrepreneur", "metadata": {}, "outputs": [ { @@ -494,7 +484,7 @@ }, { "cell_type": "markdown", - "id": "enormous-casting", + "id": "stuck-flood", "metadata": {}, "source": [ "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", @@ -514,7 +504,7 @@ }, { "cell_type": "markdown", - "id": "opened-possession", + "id": "derived-oliver", "metadata": {}, "source": [ "## Summary\n", @@ -530,7 +520,7 @@ }, { "cell_type": "markdown", - "id": "baking-ability", + "id": "bibliographic-handy", "metadata": {}, "source": [ "## Dysfunctions\n", @@ -548,7 +538,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "interracial-speed", + "id": "lucky-insurance", "metadata": {}, "outputs": [ { @@ -571,7 +561,7 @@ }, { "cell_type": "markdown", - "id": "attempted-infection", + "id": "accredited-fitting", "metadata": {}, "source": [ "Now let's see all the ways that can go wrong." @@ -579,7 +569,7 @@ }, { "cell_type": "markdown", - "id": "detailed-trainer", + "id": "transparent-cotton", "metadata": {}, "source": [ "Dysfunction \\#1: Not using parameters. In the following version, the\n", @@ -590,7 +580,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "wooden-collect", + "id": "aggregate-baker", "metadata": {}, "outputs": [ { @@ -613,7 +603,7 @@ }, { "cell_type": "markdown", - "id": "settled-scale", + "id": "otherwise-belarus", "metadata": {}, "source": [ "This version actually works, but it is not as versatile as it could be.\n", @@ -622,7 +612,7 @@ }, { "cell_type": "markdown", - "id": "unnecessary-stack", + "id": "naughty-crazy", "metadata": {}, "source": [ "Dysfunction \\#2: Clobbering the parameters. When people first learn\n", @@ -632,7 +622,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "committed-better", + "id": "outdoor-petroleum", "metadata": {}, "outputs": [ { @@ -657,7 +647,7 @@ }, { "cell_type": "markdown", - "id": "terminal-wheat", + "id": "afraid-street", "metadata": {}, "source": [ "In this example, we have a `System` object named `sys1` that gets passed\n", @@ -674,7 +664,7 @@ }, { "cell_type": "markdown", - "id": "interpreted-perfume", + "id": "expired-detail", "metadata": {}, "source": [ "Dysfunction \\#3: No return value. Here's a version that computes the\n", @@ -684,7 +674,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "crude-window", + "id": "increasing-database", "metadata": {}, "outputs": [ { @@ -707,7 +697,7 @@ }, { "cell_type": "markdown", - "id": "logical-enemy", + "id": "brutal-chile", "metadata": {}, "source": [ "A function that doesn't have a return statement actually returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause." @@ -715,7 +705,7 @@ }, { "cell_type": "markdown", - "id": "concerned-space", + "id": "meaning-thriller", "metadata": {}, "source": [ "Dysfunction \\#4: Ignoring the return value. Finally, here's a version\n", @@ -734,7 +724,7 @@ }, { "cell_type": "markdown", - "id": "better-karen", + "id": "opposed-vessel", "metadata": {}, "source": [ "In this example, `carrying_capacity` runs and returns `K`, but the\n", @@ -747,7 +737,7 @@ }, { "cell_type": "markdown", - "id": "metropolitan-blackjack", + "id": "quarterly-ethiopia", "metadata": {}, "source": [ "## Exercises" @@ -755,7 +745,7 @@ }, { "cell_type": "markdown", - "id": "vital-seven", + "id": "painted-samuel", "metadata": {}, "source": [ "**Exercise:** In a previous section, we saw a different way to parameterize the quadratic model:\n", @@ -770,7 +760,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "twelve-amplifier", + "id": "unauthorized-settle", "metadata": {}, "outputs": [ { @@ -796,7 +786,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "yellow-horse", + "id": "primary-roman", "metadata": {}, "outputs": [], "source": [ @@ -809,12 +799,12 @@ { "cell_type": "code", "execution_count": 23, - "id": "animal-drink", + "id": "ordinary-solid", "metadata": {}, "outputs": [ { "data": { - "image/png": "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MHr0aPz8/Jx2PK1BXadTp07RuHFjADw9PYmMjPzZNh9++CETJ06kd+/egP26z+23307Dhg3Jzs7mwQcfpHv37nTp0oU5c+YA8PnnnzNu3DhGjBhBq1atePnllwEoLi7mgQceoEOHDnTs2JH33nsPgJiYmAvDRJ0+fZqSMQ137NhBjx49iIqKolOnTuzdu9ep50MpVfXYbDYSEhL497//zYkTJxgzZgz33nsvderUcepxK12CmjA5nm8SjwBQWGxjwuR4vt+cCkBuQTETJsczb8sxAM7nFTJhcjyLth8HICO7gAmT41n200kATmVef9X0ueeeo02bNtx2221Mnjy5zOru9u3b6datW5nvf+uttxg0aBAbN25k5cqVvPTSS2Rn22duT05OZubMmWzbto2ZM2dy5MgRkpOTOXr0KNu3b2fbtm1MmjSp3Pg+/vhjnnnmGZKTk0lMTCQkJOS6y6yUqj5Onz7N559/zuLFiwkPD+fxxx+nS5cuFdLBqtIlqIp2uQ+hZPnrr79OYmIiw4YN46uvvmLEiBFXtf8lS5bwl7/8haioKGJiYsjLy+PwYfvEuIMHD6Z27dr4+fkRGRnJoUOHiIiI4MCBAzz11FMsWrSIWrVqlbv/3r178/bbb/POO+9w6NAhatSocVXxKaWqJ5vNRlxcHJMnTyYtLY1bb72Vu++++4p/c26kSncNauYjvS889/b0uOh1DR/Pi17X8vO+6HW9AJ+LXjeoeeW206CgIM6cOXPRsoyMjItubG3RogWPPfYYv/rVrwgODiY9PZ2goKAL69u3b09SUhJjx4792f5Lrke1adPmouXr16/H19f3wmtPT0+KioqoW7cuW7ZsYfHixXz44YfMmjWLTz/9FC8vL2w2G8BFtbh77rmHnj17smDBAoYPH84nn3zCoEGDrlhupVT1lZaWxpw5czh69Chtw5syMvgYNTt1ggq+LUVrUFcQGBhI48aNWb58OWBPTosWLaJfv34ALFiwgJJZiffu3Yunp+fP2mWffPJJpk6dyvr16y8smzZtGidOnGD48OG8//77F/axefPmcuM5ffo0NpuN8ePH8+abb7Jp0ybAPlVJUlISAN9+++2F7Q8cOEBERARPP/00Y8aMYevWrddxNpRSVVlxcTFr165l8uTJZGRkML5XOHce+T01t38JmScubJdbUMydH8dzJMO5PZEr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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABGb0lEQVR4nO3dd3hUVfrA8e+bThol9Bp6hyChd5AioChF7IBrb9hdt7i6ttV1dfdnWWV3rSCCCiIgvZqQAAmGJiAdQk9o6W3O7497wQFThjKZSfJ+nmeezNz6njszeeece+49YoxBKaWU8jY+ng5AKaWUKowmKKWUUl5JE5RSSimvpAlKKaWUV9IEpZRSyitpglJKKeWVNEGVEyISKSJGRPyu4jb/ICL/vVrb8xQR2Sci13o4hk9F5BUXl70q8YrIRBGJudLtKOUpmqDcyP4HsVlEMkXkqIh8ICKVPR1XYUSkv4gkO08zxrxmjLnnMrc3WERWiEiaiKSKSJKIPCciQVcn4iL363IiKGL9iXaif/ui6Tfa0z+94iA9xI6/WUXdv6cU9t1SrtEE5SYi8hTwBvAMUBnoDkQCi0XEv5RjEREptfdaRMYB3wBfAo2MMRHAeKA+0KCIda5aze8q2A2Mvyimu4BfPBSPx3nZ+3NFylpZylq8V5UxRh9X+QGEA+nAzRdNDwWOAxPs158CrzjN7w8kO73+PdY/yzTgZ+Amp3m+wFtACrAHeBgwgJ89fyXwKhALZAHNgEnANnt7e4D77WVD7GUcdtzpQF3gRWCq0z57A2uA08BBYGIhZRd73lMlHKMXsZLYVOAscI+9z++Bk8Au4F572SA7vur26z8B+UC4/foV4J/AfUAekGuXYa49fx/wNLAJOAPMAIKKiGsiEAMsBEbY06oBR4G/A586LXsDsNU+HiuB1k7zOgEb7GM9A/jqovd6JJBkr7sG6OA0bx9wrYufteI+IxOBGPv5avvzkWEfm/EuxvGcfdxysD5DBpgAHMD67P3RafmuQJy9rSPAe0DA5e6/kLIa4DGsz26K/X742POaAsuBVHveNKBKMWXxc+HYxQLv2LHtAXra0w/i9D22lw/E+j4eAI4BHwKVKPq75eO0/1RgJlDN3lakXdbf2dtbjfUdmGovexpYD9Ty9P86dz88HkB5fADDsP6B+hUy7zNgmv38U4pPUOOcPszj7S93HXveA8B2rBpJNWAFv01QB4C29pfRHxhhf5EF6AdkAtcUtm972ovYCQpoaH+Rb7W3FQFEFVK+VnYckSUcoxexksmNdvkqAauAD+wvYxRwAhhkL78aGGM/X2x/sa9zmndTYcfUnrYPWGcfy2pYSfqBIuKaiJWgbgNm2NMeAj7CSoSf2tNa2O/HYPt4PIuVVAPsx37gCXveWLusr9jrXoP1D64b1g+NCXaMgU7xupqgivuMTMROUPZrAzRzeu1KHElYn7FK/PqP8z/2645Y/+xb28t3xmop8LOX3QY8frn7L6SsButzXg3r8/gLcI89r5n9XgQCNezPxD8v+gycL4uLxy4f60edr/3eHwDet/cxBOv7EGov/0+sH1fVgDBgLvB6Md+tx4F4rFaFQKzP13R73rnj/DlWgqsE3G9vM9iOpzP2D7Ty/PB4AOXxAdwBHC1i3t+AxfbzTykmQRWybhIwyn6+HKd/svYX5uIE9dcS4vwOmFzUvrkwQT0PzHah7L3tOIKcpn2F9asvE7jTadurnZZpABQAYU7TXufXhPAy8H9Y//yOApPtY3lx7eqCY2pP2wfc4fT6TeDDIuKfiJWgKmH9Eq5s/yPpxYUJ6s/ATKf1fIBD9nHsCxwGxGn+Gn5NUP8GXr5ovzuAfk7xupSgSviMTKT4BOVKHHc7zYu0t1Hfado64JYiYnnc+TNzqfsvZHsGGOb0+iFgWRHL3gj8dNFn4O7Cli3m2O10mtfe3n8tp2mpWD+kBCu5NXWa1wPYW8x3axv2jy/7dR2sHzHnkrsBmjjNv5sSapjl8aHnoNwjBaheRNtxHayaQYlE5C67c8FpETkNtAOq27PrYjU1nLO/kE04z0dErhOReBE5aW9vuNP2StIAq9ZSklT7b51zE4wxtxhjqmA1efkWEV9d4KQxJs1p2n6gnv18FdYX/RpgM7AEqxbYHdhljEkpIa6jTs8zsZpbi2SMyQLmYzUnVjfGxF60SF2cjrkxxmGXp54975Cx/7M4leWcRsBT595X+71oYK93SUr4jJTElTgOFrJeocdSRFqIyDy7Q9BZ4LUSYrmc43DxZ76uve+aIvKViByy9z21kH1f/H0o6dgdc3qeBWCMuXhaKFaNLRhIdNrWQnt6URoBs52W34b1A61WEfF+ASwCvhKRwyLyZmmfy/YETVDuEYfV9DHaeaKIhADXYf2zBetXV7DTIrWdlm2E1ZTyCBBh/4PfgvVrDaw2fucOBw0LieP8P0gRCQS+xWonr2Vv7wen7ZnfrH2hg1jNgyXZjlWTGF3Sghft8zBQTUTCnKY1tLcF1q/HlsBNwCpjzM/2/BH8ejwv3uaV+hx4Cuufw8UOY/2TAayOKFjvxyGs96aePe0c5/fnIPCqMaaK0yPYGDP9UoJz4TNSElfiuJTj+W+s97+5MSYc+EMJsVzOcbj4M3/Yfv66HWsHe993FLJv5+/DlR47ZylYyaqtUzkqG2PO/Qgq7BgexGqidi57kDHmkNMy59czxuQZY14yxrTBOhc2EqvjTrmmCcoNjDFngJeAd0VkmIj4i0gk8DW/nsAFq0lhuIhUE5HaWE0i54RgfUBPAIjIJKxfeOfMBB4TkfoiUhXrhGtxArDauk8A+SJyHVaz4DnHgIhiusFPA64VkZtFxE9EIkQkqpCyG6x/6n8RkXtFpKrdi7A5F/46vHi9g1hJ6HURCRKRDlgniafZ8zOBRKzOIOcS0hqstnnnBHUMaFLcgbgEq7DOa7xbyLyZwAgRGWT/kn0K60fJGqwfKPlY74+fiIzG6kBwzn+AB0Skm31sQkRkxEXJGTjfRbmoJFHSZ+RiFx8bl+NwURhWh5d0EWkFPOiG/T9jf6YaYDXzznDadzpwWkTqYfWeLc6lHrsi2bXn/wDviEhNe3v1RGSovUhh360PgVftRImI1BCRUUXtQ0QGiEh7EfHFOsZ5WDWuck0TlJsYY97E+gX5FtbJ1L1YtaVrjTEZ9mJfABux2scX8+uXDbuG8A+sf3bHsNrAnZuZ/oNV5d+I1XQ2q4R40rB6QM0ETmF1Avjeaf52YDqwx252qHvR+gewmgSfwupll4R1krywfc0Absb6FXsQKynPBKZgJemi3IrV/n4YmA38xRizxGn+KqxOB+ucXodhnRA/539AG7sM3xWzrxIZyzJjzMlC5u3AKt+7WOW7HrjeGJNrjMnFqkFOxDrW43F6f4wxCcC9WL3cTmF1rphYRBgNsD4DhcVX0mfkYi8Cn9nH5uZLjMMVT2N9rtKwPp8zLpp/NfY/B+uHShJWE+z/7OkvYTX/nrGnl/R9uNRjV5LnsOKPt5sYl2LV+Iv6bv0L6/u3WETSsM5zditm+7Wxer2exWoOXIXVjFmuyYXN5MpdRORurC9RL/ufvVIlEutOHl8bYxZ5OhZPs2uSzY0xuzwdiyodmqBKkYjcCeQZY77ydCxKlTWaoCoeTVBKqTJBE1TFowlKKaWUV9JOEkoppbySV92EsHr16iYyMtLTYSillCpFiYmJKcaY31zY7FUJKjIykoSEBE+HoZRSqhSJSGF3wtEmPqWUUt5JE5RSSimvpAlKKaWUV/Kqc1CFycvLIzk5mezsbE+HUi4FBQVRv359/P3L/Y2RlVJljNcnqOTkZMLCwoiMjOTCm0OrK2WMITU1leTkZBo3buzpcJRS6gJe38SXnZ1NRESEJic3EBEiIiK0dqqU8kpen6AATU5upMdWKeWtykSCUkop5V1Onz7Nxo0b3boPTVClKDIykpSU4kcmd2UZpZTyFGMM69at44MPPmDhwoVuPUXg9Z0klFJKeYeTJ0/y/fffs3//fpo2bcrIkSMJCgpy2/60BlWCffv20apVK+655x7atWvH7bffztKlS+nVqxfNmzdn3bp1nDx5khtvvJEOHTrQvXt3Nm3aBEBqaipDhgyhU6dO3H///TjfOX7q1Kl07dqVqKgo7r//fgoKyv3ozUqpMsrhcBAfH8+///1vjh49yg033MDtt99OlSpV3LrfMlWDWrhwIUePHr2q26xduzbDhg0rdpldu3bx9ddfM2XKFLp06cKXX35JTEwM33//Pa+99hoNGjSgU6dOfPfddyxfvpy77rqLpKQkXnrpJXr37s0LL7zA/PnzmTJlCgDbtm1jxowZxMbG4u/vz0MPPcS0adO46667rmrZlFLqSqWkpPD9999z8OBBmjdvzsiRIwkPDy+VfZepBOUpjRs3pn379gC0bduWQYMGISK0b9+effv2sX//fr799lsABg4cSGpqKmfOnGH16tXMmjULgBEjRlC1alUAli1bRmJiIl26dAEgKyuLmjVreqBkSilVOIfDQVxcHCtXrsTPz+98K1Fp9vwtUwmqpJqOuwQGBp5/7uPjc/61j48P+fn5+Pn99jCeexMLezONMUyYMIHXX3/dTRErpdTlO3HiBHPmzOHQoUN0bRzOwBonCezQAUr5shQ9B3UV9O3bl2nTpgGwcuVKqlevTnh4+AXTFyxYwKlTpwAYNGgQ33zzDcePHwesE4/79xd6t3mllCo1BQUF/Pjjj3z00UecPHmSid1rMCz5LQK3fAVpv55eycot4OYP4zh4MtOt8ZSpGpS3evHFF5k0aRIdOnQgODiYzz77DIC//OUv3HrrrVxzzTX069ePhg0bAtCmTRteeeUVhgwZgsPhwN/fn/fff59GjRp5shhKqQrs2LFjzJkzhyNHjtCmdStGVdlOwJpXoV5nGD8VwuuQm+8gwM+HSgG+tK9fmUOns2hQLdhtMYlzzzJPi46ONhcPWLht2zZat27toYgqBj3GSlVc52pNP/74I5UqVWL48OG02fF/sHE6RN0OI94G/yBW7jjOc99uYtZDvahXpdJVjUFEEo0x0RdP1xqUUkpVUEeOHGHOnDkcO3aM9u3bM2zYMIKDg8HvJqgTBd3up8CAL9C8Vhjt61XG4Si9So0mKKWUqmDy8/NZvXo1MTExhISEcNvoETTfPw0S90Kfp6DFUIwxPPftJvIKDO+Mj6JelUr8d0KXUo1TE5RSSlUghw8f5rvvvuPEiRN07NCB4Q2zCVh4K2SmQK/JOBwGHx9BRKhfNZi8AgfGGI/cWFoTlFJKVQD5+fmsXLmSNWvWEBoayp3X96XJ1ndh7jKrOe/2r9nl15SH/rWaN8d2JKpBFR4b1NyjMWuCUkqpci45OZk5c+aQkpJCVFQUQ4cOJSh1KyxKgOvexET/DvH1o3ZOPlUqBZCd5x23XtMEpZRS5VReXh4rVqwgPj6esLAwfjekPfXzd0HQKKv7+JNb+SwxlaWfJvL53V0JDfRj5gM9PB32eXqhbgn27dtHu3btLpj24osv8tZbbwEQHx9Pt27diIqKonXr1rz44ouFbmfdunX07duXli1bnr/5bGamey9yU0pVXAcOHOCjjz4iLi6OLu1b8FiTvdRfNAkSPoXss9bNqwPDCPL3ITTQj4xc76g1OdMa1BWaMGECM2fOpGPHjhQUFLBjx47fLHPs2DHGjRvHV199RY8ePTDG8O2335KWlmZ16VRKqaskLy+PZcuWsXbtWiqHh/NA7xrU2vBnqxNE94c50/0Znpqxg5s61WdEhzrcHN2A8V0aejrsQrmtBiUiLUUkyelxVkQed9f+POX48ePUqVMHAF9fX9q0afObZd5//30mTJhAjx5W1VlEGDt2LLVq1SIjI4O7776bLl260KlTJ+bMmQPAp59+yujRoxk2bBjNmzfn2WefBayL6iZOnEi7du1o374977zzDgD9+/fn3EXOKSkpREZGArB169bzw3p06NCBnTt3uvV4KKU8Z//+/Xz44YesXbuW6OhoHrxrDLXiX4HwunDvChj2GqHhVTiblU9adh5Q+P1CvYXbEpQxZocxJsoYEwV0BjKB2Ve63fEfxfF1wkEA8gocjP8ojtk/JQPW/aHGfxTH3I2HATibncf4j+JYuOUIACczchn/URxLfz4GwPG0Kx8J8oknnqBly5bcdNNNfPTRR4WOLrllyxY6d+5c6PqvvvoqAwcOZP369axYsYJnnnmGjIwMAJKSkpgxYwabN29mxowZHDx4kKSkJA4dOsSWLVvYvHkzkyZNKja+Dz/8kMmTJ5OUlERCQgL169e/4jIrpbxLbm4uCxYs4NNPP4WCPB7sXZ0Rw4cTGNEQ7l5A7ICZ3DY/m+y8Anx9hBn3d+eWrt5Za3JWWuegBgG7jTFl7o6oRf26ODf9hRdeICEhgSFDhvDll19e8h3XFy9ezN/+9jeioqLo378/2dnZHDhwALBuKlu5cmWCgoJo06YN+/fvp0mTJuzZs4dHH32UhQsXljguS48ePXjttdd444032L9/P5UqXd1blCilPGvfvn18+OGHrFu3jiGtq/JwwDfU/PEPsO9Ha4E6HcHHl5T0HI6dtX5Ae3OtyVlpnYO6BZhe2AwRuQ+4Dzh/M9XizLj/1x4m/r4+F7yuFOB7wevwIP8LXlcLCbjgdc2wkocqjoiIOH8X8nNOnjxJ48aNz79u2rQpDz74IPfeey81atQgNTWViIiI8/Pbtm1LYmIio0aN+s32z52Patmy5QXT165de8EwH76+vuTn51O1alU2btzIokWLeP/995k5cyYff/wxfn5+OBwOgAtqcbfddhvdunVj/vz5DB06lP/+978MHDiwxHIrpbxbbm4uS5YsISEhgVqVg3iyZTJhP78D4XUpGD+Nt3bUJCJ5D/f0aUKvZtVZMLkvvj5lIzGd4/YalIgEADcAXxc23xgzxRgTbYyJrlGjhrvDuWShoaHUqVOHZcuWAVZyWrhwIb179wZg/vz554dy37lzJ76+vr8ZBvmRRx7hs88+Y+3ateenTZ06laNHjzJ06FDefffd89v46aefio0nJSUFh8PBmDFjePnll9mwYQMAkZGRJCYmAvDNN9+cX37Pnj00adKExx57jBtuuOH8cPRKqbJrz549fPDBByQkJNC9Wzfuq/QDYTu+ge4PwsNr8W09kl3H09mf+mtP4bKWnKB0alDXARuMMcdKYV9u8fnnn/Pwww/z1FNPAdYwGk2bNgXgiy++4IknniA4OBg/Pz+mTZuGr6/vBevXqlWLr776iqeffprjx4/j4+ND3759GT16NH/+8595/PHH6dChA8YYIiMjmTdvXpGxHDp0iEmTJp2vLZ0b9PDpp5/m5ptv5osvvrighjRjxgymTp2Kv78/tWvX5oUXXriqx0YpVXpycnJYvHgxGzZsILKKD2Mm3EmDyCawJ4jkrABeTPDn9dwAagTCv2+/Bj/fsn0lkduH2xCRr4BFxphPSlpWh9vwDD3GSnm/Xbt2MXfuXDLOnmZ8w+M0OzQL6fcc9HkSgN0n0rllSjz/uiWKnk2rezjaS+OR4TZEJBgYDNzvzv0opVR5lZ2dzaJFi0hKSqJ95XSur7Ic//27oPUNzJN+bFu0nWeGtqJpjVBinxtIgF/ZrjU5c2uCMsZkAhElLqiUUuo3fvnlF+bNm0d6ejq3NTxmDYlRuQHcOgNaDmPD3J/ZcvgUeQUO/H19ylVyAr2ThFJKeZ2srCwWLVrExqQk6tSsxi233ENdc4QzCeE8engoz4d3pjXw7LCWBPr5lJlu45dKE5RSSnmRHTt2MG/ePCqlH+CxyuupXK8zUqcOSF2o2oHDH67h6NlsWtcJJ8jft+QNlmGaoJRSygtkZmaycOFCtm3awLCQrVwjPyI5IazIuImpnyXw3wnRVA72Z8kTfcttjelimqCUUsrDfv75Z3744QeqZO7hyaBlVMo4Ch1vhcEvc2BTBpWTT5OT7yDI37fCJCfQ4TZKVNJwGxMnTqRevXrk5OQAF96o9WK+vr5ERUXRtm1bOnbsyNtvv33+eqaVK1dSuXJloqKizj+WLl0KWPfra9u2LR06dCAqKuqCC37z8/OpXr06zz///NUuulLKzTIyMvj666/5euZMwsLCuOHWe/CvXIs3av2d5a1fgtAa3NWjEW/fHFXum/MKozWoq8DX15ePP/6YBx98sNjlKlWqRFJSEmDdBf22227jzJkzvPTSSwD06dPnNxfpxsXFMW/ePDZs2EBgYCApKSnk5uaen7948WJatmzJzJkzee211yrUryulyipjDFu3bmXhD/PpkLWGh2rkUO138/D18yM3cgVrpsTTNMP77zbublqDugoef/xx3nnnHfLz811ep2bNmkyZMoX33nuP4i6WPnLkCNWrVz9/X77q1atTt27d8/OnT5/O5MmTadiwIfHx8ZdfCKVUqUhPT2fmzJms/eZdJuV9yhCzEl//QB75fA25+Q4C/H357qGejO2sIw+UvRrUJyN+O63tjdD1XsjNhGnjfjs/6jbodDtkpMLMuy6cN2n+FYfUsGFDevfuzRdffMH111/v8npNmjTB4XBw/PhxAH788UeioqLOz//2228ZMmQIf/3rX2nRogXXXnst48ePp1+/foDVFXXZsmV89NFHnD59munTp58fc0op5V2MMWzevJkVC76jb/YSOrEJE1QXbvqcn+jGLwu2c+xsNg2qBVfoWpMzrUGVoKThNs75wx/+wN///vfz55Rc5Vx76tOnD0lJSecfTZs2JTQ0lMTERKZMmUKNGjUYP368NeYLMG/ePAYMGEBwcDBjxoxh9uzZFBR437DNSlV0aWlpfPXVV8yePZuq1SLoEJpKYv07+abHbGgzikFtarPo8b40qKYjbDsrezWo4mo8AcHFzw+JuOQakyvDbQA0a9aMqKgoZs6c6fK29+zZg6+vLzVr1mTbtm1FLufr60v//v3p378/7du357PPPmPixIlMnz6d2NjY850yUlNTWbFiBddee63rBVRKuY0xhqSkJH5a8DnReWtpfO3f6NqjN5I/iXc+30z9I7mca/Mp6zd2dYeyl6BKmfNwG4MGDTo/3MbkyZN/s+wf//hHRowopAmyECdOnOCBBx7gkUceKbY6v2PHDnx8fGjevDlgjbLbqFEjzp49S0xMDAcPHjx/fuqTTz5h+vTpmqCU8gJnzpxh0ZyZNNozlYlsxBFUlXd2n6BVp3yqBAfz3wnRFbJn3qXQBOWC4obbcNa2bVuuueaa82M0XSwrK4uoqCjy8vLw8/Pjzjvv5Mknnzw//+JzUH/6059o3Lgxjz76KKdPn8bPz49mzZoxZcoUZs2axcCBAy8Y1HDUqFE8++yz5OTkXDBdKVV6jDFsSEzk8MJ3GJ6/ghCyoMs97GrzGJ9/uo1uyWfo26KGJicXuH24jUuhw214hh5jpa6OU6dOMXfuXPbt2c3DAd8gwVVY0fx5xowYCUB6Tj6hgVovuJhHhttQSqmKwBjDhjUryVn2Oql+3Rk+8gaqtXyQPy4+yoadZ7k+30GAn48mp0tU7NESkR7AHUAfoA6QBWwB5gNTjTFn3B6hUkp5sZOpqWyd/mc6pcwmhCxO1BtGRGRrJCyEP4ysTkA5HAajtBR51ERkAXAPsAgYhpWg2gB/AoKAOSJyQ2kE6U3NkOWNHlulLo/D4WDjomlkvNeHPinTkKqRnLptIX/a05Zl244BEBrop8npChRXg7rTGJNy0bR0YIP9+IeIuH1c4aCgIFJTU4mIiNCL164yYwypqakEBQV5OhSlypQTJ07w/fff0+PgB0T4nGFh5PMMu/NZQnx8WPZ0NjXD9Dt1NRSZoApJTpe1zJWqX78+ycnJnDhxwt27qpCCgoKoX19vqaKUKxwF+ez6+kWW7swkPbA2MvwtvjwdzrtxqXRKz6VWeJAmp6uoxDN2IjIaeAOoCYj9MMaYcDfHBoC/v/9vLopVSqnSlrpxMQXznqRF3kGSg4fjO/JJWrepT5P8Akb3KqBaSICnQyx3XOlS8iZwvTGm6FsdKKVUOVVw5gjHpz9MnaPLSJdQ9nX5C3/e1JHeP5+kX5v6BPr5Euin1zS5gysJ6pgmJ6VURXT48GGOTn2ADpk/sihoOD3v+yeR1Wrxda8s6lTWpjx3cyVBJYjIDOA7IOfcRGPMLHcFpZRSnpT/yzJ+2rKdBVtSqRbSnZ0dJ/GnhEBmpgfQqRrUrVLJ0yFWCK4kqHAgExjiNM0AmqCUUuXLqf1kfvckwfuX4m9a4NP4Be65ZTCBgYH07JeldxsvZSUmKGPMpNIIRCmlPCY3k4LV/4DYf+FnDLGBA3kz8H4CsysTGBiIiGhy8gBXevHVB94FemHVnGKAycaYZDfHppRSpeLE8g+oEf8Wqx1RZHS8h0HXj+ejLAdVQ/z1+ksPcqWJ7xPgSzg/bMkd9rTB7gpKKaXc7ugWclP3s3B3AUkb0qgR/ChvnuzBu807ERAQQG3tNe5xriSoGsaYT5xefyoij7spHqWUcq/Mk7D8FUziJ5yiOt8UPMadfXrTv39/hp/NpVFEiKcjVDZXElSKiNwBTLdf3wqkui8kpZRyg4J8SPwEs/wVTPZZ1tOBf8hE9gfWo++Agfj7+dIowt/TUSonriSou4H3gHewzkGtsacppVSZYfbFID88zc80ZxFj6TzgBt7r1JVAfz+90NZLudKL7wBQKnctV0qpq+rUfjiUQFqjIcxff5ST5jbezh3OvT0b0K9flKejUyUoMkGJyLPGmDdF5F2smtMFjDGPuTUypZS6XLkZEPMOJvb/yJMAJuf/nqb+Zxgw9E4WNmtP0xqhno5QuaC4GtS52xslFLNMsUSkCvBfoB1WkrvbGBN3udtTSqliGQNbvoUlL8DZQ+wNjeaV08OIcTTi93d3oUXD2p6OUF2C4obbmGv//ewKtv8vYKExZqyIBAB6pZtSyn1Sd2Nm3cvxwEi+kklk5tXid9f355WWbalbRf/9lDXFNfHNpZCmvXOMMcWelxKRcKAvMNFePhfIvawolVKqKOknYMcP0HkCxx3hxFR7mD8f6kTrqj58/OAgwsNLZWQg5QbFNfG9dYXbbgKcAD4RkY5AItYdKDKcFxKR+4D7ABo2bHiFu1RKVRgFebBuCqx8A5OXyesb/Mg/sodKlSrz9vWNGdQ9Cj9fHW69LBNjiqwkXdmGRaKBeKCXMWatiPwLOGuM+XNR60RHR5uEhMs+5aWUqih2LYOFv4eUX8iu35u/pfbjs1NteLxNHveMGUJIiF5sW5aISKIxJvri6cU18W2m+Ca+DiXsMxlINsastV9/A/zehViVUqpoWadh5gSyAqqyqN4zbDpUQGioH/8ZHcm1Xdt5Ojp1FRXXxDfySjZsjDkqIgdFpKUxZgcwCPj5SraplKqgcjMg6Uvocg9UqkLyoPe5eW42BScNf+4ZyuDB1pAYqnwprhff/quw/UeBaXYPvj2ADt2hlHKdMbB1Niz+E5w9xJwjVchzBLB1UxLDq9di3MihtGzW2NNRKjcprokvxhjTW0TSsJr6xPmvMabErjHGmCTgN+2KSilVouPb4IdnYN+PmNrtWd74OSbHBdM/YA939utNv3798PNz5W5tqqwqrgbV2/4bVnrhKKUU4HDAV7dTkHmSLe3/yI68Bmzb9At31y3gvpvHUbu2XnBbEbj080NErgF6Yw9YaIz5ya1RKaUqHmPg5znQYhj4B2HG/I8Hvt1HTIJwS8jPXHvttfTo0QMfH+06XlG4MqLuC1iDFc6yJ30qIl8bY15xa2RKqYrj+Hb44WnY9yO/dHkJaX8Lscs3UiX1MA82bcAdox+gWrVqno5SlTJXalC3Ap2MMdkAIvI3YAOgCUopdWVy0mHVGxD/AQSEcmrAG4xYWI/W8T/QK/QEt914HVFRUTrsegXlSoLaBwQB2fbrQGC3uwJSSlUg3z0A2+ZyrOk4HD0mM2dpLAP9d9K/bQNGDh9HWJieAq/IiuvFd26YjRxgq4gssV8PBmJKJzylVLlzaj8EhEBIdej/B2b63cBz60MYvfsH6oX788Rtw2nVqpWno1ReoLga1Ll7DiUCs52mr3RbNEqp8is/F+Leg1VvktNmDCcG/J3stAD2HTjGgAAH/Tu3ZfDgawkKCvJ0pMpLFNfN/EqG2VBKqV8diIe5j8OJbZhW13Pnzn6c3r6MXnkbiIiI4C+/u5FGjRp5OkrlZUoabmMK1nhOeRfNa4I1jMY+Y8zHbo1QKVW2JX4Gcx8jP6wePrdMZ3NOParviqVeQSZ9+/alT58+esGtKlRxn4p7gSeBf4rISayhM4KAxsAu4D1jzBz3h6iUKnOMgZw0CAqH5kM43O5+hm3ozohlZwlKWU/n+vW5/vqx1KxZ09ORKi9WXBPfUeBZ4FkRiQTqAFnAL8aYzNIJTylV5pw+APOehLwsTo2bReXQWuysdQNN/XbgfzqV4cOHEx0drV3HVYlcqlcbY/ZhdTdXSqnCOQqsAQSXvQzAglr38Pq7qxhfdS8px44yvk1Lhg8fpyPcKpdpw69S6sqdPghfT4BDiTiaDSZ/6JvsWLqDWvv3kuGfzs0330zr1q09HaUqYzRBKaWuXHA18h2Gt0KewVS6lkrTvufMmTNM7B7NoEGDtOu4uix610Wl1OVJToCvbsfkZkJACFm3zuEnac+ujfEEBAQwadIkRowYoclJXTZXbhbbC3gRaGQvf248qCbuDU0p5ZVyM2HFqxD/ATmVavHou7O4pUdL1q1eRvv8fPpe25devXrh6+vr6UhVGedKE9//gCew7ihR4N5wlFJebV8MzHkETu2F6LvZ1PAetszaybxFy+jYpA4jR44kIiLC01GqcsKVBHXGGLPA7ZEopbybMbD0RdJz8pnf+n1qBNclds4sRlUKZOjQYXTs2FG7jqurypUEtUJE/o41HlTOuYnGmA1ui0op5T32xUKNVhASAeM+5aXZvxC39SSDfGLoFNWBwYMHExIS4ukoVTnkSoLqZv+NdppmgIFXPxyllNfIzYRlf4W1/2ZT/VuRwX9l14b1BO3bzM3VqzJy5B00aaKnopX7lJigjDEDSiMQpZQXObAWvnsQTu4mK+pufrehD40+mU9H32QG9uuj989TpcKVXnyVgb8Afe1Jq4C/GmPOuDMwpZSHbJyB+e4BMoJqkzfqC75LSqW/bKdNozqMHPkANWrU8HSEqoJw5SfQx8AW4Gb79Z3AJ8BodwWllPIAY0AEmvTn53rjuGXXYAbN+YW6wQ4del15hCsJqqkxZozT65dEJMlN8SilSpvDAfEfkL9zKfuGfopkpLMkox0DAvfSP6qFdoJQHuNKgsoSkd7GmBg4f+FulnvDUkqVitMH4LuHYN+PbAjszjMfLqY/26hRPYInJo6jcePGno5QVWCuJKgHgc/sc1ECnMQarFApVVYZA5u/xsx/Eoxhb/un+PLnynSUZAb270+vXr20E4TyOFd68SUBHUUk3H591t1BKaXcLD+bgmWvsCWnLl9Wup3gLafp3KQaw4cP1ztBKK9R3JDvdxhjporIkxdNB8AY87abY1NKXW3712DqdiLX4UNs5FO8k5hLS0cOo0ePpl27dtoJQnmV4mpQ586KhhUyz7ghFqWUu+TnWBfdxr3H//xu4UhgaxyZZ3ighw6HobxXcUO+f2Q/XWqMiXWeZ3eUUEqVBce3wbf3wLEtJIX05ZOTvRleOZe7bxtHvXr1PB2dUkVy5Szou8A1LkxTSnmbLbMomPUAmQQx32c0e/Nb8I9RzenatSs+PjocnPJuxZ2D6gH0BGpcdB4qHHBpoBcR2QekYQ3TkW+MiS5+DaXU1XQgN4xkRxv+nHMH915TlUeGDSEsrLBWe6W8T3E1qAAg1F7G+RN9Fhh7CfsYYIxJuYzYlFKXY/t89sXP4Qe/oZzYvYWwqmN577p+tG7R3NORKXVJijsHtQpYJSKfGmP2l2JMSqnLkZOOY8Fz+CRNJcPRiEWOzjw5WK9pUmWXK5/aTHs8qLbA+a4+xhhXhtswwGIRMcBHxpgpFy8gIvcB9wE0bNjQpaCVUhc5uI6M6ZMIzjzEj3RlfcMJfHTDMGrXrO7pyJS6bK4kqGnADGAk8AAwATjh4vZ7GWMOi0hNYImIbDfGrHZewE5aUwCio6O1+7pSlyjjdArmkzGcLgjgP4EPMmz0BJ5o2VKvaVJlnisJKsIY8z8RmezU7LfKlY0bYw7bf4+LyGygK7C6+LWUUq4oOLGTFdtOkBj3IxHmeo42GswTt15HSCW9pkmVD64kqDz77xERGQEcBuqXtJKIhAA+xpg0+/kQ4K+XHalSyuIo4PTC1wle9w7r88dRo1lPRo24W8dpUuWOKwnqFftGsU9hXf8UDjzhwnq1gNl2M4Mf8KUxZuHlBqqUgoxDP5P15USqZ+xgs08bKrW7nonjrsPPV69pUuWPKzeLnWc/PQO4PPy7MWYP0PEy41JKOXE4HPzy3d9psPEfBCNsaf4wLca+QHu9RZEqx4q7UPddirnnnjHmMbdEpJS6wMGDB1mwYAF+h3cR5dOcvT1eYcwQl38rKlVmFVeDSii1KJRSv5GRnsbaz/7AniMpHK/SnRvHTqZt27Zco73zVAVR3IW6n5VmIEopi8PhYPPquVRZ/ScGOg4Q7N+RLmNuoV3jWp4OTalSVeI5KBFZQSFNfS5eqKuUugQH9u0lftpLjMqdh/j4kjbgVbr1eQjRG7uqCsiVXnxPOz0PAsYA+e4JR6mKKS0tjaVLl3Jg42oeZC6bAqKIeuhTwqo28HRoSnmMK734Ei+aFOvqhbpKqeIVFBSwdOVqEld9R4pvA0b2vZ78FnfTuW5brTWpCs+VJr5qTi99gM5AbbdFpFQFsXv3bpK+/ze9z8xiqE8q8675mIEDteVcqXNcaeJLxDoHJVhNe3uB37kzKKXKs1OnTvHlt9/R9MBXjPGJJy+kDrkjZzCy9TBPh6aUV3Glia9xaQSiVHmXm5tLbGwssTEx3Jk/jXpyjLOd7if8ur9AQIinw1PK67jSxBcEPAT0xqpJxQD/NsZkuzk2pcoFYwxbtmxhxtwfOJnty6CObajW9A2yKtcnvHFnT4enlNdypYnvc6xh29+1X98KfAGMc1dQSpUXR48eZdEPc6l3YDZ/Muv4pspExox5uuQVlVIuJaiWxhjne+qtEJGN7gpIqfIgMzOTRUuXs3n9Sh7ym0V1UslsPoJbRjzu6dCUKjNcSVA/iUh3Y0w8gIh0A2LdG5ZSZVNBQQHr169n1apVtM5cwwu+K8msVA9u+obg5oM9HZ5SZYorCaobcJeIHLBfNwS2ichmwBhjOrgtOqXKkF27djFn/iL2p6bRtUV9+rS7j2P72lFr+B8hINjT4SlV5riSoLTvq1LFSE1NZfHixWTsWMkNrGGtT1vG3Pw0lQL8IGqEp8NTqsxypZv5fhHpCPSxJ/1ojNFzUKrCy87OZtWqVayJi2OUz3KuYSP5wbWo1PMGKzkppa6IK93MJwP3ArPsSVNFZIox5t1iVlOq3HI4HGzYsIEVK1ZQI2MbT5iFhDmyoeej+PV7jvqBYZ4OUalywZWfeb8DuhljMgBE5A0gjl+7nStVYezdu5f5Cxax9Wga3ZrUYPj1vclefoyC614lonGUp8NTqlxxJUEJUOD0usCeplSFkZqaypIlSzi0PZEu8hMtjYN2N86nZpVK0Gq+p8NTqlxyJUF9AqwVkdlYiWkU8D+3RqWUlzh3nmlhXBJDfeIZ57sGHwzJUfdQJzzA0+EpVa650knibRFZiXWrI4BJxpif3BqVUh7mcDhITExkxYoVBGce5EmzgAaOE9BqJAx5hQbV9BaVSrnbpXQ1EsCBNu+pcswYw65du5i3cAmbjufQv1kthvUfRaUFv5A14CMqtRzk6RCVqjBc6cX3AtZ9977FSk6fiMjXxphX3B2cUqXp2LFjLF68mKO7t9DZZzOD5DD+1y6nVr1q8MAiT4enVIXjSg3qVqDTubuXi8jfgA2AJihVLqSnp7N8+QrmJ/7Cdb7ruNXvR3wLsjnR7k5q1gjydHhKVViuJKh9QBBwbniNQGC3uwJSqrTk5eWxZs0aYmNjCclL5Y8yl4aOY9BkMAx9lZo1Wno6RKUqNFcSVA6wVUSWYI0HNRiIEZH/AzDGPObG+JS66owxbNy4kdlLfmTrGV/Gtm/G4AF3E7Qgmfzud+PXcqinQ1RK4VqCmm0/zlnpnlCUcr+9e/eyePFizh7Zw9CAzTzou42TXWOIqFkbJszwdHhKKSeudDP/rDQCUcqdjh8/zqIlS5m/7RTjAtdwj98KfPJzyOo8idp19NZESnkjvaOlKtfS0tJYsWIFSUlJhPvl8w//r6hXcAxaDIMhrxBcvbmnQ1RKFUETlCqXcnJyiIuLY9bqJH7JDuGBnl0YMqAv/svSoM1IaKbXMynl7TRBqXKloKCADRs2sHLlKsg4we9Ct9PcEc+RlisJDgmBG97xdIhKKRcVmaBEZC5Wr71CGWNucGUHIuILJACHjDEjLzlCpVxgjGH79u0sWbqM+UeDmRCynVv8F+CTmY2j2z00rV/b0yEqpS5RcTWot+y/o4HawFT79a1Y10a5ajKwDQi/1OCUcsWBAwdYtGQph5MPUiuiMp8Ev0Pd3APQbDAMfQ2fGi08HaJS6jIUmaCMMasARORlY0xfp1lzRWS1KxsXkfrACOBV4MkrCVSpi504cYJly5ax/Ocj7MivyvPXXceQXtH4xORB7Y7QYoinQ1RKXQFXzkHVEJEmxpg9ACLSGKjh4vb/CTwLFNmPV0TuA+4DaNiwoYubVRXZ2bNnWblyJYk/baRKQAHP1ttD5JH5HK86Gx8fH+j7jKdDVEpdBa4kqCeAlSKyx34dCdxf0koiMhI4boxJFJH+RS1njJkCTAGIjo4u8pyXUllZWcTGxhIfv5blWQ25Oew09/vMRo6chGvupG5ka0+HqJS6ily5UHehiDQHWtmTthtjclzYdi/gBhEZjnUvv3ARmWqMuePyw1UVUV5eHmvXrmVlzBoKcrLo0L49E/f+i/ppSZiGPeC6N6BOR0+HqZS6yorrxTe6iFlNRQRjzKziNmyMeR543t5Wf+BpTU7qUjgcDn766SdWrVrF7tMONhfU5oWxPbm2UzNIOAOBYUi7MSA6RJlS5VFxNajri5lngGITlFKXyxjDzz//zIoVKziacopm9apzZ+R+Km9+k5OZ7wDNIHqSp8NUSrlZcb34JomIDzDWGDPzSnZijFmJ3mRWlcAYw+7du1m+fDlHjhwhUVrQNegUEzI+QA4dgDajqN2mt6fDVEqVkmLPQRljHCLyCHBFCUqpkiQnJ7Ns2TJ27j1A9Srh3HjjjUxa/xYNk7/HhLeBCXOhcd+SN6SUKjdc6cW3RESeBmYAGecmGmNOui0qVWEcO3aM5cuX88svv5AXVIUfTUue7t2Zjh2bQuAtcLYv0nkS+OpduZSqaFz51t9t/33YaZoBmlz9cFRFkZqaysqVK9myZQu+gZUY2L8f3fx+Jn/5k5w59hDwB2g1wtNhKqU8yJVu5o1LIxBVMZw5c4ZVq1aRlJSEn58fZ+p1x3H8Z3pt+T0+J7YR0LgvwdE3ejpMpZQXKDFBiYg/8CBw7gTASuAjY0yeG+NS5UxaWhoxMTEkJibiMNCpczQD+vXl9MLXqJ/8Po68RjB+KrQaqd3GlVKAa018/wb8gQ/s13fa0+5xV1Cq/MjMzCQ2NpZ169ZRUFBA6/ad+HKPL3X9axMaGkpo99FQqzo+3R8C/yBPh6uU8iKuJKguxhjny/SXi8hGdwWkyofs7Gzi4uKIj48nNzeXVm07MHhAH6rtX8CwrS9w5si1wH+gfrT1UEqpi7iSoApEpKkxZjeAiDQBCtwbliqrcnJyiI+PJy4ujpycHFq3bk12rfYsWbWY0cdvhOObCavflbBBD3g6VKWUl3MlQT0DrLBvFitAI0Av41cXyM3NZd26daxZs4asrCyat2hJz959iWxQl9Rl/+IuxwsUZNaFMf8DvT2RUsoFxd2L73EgFlgFNAdaYiUoV28WqyqAvLw81q9fT2xsLJmZmTRr1ow+ffvx/Pfb2R+7jedvqUtE59Hgm41vz0chINjTISulyojialD1gX9h3cV8E7AGK2EdBDRBVXB5eXkkJCQQGxtLRkYGTZo0oXOPPrRp0gCSpvGf0y+SLq2AQVClAfR/ztMhK6XKmOLuxfc0gIgEANFAT6yLdv8jIqeNMW1KJ0TlTfLy8khMTCQ2Npb09HQaN25M//792Z0VxJuff86HNWYRlLqV4AbdCB76sqfDVUqVYa6cg6oEhAOV7cdhYLM7g1Le5+LE1KhRI0bdOJrKNetSIyyQiPXTGODzMvl59WHsx9B2tJ5nUkpdkeLOQU0B2gJpwFqsJr63jTGnSik25QUuTkyRkZGMGTOGRo0aMfH9BdTzjee1B28lpMMNkHcSvy73gH8lT4etlCoHiqtBNQQCgZ3AISAZOF0KMSkvkJubS2JiImvWrLkgMaX7V6VRzQBkzf/x39N/JyekDsYxHgkMg56PejpspVQ5Utw5qGEiIli1qJ7AU0A7ETkJxBlj/lJKMapSlJuby/r161mzZg2ZmZk0btyYsWPH0qhRI5ZsPcLcaW/wRtU5VMpIxr/ZYPyHvAw+Pp4OWylVDpU0HpQBtojIaeCM/RgJdAU0QZUjOTk5rFu3jri4OLKysmjatCl9+/aFkOqkZuTQCOjviGdwwPs4QtvD6Heh6UBPh62UKseKOwf1GFbNqReQh9XFPA74GO0kUW5kZWWxdu1a1q5dS3Z2Ns2bN6dv377Ur18fYwyP/ONT6kgKUU8+jX/bG8D3C3xajdRak1LK7YqrQUUC3wBPGGOOlE44qrRkZGQQFxfH+vXrrXvltWpFnz59CKtWg+nrDjAp4Bf8V/+N99O/Jb9qM8Q8BT6+0OYGT4eulKogijsH9WRpBqJKx9mzZ1mzZg2JiYnk5+fTtm1b+vTpQ61atQBYk7iR8MUv4LfiR/ALgj5P4dfzMa0xKaVKnY6jXUGcOnWKmJgYNm7ciMPhoEOHDvTu3ZuIiAi+SUxGkpMZ27k+PaqepnvAGqTLfdDnSQit6enQlVIVlCaocu7EiRPExMSwefNmfHx8iIqKolevXlStWtVaIO0YoStfwOHjD52nIE36IU9u1cSklPI4TVDl1KFDh4iJiWH79u34+/vTvXt3evToQVhYGJuTz/Dnr3/gH3VWErjxM4YV5ME1d4Ex1t0fNDkppbyAJqhyxBjD3r17iYmJYe/evQQFBdG3b1+6detGcHAw1lUDUG3vHP5x+CkCjhRAx1uQPk9BRFMPR6+UUhfSBFUOGGPYvn07sbGxHDp0iNDQUAYPHkznzp0JDAzEGMPfps4nNMiPR8YOpV6r7jhSxiJ9n9bEpJTyWpqgyrD8/Hw2b95MbGwsqampVK1alZEjR9KxY0f8/PzIyS+Ao1uQmLd5dtdsfokYBAyFGi3wuenfng5fKaWKpQmqDMrJySExMZH4+HjS0tKoXbs2Y8aMoU2bNvjY3cGTYhaQvvQNevMTBITi0+tRWnV/2MORK6WU6zRBlSHp6emsXbuW9evXk5OTQ+PGjRk1ahRNmjRBRMjLy+V0poNqoUE0P7uGAt99nIp+lqr9H4JKVT0dvlJKXRJNUGVASkoKcXFxbNy4kYKCAtq0aUPPnj2pV6+etUBOOuanqaQsfodvaj7Kow88QsjAZ2DwH3ToC6VUmaUJyosdPHiQNWvWsH37dnx9fYmKiqJnz55Uq1YNgCMHdnJi2bt0OPodknMG/yod6dUm0lo5KNxzgSul1FWgCcrLOBwOduzYQVxcHAcPHiQoKIg+ffrQtWtXQkNDyckvIDffQYCvEDL9JmpmJpPRfCQh/SZTvUEXqnu6AEopdZVogvISeXl5bNy4kbi4OE6ePEmVKlUYNmwYnTp1IiAgAAryOBI7jR2L/0vOTZ8yNKoR/qPfJyWwDrUatvB0+EopddW5LUGJSBCwGmtUXj/gGx3k8LfS09NZv349CQkJZGZmUrduXcaOHUvr1q3Jd8ATnyxjYuBKupyYRZ20wwQE1SfVPwVoRKXm/dAzTEqp8sqdNagcYKAxJl1E/IEYEVlgjIl34z7LjOPHjxMfH8+mTZsoKCigZcuWdO/enfjjPsSk5NHWx4eAU7t55/BtBJhcaNIfrv8nEc0GE6F3FldKVQBuS1D2aLzp9kt/+2Hctb+ywBjDnj17iI+PZ9euXfj5+dG+YyeCG7RhcFRjyM9l1eL/IyA9Bfr9Dao1IaDfU9BmFNRs7enwlVKqVLn1HJSI+AKJQDPgfWPM2kKWuQ+4D6Bhw4buDMdj8vLy2Lx5M/Hx8Zw4cYLQ0FAGDBhAdHQ0/407xJczYuh2+HPCf57GhPRjULsDOBzWGEz9f+/p8JVSyiPcmqCMMQVAlIhUAWaLSDtjzJaLlpkCTAGIjo4uVzWstLQ0EhISzp9fql27Nj2uHcm0Hfn0b9SC4OBgJvgv45GgPyDrHNBsEHR9D5pdqwMEKqUqvFLpxWeMOS0iK4FhwJYSFi/zDh8+zNq1a9myZQsOh4NGTVvQokNnerRvTsaZVHaufp3cgyOg0UAqt+gN2Q9D9CSo1sTToSullNdwZy++GkCenZwqAdcCb7hrf57mcDjYvn078fHxHDx4kICAAKKjo+nWrRt3fL6Fa1bF0HP3O4RuncXD+dmQVx0YCLXbWQ+llFIXcGcNqg7wmX0eygeYaYyZ58b9eURmZiYbNmxg/fr1nD17lqpVq9Kky0C2ZIQxdGhHfHyEqQGvUu14PKSFQtRt0HkS1Ong6dCVUsqrubMX3yagk7u272lHjx4934yXn59PnYZNGDR4KO1atyR2xTxk/YccHPAhjaqHUe2am8BvPLQfB4Fhng5dKaXKBL2TxCUoKChg+/btrFu3jgMHDuDn50fHjh2p16IDk6euoWulb/BZ8T19UnfSOyAU4SgQBt0f8HToSilV5miCckF6ejqJiYkkJiaSlpZGlSpVCGzVlwYNGjKyZ1PMwfWs8H0I3+0F0KAb9H4faXsTBIR4OnSllCqzNEEVwRjDwYMHSUhIYOvWrTgcDqo3bMbIkSNpFp7LomnvkHo4Anq+idSNwrfPk1YTXo2Wng5dKaXKBU1QF8nNzWXz5s2sX7+eY8eOERgYSHR0NLtzgjm94RuaZn+Iz7FNDPPxszo7APj6w8A/eTZwpZQqZzRB2VJSUkhISCApKYmcnBwCq9Vlb/VuPHdjN1rXq8rZz28n3GceBdIRhr2BtB8LITq4hVJKuUuFTlDnOj0kJCSwb98+ThNMsybNmNTSh/ADS8nb8hc2HvwW6vUgfNifwPwR31ptPB22UkpVCBUyQZ05c4bExER++uknTqVlUr1KGNf2vIbtsd9w4/7/ELH7GPiHENh+JH2a1bBW0pu1KqVUqaowCcrhcLBr1y4SExPZuXMnxhiSA+vjXymMvz52Dz45Z+i+9l4K6veAa16FVsPx0V54SinlMeU+QaWlpbFhwwY2bNjA5lM+HDHh/KNlJi2yfsL30FqOh7cH7oVKVfF9Zie+eiGtUkp5hXKZoBwOB7t372bJmg38sDOdtn7HaNe0AY+GxtHu0Az8d+VDRDPo/zy12o8FH7FW1OSklFJeo1wlqKMpp/jgh0Tyj+4gMPMEdfzPcJfsIWzwC1zXqzNsCoLDla3rlep2AhFPh6yUUqoI5SpBzZg5k/iDhslhMQwJTsQ/8ximUihSN8NaoMM466GUUsrrlasENW5AJybPGIzJ80UaDYIO45GWwyEg2NOhKaWUukTlKkHVbd0VRv8XadIPQmt6OhyllFJXoFwlKECb8JRSqpzw8XQASimlVGE0QSmllPJKmqCUUkp5JU1QSimlvJImKKWUUl5JE5RSSimvpAlKKaWUV9IEpZRSyiuJMcbTMZwnIieA/Ve4mepAylUIx5tombxfeSsPaJnKivJQpkbGmBoXT/SqBHU1iEiCMSba03FcTVom71feygNaprKiPJbpHG3iU0op5ZU0QSmllPJK5TFBTfF0AG6gZfJ+5a08oGUqK8pjmYByeA5KKaVU+VAea1BKKaXKAU1QSimlvJLXJygR+VhEjovIFqdpHUUkTkQ2i8hcEQm3p0eKSJaIJNmPD53W6Wwvv0tE/k9ExBPlsWNxuUz2vA72vK32/CB7epksk4jc7vQeJYmIQ0Si7HlltUz+IvKZPX2biDzvtI5XlOkSyxMgIp/Y0zeKSH+ndbyiPHYsDURkhX3Mt4rIZHt6NRFZIiI77b9VndZ53o59h4gMdZruFeW61DKJSIS9fLqIvHfRtryiTJfNGOPVD6AvcA2wxWnaeqCf/fxu4GX7eaTzchdtZx3QAxBgAXBdGSmTH7AJ6Gi/jgB8y3KZLlqvPbCnHLxPtwFf2c+DgX1ApDeV6RLL8zDwif28JpAI+HhTeexY6gDX2M/DgF+ANsCbwO/t6b8H3rCftwE2AoFAY2C3t32fLqNMIUBv4AHgvYu25RVlutyH19egjDGrgZMXTW4JrLafLwHGFLcNEakDhBtj4oz1rn0O3HiVQ3XZJZZpCLDJGLPRXjfVGFNQxsvk7FZgOpT598kAISLiB1QCcoGz3lSmSyxPG2CZvd5x4DQQ7U3lsWM7YozZYD9PA7YB9YBRwGf2Yp/xa4yjsH5I5Bhj9gK7gK7eVK5LLZMxJsMYEwNkO2/Hm8p0ubw+QRVhC3CD/Xwc0MBpXmMR+UlEVolIH3taPSDZaZlke5o3KapMLQAjIotEZIOIPGtPL8tlcjYeO0FRtsv0DZABHAEOAG8ZY07i/WUqqjwbgVEi4icijYHO9jyvLY+IRAKdgLVALWPMEbD+4WPVAsGK9aDTaufi98pyuVimonhlmS5FWU1QdwMPi0giVhU4155+BGhojOkEPAl8abepF9bu6m3964sqkx9W9f12++9NIjKIsl0mAESkG5BpjDl3TqQsl6krUADUxWo6ekpEmuD9ZSqqPB9j/UNLAP4JrAHy8dLyiEgo8C3wuDHmbHGLFjLNFDPdYy6hTEVuopBpHn+vLoWfpwO4HMaY7VhNX4hIC2CEPT0HyLGfJ4rIbqwaSDJQ32kT9YHDpRlzSYoqE1bsq4wxKfa8H7DOI0yl7JbpnFv4tfYEZft9ug1YaIzJA46LSCwQDfyIF5epmO9SPvDEueVEZA2wEziFl5VHRPyx/pFPM8bMsicfE5E6xpgjdlPXcXt6MhfW5M/F71WfvUssU1G8qkyXo0zWoESkpv3XB/gT8KH9uoaI+NrPmwDNsU7AHwHSRKS73YvlLmCOR4IvQlFlAhYBHUQk2D6/0Q/4uYyX6dy0ccBX56aV8TIdAAaKJQToDmz39jIV810KtsuBiAwG8o0xXve5s2P4H7DNGPO206zvgQn28wn8GuP3wC0iEmg3XTYH1nlTuS6jTIXypjJdNk/30ijpgfUL+wiQh/WL4HfAZKyeLb8Af+PXO2KMAbZitZ9vAK532k40Vnv7buC9c+t4e5ns5e+wy7UFeLOclKk/EF/IdspkmYBQ4Gv7ffoZeMbbynSJ5YkEdmCdoF+KNRyCV5XHjqU3VrPVJiDJfgzH6u26DKvWtwyo5rTOH+3Yd+DUq81bynWZZdqH1QEm3X5v23hTmS73obc6Ukop5ZXKZBOfUkqp8k8TlFJKKa+kCUoppZRX0gSllFLKK2mCUkop5ZU0QSnlRvZ1UTEicp3TtJtFZKEn41KqLNBu5kq5mYi0w7pGqhPgi3VdyzBjzO7L2JavMabg6kaolHfSBKVUKRCRN7FuJhti/22ENdSIH/CiMWaOfWPQL+xlAB4xxqwRayymv2BdZBtljGlTutEr5RmaoJQqBfZtgzZg3Yx1HrDVGDNVRKpgjdnTCevuAQ5jTLaINAemG2Oi7QQ1H2hnrCEilKoQyuTNYpUqa4wxGSIyA+tWNDcD14vI0/bsIKAh1o083xNrdOECrBsdn7NOk5OqaDRBKVV6HPZDgDHGmB3OM0XkReAY0BGrA5PzAHQZpRSjUl5De/EpVfoWAY/ad5hGRDrZ0ysDR4wxDuBOrA4VSlVYmqCUKn0vA/7AJhHZYr8G+ACYICLxWM17WmtSFZp2klBKKeWVtAallFLKK2mCUkop5ZU0QSmllPJKmqCUUkp5JU1QSimlvJImKKWUUl5JE5RSSimv9P+fvsfNxiKulQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -828,22 +818,30 @@ "source": [ "# Solution\n", "\n", - "results = run_simulation(system, growth_func_quad2)\n", - "plot_results(results, 'Quadratic model, alternate parameters')" + "results2 = run_simulation(system, growth_func_quad2)\n", + "results2.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Quadratic Growth Model, alternate parameters')" ] }, { "cell_type": "markdown", - "id": "early-mortgage", + "id": "ignored-architect", "metadata": {}, "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." + "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes.\n", + "\n", + "Hint: If there are too many labels in the legend, you can plot results like this:\n", + "\n", + "```\n", + " results.plot(label='_nolegend')\n", + "```\n" ] }, { "cell_type": "code", "execution_count": 24, - "id": "domestic-ukraine", + "id": "intermediate-kazakhstan", "metadata": {}, "outputs": [ { @@ -866,18 +864,28 @@ "\n", "for p_0 in p0_array:\n", " system.p_0 = p_0\n", - " results = run_simulation(system, growth_func_quad)\n", - " plot(results, label='_nolegend')\n", + " results3 = run_simulation(system, growth_func_quad)\n", + " results3.plot(label='_nolegend')\n", "\n", "decorate(xlabel='Year',\n", " ylabel='Population (billions)',\n", " title='Projections with hypothetical starting populations')" ] }, + { + "cell_type": "markdown", + "id": "positive-enforcement", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "Explain the difference between the Pandas and Matplotlib `plot` functions." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "commercial-respondent", + "id": "described-funds", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap08.ipynb b/jupyter/chap08.ipynb index 49664fb6..92c864d6 100644 --- a/jupyter/chap08.ipynb +++ b/jupyter/chap08.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "sophisticated-translation", + "id": "external-reward", "metadata": {}, "source": [ "# Chapter 8" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "amino-creation", + "id": "compound-announcement", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "korean-spine", + "id": "tropical-medicine", "metadata": { "tags": [ "remove-cell" @@ -41,18 +41,16 @@ " import pint\n", "except ImportError:\n", " !pip install pint\n", - " import pint\n", " \n", "try:\n", " import modsim\n", "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" + " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "rental-constitution", + "id": "chicken-emphasis", "metadata": {}, "source": [ "In the previous chapter we developed a quadratic model of world\n", @@ -65,7 +63,7 @@ }, { "cell_type": "markdown", - "id": "ambient-concentration", + "id": "global-international", "metadata": {}, "source": [ "Here's the code that downloads the data." @@ -74,7 +72,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "portable-heather", + "id": "necessary-factor", "metadata": {}, "outputs": [], "source": [ @@ -88,16 +86,16 @@ }, { "cell_type": "markdown", - "id": "brave-championship", + "id": "designed-entrance", "metadata": {}, "source": [ - "And reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." + "And here's the code that reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." ] }, { "cell_type": "code", "execution_count": 3, - "id": "apart-waste", + "id": "changed-desktop", "metadata": {}, "outputs": [], "source": [ @@ -109,7 +107,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "powerful-heather", + "id": "metallic-inventory", "metadata": {}, "outputs": [], "source": [ @@ -121,7 +119,7 @@ }, { "cell_type": "markdown", - "id": "pending-alliance", + "id": "further-armstrong", "metadata": {}, "source": [ "## Generating Projections" @@ -129,7 +127,7 @@ }, { "cell_type": "markdown", - "id": "colored-framework", + "id": "concrete-lightning", "metadata": {}, "source": [ "Now let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", @@ -140,20 +138,13 @@ { "cell_type": "code", "execution_count": 5, - "id": "acute-compiler", + "id": "extraordinary-shade", "metadata": {}, "outputs": [], "source": [ "from modsim import TimeSeries\n", "\n", "def run_simulation(system, growth_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " growth_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", " results = TimeSeries()\n", " results[system.t_0] = system.p_0\n", " \n", @@ -167,7 +158,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "northern-seafood", + "id": "indirect-russia", "metadata": {}, "outputs": [], "source": [ @@ -178,7 +169,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "stuck-influence", + "id": "collaborative-schedule", "metadata": {}, "outputs": [], "source": [ @@ -189,7 +180,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "covered-suicide", + "id": "comfortable-compression", "metadata": {}, "outputs": [], "source": [ @@ -202,7 +193,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "occasional-denmark", + "id": "working-cleveland", "metadata": {}, "outputs": [], "source": [ @@ -214,7 +205,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "available-microwave", + "id": "sophisticated-adult", "metadata": {}, "outputs": [], "source": [ @@ -225,7 +216,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "arranged-sailing", + "id": "broken-windsor", "metadata": {}, "outputs": [], "source": [ @@ -235,7 +226,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "generous-renewal", + "id": "latest-function", "metadata": {}, "outputs": [ { @@ -314,7 +305,7 @@ }, { "cell_type": "markdown", - "id": "promising-fantasy", + "id": "outer-ensemble", "metadata": {}, "source": [ "And here are the results." @@ -322,13 +313,13 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "prostate-brush", + "execution_count": 13, + "id": "portable-pottery", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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CZgZgwYN4ujRoxw7dowFCxYAMH78eM6fP8/Fixd57733WLhwIQDTpk379DB57dq15OTkcN999wFw7do1OnToEMArE5G6qLi4mNzcXA4dOsRHH33EtWvXaNCgAd27d2fIkCH07duXtm3bxkUP4TpRoCI50omWRo0afXq/QYMGnz5u0KABZWVl3HHHH77FFb/4qv4AnHM8++yzfO9734tSYhGpby5evMiHH37IwYMHOXbsGKFQiCZNmtCnTx/69OlD7969AztKqk6dKFDxbMyYMbzxxhv83d/9HRs2bCA5OZmWLVt+Ov1b3/oWK1as4MKFCwBMmDCBGTNm8JWvfIUOHTpQUFDA5cuX6d69e8CvREQSSUFBAfv37+fDDz/k5MmTACQnJzNixAjuvvtuunbtGrNzSTWlAhVlL7/8Ms8//zxpaWk0bdqU1157DYCXXnqJOXPmMHToUMaOHUu3bt0A6N+/P6+88gqTJk0iFAqRlJTEv/7rv6pAiUi1nHOcPXuWAwcOcODAAU6fPg1ASkoK48ePp3///rRr1y7glLfGwnuPxav09HRX+YKFBw4c4J577gkoUXzReyFSf50+fZq9e/dy4MABzp8/D0C3bt2455576NevH61btw42YATMLMc5l155etSOoMzsVWA6cMY5N9Cf9o/AI0ApkAs875wrjFYGEZG66MKFC+zdu5c9e/Zw9uxZzIzU1NRPm+9atGgRdMRaEc0mvl8DPwf+K2zaauCbzrkyM/sB8E3gr6OYQUSkTrh8+TL79u1j7969n55Tuuuuu5g6dSr9+/enWbNmASesfVErUM6598ysR6Vpq8IeZgIZt7mNuOgKGaREaKIVkZopKSlh//797Nmzh6NHj+Kco1OnTjz00EMMGDAgIZrvbkeQnSReAN680UwzexF4Efi0A0G4xo0bc/78+Xp9yY2K60HFY/dQEamZUCjE0aNH2blzJwcOHKCsrIy2bdsyevRoBg4cSPv27YOOGDOBFCgz+1ugDHjjRss45+YB88DrJFF5fteuXcnLy/v0m8/1VcUVdUUksZ0/f55du3axa9cuLl26ROPGjRk8eDD33nsvXbp0qZf/iMe8QJnZs3idJya422ifSkpK0lVkRSShFRcXs2/fPnbt2sWJEycwM3r16sWkSZO4++67q/yif30S01dvZlPwOkWMdc5djeW2RUTigXOO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\n", "text/plain": [ "
" ] @@ -340,14 +331,17 @@ } ], "source": [ - "from modsim import plot\n", + "from modsim import decorate\n", "\n", - "plot(results, color='gray', label='model')" + "results.plot(color='gray', label='model')\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Quadratic Model Projection')" ] }, { "cell_type": "markdown", - "id": "killing-relief", + "id": "macro-carroll", "metadata": {}, "source": [ "According to the model, population growth will slow gradually after 2020, approaching 12.5 billion by 2100.\n", @@ -395,7 +389,7 @@ }, { "cell_type": "markdown", - "id": "opposed-folks", + "id": "small-seminar", "metadata": {}, "source": [ "## Projections" @@ -403,7 +397,7 @@ }, { "cell_type": "markdown", - "id": "advisory-sheffield", + "id": "greater-illness", "metadata": {}, "source": [ "From the same page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." @@ -411,8 +405,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "spoken-calculation", + "execution_count": 14, + "id": "precious-contribution", "metadata": {}, "outputs": [ { @@ -508,7 +502,7 @@ "2020 7.758157e+09 " ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -520,7 +514,7 @@ }, { "cell_type": "markdown", - "id": "hispanic-episode", + "id": "coated-smoke", "metadata": {}, "source": [ "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", @@ -530,8 +524,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "corrected-denial", + "execution_count": 15, + "id": "headed-tuner", "metadata": {}, "outputs": [], "source": [ @@ -540,7 +534,7 @@ }, { "cell_type": "markdown", - "id": "explicit-tiffany", + "id": "ceramic-scroll", "metadata": {}, "source": [ "The following function plots projections from the U.N. DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." @@ -548,43 +542,43 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "lyric-cinema", + "execution_count": 16, + "id": "paperback-delay", "metadata": {}, "outputs": [], "source": [ - "from modsim import plot, decorate\n", - "\n", "def plot_projections(table):\n", " \"\"\"Plot world population projections.\n", " \n", " table: DataFrame with columns 'un' and 'census'\n", " \"\"\"\n", - " census_proj = table.census / 1e9\n", - " un_proj = table.un / 1e9\n", - " prb_proj = table.prb / 1e9\n", + " census_proj = table.census.dropna() / 1e9\n", + " un_proj = table.un.dropna() / 1e9\n", + " \n", + " census_proj.plot(style=':', label='US Census')\n", + " un_proj.plot(style='--', label='UN DESA')\n", " \n", - " plot(census_proj.dropna(), style=':', label='US Census')\n", - " plot(un_proj.dropna(), style='--', label='UN DESA')" + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)')" ] }, { "cell_type": "markdown", - "id": "conscious-method", + "id": "prostate-matrix", "metadata": {}, "source": [ - "Here are their projections compared to the results of the logistic model." + "Here are their projections compared to the results of the quadratic model." ] }, { "cell_type": "code", - "execution_count": 18, - "id": "neutral-material", + "execution_count": 17, + "id": "billion-dynamics", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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JjDj7lBGd2lJ5pUCnp6XyJODwhkR2Zy07DyaNahzR/HMnDmTTp06MXToUEaPHs20adOoU+f6fR44cIBp06aVuf2bb77JsGHDmDt3LllZWfTp04cRI0YAsGfPHnbv3o2/vz+dOnXimWeeIS0tjTNnzlxrcszKyio3vn/84x8899xzPPbYYxQUFFBcXHxHr1cpVfXYbDZSUlI4cuQIR44c4cKFCwA0btyYrl27EhERQVhY2A3fXe5SbRKUu92sl1tJ+auvvspjjz3GmjVr+O9//8v8+fPZuHGj0/tfs2YNy5Yt49133wWsbvWnTlmT0Q4fPpxGjRoBEBkZycmTJ4mKiuL48eM888wzjB07ltjY2HL3379/f958801SUlKYNGmS1p6UqiHy8vJITk7myJEjHD16lNzcXHx8fGjXrh09evSgY8eOBAYGekVP3mqToD79Qf9rj/18fa57Xre273XPG9bxu+55YP3a1z13pvYUFBTExYsXryvLzMy87sLWiIgInn76aZ588kmaNm1KRkYGQUFB15ZHRUWRmJjIhAkTbth/yfmoTp06XVe+Y8cO/P39rz339fWlqKiIJk2asHfvXlavXs1f//pXPvvsM+bOnUutWrWw2WwA113X9Oijj9K3b19WrFjBqFGj+Ne//sWwYcNu+bqVUlXPpUuX+Oabb0hKSuLkyZPYbDbq1q1Lhw4d6NChA+3bt/dYLak81SZBuVtAQAAtW7Zk/fr1DB8+nMzMTFatWsVzzz0HwIoVKxgzZgwiwtGjR/H19aVx48bX7eMnP/kJffr0YezYsfTt2xeAefPmMWLECEaNGsV7773He++9h4iwe/duevTocdN40tPTqV27Ng888AARERFMnz4dsKYqSUxMpE+fPixYsODa+sePHyc8PJxnn32W48ePs2/fPk1QSlUjmZmZHDp0iG+++YYzZ84AEBwcTL9+/ejUqROtW7d227mkitIEdQf+85//8OMf/5if/vSnALz22mvXult+9NFHzJw5k3r16lGrVi0+/vhjfH19r9u+efPmfPLJJ8yaNYu0tDR8fHwYPHgwkyZN4pe//CXPP/880dHRGGMIDQ1l+fLlN43lzJkzzJgx41pt6e233wZg1qxZPPjgg3z00UfXJaBPP/2UefPm4efnR4sWLXj11Vcr9b1RSrmXMYYLFy5w+PBhDh8+zPnz5wEICQlh2LBhREZGXteCUxWIMcbTMdxSTEyMKT1h4eHDh7nrrrs8FFHNoO+xUt7v/PnzHDhwgMOHD5ORkQFA27Ztueuuu+jcufMNLTfeSEQSjTExpctdVoMSkbnAOCDNGNPFXva/wH1AAZAMzDDGZLkqBqWUqo4uXrzIgQMH2L9/PxcuXEBECAsLu9Z816BBA0+HWClc2cT3AfAX4D8OZWuBl40xRSLyW+Bl4GcujEEppaqF7OxsDh48yIEDB66dU2rTpg1jxowhMjKS+vXrezjCyueyBGWM+UpEQkuVrXF4uh2Y7KrjK6VUVZefn8+hQ4fYv38/J06cwBhDixYtGDFiBFFRUVWi+e5OeLKTxBPApzdbKCJPAU+B1Z6qlFI1gc1m48SJE+zZs4fDhw9TVFREYGAggwYNokuXLjRt2tTTIbqNRxKUiPwCKAI+vtk6xpg5wBywOkm4KTSllPKIjIwM9u7dy969e7l8+TJ16tShW7dudO/enVatWnnFhbPu5vYEJSLTsDpPDDdVoQuhUkq5SF5eHgcPHmTv3r2cPn0aESEiIoLY2Fg6depErVo1+0ogt16lJSKjsTpFjDfGXHXnsSvbiRMn6NKly3Vls2fPvjY00fTp02nVqhX5+fmAdSFtaGhomfvy9fWle/fuREVF0a1bN37/+99fu55p48aNNGrUiO7du1+7rVu3DrDG64uKiiI6Opru3buzY8eOa/ssKioiODiYl19+ubJfulLqDhhjOH36NEuWLOF3v/sdy5cvJzc3lxEjRjBz5kwee+wxoqKianxyAtd2M58PDAWCRSQFeA2r154/sNZeXd1ujPmhq2LwNF9fX+bOncvTTz9d7np169Zlz549gDUK+qOPPsqlS5d4/fXXARg0aNANF+lu27aN5cuXs2vXLvz9/UlPT79u4rA1a9bQqVMnPvvsM956660a2TyglDfJy8tj3759JCYmkpaWRu3atYmOjqZnz56EhIToZ7QMruzF90gZxf921fG80fPPP88f/vAHnnzySae3adasGXPmzKF3795lTnBY4uzZswQHB18bly84OPi65fPnz+e5557j73//O9u3b782pYdSyn2MMaSmppKQkMDBgwcpLCykZcuWjBs3ji5dulw3rqa6UfWpQ74/9sayqInQ50kouAofT7lxefdHocdjcCUDPpt6/bIZK+44pLZt2zJw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\n", "text/plain": [ "
" ] @@ -597,12 +591,13 @@ ], "source": [ "plot_projections(table3)\n", - "plot(results, color='gray', label='model')" + "results.plot(color='gray', label='model')\n", + "decorate(title='Quadratic Model Projection')" ] }, { "cell_type": "markdown", - "id": "rough-patent", + "id": "integrated-there", "metadata": {}, "source": [ "The U.N. DESA expects the world population to reach 11 billion around 2100, and then level off.\n", @@ -617,7 +612,7 @@ }, { "cell_type": "markdown", - "id": "rising-procurement", + "id": "serial-binary", "metadata": {}, "source": [ "## Summary\n", @@ -628,7 +623,7 @@ }, { "cell_type": "markdown", - "id": "complex-forwarding", + "id": "authorized-suggestion", "metadata": {}, "source": [ "## Exercises\n", @@ -640,8 +635,8 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "involved-delivery", + "execution_count": 18, + "id": "handmade-funeral", "metadata": {}, "outputs": [ { @@ -656,7 +651,7 @@ "Name: census, dtype: float64" ] }, - "execution_count": 31, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -668,7 +663,7 @@ }, { "cell_type": "markdown", - "id": "executed-cheat", + "id": "discrete-scanner", "metadata": {}, "source": [ "The first element is `NaN` because we don't have the data for 1945, so we can't compute the first difference.\n", @@ -678,8 +673,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "promotional-poker", + "execution_count": 19, + "id": "objective-accused", "metadata": {}, "outputs": [ { @@ -694,7 +689,7 @@ "Name: census, dtype: float64" ] }, - "execution_count": 34, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -706,7 +701,7 @@ }, { "cell_type": "markdown", - "id": "incoming-tribute", + "id": "weighted-trouble", "metadata": {}, "source": [ "The following function computes and plots the growth rates for the `census` and `un` estimates:" @@ -714,24 +709,24 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "historical-program", + "execution_count": 20, + "id": "unique-matrix", "metadata": {}, "outputs": [], "source": [ "def plot_alpha():\n", " alpha_census = census.diff() / census\n", - " plot(alpha_census, style='.', label='US Census')\n", + " alpha_census.plot(style='.', label='US Census')\n", "\n", " alpha_un = un.diff() / un\n", - " plot(alpha_un, style='.', label='UN DESA')\n", + " alpha_un.plot(style='.', label='UN DESA')\n", "\n", " decorate(xlabel='Year', label='Net growth rate')" ] }, { "cell_type": "markdown", - "id": "horizontal-consensus", + "id": "flexible-amateur", "metadata": {}, "source": [ "And here's what it looks like." @@ -739,8 +734,8 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "rough-manual", + "execution_count": 21, + "id": "pressing-proceeding", "metadata": {}, "outputs": [ { @@ -762,7 +757,7 @@ }, { "cell_type": "markdown", - "id": "acute-ratio", + "id": "cross-reducing", "metadata": {}, "source": [ "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", @@ -774,8 +769,8 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "color-pricing", + "execution_count": 22, + "id": "mexican-denver", "metadata": {}, "outputs": [], "source": [ @@ -787,7 +782,7 @@ }, { "cell_type": "markdown", - "id": "duplicate-parliament", + "id": "handy-dubai", "metadata": {}, "source": [ "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." @@ -795,8 +790,8 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "approximate-calcium", + "execution_count": 23, + "id": "addressed-worker", "metadata": {}, "outputs": [], "source": [ @@ -808,27 +803,7 @@ }, { "cell_type": "markdown", - "id": "transparent-madison", - "metadata": {}, - "source": [ - "To plot the results, I'll put them into a `Series` object." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "looking-yield", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import Series\n", - "\n", - "alpha_series = Series(alpha_array, index=t_array)" - ] - }, - { - "cell_type": "markdown", - "id": "graphic-persian", + "id": "jewish-operations", "metadata": {}, "source": [ "Here's what it looks like, compared to the data." @@ -836,13 +811,23 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "focal-luther", + "execution_count": 24, + "id": "cathedral-shakespeare", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "text/plain": [ + "[]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", "text/plain": [ "
" ] @@ -854,13 +839,15 @@ } ], "source": [ + "from matplotlib.pyplot import plot\n", + "\n", "plot_alpha()\n", - "plot(alpha_series, color='gray')" + "plot(t_array, alpha_array, color='gray')" ] }, { "cell_type": "markdown", - "id": "raising-anthony", + "id": "expensive-viewer", "metadata": {}, "source": [ "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", @@ -878,8 +865,8 @@ }, { "cell_type": "code", - "execution_count": 40, - "id": "bigger-crystal", + "execution_count": 25, + "id": "common-april", "metadata": {}, "outputs": [], "source": [ @@ -892,8 +879,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "overhead-ethics", + "execution_count": 26, + "id": "ignored-chain", "metadata": {}, "outputs": [], "source": [ @@ -907,8 +894,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "id": "verified-friday", + "execution_count": 27, + "id": "color-accountability", "metadata": {}, "outputs": [], "source": [ @@ -920,8 +907,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "id": "fatal-status", + "execution_count": 28, + "id": "numeric-raise", "metadata": {}, "outputs": [ { @@ -930,7 +917,7 @@ "0.06725033332680001" ] }, - "execution_count": 43, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -943,25 +930,25 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "balanced-pierre", + "execution_count": 29, + "id": "included-vehicle", "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", - "results = run_simulation(system, growth_func_alpha);" + "results2 = run_simulation(system, growth_func_alpha);" ] }, { "cell_type": "code", - "execution_count": 45, - "id": "relevant-sessions", + "execution_count": 30, + "id": "brown-rating", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -976,13 +963,14 @@ "# Solution\n", "\n", "plot_projections(table3)\n", - "plot(results, color='gray', label='model')" + "results2.plot(color='gray', label='model')\n", + "decorate(title='Proportional model, linearly decreasing rate')" ] }, { "cell_type": "code", - "execution_count": 46, - "id": "informal-myrtle", + "execution_count": 31, + "id": "laughing-cylinder", "metadata": {}, "outputs": [], "source": [ @@ -995,17 +983,17 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "bridal-spread", + "execution_count": 32, + "id": "personalized-parking", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(2066, 9.75910331482456)" + "(2100, 12.58671867833247)" ] }, - "execution_count": 50, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1019,7 +1007,7 @@ { "cell_type": "code", "execution_count": null, - "id": "annual-carbon", + "id": "simple-version", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap09.ipynb b/jupyter/chap09.ipynb new file mode 100644 index 00000000..87d7b420 --- /dev/null +++ b/jupyter/chap09.ipynb @@ -0,0 +1,1378 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "asian-customer", + "metadata": {}, + "source": [ + "# Chapter 9" + ] + }, + { + "cell_type": "markdown", + "id": "gentle-purchase", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "appropriate-burns", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "biblical-murder", + "metadata": {}, + "source": [ + "In this chapter we express the models from previous chapters as\n", + "difference equations and differential equations, solve the equations,\n", + "and derive the functional forms of the solutions. We also discuss the\n", + "complementary roles of mathematical analysis and simulation." + ] + }, + { + "cell_type": "markdown", + "id": "hybrid-retrieval", + "metadata": {}, + "source": [ + "## Recurrence relations\n", + "\n", + "The population models in the previous chapter and this one are simple\n", + "enough that we didn't really need to run simulations. We could have\n", + "solved them mathematically. For example, we wrote the constant growth\n", + "model like this:\n", + "\n", + "```\n", + "results[t+1] = results[t] + annual_growth\n", + "```\n", + "\n", + "In mathematical notation, we would write the same model like this:\n", + "\n", + "$$x_{n+1} = x_n + c$$ \n", + "\n", + "where $x_n$ is the population during year $n$,\n", + "$x_0$ is a given initial population, and $c$ is constant annual growth.\n", + "This way of representing the model is a **recurrence relation**; see\n", + ".\n", + "\n", + "Sometimes it is possible to solve a recurrence relation by writing an\n", + "equation that computes $x_n$, for a given value of $n$, directly; that\n", + "is, without computing the intervening values from $x_1$ through\n", + "$x_{n-1}$." + ] + }, + { + "cell_type": "markdown", + "id": "specified-mexican", + "metadata": {}, + "source": [ + "In the case of constant growth we can see that $x_1 = x_0 + c$, and\n", + "$x_2 = x_1 + c$. Combining these, we get $x_2 = x_0 + 2c$, then\n", + "$x_3 = x_0 + 3c$, and it is not hard to conclude that in general\n", + "\n", + "$$x_n = x_0 + nc$$ \n", + "\n", + "So if we want to know $x_{100}$ and we don't care\n", + "about the other values, we can compute it with one multiplication and\n", + "one addition." + ] + }, + { + "cell_type": "markdown", + "id": "motivated-consumer", + "metadata": {}, + "source": [ + "We can also write the proportional model as a recurrence relation:\n", + "\n", + "$$x_{n+1} = x_n + \\alpha x_n$$ \n", + "\n", + "Or more conventionally as:\n", + "\n", + "$$x_{n+1} = x_n (1 + \\alpha)$$ \n", + "\n", + "Now we can see that\n", + "\n", + "$x_1 = x_0 (1 + \\alpha)$, and $x_2 = x_0 (1 + \\alpha)^2$, and in general\n", + "\n", + "$$x_n = x_0 (1 + \\alpha)^n$$ \n", + "\n", + "This result is a **geometric progression**;\n", + "see . When $\\alpha$ is positive, the factor\n", + "$1+\\alpha$ is greater than 1, so the elements of the sequence grow\n", + "without bound.\n", + "\n", + "Finally, we can write the quadratic model like this:\n", + "\n", + "$$x_{n+1} = x_n + \\alpha x_n + \\beta x_n^2$$ \n", + "\n", + "or with the more\n", + "conventional parameterization like this:\n", + "\n", + "$$x_{n+1} = x_n + r x_n (1 - x_n / K)$$ \n", + "\n", + "There is no analytic solution to\n", + "this equation, but we can approximate it with a differential equation\n", + "and solve that, which is what we'll do in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "decreased-location", + "metadata": {}, + "source": [ + "## Differential equations\n", + "\n", + "Starting again with the constant growth model \n", + "\n", + "$$x_{n+1} = x_n + c$$ \n", + "\n", + "If we define $\\Delta x$ to be the change in $x$ from one time step to the next, we can write: \n", + "\n", + "$$\\Delta x = x_{n+1} - x_n = c$$ \n", + "\n", + "If we define\n", + "$\\Delta t$ to be the time step, which is one year in the example, we can\n", + "write the rate of change per unit of time like this:\n", + "\n", + "$$\\frac{\\Delta x}{\\Delta t} = c$$ \n", + "\n", + "This model is **discrete**, which\n", + "means it is only defined at integer values of $n$ and not in between.\n", + "But in reality, people are born and die all the time, not once a year,\n", + "so a **continuous** model might be more realistic." + ] + }, + { + "cell_type": "markdown", + "id": "covered-defense", + "metadata": {}, + "source": [ + "We can make this model continuous by writing the rate of change in the\n", + "form of a derivative: \n", + "\n", + "$$\\frac{dx}{dt} = c$$ \n", + "\n", + "This way of representing the model is a **differential equation**; see .\n", + "\n", + "We can solve this differential equation if we multiply both sides by\n", + "$dt$: \n", + "\n", + "$$dx = c dt$$ \n", + "\n", + "And then integrate both sides: \n", + "\n", + "$$x(t) = c t + x_0$$\n", + "\n", + "Similarly, we can write the proportional growth model like this:\n", + "\n", + "$$\\frac{\\Delta x}{\\Delta t} = \\alpha x$$ \n", + "\n", + "And as a differential equation\n", + "like this: \n", + "\n", + "$$\\frac{dx}{dt} = \\alpha x$$ \n", + "\n", + "If we multiply both sides by\n", + "$dt$ and divide by $x$, we get \n", + "\n", + "$$\\frac{1}{x}~dx = \\alpha~dt$$ \n", + "\n", + "Now we\n", + "integrate both sides, yielding: \n", + "\n", + "$$\\ln x = \\alpha t + K$$ \n", + "\n", + "where $\\ln$ is the natural logarithm and $K$ is the constant of integration." + ] + }, + { + "cell_type": "markdown", + "id": "underlying-visitor", + "metadata": {}, + "source": [ + "Exponentiating both sides, we have\n", + "\n", + "$$\\exp(\\ln(x)) = \\exp(\\alpha t + K)$$ \n", + "\n", + "The exponential function can be written $\\exp(x)$ or $e^x$. In this book I use the first form because it resembles the Python code.\n", + "\n", + "We can rewrite the previous equation as\n", + "\n", + "$$x = \\exp(\\alpha t) \\exp(K)$$ \n", + "\n", + "Since $K$ is an arbitrary constant,\n", + "$\\exp(K)$ is also an arbitrary constant, so we can write\n", + "\n", + "$$x = C \\exp(\\alpha t)$$ \n", + "\n", + "where $C = \\exp(K)$. There are many solutions\n", + "to this differential equation, with different values of $C$. The\n", + "particular solution we want is the one that has the value $x_0$ when\n", + "$t=0$.\n", + "\n", + "When $t=0$, $x(t) = C$, so $C = x_0$ and the solution we want is\n", + "$$x(t) = x_0 \\exp(\\alpha t)$$ If you would like to see this derivation\n", + "done more carefully, you might like this video:\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "czech-scratch", + "metadata": {}, + "source": [ + "## Analysis and simulation\n", + "\n", + "Once you have designed a model, there are generally two ways to proceed: simulation and analysis. Simulation often comes in the form of a computer program that models changes in a system over time, like births and deaths, or bikes moving from place to place. Analysis often comes in the form of algebra; that is, symbolic manipulation using mathematical notation.\n", + "\n", + "Analysis and simulation have different capabilities and limitations.\n", + "Simulation is generally more versatile; it is easy to add and remove\n", + "parts of a program and test many versions of a model, as we have done in the previous examples.\n", + "\n", + "But there are several things we can do with analysis that are harder or impossible with simulations:" + ] + }, + { + "cell_type": "markdown", + "id": "embedded-miniature", + "metadata": {}, + "source": [ + "- With analysis we can sometimes compute, exactly and efficiently, a\n", + " value that we could only approximate, less efficiently, with\n", + " simulation. For example, in the quadratic model we plotted growth rate versus population and saw net crossed through zero when the population is\n", + " near 14 billion. We could estimate the crossing point using a\n", + " numerical search algorithm (more about that later). But with the\n", + " analysis in Section xxx, we get the general result that\n", + " $K=-\\alpha/\\beta$.\n", + "\n", + "- Analysis often provides \"computational shortcuts\", that is, the\n", + " ability to jump forward in time to compute the state of a system\n", + " many time steps in the future without computing the intervening\n", + " states.\n", + "\n", + "- We can use analysis to state and prove generalizations about models;\n", + " for example, we might prove that certain results will always or\n", + " never occur. With simulations, we can show examples and sometimes\n", + " find counterexamples, but it is hard to write proofs.\n", + "\n", + "- Analysis can provide insight into models and the systems they\n", + " describe; for example, sometimes we can identify regimes of\n", + " qualitatively different behavior and key parameters that control\n", + " those behaviors." + ] + }, + { + "cell_type": "markdown", + "id": "impressive-planning", + "metadata": {}, + "source": [ + "When people see what analysis can do, they sometimes get drunk with\n", + "power, and imagine that it gives them a special ability to see past the veil of the material world and discern the laws of mathematics that govern the universe. When they analyze a model of a physical system, they talk about \"the math behind it\" as if our world is the mere shadow of a world of ideal mathematical entities (I am not making this up; see .).\n", + "\n", + "This is, of course, nonsense. Mathematical notation is a language\n", + "designed by humans for a purpose, specifically to facilitate symbolic\n", + "manipulations like algebra. Similarly, programming languages are\n", + "designed for a purpose, specifically to represent computational ideas\n", + "and run programs.\n", + "\n", + "Each of these languages is good for the purposes it was designed for and less good for other purposes. But they are often complementary, and one of the goals of this book is to show how they can be used together." + ] + }, + { + "cell_type": "markdown", + "id": "graduate-conducting", + "metadata": {}, + "source": [ + "## Analysis with WolframAlpha\n", + "\n", + "Until recently, most analysis was done by rubbing graphite on wood\n", + "pulp, a process that is laborious and error-prone. A useful\n", + "alternative is symbolic computation. If you have used services like\n", + "WolframAlpha, you have used symbolic computation.\n", + "\n", + "For example, if you go to and type\n", + "\n", + "```\n", + "df(t) / dt = alpha f(t)\n", + "```\n", + "\n", + "WolframAlpha infers that `f(t)` is a function of `t` and `alpha` is a\n", + "parameter; it classifies the query as a \"first-order linear ordinary\n", + "differential equation\\\", and reports the general solution:\n", + "\n", + "$$f(t) = c_1 \\exp(\\alpha t)$$ \n", + "\n", + "If you add a second equation to specify\n", + "the initial condition:\n", + "\n", + "```\n", + "df(t) / dt = alpha f(t), f(0) = p_0\n", + "```\n", + "\n", + "WolframAlpha reports the particular solution:\n", + "\n", + "$$f(t) = p_0 \\exp(\\alpha t)$$\n", + "\n", + "WolframAlpha is based on Mathematica, a powerful programming language\n", + "designed specifically for symbolic computation." + ] + }, + { + "cell_type": "markdown", + "id": "beginning-tamil", + "metadata": {}, + "source": [ + "## Analysis with SymPy\n", + "\n", + "Python has a library called SymPy that provides symbolic computation\n", + "tools similar to Mathematica. They are not as easy to use as\n", + "WolframAlpha, but they have some other advantages.\n", + "\n", + "Before we can use SymPy, we have to import it:" + ] + }, + { + "cell_type": "markdown", + "id": "civic-payday", + "metadata": {}, + "source": [ + "SymPy defines a `Symbol` object that represents symbolic variable names,\n", + "functions, and other mathematical entities.\n", + "\n", + "The `symbols` function takes a string and returns `Symbol` objects. So\n", + "if we run this assignment:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "flush-balance", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import symbols\n", + "\n", + "t = symbols('t')" + ] + }, + { + "cell_type": "markdown", + "id": "faced-praise", + "metadata": {}, + "source": [ + "Python understands that `t` is a symbol, not a numerical value. If we\n", + "now run" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ancient-anderson", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle t + 1$" + ], + "text/plain": [ + "t + 1" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expr = t + 1\n", + "expr" + ] + }, + { + "cell_type": "markdown", + "id": "industrial-confidence", + "metadata": {}, + "source": [ + "Python doesn't try to perform numerical addition; rather, it creates a\n", + "new `Symbol` that represents the sum of `t` and `1`. We can evaluate the\n", + "sum using `subs`, which substitutes a value for a symbol. This example\n", + "substitutes 2 for `t`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "familiar-oakland", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 3$" + ], + "text/plain": [ + "3" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "expr.subs(t, 2)" + ] + }, + { + "cell_type": "markdown", + "id": "progressive-celebration", + "metadata": {}, + "source": [ + "Functions in SymPy are represented by a special kind of `Symbol`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "incomplete-sleep", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "f" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import Function\n", + "\n", + "f = Function('f')\n", + "f" + ] + }, + { + "cell_type": "markdown", + "id": "legislative-dispatch", + "metadata": {}, + "source": [ + "Now if we write `f(t)`, we get an object that represents the evaluation of a function, $f$, at a value, $t$. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "inside-sally", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle f{\\left(t \\right)}$" + ], + "text/plain": [ + "f(t)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f(t)" + ] + }, + { + "cell_type": "markdown", + "id": "interior-index", + "metadata": {}, + "source": [ + "But again SymPy doesn't actually\n", + "try to evaluate it." + ] + }, + { + "cell_type": "markdown", + "id": "indian-trout", + "metadata": {}, + "source": [ + "## Differential equations in SymPy\n", + "\n", + "SymPy provides a function, `diff`, that can differentiate a function. We can apply it to `f(t)` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "requested-program", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)}$" + ], + "text/plain": [ + "Derivative(f(t), t)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import diff\n", + "\n", + "dfdt = diff(f(t), t)\n", + "dfdt" + ] + }, + { + "cell_type": "markdown", + "id": "treated-commissioner", + "metadata": {}, + "source": [ + "The result is a `Symbol` that represents the derivative of `f` with\n", + "respect to `t`. But again, SymPy doesn't try to compute the derivative\n", + "yet.\n", + "\n", + "To represent a differential equation, we use `Eq`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "incomplete-parker", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)}$" + ], + "text/plain": [ + "Eq(Derivative(f(t), t), alpha*f(t))" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import Eq\n", + "\n", + "alpha = symbols('alpha')\n", + "eq1 = Eq(dfdt, alpha*f(t))\n", + "eq1" + ] + }, + { + "cell_type": "markdown", + "id": "concerned-asthma", + "metadata": {}, + "source": [ + "The result is an object that represents an equation. Now\n", + "we can use `dsolve` to solve this differential equation:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "described-overhead", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{\\alpha t}$" + ], + "text/plain": [ + "Eq(f(t), C1*exp(alpha*t))" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import dsolve\n", + "\n", + "solution_eq = dsolve(eq1)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "id": "inside-medicine", + "metadata": {}, + "source": [ + "The result is the **general\n", + "solution**, which still contains an unspecified constant, $C_1$. To get the **particular solution** where $f(0) = p_0$, we substitute `p_0` for `C1`. First, we have to create two more symbols:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "material-voice", + "metadata": {}, + "outputs": [], + "source": [ + "C1, p_0 = symbols('C1 p_0')" + ] + }, + { + "cell_type": "markdown", + "id": "serious-license", + "metadata": {}, + "source": [ + "Now we can perform the substitution:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "supposed-domestic", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle f{\\left(t \\right)} = p_{0} e^{\\alpha t}$" + ], + "text/plain": [ + "Eq(f(t), p_0*exp(alpha*t))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "particular = solution_eq.subs(C1, p_0)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "id": "modern-raleigh", + "metadata": {}, + "source": [ + "The result is called the **exponential growth curve**; see\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "negative-chance", + "metadata": {}, + "source": [ + "## Solving the quadratic growth model" + ] + }, + { + "cell_type": "markdown", + "id": "arabic-victorian", + "metadata": {}, + "source": [ + "We'll use the (r, K) parameterization, so we'll need two more symbols:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "political-chinese", + "metadata": {}, + "outputs": [], + "source": [ + "r, K = symbols('r K')" + ] + }, + { + "cell_type": "markdown", + "id": "virtual-temperature", + "metadata": {}, + "source": [ + "Now we can write the differential equation." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "lined-queen", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = r \\left(1 - \\frac{f{\\left(t \\right)}}{K}\\right) f{\\left(t \\right)}$" + ], + "text/plain": [ + "Eq(Derivative(f(t), t), r*(1 - f(t)/K)*f(t))" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2" + ] + }, + { + "cell_type": "markdown", + "id": "relative-zoning", + "metadata": {}, + "source": [ + "And solve it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "printable-typing", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle f{\\left(t \\right)} = \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" + ], + "text/plain": [ + "Eq(f(t), K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solution_eq = dsolve(eq2)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "id": "convertible-simple", + "metadata": {}, + "source": [ + "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "final-treatment", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" + ], + "text/plain": [ + "K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "general = solution_eq.rhs\n", + "general" + ] + }, + { + "cell_type": "markdown", + "id": "phantom-melbourne", + "metadata": {}, + "source": [ + "We can evaluate the right-hand side at $t=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "freelance-admission", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{K e^{C_{1} K}}{e^{C_{1} K} - 1}$" + ], + "text/plain": [ + "K*exp(C1*K)/(exp(C1*K) - 1)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "at_0 = general.subs(t, 0)\n", + "at_0" + ] + }, + { + "cell_type": "markdown", + "id": "precise-radar", + "metadata": {}, + "source": [ + "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", + "\n", + "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "orange-glasgow", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import solve\n", + "\n", + "solutions = solve(Eq(at_0, p_0), C1)" + ] + }, + { + "cell_type": "markdown", + "id": "periodic-bikini", + "metadata": {}, + "source": [ + "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "expensive-palace", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(list, 1)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(solutions), len(solutions)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "worthy-sleeve", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\log{\\left(- \\frac{p_{0}}{K - p_{0}} \\right)}}{K}$" + ], + "text/plain": [ + "log(-p_0/(K - p_0))/K" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "value_of_C1 = solutions[0]\n", + "value_of_C1" + ] + }, + { + "cell_type": "markdown", + "id": "lightweight-pickup", + "metadata": {}, + "source": [ + "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aggressive-queue", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{K p_{0} e^{r t}}{\\left(K - p_{0}\\right) \\left(- \\frac{p_{0} e^{r t}}{K - p_{0}} - 1\\right)}$" + ], + "text/plain": [ + "-K*p_0*exp(r*t)/((K - p_0)*(-p_0*exp(r*t)/(K - p_0) - 1))" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "particular = general.subs(C1, value_of_C1)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "id": "electric-albania", + "metadata": {}, + "source": [ + "The result is complicated, but SymPy provides a function that tries to simplify it." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "funded-tolerance", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{K p_{0} e^{r t}}{K + p_{0} e^{r t} - p_{0}}$" + ], + "text/plain": [ + "K*p_0*exp(r*t)/(K + p_0*exp(r*t) - p_0)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "particular.simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "scenic-preparation", + "metadata": {}, + "source": [ + "This function is called the **logistic growth curve**; see\n", + ". In the context of growth models, the\n", + "logistic function is often written like this:\n", + "\n", + "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", + "\n", + "where $A = (K - p_0) / p_0$." + ] + }, + { + "cell_type": "markdown", + "id": "burning-sherman", + "metadata": {}, + "source": [ + "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "institutional-finish", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{K - p_{0}}{p_{0}}$" + ], + "text/plain": [ + "(K - p_0)/p_0" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = (K - p_0) / p_0\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "noble-auditor", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{K}{1 + \\frac{\\left(K - p_{0}\\right) e^{- r t}}{p_{0}}}$" + ], + "text/plain": [ + "K/(1 + (K - p_0)*exp(-r*t)/p_0)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sympy import exp\n", + "\n", + "logistic = K / (1 + A * exp(-r*t))\n", + "logistic" + ] + }, + { + "cell_type": "markdown", + "id": "brave-conditions", + "metadata": {}, + "source": [ + "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "industrial-administrator", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle 0$" + ], + "text/plain": [ + "0" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(particular - logistic).simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-topic", + "metadata": {}, + "source": [ + "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", + "\n", + "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." + ] + }, + { + "cell_type": "markdown", + "id": "cutting-access", + "metadata": {}, + "source": [ + "If you would like to see this differential equation solved by hand, you might like this video: " + ] + }, + { + "cell_type": "markdown", + "id": "outstanding-launch", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter we wrote the growth models from the previous chapters in terms of difference and differential equations.\n", + "\n", + "What I called the constant growth model is more commonly called **linear growth** because the solution is a line. If we model time as continuous, the solution is\n", + "\n", + "$$f(t) = p_0 + \\alpha t$$\n", + "\n", + "where $\\alpha$ is the growth rate.\n", + "\n", + "Similarly, the proportional growth model is usually called **exponential growth** because the solution is exponential:\n", + "\n", + "$$f(t) = p_0 \\exp{\\alpha t}$$\n", + "\n", + "Finally, the quadratic growth model is called **logistic growth** because the solution is the logistic function:\n", + "\n", + "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", + "\n", + "where $A = (K - p_0) / p_0$." + ] + }, + { + "cell_type": "markdown", + "id": "adjacent-tracy", + "metadata": {}, + "source": [ + "I avoided these terms until now because they are based on results we had not derived yet." + ] + }, + { + "cell_type": "markdown", + "id": "offshore-passage", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "ideal-ecology", + "metadata": {}, + "source": [ + "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", + "\n", + "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "internal-knock", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "alpha, beta = symbols('alpha beta')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "smooth-sunglasses", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)} + \\beta f^{2}{\\left(t \\right)}$" + ], + "text/plain": [ + "Eq(Derivative(f(t), t), alpha*f(t) + beta*f(t)**2)" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "eq3 = Eq(diff(f(t), t), alpha*f(t) + beta*f(t)**2)\n", + "eq3" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "fundamental-arlington", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle f{\\left(t \\right)} = \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" + ], + "text/plain": [ + "Eq(f(t), alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t)))))" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "solution_eq = dsolve(eq3)\n", + "solution_eq" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "desirable-alpha", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" + ], + "text/plain": [ + "alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t))))" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "general = solution_eq.rhs\n", + "general" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "coupled-grounds", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "at_0 = general.subs(t, 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "looking-ground", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\log{\\left(\\frac{\\beta p_{0}}{\\alpha + \\beta p_{0}} \\right)}}{\\alpha}$" + ], + "text/plain": [ + "log(beta*p_0/(alpha + beta*p_0))/alpha" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "solutions = solve(Eq(at_0, p_0), C1)\n", + "value_of_C1 = solutions[0]\n", + "value_of_C1" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "anticipated-paragraph", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\alpha p_{0} e^{\\alpha t}}{\\alpha - \\beta p_{0} e^{\\alpha t} + \\beta p_{0}}$" + ], + "text/plain": [ + "alpha*p_0*exp(alpha*t)/(alpha - beta*p_0*exp(alpha*t) + beta*p_0)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "particular = general.subs(C1, value_of_C1)\n", + "particular.simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "residential-spanking", + "metadata": {}, + "source": [ + "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", + "\n", + " df(t) / dt = alpha f(t) + beta f(t)^2\n", + "\n", + "or\n", + "\n", + " df(t) / dt = r f(t) (1 - f(t)/K)\n", + "\n", + "Find the general solution and also the particular solution where `f(0) = p_0`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap10.ipynb b/jupyter/chap10.ipynb new file mode 100644 index 00000000..8898834d --- /dev/null +++ b/jupyter/chap10.ipynb @@ -0,0 +1,656 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "negative-distributor", + "metadata": {}, + "source": [ + "# Chapter 10" + ] + }, + { + "cell_type": "markdown", + "id": "organized-stone", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "exciting-width", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n" + ] + }, + { + "cell_type": "markdown", + "id": "graphic-subject", + "metadata": {}, + "source": [ + "# Case studies\n", + "\n", + "This chapter presents case studies where you can practice the tools we have learned so far." + ] + }, + { + "cell_type": "markdown", + "id": "cleared-greene", + "metadata": {}, + "source": [ + "## Prehistoric World Population\n", + "\n", + "On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "manufactured-color", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "intellectual-mortality", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pandas import read_html\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ] + }, + { + "cell_type": "markdown", + "id": "bound-giving", + "metadata": {}, + "source": [ + "Select `tables[1]`, which is the second table on the page." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "voluntary-definition", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
Year
-10000NaNNaNNaN2M[24]NaNNaN4.01–10MNaNNaN
-9000NaNNaNNaN4.NaNNaNNaNNaNNaNNaN
-80005.NaNNaN5.NaNNaNNaNNaN5–10MNaN
-7000NaNNaNNaN8.NaNNaNNaNNaNNaNNaN
-6000NaNNaNNaN11.NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " Population Reference Bureau (1973–2016)[15] \\\n", + "Year \n", + "-10000 NaN \n", + "-9000 NaN \n", + "-8000 5. \n", + "-7000 NaN \n", + "-6000 NaN \n", + "\n", + " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", + "Year \n", + "-10000 NaN \n", + "-9000 NaN \n", + "-8000 NaN \n", + "-7000 NaN \n", + "-6000 NaN \n", + "\n", + " Maddison (2008)[17] HYDE (2010)[citation needed] Tanton (1994)[18] \\\n", + "Year \n", + "-10000 NaN 2M[24] NaN \n", + "-9000 NaN 4. NaN \n", + "-8000 NaN 5. NaN \n", + "-7000 NaN 8. NaN \n", + "-6000 NaN 11. NaN \n", + "\n", + " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", + "Year \n", + "-10000 NaN 4.0 1–10M \n", + "-9000 NaN NaN NaN \n", + "-8000 NaN NaN NaN \n", + "-7000 NaN NaN NaN \n", + "-6000 NaN NaN NaN \n", + "\n", + " Durand (1974)[22] Clark (1967)[23] \n", + "Year \n", + "-10000 NaN NaN \n", + "-9000 NaN NaN \n", + "-8000 5–10M NaN \n", + "-7000 NaN NaN \n", + "-6000 NaN NaN " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "table1 = tables[1]\n", + "table1.head()" + ] + }, + { + "cell_type": "markdown", + "id": "tracked-stylus", + "metadata": {}, + "source": [ + "Not all researchers provide estimates for the same dates.\n", + "\n", + "Again, we'll replace the long column names with more convenient abbreviations." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "exempt-headline", + "metadata": {}, + "outputs": [], + "source": [ + "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", + " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" + ] + }, + { + "cell_type": "markdown", + "id": "professional-watch", + "metadata": {}, + "source": [ + "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "sapphire-excuse", + "metadata": {}, + "outputs": [], + "source": [ + "for col in table1.columns:\n", + " table1[col] = pd.to_numeric(table1[col], errors='coerce')" + ] + }, + { + "cell_type": "markdown", + "id": "amended-contribution", + "metadata": {}, + "source": [ + "Here are the results. Notice that we are working in millions now, not billions." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "right-wrong", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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hCWqOiAzM5O33nqLk08+mdmzZ9O5c+dq9x89ejSTJk2qdp9QevbZZ/nHP/5B3759yc3Njdh5jTF1R7i/B1XdZLFbgLHAWPf7TOlAAfCTqoZkVF805L23hqJNe2tcT0LLBiSf2bHK7RkZGaxfvx5V5e233+bcc88t2/bvf/+byZMnk5CQwAMPPFDpjOaPP/44GRkZjBo1ilWrVjF+/HhefvnlSieMfeSRR3jvvffo168fPp+P4uJiTj75ZBYsWAA4ye/RRx+lQ4f93w7wer3MmjWLfv36kZqaWm1bN2zYwBVXXEFxcTE9e/bk2WefZcqUKbz77rsUFhaybds23nnnHVq2bMmUKVN48cUX8fl8PPzww5xyyimMGTOGNWvWICK88sortGvX7hDfbWNMLNLi8M7FF1Stqpqtql+o6tLanJwibdCgQcybN4+cnBzS09MByMnJ4cUXX2T+/PnMmzePoUOHAvDGG2+UXeKbMWMGo0ePZvr06WXbRo8ezQcffFA2YeyECROYMGECW7Zs4eOPP+bzzz/npptuYvv27Xi9Xvr06cPixYvZtWsXO3bsKJecAFJSUvjvf//Lp59+etB2TJgwgbFjxzJ//nwKCgqYO3cuAMnJyXzwwQdce+21zJgxg99++43XX3+defPmMXv2bMaPH09xcTErV65k3rx5zJs3j7Zt24bwHTbGRFMszMVXp1TX6wm1kSNHMnr0aC6//PKysrVr19KnTx+8XufWXmnvqbJLfLm5uezZs4fZs2dz11138be//e2ACWOzs7M59thjERG6dOlCkyZNALj88suZOnUqvXr1YuTIkeXqXbhwIYWFhcycOZOzzz6bjIwMbrzxRj744AM8Hs8B7VizZg39+/cHYMCAAaxevRqPx0OfPn0AaNOmDV999RVr165lxYoVZdMx5eTk4PV6ufnmm7nqqqto0qQJDz/8MA0bNgzF22uMibLSUXzhetyGPS0vjDp37szgwYM5//zzy8o6dOjA0qVLKSkpAZyHFlblrLPO4tFHH6Vr1654vV66devGqFGjyMrKYu7cubz00ku0a9eOZcuWoaqsXr2anTt3AtC/f3++//57pk2bxqhRo8rVu2vXLrZs2UJqairTpk3jvPPO49RTT600OQF06tSJRYsWAfDVV1+V3U8LnKhWVenQoQPHHnssc+bMISsri6VLl+Lz+bjg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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "table1.plot()\n", + "decorate(xlim=[-10000, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='Prehistoric population estimates')\n", + "plt.legend(fontsize='small');" + ] + }, + { + "cell_type": "markdown", + "id": "later-community", + "metadata": {}, + "source": [ + "We can use `xlim` to zoom in on everything after Year 0." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "champion-stage", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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sY899hgfffQRgwYNwuv1UlpaysiRI1myZAngT36PP/44Xbv+dnWA2+3myy+/ZNCgQcTHV38fmG3btnHttddSWlpK3759efHFF5k6dSoffvghxcXF7N69mw8++IC2bdsydepUXn31VbxeL48++iinnnoq48ePZ9OmTYgIb775Jp07dz7MvW2MqW2lu/JxJzZGIsJzBB8ENswcVU1V1a9VdVV9Tk517YQTTmDRokVkZGTQpk0bADIyMnj11VdZvHgxixYtYsSIEQC8++675Yf4Zs6cydixY5kxY0b5tLFjx/LJJ5+UF4ydPHkykydPJj09nc8//5yvvvqKW2+9lb179+J2uxkwYAArVqwgNzeXzMzM/ZITQFxcHO+//z5z58495OeYPHky99xzD4sXL6awsJCFCxcC0KJFCz755BNuuukmZs6cyZ49e3jnnXdYtGgRc+bMYdKkSZSWlrJu3ToWLVrEokWL6NixYy3uYWPMkSrdVRCWt9ioKJBRfA1Kdb2e2jZ69GjGjh3LNddcU962efNmBgwYgNvtP7VX1nuq7BBfVlYWeXl5zJkzh/vuu4+//e1vBxWMTU1NpV+/fogI3bt3p3nz5gBcc801TJs2jf79+zN69Oj91rt06VKKi4uZPXs2F154IZ06deKWW27hk08+weVyHfQ5Nm3axODBgwEYMmQIGzduxOVyMWDAAAA6dOjAsmXL2Lx5M2vXri0vx5SRkYHb7ea2227j+uuvp3nz5jz66KM0bRqehSmNOVp480rw5ZWG9fknCLAHZY5McnIyw4YN49JLLy1v69q1K6tWrcLj8QD+mxZW5YILLuDxxx+nR48euN1ujj32WMaMGcOCBQtYuHAhr7/+Op07d2b16tWoKhs3biQnJweAwYMH8+OPPzJ9+nTGjBmz33pzc3NJT08nPj6e6dOnc8kll3D66adXmpwAunXrxvLlywFYtmxZ+fm0ioVqVZWuXbvSr18/5s+fz4IFC1i1ahVer5fLLruM119/ndatW/Pee3afS2NCrXwEX5L1oI5qzz///H7vExISuO666zjppJNo0qQJ999/PxEREbz77rusWLECgFGjRjFhwgQuu+wyOnfuzKef+i/9Ov/88ystGHvGGWdwwgknMHDgQFq2bFm+rTPOOINvv/32oHNMZ511Fh9//DFDhw4lNjaW6667jvfee4/rrrtuv+XLEtC9997Ltddey6OPPkq/fv0YPnw4mzcffNPHVq1acfnll3PKKafgcrno27cvjzzyCBdccEH53YOnT59eC3vVGFMTnvTwH8EHgRWLPQmYCHTCn9CEAIvFhlJKSoqW/eDD0VmU9IknnqB79+77DdAIVGFhIaeddhpfffVVECL7zdH4vRgTalmzNlD40x7aPDC01m/ZU5vFYgPpQb0K3AF8h7/skakHHnnkEZYuXcpdd9112Mump6dz3nnnHdGyxpjwV5ruHyAR7veTCyRB5aiqlReqZx588MEjXjYpKYmKvU9jTMPiahZFZEJ4VjCvKJAENV9EngLeY/9isSuDFpUxxpigaXlV/TisHkiCGuI8VzymqMCptR+OMcYY4xdIsdiRdRGIMcYYU9Ehr4MSkeYi8oyIrHAefxWR5nURXH1UUlJSXhEiNja2/PXdd99dK+sfP348q1evZtWqVbz00ku1sk5jjAlHgRziew3/jQXLrva8GngduCRYQdVnUVFRLFiwAPAXjF2wYAELFizg448/rtXtHHfccRx33HG1uk5jjAkngSSoY1S1Yq2ch0VkVZDiCbpPP/2U9PT0Gq8nKSmJs88+O+D5V69ezYUXXkhqairTpk2jb9++vP322zz33HMAPPzww4waNYoRI0bQv39/vvnmGy644AJ27drFt99+y+jRo/m///u/8vWVJb2nn36agQMHMmTIEFauXMlFF13Efffdx0svvcRrr71G48aNuf3227n44ou54447WL58eXmh2S5dutCzZ08GDhzI2rVrufPOO7n66qtrvG+MMaY2BFLqqFBEhpW9cS7cLQxeSA1TaWkpH3zwAU8//TSvv/46Xq+XyZMns2jRIj7//HP+9Kc/lc87ZswYvvnmG/75z39y/fXXs3TpUqZNm1blurOzs5kwYQJff/11eaWGd999lzlz5rBw4UIuvPBCli9fTlpaGkuWLOHhhx/mkUceAfzXPL300kssXryYF198Mbg7wRhjDkMgPag/AG84550EyATGBzOoYDqcXk9tKjsc16FDB7KyssjIyKBTp05ER0eXP8rq85UVf01KSqJ///6ISHlx2crExcXRqVMnABo18l/b8OSTT3L33Xfj8XiYMGHCQQVf77//fsBfG7BZs2aAv56eMcaEi0BG8a0C+otIM+d9brCDaogOLKyakJDAli1bKC4u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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "table1.plot()\n", + "decorate(xlim=[0, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')" + ] + }, + { + "cell_type": "markdown", + "id": "medium-aircraft", + "metadata": {}, + "source": [ + "See if you can find a model that fits these data well from Year 0 to 1950.\n", + "\n", + "How well does your best model predict actual population growth from 1950 to the present?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "nervous-anatomy", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6N69e9h2EOsvkFZ8SXiHyjjZKvoMeMAYUxbMwDqquLg4cnJyqKmpISYmhk8++YTevZscxf4AS5cuJSUltB073n333Tz22GNMmTKFH3/8MaSxKKUOT3FxMW63m9TU8G5e3iCQFPosUAFcYk3lwHPBDKqjO/PMM3n//fcBb/dEl17608gklZWVzJs3j4yMDDIzM3njjTea3M6GDRuYMGGC73Nubi6ZmZkArF69mlNOOYVjjz2W008/nfz8fF/56NGjOf7443nyySd965500km+TmwBJk2axJo1aw7ZZ2RkJHl5eQAMGDAgoOMtKSnhvPPOIzMzk4kTJ/q2O3/+fK666iomT57MwIEDefzxn8bBfPHFF5kwYQJZWVlcd911uN1u3G43c+fOZdSoUWRkZPDoo48GtH+llFdhYSGRkZF06dIl1KEEJJB7UIOMMRf6fb5fRLKDFE+bKX13G/V7qlp1m5G94uhyzqAWl5s1axYPPPAA06dPZ82aNVx11VV8/vnnADz44IMkJSWxdu1awHtDs8GUKVN83SLNmTOHO+64g/r6erZv387AgQN59dVXueSSS3A6nU0OtzFv3jz+9re/ccopp/CLX/zCt+2f/exnLFiwgMcee4zNmzdTV1fnS3b+Bg0axK9//WuGDx/OuHGBPSx+3333MWbMGN566y0+/fRTZs+e7UuGGzduZOnSpVRUVDB06FBuuOEGtm7dyquvvsoXX3yBw+HgxhtvZNGiRYwcOZLdu3f7en8vLS0NaP9KKe/thJKSEtLS0sK6eyN/gdSgakTkxIYP1oO7NcELqePLzMwkNzeXl19+mbPOOuuAeYsXL+amm27yffa/kbl06VKys7PJzs7mjjvuAOCSSy7htddeA+DVV19l5syZbNq0yTfcRlZWFg899BB5eXmUlZVRWlrKKaecAnDAvbCLL76Y9957D6fTybPPPsvcuXMPifvtt9+mrKyMDz/8kMsuu4wtW7awb98+xo8f3+zxrlixwrevU089leLiYsrKvFeIzz77bKKiokhJSSE1NZWCggKWLFnC6tWrGT9+PFlZWSxZssSXhLdv384tt9zCRx99FLbDVCsVjoqKivB4PO3m8h4EVoO6AVho3YsSoATvYIXtWiA1nWA699xzufPOO1m2bBnFxcW+cmPMYf13M3PmTC6++GIuuOACRITBgwezdu3aRofbKC0tbXLbsbGxnHbaabz99tu89tprHNyPIXiHqJ86dSoZGRk888wzzJgxg4svvpiZM2c2G2Nj/T02xOHfk3LD8B/GGObMmcMf/vCHQ9b74Ycf+Pjjj3nyySd57bXXfIMwKqWaV1hYSHR0dLv6xy6QVnzZxpjRQCaQYYwZY4z5IfihdWxXXXUV9957LxkZGQeUT5s2jSeeeML32f8SX2MGDRqE3W7nwQcf9CWKpobb6NKlC0lJSaxYsQLwjjPl72c/+xm33nor48eP9w2W6G/MmDG8+uqr1NbWctJJJ3H++efzu9/97oB7aI05+eSTfftatmwZKSkpzf6RTJ06lddff53CQm9/YSUlJezYscP3H+CFF17Igw8+yHff6aN4SgWivr6e/fv3k5qa2m4u70HzQ75fYYx5UUR+flA5AMaYR4IcW4fWp08fbrvttkPK77nnHm666SZGjRqF3W7nvvvu842A638PKjMzk+effx7w1qJ+8Ytf+FrVNTfcxnPPPcdVV11FbGwsp59++gH7PvbYY0lMTGTevHmNxnz11VezZcsWsrKyiI+PJzMzk4cffpiLLrqIJUuWEBsb61vW5XL5akfz589n3rx5ZGZmEhsby8KFC5s9NyNGjOChhx5i2rRpeDweHA4HTz75JDExMcybNw+PxwPQaA1LKXWooqIijDHt6vIeNDPchohcZ4z5p4jc18hsY4x5ILihHR0dbuPw7dmzh8mTJ7Nx48ajfkbir3/9K7t37+bPf/5zK0UXGP0ZK3Wo77//HqfTyfjx44Neg2rN4TaaG/L9n9bbxcaYLw4KYFJr7FyFj+eff567776bRx555KiT09VXX01OTo6v8YZSKnTq6uooKysjPT29XV3eg8AaSfwNGBtAmWrHZs+ezezZs1tlW88880yrbEcpdfQa7uW2t8t70Pw9qOOBE4DuB92HSgSaH6NcKaVUWCgsLCQ+Pv6Ae8TtRXPXciKBeLxJLMFvKgcuCn5oSimljkZNTQ0VFRX06NEj1KEckebuQX0GfCYiC4wxO9owJqWUUq2g4fJe9+7hP/ZTYwK5B1VtjQc1EohuKNQezZVSKrwVFhaSlJREdHR0ywuHoUCaay0CNgIDgPuBXOCbIMbUYRUXF/uGy+jZsye9e/cmKyuLLl26MGJEcAYPi4+PB7xNyC+6SK/MKtVZVFZWUlVV1S4bRzQIJEF1M8Y8AziNMZ8ZY64CJgY5rg6pW7duvr70rr/+eu644w7f52CPzdKrVy9ef/31oO5DKRU+CgoKgPZ7eQ8CS1BO6zVfRM4WkTFAnyDG1Cm53W6uueYaRo4cybRp06ip8fbHm52dzcSJE8nMzOT888/3dX00efJk7rjjDk4++WSGDx/ON998wwUXXMDgwYO55557Dtm+/+CECxYs4IILLuCMM85g8ODB/PKXv/TF0NhwFs3F8Ktf/YoJEyYwZMgQX4/sSqnQcjqd7Nmzh9TUVCIjI0MdzhEL5B7UQ1ZHsf8P7/NPicAdQY2qDXz44Yfs3bu3VbfZs2dPzjzzzCNad8uWLbz88sv861//4pJLLuGNN97giiuuYPbs2b7hMe69917uv/9+HnvsMcDbpdHy5cv561//yowZM1i9ejXJyckMGjSIO+64g27dujW5v+zsbL7//nuioqIYOnQot9xyC4WFhY0OZ9FcDC6Xi1WrVvHBBx9w//33s3jx4iM6fqVU69m1axdut5v+/fuHOpSjEkhnse8ZY8qMMTnWcO/HGmPeaYvgOpMBAwaQlZUFePvEy83NPWR4jDlz5rB8+XLfOueeey4AGRkZjBw5krS0NKKiohg4cCC7du1qdn9Tp0713TwdMWIEO3bsaHQ4i5ZiaOgnsCFmpVRo1dfXs3v3blJTU4mLiwt1OEeluQd1/wY03lEfYIy5NSgRtZEjrekEy8HDTjRc4gtkHZvNdsD6NpsNl8t1WPtzuVx07dr1kOEsWhq1tmE7DdtQSoVWQ+0pPT091KEcteYu8R06IJBqU0lJSXTt2pXPP/+ck046iRdeeMFXkwmGoqIiIiMjufDCCxk0aBBz585t8xiUUkeuofbUo0ePdtlzxMGae1C3+TERWiAizwLTgUJjzCirLBl4FUjH21z9EmPMfmver4GrATdwqzHmY6v8WGABEAN8ANxmmuqCvQNauHAh119/PdXV1QwcOJDnnnsuaPvavXt3o8NZtGUMSqkjt2vXLjweT7u/99SgyeE2fAuILKWRS30tPagrIicDlcDzfgnqz0CJMeaPInIX0NUY8ysRGQG8DEwAegGLgSHGGLeIrAJuA77Cm6AeN8Z82NKB6XAbnZP+jFVnVV9fz1dffUX37t1D+jfQJsNt+LnT7300cCHQ4s0GY8xyEUk/qHgGMNl6vxBYBvzKKn/FGFMH/CgiW4EJIpILJBpjVgKIyPPAeUCLCUoppTqTnTt3YozpMLUnCCBBGWNWH1T0hYh8doT762GMybe2my8iDY8498ZbQ2qQZ5U5rfcHlzdKRK4FrgXo16/fEYaolFLtSNEW6uL7smfPng5z76lBi83MRSTZb0oRkdOBnq0cR2OjaJlmyhtljHnaGDPOGDOuPT89rZRSAakshKcns+u9P3W42hMEdolvNT8lCxfwI97GDEeiQETSrNpTGlBolecBff2W6wPsscr7NFKulFJq2R8pqraxJz6THj16EBMTE+qIWlUgD+oOMMYMtF4HG2OmGWNWHOH+3gHmWO/nAG/7lc8SkSgRGQAMBlZZlwMrRGSieMcqnu23jlJKdV77NlP99Ys8X3gKO7bndbjaEwRQgxKRaOBG4ES8NakVwFPGmNoW1nsZb4OIFBHJA+4D/gi8JiJXAzuBiwGMMetE5DVgPd5a2k3GGLe1qRv4qZn5h2gDCaWUgiX3s2L/YOocsQwbndXhak8Q2CW+54EKvP3wAVwKvICVXJpijLm0iVlTm1j+d8DvGin/FhgVQJztgt1uJyMjA6fTSUREBHPmzOH2228Pem/mB5s8eTIPP/ww48a1SmtQpVRb2vElxT8s4XvXGfQcMpiMY8eHOqKgCCRBDTXGjPb7vFREfghWQB1dTEwM2dnZgHcwscsuu4yysjLuv//+gLfhdrux2+1BilApFdaMgf/+lo8qJkB0LKdMP7fdDkjYkkD+bf9eRHzjP4nIccAXwQup80hNTeXpp5/miSeewBjDggULuPnmm33zp0+fzrJlywDvwIP33nsvxx13HCtXruSBBx5g/PjxjBo1imuvvZaGB66bGgKjpqaGWbNmkZmZycyZMwPq608pFYbWvcnmLbvYaXowdPQYdqzaTuG23aGOKigCqUEdB8wWkZ3W537ABhFZCxhjTGbQoguizZsfpKJyQ6tuMyF+OEOG/Paw1hk4cCAej4fCwsJml6uqqmLUqFE88MADAIwYMYJ7770XgCuvvJL33nuPc845B2h8CIynnnqK2NhY1qxZw5o1axg7duwRHKFSKqRc9bg/uZ9P6o4nKiaWoceM56Yd27ngq7XcPKjJR0TbrUAS1BlBj6KTC6RrQbvdzoUXXuj7vHTpUv785z9TXV1NSUkJI0eO9CWoxobAWL58Obfe6u2APjMzk8zMdvl/hVKd27fP8PmeBMrcUZx6xjSe2LCF9YMHc0m/jvncZyA9SewQkdHASVbR58aYdn8P6nBrOsGyfft27HY7qampRERE+DpqBait/amhZHR0tO++U21tLTfeeCPffvstffv2Zf78+Qcs29QQGN6W+kqpdqmmlOJPn2B1/SS6JSXhsaXxXrqLoc56rh3YK9TRBUUgPUncBiwCUq3pRRG5JdiBdQb79u3j+uuv5+abb0ZESE9PJzs7G4/Hw65du1i1alWj6zUko5SUFCorK3n99ddb3NfJJ5/MokWLAMjJyWHNmjWtdyBKqaBzL3+ExfsHU1/v5owLL+e3ZcW47BH8ffwwbB30n89ALvFdDRxnjKkCEJE/ASv5qdm5Ogw1NTVkZWX5mplfeeWV/PznPwdg0qRJDBgwgIyMDEaNGtXkfaIuXbpwzTXXkJGRQXp6OuPHt9zE9IYbbmDevHlkZmaSlZXFhAkTWvW4lFJBVLqLdV98Qm5tBscM6MuHO+tY1707lzprGNk1MdTRBU0gw22sBcY3PJhrPbj7jTEmow3iO2I63EbnpD9j1REVv3wjb60uo2Q/XPDzBzl91z5iXPV8fdpxxEZFhjq8A7T1cBvPAV+LyJt4++ObATzTGjtXSinVvOofV7F63Y/sq+rJ+BOP44EthVQlRjE/hrBLTq0tkEYSj4jIMrxdHQHMM8Z8H9SolFJKUVdby5p3n2Z7VQqx9bU4s07n49IyJuzJZdbM6aEOL+gCqUE1EMBD40NgKKWUakUul4s1S/5N4d4CKgojOH7mbG4qKCbRU8tdQ/oREXE4X9/tUyCt+O7FO/ptVyAFeE5E7gl2YEop1Vm53W7WrllD1fqPKdwHXZOT+bDrCAqiIpi+cyvHjR3d8kY6gEC6OroUbyOJ+caY+4CJwOXBDUsppTonYwwbNmygrLyciJ4TKCs3dL/4Kp51VjN8z4/MPWFsp+mLM5AElQv490QYBWwLSjRKKdWJGWPYvHkzRUVFRDtrWf3fz+gxfBT/60wgrr6O6SX5jBrVYQZ3aFEgCaoOWCciC0TkOSAHqBSRx0Xk8eCG1/Hs3buXWbNmMWjQIEaMGMFZZ53F5s2bD/uXLjc3t1P9oirVGeTm5pKfn49z316+fObvpPTtR97517DZ5uHELdmcOXVymw/NE0qB3GV705oaLAtOKB2fMYbzzz+fOXPm8MorrwCQnZ1NQUHBYW3H7Xa3vJBSqt0wxrBz505yc3PZv2UD25d8wKCx4xl6ze3clf0jQ/flM9FmOt0zfoEM+b6wuaktguwoli5disPh4Prrr/eVZWVl0bdvX9/n3NxcTjrpJMaOHcvYsWP58ssvAVi2bBlTpkzhsssuIyPjwGekt2/fzpgxY/jmm2/a5kCUUq3G4/GwefNmtm3byu7vVrF9yQeMnnoGE2/5FTeuzyPK6ea4rdmcetrUTtefZsdvp9iE327JI6eydcdEGhUfw4OD+zQ5Pycnh2OPPbbZbaSmpvLJJ58QHR3Nli1buPTSS2noEWPVqlXk5OQwYMAAXy/lmzZtYtasWTz33HNkZWW11qEopdqAy+Vi3bp17CssIG/lcorWZXPizCvpMu1cpn+/jZLaes7a+B2DU1MYPHhwqMNtc502QYUrp9PJzTffTHZ2Nna7nc2bN/vmTZgwgQEDBvg+79u3jxkzZvDGG28wcuTIUISrlDpCtbW1rF27lv3FRexY+jGVu37kzBvvoDRzAud+t4XIWg+/+v5H9tbsZuo5sztd7Qk6cYJqrqYTLCNHjmyx5/FHH32UHj168MMPP+DxeA4YyjkuLu6AZZOSkujbty9ffPGFJiil2pGKigrWrl1LRUkx2z5+B1d5Kef/6j6+6zmA237YTt86w69X5fED60lPTz/gH9POpMl7UCLyroi809TUlkF2FKeeeip1dXX861//8pV988037Nixw/e5rKyMtLQ0bDYbL7zwQrMNIiIjI3nrrbd4/vnneemll4Iau1KqdRQXF5OdnU1Z4V42vfUytvpaLrnvD7zTpTc3rt/B6Bq4/4sdZJvvSe6WzEUXXdQpa0/QfCOJh4H/BX4EaoB/WVMl3qbm6jCJCG+++SaffPIJgwYNYuTIkcyfP59evX4abOzGG29k4cKFTJw4kc2bNx9SazpYXFwc7733Ho8++ihvv/12sA9BKXWEPB4P27dvZ+3atcTExBBZXkJCQiIXP/AXHnFG8fvt+Zxda+fOFdtYaf+B1B6pzJ07l/j4+FCHHjKBDLex3Bhzcktl4UaH2+ic9GeswlFVVRUbNmygsrKStLQ0jjnmGGwi7K+q4pbt+1hSUs61dZGcunw9y6PWkdarF1dccQUxMTGhDv2wtfVwG91FZKAxZru18wFA99bYuVJKdWTGGHbv3s327dux2+2MGjWKlJQUAArrnFyxcQ85lTXc745l6PIf+CxyPX379uWyyy474P5zZxVIgroDWCYi263P6cB1QYtIKaU6gLq6OjZt2kRJSQnJyckMGzaMyEjv+E1VbjeXrdnOtuo6/mlPJG7xNyyL3EB6ejqXXnopUVFRIY4+PAQyHtRHIjIYGGYVbTTG1AU3LKWUap+MMRQWFrJlyxY8Hg+DBw+mV69evoYOHmO4bcNO1lXW8H8xXYl6dyXLHRsZNHAQM2fN9CUx1UyCEpELmpg1SEQwxvwnSDEppVS7VFFRwdatWykrKyMhIYHhw4cTGxt7wDKP5hbw3r4y7oqMJ+LdL1jh2MzgYwZzycxLcDgcIYo8PDVXgzqnmXkG0ASllFJAfX09P/74I/n5+TgcDoYMGUJaWtohzcPfKyzlL7l7ObccBq/6ipWOrQwbMpSLLrm4UwxAeLiaPCPGmHkiYgMuMsa81oYxKaVUWKsoKSK+azdfI4jc3Fw8Hg99+/alf//+jSabnNIqbsnJJaPczZk/bOQbx1ZGjhjJBRde0GnGdzpczXYWa4zxADe3USzqMKWnp1NUVHTUyyilArfusyU8c/t1rPzgXb755hu2bdtGly5dGD9+PIMGDWo0Oe3evp8rv95MQp2HuXt28IPZQmZmpianFgRSp/xERO4EXgWqGgqNMSVBi0oppcKMs7aWxc88xdpVK4kdMJgKWwTJNhuZmZkkJyc3uo6n1sW+j37kak8Z+xPt/KqigC2FaxgzZgznnHNOpxrb6UgEcnauAm4ClgOrrenbZtdQTcrNzWXYsGH87Gc/Y9SoUVx++eUsXryYSZMmMXjwYFatWkVJSQnnnXcemZmZTJw4kTVr1gDeLlKmTZvGmDFjuO666/B/yPrFF19kwoQJZGVlcd111+mYUUq1on07c3n2t78ke9063MMHsCp5FxXxlWQdk0GiLQ5Xad0hU/XafeQ/spr7KvaT3TWCuc79FOR8zbhx4zQ5BSiQZuYdspfCrVu3UllZ2arbjI+P55hjjglo3//+9795+umnGT9+PC+99BIrVqzgnXfe4fe//z19+/ZlzJgxvPXWW3z66afMnj2b7Oxs7r//fk488UTuvfde3n//fZ5++mnA23vCq6++yhdffIHD4eDGG29k0aJFzJ49u1WPT6nOxul08sUH7/L14o8xEXa2D6whP24NT+34NfK+UPB+82Ow/XtUHG/1tnF2fTl8vZyJEydy+umnd9q+9Q5XiwlKRBzADUBD10bLgH8aY5xHulMRyQUqADfgMsaME5FkvJcR04Fc4BJjzH5r+V8DV1vL32qM+fhI9x0OBgwY4Bt0cOTIkUyd6h2ILCMjg9zcXHbs2MEbb7wBeDuYLS4upqysjOXLl/Of/3gbT5599tl07doVgCVLlrB69WrGjx8PQE1NDampqSE4MqXaP2MMFRUV7MzN5euPP6Bgx3bqYupZlr6ZvukD+UPWn0je0/Lf1xc2Jw+XFzPaWU2flZ8yadIk/ud//keT02EI5B7UU4AD+Lv1+Uqr7GdHue8pxhj/u/d3AUuMMX8Ukbusz78SkRHALGAk0AtYLCJDjDFHdQ0rkJpOsPg/JW6z2XyfbTYbLper0ZusDb/Ujf1yG2OYM2cOf/jDH4IUsVIdn9vtprCwkN27d1O4O4+NK5dTv6+AzT3zyRtt45fj7uasAWd5/wZ7N7K+MeyoqWdDVQ0bKmv5v7xSerjrOfbrT5l8yilMnjxZk9NhCiRBjTfGjPb7/KmI/BCEWGYAk633C/HW1H5llb9i9V7xo4hsBSYAK4MQQ1g4+eSTWbRoEb/97W9ZtmwZKSkpJCYm+srvuecePvzwQ/bv3w/A1KlTmTFjBnfccQepqamUlJRQUVFB//79Q3wkSoU3Ywzl5eUUFBRQWFiIy+WiJC+XrZ9+RJ2rnK/HlHH2lCt4atRcYiJ+6rh1X72T9ZW1bKisYUNVLRuqathSVUuNx3tfWIBerjpOWf0ZZ5xyMiefHNZ9a4etQBKUW0QGGWO2AYjIQLyX2o6GAf4rIgbv5cKngR7GmHwAY0y+iDTUoXsDX/mtm0ej/7+AiFwLXAvQr1+/owwxdObPn8+8efPIzMwkNjaWhQsXAnDfffdx6aWXMnbsWE455RTfMY4YMYKHHnqIadOm4fF4cDgcPPnkk5qglGpCVVWVLynV1tZis9lISkzgiw9foDp7MwXdaog8ZzT/d/Iv6RnXE/AmpXcLS3mrsJRVZb4GzaRGRjAsLprZvVIYFh/N8LgYyjfk8OmHH3LaaacxadKkUB1muxfIcBtTgeeA7Xj/MegPzDPGLD3inYr0MsbssZLQJ8AtwDvGmC5+y+w3xnQVkSeBlcaYF63yZ4APjDFvNLcPHW6jc9KfsWpKTU0N+/bto7CwkMrKSkSErl27kpqayubd37P8n08RXeZmT2YUV159D2N6jqXM6eL9ojLeLijl8/0VeIBhcdHMSO3C+KQ4hsXFkBJ56P/5Ho+Hbdu2MXjw4LY/0BBrk+E2ROR24AvgM2AwMBRvgjrqzmKNMXus10IReRPvJbsCEUmzak9pQKG1eB7Q12/1PsCeo9m/Uqrja2jsUFRURFFREdXV1QAkJiZyzDHHkJqaSnF9MU+9eC+xn+UhDqHP1dO5/tRrWFxcwWNrt7O0uIJ6Y+gfHcmt/XswI7ULw+NbHqPJZrN1yuTU2pq7xNcH+CveXszXAF/iTVi7gCNOUCISB9iMMRXW+2nAA8A7wBzgj9Zrw/Cw7wAvicgjeBtJDAZWHen+lVIdl9vtprS0lKKiIoqLi6mvr0dESEpKolevXqSkpBAdHU2Nq4b/++6frH/1LQbkxeAe0IPB19zLklrh11+sp8bjIS3Kwbw+KZyX2pWshBht4BACzfXFdyeAiEQC44AT8D60+y8RKTXGjDjCffYA3rR+2BHAS9aQHt8Ar4nI1cBO4GIrjnUi8hqwHnABNx1NCz5jjP6idVAtXa5W4cEYQ01FOaV78ynbV0DXnr3oOejIahsNtaT9+/dTUlJCeXk5xhjsdjvJycmkpKSQnJzs6yXcGMP729/nX58+xsiVEdA1g69mn80PCT0o31lGssPOJT27cl6PrhyXFIdNvytCKpBGEjFAIpBkTXuAtUe6Q2tk3tGNlBcDU5tY53fA7450nw2io6MpLi6mW7dumqQ6GGMMxcXFOgppmDDGUF1WSsnuXZTsyWP/3nzKCvIpK9hLaWEBztqaA5YfcvxJnHzZHJJSe7a43aqqKsrKyigtLWX//v24XC7A+6B837596dq1K0lJSY321HD70ttZl1OC3XYhL1+UQXV0HAl2G2d2T+L81K6c2DUBh02/G8JFc/egnsb77FEF8DXeS3yPNDw82x716dOHvLw89u3bF+pQVBBER0fTp0+fUIfRqbhdTkr37qVkzy5KdudRsseadudRX1PtWy7CEUlSj54kpfagz8gMuvRIIym1J4ndU9ny9Rd88+5/2PbNSsaceS7HnX8J0XHxgLexQUVFBWVlZb6pISFFRUX5akhdunRpcqA/Z30d+Zs3smt9DqvNFLZmpONwuzitWyIX9Unl1OREou3a7VA4arIVn4h8BKQAOXiT00ogx7ST6yiNteJTSh2ZmoryAxPQnjz278mjtGAvxuPxLRef3I3kXn1I7t3H+9qrL1179SYhuRvSTN9zFSVFrHjlBdat+AxHUheGnXIa3Y4ZSnV1NR5r+7GxsSQlJZGUlESXLl2Iiopq9EqIs7aWPZs3krdhLbvWr2Xv1s24XS5EbBQcN4Xuw0Zw3f9MIcGhI9cGQ2u24mu2mbl4f/oj8d5/OgEYBZTgbfZ9X2sEECyaoJQ6cm6Xk3VLF5PzyYeUlhRRU1Hum2d3OOia1pvktN4k9+5D11596Na7L13TehEZE9vMVn9ijKGuro7KykoqKyupqKigvLyc0n2F5P7wHeWFe4mLjydr8lSGHTuh2RpSfW0NezZtYNf6teStz2Hvti143C7EZqPHwGPoOyKDPiNG0XvoSKJiA4tPHbk2S1B+O+wDTMKbpKYD3fyfWQpHmqCUCpynro66zVuoXLuGdV99zvq9edSIIaGmjn5TppIyeKhVK+pLYvfu2GyBj2Hk8XioqanxJaOGyen8qTvP2NhYEhMTSUhIICEhgYLNG1ix6DlK9uTRd0QGp1x5NT0Gersnq6+pZrcvIa2lYPtWPG43NrvdLyFl0Hvo8IATpmo9bZKgRORWvAlpEuDE28R8pfW61hrMMGxpglKqcZ7qamo3bqJ2/XrfVLl9GzuT4vixexL1jghSJILMgcMYMPEEEqZMwZ6Q0OJ2jTHU1tZSVVV1wFRdXe1rYSkixMXFkZCQQHx8vG9qbNA+t8vF2iUf8+W/F1FTWcGgY4+jqrSEgu1bMR4PNnsEPQcNpu/IDPoMH0WvocOJjG75GSUVXG2VoB7BevapoQui9kQTlFLgLiujdsPGA5JR/Y8/gvV3707pxq4BfdjqrqXe7aLf0BFMnDWbPsNG4tpXTf2eKmIzuyP2n+71uFwuampqqK6uPmCqqanx3S8Cb6OVuLi4A6bY2NjDHgeprrqKr9/6Nzmf/pfk3n28NaThGfQaMgyHttoMO21+ia890gSlOivj8bD75/+P2pwcnHl5vvKItDSiR4wgesRwPOn9Wb87l7UrluGuq2fkmFMZlTGFGFcczt2V1OSXU+esp06cxM4ciDPaUFNTQ01NDfX19QfsLyYmhtjYWN/UkIga65VfdXxt0tWRUqp9EpsNT2Ul0Rmj6DLzEispjSCia1fK8veS85+PKHrnW+Ic3ZjU/3Jsnkjqy11s/XILzggPrkTB9LFjS4jEnhiJrWQPUdFRxMTEkJycTGxsrC8pxcTE6MiwKmg0QSnVwXg8HlKf+Bs15VVU7dpPcX45Za+sojy/GOMWnBKBdB9AdYRQl1iPPQEiEqOJ7d6NpOQEYmJjiImJITo6mpgY7/vG7hEpFWyaoJRqJ4wxuFwu6urqqK+vP+S1trKGqvxSagorcBXX4qn+qZWc2+PE5aohpmssPUcOJnlQGrHdEnyJKDIyUntXUWFHE5RSIdSQdOrr63E6nQe8Njb53zM2HoO7rA4pdSElTqTESaSJoFuEg4gucex35rFrxxpqKGP4qSczbvoVxHXpGsKjVerwaIJSqhV5PB6cTiculwun0+mbGhJPY5+baqgUGRnpm+Li4nA4HNgrDSa/FnZVY3ZVE1Efg01seLpCaXIxeSUb2bJtFS5XPdFx8Yw581zGnHkOMfEtNxNXKtxoglKqEf6JpiHZ+L/3T0L+ZW530x3t2+12IiMjcTgcREdHk5CQ4EtADofjkFcRwV1eR+2WUuo2lFK7dR+eCu9lO3esh9LIInZWrOfHvT/g3F6HPSKCHgMHk3XmdHoNHU7/UaP1QVXVrmmCUh2OMQa3243b7fYlFf/3gUz+z/M0JiIiAkdEBLbaWti/H3tJCRFFRcRnZJIwOhOHw3HI1FJrN+M2uMvrcO6qoHpLKbVbS3EVejtcdUe42S/72Fm2jt3lm6l2lROTmETvocM5/tTL6TVkOD0GHkOENayEUh2BJigVFowxeDweXzLxn/zLGnvf2GtLRISIiIgDpqioqAM+OxwO7DYbsn8/nr17MXvy8eTl4d61E9eOndTv2oWprf1pow4H3e9IpdtZZzZ+jE43rtI63PvrcJXW4t5fh7u0Dtf+WtyldbjL6sC62ucRD6WmkF37N7K3+kdKnftI6dOPXmOGc/LQk+g1dDhdeqRpwwbVoWmCUgEzxvhqJx6Px5co/N839jnQeYGy2+3Y7XYiIiJ8r5GRkQd8bu59REQENpvN9+Xuqa3FtW8f9Tt2Ur9zB84dO6nfuZOanTtx7tqF8XswVSIjcfTrS2S//sRNmkRk/344+nmniC7dcVe6qVlf7E08VhLyJqVaPJXOA47DYHDa66nxVFJRW0xZdRHVrjIqXPspNyX0GDyIXmOGM2LoWaQNHuobgkKpzkITVDvXkDQ8Ho/vy7/hfUuf/RNGU2UHvx5uzyM2m82XUPzfR0VFHZJoGpsam9dYrcG4XLgrKnCXluIpL8ddVoa7rBx3eRnusjKcZVaZNc9TXoa71PvZ1NUdsC2JjiayXz+iBg4g7pRTiOw1AHv33tgTu0NEHJ5KJ+7yejwV9ThLndTuqsfz0U6MM/fAmGwGZ4STWlNFZf1+9lcWUFFbTLWrjCpXOTWuCuKSk71jI/XrSZce6fTv0ZOuvfrQvV86Nn32SHVymqCOwsHJwf99c2WBzAtkakgaR0pEfEnDZrMd8L7hnsnBiaW5ssY+B3oJyhiDp6rKm1wakkxFBe7ycpzl5bjLK/BUeF/dFeV4yr3zPOXl3tfKyqa3Dbjj43B16447oQvuuETcvXrg6R+FOyISDw5stigiHQk4bLFESiyYSIyJwlMShavEBriAn7qkdJp66kwN9aaGWlNNraeaWk8VZZWFVNbvp9pVTq27CntEBImpPenSoyddhqUxsMdQknqk0aVHTxJTe+CIjDrin59SHZ0mqCbk5+ezZ8+eJhNQw/vW0pAgbDYbNkDggFc7EJWQgN26PNXU5J9sDi4r31eAcbu991Ws5HT4DHhc4MH7nY33rQdvl/eBKn5uATU//IC7uhpPVSXuqmqwOsg3CIgdmyMK7FHYIqLBHo09NgFbbCL2mHhs0T2xJcVhi4zBRESBODASAUSAsSPGhs3YsZsI7OIgQhwtJkuDwWnqqacWp9RRba+kXupw2Z04bfXeV7sTl90FdoPY7L7zKCKILYKeXUfSxUpAST16Ep/c7bCGplBK/UQTVBM8xcV4du0Cpwu7x43d6QSnC3FZr856cDrB6UTq66HeidTVYZz13s+1dVBfD3V1iMsFLic2lxvcbmxOJ7hc4HJ557ndiMvlHZm0mXsxxyxZjKN37yM+ptfnP0LRztwjXr85ERJJhC2SCHHgsP30PsIWhUMc3s+2SCIkEofNQYT0IKL3dCJskURKJBE2h29+hC0SuwT2pW6MwWXqcbnrcXrq8Ygbj90NEW5wuJBIF/ZoF/YYN/a4KCLjY4hMjCUyMZ7opHjssZHYouzYoiOwxTsQHfpbqbChCaoJkcs+I/6JJ5pfyGZDoqOxRUZ6X6OikOhoJCrK+z42FunaBXE4EHuE98vPHoHY7RBhb7zMZkci7D+V2W3e5SLs2JKSjuqYpgy4HJJbbuHWIgO4QVyACyTw9g0YG95KTsSBrzjE92oiBFeEgAOIEMQh3nKHzfderPfisBGfkEBsYhIxCYl630apDqTjJijP0Q0jknTuOcSOOxaJjMIWbSUev/e2yEhwtHzZKJwk9O6OO66u5QUDIFF2bJF2JMqORNqxRdmbLPOVR9oPGFdIKaWa02ETlKvs6L6II/v1I7Jfv1aKJjx0nXFMqENQSqmAddgL7vZYfaJeKaXasw6boCRK70UopVR71mETlFJKqfZNE5RSSqmwpAlKKaVUWNIEpZRSKixpglJKKRWWNEEppZQKS5qglFJKhSVNUEoppcKSJiillFJhqd0kKBE5Q0Q2ichWEbkr1PEopZQKrnaRoETEDjwJnAmMAC4VkRGhjUoppVQwtYsEBUwAthpjthtj6oFXgBkhjkkppVQQtZcE1RvY5fc5zyo7gIhcKyLfisi3+/bta7PglFJKtb72kqAaG+XukBEJjTFPG2PGGWPGde/evQ3CUkopFSztJUHlAX39PvcB9oQoFqWUUm2gvSSob4DBIjJARCKBWcA7IY5JKaVUELWLId+NMS4RuRn4GLADzxpj1oU4LKWUUkHULhIUgDHmA+CDUMehlFKqbbSXS3xKKaU6GU1QSimlwpImKKWUUmFJE5RSSqmwJMYc8rxrhyAiFcCmUMdxGFKAolAHEaD2FCtovMGm8QZXe4t3qDEmoTU21G5a8R2BTcaYcaEOIlAi8m17ibc9xQoab7BpvMHVHuNtrW3pJT6llFJhSROUUkqpsNSRE9TToQ7gMLWneNtTrKDxBpvGG1ydNt4O20hCKaVU+9aRa1BKKaXaMU1QSimlwlKHS1AicoaIbBKRrSJyV6jjARCRviKyVEQ2iMg6EbnNKp8vIrtFJNuazvJb59fWMWwSkdNDEHOuiKy14vrWKksWkU9EZIv12jUc4hWRoX7nMFtEykXk9nA6vyLyrIgUikiOX9lhn08ROdb6uWwVkcdFpLHBPIMV719EZKOIrBGRN0Wki1WeLiI1fuf5H20ZbxOxHvbPPsTn9lW/WHNFJNsqD+m5tfbT1PdX8H9/jTEdZsI7FMc2YCAQCfwAjAiDuNKAsdb7BGAzMAKYD9zZyPIjrNijgAHWMdnbOOZcIOWgsj8Dd1nv7wL+FC7xHvQ7sBfoH07nFzgZGAvkHM35BFYBx+MdZfpD4Mw2jHcaEGG9/5NfvOn+yx20naDH20Ssh/2zD+W5PWj+/wL3hsO5tfbT1PdX0H9/O1oNagKw1Riz3RhTD7wCzAhxTBhj8o0x31nvK4ANQO9mVpkBvGKMqTPG/AhsxXtsoTYDWGi9Xwic51ceLvFOBbYZY3Y0s0ybx2uMWQ6UNBJHwOdTRNKARGPMSuP9a3/eb52gx2uM+a8xxmV9/ArvyNZNaqt4mzi3TQnLc9vAqlFcArzc3DbaON6mvr+C/vvb0RJUb2CX3+c8mk8EbU5E0oExwNdW0c3WJZNn/arI4XAcBviviKwWkWutsh7GmHzw/tICqVZ5OMTbYBYH/nGH6/mFwz+fva33B5eHwlV4/wNuMEBEvheRz0TkJKss1PEezs8+1LE2OAkoMMZs8SsLm3N70PdX0H9/O1qCaux6Zti0oxeReOAN4HZjTDnwFDAIyALy8VbtITyOY5IxZixwJnCTiJzczLLhEC8iEgmcC/zbKgrn89ucpuILi7hF5G7ABSyyivKBfsaYMcDPgZdEJJHQxnu4P/uwOLfApRz4D1bYnNtGvr+aXLSRsiM6xx0tQeUBff0+9wH2hCiWA4iIA+8Pd5Ex5j8AxpgCY4zbGOMB/sVPl5lCfhzGmD3WayHwphVbgVVNb7jEUGgtHvJ4LWcC3xljCiC8z6/lcM9nHgdeVmvzuEVkDjAduNy6TIN1KafYer8a7z2HIaGM9wh+9uFwbiOAC4BXG8rC5dw29v1FG/z+drQE9Q0wWEQGWP9NzwLeCXFMDdeVnwE2GGMe8StP81vsfKChVc87wCwRiRKRAcBgvDcX2yreOBFJaHiP9+Z4jhXXHGuxOcDb4RCvnwP++wzX8+vnsM6ndRmlQkQmWr9Ts/3WCToROQP4FXCuMabar7y7iNit9wOteLeHMt7D/dmH+txa/gfYaIzxXQYLh3Pb1PcXbfH7G4xWH6GcgLPwtjLZBtwd6nismE7EW5VdA2Rb01nAC8Baq/wdIM1vnbutY9hEkFrnNBPvQLytcH4A1jWcR6AbsATYYr0mh0O81v5jgWIgya8sbM4v3sSZDzjx/id59ZGcT2Ac3i/bbcATWL3BtFG8W/HeW2j4Hf6HteyF1u/JD8B3wDltGW8TsR72zz6U59YqXwBcf9CyIT231n6a+v4K+u+vdnWklFIqLHW0S3xKKaU6CE1QSimlwpImKKWUUmFJE5RSSqmwpAlKKaVUWNIEpVQbEa8VInKmX9klIvJRKONSKlxpM3Ol2pCIjMLbFdMYvD2vZwNnGGO2HcG27MYYd+tGqFT40ASlVBsTkT8DVUCc9dofyAAigPnGmLetTjlfsJYBuNkY86WITAbuw/ugZ5YxZkTbRq9U29EEpVQbs7qP+g6oB94D1hljXhTvAICr8NauDOAxxtSKyGDgZWPMOCtBvQ+MMt6hDJTqsCJCHYBSnY0xpkpEXgUq8Y79c46I3GnNjgb64e1E8wkRyQLceDsIbbBKk5PqDDRBKRUaHmsS4EJjzCb/mSIyHygARuNtzFTrN7uqjWJUKqS0FZ9SofUxcIvVuzMiMsYqTwLyjXe4iCvxNqhQqlPRBKVUaD0IOIA1IpJjfQb4OzBHRL7Ce3lPa02q09FGEkoppcKS1qCUUkqFJU1QSimlwpImKKWUUmFJE5RSSqmwpAlKKaVUWNIEpZRSKixpglJKKRWW/j8BQhxVN/YE0QAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "# The function I found that best matches the data has the form\n", + "# a + b / (c - x)\n", + "\n", + "# This function is hard to explain physically; that is, it doesn't\n", + "# correspond to a growth model that makes sense in terms of human \n", + "# behavior.\n", + "\n", + "# And it implies that the population goes to infinity in 2040.\n", + "\n", + "from numpy import linspace\n", + "from matplotlib.pyplot import plot\n", + "\n", + "xs = linspace(100, 1950)\n", + "ys = 110 + 200000 / (2040 - xs)\n", + "table1.plot()\n", + "plot(xs, ys, color='gray', alpha=0.5, label='model')\n", + "\n", + "decorate(xlim=[0, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "trained-valuable", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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drxDatRp560ws/OA+4Ex4f4GuLuPa22h4SCL+Nz5JSLSjdU9cDA/P59FixZx1llnxTukJkUzsdLvga8SzChRE9twREQkVo4cOcKjjz5KcXEx119/PVOnTo13SM2KJkGVu/tLMY9ERERipm76ooqKCm655RbOPPPMeId0WtEkqFfN7P8SXC86UbfS3d+JWVQiItJuDh48yCOPPMKJEye4/fbbO829pdEkqHnhe+QYdQcubv9wRESkPRUVFbFkyRLMjDvvvJMRI0bEO6SonTZBuXvHPT5RRETaTV5eHo8//jh9+vTh9ttvj9us5K0VzSi+QcB9wIXhqlXA99y9PJaBiYhI6+3YsYMnn3ySwYMHc/vtt5OSkhLvkFosmvug/gAcBm4MXxXAA7EMSkREWu/dd9/liSeeID09nbvuuqtTJieI7hrUGe7+qYjP3zWzTTGKR0REWsndefXVV/nb3/5GdnY2N998M7179453WK0WTYI6bmbnu/saqL9x93hswxIRkZaoqqpi+fLlvP/++8yePZuFCxfSs2fPeIfVJtEkqH8GHgqvRRlQCtwZy6BERCR6hw8f5oknnqCwsJDLLruMc845BzOLd1htFs0ovk3ATDNLCT9XxDooERGJTlFREY8//jgnTpzg5ptvZuLEifEOqd00maDM7DZ3X2JmX2uwHgB3/0WMYxMRkWZs27aNZ555hn79+nH33XczfPjweIfUrpprQfUP3wc2si0+TzkUERHcnbVr17Jy5UoyMjK46aabGDBgQLzDanfNPfL9t+HiCndfG7ktHCghIiIdrLq6mj/96U9s3ryZadOmce2115KUFM1wgs4nmlr9Gmg4H3tj60REJIYqKipYunQp+fn5XHTRRVx44YVdYjBEU5q7BnUu8DEgvcF1qBSgc49dFBHpZHbt2sWyZcuoqqrqFI/KaA/NtaB6AQPCfSKvQ1UA17elUDMbDPwOmEZwPetud3+jLecUEemKamtrWb16NatWrSI9PZ0bb7yRoUOHxjusDtHcNahVwCoze9Dd89q53F8BL7v79WbWC+jXzucXEen0jh49yrJly9i9ezczZsxg4cKF9OrVK95hdZhorkEdC58HNRXoU7fS3Vv1uI3wfqoLCW/2dfeTwMnWnEtEpKvau3cvS5cu5dixY1x99dWcddZZXfp6U2OimSz2UeDvwFjgu0Au8HYbyhwHHAAeMLONZvY7M+vfcCczu9fM1pvZ+gMHDrShOBGRzsPdef3113nwwQdJSkrinnvuYc6cOd0uOUF0CSrN3X8PVLn7Kne/GzinDWUmEYwA/C93nw0cBf614U7uvtjdc9w9Jz09vQ3FiYh0DpWVlTz55JO88sorTJw4kXvvvZeRI0fGO6y4iaaLryp8LzKzhUAhkNGGMguAAnd/K/y8lEYSlIhId1JQUMCyZcsoLy/n8ssvZ968ed2y1RQpmgT1g3Ci2K8T3P+UAny1tQW6+z4zyzezie6+HVgAvN/a84mIdGY1NTWsWrWKNWvWkJKSwp133klmZma8w0oI0UwW+6dwsRxor8e//wvwaDiCbzdwVzudV0Sk0zhw4ADPPPMMRUVFzJo1iyuuuKJTP7+pvTV3o+6vaWbOPXf/UmsLDWdIz2nt8SIinZm789Zbb7FixQp69+7NjTfeyOTJk+MdVsJprgW1vsOiEBHpJsrLy3n22WfZs2cPEyZMYNGiRV1yotf20NyNug91ZCAiIl2Zu/Pee+/x4osvUltby6JFi5g9e3a3HwjRnNNegzKzV2mkq6+1N+qKiHQ3x44d48UXX2Tr1q1kZmZy3XXXMWTIkHiHlfCiGcX3jYjlPsCngOrYhCMi0nXUtZr+/Oc/U1lZycUXX8x5551Hjx7R3IIq0Yzi29Bg1VozWxWjeEREuoRDhw7xwgsvsGvXLkaPHs2iRYu63BNvYy2aLr7IdmgPYA4wImYRiYh0YrW1tbz55pu8+uqr9OjRgyuvvJKcnBy1mlohmi6+DQTXoIyga28PcE8sgxIR6YwKCwt5/vnn2bdvHxMnTuTKK69k0KBB8Q6r04qmi29sRwQiItJZnTx5kldffZW33nqL/v37c8MNNzB58mSN0GujaLr4+gBfAM4naEmtIZjotTLGsYmIJLwPPviAF198kfLycubMmcMll1xCnz59Tn+gnFY0XXwPA4cJ5uEDuAV4BLghVkGJiCS6kpIS/vznP7Njxw6GDh3KXXfdRVZWVrzD6lKiSVAT3X1mxOdXzWxzrAISEUlklZWVrF69mrfeeoukpCQuvfRS5s2bR8+ePeMdWpcTTYLaaGbnuPubAGY2D1gb27BERBKLu7Np0yZWrlzJ0aNHmTVrFgsWLNA0RTEUTYKaB3zGzPaGn7OAbWb2HuDuPiNm0YmIJID8/HxeeuklioqKyMjI4NOf/jSjRo2Kd1hdXjQJ6oqYRyEikoAqKipYsWIF7733HgMHDuQTn/gE06dP1+i8DhLNMPM8M5sJXBCu+pu76xqUiHRZJ06cYO3atbz55pvU1tZy/vnnc8EFF9CrV694h9atRDPM/MvA54Bl4aolZrbY3X/dzGEiIp1OdXU1b7/9Nn/72984fvw4U6dOZcGCBaSmpsY7tG4pmi6+e4B57n4UwMx+CrzBP4adt5iZ5RIMXa8Bqt1dDy8Ukbipra3l3Xff5bXXXqO8vJxx48axYMECXWeKs2gSlBEkkjo14bq2+ri7H2yH84iItIq7s2PHDlauXElxcTEjR47kmmuuYdy4cfEOTYguQT0AvGVmzxAkpmuB38c0KhGRGMvPz2fFihXs3buXIUOGcP311zNlyhQNgEgg0QyS+IWZvUYw1RHAXe6+sY3lOvAXM3Pgt+6+uOEOZnYvcC+gu7NFpN0UFBSwevVqduzYwYABA1i4cCGzZ8/WjbYJKJoWVB0Dammf7r3z3L3QzIYBr5jZ3919deQOYdJaDJCTk/ORJ/qKiLREfn4+q1atYteuXfTt25eLL76YefPmaWReAotmFN93CObde5ogOT1gZk+5+w9aW6i7F4bvxWHX4dnA6uaPEhFpuby8PFavXs3u3bvp168fl1xyCXPnzlVi6gSiaUHdAsyum73czH4CvAO0KkGZWX+gh7sfDpcvA77XmnOJiDQlNzeXVatWkZubS//+/bn00kvJyclRYupEoklQuUAfoO7xGr2BXW0oczjwTHghMgl4zN1fbsP5RESAYFTenj17WL16NXl5eQwYMIDLL7+cOXPmkJycHO/wpIWiSVAngK1m9grB4IZLgTVm9u8A7v6llhTo7ruBmafdUUQkSrW1tWzdupXXX3+dffv2MXDgQK644grOOussJaZOLJoE9Uz4qvNabEIREWmZkydPsnHjRt544w3Ky8tJS0tj0aJFzJgxg6SklowBk0QUzTDzhzoiEBGRaB05coR169bx9ttvU1lZSVZWFldeeSUTJkzQfUxdiP7EEJFOo6SkhNdff53NmzdTU1PDpEmT+NjHPkZmZma8Q5MYUIISkYTm7uzcuZN169axc+dOevbsyaxZszj33HNJS0uLd3gSQ0pQIpKQTpw4waZNm1i3bh2lpaUMGDCA+fPnk5OTo6fYdhNNJigze55g1F6j3P2amEQkIt3awYMHWbduHZs3b+bkyZNkZGRw0UUXMWXKFE1H1M0014L6efj+SWAEsCT8fAvBvVEiIu2itraWHTt2sG7dOnbv3k3Pnj2ZNm0aZ599th550Y01maDcfRWAmX3f3S+M2PS8mWlaIhFps/LycjZu3MjGjRupqKhg4MCBfPzjH2fOnDn0798/3uFJnEVzDSrdzMaFN9hiZmOB9NiGJSJdVV1racOGDezcuRN354wzzuDyyy9n4sSJ6saTetEkqK8Cr5nZ7vBzNvD5mEUkIl1SWVkZ77zzDps2beLw4cMMGDCA888/n9mzZ+uR6tKoaG7UfdnMxgOTwlV/d/cTsQ1LRLqC6upqtm/fzsaNG9m1K5jCc/z48Vx11VVMmDCBHj16xDlCSWTNjeL7ZBObzjAz3H1ZjGISkU7M3fnwww/ZtGkTW7dupbKykpSUFObPn8/s2bMZNGhQvEOUTqK5FtSiZrY5oAQlIvXKy8vZvHkz7777LiUlJSQlJTF58mRmzpzJ2LFj1VqSFmtuFN9dZtYDuN7dn+zAmESkkzh58iTbtm1j8+bN7NmzB4AxY8Zw3nnnMWXKFHr37h3nCKUza/YalLvXmtn/AJSgRASAmpoadu7cyZYtW9i+fTtVVVWkpqYyf/58Zs6cqQEP0m6iGcX3ipl9A/gjcLRupbuXxiwqEUkotbW15ObmsmXLFrZt20ZlZSV9+/Zl+vTpzJw5k8zMTM0iLu0umgR1d/j+xYh1DoxrS8Fm1hNYD3zo7le35Vwi0v7cnYKCArZs2cLWrVs5evQovXr1YtKkSUybNo1x48bpniWJqWiGmY+NUdlfBrYBKTE6v4i0UN0IvPfff59t27ZRVlZGz549mTBhAtOmTWP8+PF6Qq10mNMmKDNLBv4ZqJvu6DXgt+5e1dpCzSwDWAj8EPhaa88jIm1XW1tLfn5+fVI6fPgwPXr0YNy4cVx00UVMmjRJgx0kLqLp4vsvIBn4z/Dz7eG6z7ah3F8C3wQGNrWDmd0L3AuQlZXVhqJEpKG6a0rvv/8+f//73zl69Cg9e/bkzDPPZPLkyUycOJE+ffrEO0zp5qJJUHPdfWbE57+a2ebWFmhmVwPF7r7BzC5qaj93XwwsBsjJyWnysR8iEp2TJ0+ya9cuPvjgA7Zv387x48dJTk5m/PjxTJkyhfHjx9OrV694hylSL5oEVWNmZ7j7LgAzGwfUtKHM84BrzOwqoA+QYmZL3P22NpxTRBpx+PDh+oS0e/duampq6NOnD+PHj2fy5MmceeaZuqYkCSuaBPU/gVfDyWINGAPc1doC3f1bwLcAwhbUN5ScRNqHu1NcXMz27dvZvn07hYWFAAwePJicnBwmTpxIVlaWRt9Jp9DcXHxfAdYCq4DxwESCBKXJYkUSyMmTJ8nNzWXHjh3s3LmTsrIyAEaPHs3FF1/MxIkTSU9P131K0uk014LKAH5FMIv5u8DrBAkrH2iXBOXurxGMChSRFigpKWHnzp3s2LGD3NxcampqSE5OZty4cZx//vlMmDCBgQObHIMk0ik0NxffNwDMrBeQA3yM4Kbd/zazMnef0jEhikhVVRV5eXn1raTS0mAil7S0NObOncv48ePJysoiKSmaXnuRziGaf819CW6mHRS+CoH3YhmUSHfn7uzbt4/du3eza9cu9u7dS01NDUlJSYwdO5Z58+Yxfvx4zXsnXVpz16AWA1OBw8BbBF18v3D3Qx0Um0i3UlFRUZ+Qdu/ezbFjxwAYNmwYc+fOZdy4cWRnZ2vUnXQbzbWgsoDewA7gQ6AAKOuAmES6hePHj5OXl8eePXvYs2cPBw4cAKB///6ceeaZjBs3jnHjxulaknRbzV2DusKCYT9TCa4/fR2YZmalwBvufl8HxSjSJZw8eZK8vDxyc3PZs2cPRUVFACQlJZGVlcWsWbM444wzGDZsmEbciXD650E5sMXMyoDy8HU1cDagBCXSjKqqKvLz88nNzSU3N5cPP/yQ2tpaevbsSUZGBvPnz2fs2LGMHj1agxtEGtHcNagvEbSczgOqCIaYvwH8AQ2SEPmIyspK8vPzycvLIy8vj8LCQmprazEzRo0axcc+9jHGjh1LZmamriOJRKG5P9uygaXAV929qGPCEek8jh49yt69e+sT0v79+3F3evTowejRozn33HMZM2YMWVlZmg1cpBWauwalx2CIhNydkpIS8vPz2bt3L/n5+ZSUlADBNaSMjAwuvPBCxowZQ0ZGhlpIIu1AHd8ijaiurqawsLA+GeXn53P8+HEA+vbtS2ZmJrNmzWLMmDGMGjVKc9uJxIASlHR77k55eTkFBQUUFBTw4YcfUlRURE1NMGl/WloaEydOJDMzk6ysLNLS0jTKTqQDKEFJt3Py5EkKCwtPSUhHjhwBgu66UaNGMW/ePDIzM8nMzKR///5xjlike1KCki6tpqaG4uJiPvzwQwoLCyksLKS4uJjgDoqgdTRu3DgyMjLIyMhg2LBh6q4TSRBKUNJl1A1kiExG+/bto7q6GgiuHY0aNYoJEyaQmZnJ6NGj6devX5yjFpGmKEFJp1RbW0tpaSmFhYUUFRVRVFTEvn37OHEieBJMcnIyI0eOJCcnh9GjRzNq1ChSU1N17UikE+nwBGVmfYDVBPP8JQFLNW2SNKe2tpaDBw9SVFRU3yoqKiqiqqoKCK4bDR8+nOnTpzNq1ChGjx7N0KFD6dGjR5wjF5G2iEcL6gRwsbsfMbNkYI2ZveTub8YhFkkwJ0+eZP/+/ezbt6/+VVxcXN9Nl5yczIgRI5g9ezYjR45k5MiRpKenKxmJdEEdnqDC+f2OhB+Tw5d3dBwSX+7O4cOHP5KM6h7EB8E1oxEjRjB37lxGjBjByJEjSUtLUzIS6Sbicg3KzHoCG4Azgf9w97fiEYd0jJMnT3LgwAH2799/yquysrJ+n8GDBzNy5EhmzJjBiBEjGDFiBCkpKbpmJNKNxSVBuXsNMMvMBgPPmNk0d98SuY+Z3QvcC5CVldXxQUqL1dbWUlJSQnFxMQcOHKC4uJj9+/ef0irq1asXw4YNY+rUqQwbNozhw4czfPhw+vTpE8fIRSQRxXUUn7uXmdlrwBXAlgbbFgOLAXJyctQFmEDcnbKyMoqLi09JRgcPHqyffcHMSE1NZfjw4cyYMaM+EQ0ePFitIhGJSjxG8aUDVWFy6gtcAvy0o+OQ06utreXQoUMcOHCAAwcOcPDgwfrlukELAIMGDWLYsGH1D9sbNmwYQ4cO1YSpItIm8WhBjQQeCq9D9QCedPc/xSEOCVVVVVFaWsrBgwfrX3UJqa5FBJCSkkJ6ejo5OTkMHTqU4cOHk56erkdJiEhMxGMU37vA7I4ut7tzd44dO3ZKEqp7lZWVnbLv4MGDSU9P54wzziA9PZ309HSGDh2qRCQiHUozSXQxVVVVlJSUNPqKHDWXlJTE0KFDycjIYObMmQwdOpShQ4eSlpamrjkRSQhKUJ1QdXU1ZWVllJSUUFpaesp7RUXFKfumpKSQlpbGtGnTSEtLq09EgwYN0mAFEUloSlAJqrq6mkOHDlFaWvqRV3l5ef1s3BDc0DpkyBCys7NJS0s75aXWkIh0VkpQcVRZWXlKEjp06FD954Ytod69e5OWlkZGRgYzZswgLS2NIUOGkJaWRt++feNUAxGR2FGCiqHa2lrKy8vrE8+hQ4coKyurX657hHid/v37k5qaSnZ2NqmpqQwZMoQhQ4aQmppKv3791CUnIt2KElQbuDtHjhypTzplZWUfeUV2xfXo0YPBgweTmprKyJEjSU1NrU9EqampGiUnIhJBCaoZdROalpeXU1ZWdsp7XUKKvE8I/tEKGj16NFOnTq1PQqmpqaSkpGiiUxGRKHXrBFVdXU1FRQXl5eX1r8hEVFFR8ZEE1LdvXwYPHsywYcOYMGECqampDB48uP6lQQkiIu2jyyYod+fo0aOUl5efkoQil48cOfKR4wYMGMDgwYMZNWoUkydPrk88gwYNYvDgwfTq1SsOtRER6X46ZYJyd44fP05FRUV9wmlsuWHrJykpiUGDBjFo0CDGjx9fv1z3SklJISmpU34lIiJdTqf4bVxRUcGyZcvqE09jyadHjx4MHDiQQYMGMXr0aCZPnlyfdOreNRJORKTz6BQJ6ujRo+Tn55OSklKffFJSUk559e/fXwMQRES6kE6RoEaOHMmXv/zleIchIiIdSE0OERFJSEpQIiKSkJSgREQkIXV4gjKzTDN71cy2mdlWM9PFJRER+Yh4DJKoBr7u7u+Y2UBgg5m94u7vxyEWERFJUB3egnL3Ind/J1w+DGwDRnd0HCIiktjieg3KzLKB2cBb8YxDREQST9wSlJkNAJ4GvuLuFY1sv9fM1pvZ+gMHDnR8gCIiEldxSVBmlkyQnB5192WN7ePui909x91z0tPTOzZAERGJu3iM4jPg98A2d/9FR5cvIiKdQzxaUOcBtwMXm9mm8HVVHOIQEZEE1uHDzN19DaApxUVEpFmaSUJERBKSEpSIiCQkc/d4x3BaZnYY2B7vOGJsKHAw3kHEmOrYNaiOXUMi1XGMu39kuHaneB4UsN3dc+IdRCyZ2XrVsfNTHbsG1TExqItPREQSkhKUiIgkpM6SoBbHO4AOoDp2Dapj16A6JoBOMUhCRES6n87SghIRkW5GCUpERBJSvGYz/4OZFZvZloh1M83sDTN7z8yeN7OUcH22mR2PmLfv/0UcMyfcf6eZ/Xs4EW1CaEkdw20zwm1bw+19wvVdoo5mdmvEz3CTmdWa2axwW8LWEVpcz2Qzeyhcv83MvhVxTMLWs4V17GVmD4TrN5vZRRHHJGQdzSzTzF4NfyZbzezL4fohZvaKme0I31MjjvlWWI/tZnZ5xPouUUczSwv3P2Jmv2lwrsSoo7t3+Au4EDgL2BKx7m1gfrh8N/D9cDk7cr8G51kHnEswt99LwJXxqE871DEJeBeYGX5OA3p2pTo2OG46sLsz/Bxb8bP8NPBEuNwPyAWyE72eLazjF4EHwuVhwAagRyLXERgJnBUuDwQ+AKYAPwP+NVz/r8BPw+UpwGagNzAW2JXo/ydbUcf+wPnAPwG/aXCuhKhjXFpQ7r4aKG2weiKwOlx+BfhUc+cws5FAiru/4cE3+jBwXTuH2motrONlwLvuvjk8tsTda7pYHSPdAjwOif9zhBbX04H+ZpYE9AVOAhWJXs8W1nEKsDI8rhgoA3ISuY7uXuTu74TLh4FtwGjgWuChcLeH+Ee81xL8oXHC3fcAO4Gzu1Id3f2oB5N3V0aeJ5HqmEjXoLYA14TLNwCZEdvGmtlGM1tlZheE60YDBRH7FITrEllTdZwAuJn92czeMbNvhuu7Uh0j3USYoOicdYSm67kUOAoUAXuBn7t7KZ2znk3VcTNwrZklmdlYYE64rVPU0cyygdnAW8Bwdy+C4Bc8QYsQgrjzIw6rq0tXqmNTEqaOiZSg7ga+aGYbCJqnJ8P1RUCWu88GvgY8FvaFN9Ynmuhj5puqYxJBU/vW8P0TZraArlVHAMxsHnDM3euudXTGOkLT9TwbqAFGEXQNfd3MxtE569lUHf9A8EtrPfBL4HWgmk5QRzMbQPA076+4e0VzuzayzptZnzBaUMcmT9HIurjUMWHm4nP3vxN0dWFmE4CF4foTwIlweYOZ7SJocRQAGRGnyAAKOzLmlmqqjgR1WeXuB8NtLxJcD1hC16ljnZv5R+sJOuHPEZqt56eBl929Cig2s7VADvA3Olk9m/k/WQ18tW4/M3sd2AEcIoHraGbJBL+4H3X3ZeHq/WY20t2Lwq6t4nB9Aae2/uvqktD/XltYx6YkTB0TpgVlZsPC9x7AvwH/L/ycbmY9w+VxwHiCC+xFwGEzOyccYfIZ4Nm4BB+lpuoI/BmYYWb9wmsX84H3u1gd69bdADxRt64z1hGaredegqdFm5n1B84B/t4Z69nM/8l+Yd0ws0uBandP6H+vYTy/B7a5+y8iNj0H3BEu38E/4n0OuNnMeofdmOOBdV2sjo1KqDrGY2QGwV/QRUAVQba+B/gywaiTD4Cf8I9ZLj4FbCXo934HWBRxnhyCfvJdwG/qjkmEV0vqGO5/W1jPLcDPumgdLwLebOQ8CVvHVvx7HQA8Ff4s3wf+Z2eoZwvrmE3w+JttwAqCRyUkdB0Jus6dYLTspvB1FcGI2ZUELcCVwJCIY/53WI/tRIxi62J1zCUYHHMk/LlPSaQ6aqojERFJSAnTxSciIhJJCUpERBKSEpSIiCQkJSgREUlISlAiIpKQlKBEOkh4b9QaM7syYt2NZvZyPOMSSVQaZi7SgcxsGsF9UrOBngT3qlzh7rtaca6e7l7TvhGKJA4lKJEOZmY/I5hQtn/4PobgESRJwP3u/mw42ecj4T4A/8PdX7fg2Uv3EdxUO8vdp3Rs9CIdRwlKpIOF0wS9QzD56p+Are6+xMwGEzyHZzbBjAC17l5pZuOBx909J0xQLwDTPHgMhEiXlTCTxYp0F+5+1Mz+SDC9zI3AIjP7Rri5D5BFMDnnbyx46nANwQTJddYpOUl3oAQlEh+14cuAT7n79siNZnY/sB+YSTCYKfKhckc7KEaRuNIoPpH4+jPwL+Gs0ZjZ7HD9IKDI3WuB2wkGVIh0K0pQIvH1fSAZeNfMtoSfAf4TuMPM3iTo3lOrSbodDZIQEZGEpBaUiIgkJCUoERFJSEpQIiKSkJSgREQkISlBiYhIQlKCEhGRhKQEJSIiCen/B7ItKS9fJ1QOAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "# And it doesn't do a particularly good job of predicting\n", + "# actual growth from 1940 to the present.\n", + "\n", + "# TODO: load these series from table2\n", + "#plot(census, ':', label='US Census')\n", + "#plot(un, '--', label='UN DESA')\n", + "\n", + "xs = linspace(1940, 2020)\n", + "ys = 110 + 200000 / (2040 - xs)\n", + "plot(xs, ys/1000, color='gray', label='model')\n", + "\n", + "decorate(xlim=[1950, 2016], xlabel='Year', \n", + " ylabel='World population (billions)',\n", + " title='Prehistoric population estimates')" + ] + }, + { + "cell_type": "markdown", + "id": "surprised-designation", + "metadata": {}, + "source": [ + "## One queue or two?\n", + "\n", + "This case study is related to **queueing theory**, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", + "\n", + "Suppose you are designing the checkout area for a new store. There is\n", + "enough room in the store for two checkout counters and a waiting area\n", + "for customers. You can make two lines, one for each counter, or one line that feeds both counters.\n", + "\n", + "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you might have to install barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", + "\n", + "So you'd like to check whether the single line is really better and by\n", + "how much. Simulation can help answer this question.\n", + "\n", + "This figure shows the three scenarios we'll consider:\n", + "\n", + "![One queue, one server (left), one queue, two servers (middle), two\n", + "queues, two servers (right).](figs/queue.pdf){width=\"4.5in\"}\n", + "\n", + "As we did in the bike share model, we'll assume that a customer is equally likely to arrive during any time step. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "\n", + "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they always have the same probability of finishing during the next time step, regardless of how long they have been checking out. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", + "\n", + "If we choose $\\mu=1/5$ per minute, the average time for each checkout\n", + "will be 5 minutes, which is consistent with the data. Most people takes less than 5 minutes, but a few take substantially longer, which is probably not a bad model of the distribution in real stores.\n", + "\n", + "Now we're ready to get started. In the repository for this book, you'll find a notebook called `queue.ipynb` that contains some code to get you started and instructions.\n", + "\n", + "As always, you should practice incremental development: write no more\n", + "than one or two lines of code a time, and test as you go!" + ] + }, + { + "cell_type": "markdown", + "id": "practical-arrest", + "metadata": {}, + "source": [ + "## Predicting salmon populations\n", + "\n", + "Each year the U.S. Atlantic Salmon Assessment Committee reports\n", + "estimates of salmon populations in oceans and rivers in the northeastern United States. The reports are useful for monitoring changes in these populations, but they generally do not include predictions.\n", + "\n", + "The goal of this case study is to model year-to-year changes in\n", + "population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", + "\n", + "As an example, I use data from page 18 of the 2017 report, which\n", + "provides population estimates for the Narraguagus and Sheepscot Rivers\n", + "in Maine.\n", + "\n", + "In the repository for this book, you'll find a notebook called\n", + "`salmon.ipynb` that contains some code to get you started and\n", + "instructions.\n", + "\n", + "You should take my instructions as suggestions; if you want to try\n", + "something different, please do!" + ] + }, + { + "cell_type": "markdown", + "id": "hungarian-cliff", + "metadata": {}, + "source": [ + "## Tree growth\n", + "\n", + "This case study is based on \"Height-Age Curves for Planted Stands of\n", + "Douglas Fir, with Adjustments for Density\", a working paper by\n", + "Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", + "\n", + "It provides \"site index curves\", which are curves that show the\n", + "expected height of the tallest tree in a stand of Douglas firs as a\n", + "function of age, for a stand where the trees are the same age.\n", + "\n", + "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\\\" that indicates the quality of the site.\n", + "\n", + "The following figure shows site curves for three different site\n", + "indices. \n", + "\n", + "![Site index curves for tree\n", + "growth.](figs/trees-fig01.pdf){height=\"3in\"}\n", + "\n", + "The goal of this case study is to explain the shape of these\n", + "curves, that is, why trees grow the way they do.\n", + "\n", + "As a starting place, let's assume that the ability of the tree to gain\n", + "mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A$$\n", + "\n", + "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", + "\n", + "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power: $m = \\beta h^D$ where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. I start by assuming $D=3$, but then revisit that assumption.\n", + "\n", + "Finally, we'll assume that area is proportional to height squared:\n", + "\n", + "$$A = \\gamma h^2$$\n", + "\n", + "I specify height in feet, and choose units for mass and area so that\n", + "$\\beta=1$ and $\\gamma=1$. Putting all that together, we can write a\n", + "difference equation for height:\n", + "\n", + "$$h_{n+1}^D = h_n^D + \\alpha h_n^2$$\n", + "\n", + "With $D=3$, the solution to this equation is close to a straight line,\n", + "which is not a bad model for the growth curves. But the model implies\n", + "that trees can grow forever, and we know that's not true. As trees get\n", + "taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", + "\n", + "We can model this effect by adding a factor to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A$$\n", + "\n", + "Let's assume\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A (1 - h / K)$$\n", + "\n", + "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", + "\n", + "In the repository for this book, you'll find a notebook called\n", + "`trees.ipynb` that implements both models and uses them to fit the data.\n", + "\n", + "There are no exercises in this case study; it is mostly meant as an\n", + "example of what you can do with the tools we have so far, and a preview of what we will be able to do with the tools in the next few chapters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "solar-turtle", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 7b8587510b59b2fd84f2579dac19517918cc2ce3 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 29 Jan 2021 16:47:18 -0500 Subject: [PATCH 021/144] Revising chapters --- jupyter/chap10.ipynb | 56 +-- jupyter/chap11.ipynb | 914 +++++++++++++++++++++++++++++++++++++ jupyter/chap12.ipynb | 1036 ++++++++++++++++++++++++++++++++++++++++++ jupyter/chap13.ipynb | 738 ++++++++++++++++++++++++++++++ 4 files changed, 2716 insertions(+), 28 deletions(-) create mode 100644 jupyter/chap11.ipynb create mode 100644 jupyter/chap12.ipynb create mode 100644 jupyter/chap13.ipynb diff --git a/jupyter/chap10.ipynb b/jupyter/chap10.ipynb index 8898834d..e404b395 100644 --- a/jupyter/chap10.ipynb +++ b/jupyter/chap10.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "negative-distributor", + "id": "dense-storm", "metadata": {}, "source": [ "# Chapter 10" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "organized-stone", + "id": "confused-bargain", "metadata": { "tags": [ "remove-cell" @@ -26,8 +26,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "exciting-width", + "execution_count": 16, + "id": "inner-scott", "metadata": { "tags": [ "remove-cell" @@ -45,12 +45,12 @@ "try:\n", " from modsim import *\n", "except ImportError:\n", - " !pip install modsimpy\n" + " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "graphic-subject", + "id": "thirty-medication", "metadata": {}, "source": [ "# Case studies\n", @@ -60,7 +60,7 @@ }, { "cell_type": "markdown", - "id": "cleared-greene", + "id": "industrial-mercy", "metadata": {}, "source": [ "## Prehistoric World Population\n", @@ -71,7 +71,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "manufactured-color", + "id": "usual-penguin", "metadata": {}, "outputs": [], "source": [ @@ -86,7 +86,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "intellectual-mortality", + "id": "thick-lincoln", "metadata": {}, "outputs": [ { @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "bound-giving", + "id": "disciplinary-chosen", "metadata": {}, "source": [ "Select `tables[1]`, which is the second table on the page." @@ -119,7 +119,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "voluntary-definition", + "id": "conscious-orange", "metadata": {}, "outputs": [ { @@ -292,7 +292,7 @@ }, { "cell_type": "markdown", - "id": "tracked-stylus", + "id": "hungry-monster", "metadata": {}, "source": [ "Not all researchers provide estimates for the same dates.\n", @@ -303,7 +303,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "exempt-headline", + "id": "thick-blanket", "metadata": {}, "outputs": [], "source": [ @@ -313,7 +313,7 @@ }, { "cell_type": "markdown", - "id": "professional-watch", + "id": "substantial-implement", "metadata": {}, "source": [ "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." @@ -322,7 +322,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "sapphire-excuse", + "id": "ranking-prescription", "metadata": {}, "outputs": [], "source": [ @@ -332,7 +332,7 @@ }, { "cell_type": "markdown", - "id": "amended-contribution", + "id": "amazing-difference", "metadata": {}, "source": [ "Here are the results. Notice that we are working in millions now, not billions." @@ -341,7 +341,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "right-wrong", + "id": "metallic-offense", "metadata": { "scrolled": false }, @@ -369,7 +369,7 @@ }, { "cell_type": "markdown", - "id": "later-community", + "id": "human-conservation", "metadata": {}, "source": [ "We can use `xlim` to zoom in on everything after Year 0." @@ -377,13 +377,13 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "champion-stage", + "execution_count": 15, + "id": "solar-action", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABGoElEQVR4nO3dd3xUZdbA8d/JZJJQAiQQEnqRgHSBIKiIYMVeULCgor66u66v/VXctaArimVddV0Luyoqq8iyYsVGLyqCiEpRmqEmEEgjPTNz3j/mJgZIwkAymUk4389nPjPz3HbmTpjDc+9zzxVVxRhjjAk3EaEOwBhjjKmMJShjjDFhyRKUMcaYsGQJyhhjTFiyBGWMMSYsWYIyxhgTlixBGXOERERFpNsRLnuViHxR2zHVJhH5VESuDXUc5uhlCcqEhIhcKSIrRCRPRNKcH8NhzrSJIlLqTCt7ZIc45CMmIp2dZBZZ1qaq/1bVM0MZV0XOPp9WsU1Vz1bVN4KwrYP2hzGVsQRl6pyI3Ak8CzwGJAIdgReBCyvM9q6qNq3waFHngRpjQsoSlKlTItIceAT4o6q+p6r5qlqqqh+p6v8dwfrK/jd+k4jsdHpjd1WYHi0izzrTdjqvo51pI0Rku4j8SUT2iEiqiFxVYdkFIvI/Fd6PF5ElVcRxroh8LyK5IrJNRCZWmLzIec52eoMnHLguETlRRJaLSI7zfOIBcfxFRJaKyD4R+UJEWlWzT84TkVUiki0iX4lIvwrT7hWRHc56fhGR00RkFPAnYKwT3w8Hfn4n3qUi8jdnvZudmMc7n3d3xcOBh7s/nGWuF5F1IpIlIp+LSCenXZzt7nb2z48i0qeqz28aDktQpq6dAMQAs2p5vSOBZOBMYIKInO60/xkYChwH9AeOB+6vsFwS0ApoB1wLTBGRHkew/XzgGqAFcC7wBxG5yJk23Hlu4fQGv664oIjEA58AzwMtgWeAT0SkZYXZrgSuA1oDUcDdlQUhIgOB14DfOet6BfjQSdQ9gFuAwaoaC5wFpKrqZ/h7s2W91v5VfMYhwI/Oet8GpgODgW7AOOAFEWl6JPvDmfYn4BIgAVgMvOPMd6azTHdnfWOBvVXEaBoQS1CmrrUE9qiq5xDzjXH+p172mH+I+R92emM/Aa8DVzjtVwGPqOpuVc0AHgauPmDZB1S1WFUX4k8UYw7vI4GqLlDVn1TVp6o/4v9xPSXAxc8FNqjqW6rqUdV3gJ+B8yvM87qqrlfVQmAG/oRbmRuBV1R1map6nXNIxfiTtBeIBnqJiFtVU1V102F8zF9V9XVV9QLvAh3w79tiVf0CKMGfrI5kf/wOeFxV1zl/G48Bxzm9qFIgFjgWEGeetMOI29RTlqBMXdsLtArgBPkMVW1R4THyEPNvq/B6C9DWed3WeV/ZNIAsVc2vZnpARGSIiMwXkQwRyQF+j79nFogDYyyLo12F9+kVXhcATalcJ+CuiskdfyJpq6obgduBicBuEZkuIofzWXdVeF0IoKoHtjWFI9ofnYDnKsScCQjQTlXnAS8A/wB2icgUEWl2GHGbesoSlKlrXwNFwEW1vN4OFV53BHY6r3fi//GrbBpAnIg0qWJ6PtC4wrSkarb/NvAh0EFVmwMv4/+BBTjULQMOjLEsjh2HWK4y24BJByT3xk6vDFV9W1WHOdtT4IkAYzxch7s/tgG/OyDuRqr6lRP386o6COiN/1DfYZ+vNPWPJShTp1Q1B3gQ+IeIXCQijUXELSJni8iTNVj1A866euM/V/Ou0/4OcL+IJDgDCx4Eph2w7MMiEiUiJwPnAf9x2lcBlzjr7QbcUM32Y4FMVS0SkePxnzMqkwH4gK5VLDsb6C7+ofeRIjIW6AV8HMDnPtA/gd87PRgRkSbOgIVYEekhIqeKf5BIEf4ej9dZbhfQWURq6zfhcPfHy8B9zveHiDQXkcuc14Odz+PG/5+GogpxmwbMEpSpc6r6DHAn/sEKGfj/93wL8H6F2cpGlFV8tK5mtQuBjcBc4GnnnAjAo8AK/Cf3fwJWOm1l0oEs/L2YfwO/V9WfnWl/w39eZRfwhjO9KjcDj4jIPvxJcEaFz1sATAKWOoewhh6wP/biT4x34T8Eeg9wnqruqWZ7lVLVFfjPQ73gfK6NwHhncjQwGdjjfO7W+AcmwG9Jea+IrDzc7VbisPaHqs7C35ubLiK5wGrgbGeRZvgTbxb+Q597gadrIUYT5sRuWGjqMxHpDPwKuAMYeHHgsiOAaaravvYjM8bUlPWgjDHGhCVLUMYYY8KSHeIzxhgTlqwHZYwxJiw12GrCrVq10s6dO4c6DGOMOap89913e1Q1oTbW1WATVOfOnVmxYkWowzDGmKOKiBxYFeWI2SE+Y4wxYckSlDHGmLBkCcoYY0xYarDnoA6UnZ3Nnj17KC0tDXUoxuF2u2nVqhUtWrQIdSjGmDB01CSotLQ0OnfuTExMDCJy6AVMUKkqRUVFpKamWoIyxlTqqElQAI0aNQp1CMYhIvZ9GGOqZeegjDHGhCVLUEGQmppKQkICI0aM4KSTTmLjxo3l74cOHcp3330HwNSpU0lOTmbEiBGccMIJrF69OsSRG2PM/n7OL+Q/6ZkUeH11vm1LUEFyyimnsGDBAu68807+8Ic/lL9/5plnmDx5cvl8t912GwsWLODJJ5/kueeeC2HExhhzsLl79/G/67biCUHd1qPqHBTAwx+tYe3O3Bqvp1fbZjx0fu9DztenTx8iI3/bzdnZ2VRWoHffvn3ExsbWOC5jjKlN6cUlNHZFEOuq+/7MUZeg6trixYuJjo5m4cKFDBkyhE2bNjFv3rzy6c899xwzZszgl19+4csvvwxhpMYYc7DtabtJyCvEl5+Pq2nTOt32UZegAun11IaFCxcyYsQI4uPjue+++3jqqaeYOXMmzz33HMuWLaNfv36A/xDfLbfcwo4dO/if//kfPv300zqJzxhjArEzcxfx6ZlIUSeo4wRl56CCpOyc03vvvUdiYmJ5+80338yUKVPwePa/O3mzZs3Iycmp6zCNMaZauyMb0Sp3LxFxSXW+7aOuBxVqbreb008/nf/+97+A/xDfzJkzKSoq4oEHHghxdMYY8xufKrtjYknMywJX3acLS1BB0LlzZ2bOnFnl+8cff7z89fjx4+syNGOMCdjeUg9el4vE4uyQbN8O8RljjKlUWrG/dmmSJz8k27cEZYwxplLpToJqE1ESku1bgjLGGFOpnfvyAGgTFZrtW4IyxhhTqZ2ZWUT4fCQ2C01hZxskYYwxplI7c3OIzy0mJqlNSLZvPaggWLBgAXfffXf5+5dffpmpU6ciIrz77rsA/PzzzzaCzxgT1tKLSmiVnUlkm44h2b4lqDrUpUsXXnjhhVCHYYwxAUnXCFplZxHZvktItn/0HeL7dAKk/1Tz9ST1hbMnH3q+CuLj4znuuOP44osv6NgxNP8jMcaYQO2KjKZPdiauNl1Dsn3rQdWxu+66i7/+9a+hDsMYY6pV4PWxzx1D6/y9SGzioRcIgqOvB3WYvZ4jERMTQ3Fxcfn7oqIi4uLiAH9ViVatWrF8+fKgx2GMMUeq7BqoxMJMiAzNOHPrQQVB9+7dWblyJV6vF/DfcqNPnz7l0++55x6efPLJUIVnjDGHVKpK360b6FS0N2QxHH09qDoQHx/P+PHjOfnkk4mIiGDUqFH07v3bbT769+9P+/btQxihMcZUr0eTGP7x/ERiuzUJWQyWoILkxhtv5MYbb9yvbcWKFeWv7b5Pxphwpl4v3gIfkXHNQhaDHeIzxhhzEM/evaAQ2TIuZDFYgjLGGHMQ7640AFwJrUMWgx3iM8YYcxB3fAztT95Lo369QhaDJShjjDEHcZFPbLtiaBuaKhJgCcoYY0xlWveCP3wNzduFLAQ7BxUEqampiAjz588HoKSkhLi4uIDq8A0dOvSgtrJis+np6Tz00EO1Hq8xxhzEHQOJvSCmechCCFqCEpEOIjJfRNaJyBoRuc1pjxeRL0Vkg/McV2GZ+0Rko4j8IiJnVWgfJCI/OdOeFxEJVty1JSUlhffeew+AOXPmkJycXON1JiUl8fDDD9d4PcYYUx8E8xCfB7hLVVeKSCzwnYh8CYwH5qrqZBGZAEwA7hWRXsDlQG+gLTBHRLqrqhd4CbgJ+AaYDYwCjuhCoie+fYKfM3+u4UeDY+OP5d7j761yeqdOndi6dSuqyqxZs7j44osBGDduHNu3b8fj8fD222/TsWNH3njjDf7+97/Tq1cv8vPzAdi6dStXXnklzZo1o0WLFpx55pmkpqZy9913M3PmTMaPH8+mTZsQEd58803i4uIYN24cubm5JCYmMm3aNL766ismT55MdHQ0qampTJs2jb59+9b4sxtjTF0IWg9KVdNUdaXzeh+wDmgHXAi84cz2BnCR8/pCYLqqFqvqr8BG4HgRaQM0U9WvVVWBNyssE9ZOOOEEFi1aREZGBm3a+G/4NWXKFBYsWMA999zDK6+8gtfr5W9/+xtLly7l2WefZcuWLQA8+eSTPPjgg8yePZsDO4ylpaWsW7eORYsWsWjRIjp27MiUKVM499xzWbhwIb179+add94pn/eDDz7g6aef5vXXX6/bHWCMMTVQJ4MkRKQzMABYBiSqahr4k5iIlA2yb4e/h1Rmu9NW6rw+sL2y7dyEv6dV5e0squv11LbRo0czduxYrrnmGgC8Xi/33nsvq1atori4mN69e5ORkUGHDh2Ijo4mOjqaY445BoCNGzcyaNAgAI4//vj91ut2u7ntttu4/vrrad68OY8++iibNm0qr1wxZMgQli5dSqdOnTjuuOMA6NChA1lZWXX0yY0xpuaCPkhCRJoC/wVuV9Xc6matpE2raT+4UXWKqqaoakpCQsLhB1vLkpOTGTZsGJdeeikA2dnZ7Nq1i8WLF3P//fejqiQkJLB9+3ZKSkrIyspi06ZNAHTr1o3vv/8e2L9EEvgT3WWXXcbrr79O69atee+99+jWrVt5hfRly5aVn/Oq2Pvyd0CNMaZ+CGoPSkTc+JPTv1X1Pad5l4i0cXpPbYDdTvt2oEOFxdsDO5329pW01wvPP/98+esWLVqQlpbGGWecQa9e/ovfXC4Xt99+OyeeeCLHHnssnTp1AvwVz6+88kqefvppWrRosd869+3bxwUXXIDP5yMiIoLp06fTpEkTrrrqKt5++22SkpK47777+Oqrr+rscxpjTG2TYP2v2hlp9waQqaq3V2h/CthbYZBEvKreIyK9gbeB4/EPkpgLJKuqV0SWA/+L/xDhbODvqjq7uu2npKRoxZ7HunXr6NmzZ61+RlNz9r0Y07CIyHeqmlIb6wpmD+ok4GrgJxFZ5bT9CZgMzBCRG4CtwGUAqrpGRGYAa/GPAPyjM4IP4A/AVKAR/tF7VgrcGGMauKAlKFVdQuXnjwBOq2KZScCkStpXAH0OXsIYY0xDdcgEJSIpwMn4D7sVAquBOaqaGeTYjDHGHMWqHMUnIuNFZCVwH/5Da7/gH9AwDPhSRN4QkcrHchtjjDE1VF0PqglwkqoWVjZRRI4DkvGfRzLGGGNqVZU9KFX9R1XJyZm+SlXnBies+i01NbX82ieAzz77jO7du/PnP/+5vG3UqFGsW7eOESNGMHz4cE4//XRGjx5dfh3U1KlTSU5OZsSIEYwYMYKZM2fW+ecwxphQCuQc1JPAo/jPP30G9Md/0e20IMfWoFx55ZUsWbKEzZs38+OPP9KzZ8/y4dWzZ8+madOm/Pjjj4wbN44lS5YAcNttt3HLLbeEMmxjjAmZQEbxnelcp3Qx/otmLwPmA/UyQaU/9hjF62peLDa657Ek/elPh7XMU089xR133EFGRgazZx98GVe/fv1ITk5m/fr1NY7PGGOO1ANLH+D4pOM5/5jzQxpHIAnK7TyfA7yjqpn14G4XIbdw4UJGjBgBQGZmJpdccgkDBgygRYsWnH766QdVhyjTtm1bdu70F8p47rnnyg/tPfroowwbNqwuQjfGHMXySvJ4f+P7tGsauhsVlgkkQX0kIj/jP8R3s4gkAEXBDSt4DrfXc6ROOeWU8uTy2Wef8c03/jq4Xbp0oUuXqm+hvHPnTtq0acO2bdvsEJ8xps6t3bsWgD6tQn/p6SGLxarqBOAEIEVVS4F8/LfGMLVs9erVrF+/nh49eoQ6FGPMUWr13tUA9G7ZO8SRBF5JoifQWUQqzv9mEOI5Kp1zzjm43W6aN2/OW2+9hcvlAvY/xDd+/HjGjx8fwiiNMUeDNXvW0K5pO+Ji4g49c5AdslisiLwFHAOsAspq46mq3hrc0GrGisXWD/a9GBNeRv13FL1b9uavI/56RMvXdbHYFKCX2s2EjDGmQcssymRH3g7G9BgT6lCAwG5YuBpICnYgxhhjQmtP4R66tehG31Z9Qx0KEFgPqhWwVkS+BYrLGlX1gqBFZYwxps51j+vOrAtnhTqMcoEkqInBDsIYY0wYKM6DqCYQJte6BjLMfCHwMxDrPNY5bcYYYxqSD26GKSNCHUW5QyYoERkDfIu/xNEYYJmIXFr9UkevkpKS8gKvsbGx5a/z8vKqXS47O5sZM2bUUZTGGFOJHd9DfNdQR1EukEN8fwYGq+puAKeSxBzAymtXIioqigULFgCQkpJS/vpQyhLUmDHhMXrGGHOUyd8DOVvh+BtDHUm5QEbxRZQlJ8feAJczwFtvvcVpp53GwIEDeeuttwCYOHEiV111FWeffTbDhw+noKCAl156qbx+3y+//MLbb7/NkCFDGDJkCJ999hkAI0aM4Pbbb2f48OHcfPPNofxYxpiGZuf3/ud2A0MbRwWB9KA+E5HPgXec92OBg0tx1xOLZ6xnz7bqD7cFolWHppw8pvsh5xs9ejRXX301xcXFDBs2jKuvvhqAHj168OCDD/LnP/+ZOXPm8Ic//IFNmzYxc+ZMvF4vl112GcuXL6ewsJBTTz2VUaNGAXDJJZfw7LPPMmzYMHJycmjevHmNP4sxxrBjJSDQpn+oIyl3yASlqv8nIqOBkwABpqhq+IxDDHNffvklzzzzDMB+t9EYMGAAAB06dCArK2u/ZTIyMujUqRPR0dHlD4/Hs99y7du3Jzs72xKUMaZ27FwJrbpDdGyoIykXUC0+Vf0v8N8gx1InAun11KaHH36Y+fPnEx0dzTHHHFPeXvGWJaqK2+3G6/VXkkpISGDLli0UFxdTWFhISUkJkZGRlS5njDE1puo/xHfMqaGOZD9VJigRWaKqw0RkH1Dxl1Dw1+JrFvToGoDRo0czcuRIBgwYQFxc1cUX27RpQ2FhIZdeeilPPvkkEyZMYPjw4QBMmjSprsI1xhyNcndC3i5oOyDUkeznkMVi6ysrFls/2PdiTBhY9xG8Ow5umAMdBtdoVXVSLFZE4qtbUFUzayMAY4wxIZbxM0REQlLob1JYUXXnoL7Df2ivspoXCoTP1VzGGGOOWGnPP+JpehkxRFf6gx8qVSYoVa36vuTGGGMajMIf95D75Tba9u5QPxKUiFR7tZaqrqz9cIwxxtS10l35uOJjiIh2hTqU/VR3iK+62ykqEF7jEY0xxhyR0l0FuBMbhzqMg1R3iG9kXQZijDGm7qnHhyejkEY9qx0XFxLVHeI7VVXnicgllU1X1feCF1b9lpqayuDBg+nduzd5eXncfffdFBUV0aNHD0444YRDLj9x4kRSUlI477zz6iBaY8zRzLO3EHyKO7FJqEM5SHWH+E4B5gHnVzJNAUtQ1TjllFOYOXMmBQUFDBs2jJUrDz5l5/P5iIiwurvGmNApTS8AILKeHeJ7yHm+ru7CCb75U6ewe8vmGq+ndaeujBx/0yHnKygooHHjxuW9oj59+nD11VeTlJTE4MGDadOmDVOnTiUrK4s77rijvJjsjBkzeP7554mKimLmzJlER0dz6623snr1aiIjI3n99ddp3749PXv2ZODAgaxdu5Y777yzfHljjAlE6a58iAB3Qj1KUGVEpAVwDdC54vyqemvQomoAym6dsX79ev7yl7+wbdu28mk7d+5k7ty5REVFUVBQUGm18/bt2/Pmm2/y2GOPMX36dFq1akVcXBzz58/nu+++Y/Lkybzwwgukp6fz0ksvERERwRlnnGEJyhhzWErTC4hs2Qhxh9/RnECKxc4GvgF+AnyBrlhEXgPOA3arah+nbSJwI5DhzPYnVZ3tTLsPuAHwAreq6udO+yBgKtDIieU2rUF9pkB6PbWh7BBfSUkJp512GieeeGL5tP79+xMVFQVUXe180KBB5c9Llixh9+7dzJo1i0WLFqGqdOjQAYCuXbvSrJm/LGJDLVtljAkez6583G2bhjqMSgWSoGJU9c4jWPdU4AXgzQPa/6aqT1dsEJFewOVAb6AtMEdEuquqF3gJuAl/kpwNjAI+PYJ4QiIqKgpVpaSkpLyt4nmnqqqdf//994wePZrvv/+eY445hvj4eMaMGcMDDzwAQGlpKbB/dXNjjDkcvhIvnswiGg9oHepQKhVIgnpLRG4EPgaKyxoPVYtPVReJSOcA47gQmK6qxcCvIrIROF5EUoFmqvo1gIi8CVxEPUhQZYf4iouLOe+888oTyoGqqnaemprKGWecQXR0dPk5qHnz5jFypH/0/7hx47jhhhvq5LMYYxomz+4CUIgMwxF8EEA1cxH5IzAJyOa3226oqh6yFp+ToD4+4BDfeCAXWAHcpapZIvIC8I2qTnPmexV/EkoFJqvq6U77ycC9qlrp+GsRuQl/b4uOHTsO2rJlS/k0q5odnux7MSZ08r/bRdZ/1pN416BaGyRRm9XMAzkrdifQTVU7q2oX53GkhWJfAo4BjgPS+K1aRVUFaatqr5SqTlHVFFVNSUhIOMIQjTHm6FC6qwBcQmR8o1CHUqlAEtQaoKA2Nqaqu1TVq6o+4J/A8c6k7UCHCrO2B3Y67e0raTfGGFNDnl35uFs3RlzheS47kHNQXmCViMxn/3NQhz3MXETaqGqa8/ZiYLXz+kPgbRF5Bv8giWTgW1X1isg+ERkKLMM/3P3vh7tdY4wxBytNLyC6S/jeHD2QBPW+8zgsIvIOMAJoJSLbgYeAESJyHP7DdKnA7wBUdY2IzADWAh7gj84IPoA/8Nsw80+pBwMkjDEm3PmKPHhziolMCs8BEhBAglLVN45kxap6RSXNr1Yz/yT8gzEObF8BhNdtHo0xpp4r3eU/cxOOVczLVHkOSkQ+EpHzRcRdybSuIvKIiFwf3PDqp9TUVESE+fPnA1BSUkJcXBwvvPBCpfMvWLCADh06MGLECEaMGFHlfIEYOnRoQPOtWbOGoUOHMnToUObNm1fpPCkptTIQxxgThkp35QOEZZHYMtX1oG7EP4LvWRHJxF/9IQboAmwEXlDVD4IfYv2UkpLCe++9x8iRI5kzZw7JycnVzj927FiefvrpauepTS+++CL/+Mc/GDhwIFlZWXW2XWNMePCkFyBRLlwtokMdSpWqKxabDtwD3ONcz9QGKATWq2qtjOoLheyPNlGyM7/G64lq24QW5x9T5fROnTqxdetWVJVZs2Zx8cUXl0977bXXmDJlClFRUUycOLHSiuZPPfUUnTp1YsyYMfzyyy9MmjSJN954o9KCsY899hgfffQRgwYNwuv1UlpaysiRI1myZAngT36PP/44Xbv+dnWA2+3myy+/ZNCgQcTHV38fmG3btnHttddSWlpK3759efHFF5k6dSoffvghxcXF7N69mw8++IC2bdsydepUXn31VbxeL48++iinnnoq48ePZ9OmTYgIb775Jp07dz7MvW2MqW2lu/JxJzZGIsJzBB8ENswcVU1V1a9VdVV9Tk517YQTTmDRokVkZGTQpk0bADIyMnj11VdZvHgxixYtYsSIEQC8++675Yf4Zs6cydixY5kxY0b5tLFjx/LJJ5+UF4ydPHkykydPJj09nc8//5yvvvqKW2+9lb179+J2uxkwYAArVqwgNzeXzMzM/ZITQFxcHO+//z5z58495OeYPHky99xzD4sXL6awsJCFCxcC0KJFCz755BNuuukmZs6cyZ49e3jnnXdYtGgRc+bMYdKkSZSWlrJu3ToWLVrEokWL6NixYy3uYWPMkSrdVRCWt9ioKJBRfA1Kdb2e2jZ69GjGjh3LNddcU962efNmBgwYgNvtP7VX1nuq7BBfVlYWeXl5zJkzh/vuu4+//e1vBxWMTU1NpV+/fogI3bt3p3nz5gBcc801TJs2jf79+zN69Oj91rt06VKKi4uZPXs2F154IZ06deKWW27hk08+weVyHfQ5Nm3axODBgwEYMmQIGzduxOVyMWDAAAA6dOjAsmXL2Lx5M2vXri0vx5SRkYHb7ea2227j+uuvp3nz5jz66KM0bRqehSmNOVp480rw5ZWG9fknCLAHZY5McnIyw4YN49JLLy1v69q1K6tWrcLj8QD+mxZW5YILLuDxxx+nR48euN1ujj32WMaMGcOCBQtYuHAhr7/+Op07d2b16tWoKhs3biQnJweAwYMH8+OPPzJ9+nTGjBmz33pzc3NJT08nPj6e6dOnc8kll3D66adXmpwAunXrxvLlywFYtmxZ+fm0ioVqVZWuXbvSr18/5s+fz4IFC1i1ahVer5fLLruM119/ndatW/Pee3afS2NCrXwEX5L1oI5qzz///H7vExISuO666zjppJNo0qQJ999/PxEREbz77rusWLECgFGjRjFhwgQuu+wyOnfuzKef+i/9Ov/88ystGHvGGWdwwgknMHDgQFq2bFm+rTPOOINvv/32oHNMZ511Fh9//DFDhw4lNjaW6667jvfee4/rrrtuv+XLEtC9997Ltddey6OPPkq/fv0YPnw4mzcffNPHVq1acfnll3PKKafgcrno27cvjzzyCBdccEH53YOnT59eC3vVGFMTnvTwH8EHgRWLPQmYCHTCn9CEAIvFhlJKSoqW/eDD0VmU9IknnqB79+77DdAIVGFhIaeddhpfffVVECL7zdH4vRgTalmzNlD40x7aPDC01m/ZU5vFYgPpQb0K3AF8h7/skakHHnnkEZYuXcpdd9112Mump6dz3nnnHdGyxpjwV5ruHyAR7veTCyRB5aiqlReqZx588MEjXjYpKYmKvU9jTMPiahZFZEJ4VjCvKJAENV9EngLeY/9isSuDFpUxxpigaXlV/TisHkiCGuI8VzymqMCptR+OMcYY4xdIsdiRdRGIMcYYU9Ehr4MSkeYi8oyIrHAefxWR5nURXH1UUlJSXhEiNja2/PXdd99dK+sfP348q1evZtWqVbz00ku1sk5jjAlHgRziew3/jQXLrva8GngduCRYQdVnUVFRLFiwAPAXjF2wYAELFizg448/rtXtHHfccRx33HG1uk5jjAkngSSoY1S1Yq2ch0VkVZDiCbpPP/2U9PT0Gq8nKSmJs88+O+D5V69ezYUXXkhqairTpk2jb9++vP322zz33HMAPPzww4waNYoRI0bQv39/vvnmGy644AJ27drFt99+y+jRo/m///u/8vWVJb2nn36agQMHMmTIEFauXMlFF13Efffdx0svvcRrr71G48aNuf3227n44ou54447WL58eXmh2S5dutCzZ08GDhzI2rVrufPOO7n66qtrvG+MMaY2BFLqqFBEhpW9cS7cLQxeSA1TaWkpH3zwAU8//TSvv/46Xq+XyZMns2jRIj7//HP+9Kc/lc87ZswYvvnmG/75z39y/fXXs3TpUqZNm1blurOzs5kwYQJff/11eaWGd999lzlz5rBw4UIuvPBCli9fTlpaGkuWLOHhhx/mkUceAfzXPL300kssXryYF198Mbg7wRhjDkMgPag/AG84550EyATGBzOoYDqcXk9tKjsc16FDB7KyssjIyKBTp05ER0eXP8rq85UVf01KSqJ///6ISHlx2crExcXRqVMnABo18l/b8OSTT3L33Xfj8XiYMGHCQQVf77//fsBfG7BZs2aAv56eMcaEi0BG8a0C+otIM+d9brCDaogOLKyakJDAli1bKC4u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\n", + "image/png": "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eEtErgQ2AxcCqOoKEXkLWImvBeANqupx1rsOmAHEAZ86ryPy50V/ZnX26iPdzH6Obn00dw67s8blJk6cyIMPPsjYsWNZtmwZU6dO5ZtvvvFt4+ijmT9/PpGRkcyePZt77rmHd955h3/+8580adKEZcuWsWzZMn83SNu3b2fatGksWbKEFi1aMGbMGAYNGnTQPh999FE2btxITEwMOTk5AEybNo1Bgwbx3nvv8dVXX3HFFVeQlpYGwOrVq5k7dy55eXn07duX6667jqioqNo5UcYYE4CgJShVXUDl948ATq5inUeARyopXwwMOHiN+iklJYWMjAxef/11zjzzzP3m5ebmMmnSJNauXYuIUFbmG9Vy/vz53Hzzzf71U1JSAPjhhx8YPXo05ffcJkyYwJo1ayrd56WXXso555zDOeecA8CCBQt45513ADjppJPIysoiNzcXgLPOOouYmBhiYmJo164dO3fupHPnzgdt1xhjgqXGBCUiQ4CRQEegCEgHZqtqdpBjC6pAajrBNG7cOG6//XbmzZtHVtavI1b+4Q9/YMyYMbz77rtkZGQwevRo/7xAxpKqyscff8z8+fP54IMPeOihh1ixYgW+VvuVbysmJsZf5nK5bIRfY0ydq/IelIhMFpGfgLvxXVr7BV+DhhOAL0Vkpoh0rZswG56pU6dy//33k5ycvF95bm6uv9FExc5jR40axaxZswBIT0/33y869thj/UmurKyM//73vwfty+v1smXLFsaMGcNjjz1GTk4O+fn5+21z3rx5JCQk0Lx56AYnM8aYiqqrQcUDI1S1qLKZIpKKryHD5iDE1eB17tyZW2655aDyO+64g0mTJvHEE09w0kkn+cuvu+46pkyZQkpKCqmpqQwbNgyAxMREpk+fznHHHUdiYiKDBw/G4/Hst02Px8Nll11Gbm4uqsptt91Gy5YtmT59un+bTZo0YebMmRhjTLiQyi7zNARDhgzRA58TWrVqFf369QtRRKYu2HdsTGiJyBJVHVIb26qxmbmIPCYizUUkSkTmiMgeEbmsNnZujDHGVCWQ56BOdXqAGIvvodk+wO+DGpUxxpiQ+cO3f+DD9R+GOoyAElT5wy9nAq/X99Z7xhhjqpZfms97695ja/7WUIcS0HNQH4rIanxNzK8XkbZAcXDDMsYYEwors1YCMCAh9I+e1liDUtW7gOOAIapa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\n", "text/plain": [ "
" ] @@ -403,7 +403,7 @@ }, { "cell_type": "markdown", - "id": "medium-aircraft", + "id": "wanted-fantasy", "metadata": {}, "source": [ "See if you can find a model that fits these data well from Year 0 to 1950.\n", @@ -414,7 +414,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "nervous-anatomy", + "id": "together-jackson", "metadata": {}, "outputs": [ { @@ -458,7 +458,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "trained-valuable", + "id": "simple-verse", "metadata": { "scrolled": true }, @@ -497,7 +497,7 @@ }, { "cell_type": "markdown", - "id": "surprised-designation", + "id": "ruled-spain", "metadata": {}, "source": [ "## One queue or two?\n", @@ -533,7 +533,7 @@ }, { "cell_type": "markdown", - "id": "practical-arrest", + "id": "forward-point", "metadata": {}, "source": [ "## Predicting salmon populations\n", @@ -558,7 +558,7 @@ }, { "cell_type": "markdown", - "id": "hungarian-cliff", + "id": "limiting-moore", "metadata": {}, "source": [ "## Tree growth\n", @@ -626,7 +626,7 @@ { "cell_type": "code", "execution_count": null, - "id": "solar-turtle", + "id": "australian-gregory", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap11.ipynb b/jupyter/chap11.ipynb new file mode 100644 index 00000000..8f018cc3 --- /dev/null +++ b/jupyter/chap11.ipynb @@ -0,0 +1,914 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "steady-bridge", + "metadata": {}, + "source": [ + "# Chapter 11" + ] + }, + { + "cell_type": "markdown", + "id": "endless-enclosure", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "drawn-population", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "chicken-tamil", + "metadata": {}, + "source": [ + "In this chapter, we develop a model of an epidemic as it spreads in a\n", + "susceptible population, and use it to evaluate the effectiveness of\n", + "possible interventions.\n", + "\n", + "My presentation of the model in the next few chapters is based on an excellent article by David Smith and Lang Moore, [^1]: Smith and Moore, \"The SIR Model for Spread of Disease,\" Journal of Online Mathematics and its Applications, December 2001, available at ." + ] + }, + { + "cell_type": "markdown", + "id": "developed-asset", + "metadata": {}, + "source": [ + "## The Freshman Plague\n", + "\n", + "Every year at Olin College, about 90 new students come to campus from\n", + "around the country and the world. Most of them arrive healthy and happy, but usually at least one brings with them some kind of infectious disease. A few weeks later, predictably, some fraction of the incoming class comes down with what we call \"The Freshman Plague\".\n", + "\n", + "In this chapter we introduce a well-known model of infectious disease,\n", + "the Kermack-McKendrick model, and use it to explain the progression of\n", + "the disease over the course of the semester, predict the effect of\n", + "possible interventions (like immunization) and design the most effective intervention campaign.\n", + "\n", + "So far we have done our own modeling; that is, we've chosen physical\n", + "systems, identified factors that seem important, and made decisions\n", + "about how to represent them. In this chapter we start with an existing\n", + "model and reverse-engineer it. Along the way, we consider the modeling\n", + "decisions that went into it and identify its capabilities and\n", + "limitations." + ] + }, + { + "cell_type": "markdown", + "id": "respected-cleveland", + "metadata": {}, + "source": [ + "## The SIR model\n", + "\n", + "The Kermack-McKendrick model is a simple version of an **SIR model**,\n", + "so-named because it considers three categories of people:\n", + "\n", + "- **S**: People who are \"susceptible\\\", that is, capable of\n", + " contracting the disease if they come into contact with someone who\n", + " is infected.\n", + "\n", + "- **I**: People who are \"infectious\\\", that is, capable of passing\n", + " along the disease if they come into contact with someone\n", + " susceptible.\n", + "\n", + "- **R**: People who are \"recovered\\\". In the basic version of the\n", + " model, people who have recovered are considered to be immune to\n", + " reinfection. That is a reasonable model for some diseases, but not\n", + " for others, so it should be on the list of assumptions to reconsider\n", + " later." + ] + }, + { + "cell_type": "markdown", + "id": "arabic-flight", + "metadata": {}, + "source": [ + "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average. If 100 people are infectious at a\n", + "particular point in time, and we ignore the particular time each one\n", + "became infected, we expect about 1 out of 4 to recover on any particular day.\n", + "\n", + "Putting that a different way, if the time between recoveries is 4 days, the recovery rate is about 0.25 recoveries per day, which we'll denote with the Greek letter gamma, $\\gamma$, or the variable name `gamma`.\n", + "\n", + "If the total number of people in the population is $N$, and the fraction currently infectious is $i$, the total number of recoveries we expect per day is $\\gamma i N$." + ] + }, + { + "cell_type": "markdown", + "id": "emotional-ranch", + "metadata": {}, + "source": [ + "Now let's think about the number of new infections. Suppose we know that each susceptible person comes into contact with 1 person every 3 days, on average, in a way that would cause them to become infected if the other person is infected. We'll denote this contact rate with the Greek letter beta, $\\beta$.\n", + "\n", + "It's probably not reasonable to assume that we know $\\beta$ ahead of\n", + "time, but later we'll see how to estimate it based on data from previous outbreaks.\n", + "\n", + "If $s$ is the fraction of the population that's susceptible, $s N$ is\n", + "the number of susceptible people, $\\beta s N$ is the number of contacts per day, and $\\beta s i N$ is the number of those contacts where the other person is infectious." + ] + }, + { + "cell_type": "markdown", + "id": "greek-reference", + "metadata": {}, + "source": [ + "In summary:\n", + "\n", + "- The number of recoveries we expect per day is $\\gamma i N$; dividing by $N$ yields the fraction of the population that recovers in a day, which is $\\gamma i$.\n", + "\n", + "- The number of new infections we expect per day is $\\beta s i N$;\n", + " dividing by $N$ yields the fraction of the population that gets\n", + " infected in a day, which is $\\beta s i$.\n", + "\n", + "This model assumes that the population is closed; that is, no one\n", + "arrives or departs, so the size of the population, $N$, is constant." + ] + }, + { + "cell_type": "markdown", + "id": "afraid-consultation", + "metadata": {}, + "source": [ + "## The SIR equations\n", + "\n", + "If we treat time as a continuous quantity, we can write differential\n", + "equations that describe the rates of change for $s$, $i$, and $r$ (where $r$ is the fraction of the population that has recovered):\n", + "\n", + "$$\\frac{ds}{dt} = -\\beta s i$$\n", + "\n", + "$$\\frac{di}{dt} = \\beta s i - \\gamma i$$\n", + "\n", + "$$\\frac{dr}{dt} = \\gamma i$$ \n", + "\n", + "To avoid cluttering the equations, I leave it implied that $s$ is a function of time, $s(t)$, and likewise for $i$ and $r$.\n", + "\n", + "SIR models are examples of **compartment models**, so-called because\n", + "they divide the world into discrete categories, or compartments, and\n", + "describe transitions from one compartment to another. Compartments are\n", + "also called **stocks** and transitions between them are called\n", + "**flows**.\n", + "\n", + "In this example, there are three stocks---susceptible, infectious, and\n", + "recovered---and two flows---new infections and recoveries. Compartment\n", + "models are often represented visually using stock and flow diagrams (see ).\n", + "\n", + "The following figure shows the stock and flow diagram for an SIR\n", + "model.\n", + "\n", + "![Stock and flow diagram for an SIR\n", + "model.](figs/stock_flow1.pdf){width=\"4in\"}\n", + "\n", + "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." + ] + }, + { + "cell_type": "markdown", + "id": "respected-bangkok", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "For a given physical system, there are many possible models, and for a\n", + "given model, there are many ways to represent it. For example, we can\n", + "represent an SIR model as a stock-and-flow diagram, as a set of\n", + "differential equations, or as a Python program. The process of\n", + "representing a model in these forms is called **implementation**. In\n", + "this section, we implement the SIR model in Python.\n", + "\n", + "I'll represent the initial state of the system using a `State` object\n", + "with state variables `S`, `I`, and `R`; they represent the fraction of\n", + "the population in each compartment.\n", + "\n", + "We can initialize the `State` object with the *number* of people in each compartment, assuming there is one infected student in a class of 90:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "british-operations", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "S 89\n", + "I 1\n", + "R 0\n", + "dtype: int64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "init = State(S=89, I=1, R=0)\n", + "init" + ] + }, + { + "cell_type": "markdown", + "id": "laden-strain", + "metadata": {}, + "source": [ + "And then convert the numbers to fractions by dividing by the total:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "complete-disposition", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "S 0.988889\n", + "I 0.011111\n", + "R 0.000000\n", + "dtype: float64" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import sum\n", + "\n", + "init /= sum(init)\n", + "init" + ] + }, + { + "cell_type": "markdown", + "id": "curious-commerce", + "metadata": {}, + "source": [ + "For now, let's assume we know the time between contacts and time between\n", + "recoveries:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "palestinian-gender", + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days" + ] + }, + { + "cell_type": "markdown", + "id": "innocent-bacon", + "metadata": {}, + "source": [ + "We can use them to compute the parameters of the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "double-nickname", + "metadata": {}, + "outputs": [], + "source": [ + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day" + ] + }, + { + "cell_type": "markdown", + "id": "human-halifax", + "metadata": {}, + "source": [ + "Now we need a `System` object to store the parameters and initial\n", + "conditions. The following function takes the system parameters and returns a new `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "missing-animal", + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "markdown", + "id": "impressive-moderator", + "metadata": {}, + "source": [ + "The default value for `t_end` is 14 weeks, about the length of a\n", + "semester.\n", + "\n", + "Here's what the `System` object looks like. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "artistic-bunch", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "namespace(init=S 0.988889\n", + " I 0.011111\n", + " R 0.000000\n", + " dtype: float64,\n", + " t0=0,\n", + " t_end=98,\n", + " beta=0.3333333333333333,\n", + " gamma=0.25)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(beta, gamma)\n", + "system" + ] + }, + { + "cell_type": "markdown", + "id": "latter-respondent", + "metadata": {}, + "source": [ + "## The update function\n", + "\n", + "At any point in time, the state of the system is represented by a\n", + "`State` object with three variables, `S`, `I` and `R`. So I'll define an\n", + "update function that takes as parameters a `State` object, the current\n", + "time, and a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "forbidden-shelter", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "markdown", + "id": "subsequent-duplicate", + "metadata": {}, + "source": [ + "The first line uses a feature we have not seen before, **multiple\n", + "assignment**. The value on the right side is a `State` object that\n", + "contains three values. The left side is a sequence of three variable\n", + "names. The assignment does just what we want: it assigns the three\n", + "values from the `State` object to the three variables, in order.\n", + "\n", + "The variables `s`, `i` and `r`, are lowercase to distinguish them\n", + "from the state variables, `S`, `I` and `R`.\n", + "\n", + "The update function computes `infected` and `recovered` as a fraction of the population, then updates `s`, `i` and `r`. The return value is a `State` that contains the updated values.\n", + "\n", + "When we call `update_func` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "complimentary-force", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "S 0.985226\n", + "I 0.011996\n", + "R 0.002778\n", + "dtype: float64" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "state = update_func(init, 0, system)\n", + "state" + ] + }, + { + "cell_type": "markdown", + "id": "affected-presentation", + "metadata": {}, + "source": [ + "You might notice that this version of `update_func` does not use one of its parameters, `t`. I include it anyway because update functions\n", + "sometimes depend on time, and it is convenient if they all take the same parameters, whether they need them or not." + ] + }, + { + "cell_type": "markdown", + "id": "certain-clear", + "metadata": {}, + "source": [ + "## Running the simulation\n", + "\n", + "Now we can simulate the model over a sequence of time steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "emotional-thomas", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import arange\n", + "\n", + "def run_simulation(system, update_func):\n", + " state = system.init\n", + "\n", + " for t in arange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + "\n", + " return state" + ] + }, + { + "cell_type": "markdown", + "id": "controversial-magic", + "metadata": {}, + "source": [ + "The parameters of `run_simulation` are the `System` object and the\n", + "update function. The `System` object contains the parameters, initial\n", + "conditions, and values of `t0` and `t_end`.\n", + "\n", + "We can call `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "theoretical-ideal", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(beta, gamma)\n", + "final_state = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "working-austin", + "metadata": {}, + "source": [ + "The result is the final state of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "russian-professor", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "S 0.520568\n", + "I 0.000666\n", + "R 0.478766\n", + "dtype: float64" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_state" + ] + }, + { + "cell_type": "markdown", + "id": "informed-drunk", + "metadata": {}, + "source": [ + "This result indicates that after 14 weeks (98 days), about 52% of the\n", + "population is still susceptible, which means they were never infected,\n", + "less than 1% are actively infected, and 48% have recovered, which means they were infected at some point." + ] + }, + { + "cell_type": "markdown", + "id": "funded-civilian", + "metadata": {}, + "source": [ + "## Collecting the results\n", + "\n", + "The previous version of `run_simulation` only returns the final state,\n", + "but we might want to see how the state changes over time. We'll consider two ways to do that: first, using three `TimeSeries` objects, then using a new object called a `TimeFrame`.\n", + "\n", + "Here's the first version:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "directed-entertainment", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "\n", + "def run_simulation(system, update_func):\n", + " S = TimeSeries()\n", + " I = TimeSeries()\n", + " R = TimeSeries()\n", + "\n", + " state = system.init\n", + " t0 = system.t0\n", + " S[t0], I[t0], R[t0] = state\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " S[t+1], I[t+1], R[t+1] = state\n", + " \n", + " return S, I, R" + ] + }, + { + "cell_type": "markdown", + "id": "underlying-crime", + "metadata": {}, + "source": [ + "First, we create `TimeSeries` objects to store the results. Notice that\n", + "the variables `S`, `I`, and `R` are `TimeSeries` objects now.\n", + "\n", + "Next we initialize `state`, `t0`, and the first elements of `S`, `I` and\n", + "`R`.\n", + "\n", + "Inside the loop, we use `update_func` to compute the state of the system\n", + "at the next time step, then use multiple assignment to unpack the\n", + "elements of `state`, assigning each to the corresponding `TimeSeries`.\n", + "\n", + "At the end of the function, we return the values `S`, `I`, and `R`. This\n", + "is the first example we have seen where a function returns more than one\n", + "value.\n", + "\n", + "Now we can run the function like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "hired-miller", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(beta, gamma)\n", + "S, I, R = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "normal-sodium", + "metadata": {}, + "source": [ + "We'll use the following function to plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "aboriginal-myrtle", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import decorate\n", + "\n", + "def plot_results(S, I, R):\n", + " S.plot(style='--', label='Susceptible')\n", + " I.plot(style='-', label='Infected')\n", + " R.plot(style=':', label='Resistant')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "markdown", + "id": "waiting-blues", + "metadata": {}, + "source": [ + "And run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "timely-dream", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(S, I, R)" + ] + }, + { + "cell_type": "markdown", + "id": "moral-barcelona", + "metadata": {}, + "source": [ + "Notice that it takes about three weeks (21 days) for the outbreak to get going, and about six weeks (42 days) before it peaks. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." + ] + }, + { + "cell_type": "markdown", + "id": "academic-mileage", + "metadata": {}, + "source": [ + "## Now with a TimeFrame\n", + "\n", + "If the number of state variables is small, storing them as separate\n", + "`TimeSeries` objects might not be so bad. But a better alternative is to use a `TimeFrame`, which is another object defined in the ModSim\n", + "library.\n", + "\n", + "A `TimeFrame` is a kind of a `DataFrame`, which we used in.\n", + "\n", + "Here's a more concise version of `run_simulation` using a `TimeFrame`:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "assured-phenomenon", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeFrame\n", + "\n", + "def run_simulation(system, update_func):\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.loc[system.t0] = system.init\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "inner-brave", + "metadata": {}, + "source": [ + "The first line creates an empty `TimeFrame` with one column for each\n", + "state variable. Then, before the loop starts, we store the initial\n", + "conditions in the `TimeFrame` at `t0`. Based on the way we've been using\n", + "`TimeSeries` objects, it is tempting to write:\n", + "\n", + "```\n", + "frame[system.t0] = system.init\n", + "```\n", + "\n", + "But when you use the bracket operator with a `TimeFrame` or `DataFrame`, it selects a column, not a row. \n", + "\n", + "To select a row, we have to use `loc`, like this:\n", + "\n", + "```\n", + "frame.loc[system.t0] = system.init\n", + "```\n", + "\n", + "Since the value on the right side is a `State`, the assignment matches\n", + "up the index of the `State` with the columns of the `TimeFrame`; that\n", + "is, it assigns the `S` value from `system.init` to the `S` column of\n", + "`frame`, and likewise with `I` and `R`.\n", + "\n", + "We use the same feature to write the loop more concisely, assigning the `State` we get from `update_func` directly to the next row of\n", + "`frame`.\n", + "\n", + "Finally, we return `frame`. We can call this version of `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "equal-thinking", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "framed-dairy", + "metadata": {}, + "source": [ + "And plot the results like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "neutral-baker", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABESElEQVR4nO3dd3xUZdbA8d+ZSW+EJPQAoddAkC5IEaUIggV7w7I2bOuuC7rr7rq76q76WljbWrA37KigWBAQFEUEpUiVEjoJCeltzvvHnVQCDGUyCTnf/cxnbp/DdTNnnuc+RVQVY4wxprZxBToAY4wxpjqWoIwxxtRKlqCMMcbUSpagjDHG1EqWoIwxxtRKQYEO4EglJCRoUlJSoMMwxhhzHPz44497VbVRdfvqXIJKSkpiyZIlgQ7DGGPMcSAimw+2z6r4jDHG1EqWoIwxxtRKlqCMMcbUSn57BiUi04FxwG5V7V7NfgEeA84AcoFJqrrUX/EYY0ypoqIiUlNTyc/PD3Qo9UZYWBiJiYkEBwf7fI4/G0m8CDwOvHyQ/WOADt5Xf+Ap77sxxvhVamoq0dHRJCUl4fxWNv6kqqSlpZGamkqbNm18Ps9vVXyqOh9IP8QhE4CX1fEdECsizfwVjzHGlMrPzyc+Pt6SUw0REeLj44+4xBrIZ1AtgK0V1lO924wxxu8sOdWso7nfgUxQ1UVb7dwfInKtiCwRkSV79uzxc1jGGGNqg0AmqFSgZYX1RGB7dQeq6jOq2kdV+zRqVG2H4yPywsLfeG9pKlvScrH5sIwxgXLvvffSrVs3evToQUpKCosXLw5IHMuWLWPWrFll6zNnzuTf//43AJMmTeKdd9454Jyvv/6acePG+TWuQI4kMRO4SUTexGkckamqO/z9oarKs/M3sj3TqQttFB1Kv6Q4xqc0Z1S3pv7+eGOMAeDbb7/l448/ZunSpYSGhrJ3714KCwsDEsuyZctYsmQJZ5xxBgDjx49n/PjxAYmlIr+VoETkDeBboJOIpIrI1SJyvYhc7z1kFrARWA88C9zor1iqxMWCKacy+9ZT+NdZ3RnULp6lW/bxc2oGAHmFJdz65k+89cMWtqbn1kRIxph6aMeOHSQkJBAaGgpAQkICzZs3Jykpib179wKwZMkShg0bBsC8efNISUkhJSWFXr16kZWVBcADDzxAcnIyPXv2ZOrUqQBs2LCB0aNH07t3b0455RR+/fVXwCkNXX/99Zxyyil07NiRjz/+mMLCQv7617/y1ltvkZKSwltvvcWLL77ITTfdVBbrF198UemcqnJycrjqqqvo27cvvXr14sMPPzwu98hvJShVvegw+xWY7K/PPxS3S+jSLIYuzWK4dEBrVJWiEqeqb+u+XL7dkMaHy5zaxraNIhnasRGXD0yiTUJkIMI1xvjZBf/79oBt43o047KBSeQVljDphe8P2D+xdyLn9WlJek4hN7z6Y6V9b1038LCfOXLkSP7xj3/QsWNHTjvtNC644AKGDh160OMfeughnnjiCQYNGkR2djZhYWHMnj2bDz74gMWLFxMREUF6utNw+tprr+Xpp5+mQ4cOLF68mBtvvJGvvvoKgE2bNjFv3jw2bNjA8OHDWb9+Pf/4xz9YsmQJjz/+OAAvvvhipc+u7pyK7r33Xk499VSmT59ORkYG/fr147TTTiMy8ti+M+vcYLH+ICKEBDltNjo2iWbxXSNYvzubBev2Mm/tHl5fvIWzUpwGhj+nZvDrzixGdG5MfFRoIMM2xtRhUVFR/PjjjyxYsIC5c+dywQUXlD33qc6gQYO4/fbbueSSSzjnnHNITEzkiy++4MorryQiIgKAuLg4srOzWbRoEeedd17ZuQUFBWXL559/Pi6Xiw4dOtC2bduy0tWhHO6cOXPmMHPmTB566CHAaca/ZcsWunTpckT3pCpLUNUQETo0iaZDk2iuGtyG/KISQtxObejHP+/gmfkbcQn0TYpjdPemjO7elGYNwgMctTHmaB2qxBMe4j7k/rjIEJ9KTNVxu90MGzaMYcOGkZyczEsvvURQUBAejwegUr+hqVOnMnbsWGbNmsWAAQP44osvUNUDmm97PB5iY2NZtmxZtZ9Z9Xhfmn8f7hxV5d1336VTp06HvdaRsLH4fBAW7Mblcv6D3DmmMx/fPJibTu3AvtxC7vloFRMeX4jH41QR5heVBDJUY0wdsWbNGtatW1e2vmzZMlq3bk1SUhI//uhUGb777rtl+zds2EBycjJTpkyhT58+/Prrr4wcOZLp06eTm+s8L09PTycmJoY2bdrw9ttvA07yWL58edl13n77bTweDxs2bGDjxo106tSJ6Ojosmda1anunIpGjRrFf//737JW0T/99NMx3h2HlaCOkIjQvUUDurdowO2nd2TDnmy2puficgkej3Law/NokxDJ2b1aMLp7UyJC7BYbYw6UnZ3NzTffTEZGBkFBQbRv355nnnmG1atXc/XVV3PffffRv3/56G+PPvooc+fOxe1207VrV8aMGUNoaCjLli2jT58+hISEcMYZZ3Dffffx2muvccMNN/Cvf/2LoqIiLrzwQnr27AlAp06dGDp0KLt27eLpp58mLCyM4cOH8+9//5uUlBTuvPPOA2Kt7pyK7r77bm677TZ69OiBqpKUlFRtY4ojJXWtH1CfPn20tk5YmFdYwpNfr+eDZdvYmp5HRIibMd2bcc0pbejSLCbQ4RljvFavXn3Mz0fqokmTJjFu3DgmTpwYkM+v7r6LyI+q2qe6462K7zgKD3Hzh5GdmH/HcGZcN5DxPZszZ+VOdnr7XKVlF7Anq+AwVzHGGANWxecXIkK/NnH0axPH387sRkiQ8zvguW9+49n5GxndvSmXD0yib1JDGw/MGFNjqjYfr+0sQflZeIi7bPm83okUFnt4e8lWPv55B52bOq0Ez+/T8hBXMMaY+smq+GpQ20ZR3D2uK4vvOo3/nJuMS4QF6/aW7d+XE5hhTowxpjayElQAhIe4uaBvK87v05LcQqdZ+pqdWZz532+YkNKc64a2pX3j6ABHaYwxgWUlqAASESJDnd8IDcKDuahfSz76eTunPTyfa15awk9b9gU4QmOMCRxLULVE0wZh3DOhOwunnMotIzqwZHM6lzy3mKz8okCHZozxg6ioqMMes2DBArp160ZKSgp5eXlHdP0PPviAVatW+SWummIJqpaJjwrl9tM78s2UU3n+ir5EhwWjqvz1wxV8/1t6oMMzxtSg1157jT/+8Y8sW7aM8PAjG07taBNUbWIJqpaKCg1iYLt4AHbuz2f2ip2c/79vuez5xSy1qj9jThhff/01w4YNY+LEiXTu3JlLLrkEVeW5555jxowZ/OMf/+CSSy4B4MEHH6Rv37706NGDv/3tb2XXePnll+nRowc9e/bksssuY9GiRcycOZM77riDlJQUNmzYcNApOH777TcGDhxI3759ufvuuwNyDw7GGknUAc0ahDP/juG8+t1mnpq3gXOeXMRpXZpw3zndaRwddvgLGGMObvZU2PnL8b1m02QYc/CRyav66aefWLlyJc2bN2fQoEEsXLiQa665hm+++aZs5Ic5c+awbt06vv/+e1SV8ePHM3/+fOLj47n33ntZuHAhCQkJpKenExcXx/jx4yuNGjFixIhqp+C49dZbueGGG7j88st54oknju99OEaWoOqI8BA3vxvSlov7t+LFRZv4cNk2YsKCASgu8RDktsKwMXVVv379SExMBCAlJYVNmzYxePDgSsfMmTOHOXPm0KtXL8AZy2/dunUsX76ciRMnkpCQADhTblR1qCk4Fi5cWDYo7WWXXcaUKVOO/z/wKFmCqmMiQ4OYPLw9Nwxth8sl5BeVMO6/3zCyaxNuGNaOaG/SMsb46AhKOv5SOqsuOFNwFBcXH3CMqnLnnXdy3XXXVdo+bdq0w45Ic6RTcNQW9rO7jiqd/iO/qITkFg148usNDHvwa175bjPFJZ4AR2eMOd5GjRrF9OnTyc7OBmDbtm3s3r2bESNGMGPGDNLS0gDKZtWtOIXGoabgGDRoEG+++SbgNMqoTSxB1XGxESE8ckEKM28aRLvGUdz9wQrGTvuG3fvzD3+yMabOGDlyJBdffDEDBw4kOTmZiRMnkpWVRbdu3fjzn//M0KFD6dmzJ7fffjsAF154IQ8++CC9evViw4YNvPbaazz//PP07NmTbt268eGHHwLw2GOP8cQTT9C3b18yMzMD+U88gE23cQJRVT5buZOPf97BtAt7lVUBhgW7D3+yMfVIfZ1uI9Bsuo16TEQY3b0Zj198Ei6XsCergFMemMtjX6yzmX6NMXWOJagTXP82cTzyxVpGPjKfub/uDnQ4xhjjM0tQJ7BG0aE8fvFJvHZNf4LdwpUv/sD1r/xIkTWiMMbUAZag6oFB7ROYfesQ7hjViQbhwQR7+0zVteePxpj6xRJUPRES5GLy8Pb8Z2IPAH7duZ+zn1zEim21q9WOMcaUsgRVT6VnF7ItI48JTyzk/lmrySu0RhTGmNrFElQ9dXL7BL74/VDO75PI/+ZvZNSj81m0fu/hTzTGHBdut5uUlBS6d+/OmWeeSUZGxhFfY8mSJdxyyy0H3b9p0yZef/31Y4gSHn30UXJzc4/pGkfLElQ91iAimPvP6cGb1w7AJfCNJShjakx4eDjLli1jxYoVxMXFHdVArX369GHatGkH3W8JytR5A9rGM/vWIdwyogMA325IsybpxtSggQMHsm3bNoCDTovx9ttv0717d3r27MmQIUMAZ6qOcePGATBv3jxSUlJISUmhV69eZGVlMXXqVBYsWEBKSgqPPPIImzZt4pRTTuGkk07ipJNOYtGiRWXXqW7Kj2nTprF9+3aGDx/O8OHDa/7GqGqdevXu3VuNf135wvfaesrH+ocZyzQjtzDQ4Rhz3K1atarS+qTZk/T9de+rqmphSaFOmj1JZ66fqaqquUW5Omn2JJ29cbaqqu4v2K+TZk/Szzd9rqqq6XnpOmn2JJ27Za6qqu7J3eNTDJGRkaqqWlxcrBMnTtTZs53rn3rqqbp27VpVVf3uu+90+PDhqqravXt3TU1NVVXVffv2qarq3LlzdezYsaqqOm7cOP3mm29UVTUrK0uLiooq7VdVzcnJ0by8PFVVXbt2rZZ+n86dO1djYmJ069atWlJSogMGDNAFCxaoqmrr1q11zx7f/k2HU/W+q6oCS/Qg3/dWgjIHeOrSk5g8vB3v/7SNUY/MZ+4aK00Zc7zl5eWRkpJCfHw86enpnH766ZWmxUhJSeG6665jx44dgDOo66RJk3j22WcpKTmwUdOgQYO4/fbbmTZtGhkZGQQFHThZRVFREb/73e9ITk7mvPPOqzTjbumUHy6Xq2zKj0Cz6TbMAUKD3NwxqjOjujXlj28v58oXfuD1a/pzcvuEQIdmjF+8MPqFsuVgV3Cl9fCg8Err0SHRldYbhjWstJ4Q7tvfSekzqMzMTMaNG8cTTzzBpEmTDjotxtNPP83ixYv55JNPSElJOeCYqVOnMnbsWGbNmsWAAQP44osvDrjGI488QpMmTVi+fDkej4ewsPIJT32Z8qOmWQnKHFSPxFg+unkw952dzIC2zvTz+3IKAxyVMSeWBg0aMG3aNB566CHCw8MPOi3Ghg0b6N+/P//4xz9ISEhg69atla6zYcMGkpOTmTJlCn369OHXX3+tNOUGQGZmJs2aNcPlcvHKK69UWxKrquo1apIlKHNIoUFuLu7fCpdL2JmZz7CHvubvM1davyljjqNevXrRs2dP3nzzzYNOi3HHHXeQnJxM9+7dGTJkCD179qx0jUcffbSsEUV4eDhjxoyhR48eBAUF0bNnTx555BFuvPFGXnrpJQYMGMDatWuJjIw8bGzXXnstY8aMCUgjCZtuw/gsr7CE/3z6Ky8u2kTbRpE8fH4KKS1jAx2WMUfMptsIjFo13YaIjBaRNSKyXkSmVrO/gYh8JCLLRWSliFzpz3jMsQkPcfP38d147Zr+5BeWcO5Ti3j487U2pp8xxi/8lqBExA08AYwBugIXiUjXKodNBlapak9gGPB/IhLir5jM8TGofQKf/n4IE1Kak7ovFxEJdEjGmBOQP1vx9QPWq+pGABF5E5gArKpwjALR4nzDRQHpQOCbjpjDigkL5uHzUyj2Tt2xZmcW321M4/KBrS1hmTpBVe3/qzXoaGpa/FnF1wKo2Mwk1butoseBLsB24BfgVlU9YLIiEblWRJaIyJI9e/b4K15zFIK8U3fMWLKVv81cyeXTv2fX/vwAR2XMoYWFhZGWlmbV0zVEVUlLS6vUrN0X/ixBVffTpOr/G0YBy4BTgXbA5yKyQFX3VzpJ9RngGXAaSRz/UM2x+svYLrRJiORfn6xi1KPzue/sZM5IbhbosIypVmJiIqmpqdgP3poTFhZGYmLiEZ3jzwSVCrSssJ6IU1Kq6Erg397hLtaLyG9AZ+B7P8Zl/EBEuHRAa05uF8/v31rGja8tZdpFvRjfs3mgQzPmAMHBwbRp0ybQYZjD8GcV3w9ABxFp4234cCEws8oxW4ARACLSBOgEbPRjTMbP2jaK4p0bTuae8d0Y1a0JALmF9ljRGHPk/JagVLUYuAn4DFgNzFDVlSJyvYhc7z3sn8DJIvIL8CUwRVVtzoc6Ltjt4oqTkwgNcrM/v4hRj87n/tmrKSi2zr3GGN/5dSw+VZ0FzKqy7ekKy9uBkf6MwQRWkEsY3L4R/5u3kflr9/LoBSl0ahod6LCMMXWADXVk/CoiJIj7z0nmucv7sCcrnzMf/4bnFmzE47G2LsaYQ7MEZWrEaV2b8OltQxjSoZFN32GM8YlNt2FqTEJUKM9e3pvcwpKywWe/25jGhJTm1mHSGHMAK0GZGiUiRIY6v4teWPgbt721jMmvLyXdpvEwxlRhJSgTMH8a3ZnYiBAe/nwNP2zax3/OTebUzk0CHZYxppawEpQJGLdLuGFYOz6cPJj4yBCuenEJM5ZsPfyJxph6wUpQJuC6No/hw5sG8cy8jYzq1hSA/KISwoLdAY7MGBNIVoIytUJokJubR3SgQXgwhcUeJj69yGbuNaaeO2yCEpFBIvK5iKwVkY0i8puI2HBExm88qvRpHceLizZxxrQFLNmUHuiQjDEB4EsJ6nngYWAw0Bfo4303xi/Cgp2Ze1//XX+KSjyc979v+efHq8gvstKUMfWJLwkqU1Vnq+puVU0rffk9MlPvndwugc9uG8Kl/VuzcP1eXNZXyph6xZdGEnNF5EHgPaCgdKOqLvVbVMZ4RYYG8c+zupNfVEJIkIv9+UU89fUGJg9vT1SotfEx5kTmy194f+97nwrbFGeSQWNqRGmLvgVr9/L0vA3MXLad+85JZmjHRgGOzBjjL4dNUKo6vCYCMcYXY3s0o2mDgfzpnZ+5Yvr3nN2rBX8Z24X4qNBAh2aMOc58acXXQEQeFpEl3tf/iUiDmgjOmOr0bh3HrFtP4ZYRHfj45+38bebKQIdkjPEDX6r4pgMrgPO965cBLwDn+CsoYw4nNMjN7ad3ZFyPZkSEONV/2zLyKCgqoW2jqABHZ4w5HnxJUO1U9dwK6/eIyDI/xWPMEenYpHzyw/tnrWbOyl3cMKwdNwxrZyNRGFPH+dLMPE9EBpeuiMggIM9/IRlzdP56ZlfGJDflsS/XMfrR+Xxt804ZU6f5kqBuAJ4QkU0ishl4HLjev2EZc+QaR4fx2IW9ePXq/rhEmPTCD7y+eEugwzLGHCVfWvEtA3qKSIx3fb+/gzLmWAzukMDs207h5UWbGZvcDIDNaTk0jg4jPMSq/YypKw6aoETkUlV9VURur7IdAFV92M+xGXPUQoPc/G5IWwA8HuWGV5eSmVfEnWd0ZmxyM5vB15g64FBVfJHe9+hqXtZMytQZLpfw1zO7EhMezE2v/8QF//uO5VszAh2WMeYwRFUPfYDIIFVdeLhtNaVPnz66ZMmSQHy0qeNKPMqbP2zh4TlrScsp5MUr+zKsU+NAh2VMvSYiP6pqn+r2+dJI4r8+bjOmVnO7hEv6t+brO4YxdUxnBrVPAGDpln1k5BYGODpjTFWHegY1EDgZaFTlOVQMYE+aTZ0VHRbM9UPbAVBc4uHGV5eSU1jMDcPaceXJbawhhTG1xKFKUCE4z5qCqPz8aT8w0f+hGeN/QW4XL17Vl35JcTzw6RqGPjiXlxZtoqDY5p4yJtB8eQbVWlU311A8h2XPoIy/fP9bOg99tobvN6Xz8lX9GGIjpRvjd4d6BuXLUEe53vmgugFhpRtV1abbMCeUfm3ieOu6ASzdksFJrWIBeHb+RsJD3JzXJ5HQIKv6M6Ym+dJI4jXgV6ANcA+wCfjBjzEZEzAiQu/WDRERVJV5a/fwlw9WMPSBr3lh4W/kFhYHOkRj6g1fElS8qj4PFKnqPFW9Chjg57iMCTgR4ZWr+/Hq1f1pFRfBPR+tYtC/v+KzlTsDHZox9YIvVXxF3vcdIjIW2A4k+i8kY2oPEWFwhwQGd0hgyaZ0nvp6A63iIgDYkpaLR5WkhMjDXMUYczR8SVD/8k5Q+Aec/k8xwO/9GpUxtVCfpDienxRXtv7ol2t5/6dtnNalCVcNasOAtnE2hJIxx5Evg8V+7F3MBGz6d2O8po7uTPMG4by6eDOfr9pFpybRXD+sLWf3sgoGY46HQ3XU/S9w0DboqnqLXyIypo5oHBPGH0d1YvLw9ny0fDsvLtrEqu37ObuXM0Dtut3ZdGoaffgLGWOqdagS1DF3NhKR0cBjOCNPPKeq/67mmGHAo0AwsFdVhx7r5xpTk8JD3JzftyXn9UmksMQDwMINe7ns+e/p1SqWC/u2ZGyP5kSF+lKjbowpddiOukd9YRE3sBY4HUjFaZp+kaquqnBMLLAIGK2qW0SksaoechpU66hr6oKM3ELe+TGVN77fwoY9OYQHuxnTvSl3j+tKw8iQQIdnTK1xTB11RWQu1VT1+dBRtx+wXlU3eq/zJjABWFXhmIuB91R1i/eaNke3OSHERoRwzSltuXpwG37amsHbS1JZ/Fsa0WHOn9zcX3fTJCaMLs2irWGFMQfhS53DHysshwHnAr70VmwBbK2wngr0r3JMRyBYRL7GGefvMVV9ueqFRORa4FqAVq1a+fDRxtQOIsJJrRpyUquGeDyKy+V0AP7rzBVsTc+jfeMoxiY3Y1yPZnRoYs+rjKnIl1Z8P1bZtFBE5vlw7ep+FlYtiQUBvYERQDjwrYh8p6prq8TwDPAMOFV8Pny2MbWOy+X8SYgIH04ezCe/7OCTn7cz7at1PPblOm4Y1o4poztTWu1uJStT3/lSxRdXYdWFk1Ca+nDtVKBlhfVEnE6+VY/Zq6o5QI6IzAd64jy7MuaEFRcZwmUDWnPZgNbs3p/P7BU76do8BoA1u7K4+sUljOjSmBFdmjCgbZyNA2jqJV+q+H7EKfkITtXeb8DVPpz3A9BBRNoA24ALcZ45VfQh8LiIBOFM79EfeMS30I05MTSOCeOKk5PK1otLlC7NYpixZCsvf7uZiBA3g9on8Lczu5LYMCJwgRpTw3yp4mtzNBdW1WIRuQn4DKeZ+XRVXSki13v3P62qq0XkU+BnwIPTFH3F0XyeMSeK7i0a8NwVfcgvKuHbDWl8sXoX325Io2GE0/rv9cVbWLUjk0HtEhjYLp7YCGsVaE5MvswHFQbcCAzGKUl9Azylqvn+D+9A1szc1Hf3z17Nq99uJqewBBHo0jSG4Z0bcceozoEOzZgjdqzzQb0MZOGMwwdwEfAKcN7xCc8YcyTuHNOFP47sxPKtGSxcn8bi39JYtyu7bP/1r/xITHgQvVs7rQfbNYoqa6BhTF3iS4LqpKo9K6zPFZHl/grIGHN4wW4XfZLi6JMUB3Qoa/nn8SglqsxZtYsZS1IBiA4N4vph7Zg8vD2qyraMPFrEhlsrQVPr+ZKgfhKRAar6HYCI9AcW+jcsY8yRKE02Lpfw7OV98HiUjXuzWbY1k2Vb95VNEbI9M5/B/5lLw4hgujVvQNfmMXRpFs3J7RJoEhN2qI8wpsb58gxqNdAJ2OLd1ApYjdOoQVW1h18jrMKeQRlz9DJyC/no5x2sSM1k1Y79rNmVRWGxh2kX9WJ8z+as2r6fp+ZtoEPjKNp7X0nxkYQE+TK3qTFH7lifQY0+zvEYYwIkNsLpf1WquMTDxr05NIl2Sk+7s/JZunkfHy0v77LoEvhg8iB6JMayYlsmP23ZR+v4SFrHR9AiNpwgtyUv4x++NDPfLCI9gVO8mxaoqj2DMuYEEOR20bHCEEvDOjVm4dRTyS0sZuOeHNbvzmb97mxaxzmzBn/1624e/ry8H73bJTSPDePDyYOJiwzhh03pbEnLpUXDcFrEhtMkJsxKX+ao+TKSxK3A74D3vJteFZFnVPW/hzjNGFOHRYQE0b1FA7q3aFBp+82ntueCvi3ZtDeHzWm5bE7PYdu+PGLDgwF4b2kqb3y/tdI5zRqEsWjqqc4QT8u2sTU9l8YxYTSKDqVxdCiNo51lY6ry5RnUz8BA73BEiEgk8G1NP3sqZc+gjKm98otK2J6Rx7aMPHZk5LM9M4+8whLuPKMLAJNfW8onv+yodE5iw3C+meJMjvDn93/ht705xEWGEB8ZQlxkKG0aRTK+Z3MAftubQ0iQi9jwYCJC3NYS8QRwrM+gBCipsF5C9QPBGmPqubBgN20bRdG2UVS1+5+45CT+r6iEPVkF7M4qYE9WPt45HgEID3ZTUOxh5fb9pGUXsD+/mD6tG5YlqOteWcJab5+vYLfQIDyYYZ0a89B5Tk+Yv89cSUGxh5iwIKLDgogKDaJjU6eVIsCKbZmEBbuICAkiMjSIyBC3PUOrxXxJUC8Ai0XkfZzENAF43q9RGWNOWGHBblrGRdAy7sBxBf8yrmul9cJiD3lF5b+P7zqjC7v257Mvt4iM3CIy84po1yiybP9PWzPYti+X/XnFZbMbn9OrRVmCOvepRRQUeyp9xqUDWvGvs5Ip8SijH51PeIibsGA34d7XmOSmTEhpQX5RCY99uY6wIDdhwS5Cg1yEBbvp2TKWLs1iyC8qYcmmfYQEuZyX23lvHBNKTFgwJR4lr6iEYLcQ7HJZ52kf+NJI4mHvfE2DvZuuVNWf/BqVMcZA2Zd9qWGdGh/y+A8nDypbLiguITu/uFI14JOXnER2QTG5hSXkFBSTU1BC9xbOKPLFHg8dm0STW+js35dbyA5vaQ8gu6CY5xZspKik8mORKaM706VZDLv253Pp84sPiOme8d244uQk1uzM4oxpC8q2B7mEYLeLf5+bzISUFvycmsGNry0l2O0iyCUEuV0Eu4U7x3RhYLt4lm/N4P8+X0uQS3C7pOyYycPb0blpDD+nZvDG91vL9pe+rjg5iRax4azYlsmXq3fjEqe/nNsluEWY2DuRhpEhrN6xnx8378MlgtsFLhFcIoxJbkpESBBrd2WxdleWd7vT925ox0aEBftvpH1fSlClBKfvk6V9Y0ytFxrkJjSq8pfniC5NDnn8E5ecdND9CVGhrLv3DIpLPBQUO6/8ohIiQ52v0SYxYbx9/UAKijwUlpRQ6D0m2dvQpFF0KHed0ZmiEqWoxENhsYeiEg9tE5zq0MjQIPolxVHkUYqKPRR7lGKPpyxBF5V42J9XRLHHQ3GJUuJRij1KToFTwtyZmc/nq3ZS4tHylyrjejSjRWw4v2zL5JEvDpzJaHjnxjSMDGHh+r3865PVB+w/uX08ESFBzP5l5wHnf//nEX5NUL40kvgrzrh77+Ikp7OAt1X1X36L6hCskYQxxhw5VUUVStRJXh7ve0RIEG6XkFtYTHZ+MSWqeNQZNksVmseGEeR2kZZdQFpOIargUef8jk2iCT7GZ3jH2kjiIqBX6ejlIvJvYCkQkARljDHmyIkIIuBCqK7QExESRETIwVNCfFQo8VE12x3Al9S3Cag4SFcosMEv0RhjjDFevpSgCoCVIvI5znxQpwPfiMg0AFW9xY/xGWOMqad8SVDve1+lvvZPKMYYY0w5X5qZv1QTgRhjjDEVWRdqY4wxtZIlKGOMqYeKPcVkFWZR7CkGIL84nx3ZOygqKQIgqzCLdfvWUVhSCEB6fjrL9ywvW9+Vs6vsWH85aIISkVe877f6NQJjjDkBqSq5RbkUlDgjURR7ilmdtpq9eXsBJyF8vvlztu53Rn/PLszmpZUvsXaf0xk2PT+d/3z/H1buXQnAjuwd/OHrP7Bs9zIANmVu4orZV7B011IAfk3/lTPfP5Mfd/0IwE+7f2LIm0PK1hdtX0SPl3qUnb9w20JOfuNk1qSvAWDBtgWMfHckGzM3OuupCzhn5jlsy95Wtn7prEvZnbsbgPnb5pNRkOGXe1fqUCWo3iLSGrhKRBqKSFzFl1+jMsaYAMgsyCSzILNsfUHqAlanlY+u8NSyp5i3dR7gJKDJX07m/XVOG7JiTzGnv3M6L610Htvnl+TT//X+vLb6NQByi3M5/+PzmbVxFgA5RTnc/vXtLNy+EIDsomweWvIQP+/52Tm+KJcP1n/AlqwtZddfl7GOrMIsAFziwu0q79AUERRBp7hORAY7YxPGh8UzMmkkDcMaAtAyqiXX9riWxhHOcFFtY9vyxz5/LFvvGt+Ve06+hyYRzmgbvRr34qGhD9EovBEAA5oN4MkRTxIfHg/AsMRhNAitPB3L8XbQkSRE5BbgBqAtsI3KQxypqrb1a2QHYSNJGGMORVXLxt9bsXcFqkpyo2QAnvvlOWJDY5nYcSIA139+Pe1i23FH3zsAGDFjBIMTB3PPyfcAMPStoYxoNYK/DvwrAKe8eQpntT+LP/T5AwCXz76cMW3GcFHniwD426K/MSxxGMNbDcejHl5c+SJ9m/QluVEyJZ4Svk79mo4NO9IyuiXFnmI2Zm6kSUQTGoQ2wKMecotyCQsKI8h1JKPQ1W2HGknCl6GOnlLVG/wS2VGwBGVM/bU1ayv7C/bTLaEbAK+vfp2swiyu63kdADd+cSPFnmKeGfkMAJd8cglRIVH87/T/AXDF7CtoHtWc+0+5H4D/fP8fEqMTuaTLJQDM3DCTZpHN6Nu0LwBr960lNjS2rJRRMfmZ4+OYhjpS1RuqTPk+X1V/Pp4BGmMMwOq01Wzav4kxbcYATpXa8j3Lefr0pwF49MdHWbtvLR+d/REAK9NWkpaXVnb+0MShKOU/uv868K+EusuH53lpTOVeM1P6Tam0Pr7d+ErrHRt2rLRuyalm+TLl+y3AtZRP+f6aTflujDkaW/ZvYfme5YxrOw4R4eWVL/PGr28w65xZiAgfbfyId9a+w+ik0YgIDUIb0CiiUdn51yRfU9boAODewfdWuv4FnS+otN4prpN//0HGr3yp6LwG6F9hyvf/AN8ClqCMMZUUe4rZkrWFllEtCXYHMz91Pk8te4pnRj5DdEg0X2/9mgeXPMgpLU4hNiyWFlEt6NesH0WeIkLcIVzZ7Uou73p52fUu7nJxpet3ie9Sw/8iE0i+9IOyKd+NMdXambOT5355jp05OwH4csuXTPhgAusz1gMQ7AomMiSS7EJnmvaxbcfy8dkfEx0SDcCI1iO45+R7CHGHANAoohFNI5taVZoBjnzKd3Dmg7Ip342pJ1SVYi0m2BXMtuxt3LPoHq5Ovpr+zfqTnp/OY0sfo12DdjSNbEqvxr24d/C9NI1sCsDA5gMZ2Hxg2bXiw+PLmikbcziHLUGp6sPAlUA6sA9nyvdH/RyXMSZAsgqzyjqTZhZkMuStIcxYMwOABiENyCjIIL84H3AaESy8aCHDWw0HoHFEY8a3G1/W98aYY+FTY3tVXYozSaEx5gSzM2cn+wv307FhR0o8JYx8ZyRntjuTu/rfRYPQBoxrO452se0AiAqJYsaZM8rODXIFERMSE6jQzQmu/vQGM8YAsCd3D6nZqfRq3AuAyV9OJi4sjmdHPovb5eau/neRFJNUdnzVptjG1BRLUMac4PKK81iTvoaUxikA3P/9/fyy9xfmnDsHEWFqv6mVSkFntjszQJEaU5klKGNOQFuztpIYlYiI8OzPzzJ9xXTmXzifmJAYrutxHR71lB1bOmqCMbXNYRtJiMg5IrJORDJFZL+IZInIfl8uLiKjRWSNiKwXkamHOK6viJSIyMQjCd4Y4/Cop2zahDmb5nDGe2ewOt0Z5PSs9mfx5GlPEu4OB5zOq13iu1hTblPr+dIP6gFgvKo2UNUYVY1W1cM+FRURN/AEMAboClwkIl0Pctx/gM+OLHRjDEBqViqnv306n2/+HHBKRFP6TikblbpVTCtObn4ywe7gQIZpzBHzJUHtUtXVhz/sAP2A9aq6UVULgTeBCdUcdzPwLrD7KD7DmHrHox7uX3w/b/z6BgDNo5ozoPmAsmkRGoY15NKul1p/I1Pn+fIMaomIvAV8AJQNgqWq7x30DEcLYGuF9VSgf8UDRKQFcDZwKmAV4cYcxMaMjWzI3MDprU/HJS427d9EaJAzCKpLXAeMSWfMicCXBBUD5AIjK2xTygePPZjqKrirzu3xKDBFVUsOVR8uItfiDFhLq1atDvOxxpwYcotyiQiOAOD5Fc8zL3Uew1oOI9gVzNOnPW3PkMwJ77DzQR31hUUGAn9X1VHe9TsBVPX+Csf8RnkiS8BJhNeq6gcHu67NB2Xqg083fcpfvvkLH531Ec2imrE9ezsh7hASwhMCHZoxx9Wh5oPypRVfooi8LyK7RWSXiLwrIok+fO4PQAcRaSMiIcCFwMyKB6hqG1VNUtUk4B3gxkMlJ2NOVDlFOUxfMZ2VaSsBSE5IZmLHiWWlpOZRzS05mXrHl0YSL+AkluY4z5U+8m47JFUtBm7CaZ23GpihqitF5HoRuf7oQzbmxJFTlFO2/OzPz7Jw20IAWkS1YGq/qWWDrhpTH/ky5fsyVU053LaaYlV85kRx+9e3k1GQwfRR0wHYl7/PBlk19c4xVfEBe0XkUhFxe1+XAmmHPcsYU8n+wv3MWDOjbBSHYS2HcVqr0yj9kWjJyZjKfGnFdxXwOPAITiu8Rd5txpgjMG/rPP753T/p2LAjKY1TGN9ufKBDMqZWO2yCUtUtgP0lGXOEcotyeeCHB+jbtC9j245ldJvRdGjYgc5xnQMdmjF1wkETlIj8SVUfEJH/cmD/JVT1Fr9GZkwdVdp/KTwonPUZ62kV4/TdC3YFW3Iy5ggcqgRVOryRtUgwxkfP/PwMM9bM4JNzPiHUHcrLY17GJb486jXGVHXQBKWqH3kXc1X17Yr7ROQ8v0ZlTB2yef9mEsITiAyOpFfjXuQW5VLiKQE3lpyMOQa+/PXc6eM2Y+qdbdnbOOuDs3h99euAM5L4bb1vKxuiyBhz9A71DGoMcAbQQkSmVdgVAxT7OzBjaqvMgkxW7F3BoBaDaBHVgrsG3MXwlsMDHZYxJ5xDPYPajvP8aTzwY4XtWcDv/RmUMbXZgz88yBdbvuDL874kMjiS8zpajbcx/uDLSBIxQI6qlnjX3UCoqubWQHwHsJEkTE1TVT7d9CknNT6JJpFN2J69nazCLDrFdQp0aMbUecc6ksQcILzCejjwxfEIzJi6YFfuLv78zZ95e63TVqh5VHNLTsbUAF9GkghT1ezSFVXNFhF7AmxOaLtzd/PNtm84p8M5NI1syitjXrE+TMbUMF9KUDkiclLpioj0BvL8F5Ixgff66te5b/F97M3bC0C3hG64Xe4AR2VM/eJLCeo24G0R2e5dbwZc4LeIjAmQhdsWkhCeQKe4TlyTfA3ndjjX5mAyJoB8GYvvBxHpDHTCmf32V1Ut8ntkxtSg3KJc7vrmLgY1H8R9p9xHVEgUUSFRgQ7LmHrNlxIUOMmpKxAG9BIRVPVl/4VljP8VeYr4fNPnjGkzhojgCJ45/RnaNGgT6LCMMV6HTVAi8jdgGE6CmgWMAb4BLEGZOm3Wxln8ZeFfaBzRmD5N+1jLPGNqGV9KUBOBnsBPqnqliDQBnvNvWMb4x/7C/ezI3kGnuE6MazuuLDkZY2ofXxJUnqp6RKTY22l3N9DWz3EZ4xe3zb2NXTm7mHnWTNwuNwObDwx0SMaYg/AlQS0RkVjgWZwhj7KB7/0ZlDHH066cXcSFxxHsCub23rfjEpc1GTemDjhkPygREeB+Vc1Q1aeB04ErVPXKGonOmGO0I3sHEz6cwEsrXwKge0J3usZ3DXBUxhhfHDJBqTNQ3wcV1jep6s/+DsqYY1VQUgBAs6hmXJN8DaOSRgU4ImPMkfJlJInvRKSv3yMx5jj5bNNnjHl3DLtzdwNwTfI1tIxuGeCojDFHypdnUMOB60VkE5CD01lXVbWHPwMz5mh1ietCr8a9bDZbY+q4Q01Y2EpVt+D0ezKmVntp5UvszNnJlH5TaBXTiv8b9n+BDskYc4wOVYL6ADhJVTeLyLuqem4NxWTMEduTu4edOTsp9hQT5PJ1gBRjTG12qL9kqbBs/Z5MrVLiKeHV1a8ysPlAOjbsyG29b8MtbpyGp8aYE8GhEpQeZNmYgMsqzGL6iumk56fTsXdHKzUZcwI61F91TxHZj1OSCvcuQ3kjiRi/R2dMBR71MD91PkMThxIbFstb496iSUSTQIdljPGTgzZzUlW3qsaoarSqBnmXS9ctOZkaN2fzHG7+6ma+2fYNAE0jm1qVnjEnMKsXMbWaqpKWn0ZCeAIjW48keFgwg1sMDnRYxpgaYB1FTK32wA8PcPEnF5NdmI1LXIxoPcJKTcbUE1aCMrWSqiIijEoaRbPIZkQERwQ6JGNMDbMEZWqVIk8Rdy+8m7YN2nJtj2tJaZxCSuOUQIdljAkAq+IztUqwKxjx/s8YU7/5NUGJyGgRWSMi60VkajX7LxGRn72vRSLS05/xmNoptyiXB354gF05uwC4b/B9/K7H7wIclTEm0PyWoETEDTyBM5ZfV+AiEak6Ec9vwFDvwLP/BJ7xVzym9tqbt5d3177Lou2LAKwRhDEG8G8Jqh+wXlU3qmoh8CYwoeIBqrpIVfd5V78DEv0Yj6lFCkoK+HLzlwC0imnFrHNmcXaHswMclTGmNvFngmoBbK2wnurddjBXA7Or2yEi14rIEhFZsmfPnuMYogmUV1a9wm1f38bGjI0AxIfHBzgiY0xt489WfNXV01Q7pp+IDMdJUNX2wFTVZ/BW//Xp08fGBayjikqKSM9Pp0lkEy7rehnJCcm0jbVxiI0x1fNngkoFKk5jmghsr3qQiPQAngPGqGqaH+MxAXbTVzexL38fb4x9g1B3KP2b9Q90SMaYWsyfCeoHoIOItAG2ARcCF1c8QERaAe8Bl6nqWj/GYgKk2FNcNg3GJV0ucdZd7kCHZYypA/z2DEpVi4GbgM+A1cAMVV0pIteLyPXew/4KxANPisgyEVnir3hMzUvLS+PiTy7mww0fAjAkcQintjo1wFEZY+oKv44koaqzgFlVtj1dYfka4Bp/xmACp2FYQxKjE2kQ0iDQoRhj6iAbScIcV2vS13DzlzeXDe768LCHGd5qeKDDMsbUQZagzHGVX5LPqvRVbMnaEuhQjDF1nA0Wa47Z0l1L2ZC5gfM6nkfPRj2Zfc5sQtwhgQ7LGFPHWQnKHLO31rzFyytfpqikCMCSkzHmuLASlDkqX275km7x3Wga2ZS7+t9FsCuYYHdwoMMyxpxArARljtjevL1MnT+Vl1a+BECD0AY2oaAx5rizEpTxSbGnmG+3f8spiaeQEJ7A9FHT6RzfOdBhGWNOYFaCMj55a81b3PjljaxKWwVAcqNkgl1WpWeM8R8rQZmD2pe/j4yCDNo0aMO5Hc6lWWQzusR1CXRYxph6whKUqZaqctVnVxERFMGrZ7xKWFCYDVNkjKlRlqBMJSv2rqBrfFdc4mJqv6nEh8XbDLfGmICwZ1CmzA87f+CiTy7i098+BaB/s/60b9g+wFEZY+orS1D1XHZhdlnDh95NenP3gLtt7DxjTK1gCaqe+9P8P3Hr3Fsp8hThEhfndzqf8KDwQIdljDH2DKq+UVW+2voVA5sNJCI4gpt63YSqWpNxY0ytYyWoemZ1+mpum3sbH6z/AICu8V3pltAtsEEZY0w1rARVDyzbvYzN+zczof0EusZ35X+n/Y9+zfoFOixjjDkkK0HVA6+tfo2nlz9NsacYgJNbnEyQy36bGGNqN0tQJ6DfMn/j5i9vZmfOTgCm9JvCu+PftaRkjKlTLEGdIFSV3KJcAELdoaxMW8nGzI0AJIQn2Gjjxpg6x35SnwBKhyVqGtmU+0+5n+ZRzZkzcY6VmIwxdZqVoOqonKIc5myaA4CIMKzlMPo1LW/4YMnJGFPX2bdYHfXWmrd45MdH+KjhRyQ1SOKKblcEOiRjjDmurARVR+zO3c3kLyezaNsiAM7tcC6vnfEaSQ2SAhuYMcb4iSWoWmx37u6ycfJiQ2PZlbOLzMJMwJlmvUejHoEMzxhj/Mqq+GoZVS2b3uKmL29CRHhr3FuEuEN4+8y3beoLY0y9YQmqFnl/3fu8vOplZpw5g2BXMHf1v4uGYQ3L9tf55OQpgZJC76sYtMTZpiXOftXyY8VV/nIFgTsIXMHgDnGWjTEnPPtLD6A9uXt4Z+07nN/pfOLD44kPj6dtg7ZkFWYRFxZHSuOUwAZYUgR5GZC3D/IznOX8TCjIhPz9ULAfCrKgIBsKs53lolwoyoPCHCjO974KnHf1HJ+4xOUkqqBQCAqH4DAIjoDgcAiJhOBI5z00CkKiIDQGQqMhrAGExXjfG0BYLITHOvvrevI35gRkCaqGbczcSJg7jOZRzdlXsI+nlj9F+4btOb316QxJHMKQxCH++/DCHMjZA9l7nPecPZC7F3LSILfKK2+fk4AOxRXsfPGXJoKQKCcxRDaGkAgICnOSRlAouEO978HOea4gcLmdl7grJAgB1ClNqae8lFVSBJ4i5724AEoKoLgQivOgKN95L8x1EmReaoWkme3sOxRxO4kqPA7CG0JEHETEO8uRCc5yhPc9MsF5WVIzxu8sQfmZRz3sL9hPbFgsuUW5TJw5kQs7X8if+v6Jjg078tX5X5EQnnD0H1CYA9m7nKSTvct55ewp35azG7J3O9u8I00cIDjS++Ub77zHty//go6IKy9phMWWl0JCY5zkUxe+pEuKvaW9/U7JLz+zQonQ+56XDrnpTmLevw12/uIk6uL86q/pCobIRs49i2xU4ZVQZbmxsxwcVnP/XmNOEJag/KDIU1Q2v9Jlsy+jYWhDHh/xOBHBETw09CG6xZdPb1FtcirK9yYWb6KpuJy9y5twvImnMLuaCKT8yzGqEbTsD1GNK39hln6xRiQ4pZ0TmTvIWyqKO/JzC3OcRJWzt8L7Xm8JNM1Zzt4Naeud/0YHK62FRDv3P6pxlUTWuMJygrekFueULI2p5yxBHQce9eASp8X+w0seZn7qfD446wMAzut4HuHuMOfXec5eTtUw2Pyd9wtub3npJmdP+fLBqtbCG3qTTmNofpLzHtXY2RbdpHxfRII1JDheQrzPs2Jb+XZ8YY7z3zE3rfJ/05zSpLYb0jfC1sXOMdU+lxNvQk0or1KsWMUYEV+hGtL7fqL/yDD1kn2LHSlPCcW5abjz9yN5+3hv02we2/IJnyVdTFj+frplrCYoP5uiF8cSnJPGWbl7neRU2lKtqtKkE9kImvUoL/VENoaoJhWSUCPnGY6p3UIiIa6N8zocT4lTpZhT4ZlgTtqBzwd3r3YSXN4+QKu/VlBYecIKj3USWHjDyq+KVbXhsU51bUg0uKw7pKmd6l+CKi70tjzbX/6eX+H5REGm9xmF95WXQVb+PoLzMgjLz2SBFPCHxgm8sX0n7YqKaR0ayulREeRs+DthCqPCGzIqPM75pRvfDlr2K6/CiUio/MwiIt5pNGDqJ5e7vIREl8MfX5bQ9pY/Myv9AZSXDrn7yhu47P7V2ZaX4TQuORhxOc8Ty54tels4hkZ716PLW0GGxlRoGRnlJLfS9eAIS3TmuPNrghKR0cBjgBt4TlX/XWW/ePefAeQCk1R1qT9j4uPfw7JXD7q7GPg1IpqEoEiahjRgdXgkF4Rl8EhsR0ZEt6VNcAhn5f5GSLebILYdvSPi6F3amCC0gf2RGv+plNB8pOpUO+btK+8u4P3hVf5DrHTZ+0MtY3OFbgT7feweIN4m/hHeatEop9qxdL20G8AB72HlXQUOeA8r70oQFFq+bs/n6g2/JSgRcQNPAKcDqcAPIjJTVVdVOGwM0MH76g885X33n+Rznaq00GgIjaY4JII3d/9Ah7hO9G8xmGzxcNE7p/H73r/nqu5X0bakgMkrXqRt0kho0IZE4C6/BmjMcSTilHJCoyC25ZGfX5rgSvu5Feyv3IS/MMu7P8dZL8opXy89L2ePs1yU57QkLcw5eJW3T/8mtzdZhTjdF9wh5ctBId7O3CFO7UTpu6vCctm6t7tDWdcH94HdIEqPKXu5y5fFXbmrxAFdJ1wV9lVZL1t2HfiqdnsdaC3rB/4sQfUD1qvqRgAReROYAFRMUBOAl1VVge9EJFZEmqnqDr9F1e5Ubtsyk05hnbihy8W4VXn6h79xplvo3+lsYoHHT32crvFdAWfyv+t6Xue3cIyp1SomuOimx++6JUXeTt35zntxvpPASjt3F+VX6ejt7exdUlh5W2l/uJIC55olhd7tRRWOLyzvQ1exP13F5YM926tNqktm4gKkPImJVLOtdL3qspQvVzy+4jaoch6Vt8e2ggsOXiN1rPyZoFoAWyusp3Jg6ai6Y1oAlRKUiFwLXAvQqpWPrakOITI4kjB3WOm1mXXOLGJCYsr2D2059Jg/wxhzCO5gcHufd9UGZZ3Bi8tfJUVOSa9se4nzriWVh+oq3eYpBo/Hu16hk7l6yof0Kl0vWy7tkO7dVrrsKaFSh/Wy9arLnsrHqad8n3q8w4eVrnOQfVr5GmXbqLxcdk6F7RHxfv3P4s8EVV2ZtOrPFF+OQVWfAZ4B6NOnzzH/1Ll38L2V1ismJ2NMPVRaNWdqFX8+0U8FKlZ6JwLbj+IYY4wx9ZA/E9QPQAcRaSMiIcCFwMwqx8wELhfHACDTr8+fjDHG1Bl+q+JT1WIRuQn4DKeZ+XRVXSki13v3Pw3Mwmlivh6nmfmV/orHGGNM3eLXflCqOgsnCVXc9nSFZQUm+zMGY4wxdZP1KjXGGFMrWYIyxhhTK1mCMsYYUytZgjLGGFMrWYIyxhhTK4lqHRiDqgIR2QNsPsbLJAB7j0M4JxK7Jweye1I9uy8HsntyIF/vSWtVbVTdjjqXoI4HEVmiqn0CHUdtYvfkQHZPqmf35UB2Tw50PO6JVfEZY4yplSxBGWOMqZXqa4J6JtAB1EJ2Tw5k96R6dl8OZPfkQMd8T+rlMyhjjDG1X30tQRljjKnlLEEZY4yplepdghKR0SKyRkTWi8jUQMcTCCLSUkTmishqEVkpIrd6t8eJyOciss773jDQsdY0EXGLyE8i8rF3vV7fExGJFZF3RORX7/9fBto9kd97/25WiMgbIhJWH++JiEwXkd0isqLCtoPeBxG50/u9u0ZERvnyGfUqQYmIG3gCGAN0BS4Ska6BjSogioE/qGoXYAAw2XsfpgJfqmoH4Evven1zK7C6wnp9vyePAZ+qamegJ869qbf3RERaALcAfVS1O85cdxdSP+/Ji8DoKtuqvQ/e75cLgW7ec570fh8fUr1KUEA/YL2qblTVQuBNYEKAY6pxqrpDVZd6l7NwvnRa4NyLl7yHvQScFZAAA0REEoGxwHMVNtfbeyIiMcAQ4HkAVS1U1Qzq8T3xCgLCRSQIiAC2Uw/viarOB9KrbD7YfZgAvKmqBar6G84ktf0O9xn1LUG1ALZWWE/1bqu3RCQJ6AUsBpqo6g5wkhjQOIChBcKjwJ8AT4Vt9fmetAX2AC94qz2fE5FI6vE9UdVtwEPAFmAHkKmqc6jH96SKg92Ho/rurW8JSqrZVm/b2YtIFPAucJuq7g90PIEkIuOA3ar6Y6BjqUWCgJOAp1S1F5BD/ai6OijvM5UJQBugORApIpcGNqo64ai+e+tbgkoFWlZYT8Qpntc7IhKMk5xeU9X3vJt3iUgz7/5mwO5AxRcAg4DxIrIJp+r3VBF5lfp9T1KBVFVd7F1/Bydh1ed7chrwm6ruUdUi4D3gZOr3PanoYPfhqL5761uC+gHoICJtRCQE56HdzADHVONERHCeK6xW1Ycr7JoJXOFdvgL4sKZjCxRVvVNVE1U1Cef/F1+p6qXU73uyE9gqIp28m0YAq6jH9wSnam+AiER4/45G4DzDrc/3pKKD3YeZwIUiEioibYAOwPeHu1i9G0lCRM7AedbgBqar6r2BjajmichgYAHwC+XPW+7CeQ41A2iF84d4nqpWfQh6whORYcAfVXWciMRTj++JiKTgNBoJATYCV+L8sK3P9+Qe4AKc1rA/AdcAUdSzeyIibwDDcKbV2AX8DfiAg9wHEfkzcBXOfbtNVWcf9jPqW4IyxhhTN9S3Kj5jjDF1hCUoY4wxtZIlKGOMMbWSJShjjDG1kiUoY4wxtZIlKGMOQ0TiRWSZ97VTRLZ5l7NF5Ek/feZtInJ5NduTKo4efRw+J0RE5nvHlTOmVrH/UxpzGKqaBqQAiMjfgWxVfchfn+dNFlfhjNrgV6paKCJf4vTrec3fn2fMkbASlDFHSUSGVZg36u8i8pKIzBGRTSJyjog8ICK/iMin3qGlEJHeIjJPRH4Ukc9Kh4Wp4lRgqaoWVzhnuYh8C0yu8PlJIrJARJZ6Xyd7t78iIhMqHPeaiIwXkW4i8r239PeziHTwHvIBcIk/7pExx8ISlDHHTzuc6TomAK8Cc1U1GcgDxnqT1H+BiaraG5gOVDeSySCg4qC1LwC3qOrAKsftBk5X1ZNwSkDTvNufwxnxARFpgDNW3CzgeuAxVU0B+uCMjwawAuh7lP9mY/zGqviMOX5mq2qRiPyCM5TWp97tvwBJQCegO/C5M4wbbpwpG6pqhnfSRG+CiVXVed59r+BMuAkQDDzuHY6oBOgIoKrzROQJEWkMnAO8q6rF3hLYn73zXr2nquu8x5eISKGIRHvnBzOmVrAEZczxUwCgqh4RKdLyccQ8OH9rAqyspiRUVR4Q5l0WDj4twe9xxkDriVMbkl9h3ys41XYX4jzPQlVfF5HFOKW8z0TkGlX9ynt8aJXzjQk4q+IzpuasARqJyEBwpjwRkW7VHLcaaA/gncE20zvAL1R+VtQA2KGqHuAynBJZqReB27zXWOn9vLbARlWdhjO6dA/v9nigdPoIY2oNS1DG1BBVLQQmAv8RkeXAMpznQ1XNxplqvdSVwBPeKrq8CtufBK4Qke9wqvdyKnzWLpxE90KF4y8AVojIMqAz8LJ3+3CcZ1TG1Co2mrkxtZCIvA/8qfQ50VGcH4Hz7OskVc08zLHvAXeq6pqj+Sxj/MVKUMbUTlNxGkscMRE5DfgV+K8PySkE+MCSk6mNrARljDGmVrISlDHGmFrJEpQxxphayRKUMcaYWskSlDHGmFrJEpQxxpha6f8BZU9EIlaZaosAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_results(results.S, results.I, results.R)" + ] + }, + { + "cell_type": "markdown", + "id": "warming-beauty", + "metadata": {}, + "source": [ + "As with a `DataFrame`, we can use the dot operator to select columns\n", + "from a `TimeFrame`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "indie-ancient", + "metadata": {}, + "source": [ + "## Summary\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "removed-stevens", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "listed-istanbul", + "metadata": {}, + "source": [ + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", + "\n", + "Hint: what is the change in `S` between the beginning and the end of the simulation?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "strange-soviet", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3787177442414792" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "tc = 4 # time between contacts in days \n", + "tr = 5 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "s_0 = system.init.S\n", + "\n", + "final = run_simulation(system, update_func)\n", + "s_end = final.S[system.t_end]\n", + "\n", + "s_0 - s_end" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "growing-clear", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "polar-edgar", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap12.ipynb b/jupyter/chap12.ipynb new file mode 100644 index 00000000..74d236fb --- /dev/null +++ b/jupyter/chap12.ipynb @@ -0,0 +1,1036 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "noble-particle", + "metadata": {}, + "source": [ + "# Chapter 12" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-partner", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "governing-nerve", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "dominican-johns", + "metadata": {}, + "source": [ + "### Code\n", + "\n", + "Here's the code from the previous notebook that we'll need." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "changed-netherlands", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "thorough-heading", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "peaceful-collective", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import arange\n", + "\n", + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.loc[system.t0] = system.init\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "patent-madagascar", + "metadata": {}, + "source": [ + "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects." + ] + }, + { + "cell_type": "markdown", + "id": "knowing-connecticut", + "metadata": {}, + "source": [ + "## Immunization\n", + "\n", + "Models like this are useful for testing \"what if?\" scenarios. As an\n", + "example, we'll consider the effect of immunization.\n", + "\n", + "Suppose there is a vaccine that causes a student to become immune to the Freshman Plague without being infected. How might you modify the model to capture this effect?\n", + "\n", + "One option is to treat immunization as a shortcut from susceptible to\n", + "recovered without going through infectious. We can implement this\n", + "feature like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "catholic-walker", + "metadata": {}, + "outputs": [], + "source": [ + "def add_immunization(system, fraction):\n", + " system.init.S -= fraction\n", + " system.init.R += fraction" + ] + }, + { + "cell_type": "markdown", + "id": "logical-mailman", + "metadata": {}, + "source": [ + "`add_immunization` moves the given fraction of the population from `S`\n", + "to `R`. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "sophisticated-occasions", + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "results = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "postal-haiti", + "metadata": {}, + "source": [ + "If we assume that 10% of students are vaccinated at the\n", + "beginning of the semester, and the vaccine is 100% effective, we can\n", + "simulate the effect like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "abandoned-piece", + "metadata": {}, + "outputs": [], + "source": [ + "system2 = make_system(beta, gamma)\n", + "add_immunization(system2, 0.1)\n", + "results2 = run_simulation(system2, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "robust-forestry", + "metadata": {}, + "source": [ + "The following figure shows `S` as a function of time, with and\n", + "without immunization." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "suffering-coupon", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results.S.plot(label='No immunization')\n", + "results2.S.plot(label='10% immunization')\n", + "\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "markdown", + "id": "shaped-assets", + "metadata": {}, + "source": [ + "## Metrics\n", + "\n", + "When we plot a time series, we get a view of everything that happened\n", + "when the model ran, but often we want to boil it down to a few numbers\n", + "that summarize the outcome. These summary statistics are called\n", + "**metrics**, as we saw in Section xxx.\n", + "\n", + "In the SIR model, we might want to know the time until the peak of the\n", + "outbreak, the number of people who are sick at the peak, the number of\n", + "students who will still be sick at the end of the semester, or the total number of students who get sick at any point.\n", + "\n", + "As an example, I will focus on the last one --- the total number of sick students --- and we will consider interventions intended to minimize it.\n", + "\n", + "When a person gets infected, they move from `S` to `I`, so we can get\n", + "the total number of infections by computing the difference in `S` at the beginning and the end:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "unable-joshua", + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results, system):\n", + " s_0 = results.S[system.t0]\n", + " s_end = results.S[system.t_end]\n", + " return s_0 - s_end" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "floral-transcription", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.468320811028781" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calc_total_infected(results, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cardiovascular-acting", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.30650802853979753" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calc_total_infected(results2, system2)" + ] + }, + { + "cell_type": "markdown", + "id": "reliable-fisher", + "metadata": {}, + "source": [ + "Without immunization, almost 47% of the population gets infected at some point. With 10% immunization, only 31% get infected. That's pretty good." + ] + }, + { + "cell_type": "markdown", + "id": "multiple-springfield", + "metadata": {}, + "source": [ + "## Sweeping Immunization\n", + "\n", + "Now let's see what happens if we administer more vaccines. This\n", + "following function sweeps a range of immunization rates:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "funny-batman", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_immunity(immunize_array):\n", + " sweep = SweepSeries()\n", + "\n", + " for fraction in immunize_array:\n", + " sir = make_system(beta, gamma)\n", + " add_immunization(sir, fraction)\n", + " results = run_simulation(sir, update_func)\n", + " sweep[fraction] = calc_total_infected(results, sir)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "normal-blowing", + "metadata": {}, + "source": [ + "The parameter of `sweep_immunity` is an array of immunization rates. The\n", + "result is a `SweepSeries` object that maps from each immunization rate\n", + "to the resulting fraction of students ever infected.\n", + "\n", + "The following figure shows a plot of the `SweepSeries`. Notice that\n", + "the x-axis is the immunization rate, not time." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "severe-oklahoma", + "metadata": {}, + "outputs": [], + "source": [ + "immunize_array = linspace(0, 1, 21)\n", + "infected_sweep = sweep_immunity(immunize_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "sudden-worker", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzFElEQVR4nO3dd5xU5dn/8c+1fVmWXoSlS1FU6oLGCmKJhthirNEkaIxdY8wTnzyxRJMnPkk0saMx/owp9h5NLCj2woIIIiILgiyg9LLAsu36/XHO4uy6ZYCdPbOz3/frdV5zyn3OXHPv7Fxzn3Pmvs3dERERSTZpUQcgIiJSHyUoERFJSkpQIiKSlJSgREQkKSlBiYhIUlKCEhGRpKQEJbvMzA4xswUJOG4/Mys1s/Q4y59oZsvCfUY3dzzxMrP7zezXLfh8Can/5razf8+dOG6reP2y60y/g0oNZrYE6AlUxawe6u4rmvE5HBji7sXNdczmYGaLgCvc/endPM5uvT4zux8ocfdf7k4cUr9kff+B/vaJohZUavm2u7ePmWolJzPLiCqwBOsPzIs6CElNKfx/k/SUoFKcmbmZXWRmC4GF4bpbwlNim8xsppkdElM+3cx+YWaLzGxzuL2vmb0eFvkwPF1zqplNMLOSmH33NrPpZrbBzOaZ2XEx2+43szvM7LnwuO+Z2Z4NxDwgjDsjXJ5uZjeY2Vvhvi+aWTczyzazUiA9jGtRWL63mT1uZqvN7DMzu3RXXl9YfrKZzQ5f09tmNiLmWKPNbFZ4nIeBnAZeT3a4/74x67qb2TYz6xG+ln+FZdaZ2Rtm1uT/Zj31v8TMfmZmc8xsi5n9xcx6mtm/wxhfNrPOder4h+F7Yb2ZnW9m48L9N5jZ7THHvs7M/r6zf6O6Zc3sG2H91kxlFrT+MbPxZvZO+Nwrzex2M8sKt0Xx/jvHzD4HXgnXP2pmX5jZRjN73cz2CdefB5wJ/FcY27Ph+gbfhxInd9eUAhOwBDiinvUOvAR0AXLDdd8DugIZwE+BL4CccNvPgLnAMMCAkUDXmGMNjjn2BILTGgCZQDHwCyALOBzYDAwLt98PrAPGh8/7D+ChBl7LgPC5MsLl6cAiYCiQGy7fWOc1Dg7n04CZwDVhHIOAxcDRu/D6xgCrgP0JkuD3w3rODo+9FPhJ+NpPBiqAXzfwmu4DfhOzfBHwn3D+t8DU8DiZwCGEp9+b+JvvqP+Y98C7BKd6C8LYZwGjw5hfAa6tU8dTCRLrUUAZ8BTQI2b/w8Ly1wF/35W/Ud2yMcfIDMv9NlweCxwQvj8GAPOBy+v7O7fQ++8BII+v/m+mAPlhXf4JmB2zz/2xf3uaeB9qivNzLeoANDXTHzL4cCoFNoTTU+F6Bw5vYt/1wMhwfgFwfAPlGvuAOIQg0aXFbH8QuC6cvx+4N2bbscAnDTxPfR9+v4zZfiHhh3vduAiSyed1jvffwP/bhdd3F3BDnTILgMOAQ4EVxCQS4G0aTlBHAItjlt8Czg7nrweejn3uOP/mO+o/5j1wZszy48BdMcuXxLwvauq4IGb7WuDUOvtfHs5fR9MJqt6/Ud2yder3udj3TJ3tlwNPRvj+G9RI3XcKy3SMOX5sgmr0fagpvknnVlPLCe7+cj3rl8UumNlPgXOB3gT/ZB2AbuHmvgTfhHdWb2CZu1fHrFtK8E28xhcx81uB9jtx/Hj37Q/0NrMNMevSgTfC+Z15ff2B75vZJTHrsviq3pZ7+MkTWtrIsV4Bcs1sf4LXMgp4Mtz2e4IE8KKZAdzj7jfGGWNdX8bMb6tnuW697Wz5xsT99zWzHxMkmANq3jNmNhS4GSgE2hG0dGbG+dyJeP/t+L+x4A7E3wDfBboDNc/TDdhYz75NvQ8lDroG1Tbs+BC14HrTz4FTgM7u3ongH8zCIsuAes/NN2EF0LfOtZN+wPJdCXg3LAM+c/dOMVO+ux8bsz3e17eM4LRc7LHaufuDwEqgwMKMEurX0IHCD85HgNOBM4B/ufvmcNtmd/+puw8Cvg1cYWaTduZFt4AtBEmjxh67eqDwPXgDQUs29sP9LuATgjv1OhCcrrN6DlGfRLz/Yr98nAEcT9AS7kjQyiImvrq3Qzf1PpQ4KEG1PflAJbAayDCzawhaUDXuBW4wsyEWGGFmXcNtXxKcS6/PewQfYv9lZplmNoHgw/ahBLyGxrwPbDKzn5tZrgU3RexrZuPC7Tvz+v4MnG9m+4dl88zsW2aWD7xDUI+Xhhf/TyK4vtGYfwKnElxQ/2fNSgtuxBgcJrtNBD8VqKr/EJGZDRxqwW+aOhKcrtppZtYXeJjg9OandTbnE7z+UjPbC7igzvYo33/5wHaC06DtgP9tIram3ocSByWotucF4N/ApwSnQMqofQrwZoJv+i8SfFj8heCiNwSnof4a3iV1SuxB3b0cOA44BlgD3EnwIfRJwl5JPdy9iuCDaRTwWRjLvQTfemEnXp+7FwE/Am4nuE5XDPwgfJ5y4KRweT1B4nmiidhqPkR7E/wNagwBXia4hvgOcKe7Twew4A68X+xkNTQ7d3+JILHMITjt9q9dPNQkgtbXYzF38tX8ROBKgpbKZoIvBw/X2fc6onv/PUDw/7Ic+JjgZpRYfwGGh7E9Fcf7UOKgH+qKiEhSUgtKRESSkhKUiIgkJSUoERFJSkpQIiKSlFrdD3W7devmAwYMiDoMERFpJjNnzlzj7t3rrm91CWrAgAEUFRVFHYaIiDQTM6u3Fxad4hMRkaSkBCUiIklJCUpERJJSq7sGJSLSmlRUVFBSUkJZWVnUoUQuJyeHPn36kJmZGVd5JSgRkQQqKSkhPz+fAQMGULvz+7bF3Vm7di0lJSUMHDgwrn10ik9EJIHKysro2rVrm05OAGZG165dd6olqQQlIpJgbT051djZemhzCWrx6lKemFUSdRgiItKENpeg/vzGYq56fC5fbNQFSxFpG8yMs846a8dyZWUl3bt3Z/LkyY3uN3v2bJ5//vkGtxcVFXHppZc2W5x1tbkEdcFhg6ly5+7XF0UdiohIi8jLy+Ojjz5i27ZtALz00ksUFBQ0uV9jCaqyspLCwkJuvfXWZo01VptLUP26tuPE0QX8873PWbVZrSgRaRuOOeYYnnvuOQAefPBBTj/99B3btmzZwpQpUxg3bhyjR4/m6aefpry8nGuuuYaHH36YUaNG8fDDD3Pddddx3nnncdRRR3H22Wczffr0Ha2w0tJSfvjDH7LffvsxYsQIHn/88d2OuU3eZn7RxME8MauEP7++mP/51vCowxGRNuJXz87j4xWbmvWYw3t34Npv79NkudNOO43rr7+eyZMnM2fOHKZMmcIbb7wBwG9+8xsOP/xw7rvvPjZs2MD48eM54ogjuP766ykqKuL2228H4LrrrmPmzJm8+eab5ObmMn369B3Hv+GGG+jYsSNz584FYP369bv92tpcCwpgYLc8jh9VwN/f/Zw1pdujDkdEJOFGjBjBkiVLePDBBzn22GNrbXvxxRe58cYbGTVqFBMmTKCsrIzPP/+83uMcd9xx5Obmfm39yy+/zEUXXbRjuXPnzrsdc5tsQUHQinpq9nLufeMzrjpmr6jDEZE2IJ6WTiIdd9xxXHnllUyfPp21a9fuWO/uPP744wwbNqxW+ffee+9rx8jLy6v32O7e7LfTt8kWFMDgHu2ZPKI3D7yzhHVbyqMOR0Qk4aZMmcI111zDfvvtV2v90UcfzW233Ya7A/DBBx8AkJ+fz+bNm+M69lFHHbXjVCDoFN9uu+TwwWwtr+K+Nz+LOhQRkYTr06cPl1122dfWX3311VRUVDBixAj23Xdfrr76agAmTpzIxx9/vOMmicb88pe/ZP369ey7776MHDmSV199dbfjtZqM2VoUFhZ6cw5YeOE/ZvL6p2t46+eH07FdfB0YiojEa/78+ey9995Rh5E06qsPM5vp7oV1y7bpFhTAxROHULq9kvveUitKRCSZtPkENbx3B44a3pP/99ZnbCqriDocEREJtfkEBXDppCFsKqvkgbeXRB2KiKSg1nYpJVF2th6UoIB9Czoyaa8e3PvmZ5Rur4w6HBFJITk5Oaxdu7bNJ6ma8aBycnLi3qfN/g6qrksmDeGEO97ib+8s5YIJe0YdjoikiD59+lBSUsLq1aujDiVyNSPqxksJKjSqbycOG9qdP7+xmO8f2J92WaoaEdl9mZmZcY8gK7XpFF+MSycNYd2Wcv7xbv1dfIiISMtRgooxtn9nDh7cjbtfX8y28qqowxERadOUoOq4dNIQ1pRu58H31YoSEYmSElQd4wd24YBBXZj62iLKKtSKEhGJihJUPS6dNIRVm7fzSNGyqEMREWmzlKDq8Y1BXRk3oDN3TV/E9kq1okREoqAEVQ8z49JJQ1i5sYzHZpZEHY6ISJukBNWAgwd3Y1TfTtz56iIqqqqjDkdEpM1RgmqAmXHZpCEs37CNJ2ctjzocEZE2RwmqEROGdWe/go7c/moxlWpFiYi0KCWoRtRci/p83Vaenr0i6nBERNqUhCYoM/ummS0ws2Izu6qRcuPMrMrMTk5kPLviiL17sHevDtz+ajFV1W27N2IRkZaUsARlZunAHcAxwHDgdDMb3kC5/wNeSFQsuyO4FjWYz9Zs4V9z1IoSEWkpiWxBjQeK3X2xu5cDDwHH11PuEuBxYFUCY9ktRw3fg2E987ntFbWiRERaSiITVAEQ2xVDSbhuBzMrAE4EpjZ2IDM7z8yKzKwoijFV0tKMSyYNpnhVKf/+aGWLP7+ISFuUyARl9ayr2/z4E/Bzd2+0uwZ3v8fdC929sHv37s0V3045Zt9eDO7RntumFVOtVpSISMIlMkGVAH1jlvsAdS/iFAIPmdkS4GTgTjM7IYEx7bL0NOOSwwez4MvNvPjxF1GHIyKS8hKZoGYAQ8xsoJllAacBz8QWcPeB7j7A3QcAjwEXuvtTCYxpt0we0ZtB3fK4ZVox7mpFiYgkUsISlLtXAhcT3J03H3jE3eeZ2flmdn6injeR0tOMiyYOZv7KTbw8P2nv6RARSQnW2loChYWFXlRUFNnzV1ZVc/hNr9ExN5NnLj4Is/outYmISLzMbKa7F9Zdr54kdlJGehoXTxzM3OUbmb6g5e8oFBFpK5SgdsGJYwro0zmXW6Yt1LUoEZEEUYLaBZnpaVw0cTCzl23g9YVrog5HRCQlKUHtou+M6UPvjjnc8vKnakWJiCSAEtQuyspI44KJg5n1+QbeKl4bdTgiIilHCWo3nFLYhz065HDLNLWiRESamxLUbsjOSOeCCXsyY8l63l28LupwRERSihLUbjp1XF965Gdzy7RPow5FRCSlKEHtppzMdM4/bE/eXbyO9xbrWpSISHNRgmoGp4/vR7f22dz2SnHUoYiIpAwlqGaQm5XOjw8dxJvFa5i5VNeiRESagxJUMznzgH50zcvilmlqRYmINAclqGbSLiuDHx06iNc/Xc0Hn6+POhwRkVavwQRlZnPNbE5DU0sG2VqcdUB/OrfL5NZpC6MORUSk1ctoZNvk8PGi8PFv4eOZwNaERdSK5WVncO4hg/j9CwuYU7KBEX06RR2SiEir1WALyt2XuvtS4CB3/y93nxtOVwFHt1yIrcvZ3+hPx9xMbtW1KBGR3RLPNag8Mzu4ZsHMDgTyEhdS65afk8k5Bw/k5flf8tHyjVGHIyLSasWToM4B7jCzJWb2GXAnMCWxYbVuPzhoAPk5Gdz2iq5FiYjsqsauQQHg7jOBkWbWgWCIeDULmtAhJ5MpBw3klmkLmb9yE3v36hB1SCIirU6TLSgz62lmfwEedveNZjbczM5pgdhatSkHDSQ/W60oEZFdFc8pvvuBF4De4fKnwOUJiidldGyXyQ8OGsDzc79gwRebow5HRKTViSdBdXP3R4BqAHevBKoSGlWKmHLQQPKy0tWKEhHZBfEkqC1m1hVwADM7ANB1qDh0zsvi7AMH8NzclRSvUitKRGRnxJOgrgCeAfY0s7eAB4BLExpVCvnRIYPIzUzndvV0LiKyU+JJUPOAw4ADgR8D+wCfJDKoVNIlL4uzDujPMx+uYPHq0qjDERFpNeJJUO+4e6W7z3P3j9y9Angn0YGlknMPGURWRhq3v6pWlIhIvBrrLHYPMxsL5JrZaDMbE04TgHYtFWAq6J6fzff278/Ts1ewZM2WqMMREWkVGmtBHQ38AegD3AzcFE4/AX6R+NBSy3mHDiIjzbhDrSgRkbg02JOEu/8V+KuZfcfdH2/BmFJSjw45nD6+H397dymXThpC3y5qhIqINCaea1BjzaxTzYKZdTazXycupNR1wYQ9SU8z7pyuVpSISFPiSVDHuPuGmgV3Xw8cm7CIUljPDjmcNq4vjxaVULJeQ2qJiDQmngSVbmbZNQtmlgtkN1JeGnH+YXtiBndNXxR1KCIiSS2eBPV3YJqZnWNmU4CXgL8mNqzU1btTLqcU9uWRomWs2LAt6nBERJJWkwnK3X8H/BrYm+BHujeE62QXXTBhT9zVihIRaUw8LSiA+cB/3P2nwBtmlh/PTmb2TTNbYGbFZnZVPduPN7M5ZjbbzIpiR+5NZX06t+O7hX14eIZaUSIiDYlnPKgfAY8Bd4erCoCn4tgvHbgDOAYYDpxuZsPrFJsGjHT3UQSj9N4bb+Ct3cWHDwHgNvXRJyJSr3haUBcBBwGbANx9IdAjjv3GA8Xuvtjdy4GHgONjC7h7qbt7uJhH2GN6W1DQKZfTx/fl0aJlLF2r3iVEROqKJ0FtDxMMAGaWQXyJpABYFrNcEq6rxcxONLNPgOcIWlFfY2bnhacAi1avXh3HU7cOF00cTHqaccs0jRclIlJXPAnqNTP7BUGffEcCjwLPxrGf1bPua4nN3Z90972AE4Ab6juQu9/j7oXuXti9e/c4nrp16NEhh+8fOICnPliu8aJEROqIJ0FdBawG5hIMt/E88Ms49isB+sYs9wFWNFTY3V8nGHOqWxzHThk/PjQYL+qPL6kVJSISq7HezKeFs7919z+7+3fd/eRwPp5TfDOAIWY20MyygNMIBj6MfY7BZmbh/BggC1i7S6+kleraPpspBw/kubkrmbdCAxWLiNRorAXVy8wOA46rM9zGmDCZNMrdK4GLgRcIblN/xN3nmdn5ZnZ+WOw7wEdmNpvgjr9T40x+KeXcQwbRISeDP770adShiIgkDWsoH5jZycA5wMFAUZ3N7u6HJzi2ehUWFnpRUd1wWr87Xi3m9y8s4MkLD2R0v85RhyMi0mLMbKa7F9Zd32ALyt0fc/djgN+5+8Q6UyTJKZX94MABdMnL4ma1okREgPi6OrrBzArM7EAzO7Rmaong2pK87AwunLAnbyxcw7uL29RlOBGResXTk8SNwFsEd+79LJyuTHBcbdL3DuhPj/xsbn7xU9rgpTgRkVoaHFE3xonAMHffnuhg2rqczHQuOXwwVz89jzcWruHQoanzmy8RkZ0Vz++gFgOZiQ5EAqeM60tBp1xuenGBWlEi0qbFk6C2ArPN7G4zu7VmSnRgbVV2RjqXTRrChyUbeXn+qqjDERGJTDwJ6hmCLojeBmbGTJIgJ40pYEDXdtz04gKqq9WKEpG2qclrUO6u0XNbWEZ6Gj85ciiXPTSb5z9ayeQRvaMOSUSkxTXW1dEj4ePccFDBWlPLhdg2TR7Rm6E923PzS59SWVUddTgiIi2usRbUZeHj5JYIRGpLTzOuOHIo5/99Fk/PXsF3xvaJOiQRkRbVYIJy95Xh49KWC0diHb3PHuzTuwN/mvYpx43qTWZ6PJcMRURSgz7xkpiZceVRw1i2bhuPFpVEHY6ISItSgkpyE4Z1Z2z/ztz2ykLKKqqiDkdEpMUoQSU5M+OnRw1l5cYyHnz/86jDERFpMfH0xXeQmb1kZp+a2WIz+8zMFrdEcBI4cM9uHLhnV+54dRFbyyujDkdEpEXE04L6C3AzwbhQ44DC8FFa0E+PGsqa0u088I7uWRGRtiGeBLXR3f/t7qvcfW3NlPDIpJax/bswcVh3pr62iM1lFVGHIyKScPEkqFfN7Pdm9o2dGfJdmt8VRw5jw9YK/vLmZ1GHIiKScPEMt7F/+Bg7HK8DGlW3he3XpyPf3GcP/vLGZ3z/GwPonJcVdUgiIgkTz4i6dYd715DvEfrJkUMpLa/knjd0n4qIpLZ47uLraGY3m1lRON1kZh1bIjj5umF75HPcyN7c/9YSVm/WGJIikrriuQZ1H7AZOCWcNgH/L5FBSeMumzSE8qpq7pq+KOpQREQSJp4Etae7X+vui8PpV8CgRAcmDRvUvT3fGVPA399bysqN26IOR0QkIeJJUNvM7OCaBTM7CNCnYsQuOXwI7s5trxRHHYqISELEk6AuAO4wsyVmthS4HTg/sWFJU/p2accZ4/vx8IxlLPhic9ThiIg0u3ju4pvt7iOBEcB+7j7a3T9MfGjSlMuPGEp+TgbXPTMPdw0NLyKppcHfQZnZ99z972Z2RZ31ALj7zQmOTZrQOS+LK48axi+f+ojn537Bt0b0ijokEZFm01gLKi98zK9nap/guCROp4/vx969OvCb5z5mW7mG4xCR1NHYiLp3h7Mvu/tbsdvCGyUkCaSnGb86bh9Oufsd7nptEVccOTTqkEREmkU8N0ncFuc6icj4gV04flRvpr62iGXrtkYdjohIs2jsGtQ3gAOB7nWuQ3UA0hMdmOyc/z5mb176+Et+/dzH3H1WYdM7iIgkucZaUFkE15oyqH39aRNwcuJDk52xR8ccLpo4mBfmfckbC1dHHY6IyG6zpm5PNrP+7p40o+QVFhZ6UVFR1GEkpe2VVRz1x9fJSDP+c/mhZKbHcwZXRCRaZjbT3b926ieeT7B7zaxTzIE6m9kLcT7pN81sgZkVm9lV9Ww/08zmhNPbZjYynuNK/bIz0rlm8nAWrd7CX99eEnU4IiK7JZ4E1c3dN9QsuPt6oEdTO5lZOnAHcAwwHDjdzIbXKfYZcJi7jwBuAO6JM25pwKS9ezJxWHdueXmhejsXkVYtngRVbWb9ahbMrD/BgIVNGQ8Uhx3MlgMPAcfHFnD3t8OEB/Au0Ce+sKUxV08eTlllFb/7zydRhyIissviSVD/A7xpZn8zs78BrwP/Hcd+BcCymOWScF1DzgH+HcdxpQmDurdnysEDeXRmCbOXbYg6HBGRXRJPX3z/AcYADwOPAGPdPZ5rUFbf4eotaDaRIEH9vIHt59UMmLh6te5Qi8clhw+hR3421z79EdXV6qdPRFqfeG/zqgJWARuB4WZ2aBz7lAB9Y5b7ACvqFjKzEcC9wPHuvra+A7n7Pe5e6O6F3bt3jzPktq19dgb/fexefFiykcdmlUQdjojITotnyPdzCU7rvQD8Kny8Lo5jzwCGmNlAM8sCTgOeqXPsfsATwFnu/unOhS5NOWFUAWP7d+Z3//mETWUVUYcjIrJT4mlBXQaMA5a6+0RgNNDkeTZ3rwQuJkho84FH3H2emZ1vZjXjSV0DdAXuNLPZZqYfODUjs6CfvrVbyrnl5YVRhyMislMa7OooRpm7l5kZZpbt7p+Y2bB4Du7uzwPP11k3NWb+XODcnYpYdsq+BR05bVw//vr2Ek4b15chPfOjDklEJC7xtKBKwh/qPgW8ZGZPU8+1JElePzt6GO2y0vnVsx9rYEMRaTXiuYvvRHff4O7XAVcDfwFOSHBc0oy65GXx06OG8WbxGl6Y92XU4YiIxKXRBGVmaWb2Uc2yu7/m7s+EP7yVVuTM/fux1x75/Pq5jymr0MCGIpL8Gk1Q7l4NfBjbk4S0ThnpaVz77X0oWb+Nu19bHHU4IiJNiucmiV7APDN7H9hSs9Ldj0tYVJIQ39izK98a0Ys7pxfznbEF9OncLuqQREQa1NiAhdnuvp3gt0+SIn5x7N5Mm/8l//v8fO48c2zU4YiINKixU3zvhI/nhteeak0tEZw0v4JOuVw0YTDPz/2Ct4vXRB2OiEiDGh1R18y+DxxoZifVnVoqQGl+Pzp0EH275HLds/OorKqOOhwRkXo1lqDOBw4AOgHfrjNNTnhkkjA5melc/a3hfPplKX97N2kGSxYRqaXBa1Du/ibBMBtF7v6XFoxJWsCRw3tyyJBu3PzSpxw3sjdd22dHHZKISC3x/FBXySkFmRnXfnsftpVXceO/NbChiCSfeIfbkBQ0uEd7fnToIB6dWcKzH6r3KhFJLkpQbdwVRw5lTL9OXPX4HBavLo06HBGRHRpMUGY2prGpJYOUxMlMT+P2M8aQlZHGhf+YxbZydYMkIsmhsZ4kbmpkmwOHN3MsEpHenXL546mj+OH9M7j2mY/43ckjow5JRKTRu/gmtmQgEq0Jw3pw8cTB3PZKMeMGdOG7hX2jDklE2rh4+uLDzPYFhgM5Nevc/YFEBSXRuPyIoRQtWc/VT3/EiD6dGLaHBjcUkeg0eZOEmV0L3BZOE4HfAeooNgWlpxm3nD6K9tmZXPCPmWzZXhl1SCLShsVzF9/JwCTgC3f/ITAS0K86U1SP/BxuPX0US9Zs4RdPztUIvCISmXgS1LZwXKhKM+sArAIGJTYsidKBe3bjiiOH8vTsFfzz/c+jDkdE2qh4ElSRmXUC/gzMBGYB7ycyKInehRMGc+jQ7vzqmY/5aPnGqMMRkTYonq6OLnT3De4+FTgS+H54qk9SWFqa8adTR9G1fRYX/mMWm8oqog5JRNqYeG6SmFYz7+5L3H1O7DpJXV3ysrj9jNGs2LCN/3p0jq5HiUiLaqwniRwz6wJ0M7POZtYlnAYAvVssQonU2P5duOqYvfjPvC+4760lUYcjIm1IY7+D+jFwOUEymhWzfhNwRwJjkiRzzsEDee+zdfz2+fmM7teJMf06Rx2SiLQBDbag3P0Wdx8IXOnuA2Omke5+ewvGKBEzM/5w8kh6dcrh4n/MYv2W8qhDEpE2IJ67+O42s0vN7LFwutjMMhMemSSVju0yueOMMawpLeeKR2ZTXa3rUSKSWPEkqDuBseFjzfxdiQxKktOIPp24evLevLpgNVNfXxR1OCKS4hq8BmVmGe5eCYxz99jurV8xsw8TH5oko+8d0J/3PlvHH15YwJh+nTlgUNeoQxKRFNVYC6rmx7hVZrZnzUozGwRo0KA2ysy48TsjGNA1j0sf/IDVm7dHHZKIpKjGEpSFj1cCr5rZdDObDrwC/DTRgUnyap+dwR1njmHjtgouf/gDqnQ9SkQSoLEE1d3MrgBGAXcTJKZnCbo8Gp340CSZ7d2rAzecsC9vFa/l1mkLow5HRFJQYwkqHWgP5BNcq7JwOSNcJ23cKYV9OXlsH259ZSGvf7o66nBEJMU09kPdle5+fYtFIq3SDcfvy9ySjVzw95lMPWsshwzpHnVIIpIi4rkGtcvM7JtmtsDMis3sqnq272Vm75jZdjO7cnefT1peblY6fztnPP265jHl/hk8PXt51CGJSIpoLEFN2p0Dm1k6QZdIxxAMF3+6mQ2vU2wdcCnwh915LolWjw45PPzjAxjbvzOXPTSbe99YHHVIIpICGuvqaN1uHns8UOzui929HHgIOL7Oc6xy9xmAxnJo5TrkZPLXKeM5dr89+PVz8/nt8/PV24SI7JbGrkHtrgJgWcxyCbD/rhzIzM4DzgPo16/f7kcmCZGdkc5tp4+hW/t53P36YlZv3s7/nTyCzPR4OiwREaktkZ8c9V3D2qWv1O5+j7sXunth9+66CJ/M0tOMXx23Dz87ehhPfLCcc/5axJbtlVGHJSKtUCITVAnQN2a5D7Aigc8nScLMuGjiYP7vO/vx5sLVnPHnd1lbqh4nRGTnJDJBzQCGmNlAM8sCTgOeSeDzSZI5dVw/7jmrkE++2MzJU99h2bqtUYckIq1IwhJU2NHsxcALwHzgEXefZ2bnm9n5AGa2h5mVAFcAvzSzEjPrkKiYpOUdMbwn//zR/qzbUs5Jd73Nxys2RR2SiLQS5t667rQqLCz0oqKiqMOQnbTwy82cfd/7lJZVcvfZYzlwz25RhyQiScLMZrp7Yd31ur1KWsSQnvk8ceGB9OqUww/um8Fzc1ZGHZKIJDklKGkxvTrm8uiPD2REn45c/OAsHnhnSdQhiUgSU4KSFtWxXSZ/P3d/Ju3Vk2uenscfXlhAazvNLCItQwlKWlxOZjpTvzeG08f35fZXi/n543OorKqOOiwRSTKJ7ElCpEEZ6Wn874n70T0/h1unLWRtaTm3nzGG3Kz0qEMTkSShFpRExsy44sih3HDCvryyYBUn3PEWby9aE3VYIpIklKAkcmcd0J/7vj+OLeWVnPHn9/jx34r4fK1+1CvS1ilBSVKYuFcPXr7iMH529DDeWLiGI25+jRv//Qml6sdPpM1SgpKkkZOZzkUTB/PqlRP49sjeTH1tERN+P51HZizT0B0ibZASlCSdnh1yuOmUkTx90UH079qO/3p8Dsfd8Sbvf7a7Q5SJSGuiBCVJa2TfTjx2/je45bRRrC0t55S73+Gif86iZL2uT4m0BUpQktTMjONHFfDKTydw+RFDmDb/Sybd9Bo3vbhA40yJpDglKGkVcrPSufyIobzy0wl8c989uO2VYg6/aTpPzCrR9SmRFKUEJa1K70653HLaaB6/4ED26JDDFY98yIl3vc2sz9dHHZqINDMlKGmVxvbvzJMXHsRN3x3Jyg3bOOnOt7nsoQ80KKJICtF4UNLqbdleydTXFnHP64vZXlnN/gO7cOLoAo7ZrxcdczOjDk9EmtDQeFBKUJIyVm7cxuMzS3jig+UsXr2FrIw0jti7ByeO7sNhQ7uTlaETBiLJSAlK2gx3Z07JRp78YDnPfriCtVvK6dwuk8kjenPimAJG9+2EmUUdpoiElKCkTaqoqubNhWt44oPlvDjvC7ZXVjOgaztOGF3ACaMKGNAtL+oQRdo8JShp8zaXVfCfj77gyQ+W887itbjD6H6dOGl0AZNH9KZzXlbUIYq0SUpQIjFWbtzG07NX8OSs5Sz4cjMZacaEYT04aUwBE4f10LhUIi1ICUqkAR+v2MRTs5fz1AfLWbV5O5npxn4FHRk3oAvjBnRhbP/Oal2JJJASlEgTqqqddxat5Y3i1RQtWc+ckg1UVAX/H0N6tGfcwC6MG9CZcQO6UNApVzdaiDQTJSiRnVRWUcWHyzZQtHQ973+2jllL17M57P+vV8ccCgd0YfyAzhQO6MKwnvmkpSlhiewKJSiR3VRV7XzyxSaKlqxnxpJ1zFiyji83bQcgPyeDwv5Bsho/sAv79u6o61gicVKCEmlm7k7J+m07ktWMJespXlUKgBkUdMplcI/2DOnRnsE1U/d8OrZT7xYisRpKUBlRBCOSCsyMvl3a0bdLO04a0weAdVvKKVqyjvkrN1O8upTiVaW8vWgt5ZXVO/brnp/N4O5BwhrSs/2O+e752bquJRJDCUqkGXXJy+KoffbgqH322LGuqtopWb+V4lWlLFwVJK3iVaU89cHyHde0ADrkZHzV0urRnv5d8yjolEuvjjl0yctS8pI2R6f4RCLi7ny5aXuYsDbvSF6LVpeyprS8VtnsjLQgWXXKoXfHXHp1yqWgUw69O+XSq2MuvTvl0C5L3zelddIpPpEkY2bs0TGHPTrmcPCQbrW2rd9SzrL1W1mxoYwVG7axYsM2Vm4sY/mGbby+cDWrNm+n7nfLzu0yw2QVJKzenXLp2SGbrnnZdG2fRbf22XTJyyIzXZ3mSuugBCWShDrnZdE5L4sRferfXl5ZzZebwuS1cVutRLZs3Vbe+2wtm8sq6923U7tMuuZl0bV9Nt3aZ9VKYN3aB+trtnfIydCpRYmMEpRIK5SVkbbjBo2GbCqrYM3m7azdUs7a0u2sLg0e15aWs3bLdtaUlrPgi82s3bKWDVsr6n+e9DQ6tsukY24wdQofO+R+tW7H1K72ck6mbrOX3aMEJZKiOuRk0iEnk0Hdmy5bUVXNui3lrIlJYGtLy1ldup2NWyvYuC2YVm4s45MvNrNpW0WtGzzqk52RtiNZ5edk0D4nk/bZ6bTPziAvO4P87Aza5wTz7bMzyM/JIC8rWNc+XNc+J4PsDCW6tkoJSkTITE+jZ4ccenbIiXufyqpqNpdV7kheG7dVsCF83FSzLkxum7cHj8vXb2XL9ipKt1dS2kSC+yo2o312Bu2yMsjNSqddVjq5menkZYfLmeG6rAza1WzfUa72utzMdHJ2TGnkZKSrB5AkltAEZWbfBG4B0oF73f3GOtst3H4ssBX4gbvPSmRMItI8MtLTdlwr2xXV1c7WiipKyyp3JKzY+S3h4+aySkq3V7C1vIpt5VU7HldtLvvauvKq6qafuI6s9DSyM9PIyaxJYMF8Tkb6jvXBtmA+OyON7Ix0sjLSwvk0sjPTdxwnOyMo89X2mLKZaWSnB8tZGWmkKzk2KmEJyszSgTuAI4ESYIaZPePuH8cUOwYYEk77A3eFjyKS4tLSbMepvOZSUVXNtoqvktbW8sqY+SrKKmKmymrKKqrYVlHF9orqmG3VlFUG85vLKlm9eXut9dsrqtleWUV1M/xCJ82C64mZ6UECy0pPI7PmMT1IYlnhY2a67Shbsz4j3YLlmPlgCuYz0tPISjcy0mqO+9V8ZpqRUbNfWs3+wfaMmMeabTXzLdniTGQLajxQ7O6LAczsIeB4IDZBHQ884MGPsd41s05m1svdVyYwLhFJUTUf0B1yEt+dVGVVNdsrg6m8MkhateYrvtoeu62sooqKKqe8spqKqmrKq4L15VXVVNQ87ljnlFcGiTZ2n+2V1VRWV1NR5VRUVlMRzlc1R9ZsQpoFreeaBHf98ftw/KiChDxXIhNUAbAsZrmEr7eO6itTANRKUGZ2HnAeQL9+/Zo9UBGRnZURtlDysqOO5CvV1b4jWVWGya+yyqkIk17FjvngsbIqKF8Zlq+oDh5r1ldV+45jVVbXv09jd5LurkQmqPragXXTezxlcPd7gHsg6Eli90MTEUk9aWlGdlo6zXjWNFKJ/El5CdA3ZrkPsGIXyoiISBuUyAQ1AxhiZgPNLAs4DXimTplngLMtcACwUdefREQEEniKz90rzexi4AWC28zvc/d5ZnZ+uH0q8DzBLebFBLeZ/zBR8YiISOuS0DOV7v48QRKKXTc1Zt6BixIZg4iItE7q1lhERJKSEpSIiCQlJSgREUlKSlAiIpKUWt2Q72a2Gli6m4fpBqxphnBSheqjNtVHbaqP2lQftTVHffR3968NDNPqElRzMLMidy+MOo5kofqoTfVRm+qjNtVHbYmsD53iExGRpKQEJSIiSamtJqh7og4gyag+alN91Kb6qE31UVvC6qNNXoMSEZHk11ZbUCIikuSUoEREJCmldIIys2+a2QIzKzazq+rZbmZ2a7h9jpmNiSLOlhJHfZwZ1sMcM3vbzEZGEWdLaao+YsqNM7MqMzu5JeNrSfHUhZlNMLPZZjbPzF5r6RhbUhz/Kx3N7Fkz+zCsj5QeicHM7jOzVWb2UQPbE/NZ6u4pOREM8bEIGARkAR8Cw+uUORb4N8HIvgcA70Udd8T1cSDQOZw/pq3XR0y5Vwh65T856rgjfG90Aj4G+oXLPaKOO+L6+AXwf+F8d2AdkBV17Amsk0OBMcBHDWxPyGdpKregxgPF7r7Y3cuBh4Dj65Q5HnjAA+8CncysV0sH2kKarA93f9vd14eL7xKMcJyq4nl/AFwCPA6sasngWlg8dXEG8IS7fw7g7m29PhzINzMD2hMkqMqWDbPluPvrBK+xIQn5LE3lBFUALItZLgnX7WyZVLGzr/Ucgm9EqarJ+jCzAuBEYCqpLZ73xlCgs5lNN7OZZnZ2i0XX8uKpj9uBvYEVwFzgMnevbpnwklJCPksTOmBhxKyedXXvqY+nTKqI+7Wa2USCBHVwQiOKVjz18Sfg5+5eFXxRTlnx1EUGMBaYBOQC75jZu+7+aaKDi0A89XE0MBs4HNgTeMnM3nD3TQmOLVkl5LM0lRNUCdA3ZrkPwbednS2TKuJ6rWY2ArgXOMbd17ZQbFGIpz4KgYfC5NQNONbMKt39qRaJsOXE+7+yxt23AFvM7HVgJJCKCSqe+vghcKMHF2CKzewzYC/g/ZYJMekk5LM0lU/xzQCGmNlAM8sCTgOeqVPmGeDs8A6UA4CN7r6ypQNtIU3Wh5n1A54AzkrRb8axmqwPdx/o7gPcfQDwGHBhCiYniO9/5WngEDPLMLN2wP7A/BaOs6XEUx+fE7QmMbOewDBgcYtGmVwS8lmasi0od680s4uBFwjuyrnP3eeZ2fnh9qkEd2YdCxQDWwm+FaWkOOvjGqArcGfYaqj0FO21Oc76aBPiqQt3n29m/wHmANXAve5e7y3HrV2c740bgPvNbC7B6a2fu3vKDsFhZg8CE4BuZlYCXAtkQmI/S9XVkYiIJKVUPsUnIiKtmBKUiIgkJSUoERFJSkpQIiKSlJSgREQkKSlBScoKeyCfHTMN2M3jjTKzY2OWj2usF/SdPPbbzXGc3WVmvc3ssWY4znVmdmVzxCRtl24zl5RlZqXu3r6BbUbw/o+7/zQz+wFQ6O4XN1OIKcvMrgNK3f0PUccirZdaUNJmmNkAM5tvZncCs4C+ZnaXmRWFY/r8KqbsuHBMrA/N7H0z6whcD5watsZONbMfmNntYfn+ZjYtHAtnWtgrB2Z2fzhOzttmttgaGFPKzErDxwlm9pqZPWJmn5rZjRaM0/W+mc01sz1jjnuXmb0aHvcwC8bsmW9m99c9bjh/cs22huIK6+ijcP7emNbnajO7Nlz/MzObEb7W2Dr7HwvGUHqZoGcFkd2iBCWpLDfmA/bJcN0wgmEBRrv7UuB/wt4yRgCHmdmIsHubhwl6qB4JHAFsIehp42F3H+XuD9d5rtvD444A/gHcGrOtF0HHu5OBG+OIeyRwGbAfcBYw1N3HE/SReElMuc4EnZX+BHgW+COwD7CfmY2K43kajcvdz3X3UQRDKawl6DnhKGAIwZAUo4CxZnaomY0l6BJoNHASMC6O5xdpVMp2dSQCbAs/YIGgdQAsDcerqXGKmZ1H8L/QCxhO0AvzSnefAVDTQ7U13qP5Nwg+mAH+BvwuZttT4anEj8N+25oyo6YfMzNbBLwYrp8LTIwp96y7e9jdzpfuPjfcZx4wgKC37cY0GZeZ5QCPAhe7+1IzuwQ4CvggLNKeIGHlA0+6+9Zwv7p914nsNCUoaWu21MyY2UDgSmCcu68PT3/lEPSttrsXZ2P33x4zH8+4HbHlq2OWq6n9P7u9njJ1y8XGkdPI8zQU11SCgQpfjin3W3e/O7aQmV1O6g5VIxHRKT5pyzoQJKyNYQvimHD9J0BvMxsHYGb5ZpYBbCZoKdTnbYJTXABnAm8mLOqd86WZ7W1maQSDL8bNzC4C8t099vTfC8AUM2sflikwsx7A68CJZpZrZvnAt5spfmnD1IKSNsvdPzSzD4B5BEMlvBWuLzezU4HbzCwX2EZwHepV4Cozmw38ts7hLgXuM7OfAatJnp7xrwL+RTDa6UcEp+TidSVQEb5egKnuPtXM9iYYsBCgFPieu88ys4cJTisuBd5onvClLdNt5iIikpR0ik9ERJKSEpSIiCQlJSgREUlKSlAiIpKUlKBERCQpKUGJiEhSUoISEZGk9P8BuEANY30YCV8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "infected_sweep.plot()\n", + "\n", + "decorate(xlabel='Fraction immunized',\n", + " ylabel='Total fraction infected',\n", + " title='Fraction infected vs. immunization rate')" + ] + }, + { + "cell_type": "markdown", + "id": "fantastic-violence", + "metadata": {}, + "source": [ + "As the immunization rate increases, the number of infections drops\n", + "steeply. If 40% of the students are immunized, fewer than 4% get sick.\n", + "That's because immunization has two effects: it protects the people who get immunized (of course) but it also protects the rest of the\n", + "population.\n", + "\n", + "Reducing the number of \"susceptibles\" and increasing the number of\n", + "\"resistants\" makes it harder for the disease to spread, because some\n", + "fraction of contacts are wasted on people who cannot be infected. This\n", + "phenomenon is called **herd immunity**, and it is an important element\n", + "of public health (see )." + ] + }, + { + "cell_type": "markdown", + "id": "completed-stand", + "metadata": {}, + "source": [ + "The steepness of the curve is a blessing and a curse. It's a blessing\n", + "because it means we don't have to immunize everyone, and vaccines can\n", + "protect the \"herd\" even if they are not 100% effective.\n", + "\n", + "But it's a curse because a small decrease in immunization can cause a\n", + "big increase in infections. In this example, if we drop from 80%\n", + "immunization to 60%, that might not be too bad. But if we drop from 40% to 20%, that would trigger a major outbreak, affecting more than 15% of the population. For a serious disease like measles, just to name one, that would be a public health catastrophe.\n", + "\n", + "One use of models like this is to demonstrate phenomena like herd\n", + "immunity and to predict the effect of interventions like vaccination.\n", + "Another use is to evaluate alternatives and guide decision making. We'll see an example in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "known-classic", + "metadata": {}, + "source": [ + "## Hand washing\n", + "\n", + "Suppose you are the Dean of Student Life, and you have a budget of just \\$1200 to combat the Freshman Plague. You have two options for spending this money:\n", + "\n", + "1. You can pay for vaccinations, at a rate of \\$100 per dose.\n", + "\n", + "2. You can spend money on a campaign to remind students to wash hands\n", + " frequently.\n", + "\n", + "We have already seen how we can model the effect of vaccination. Now\n", + "let's think about the hand-washing campaign. We'll have to answer two\n", + "questions:\n", + "\n", + "1. How should we incorporate the effect of hand washing in the model?\n", + "\n", + "2. How should we quantify the effect of the money we spend on a\n", + " hand-washing campaign?\n", + "\n", + "For the sake of simplicity, let's assume that we have data from a\n", + "similar campaign at another school showing that a well-funded campaign\n", + "can change student behavior enough to reduce the infection rate by 20%.\n", + "\n", + "In terms of the model, hand washing has the effect of reducing `beta`.\n", + "That's not the only way we could incorporate the effect, but it seems\n", + "reasonable and it's easy to implement." + ] + }, + { + "cell_type": "markdown", + "id": "suspected-chosen", + "metadata": {}, + "source": [ + "Now we have to model the relationship between the money we spend and the\n", + "effectiveness of the campaign. Again, let's suppose we have data from\n", + "another school that suggests:\n", + "\n", + "- If we spend \\$500 on posters, materials, and staff time, we can\n", + " change student behavior in a way that decreases the effective value of `beta` by 10%.\n", + "\n", + "- If we spend \\$1000, the total decrease in `beta` is almost 20%.\n", + "\n", + "- Above \\$1000, additional spending has little additional benefit." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ultimate-leader", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "tutorial-terrace", + "metadata": {}, + "source": [ + "### Logistic function" + ] + }, + { + "cell_type": "markdown", + "id": "abroad-birmingham", + "metadata": {}, + "source": [ + "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "fossil-adolescent", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import exp\n", + "\n", + "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", + " \"\"\"Computes the generalize logistic function.\n", + " \n", + " A: controls the lower bound\n", + " B: controls the steepness of the transition \n", + " C: not all that useful, AFAIK\n", + " M: controls the location of the transition\n", + " K: controls the upper bound\n", + " Q: shift the transition left or right\n", + " nu: affects the symmetry of the transition\n", + " \n", + " returns: float or array\n", + " \"\"\"\n", + " exponent = -B * (x - M)\n", + " denom = C + Q * exp(exponent)\n", + " return A + (K-A) / denom ** (1/nu)" + ] + }, + { + "cell_type": "markdown", + "id": "cloudy-canvas", + "metadata": {}, + "source": [ + "The following array represents the range of possible spending." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "equal-lesson", + "metadata": {}, + "outputs": [], + "source": [ + "spending = linspace(0, 1200, 21)" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-dylan", + "metadata": {}, + "source": [ + "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "\n", + "`M` is chosen so the transition happens around \\$500.\n", + "\n", + "`K` is the maximum reduction in `beta`, 20%.\n", + "\n", + "`B` is chosen by trial and error to yield a curve that seems feasible." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "ecological-puppy", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " \"\"\"Reduction factor as a function of spending.\n", + " \n", + " spending: dollars from 0 to 1200\n", + " \n", + " returns: fractional reduction in beta\n", + " \"\"\"\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "informed-maple", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "diverse-ensemble", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "percent_reduction = compute_factor(spending) * 100\n", + "\n", + "plot(spending, percent_reduction)\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Percent reduction in infection rate',\n", + " title='Effect of hand washing on infection rate')" + ] + }, + { + "cell_type": "markdown", + "id": "published-decade", + "metadata": {}, + "source": [ + "The result is the following function, which\n", + "takes spending as a parameter and returns `factor`, which is the factor\n", + "by which `beta` is reduced:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "atomic-guatemala", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "reflected-details", + "metadata": {}, + "source": [ + "I use `compute_factor` to write `add_hand_washing`, which takes a\n", + "`System` object and a budget, and modifies `system.beta` to model the\n", + "effect of hand washing:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "presidential-omaha", + "metadata": {}, + "outputs": [], + "source": [ + "def add_hand_washing(system, spending):\n", + " factor = compute_factor(spending)\n", + " system.beta *= (1 - factor)" + ] + }, + { + "cell_type": "markdown", + "id": "perfect-promotion", + "metadata": {}, + "source": [ + "Now we can sweep a range of values for `spending` and use the simulation\n", + "to compute the effect:" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "outer-nutrition", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_hand_washing(spending_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " sweep[spending] = calc_total_infected(results, system)\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "agricultural-interpretation", + "metadata": {}, + "source": [ + "Here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "first-termination", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "spending_array = linspace(0, 1200, 20)\n", + "infected_sweep2 = sweep_hand_washing(spending_array)" + ] + }, + { + "cell_type": "markdown", + "id": "cardiac-shopper", + "metadata": {}, + "source": [ + "The following figure shows the result. " + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "cardiovascular-coach", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "infected_sweep2.plot()\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Total fraction infected',\n", + " title='Effect of hand washing on total infections')" + ] + }, + { + "cell_type": "markdown", + "id": "fifth-highlight", + "metadata": {}, + "source": [ + "Below \\$200, the campaign has little effect. \n", + "\n", + "At \\$800 it has a substantial effect, reducing total infections from more than 45% to about 20%. \n", + "\n", + "Above \\$800, the additional benefit is small." + ] + }, + { + "cell_type": "markdown", + "id": "ruled-disease", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "Let's put it all together. With a fixed budget of \\$1200, we have to\n", + "decide how many doses of vaccine to buy and how much to spend on the\n", + "hand-washing campaign.\n", + "\n", + "Here are the parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "representative-brook", + "metadata": {}, + "outputs": [], + "source": [ + "num_students = 90\n", + "budget = 1200\n", + "price_per_dose = 100\n", + "max_doses = int(budget / price_per_dose)" + ] + }, + { + "cell_type": "markdown", + "id": "another-idaho", + "metadata": {}, + "source": [ + "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", + "built-in function that converts numbers to integers, rounding down.\n", + "\n", + "We'll sweep the range of possible doses:" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "historic-inclusion", + "metadata": {}, + "outputs": [], + "source": [ + "dose_array = arange(max_doses+1)" + ] + }, + { + "cell_type": "markdown", + "id": "straight-equation", + "metadata": {}, + "source": [ + "In this example we call `linrange` with only one argument; it returns a\n", + "NumPy array with the integers from 0 to `max_doses`. With the argument\n", + "`endpoint=True`, the result includes both endpoints.\n", + "\n", + "Then we run the simulation for each element of `dose_array`:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "received-swiss", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_doses(dose_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " sweep[doses] = calc_total_infected(results, system)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "appropriate-design", + "metadata": {}, + "source": [ + "For each number of doses, we compute the fraction of students we can\n", + "immunize, `fraction` and the remaining budget we can spend on the\n", + "campaign, `spending`. Then we run the simulation with those quantities\n", + "and store the number of infections.\n", + "\n", + "The following figure shows the result." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "original-browse", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep3 = sweep_doses(dose_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "technical-violation", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "infected_sweep3.plot()\n", + "\n", + "decorate(xlabel='Doses of vaccine',\n", + " ylabel='Total fraction infected',\n", + " title='Total infections vs. doses')" + ] + }, + { + "cell_type": "markdown", + "id": "economic-newspaper", + "metadata": {}, + "source": [ + "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", + "\n", + "As we increase the number of doses, we have to cut campaign spending,\n", + "which turns out to make things worse. But interestingly, when we get\n", + "above 10 doses, the effect of herd immunity starts to kick in, and the\n", + "number of sick students goes down again." + ] + }, + { + "cell_type": "markdown", + "id": "sharp-difficulty", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "quick-rotation", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" + ] + }, + { + "cell_type": "markdown", + "id": "fresh-costa", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", + "\n", + "How might you incorporate the effect of quarantine in the SIR model?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "transparent-entry", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "\"\"\"There is no unique best answer to this question,\n", + "but one simple option is to model quarantine as an\n", + "effective reduction in gamma, on the assumption that\n", + "quarantine reduces the number of infectious contacts\n", + "per infected student.\n", + "\n", + "Another option would be to add a fourth compartment\n", + "to the model to track the fraction of the population\n", + "in quarantine at each point in time. This approach\n", + "would be more complex, and it is not obvious that it\n", + "is substantially better.\n", + "\n", + "The following function could be used, like \n", + "add_immunization and add_hand_washing, to adjust the\n", + "parameters in order to model various interventions.\n", + "\n", + "In this example, `high` is the highest duration of\n", + "the infection period, with no quarantine. `low` is\n", + "the lowest duration, on the assumption that it takes\n", + "some time to identify infectious students.\n", + "\n", + "`fraction` is the fraction of infected students who \n", + "are quarantined as soon as they are identified.\n", + "\"\"\"\n", + "\n", + "def add_quarantine(system, fraction):\n", + " \"\"\"Model the effect of quarantine by adjusting gamma.\n", + " \n", + " system: System object\n", + " fraction: fraction of students quarantined\n", + " \"\"\"\n", + " # `low` represents the number of days a student \n", + " # is infectious if quarantined.\n", + " # `high` is the number of days they are infectious\n", + " # if not quarantined\n", + " low = 1\n", + " high = 4\n", + " tr = high - fraction * (high-low)\n", + " system.gamma = 1 / tr" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap13.ipynb b/jupyter/chap13.ipynb new file mode 100644 index 00000000..16d36724 --- /dev/null +++ b/jupyter/chap13.ipynb @@ -0,0 +1,738 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fifty-repair", + "metadata": {}, + "source": [ + "# Chapter 13" + ] + }, + { + "cell_type": "markdown", + "id": "pharmaceutical-constant", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "aware-blade", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "increased-happiness", + "metadata": {}, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "markdown", + "id": "honey-backup", + "metadata": {}, + "source": [ + "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "experimental-preparation", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "arbitrary-newspaper", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "attended-sherman", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import arange\n", + "\n", + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.loc[system.t0] = system.init\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "genetic-nylon", + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results, system):\n", + " s_0 = results.S[system.t0]\n", + " s_end = results.S[system.t_end]\n", + " return s_0 - s_end" + ] + }, + { + "cell_type": "markdown", + "id": "descending-benjamin", + "metadata": {}, + "source": [ + "In the previous chapters I presented an SIR model of infectious disease, specifically the Kermack-McKendrick model. We extended the model to include vaccination and the effect of a hand-washing campaign, and used the extended model to allocate a limited budget optimally, that is, to minimize the number of infections.\n", + "\n", + "But we assumed that the parameters of the model, contact rate and\n", + "recovery rate, were known. In this chapter, we explore the behavior of\n", + "the model as we vary these parameters, use analysis to understand these relationships better, and propose a method for using data to estimate parameters." + ] + }, + { + "cell_type": "markdown", + "id": "italian-halifax", + "metadata": {}, + "source": [ + "## Sweeping beta\n", + "\n", + "Recall that $\\beta$ is the contact rate, which captures both the\n", + "frequency of interaction between people and the fraction of those\n", + "interactions that result in a new infection. If $N$ is the size of the\n", + "population and $s$ is the fraction that's susceptible, $s N$ is the\n", + "number of susceptibles, $\\beta s N$ is the number of contacts per day\n", + "between susceptibles and other people, and $\\beta s i N$ is the number\n", + "of those contacts where the other person is infectious.\n", + "\n", + "As $\\beta$ increases, we expect the total number of infections to\n", + "increase. To quantify that relationship, I'll create a range of values\n", + "for $\\beta$:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "pleased-virus", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "beta_array = linspace(0.1, 1.1, 11)\n", + "gamma = 0.25" + ] + }, + { + "cell_type": "markdown", + "id": "operational-continuity", + "metadata": {}, + "source": [ + "Then run the simulation for each value and print the results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "functional-bennett", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1 0.0072309016649785285\n", + "0.2 0.038410532615067994\n", + "0.30000000000000004 0.33703425948982\n", + "0.4 0.6502429153895082\n", + "0.5 0.8045061124629623\n", + "0.6 0.8862866308018508\n", + "0.7000000000000001 0.9316695082755875\n", + "0.8 0.9574278300784942\n", + "0.9 0.9720993156325133\n", + "1.0 0.9803437149675784\n", + "1.1 0.9848347293510136\n" + ] + } + ], + "source": [ + "for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " print(beta, calc_total_infected(results, system))" + ] + }, + { + "cell_type": "markdown", + "id": "indian-islam", + "metadata": {}, + "source": [ + "We can wrap that code in a function and store the results in a\n", + "`SweepSeries` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "successful-holocaust", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[beta] = calc_total_infected(results, system)\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "british-turtle", + "metadata": {}, + "source": [ + "Now we can run `sweep_beta` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "varied-attention", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep = sweep_beta(beta_array, gamma)" + ] + }, + { + "cell_type": "markdown", + "id": "played-waters", + "metadata": {}, + "source": [ + "And plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "possible-valley", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'gamma = 0.25'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "label = f'gamma = {gamma}'\n", + "label" + ] + }, + { + "cell_type": "markdown", + "id": "defensive-river", + "metadata": {}, + "source": [ + "The first line uses string operations to assemble a label for the\n", + "plotted line:\n", + "\n", + "- When the `+` operator is applied to strings, it joins them\n", + " end-to-end, which is called **concatenation**.\n", + "\n", + "- The function `str` converts any type of object to a String\n", + " representation. In this case, `gamma` is a number, so we have to\n", + " convert it to a string before trying to concatenate it.\n", + "\n", + "If the value of `gamma` is `0.25`, the value of `label` is the string\n", + "`'gamma = 0.25'`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "composite-salad", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "infected_sweep.plot(label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "fuzzy-thesis", + "metadata": {}, + "source": [ + "Remember that this figure\n", + "is a parameter sweep, not a time series, so the x-axis is the parameter\n", + "`beta`, not time.\n", + "\n", + "When `beta` is small, the contact rate is low and the outbreak never\n", + "really takes off; the total number of infected students is near zero. As\n", + "`beta` increases, it reaches a threshold near 0.3 where the fraction of\n", + "infected students increases quickly. When `beta` exceeds 0.5, more than\n", + "80% of the population gets sick." + ] + }, + { + "cell_type": "markdown", + "id": "competent-melissa", + "metadata": {}, + "source": [ + "## Sweeping gamma\n", + "\n", + "Let's see what that looks like for a few different values of `gamma`.\n", + "Again, we'll use `linspace` to make an array of values:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "traditional-spirit", + "metadata": {}, + "outputs": [], + "source": [ + "gamma_array = linspace(0.1, 0.7, 4)" + ] + }, + { + "cell_type": "markdown", + "id": "precise-review", + "metadata": {}, + "source": [ + "And run `sweep_beta` for each value of `gamma`:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "laughing-tonight", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for gamma in gamma_array:\n", + " infected_sweep = sweep_beta(beta_array, gamma)\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(infected_sweep, label=label)\n", + " \n", + "decorate()" + ] + }, + { + "cell_type": "markdown", + "id": "oriental-north", + "metadata": {}, + "source": [ + "The following figure shows the results. When `gamma` is low, the\n", + "recovery rate is low, which means people are infectious longer. In that\n", + "case, even a low contact rate (`beta`) results in an epidemic.\n", + "\n", + "When `gamma` is high, `beta` has to be even higher to get things going." + ] + }, + { + "cell_type": "markdown", + "id": "large-radical", + "metadata": {}, + "source": [ + "## SweepFrame\n", + "\n", + "In the previous section, we swept a range of values for `gamma`, and for\n", + "each value, we swept a range of values for `beta`. This process is a\n", + "**two-dimensional sweep**.\n", + "\n", + "If we want to store the results, rather than plot them, we can use a\n", + "`SweepFrame`, which is a kind of `DataFrame` where the rows sweep one\n", + "parameter, the columns sweep another parameter, and the values contain\n", + "metrics from a simulation.\n", + "\n", + "This function shows how it works:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "patient-navigation", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "minus-meaning", + "metadata": {}, + "source": [ + "`sweep_parameters` takes as parameters an array of values for `beta` and\n", + "an array of values for `gamma`.\n", + "\n", + "It creates a `SweepFrame` to store the results, with one column for each\n", + "value of `gamma` and one row for each value of `beta`.\n", + "\n", + "Each time through the loop, we run `sweep_beta`. The result is a\n", + "`SweepSeries` object with one element for each value of `beta`. The\n", + "assignment inside the loop stores the `SweepSeries` as a new column in\n", + "the `SweepFrame`, corresponding to the current value of `gamma`.\n", + "\n", + "At the end, the `SweepFrame` stores the fraction of students infected\n", + "for each pair of parameters, `beta` and `gamma`.\n", + "\n", + "We can run `sweep_parameters` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "polish-excellence", + "metadata": {}, + "outputs": [], + "source": [ + "frame = sweep_parameters(beta_array, gamma_array)" + ] + }, + { + "cell_type": "markdown", + "id": "cultural-olympus", + "metadata": {}, + "source": [ + "With the results in a `SweepFrame`, we can plot each column like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "religious-placement", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for gamma in gamma_array:\n", + " label = f'gamma = {gamma}'\n", + " plot(frame[gamma], label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "familiar-appliance", + "metadata": {}, + "source": [ + "Alternatively, we can plot each row like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "instructional-navigator", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAEYCAYAAAATRII7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAChTElEQVR4nOydd3iUVdqH7zMtvfdkkklPCCH0DgFEkA7SlGZvuFYW6+667qfu2l27WMACiDRFQEBFOkhvoSQQ0knvPZnM+/0RwkZImZIAie99XXOFzJxz3mcSMs97znnO7yckSUJGRkZGRuZ6o7jeAcjIyMjIyICckGRkZGRkbhDkhCQjIyMjc0MgJyQZGRkZmRsCOSHJyMjIyNwQqK53AKbi7u4uBQYGXu8wZGRa5PDhw3mSJHlc7zhkZDoSHS4hBQYGcujQoesdhoxMiwghUlprc/jwYU+VSvU5EI28WiHz58AAxOn1+vt69+6dc+WLHS4hych0FlQq1efe3t5dPDw8ChUKhXwgUKbTYzAYRG5ublRWVtbnwKQrX5fvymRkrh/RHh4eJXIykvmzoFAoJA8Pj2LqVwWufv0axyMjI/M/FHIykvmzcen/fJO5p90SkhBisRAiRwgR18zrQgjxnhDivBDihBCiV3vFIiMjczXx8fGasLCwrqb0ee+999ySk5PV7RUTwOrVqx0DAwOjAwICop9//nnvptocPXrUukePHpEajabXCy+84NWe8chcO9pzhvQlMKaF18cCYZceDwAft2MsMjIybcDSpUvdU1NT2y0h6fV6nnzyyYCffvopISEh4dSaNWtcDx8+bH1lO09PT/27776b+uCDD2a3Vywy1552S0iSJO0EClpoMhn4Wqrnd8BZCOHTXvHIyMhcjV6vZ+rUqYHh4eFRY8aMCS4tLVUA7Nq1y7Zv374RXbt27TJkyJCwlJQU9ZIlS1zi4uJs77jjjuDIyMiosrIysXDhQp/o6OguYWFhXWfNmqUzGAwWxbN9+3Y7nU5XHRUVVWNtbS1NnTq1YPXq1c5XtvPz89MPGzasQq1Wy0uenYjrWWXnB6Q1+j790nOZ1yccGZnrx1Orj/snZJXatuWY4d4OFW9M757WUpvk5GTrRYsWJY8ePbp8xowZgW+88YbH3/72t5zHHnssYOPGjed9fX31n332mcvChQv9Vq1alfzxxx97vvnmm2mxsbEVAE899VTOm2++mQkwZcqUoBUrVjjNnj27uPE1Pv74Y9d33333qqW3wMDAqs2bN19o/FxaWprGz8+vpuF7rVZbs3//fntLfg4yHYfrmZBEE881ebcjhHiA+mU9AgIC2jMmGZk/Fd7e3jWjR48uB5g3b17+e++953nixInic+fO2dx0003hAAaDAQ8Pj9qm+m/atMnh7bff9q6qqlIUFRWpoqKiKoE/JKT58+cXzJ8/v6XVkss0ZYcjhJBnQX8SrmdCSgf8G32vBS421VCSpE+BTwH69OnT7H/OIe+voEqvxslWg7uDPZ72TnjZ2+Npq8HXzgpXGzV2VirsrVXYW6mws1Jhq1aiUDSVG2Vkrh2tzWTaCyHEVd9LkiRCQ0Mrjx07dralvhUVFeKvf/2rbv/+/adDQ0NrFyxY4FtVVXXVNoApM6SAgICajIwMTcP36enpGl9f3yaToUzn43ompB+BR4QQK4D+QLEkSWYv19VUVlNQaU1FhYbcfDhfV4GQKozqa6VRYqNRYm+lwtFahZO1Gger+qRlb12fuOyt/pfE7K2U2FupsbNS/qGNnUaFUk5uMh2IzMxMza+//mp38803ly9fvtx10KBBZTExMVUFBQWqhuerq6vFyZMnrfr06VNlb29fV1xcrASoqKhQAHh7e+uLi4sV69evd5k4cWLhldcwZYY0bNiw8uTkZOuzZ89qAgMDa9euXeu6bNmyC633lOkMtFtCEkJ8CwwH3IUQ6cA/ATWAJEmfAD8B44DzQAVwtyXXU1treMPWm7yETTh621DgXUWGYwkl1grK1VaUKawpNjhQWudEqd6e8jp7KvXW6OuU6PUGyvUS+XUSVFcjyqtQ1Uko6iTQS9TpDUgG41YNbDVK7KxUOFxKXnaXkpe9lfJ/szNNc4nuf6/bWSlRKeVjYjLtS3BwcNXixYvdHn74YV1QUFD1woULc62traUVK1YkPvbYYwGlpaXKuro6MX/+/Ow+ffpU3XHHHXmPPvqo7qmnnjIcOnTozJw5c3KjoqK6arXamu7du5dbGo9areatt95KHTNmTHhdXR2zZ8/O69OnTxXA66+/7gHw9NNP56ampqr69u0bVV5erhRCSIsWLfI6c+ZMnKurq2VVFTLXFdHRLMz79OkjNadlV7zvIOvXlVGUfwCbqrNEew/DTu1NuiKfTKdScg0paKzysbMvwdOjDgfHMqopoEBSUYwzRThTqvChQh1IidKXEuFGoWRPvl5NXnUddXoDQl+fpKir/7eVARwR2EkCawk0daAy1CczSW+grtaAvtZAZU0dFdV6yqr1VOuN+5txtlUzrZeWuwcHonVp0/1umXZGCHFYkqQ+LbU5fvx4cvfu3fOuVUwyMjcKx48fd+/evXvglc93Gi07yWAg718v0N3Bm/3au1G5B3Ekfz3KGgUjB95NtwwNtTWRFPjryXKoIDkjnZyjOYCEk5OC4BAbensZsLUroaZmL+Xl56mtzb88vlA6UOcQTZVVFBWaYMpU/pQIDwokW3Jr9GTX1JJboye9ppaSJhKOANzUKvw0KtxVKlwVAieUOEB9MjMINJKEqg70NXWU19SRkF3Kl3uT+XJvMmOivbl/aDA9/J2v1Y9URkZG5prSaRKSUChwu+9eav7+D4ZMv5ut290J6vkXynJ/5Iff3iQmdgx9I8aj2Z+NZ5oVvX20cIsLF62KSLyQyNkziRw9UgVo8PEZRkjIPQQFeeDkXElV1QXKy89RXn6e8tL12Nbk4H7pugqFDXZ2IdjZhWLnEoadXShKmxDKFN7k1BrIqaklp0Zf/7Vaf/n7xKr6r7VNzFCtFQIPWzW6Lo68M9ifU6fyWH4glY0nMumjc+G+ocGMivKS96tkZGQ6FZ1qyU6qqeH8qNFodDpyb/8X+3+8wOBpIZQX7OT371fi7q9jwqPPYJ2tpnRnOvrcSpTOVtgP9cOmtyfZ+TmcP3+exMRE0tLSkCQJjUZDUFAQISEhhIaG4urqSm1tMeUV5+sTVPn5y8mquvp/NRkKhQZb20uJyjYUO7v6ZGVjE4BCUX/Q3SBJFOnryKmpJbe6fpbVkLxya/T8XlRGRnUt071cWOjvyW/Hs1i8J4n0wkp0brbcMziI6b212Fl1mvuKToO8ZCcj0zzNLdl1qoQEkP/ll+S8+hq6b5ezY7+KpBN5TH68B7WVF/jpg7fQ19Yy+sFHiRgwlKqzBZTuTKcmuQSFrQq7AT7YD/JFaa+hqqqKpKQkEhMTOX/+PEVFRQC4uLgQGhpKSEgIQUFBWFlZXb62Xl9KeUWj2dSlZFVVlX65jRBqbG0D6xOUbSh29vVfbW0DUSg0f3gvFXUG3kvJ5sPUHGyUgueCfZnt5cLWMzl8tusCR1OLcLJRM7t/AHcNCsTL8SqFFZnrhJyQZGSa50+TkAzl5Zy/aSQ2vXvj9da7rH7tEFXltcx4ri9IZWx493Uuxp+m++jxDL/jPlRqNdUpJZTuSKfqTD4oFdj19sRhqBaVuw1Qf1ivoKDg8uwpKSmJ2tpaFAoF/v7+l2dP3t7eKBRXV8bV1VVQXp5Yn6Aq/peoKitTaTgLLIQSG5vA+hnVpVmVg0NX7OxCOF9RxXMJ6ewqLCPGwYbXwv3p6WjL4ZQCPt+VxJZTWSgVgokxvtw7NIiuvk7t8rOXMR45IcnINM+fJiEB5H7wIXkffEDQj+uodPRj1auHcPGy5daFvRBCYveKrzm0fi1ewaFMeOJZnL3qz+zV5lZQtiuD8sPZYJCw6eqGfawWqwDHP4yv1+tJS0u7nKCysrIAsLW1JSQk5PLDwcGhxTjr6qqoqEiqn1E1WgKsrExGkuoACNTNJzh4ASBYl1PEC+czyK3Rc4evG88F++CsVpGaX8HiPUmsPJRGRU0dg0LcuH9oMMPCPeRDv9cJOSHJyDTPnyoh6QsLOT/yZhxuHonf66+TdDyXnz4+SeRAb266owtCCM4f/J3NH78DEtzy8BOE9R14uX9daQ1ley9Sti8TqUqPJsgRh2H+WIe7IJr4gC8rKyMxMfHyo7y8/jiGl5fX5eW9gIAAVCrj9noMhhoqKpJJS1vCxcyVuLvfTNeot1Cp7CnR1/F6UiaL0/NwVav4Z6gv071cEEJQXFHLtwdT+XJPMlklVYR62nPvkCBu7emHtVppwk9ZxlI6QkKKj4/XTJgwIezcuXOnjO3z3nvvuU2aNKkkMDCw3dQTVq9e7bhw4cIAg8HA3Llz8/79739nXdnm448/dn3nnXe8Aezs7AwfffRRysCBAyvbKyaZtuVPkZAull2koraCUJdQsv/zKgVLlxKyZTMarZb96y9waGMysbeH0224FoDinCzWv/Ma2RfO0Xv8FIbOvgtlo6RhqNZTfjCbsl0Z1BVXo/KyxWGoFtseHghV04dWDQYD2dnZl2dPqampGAwG1Go1gYGBl5f33NzcrpJtuRJJkkhP/5pz51/B1jaY7jGfYmNTr+V3srSCZxLSOVJSwQAnO16N0BJpV7/EWKM3sPHkRT7bmcTpzBLc7DTMHaBj3kAd7vZWLV1Spo3orAmpX79+EY3FVdsavV5PUFBQ9JYtWxKCg4Nru3fv3mX58uUXevfuXdW43S+//GLXo0ePKg8Pj7qVK1c6vvzyy74nTpxoUepI5sah0yckSZIYu3YsYc5hvD/yfWqzsjg/ajQuM6bj/cILSAaJnz4+QeqpAiYv6IlvqDMA+tpadi5dzNHN6/EJj2TC48/g6O7xx7HrDFScyKNsRzq1WeUoHTXYD/HDrp83CuuWZz3V1dUkJydfTlAFBfUKKk5OTpdnT8HBwVhbN1+QUFCwh5NxjyKEgm7RH+DiMgCor9JbnlnAy4kXKaur40F/TxbovLBTKS//TH6/UMDnuy6w9WwOGpWCqT39uG9oEKGeLS8nylhGR0lIY8aMCevZs2d5XFycbXBwcNWqVauSHRwcDLt27bJdsGCBf0VFhcLFxUW/bNmy5N9++83+L3/5S6Cnp2ettbW14dChQ2defPFF782bNztXV1cr+vTpU7Zs2bKUpvZRjeXXX3+1e/HFF3137959DuC5557zBvjPf/5z1SypgdzcXGXXrl275uTknDD7wjLXlE6fkABe+f0V1iWuY+dtO7FWWXPx73+nZP0GQrf+isrdneqKWla9eoiaqjpmPtcXe5f/zRbi9+3i50XvoVCpGfeXBQT1vPqzRJIkqs8VUbojjerEYoSVErsBPjgM9kXpaNzMo6Cg4HLlXlJSEjU1NQgh0Gq1lxOUr6/vVcURFRXJHD/xIJWVyYSHvYBWO+fya3k1el65cJFvMwvws1LzUpgfY92d/jADS8wt44vdSaw5nE613sDwCA/uHxrMoJDWZ2oypmNyQvrhL/7knG5bOQ7PqAqmfNisaGt8fLwmMjKy25YtW8422E906dKl8m9/+1vOgAEDIhrbT/z8889Oq1atSr5yhpSdna308vKqg3r7iZkzZxZYYj+xZMkSl82bNzt+9913KQAffvih6/79++2//vrr1ObexwsvvOAVHx9v3dBH5san0ys1AMRqY1kRv4KDWQcZqh2K2733UrxmLQVff4PngiexslUz9qFurH7tMJs/PcmtC3qhVNd/8EcMHIqHLpgN7/yHta++SP9bZzJoxhwUyv/tvQghsA53wTrchZr0Ukp3plO2M52y3RnY9vDEIdYPtZddizG6urri6upK3759qaurIz09/fLsadu2bWzbtg0bGxuCg4OJiIggOjoahUKBrW0gffusJu7Uk8QnvEBZeTzhYf9AoVDjrlHxTmQAs7xdeSYhnXvikrnZzZFXwvzQ2dQnyhAPe/59azf+OiqcZftT+XpfMnM+308XH0fuGxLExO6+aJpZhpTpvHR0+4n169c7LF261H3v3r3ycl0noFMlpL7efbFWWrMzfSdDtUOxCgrC4ZZbKFy+HLf770Pp4ICbrz0339mFzZ/GsXNlAiPmRF7u7+rrx6xX3mLbkkXs/34lF+PPMO6xp7B3cb3qWhqtA26zu6DPr6R0dwYVh7KpOJyNdaQrDsO0aAIdW515KJVKdDodOp2OkSNHUl5ezoULFy4nqFOnTpGVlcXo0aMBUKkc6B6ziMTEN0lJ/ZTy8vN0i/4AjaY+vn7O9vzcJ4Iv0nN5IzmLYQfO8rjOi4cDPLG6NONys7fisZFhPBAbzI/HLvL57gv8ddVxXtt8ljsHBTKnfwDOtppmY5ZpJ1qYybQnHdl+Yv/+/TYPP/ywbuPGjee8vb3rWnmrMh2ATnVLbK2yZoDPAHZl7Lp8p+X+wP0Yysoo/HbF5XYhvTzpNUbH6V0XObUr4w9jqDVWjH7wMcY8/CSZiQl888xjpMYdb/aaKjcbXCaH4v1sPxxvDqAmrYTcRSfI/fg4lXF5RquEA9jZ2dGtWzduvfVW/vrXv9K3b1/27t3L3r17L7cRQklo6DNERb1FSclRDh6aSllZ/P/iVwgeCvBkV79IRrk58VpSFiMOxLOjoPSPPyu1kpl9/dnyRCxf3dOPCG8H3tgSz8D//MYL6+JIzrNYuFmmA9BgPwHQlP0EQHV1tTh06JA1QGv2E01dY/78+QVnz549feXjymQEf7SfqKqqEmvXrnWdNm1a0ZXtzp07p5kxY0bI4sWLk2JiYqrb7Acic13pVAkJYKh2KBllGSQWJQJgHRWF3ZAhFHz1FYaq/xXq9J8UTECUKzu/SyDrQvFV43QdNpI5r7yNtb0Dq1/+B/vWfItkaF6lW2mnxvFmHd7P9MN5cgh1ZbXkLz1D9tuHKdufiVRr2g2cEIKxY8cSFRXFzz//zPHjf0yKPt5T6NVrBQZDNYcOzyA395c/vO5rreGz6EC+jQlGQuK244k8eCqZrOo/3mwKIRgW7sE39/Zn0+NDGR/jw7cHUhnx1nYe/OYQB5MLmlxGkekcNNhPhIeHRxUWFqoa2088++yz2oiIiKiuXbtG7dixwx6gwX4iMjIyytra2tBgPzF27NjQtrafCAsL6zplypSCxvYTDRYUf//7332KiopUDbFER0d3sfTaMtefTlXUAJBVnsWo1aN4sveT3BN9DwDlBw6QesedeL3wD1xnz77ctqq8llX/OUhdrYEZz/fFzunqwoSaqkp+/exDzuzeji6mJ+MeXYitY+tKCJJBojIuj9Kd6dSml6GwV2M/yBf7AT4obNVGv1+9Xs+yZctISUlh1qxZhIWF/eH1quosTpx4iNLSOEKCF6DTzb9qGaaqzsCHqTm8l5qNWgieCfLhbj93VM0cms0pqeLrfSks3Z9CUUUt3f2duW9IEGOjvWWPJiPpCFV2MjLXiz9FlV0D03+cjr3Gni/HfAnUb5SmzJqNPjeXkC2bEY3OGuWll7Hm9UN4BDgw+YmeKJvY2JckiZO/beG3JYuwcXBkwuPP4BcZZVS8kiRRfaGYsp3pVMUXIjQK7Pp6Yz/ED5WLcdpzVVVVfPXVV+Tl5XHHHXfg7+//h9fr6qo4c/Y5srN/xMtzAl26vIpSaXPVOMmV1TyXkM62glK62lvzWrg/fZyaL8KoqNGz5kgGi3cnkZRXjp+zDXcPDuS2vv44WBufVP+MyAlJRqZ5mktInfJ2N1Yby7GcYxRX1y/FCSFwe+B+ajMyKPnppz+0ddfac9O8LmSeL2bP6vNNjieEIGbkGGa//BYqtYbv/vUsB9evNWopSwiBdYgz7ndH4/VEL2yi3Snbl0nWGwfJX3GWmotlrY5hbW3NnDlzsLe3Z/ny5eTm5v7hdaXSmq5RbxMS8jTZORs5fOR2qqqudoMPtLFieUwwn3cNpKC2jglHzvHXs6kU1OqbvK6tRsW8ATq2LhjGp/N64+diw8sbzzDwP7/x8obTZBTJB+NlZGTajk6bkOqkOvZe/F8xgP3w4ViFhZL/2WdX7QWF9fWix83+nNyeztl9V3+QN+AZGMzcV/9LaN8B7Fy6mB/eeInKstJm21+J2tsO15kReD/dF/tBflSdLiDnvaPkfnGSqnOFLSY4e3t75s2bh0Kh4JtvvqG4+I/7XkIIAnUPEhOziIqKJA4eupXi4qNXjSOEYIKnM7v6RTLf34MVWQUM2X+G5RfzMTRzfYVCMLqrNysfHMiPjwzmpkhPluxNJvb1bTyy/AjH04qM/hnIyMjINEenTEjd3LvhbOXMzvSdl58TCgVu999P9bnzlG3fflWfgbeG4BfhwvZl8eSklDQ7tpWtHROffI4Rdz1I8rEjLH32cbLOJ5gUn8rZCucJwfg81w/HMYHUZpWT90UcOe8fpeJ4DlJd04nB1dWVuXPnUlVVxdKlS6mouFq9xcN9JH16r0apsOHwkdlkZq5tcix7lZJ/hvrxa58IwmytWRCfxqQj5zhV1vKsJ0brzHuzerLz6RHcOySIHfG5TP5wDzM+2cuWU1nUmVBVKCMjI9OYTpmQlAolQ/yGsDtjN3WG/1W3OY4bh9rPj/xFn141G1EoFdxyf1dsHNVs+uQklaU1zY4vhKDX2Inc/n+vAfDtC09zdPN6k6vRFDYqHIf74/NMP1ymhSHVGij4Np6sNw9SticDQ83VlXk+Pj7MmjWLgoICvv32W2pqro7T3j6cvn3X4uzUi9NnnuLc+f9cVg+/ki72NvzQM5R3IwO4UFnN6EPxvHAug1J9y1WBfs42PD+uC3ufu4m/j+/CxaIqHvzmMCPf2s7X+5KpqGl6GVBGRkamOTplQoL6Zbui6iJO5p28/JxQqXC99x4qjx+n4uDBq/rY2GsY91AMlWW1bPksDkNd82XeAD6hEcx99V0Cu/fktyWL2PDf16huYtbSGkJVX+jg9WRv3O6IQuloRdH6C2S9dpDa3KvHCwoKYtq0aaSlpbFq1Srq6q5OHmq1Cz16fIlWO4/U1M85fvw+9PqmlxeFENzm48qe/l2Y4+PGZ+m5DN1/lnU5LS8jAjhYq7lvaDA7nhrOB7N74mSr4YV1pxj4n994ffNZskuqWuwvIyMj00CnTUiDfAehFMo/LNsBOE+ditLNjfxPP2uyn0eAAyPmRJCRUMTe7xNbvY6NvQNTnvoHQ2ffxbkDe1n63OPkJF913s8ohEJgE+WG5/zueDwUg2SQKFyV0OQSXlRUFOPHj+fcuXOsX9/07EyhUBMR/iKRES9TULiXg4emUlGR1Oz1XdQqXo/wZ2OvMDw0Kh48lcLtxy+QWNF6UlEpFUyI8eWHhwex+qGBDAx24+MdiQx57TcWrDzG6YvNL4PKXB/i4+M1YWFhXU3p895777klJye3a4nl6tWrHQMDA6MDAgKin3/++asUHgCWLl3qHB4eHtVwBmnLli32rfXPzs5WDho0KEyn00UPGjQoLDc397Iu2HPPPecdEBAQHRgYGL1mzZrLBmi7du2yDQ8PjwoICIi+6667/A2X9p8rKyvF+PHjgwMCAqJjYmIi4+PjL6tLvP/++246nS5ap9NFv//++24Nz589e1YTExMTqdPposePHx9cVVUloF6a6a677vIPCAiIDg8Pj9q9e/dlTcOO9l4a2LFjh61Sqey9ZMmSJg9LN0enTUhOVk708OxxVUJSWFvjeuedlO/eTeWpplX3Iwb40G2EluO/ppFwoFmR4csIhYJ+k6cz85//QV9dzbd/X8iJrVssOlBqFeiEy+QQalJLKd2V3mSbvn37Mnz4cI4dO8avv/7a7Fh+frPo2eNramsLOXhoKvkFu1u8di8nOzb3CeeVMD+OlJQz4kA8r13IpLKVGSPUz7b6BLryybzebF84nDn9dWyOy2Lce7v468rj1OhbH0PmxmXp0qXuqamp7ZaQ9Ho9Tz75ZMBPP/2UkJCQcGrNmjWuhw8fvup8xMSJE0saFB+++OKL5IceekjXWv9//vOfPsOHDy9NSUmJGz58eOkLL7zgDXD48GHrtWvXusbHx5/avHlzwhNPPBGg19cvOT/88MO6jz76KCU5OTnuwoUL1qtXr3YEePfdd92dnJz0qampcY888kj2ggULtFCfKF577TXfAwcOnDl06NCZ1157zbchWSxYsED7yCOPZKekpMQ5OTnp3333XXeAVatWOV24cME6OTk57uOPP055+OGHAzrqe2mI+5lnntEOGTLkasWBVui0CQnql+3iC+PJKv9jUnGZdTsKe3vyP/u82b6Dp4fiE+rEtm/OkptmXCWdNrIr8157D78uXfnl0/fZ/OHb1FaZv2Rl090Dm27ulPySQm1W04fghw0bRp8+fdizZw/79u1rdiwXl/707fM91lY+HDt2N6lpS1pMmEohuFfrwZ7+XZjg6cw7KdkMO3CWX/ONn+no3Ox4cVJX9j07kvnDQ1hzJJ17vzpIWbW8v3SjoNfrmTp1amB4eHjUmDFjgktLSxVQfzfdt2/fiK5du3YZMmRIWEpKinrJkiUucXFxtnfccUdwZGRkVFlZmVi4cKFPdHR0l7CwsK6zZs3SGVpQMzGG7du32+l0uuqoqKgaa2traerUqQWrV692vrKdk5OToUERv7S0VNFwGLyl/ps3b3Z+8MEH8wEefPDB/E2bNrkArF692nnq1KkFNjY2UmRkZI1Op6vevn27XUpKirqsrExx8803lysUCubMmZP/ww8/uABs2LDB+Z577skHuPvu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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for beta in beta_array:\n", + " label = f'beta = {beta}'\n", + " plot(frame.loc[beta], label=label)\n", + " \n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Fraction infected')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "improving-montreal", + "metadata": {}, + "source": [ + "This example demonstrates one use of a `SweepFrame`: we can run the analysis once, save the results, and then generate different visualizations.\n", + "\n", + "Another way to visualize the results of a two-dimensional sweep is a\n", + "**contour plot**, which shows the parameters on the axes and contour\n", + "lines, that is, lines of constant value. In this example, the value is\n", + "the fraction of students infected.\n", + "\n", + "The ModSim library provides `contour`, which takes a `SweepFrame` as a\n", + "parameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "filled-therapist", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import contour\n", + "\n", + "contour(frame)\n", + "\n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Contact rate (beta)',\n", + " title='Fraction infected, contour plot')" + ] + }, + { + "cell_type": "markdown", + "id": "polished-favor", + "metadata": {}, + "source": [ + "Infection rates are lowest in the lower right, where the contact rate is and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", + "\n", + "This figure suggests that there might be a relationship between `beta`\n", + "and `gamma` that determines the outcome of the model. In fact, there is.\n", + "In the next chapter we'll explore it by running simulations, then derive it by analysis.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "level-barrel", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "addressed-moscow", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "bored-bennett", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "raised-notification", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# Sweep beta with fixed gamma\n", + "gamma = 1/2\n", + "infected_sweep = sweep_beta(beta_array, gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "infectious-winner", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# Interpolating by eye, we can see that the infection rate passes through 0.4\n", + "# when beta is between 0.6 and 0.7\n", + "# We can use the `crossings` function to interpolate more precisely\n", + "# (although we don't know about it yet :)\n", + "beta_estimate = crossings(infected_sweep, 0.4)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "automatic-consultancy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# Time between contacts is 1/beta\n", + "time_between_contacts = 1/beta_estimate" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From b27e64183e31945571bbb3f757a11d0d2d63b18f Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 30 Jan 2021 18:57:16 -0500 Subject: [PATCH 022/144] Revising chapters --- jupyter/chap11.ipynb | 128 ++-- jupyter/chap12.ipynb | 133 ++--- jupyter/chap13.ipynb | 93 +-- jupyter/chap14.ipynb | 921 +++++++++++++++++++++++++++++ jupyter/chap15.ipynb | 570 ++++++++++++++++++ jupyter/chap16.ipynb | 1339 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 3010 insertions(+), 174 deletions(-) create mode 100644 jupyter/chap14.ipynb create mode 100644 jupyter/chap15.ipynb create mode 100644 jupyter/chap16.ipynb diff --git a/jupyter/chap11.ipynb b/jupyter/chap11.ipynb index 8f018cc3..040c405c 100644 --- a/jupyter/chap11.ipynb +++ b/jupyter/chap11.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "steady-bridge", + "id": "pressing-munich", "metadata": {}, "source": [ "# Chapter 11" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "endless-enclosure", + "id": "detected-creation", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "drawn-population", + "id": "breathing-commonwealth", "metadata": { "tags": [ "remove-cell" @@ -43,14 +43,14 @@ " !pip install pint\n", " \n", "try:\n", - " from modsim import *\n", + " import modsim\n", "except ImportError:\n", " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "chicken-tamil", + "id": "persistent-carbon", "metadata": {}, "source": [ "In this chapter, we develop a model of an epidemic as it spreads in a\n", @@ -62,7 +62,7 @@ }, { "cell_type": "markdown", - "id": "developed-asset", + "id": "working-patent", "metadata": {}, "source": [ "## The Freshman Plague\n", @@ -85,7 +85,7 @@ }, { "cell_type": "markdown", - "id": "respected-cleveland", + "id": "distant-expense", "metadata": {}, "source": [ "## The SIR model\n", @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "arabic-flight", + "id": "reasonable-kitchen", "metadata": {}, "source": [ "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average. If 100 people are infectious at a\n", @@ -124,7 +124,7 @@ }, { "cell_type": "markdown", - "id": "emotional-ranch", + "id": "important-yugoslavia", "metadata": {}, "source": [ "Now let's think about the number of new infections. Suppose we know that each susceptible person comes into contact with 1 person every 3 days, on average, in a way that would cause them to become infected if the other person is infected. We'll denote this contact rate with the Greek letter beta, $\\beta$.\n", @@ -138,7 +138,7 @@ }, { "cell_type": "markdown", - "id": "greek-reference", + "id": "virgin-cambodia", "metadata": {}, "source": [ "In summary:\n", @@ -155,7 +155,7 @@ }, { "cell_type": "markdown", - "id": "afraid-consultation", + "id": "fourth-celtic", "metadata": {}, "source": [ "## The SIR equations\n", @@ -163,11 +163,10 @@ "If we treat time as a continuous quantity, we can write differential\n", "equations that describe the rates of change for $s$, $i$, and $r$ (where $r$ is the fraction of the population that has recovered):\n", "\n", - "$$\\frac{ds}{dt} = -\\beta s i$$\n", - "\n", - "$$\\frac{di}{dt} = \\beta s i - \\gamma i$$\n", - "\n", - "$$\\frac{dr}{dt} = \\gamma i$$ \n", + "$$\\begin{aligned}\n", + "\\frac{ds}{dt} &= -\\beta s i \\\\\n", + "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", + "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", "\n", "To avoid cluttering the equations, I leave it implied that $s$ is a function of time, $s(t)$, and likewise for $i$ and $r$.\n", "\n", @@ -192,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "respected-bangkok", + "id": "martial-details", "metadata": {}, "source": [ "## Implementation\n", @@ -214,7 +213,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "british-operations", + "id": "criminal-change", "metadata": {}, "outputs": [ { @@ -238,7 +237,7 @@ }, { "cell_type": "markdown", - "id": "laden-strain", + "id": "chronic-jonathan", "metadata": {}, "source": [ "And then convert the numbers to fractions by dividing by the total:" @@ -247,7 +246,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "complete-disposition", + "id": "pediatric-ratio", "metadata": {}, "outputs": [ { @@ -273,7 +272,7 @@ }, { "cell_type": "markdown", - "id": "curious-commerce", + "id": "ordinary-scottish", "metadata": {}, "source": [ "For now, let's assume we know the time between contacts and time between\n", @@ -283,7 +282,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "palestinian-gender", + "id": "little-stylus", "metadata": {}, "outputs": [], "source": [ @@ -293,7 +292,7 @@ }, { "cell_type": "markdown", - "id": "innocent-bacon", + "id": "covered-avenue", "metadata": {}, "source": [ "We can use them to compute the parameters of the model:" @@ -302,7 +301,7 @@ { "cell_type": "code", "execution_count": 31, - "id": "double-nickname", + "id": "veterinary-aerospace", "metadata": {}, "outputs": [], "source": [ @@ -312,7 +311,7 @@ }, { "cell_type": "markdown", - "id": "human-halifax", + "id": "lightweight-delta", "metadata": {}, "source": [ "Now we need a `System` object to store the parameters and initial\n", @@ -322,10 +321,11 @@ { "cell_type": "code", "execution_count": 8, - "id": "missing-animal", + "id": "nasty-sherman", "metadata": {}, "outputs": [], "source": [ + "#export\n", "def make_system(beta, gamma):\n", " init = State(S=89, I=1, R=0)\n", " init /= sum(init)\n", @@ -339,7 +339,7 @@ }, { "cell_type": "markdown", - "id": "impressive-moderator", + "id": "victorian-blogger", "metadata": {}, "source": [ "The default value for `t_end` is 14 weeks, about the length of a\n", @@ -351,7 +351,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "artistic-bunch", + "id": "supported-shadow", "metadata": { "scrolled": true }, @@ -381,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "latter-respondent", + "id": "alone-desire", "metadata": {}, "source": [ "## The update function\n", @@ -395,10 +395,11 @@ { "cell_type": "code", "execution_count": 32, - "id": "forbidden-shelter", + "id": "wound-wayne", "metadata": {}, "outputs": [], "source": [ + "#export\n", "def update_func(state, t, system):\n", " s, i, r = state\n", "\n", @@ -414,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "subsequent-duplicate", + "id": "aboriginal-malpractice", "metadata": {}, "source": [ "The first line uses a feature we have not seen before, **multiple\n", @@ -434,7 +435,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "complimentary-force", + "id": "assigned-feelings", "metadata": {}, "outputs": [ { @@ -458,7 +459,7 @@ }, { "cell_type": "markdown", - "id": "affected-presentation", + "id": "standard-search", "metadata": {}, "source": [ "You might notice that this version of `update_func` does not use one of its parameters, `t`. I include it anyway because update functions\n", @@ -467,7 +468,7 @@ }, { "cell_type": "markdown", - "id": "certain-clear", + "id": "informational-cisco", "metadata": {}, "source": [ "## Running the simulation\n", @@ -478,10 +479,11 @@ { "cell_type": "code", "execution_count": 33, - "id": "emotional-thomas", + "id": "occasional-pottery", "metadata": {}, "outputs": [], "source": [ + "#export\n", "from numpy import arange\n", "\n", "def run_simulation(system, update_func):\n", @@ -495,7 +497,7 @@ }, { "cell_type": "markdown", - "id": "controversial-magic", + "id": "fifteen-metallic", "metadata": {}, "source": [ "The parameters of `run_simulation` are the `System` object and the\n", @@ -508,7 +510,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "theoretical-ideal", + "id": "differential-difference", "metadata": {}, "outputs": [], "source": [ @@ -518,7 +520,7 @@ }, { "cell_type": "markdown", - "id": "working-austin", + "id": "incredible-marsh", "metadata": {}, "source": [ "The result is the final state of the system:" @@ -527,7 +529,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "russian-professor", + "id": "weekly-acrobat", "metadata": {}, "outputs": [ { @@ -550,7 +552,7 @@ }, { "cell_type": "markdown", - "id": "informed-drunk", + "id": "behind-removal", "metadata": {}, "source": [ "This result indicates that after 14 weeks (98 days), about 52% of the\n", @@ -560,7 +562,7 @@ }, { "cell_type": "markdown", - "id": "funded-civilian", + "id": "serial-genius", "metadata": {}, "source": [ "## Collecting the results\n", @@ -574,7 +576,7 @@ { "cell_type": "code", "execution_count": 36, - "id": "directed-entertainment", + "id": "advanced-recommendation", "metadata": {}, "outputs": [], "source": [ @@ -598,7 +600,7 @@ }, { "cell_type": "markdown", - "id": "underlying-crime", + "id": "behind-breathing", "metadata": {}, "source": [ "First, we create `TimeSeries` objects to store the results. Notice that\n", @@ -621,7 +623,7 @@ { "cell_type": "code", "execution_count": 37, - "id": "hired-miller", + "id": "subtle-zambia", "metadata": {}, "outputs": [], "source": [ @@ -631,7 +633,7 @@ }, { "cell_type": "markdown", - "id": "normal-sodium", + "id": "smoking-toddler", "metadata": {}, "source": [ "We'll use the following function to plot the results:" @@ -640,10 +642,11 @@ { "cell_type": "code", "execution_count": 38, - "id": "aboriginal-myrtle", + "id": "welcome-tractor", "metadata": {}, "outputs": [], "source": [ + "#export\n", "from modsim import decorate\n", "\n", "def plot_results(S, I, R):\n", @@ -656,7 +659,7 @@ }, { "cell_type": "markdown", - "id": "waiting-blues", + "id": "important-command", "metadata": {}, "source": [ "And run it like this:" @@ -665,7 +668,7 @@ { "cell_type": "code", "execution_count": 39, - "id": "timely-dream", + "id": "agricultural-joining", "metadata": {}, "outputs": [ { @@ -687,7 +690,7 @@ }, { "cell_type": "markdown", - "id": "moral-barcelona", + "id": "civic-pharmacy", "metadata": {}, "source": [ "Notice that it takes about three weeks (21 days) for the outbreak to get going, and about six weeks (42 days) before it peaks. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." @@ -695,7 +698,7 @@ }, { "cell_type": "markdown", - "id": "academic-mileage", + "id": "unexpected-empire", "metadata": {}, "source": [ "## Now with a TimeFrame\n", @@ -712,10 +715,11 @@ { "cell_type": "code", "execution_count": 40, - "id": "assured-phenomenon", + "id": "native-central", "metadata": {}, "outputs": [], "source": [ + "#export\n", "from modsim import TimeFrame\n", "\n", "def run_simulation(system, update_func):\n", @@ -730,7 +734,7 @@ }, { "cell_type": "markdown", - "id": "inner-brave", + "id": "beginning-secret", "metadata": {}, "source": [ "The first line creates an empty `TimeFrame` with one column for each\n", @@ -764,7 +768,7 @@ { "cell_type": "code", "execution_count": 41, - "id": "equal-thinking", + "id": "quick-fifty", "metadata": {}, "outputs": [], "source": [ @@ -773,7 +777,7 @@ }, { "cell_type": "markdown", - "id": "framed-dairy", + "id": "global-complement", "metadata": {}, "source": [ "And plot the results like this:" @@ -782,7 +786,7 @@ { "cell_type": "code", "execution_count": 42, - "id": "neutral-baker", + "id": "listed-enough", "metadata": {}, "outputs": [ { @@ -804,7 +808,7 @@ }, { "cell_type": "markdown", - "id": "warming-beauty", + "id": "welsh-distinction", "metadata": {}, "source": [ "As with a `DataFrame`, we can use the dot operator to select columns\n", @@ -813,7 +817,7 @@ }, { "cell_type": "markdown", - "id": "indie-ancient", + "id": "neutral-replacement", "metadata": {}, "source": [ "## Summary\n", @@ -822,7 +826,7 @@ }, { "cell_type": "markdown", - "id": "removed-stevens", + "id": "induced-tunnel", "metadata": {}, "source": [ "## Exercises" @@ -830,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "listed-istanbul", + "id": "floral-remove", "metadata": {}, "source": [ "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", @@ -841,7 +845,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "strange-soviet", + "id": "recovered-freeze", "metadata": {}, "outputs": [ { @@ -876,7 +880,7 @@ { "cell_type": "code", "execution_count": null, - "id": "growing-clear", + "id": "interpreted-colony", "metadata": {}, "outputs": [], "source": [] @@ -884,7 +888,7 @@ { "cell_type": "code", "execution_count": null, - "id": "polar-edgar", + "id": "given-canberra", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap12.ipynb b/jupyter/chap12.ipynb index 74d236fb..c515d65c 100644 --- a/jupyter/chap12.ipynb +++ b/jupyter/chap12.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "noble-particle", + "id": "combined-semiconductor", "metadata": {}, "source": [ "# Chapter 12" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "conscious-partner", + "id": "excellent-orchestra", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "governing-nerve", + "id": "absolute-density", "metadata": { "tags": [ "remove-cell" @@ -43,14 +43,14 @@ " !pip install pint\n", " \n", "try:\n", - " from modsim import *\n", + " import modsim\n", "except ImportError:\n", " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "dominican-johns", + "id": "athletic-diameter", "metadata": {}, "source": [ "### Code\n", @@ -61,7 +61,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "changed-netherlands", + "id": "expensive-venice", "metadata": {}, "outputs": [], "source": [ @@ -88,7 +88,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "thorough-heading", + "id": "satellite-fleet", "metadata": {}, "outputs": [], "source": [ @@ -116,11 +116,12 @@ { "cell_type": "code", "execution_count": 4, - "id": "peaceful-collective", + "id": "affiliated-metabolism", "metadata": {}, "outputs": [], "source": [ "from numpy import arange\n", + "from modsim import TimeFrame\n", "\n", "def run_simulation(system, update_func):\n", " \"\"\"Runs a simulation of the system.\n", @@ -141,7 +142,7 @@ }, { "cell_type": "markdown", - "id": "patent-madagascar", + "id": "identical-steam", "metadata": {}, "source": [ "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects." @@ -149,7 +150,7 @@ }, { "cell_type": "markdown", - "id": "knowing-connecticut", + "id": "complex-renewal", "metadata": {}, "source": [ "## Immunization\n", @@ -167,7 +168,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "catholic-walker", + "id": "recent-cooper", "metadata": {}, "outputs": [], "source": [ @@ -178,7 +179,7 @@ }, { "cell_type": "markdown", - "id": "logical-mailman", + "id": "arranged-screening", "metadata": {}, "source": [ "`add_immunization` moves the given fraction of the population from `S`\n", @@ -188,7 +189,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "sophisticated-occasions", + "id": "found-learning", "metadata": {}, "outputs": [], "source": [ @@ -204,7 +205,7 @@ }, { "cell_type": "markdown", - "id": "postal-haiti", + "id": "unsigned-joseph", "metadata": {}, "source": [ "If we assume that 10% of students are vaccinated at the\n", @@ -215,7 +216,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "abandoned-piece", + "id": "funny-copper", "metadata": {}, "outputs": [], "source": [ @@ -226,7 +227,7 @@ }, { "cell_type": "markdown", - "id": "robust-forestry", + "id": "bronze-techno", "metadata": {}, "source": [ "The following figure shows `S` as a function of time, with and\n", @@ -236,7 +237,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "suffering-coupon", + "id": "divided-biotechnology", "metadata": {}, "outputs": [ { @@ -262,7 +263,7 @@ }, { "cell_type": "markdown", - "id": "shaped-assets", + "id": "postal-cemetery", "metadata": {}, "source": [ "## Metrics\n", @@ -285,7 +286,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "unable-joshua", + "id": "synthetic-element", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +299,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "floral-transcription", + "id": "recovered-picnic", "metadata": {}, "outputs": [ { @@ -319,7 +320,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "cardiovascular-acting", + "id": "american-transfer", "metadata": {}, "outputs": [ { @@ -339,7 +340,7 @@ }, { "cell_type": "markdown", - "id": "reliable-fisher", + "id": "adverse-trance", "metadata": {}, "source": [ "Without immunization, almost 47% of the population gets infected at some point. With 10% immunization, only 31% get infected. That's pretty good." @@ -347,7 +348,7 @@ }, { "cell_type": "markdown", - "id": "multiple-springfield", + "id": "eight-maximum", "metadata": {}, "source": [ "## Sweeping Immunization\n", @@ -359,7 +360,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "funny-batman", + "id": "progressive-architect", "metadata": {}, "outputs": [], "source": [ @@ -377,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "normal-blowing", + "id": "indie-seeker", "metadata": {}, "source": [ "The parameter of `sweep_immunity` is an array of immunization rates. The\n", @@ -391,7 +392,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "severe-oklahoma", + "id": "measured-pavilion", "metadata": {}, "outputs": [], "source": [ @@ -402,7 +403,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "sudden-worker", + "id": "interior-humanitarian", "metadata": {}, "outputs": [ { @@ -428,7 +429,7 @@ }, { "cell_type": "markdown", - "id": "fantastic-violence", + "id": "turkish-mumbai", "metadata": {}, "source": [ "As the immunization rate increases, the number of infections drops\n", @@ -445,7 +446,7 @@ }, { "cell_type": "markdown", - "id": "completed-stand", + "id": "french-spouse", "metadata": {}, "source": [ "The steepness of the curve is a blessing and a curse. It's a blessing\n", @@ -463,7 +464,7 @@ }, { "cell_type": "markdown", - "id": "known-classic", + "id": "changed-capability", "metadata": {}, "source": [ "## Hand washing\n", @@ -495,7 +496,7 @@ }, { "cell_type": "markdown", - "id": "suspected-chosen", + "id": "alpine-guest", "metadata": {}, "source": [ "Now we have to model the relationship between the money we spend and the\n", @@ -513,14 +514,14 @@ { "cell_type": "code", "execution_count": null, - "id": "ultimate-leader", + "id": "closed-feature", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", - "id": "tutorial-terrace", + "id": "agricultural-trinidad", "metadata": {}, "source": [ "### Logistic function" @@ -528,7 +529,7 @@ }, { "cell_type": "markdown", - "id": "abroad-birmingham", + "id": "cheap-structure", "metadata": {}, "source": [ "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." @@ -537,7 +538,7 @@ { "cell_type": "code", "execution_count": 33, - "id": "fossil-adolescent", + "id": "blond-armstrong", "metadata": {}, "outputs": [], "source": [ @@ -563,7 +564,7 @@ }, { "cell_type": "markdown", - "id": "cloudy-canvas", + "id": "seven-budget", "metadata": {}, "source": [ "The following array represents the range of possible spending." @@ -572,7 +573,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "equal-lesson", + "id": "disturbed-amount", "metadata": {}, "outputs": [], "source": [ @@ -581,7 +582,7 @@ }, { "cell_type": "markdown", - "id": "competitive-dylan", + "id": "supreme-nutrition", "metadata": {}, "source": [ "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", @@ -596,7 +597,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "ecological-puppy", + "id": "otherwise-answer", "metadata": {}, "outputs": [], "source": [ @@ -612,7 +613,7 @@ }, { "cell_type": "markdown", - "id": "informed-maple", + "id": "expected-venture", "metadata": {}, "source": [ "Here's what it looks like." @@ -621,7 +622,7 @@ { "cell_type": "code", "execution_count": 37, - "id": "diverse-ensemble", + "id": "seventh-strike", "metadata": {}, "outputs": [ { @@ -649,7 +650,7 @@ }, { "cell_type": "markdown", - "id": "published-decade", + "id": "legal-michigan", "metadata": {}, "source": [ "The result is the following function, which\n", @@ -660,7 +661,7 @@ { "cell_type": "code", "execution_count": 38, - "id": "atomic-guatemala", + "id": "obvious-congress", "metadata": {}, "outputs": [], "source": [ @@ -670,7 +671,7 @@ }, { "cell_type": "markdown", - "id": "reflected-details", + "id": "sunset-investing", "metadata": {}, "source": [ "I use `compute_factor` to write `add_hand_washing`, which takes a\n", @@ -681,7 +682,7 @@ { "cell_type": "code", "execution_count": 39, - "id": "presidential-omaha", + "id": "polish-multiple", "metadata": {}, "outputs": [], "source": [ @@ -692,7 +693,7 @@ }, { "cell_type": "markdown", - "id": "perfect-promotion", + "id": "worthy-fellowship", "metadata": {}, "source": [ "Now we can sweep a range of values for `spending` and use the simulation\n", @@ -702,7 +703,7 @@ { "cell_type": "code", "execution_count": 57, - "id": "outer-nutrition", + "id": "statistical-garden", "metadata": {}, "outputs": [], "source": [ @@ -720,7 +721,7 @@ }, { "cell_type": "markdown", - "id": "agricultural-interpretation", + "id": "clinical-surge", "metadata": {}, "source": [ "Here's how we run it:" @@ -729,7 +730,7 @@ { "cell_type": "code", "execution_count": 58, - "id": "first-termination", + "id": "joined-graduation", "metadata": {}, "outputs": [], "source": [ @@ -741,7 +742,7 @@ }, { "cell_type": "markdown", - "id": "cardiac-shopper", + "id": "designing-smile", "metadata": {}, "source": [ "The following figure shows the result. " @@ -750,7 +751,7 @@ { "cell_type": "code", "execution_count": 61, - "id": "cardiovascular-coach", + "id": "cheap-decision", "metadata": {}, "outputs": [ { @@ -776,7 +777,7 @@ }, { "cell_type": "markdown", - "id": "fifth-highlight", + "id": "selective-right", "metadata": {}, "source": [ "Below \\$200, the campaign has little effect. \n", @@ -788,7 +789,7 @@ }, { "cell_type": "markdown", - "id": "ruled-disease", + "id": "lucky-boulder", "metadata": {}, "source": [ "## Optimization\n", @@ -803,7 +804,7 @@ { "cell_type": "code", "execution_count": 43, - "id": "representative-brook", + "id": "surrounded-copying", "metadata": {}, "outputs": [], "source": [ @@ -815,7 +816,7 @@ }, { "cell_type": "markdown", - "id": "another-idaho", + "id": "expired-conditioning", "metadata": {}, "source": [ "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", @@ -827,7 +828,7 @@ { "cell_type": "code", "execution_count": 47, - "id": "historic-inclusion", + "id": "shaped-utility", "metadata": {}, "outputs": [], "source": [ @@ -836,7 +837,7 @@ }, { "cell_type": "markdown", - "id": "straight-equation", + "id": "occupational-reply", "metadata": {}, "source": [ "In this example we call `linrange` with only one argument; it returns a\n", @@ -849,7 +850,7 @@ { "cell_type": "code", "execution_count": 50, - "id": "received-swiss", + "id": "recognized-release", "metadata": {}, "outputs": [], "source": [ @@ -872,7 +873,7 @@ }, { "cell_type": "markdown", - "id": "appropriate-design", + "id": "cardiac-mitchell", "metadata": {}, "source": [ "For each number of doses, we compute the fraction of students we can\n", @@ -886,7 +887,7 @@ { "cell_type": "code", "execution_count": 51, - "id": "original-browse", + "id": "worth-mounting", "metadata": {}, "outputs": [], "source": [ @@ -896,7 +897,7 @@ { "cell_type": "code", "execution_count": 52, - "id": "technical-violation", + "id": "adjusted-highlight", "metadata": {}, "outputs": [ { @@ -922,7 +923,7 @@ }, { "cell_type": "markdown", - "id": "economic-newspaper", + "id": "dynamic-easter", "metadata": {}, "source": [ "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", @@ -935,7 +936,7 @@ }, { "cell_type": "markdown", - "id": "sharp-difficulty", + "id": "amino-excess", "metadata": {}, "source": [ "## Summary" @@ -943,7 +944,7 @@ }, { "cell_type": "markdown", - "id": "quick-rotation", + "id": "timely-bottom", "metadata": {}, "source": [ "### Exercises\n", @@ -953,7 +954,7 @@ }, { "cell_type": "markdown", - "id": "fresh-costa", + "id": "drawn-hindu", "metadata": {}, "source": [ "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", @@ -964,7 +965,7 @@ { "cell_type": "code", "execution_count": null, - "id": "transparent-entry", + "id": "impressive-librarian", "metadata": {}, "outputs": [], "source": [ diff --git a/jupyter/chap13.ipynb b/jupyter/chap13.ipynb index 16d36724..02d03388 100644 --- a/jupyter/chap13.ipynb +++ b/jupyter/chap13.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "fifty-repair", + "id": "artistic-wells", "metadata": {}, "source": [ "# Chapter 13" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "pharmaceutical-constant", + "id": "ceramic-rendering", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "aware-blade", + "id": "upper-basic", "metadata": { "tags": [ "remove-cell" @@ -43,14 +43,14 @@ " !pip install pint\n", " \n", "try:\n", - " from modsim import *\n", + " import modsim\n", "except ImportError:\n", " !pip install modsimpy" ] }, { "cell_type": "markdown", - "id": "increased-happiness", + "id": "extraordinary-router", "metadata": {}, "source": [ "### Code from previous chapters" @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "honey-backup", + "id": "spiritual-product", "metadata": {}, "source": [ "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." @@ -67,7 +67,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "experimental-preparation", + "id": "entitled-playlist", "metadata": {}, "outputs": [], "source": [ @@ -94,7 +94,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "arbitrary-newspaper", + "id": "monthly-width", "metadata": {}, "outputs": [], "source": [ @@ -122,11 +122,12 @@ { "cell_type": "code", "execution_count": 6, - "id": "attended-sherman", + "id": "antique-timer", "metadata": {}, "outputs": [], "source": [ "from numpy import arange\n", + "from modsim import TimeFrame\n", "\n", "def run_simulation(system, update_func):\n", " \"\"\"Runs a simulation of the system.\n", @@ -148,7 +149,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "genetic-nylon", + "id": "swiss-system", "metadata": {}, "outputs": [], "source": [ @@ -160,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "descending-benjamin", + "id": "electoral-montgomery", "metadata": {}, "source": [ "In the previous chapters I presented an SIR model of infectious disease, specifically the Kermack-McKendrick model. We extended the model to include vaccination and the effect of a hand-washing campaign, and used the extended model to allocate a limited budget optimally, that is, to minimize the number of infections.\n", @@ -172,7 +173,7 @@ }, { "cell_type": "markdown", - "id": "italian-halifax", + "id": "nervous-spread", "metadata": {}, "source": [ "## Sweeping beta\n", @@ -193,7 +194,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "pleased-virus", + "id": "amazing-operations", "metadata": {}, "outputs": [], "source": [ @@ -205,7 +206,7 @@ }, { "cell_type": "markdown", - "id": "operational-continuity", + "id": "adopted-selling", "metadata": {}, "source": [ "Then run the simulation for each value and print the results." @@ -214,7 +215,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "functional-bennett", + "id": "brief-minutes", "metadata": {}, "outputs": [ { @@ -244,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "indian-islam", + "id": "understanding-teach", "metadata": {}, "source": [ "We can wrap that code in a function and store the results in a\n", @@ -254,7 +255,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "successful-holocaust", + "id": "single-burke", "metadata": {}, "outputs": [], "source": [ @@ -269,7 +270,7 @@ }, { "cell_type": "markdown", - "id": "british-turtle", + "id": "wired-wrist", "metadata": {}, "source": [ "Now we can run `sweep_beta` like this:" @@ -278,7 +279,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "varied-attention", + "id": "collected-practice", "metadata": {}, "outputs": [], "source": [ @@ -287,7 +288,7 @@ }, { "cell_type": "markdown", - "id": "played-waters", + "id": "exempt-binary", "metadata": {}, "source": [ "And plot the results:" @@ -296,7 +297,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "possible-valley", + "id": "competitive-amount", "metadata": {}, "outputs": [ { @@ -317,7 +318,7 @@ }, { "cell_type": "markdown", - "id": "defensive-river", + "id": "imported-huntington", "metadata": {}, "source": [ "The first line uses string operations to assemble a label for the\n", @@ -337,7 +338,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "composite-salad", + "id": "certain-second", "metadata": {}, "outputs": [ { @@ -362,7 +363,7 @@ }, { "cell_type": "markdown", - "id": "fuzzy-thesis", + "id": "affiliated-honduras", "metadata": {}, "source": [ "Remember that this figure\n", @@ -378,7 +379,7 @@ }, { "cell_type": "markdown", - "id": "competent-melissa", + "id": "worst-alexandria", "metadata": {}, "source": [ "## Sweeping gamma\n", @@ -390,7 +391,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "traditional-spirit", + "id": "advised-venice", "metadata": {}, "outputs": [], "source": [ @@ -399,7 +400,7 @@ }, { "cell_type": "markdown", - "id": "precise-review", + "id": "sensitive-folder", "metadata": {}, "source": [ "And run `sweep_beta` for each value of `gamma`:" @@ -408,7 +409,7 @@ { "cell_type": "code", "execution_count": 28, - "id": "laughing-tonight", + "id": "determined-consent", "metadata": {}, "outputs": [ { @@ -435,7 +436,7 @@ }, { "cell_type": "markdown", - "id": "oriental-north", + "id": "tutorial-venture", "metadata": {}, "source": [ "The following figure shows the results. When `gamma` is low, the\n", @@ -447,7 +448,7 @@ }, { "cell_type": "markdown", - "id": "large-radical", + "id": "rising-flour", "metadata": {}, "source": [ "## SweepFrame\n", @@ -467,7 +468,7 @@ { "cell_type": "code", "execution_count": 29, - "id": "patient-navigation", + "id": "aquatic-federal", "metadata": {}, "outputs": [], "source": [ @@ -480,7 +481,7 @@ }, { "cell_type": "markdown", - "id": "minus-meaning", + "id": "level-distinction", "metadata": {}, "source": [ "`sweep_parameters` takes as parameters an array of values for `beta` and\n", @@ -503,7 +504,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "polish-excellence", + "id": "julian-liberia", "metadata": {}, "outputs": [], "source": [ @@ -512,7 +513,7 @@ }, { "cell_type": "markdown", - "id": "cultural-olympus", + "id": "sharing-contemporary", "metadata": {}, "source": [ "With the results in a `SweepFrame`, we can plot each column like this:" @@ -521,7 +522,7 @@ { "cell_type": "code", "execution_count": 32, - "id": "religious-placement", + "id": "superior-redhead", "metadata": {}, "outputs": [ { @@ -551,7 +552,7 @@ }, { "cell_type": "markdown", - "id": "familiar-appliance", + "id": "english-photographer", "metadata": {}, "source": [ "Alternatively, we can plot each row like this:" @@ -560,7 +561,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "instructional-navigator", + "id": "regular-drama", "metadata": {}, "outputs": [ { @@ -590,7 +591,7 @@ }, { "cell_type": "markdown", - "id": "improving-montreal", + "id": "selective-evaluation", "metadata": {}, "source": [ "This example demonstrates one use of a `SweepFrame`: we can run the analysis once, save the results, and then generate different visualizations.\n", @@ -607,7 +608,7 @@ { "cell_type": "code", "execution_count": 35, - "id": "filled-therapist", + "id": "logical-method", "metadata": {}, "outputs": [ { @@ -635,7 +636,7 @@ }, { "cell_type": "markdown", - "id": "polished-favor", + "id": "corresponding-headline", "metadata": {}, "source": [ "Infection rates are lowest in the lower right, where the contact rate is and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", @@ -648,7 +649,7 @@ }, { "cell_type": "markdown", - "id": "level-barrel", + "id": "located-double", "metadata": {}, "source": [ "## Summary" @@ -656,7 +657,7 @@ }, { "cell_type": "markdown", - "id": "addressed-moscow", + "id": "flying-tracker", "metadata": {}, "source": [ "## Exercises" @@ -664,7 +665,7 @@ }, { "cell_type": "markdown", - "id": "bored-bennett", + "id": "stopped-breathing", "metadata": {}, "source": [ "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." @@ -673,7 +674,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "raised-notification", + "id": "talented-crack", "metadata": {}, "outputs": [], "source": [ @@ -687,7 +688,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "infectious-winner", + "id": "pressed-isaac", "metadata": {}, "outputs": [], "source": [ @@ -703,7 +704,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "automatic-consultancy", + "id": "equal-crazy", "metadata": {}, "outputs": [], "source": [ diff --git a/jupyter/chap14.ipynb b/jupyter/chap14.ipynb new file mode 100644 index 00000000..81ead454 --- /dev/null +++ b/jupyter/chap14.ipynb @@ -0,0 +1,921 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "happy-minutes", + "metadata": {}, + "source": [ + "# Chapter 14" + ] + }, + { + "cell_type": "markdown", + "id": "impressed-headline", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "conditional-complaint", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-scanning", + "metadata": {}, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "level-struggle", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "offshore-remainder", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ordinary-elephant", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import arange\n", + "from modsim import TimeFrame\n", + "\n", + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.loc[system.t0] = system.init\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "fiscal-testament", + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results, system):\n", + " s_0 = results.S[system.t0]\n", + " s_end = results.S[system.t_end]\n", + " return s_0 - s_end" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "engaging-consequence", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import SweepSeries\n", + "\n", + "def sweep_beta(beta_array, gamma):\n", + " \"\"\"Sweep a range of values for beta.\n", + " \n", + " beta_array: array of beta values\n", + " gamma: recovery rate\n", + " \n", + " returns: SweepSeries that maps from beta to total infected\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[beta] = calc_total_infected(results, system)\n", + " return sweep" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "proud-ability", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import SweepFrame\n", + "\n", + "def sweep_parameters(beta_array, gamma_array):\n", + " \"\"\"Sweep a range of values for beta and gamma.\n", + " \n", + " beta_array: array of infection rates\n", + " gamma_array: array of recovery rates\n", + " \n", + " returns: SweepFrame with one row for each beta\n", + " and one column for each gamma\n", + " \"\"\"\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "flying-chosen", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0.20.40.60.8
Parameter
0.10.0107560.0036420.0021910.001567
0.20.1189840.0107630.0054470.003644
0.30.5890950.0301850.0107710.006526
0.40.8013390.1315630.0209170.010780
0.50.8965770.3964090.0461400.017640
\n", + "
" + ], + "text/plain": [ + " 0.2 0.4 0.6 0.8\n", + "Parameter \n", + "0.1 0.010756 0.003642 0.002191 0.001567\n", + "0.2 0.118984 0.010763 0.005447 0.003644\n", + "0.3 0.589095 0.030185 0.010771 0.006526\n", + "0.4 0.801339 0.131563 0.020917 0.010780\n", + "0.5 0.896577 0.396409 0.046140 0.017640" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ] + }, + { + "cell_type": "markdown", + "id": "disturbed-joshua", + "metadata": {}, + "source": [ + "In the previous chapters we used simulation to predict the effect of an infectious disease in a susceptible population and to design\n", + "interventions that would minimize the effect.\n", + "\n", + "In this chapter we use analysis to investigate the relationship between the parameters, `beta` and `gamma`, and the outcome of the simulation." + ] + }, + { + "cell_type": "markdown", + "id": "respiratory-twelve", + "metadata": {}, + "source": [ + "## Nondimensionalization\n", + "\n", + "The figures in\n", + "Section [\\[sweepframe\\]](#sweepframe){reference-type=\"ref\"\n", + "reference=\"sweepframe\"} suggest that there is a relationship between the parameters of the SIR model, `beta` and `gamma`, that determines the outcome of the simulation, the fraction of students infected. Let's think what that relationship might be.\n", + "\n", + "- When `beta` exceeds `gamma`, that means there are more contacts\n", + " (that is, potential infections) than recoveries during each day (or other unit of time). The difference between `beta` and `gamma` might be called the \"excess contact rate\\\", in units of contacts per day.\n", + "\n", + "- As an alternative, we might consider the ratio `beta/gamma`, which\n", + " is the number of contacts per recovery. Because the numerator and\n", + " denominator are in the same units, this ratio is **dimensionless**, which means it has no units.\n", + "\n", + "Describing physical systems using dimensionless parameters is often a\n", + "useful move in the modeling and simulation game. It is so useful, in\n", + "fact, that it has a name: **nondimensionalization** (see\n", + ").\n", + "\n", + "So we'll try the second option first." + ] + }, + { + "cell_type": "markdown", + "id": "caroline-compiler", + "metadata": {}, + "source": [ + "## Exploring the results\n", + "\n", + "Suppose we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`. Each element in the `SweepFrame` is the fraction of students infected in a simulation with a given pair of parameters.\n", + "\n", + "We can print the values in the `SweepFrame` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "satisfied-japan", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1 0.2 0.010756340768063644\n", + "0.2 0.2 0.11898421353185373\n", + "0.3 0.2 0.5890954199973404\n", + "0.4 0.2 0.8013385277185551\n", + "0.5 0.2 0.8965769637207062\n", + "0.6 0.2 0.942929291399791\n", + "0.7 0.2 0.966299311298026\n", + "0.8 0.2 0.9781518959989762\n", + "0.9 0.2 0.9840568957948106\n", + "1.0 0.2 0.9868823507202488\n", + "1.1 0.2 0.988148177093735\n", + "0.1 0.4 0.0036416926514175607\n", + "0.2 0.4 0.010763463373360094\n", + "0.3 0.4 0.030184952469116566\n", + "0.4 0.4 0.131562924303259\n", + "0.5 0.4 0.3964094037932606\n", + "0.6 0.4 0.5979016626615987\n", + "0.7 0.4 0.7284704154876106\n", + "0.8 0.4 0.8144604459153759\n", + "0.9 0.4 0.8722697237137128\n", + "1.0 0.4 0.9116692168795855\n", + "1.1 0.4 0.9386802509510287\n", + "0.1 0.6 0.002190722188881611\n", + "0.2 0.6 0.005446688837466351\n", + "0.3 0.6 0.010771139974975585\n", + "0.4 0.6 0.020916599304195316\n", + "0.5 0.6 0.04614035896610047\n", + "0.6 0.6 0.13288938996079536\n", + "0.7 0.6 0.3118432512847451\n", + "0.8 0.6 0.47832565854255393\n", + "0.9 0.6 0.605687582114665\n", + "1.0 0.6 0.7014254793376209\n", + "1.1 0.6 0.7738176405451065\n", + "0.1 0.8 0.0015665254038139675\n", + "0.2 0.8 0.003643953969662994\n", + "0.3 0.8 0.006526163529085194\n", + "0.4 0.8 0.010779807499500693\n", + "0.5 0.8 0.017639902596349066\n", + "0.6 0.8 0.030291868201986594\n", + "0.7 0.8 0.05882382948158804\n", + "0.8 0.8 0.13358889291095588\n", + "0.9 0.8 0.2668895539427739\n", + "1.0 0.8 0.40375121210421994\n", + "1.1 0.8 0.519583469821867\n" + ] + } + ], + "source": [ + "for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " print(beta, gamma, frac_infected)" + ] + }, + { + "cell_type": "markdown", + "id": "automotive-solution", + "metadata": {}, + "source": [ + "This is the first example we've seen with one `for` loop inside another:\n", + "\n", + "- Each time the outer loop runs, it selects a value of `gamma` from\n", + " the columns of the `DataFrame` and extracts the corresponding\n", + " column.\n", + "\n", + "- Each time the inner loop runs, it selects a value of `beta` from the\n", + " column and selects the corresponding element, which is the fraction\n", + " of students infected.\n", + "\n", + "In the example from the previous chapter, `frame` has 4 columns, one for\n", + "each value of `gamma`, and 11 rows, one for each value of `beta`. So\n", + "these loops print 44 lines, one for each pair of parameters.\n", + "\n", + "The following function encapulates the previous loop and plots the\n", + "fraction infected as a function of the ratio `beta/gamma`:" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "baking-tactics", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "def plot_sweep_frame(frame):\n", + " for gamma in frame.columns:\n", + " series = frame[gamma]\n", + " for beta in series.index:\n", + " frac_infected = series[beta]\n", + " plot(beta/gamma, frac_infected, 'o', \n", + " color='C1', alpha=0.4)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "dental-outreach", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "plot_sweep_frame(frame)\n", + "\n", + "decorate(xlabel='Contact number (beta/gamma)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "systematic-gossip", + "metadata": {}, + "source": [ + "The results fall on a single curve, at least approximately. That means that we can predict the fraction of students who will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." + ] + }, + { + "cell_type": "markdown", + "id": "theoretical-arrow", + "metadata": {}, + "source": [ + "## Contact number\n", + "\n", + "From Section xxx, recall that the number of new infections in a\n", + "given day is $\\beta s i N$, and the number of recoveries is\n", + "$\\gamma i N$. If we divide these quantities, the result is\n", + "$\\beta s / \\gamma$, which is the number of new infections per recovery\n", + "(as a fraction of the population).\n", + "\n", + "When a new disease is introduced to a susceptible population, $s$ is\n", + "approximately 1, so the number of people infected by each sick person is $\\beta / \\gamma$. This ratio is called the \"contact number\\\" or \"basic reproduction number\\\" (see ). By convention it is usually denoted $R_0$, but in the context of an SIR model, this notation is confusing, so we'll use $c$ instead." + ] + }, + { + "cell_type": "markdown", + "id": "intimate-romance", + "metadata": {}, + "source": [ + "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", + "Section xxx:\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{ds}{dt} &= -\\beta s i \\\\\n", + "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", + "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", + "\n", + "In the same way we divided the\n", + "contact rate by the infection rate to get the dimensionless quantity\n", + "$c$, now we'll divide $di/dt$ by $ds/dt$ to get a ratio of rates:\n", + "\n", + "$$\\frac{di}{ds} = -1 + \\frac{1}{cs}$$ \n", + "\n", + "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." + ] + }, + { + "cell_type": "markdown", + "id": "revolutionary-motorcycle", + "metadata": {}, + "source": [ + "Here's how the derivation goes. We multiply both sides of the previous\n", + "equation by $ds$: \n", + "\n", + "$$di = \\left( -1 + \\frac{1}{cs} \\right) ds$$ \n", + "\n", + "And then integrate both sides: \n", + "\n", + "$$i = -s + \\frac{1}{c} \\log s + q$$ \n", + "\n", + "where $q$ is a constant of integration. Rearranging terms yields:\n", + "\n", + "$$q = i + s - \\frac{1}{c} \\log s$$ \n", + "\n", + "Now let's see if we can figure out what $q$ is. At the beginning of an epidemic, if the fraction infected is small and nearly everyone is susceptible, we can use the approximations $i(0) = 0$ and $s(0) = 1$ to compute $q$:\n", + "\n", + "$$q = 0 + 1 + \\frac{1}{c} \\log 1$$ \n", + "\n", + "Since $\\log 1 = 0$, we get $q = 1$." + ] + }, + { + "cell_type": "markdown", + "id": "spread-convert", + "metadata": {}, + "source": [ + "Now, at the end of the epidemic, let's assume that $i(\\infty) = 0$, and $s(\\infty)$ is an unknown quantity, $s_{\\infty}$. Now we have:\n", + "\n", + "$$q = 1 = 0 + s_{\\infty}- \\frac{1}{c} \\log s_{\\infty}$$ \n", + "\n", + "Solving for $c$, we get $$c = \\frac{\\log s_{\\infty}}{s_{\\infty}- 1}$$ By relating $c$ and $s_{\\infty}$, this equation makes it possible to estimate $c$ based on data, and possibly predict the behavior of future epidemics." + ] + }, + { + "cell_type": "markdown", + "id": "intended-worker", + "metadata": {}, + "source": [ + "## Analysis and simulation\n", + "\n", + "Let's compare this analytic result to the results from simulation. I'll create an array of values for $s_{\\infty}$" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "previous-schedule", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "s_inf_array = linspace(0.0001, 0.999, 31)" + ] + }, + { + "cell_type": "markdown", + "id": "positive-float", + "metadata": {}, + "source": [ + "And compute the corresponding values of $c$:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "valuable-landscape", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import log\n", + "\n", + "c_array = log(s_inf_array) / (s_inf_array - 1)" + ] + }, + { + "cell_type": "markdown", + "id": "premium-carry", + "metadata": {}, + "source": [ + "To get the total infected, we compute the difference between $s(0)$ and\n", + "$s(\\infty)$, then store the results in a `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "composite-cabinet", + "metadata": {}, + "outputs": [], + "source": [ + "frac_infected = 1 - s_inf_array" + ] + }, + { + "cell_type": "markdown", + "id": "bottom-print", + "metadata": {}, + "source": [ + "Recall from Section [\\[dataframe\\]](#dataframe){reference-type=\"ref\"\n", + "reference=\"dataframe\"} that a `Series` object contains an index and a\n", + "corresponding sequence of values. In this case, the index is `c_array`\n", + "and the values are from `frac_infected`.\n", + "\n", + "Now we can plot the results:" + ] + }, + { + "cell_type": "markdown", + "id": "active-street", + "metadata": {}, + "source": [ + " compares the analytic results from this\n", + "section with the simulation results from\n", + "Section [\\[nondim\\]](#nondim){reference-type=\"ref\" reference=\"nondim\"}." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "integral-reading", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_sweep_frame(frame)\n", + "plot(c_array, frac_infected, label='analysis')\n", + "\n", + "decorate(xlabel='Contact number (c)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "peaceful-interest", + "metadata": {}, + "source": [ + "When the contact number exceeds 1, analysis and simulation agree. When\n", + "the contact number is less than 1, they do not: analysis indicates there should be no infections; in the simulations there are a small number of infections.\n", + "\n", + "The reason for the discrepancy is that the simulation divides time into a discrete series of days, whereas the analysis treats time as a\n", + "continuous quantity. In other words, the two methods are actually based on different models. So which model is better?\n", + "\n", + "Probably neither. When the contact number is small, the early progress\n", + "of the epidemic depends on details of the scenario. If we are lucky, the original infected person, \"patient zero\", infects no one and there is no epidemic. If we are unlucky, patient zero might have a large number of close friends, or might work in the dining hall (and fail to observe safe food handling procedures).\n", + "\n", + "For contact numbers near or less than 1, we might need a more detailed\n", + "model. But for higher contact numbers the SIR model might be good\n", + "enough." + ] + }, + { + "cell_type": "markdown", + "id": "beginning-capital", + "metadata": {}, + "source": [ + "## Estimating contact number\n", + "\n", + "Figure xxx shows that if we know the contact number, we can compute the fraction infected. But we can also read the figure the other way; that is, at the end of an epidemic, if we can estimate the fraction of the population that was ever infected, we can use it to estimate the contact number.\n", + "\n", + "Well, in theory we can. In practice, it might not work very well,\n", + "because of the shape of the curve. When the contact number is near 2,\n", + "the curve is quite steep, which means that small changes in $c$ yield\n", + "big changes in the number of infections. If we observe that the total\n", + "fraction infected is anywhere from 20% to 80%, we would conclude that\n", + "$c$ is near 2.\n", + "\n", + "On the other hand, for larger contact numbers, nearly the entire\n", + "population is infected, so the curve is nearly flat. In that case we\n", + "would not be able to estimate $c$ precisely, because any value greater\n", + "than 3 would yield effectively the same results. Fortunately, this is\n", + "unlikely to happen in the real world; very few epidemics affect anything close to 90% of the population.\n", + "\n", + "So the SIR model has limitations; nevertheless, it provides insight into the behavior of infectious disease, especially the phenomenon of herd immunity. As we saw in Chapter xxx, if we know the parameters of the model, we can use it to evaluate possible interventions. And as we saw in this chapter, we might be able to use data from earlier outbreaks to estimate the parameters.\n" + ] + }, + { + "cell_type": "markdown", + "id": "olive-niger", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "upper-interim", + "metadata": {}, + "source": [ + "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", + "\n", + "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", + "\n", + "What do the results look like, and what does that imply? " + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "talented-discovery", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def plot_sweep_frame_difference(frame):\n", + " for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " plot(beta - gamma, frac_infected, 'ro', \n", + " color='C1', alpha=0.4)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "bright-label", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAlh0lEQVR4nO3de5zcdX3v8dc7CZssZHMBAoQEDG65t6BxpaK0Eq+AAq1SQVAutvLgHPHS0x4vp7b21NNz1NpWrSBFRAxaaYsUwaJIbbwgAlkwhJvYBBAiAUIIsIFcSPI5f3x/w/4yzO7Ozu5v9vfbeT8fj3nM/L7zm+98ZmZ3PvP9/r6/71cRgZmZWdlMmegAzMzMGnGCMjOzUnKCMjOzUnKCMjOzUnKCMjOzUpo20QGM1p577hmLFi2a6DDMzGyc3HbbbU9ExLz68solqEWLFtHf3z/RYZiZ2TiR9KtG5e7iMzOzUnKCMjOzUnKCMjOzUiosQUm6VNLjku4a4n5J+oKkVZJWSlpcVCxmZlY9RbagLgOOG+b+44EDs8u5wJcKjMXMzCqmsAQVET8Gnhxml5OBpZHcDMyRNL+oeMzMrFomcpj5AuDh3PaarGztxIRjZjYJrV8Nq5fBwFromQ+9S2CP3vLWmzORgyTUoKzh2h+SzpXUL6l/3bp1BYdlZjZB1q+GWy+BH3wyXa9fPfb6bl8KWzfCrH3T9e1Ly1tvnYlMUGuA/XLbC4FHGu0YERdHRF9E9M2b96KTjc3M2q8KyWT1MuieCzNmg6ak6+65qXwsiqq3zkQmqGuAM7PRfK8Cno4Id++ZWflVJZkMrIXpPTuXTe+BjY+2XmeR9dYp7BiUpG8CxwJ7SloDfALYBSAiLgKuA04AVgHPAecUFYuZ2bjKJxMYvF69rPXjMANrU7LLm96TylvVMx+2DAzGB2l75j6t11lkvXUKS1AR8c4R7g/gfUU9v5nZC8b7gH5VkknvktSyq8W3ZQA2bYBDT2y9ziLrreOZJMxsciuiO66WTPLGI5ls2gCbn4bYka43bUjlrdqjFxafCV0zU/Lsmpm2xzrarqh661RuNnMzs1EpojuuiBZE7Uu/1tKbuU+qbzySyTgnjkLrzXGCMrPJrYjuuKolk4pygjKzya2oA/pOJoVzgjKzchnvAQ1tOqBv48+DJMysPIoY0NCmA/rjYrxP/q04t6DMrDyKGNAA1eiOqyXn7rkpOW8ZSNtlTaZt4BaUmZVHm2YoKKU2TR9UJU5QZlYeRZxfVBWdnJyH4ARlZuVRxMmqVdHJyXkITlBmVh5VGtAw3jo5OQ/BgyTMrFyqMKABxn84fFEn/1aYE5SZ2WgVNeKuKsm5TdzFZ2Y2Wh5x1xZuQZlZa8a7i6tKipjfz17ELSgzG70iZnyoEo+4awsnKDMbvU7v4vKIu7ZwgjKz0ev0k0o7eTh8G/kYlJmNXlFLWFSJR9wVzgnKzEavaktYdPKAjgpzF5+ZjV6Vurg6fUBHhbkFZWatqUoXV1FLeFjh3IIys8mt0wd0VJgTlJlNbj5nqbKcoMxscvM5S5XlBGVmk1uVBnTYTjxIwswmv6oM6LCduAVlZmal5ARlZmal5ARlZmal5ARlZmal5ARlZmal5FF8ZlYuntjVMm5BmVl5eGJXy3GCMrPy6PSVem0nhXbxSToO+DwwFbgkIj5Vd/9s4OvA/lksn42IrxYZk1lHqkq32cDa1HLKm96Tyq3jFNaCkjQVuAA4HjgMeKekw+p2ex9wT0QcCRwL/K2krqJiMutIVeo288SullNkF99RwKqIuD8itgJXACfX7RNAjyQBM4EngW0FxmTWearUbeaJXS2nyAS1AHg4t70mK8v7InAo8AhwJ/DBiNhRX5GkcyX1S+pft25dUfGaTU5VWg/JE7taTpHHoNSgLOq23wysAF4H9AI3SPpJRDyz04MiLgYuBujr66uvw8yGU+s2q60kC+XuNvPErpYpsgW1Btgvt72Q1FLKOwe4KpJVwAPAIQXGZNZ53G1mFVVkC2o5cKCkA4BfA6cBp9ft8xDweuAnkvYGDgbuLzAms85T6zarjeKbuQ8cemJntVKqMorRdlJYgoqIbZLOB64nDTO/NCLulnRedv9FwCeByyTdSeoS/EhEPFFUTGYdq5O7zWqjGLvnplGMWwbSto9tlV6h50FFxHXAdXVlF+VuPwK8qcgYzKzD5UcxwuD16mVOUCXnmSTMbHKr0ihG24kTlJlNbj75t7KcoMxscvMoxspygjKzyc0n/1aW14Mys8mvk0cxVphbUGZmVkpuQZlZa3zyqxXMLSgzG70qLeFhleUEZWajV6UlPKyynKDMbPR88qu1gROUmY2eT361NnCCMrPR88mv1gYexWdmo1fkEh4eHWgZJygza00RJ796aQzLcRefmZWHRwdajhOUmZWHRwdajhOUmZWHRwdajhOUmZWHRwdajhOUmZWHl8awHI/iM7Ny8dIYlnELyszMSmnIFpSkASCGuj8iZhUSkZmZGcMkqIjoAZD0V8CjwOWAgDOAnqEeZ2ZmNh6a6eJ7c0RcGBEDEfFMRHwJeHvRgZmZWWdrJkFtl3SGpKmSpkg6A9hedGBmZtbZmklQpwPvAB7LLn+QlZmZmRVmxGHmEfEgcHLxoZiZmQ0asQUl6SBJP5B0V7Z9hKSPFx+amZl1sma6+L4MfAx4HiAiVgKnFRmUmZlZMwlq14i4ta5sWxHBmJmZ1TSToJ6Q1Et20q6kU4C1hUZlZmYdr5m5+N4HXAwcIunXwAOkk3XNzMwK00yCioh4g6TdgCkRMSDpgKIDMzOzztZMgvoWsDgins2VXQm8opiQzKwS1q9OS7EPrE0LDfYu8SzkNq6GPAYl6RBJbwdmS3pb7nI2MKOZyiUdJ+k+SaskfXSIfY6VtELS3ZJ+1NKrMLP2Wr8abl8KWzfCrH3T9e1LU7nZOBmuBXUw8FZgDnBirnwAeO9IFUuaClwAvBFYAyyXdE1E3JPbZw5wIXBcRDwkaa/RvgAza8J4t3ZWL4PuuTBjdtquXa9e5laUjZvhZjP/NvBtSUdHxM9aqPsoYFVE3A8g6QrSjBT35PY5HbgqIh7KnvPxFp7HzIZTa+10z02tnS0DaXssK9UOrE115U3vSeVm46SZYebnZS0dACTNlXRpE49bADyc216TleUdBMyV9ENJt0k6s1FFks6V1C+pf926dU08tVmFrV8Nt14CP/hkuh5rt1m+taMp6bp7bipvVc/8lOjytgzAzH3GFqtZTjMJ6oiIeKq2EREbgJc38Tg1KKtfAHEaabDFW4A3A38u6aAXPSji4ojoi4i+efPmNfHUZhVVxLGdgbWpdZM3vQc2Ptp6nb1LYNMG2Pw0xI50vWlDKjcbJ80kqCmS5tY2JO1Oc6P/1gD75bYXAo802Od7EfFsRDwB/Bg4som6zSanqrR29uhNXYRdM1MC7Jo5ti5DswaaSTR/C9wk6UpSC+gdwF838bjlwIHZOVO/Js3fV79Mx7eBL0qaBnQBvw38fZOxm00+RRzb6V2SWmG1urYMpNbOoScO/7iR7NHrhGSFama5jaWS+oHXkbrt3pYfiTfM47ZJOh+4HpgKXBoRd0s6L7v/ooi4V9L3gJXADuCSiLhrDK/HrNpqrZ3aqDgYv9ZObRTfzH1ScnJysZJTRP1hoQY7SccAB0bEVyXNA2ZGxAOFR9dAX19f9Pf3T8RTmxUvP+Iu39px95lNYpJui4i++vJm1oP6BPAR0pIbALsAXx/f8MwM8LEds5xmjkH9PmnU3u0AEfGIpJ7hH2JmLfOxHTOguVF8WyP1A9aW29it2JDMzMyaS1D/IukfgTmS3gv8B2mVXTMzs8IM2cUnaXpEbImIz0p6I/AMaX6+v4iIG9oWoZmZdaThjkH9DFgs6fKIeDfgpGRmZm0zXILqknQW8GpJb6u/MyKuKi4sMzPrdMMlqPNIS7vPYeflNiANmHCCMjOzwgy33MaNwI2S+iPiK22MyczMrKmpjr4i6dXAovz+EbG0wLjMrOy85LsVrJmZJC4HPgscA7wyu7xoSgoz6yBe8t3aoJmZJPqAw6KZSfvMrDN4yXdrg2ZO1L0L8DKZZjaoiEUQzeo004LaE7hH0q3AllphRJxUWFRmVm5FLAtiVqeZBPWXRQdhZhVT1CKIZjnNjOL7UTsCMbMK8SKI1gbDzcV3Y0QcI2mAbCbz2l1ARMSswqMzs/LysiBWsOFO1D0mu/baT2Zm1nbNHIMys6rzSbVWQc0MMzezKvNJtVZRTlBmk13+pFpNSdfdc1O5WYk5QZlNdj6p1iqqmbn43ibpvyQ9LekZSQOSnmlHcGY2Dmon1eb5pFqrgGZaUJ8BToqI2RExKyJ6PMTcrEJ6l6STaDc/DbEjXW/akMrNSqyZBPVYRNxbeCRmVozaSbVdM1N3X9fMtO1RfFZyzQwz75f0z8DV7DwXn1fUNasKn1RrFdRMgpoFPAe8KVfmJd/NzKxQzczFd047AjEzM8trZhTfQkn/JulxSY9J+pakhe0IzszMOlczgyS+ClwD7AssAK7NyszMzArTTIKaFxFfjYht2eUyYF7BcZmZWYdrJkE9IeldkqZml3cB64sOzMzMOlszCeo9wDuAR4G1wClZmZmZWWGaGcX3EHBSG2IxMzN7wXAr6n44Ij4j6R/YeUVdACLiAyNVLuk44PPAVOCSiPjUEPu9ErgZODUirmw2eDNrkteDsgoargVVm96ov5WKJU0FLgDeCKwBlku6JiLuabDfp4HrW3kes0lnvJNJbT2o7rlpPagtA2nb0x1ZyQ15DCoirs1uPhcRX8tfSDNLjOQoYFVE3B8RW4ErgJMb7Pd+4FvA46OM3WzyKWJxQa8HZRXVzCCJjzVZVm8B8HBue01W9gJJC4DfBy5qoj6zya+IZOL1oKyihjsGdTxwArBA0hdyd80CtjVRtxqU1R/L+hzwkYjYLjXa/YVYzgXOBdh///2beGqzihpYm1pOedN7UnmrautBzZg9WOb1oKwChmtBPUI6/rQZuC13uQZ4cxN1rwH2y20vzOrM6wOukPQgafj6hZJ+r76iiLg4Ivoiom/ePJ8jbJNYEYsLej0oq6ghW1ARcQdwh6R/A56NiO3wwqCG6U3UvRw4UNIBwK+B04DT657jgNptSZcB34mIq0f5Gswmj94l6ZgTpJbTloGUTA49sfU6a+tB1QZezNwn1ecBElZyzSy38X3gDcDGbLs7K3v1cA+KiG2SzieNzpsKXBoRd0s6L7vfx53M6hWVTLwelFVQMwlqRkTUkhMRsVHSrs1UHhHXAdfVlTVMTBFxdjN1mk16TiZmQHOj+J6VtLi2IekVwKbiQjIzM2uuBfUh4F8l1QY4zAdOLSwiMzMzmpuLb7mkQ4CDSUPHfxERzxcemZmZdbRmWlCQktNhwAzg5ZKIiKXFhWVmZp1uxAQl6RPAsaQEdR1wPHAj4ARlZmaFaWaQxCnA64FHI+Ic4EiaOw/KzMysZc0kqE0RsQPYJmkWaVLXlxYblpmZdbpmjkH1S5oDfJk01dFG4NYigzIzMxs2QSnN4Pr/IuIp4CJJ3wNmRcTKdgRnZmada9guvogI4Orc9oNOTmZm1g7NHIO6OVuS3czMrG2aOQa1BDgvWxLjWdLJuhERRxQZmFnHGu8l380qargFC/ePiIdI5z2ZWTvUlnzvnpsWLtwykLYXn+kkZR1nuBbU1cDiiPiVpG9FxNvbFJNZ58ov+Q6D16uXOUFZxxnuGFR+DXaf92TWDgNr00KFedN7YOOjExOP2QQaLkHFELfNrChFLPluVlHDJagjJT0jaQA4Irv9jKQBSc+0K0CzjtK7JC3xvvlpiB3petOGVG7WYYY8BhURU9sZiJlR3JLvZhXU7HIbZtYuXvLdDGjuRF0zM7O2c4IyM7NSchefWdl4JgkzwC0os3KpzSSxdWOaSWLrxrS9fvVER2bWdk5QZmWSn0lCU9J199xUbtZhnKDMysQzSZi9wAnKrEw8k4TZC5ygzMrEM0mYvcAJyqxMajNJdM1M3X1dM73UhnUsDzM3KxvPJGEGuAVlZmYl5QRlZmal5ARlZmal5ARlZmal5ARlZmal5ARlZmalVGiCknScpPskrZL00Qb3nyFpZXa5SdKRRcZjZmbVUViCkjQVuAA4HjgMeKekw+p2ewB4bUQcAXwSuLioeMzMrFqKbEEdBayKiPsjYitwBXByfoeIuCkiNmSbNwMLC4zHzMwqpMgEtQB4OLe9Jisbyh8C3210h6RzJfVL6l+3bt04hmhmZmVVZIJSg7JouKO0hJSgPtLo/oi4OCL6IqJv3rx54xiimZmVVZFz8a0B9sttLwQeqd9J0hHAJcDxEbG+wHjMzKxCimxBLQcOlHSApC7gNOCa/A6S9geuAt4dEb8sMBYzM6uYwlpQEbFN0vnA9cBU4NKIuFvSedn9FwF/AewBXCgJYFtE9BUVk5mZVYciGh4WKq2+vr7o7++f6DDMzGycSLqtUePEM0mYmVkpOUGZmVkpOUGZmVkpOUGZmVkpOUGZmVkpFXmirtnkt341rF4GA2uhZz70LoE9eic6KrNJwQnKrFXrV8MP/g888UvYuhG6ZsKDP4XXf9xJymwcuIvPrFW3/COsuQViO+y6e7pec0sqN7MxcwvKrFX3/xC6eqBr17TdtStEpHIzGzMnKLNWbdsCU7tg4zrYvjXdnjYDdmyd6MjMJgV38Zm1atYC2Pholpx2SdcbH4We4ZY9M7NmOUGZtWqvw2Fad7q9/fl0Pa07lZvZmLmLz6xV3bPgsN+DNbfC5qdgxhxYeFQqN7Mxc4Iya1XPfJjeA3ufNVi2+ek03NzMxsxdfGat6l0CmzakpBQ70vWmDanczMbMCcqsVXv0wuIzU4tpYG26XnymT9I1Gyfu4jMbiz16nZDMCuIWlJmZlZITlJmZlZITlJmZlZITlJmZlZITlJmZlZJH8Vln8MKCZpXjFpRNfutXw+1L06KCs/ZN17cvTeVmVlpuQdnkt3pZmunh0TvTbA8zZqdEtXqZW1FmJeYEZZPf4/fAkw9A127QPQee3wyP3gXPPzfRkZnZMNzFZ5Pfpg2gqbBLN6B0ranw3JMTHZmZDcMJyia/GXOA7fD8prQk+/Ob0nb33AkOzMyG4y4+K5/xHnG39+FpQcHH7hpct2nv34S9DhuviM2sAG5BWbkUMeJu915Ydy/suicseEW6XndvKjez0nKCsnLJj7i777vpOnak8lY9uRr2Pxq6Z8PmZ9L1/kencjMrLXfx2diMd3dcESPuBtbC7gfsHFfsSOVmVlpOUJ1kvJPJ+tXw0y/As+tg2xaYdm9q8bzmA63Xu2lDqmvzU2kwwy7dMK17bCPueubDhgfhmUd2Pg9qzktar9PMCucEVVZVSCZ3/gusX5VGw+06N7V21q9K5cd+rMVAp8DTD6cW1C7dKUk9+0RKKK3avRfu+CbMmJu69zY9nRLWS1/Xep1mVrhCE5Sk44DPA1OBSyLiU3X3K7v/BOA54OyIuL2wgIqYj62oOquQTB7uhym7wDO/HmztTJ+dylu2A2YthO2bB+ucMRdie+tV1o5BDawdPAa11yHZMaglY4jVzIpU2CAJSVOBC4DjgcOAd0qqH9d7PHBgdjkX+FJR8RQyOqyoOd5qyURTUjLRlMFk0qqH+9Pw6vzJqjPmjC2ZPP8cPPUQ7NgGXbum66ceGtvxohlzoGsGzFqQhoLPWpC2x3LOUu0Y1KJj4JAT0vXuB8DGR1uv08wKV+QovqOAVRFxf0RsBa4ATq7b52RgaSQ3A3MkzS8kmtXL0pfcjNnpC3/G7LQ9ltFhRdQJxSQTUlUv2q4vG42u3SC2AZFOgCXSdtdurde59+Gw1+EwbXo6XjRtetoeyzlLPfNhy8DOZVsGYOY+rddpZoUrMkEtAB7Oba/Jyka7D5LOldQvqX/dunWtRTOwFqb37Fw2vWdsv6KLqLNmvJPJgj7Y9NTOsylsegr27Wu9ztn7Qc8+g/VFpO05+7deZ+8SmDIV9vktOPi4dD1laiofS52bNqSEFzvS9aYNY6vTzApXZIJq9HUaLexDRFwcEX0R0Tdv3rzWoiniV3RRv8yLSCZHviM7MXUHbN6QrnfvTeWt2vtwWHgUzDskJat5h6TtsbR29uiFxWdC18z0A6BrZtoey3G9Iuo0s8IVOUhiDbBfbnsh8EgL+4yP3iXp+BCkVs6WgfQr+tATy1UnpKQxsBY2PZGSybTpY08me/TCMR9M3Y8bH01JdKwDOmqvf5/f2vn1j7Vlskfv+CePIuo0s0Ip4kUNlvGpWJoG/BJ4PfBrYDlwekTcndvnLcD5pFF8vw18ISKOGq7evr6+6O9v8VhMbcTdeH1BF1VnkfWOt6rEaWalJem2iHhRF1FhLaiI2CbpfOB60jDzSyPibknnZfdfBFxHSk6rSMPMzykqHqBav8yr8ou/KnGaWeUUeh5URFxHSkL5sotytwN4X5ExmJlZNXmyWDMzKyUnKDMzKyUnKDMzKyUnKDMzKyUnKDMzK6XCzoMqiqR1wK8mOo4G9gSemOggmlSVWKsSJ1Qn1qrECdWJ1XGO3Usi4kXTBFUuQZWVpP5GJ5qVUVVirUqcUJ1YqxInVCdWx1kcd/GZmVkpOUGZmVkpOUGNn4snOoBRqEqsVYkTqhNrVeKE6sTqOAviY1BmZlZKbkGZmVkpOUGZmVkpOUG1SNLukm6Q9F/Z9dwh9psj6UpJv5B0r6Sjyxprtu9UST+X9J12xpg994hxStpP0rLsvbxb0gfbGN9xku6TtErSRxvcL0lfyO5fKWlxu2JrEMtIsZ6RxbhS0k2SjixjnLn9Xilpu6RT2hlfXQwjxirpWEkrsr/NH7U7xiyGkT772ZKulXRHFmexyxyNRUT40sIF+Azw0ez2R4FPD7Hf14A/ym53AXPKGmt2//8A/gn4ThnjBOYDi7PbPaRFMQ9rQ2xTgdXAS7PP8Y765yWtbfZdQMCrgFva/R6OItZXA3Oz28dPRKzNxJnb7z9JS/ecUuL3dA5wD7B/tr1XSeP8X7X/LWAe8CTQNRHv60gXt6BadzIp+ZBd/179DpJmAb8LfAUgIrZGxFNtii9vxFgBJC0E3gJc0p6wXmTEOCNibUTcnt0eAO4FFrQhtqOAVRFxf0RsBa7I4s07GVgayc3AHEnz2xBbvRFjjYibImJDtnkzsLDNMUJz7ynA+4FvAY+3M7g6zcR6OnBVRDwEEBETEW8zcQbQI0nATFKC2tbeMJvjBNW6vSNiLaQvTWCvBvu8FFgHfDXrNrtE0m7tDDLTTKwAnwM+DOxoU1z1mo0TAEmLgJcDtxQfGguAh3Pba3hxYmxmn3YYbRx/SGr5tduIcUpaAPw+cBETq5n39CBgrqQfSrpN0plti25QM3F+ETgUeAS4E/hgREzU//ywCl1Rt+ok/QewT4O7/qzJKqYBi4H3R8Qtkj5P6rr683EK8QVjjVXSW4HHI+I2SceOY2j1zzPW97RWz0zSr+oPRcQz4xHbSE/ZoKz+HI1m9mmHpuOQtISUoI4pNKLGmonzc8BHImJ7+sE/YZqJdRrwCuD1QDfwM0k3R8Qviw4up5k43wysAF4H9AI3SPpJm/6PRsUJahgR8Yah7pP0mKT5EbE268Zp1JxfA6yJiNov/CtJCWrcjUOsrwFOknQCMAOYJenrEfGuksWJpF1IyekbEXHVeMY3jDXAfrnthaRfoKPdpx2aikPSEaTu3OMjYn2bYstrJs4+4IosOe0JnCBpW0Rc3ZYIBzX7+T8REc8Cz0r6MXAk6ThpuzQT5znApyIdhFol6QHgEODW9oTYPHfxte4a4Kzs9lnAt+t3iIhHgYclHZwVvZ50ELXdmon1YxGxMCIWAacB/zneyakJI8aZ9Zt/Bbg3Iv6ujbEtBw6UdICkLtJ7dE3dPtcAZ2aj+V4FPF3rsmyzEWOVtD9wFfDuNv/Czxsxzog4ICIWZX+XVwL/fQKSEzT3+X8b+B1J0yTtCvw26Rhp2eJ8iPRdhKS9gYOB+9saZbMmepRGVS/AHsAPgP/KrnfPyvcFrsvt9zKgH1gJXE02cqqMseb2P5aJGcU3YpykrqjI3s8V2eWENsV3AunX8Grgz7Ky84DzstsCLsjuvxPom8C/z5FivQTYkHsP+8sYZ92+lzFBo/iajRX4n6QfoXeRup9LF2f2//T97G/0LuBdE/WejnTxVEdmZlZK7uIzM7NScoIyM7NScoIyM7NScoIyM7NScoIyM7NScoIqqWzm5hW5SyEn+I4ypkskHTbCPvMk3ZJN7fQ7o6z/ZdmJwrXtk9r9uiV9KDuHZbSP+5yk381uT/r3qQwk/ZWkIU/8nmiSFkm6q8XH/paky8Y5pMrxMPOSkrQxImZOdByjJek00swEZ42484sfezbp3KHzxz2wwecQ6e++4dxjkh7MYnhiFHXuTjpP61WjeEyp36dhnntaREz4xKKSpkbE9jLHkc0V+Z2I+M0W6/4P4D2RTT7bkSb6RCxfGl+AjQ3KZgP3AQdn298E3pvdPpN08uodwOVZ2TzSlEDLs8trsvLXMniC5s9Jy1bMB36cld0F/E6D5/8h2cmnwEbgr7PnuxnYm3RS8kOkCXJXkOYjexPwM+B24F+BmdnjXwnclD3+1uy15R97KnA28MVs/5eQTt5dmV3XljS4DPhCVtf9NDiRE1hEOqP/wuz1vgT4EukE6ruB/53t9wFgK+kExmVZWcP46+o/F/jLKr5PNPe5n53FdC1p2YvdgEtJf1M/B07O9psKfDZ7/1aS5qCENGvBz7PyS4HppCU+/iX3HMcC1w73ngMPAn8B3EiaIeGy3Ot4BfAj4DbgemB+7jO9J4vniiFe27eB75H+tz6Ru+9d2Xu+AvhHYGruM/0r0iTFx9TV94rss/oZ8DfAXbm/wZ9kr+l24NVZ+eW19y/b/gZwUnb7g8CHJ/q7aEK/Byc6AF+G+GBgO4NJZAVwalb+xuyP/zTge1nZ4dk/157Zdm0Ghn+q/QMB+5OmByL7oqklq5mkORn/hMGzzqcCPQ1i+iGDX7wBnJjd/gzw8ez22Qx+We5J+vLbLdv+SPYF00X6knxlVj4ri+GFxzao61rgrOz2e4Crs9uXkb7EpgCHkZYaqI97EWmG9lflynbPvdYfAkdk2w/m3seG8Teo/2u196Jq71OTn/vZpDneau/Z/yWbfYC0BtIvSUnrv5F+EE2rvcekeR0fBg7KypYCH8pex0O51/wlUkIY8j3PPpsP5+K6DDgF2IWUeOdl5acCl2a3HwGm12Id4rWtJc1i0k1K0n2k2b6vBXbJ9rsQODP3mb5jiP/blcBrs9v5BLUrMCO7fSDZzB2kH4u1z2g28EDu/XsNWdLu1Isniy2vTRHxsvrCiLhB0h+QptQ5Mit+HXBlZN1SEfFkVv4G4LDcLNCzJPUAPwX+TtI3SOvXrJG0HLg0m4j16ohYMUJ8W4Haqru3kRJnvVeRvgx/msXQRUquBwNrI2J5Fu8zACPMVn008Lbs9uWkL/uaqyN12d2TzS3WyK8irdFU8w5J55K+KOdnca5sMv5680ktmkbK/j41+7nfkPu7ehNpYuE/zbZnkH4AvQG4KLIuwIh4Umml3gdicL6/rwHvi4jPSfoecKKkK0nrkH2Y9IU93Hv+zw1iOxj4TdKs3JASbW0OxJXANyRdTZpqbKjXth5A0lWk6bS2kVpDy7M6uxmcvHg7KRHvRNJsUhKsraR7OamlCCmJflHSy7LHH5S9Rz+SdIGkvUif27disAv1cdK0RB3LCapiJE0h/brbRPqFuoY0B1yjg4lTgKMjYlNd+ack/Ttpzq6bJb0hIn6cHeR/C3C5pL+JiKXDhPJ8ZD/zSP9wjf6WRPrnf2fdazhiiHhHI//4LXXP2cizuec/APhTUstkQ3YwekaDxzSMv4FNQzweSv4+NfrcgQHgE9l+f5RdP1v32LdHxH118Tb6Oxwum/4z8D7SgnnLI2Igq2O49/zZBmUC7o6Ioxvc9xbSoqEnAX8u6fB48TG0+pgjq/NrEfGxBnVujsbHnYb6PwT4Y+Ax0o/KKcDm3H2XA2eQekXekyufQfrb6lgexVc9f0w6nvJOBn/5/oDUItgDXjhoD2lCyBcOpGe/3pDUGxF3RsSnScdhDpH0EtJ6UF8mzRa+eBxivRl4jaTfyJ53V0kHAb8A9pX0yqy8R9I00hdjzxB13UT6B4b0z3zjGOKaRfqiezprSRyfuy8fw1Dx17sX+I0xxDNh71Ojzz0i/i0iXpZd+hs87Hrg/VkyQdLLs/LvA+dlMdb+Dn8BLKq9NuDdpGNFkLpCFwPvZbBl1Ox7nncfME/S0dljdpF0ePZjbr+IWEZqnc0hdWnXe6Ok3SV1k1Zx/inpf+qUrGVDdv9Lhgsi0mrZT0uqra11Ru7u2aTW8I7sPZiau+8yUrcnEXF3rvwgUpdjx3KCKq9u7TzM/FPZP+ofAX8SET8h9dV/PPuj/mvgR5LuAGrLUHwA6JO0UtI9pBmNAT4k6a5s302k1VSPBVZI+jnwduDzY30BEbGO1Mf/TUkrSV8+h0RaivpU4B+yGG4g/VpcRuqSXCHp1LrqPgCck9XzbtIB5FbjuoN00P5u0kH7n+buvhj4rqRlQ8XfoMp/J71/rcYzke/TsYz+c/8kqctqpdIw6k9m5ZeQjiutzOI9PSI2k9Yf+ldJd5KOBV6Uve7tpO7P47PrId+L4YLJ3qdTgE9nz7sCeDUpCXw9e96fA3+fJZF6N5JaMStIXWz9EXEP8HHg+1kcN5C6ckdyDnCBpJ+xc+vnQuAsSTeTEs8LLcGIeIz0I+erdXUtIf1tdSwPMzcbB5JuBN46xBeglZQmcMh+LoZdSSMcF0fE01nZdFJL85gGXZIdwy0os/HxJ6SBAmZNUzrR+BfAP9SSU2Z/4KOdnJzALSgzMyspt6DMzKyUnKDMzKyUnKDMzKyUnKDMzKyUnKDMzKyU/j/O95JtoEAOBgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot_sweep_frame_difference(frame)\n", + "\n", + "decorate(xlabel='Excess infection rate (infections-recoveries per day)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "suspended-louisiana", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# The results don't fall on a line, which means that if we \n", + "# know the difference between `beta` and `gamma`, \n", + "# but not their ratio, that's not enough to predict \n", + "# the fraction infected." + ] + }, + { + "cell_type": "markdown", + "id": "understanding-fault", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", + "\n", + "What is your best estimate of `c`?\n", + "\n", + "Hint: if you print `frac_infected_series`, you can read off the answer. " + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "another-timing", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9.211261 0.999900\n", + "3.516747 0.966603\n", + "2.901137 0.933307\n", + "2.558511 0.900010\n", + "2.325167 0.866713\n", + "2.150496 0.833417\n", + "2.012246 0.800120\n", + "1.898689 0.766823\n", + "1.802908 0.733527\n", + "1.720492 0.700230\n", + "1.648460 0.666933\n", + "1.584709 0.633637\n", + "1.527703 0.600340\n", + "1.476285 0.567043\n", + "1.429566 0.533747\n", + "1.386847 0.500450\n", + "1.347569 0.467153\n", + "1.311281 0.433857\n", + "1.277610 0.400560\n", + "1.246247 0.367263\n", + "1.216935 0.333967\n", + "1.189452 0.300670\n", + "1.163613 0.267373\n", + "1.139256 0.234077\n", + "1.116242 0.200780\n", + "1.094449 0.167483\n", + "1.073772 0.134187\n", + "1.054117 0.100890\n", + "1.035401 0.067593\n", + "1.017551 0.034297\n", + "1.000500 0.001000\n", + "dtype: float64" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "from pandas import Series\n", + "\n", + "Series(frac_infected, index=c_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "gross-terry", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# It looks like the fraction infected is 0.26 when the contact \n", + "# number is about 1.16" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "stopped-zealand", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap15.ipynb b/jupyter/chap15.ipynb new file mode 100644 index 00000000..fc9b5f85 --- /dev/null +++ b/jupyter/chap15.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "third-grass", + "metadata": {}, + "source": [ + "# Chapter 15" + ] + }, + { + "cell_type": "markdown", + "id": "driving-terrain", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "administrative-process", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "willing-twist", + "metadata": {}, + "source": [ + "So far the systems we have studied have been physical in the sense that they exist in the world, but they have not been physics, in the sense of what physics classes are usually about. In the next few chapters, we'll do some physics, starting with **thermal systems**, that is, systems where the temperature of objects changes as heat transfers from one to another." + ] + }, + { + "cell_type": "markdown", + "id": "graduate-yahoo", + "metadata": {}, + "source": [ + "## The coffee cooling problem\n", + "\n", + "The coffee cooling problem was discussed by Jearl Walker in \n", + "\"The Amateur Scientist\", *Scientific American*, Volume 237, Issue 5, November 1977. Since then it has become a standard example of modeling and simulation.\n", + "\n", + "Here is my version of the problem:\n", + "\n", + "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?\n", + "\n", + "To help answer this question, I made a trial run with the milk and\n", + "coffee in separate containers and took some measurements (not really):\n", + "\n", + "- When served, the temperature of the coffee is 90 °C. The volume is\n", + " 300 mL.\n", + "\n", + "- The milk is at an initial temperature of 5 °C, and I take about\n", + " 50 mL.\n", + "\n", + "- The ambient temperature in my car is 22 °C.\n", + "\n", + "- The coffee is served in a well insulated cup. When I arrive at work after 30 minutes, the temperature of the coffee has fallen to 70 °C.\n", + "\n", + "- The milk container is not as well insulated. After 15 minutes, it\n", + " warms up to 20 °C, nearly the ambient temperature.\n", + "\n", + "To use this data and answer the question, we have to know something\n", + "about temperature and heat, and we have to make some modeling decisions." + ] + }, + { + "cell_type": "markdown", + "id": "technological-invention", + "metadata": {}, + "source": [ + "## Temperature and heat\n", + "\n", + "To understand how coffee cools (and milk warms), we need a model of\n", + "temperature and heat. **Temperature** is a property of an object or a\n", + "system; in SI units it is measured in degrees Celsius (°C). Temperature quantifies how hot or cold the object is, which is related to the average velocity of the particles that make up the object.\n", + "\n", + "When particles in a hot object contact particles in a cold object, the\n", + "hot object gets cooler and the cold object gets warmer as energy is\n", + "transferred from one to the other. The transferred energy is called\n", + "**heat**; in SI units it is measured in joules (J).\n", + "\n", + "Heat is related to temperature by the following equation (see\n", + "): \n", + "\n", + "$$Q = C~\\Delta T$$ \n", + "\n", + "where $Q$ is the\n", + "amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the **thermal mass** of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C).\n", + "\n", + "For objects made primarily from one material, thermal mass can be\n", + "computed like this: \n", + "\n", + "$$C = m c_p$$ \n", + "\n", + "where $m$ is the mass of the object and $c_p$ is the **specific heat capacity** of the material (see ).\n", + "\n", + "We can use these equations to estimate the thermal mass of a cup of\n", + "coffee. The specific heat capacity of coffee is probably close to that\n", + "of water, which is 4.2 J/g/°C. Assuming that the density of coffee is\n", + "close to that of water, which is 1 g/mL, the mass of 300 mL of coffee is 300 g, and the thermal mass is 1260 J/°C.\n", + "\n", + "So when a cup of coffee cools from 90 °C to 70 °C, the change in\n", + "temperature, $\\Delta T$ is 20 °C, which means that 25 200 J of heat\n", + "energy was transferred from the coffee to the surrounding environment\n", + "(the cup holder and air in my car).\n", + "\n", + "To give you a sense of how much energy that is, if you were able to\n", + "harness all of that heat to do work (which you cannot), you could\n", + "use it to lift a cup of coffee from sea level to 8571 m, just shy of the height of Mount Everest, 8848 m.\n", + "\n", + "Assuming that the cup has less mass than the coffee, and is made from a material with lower specific heat, we can ignore the thermal mass of the cup. For a cup with substantial thermal mass, like a ceramic mug, we might consider a model that computes the temperature of coffee and cup separately." + ] + }, + { + "cell_type": "markdown", + "id": "hidden-sandwich", + "metadata": {}, + "source": [ + "## Heat transfer\n", + "\n", + "In a situation like the coffee cooling problem, there are three ways\n", + "heat transfers from one object to another (see ):\n", + "\n", + "- Conduction: When objects at different temperatures come into\n", + " contact, the faster-moving particles of the higher-temperature\n", + " object transfer kinetic energy to the slower-moving particles of the\n", + " lower-temperature object.\n", + "\n", + "- Convection: When particles in a gas or liquid flow from place to\n", + " place, they carry heat energy with them. Fluid flows can be caused\n", + " by external action, like stirring, or by internal differences in\n", + " temperature. For example, you might have heard that hot air rises,\n", + " which is a form of \"natural convection\\\".\n", + "\n", + "- Radiation: As the particles in an object move due to thermal energy,\n", + " they emit electromagnetic radiation. The energy carried by this\n", + " radiation depends on the object's temperature and surface properties\n", + " (see ).\n", + "\n", + "For objects like coffee in a car, the effect of radiation is much\n", + "smaller than the effects of conduction and convection, so we will ignore it.\n", + "\n", + "Convection can be a complex topic, since it often depends on details of fluid flow in three dimensions. But for this problem we will be able to get away with a simple model called \"Newton's law of cooling\"." + ] + }, + { + "cell_type": "markdown", + "id": "precious-phone", + "metadata": {}, + "source": [ + "## Newton's law of cooling\n", + "\n", + "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the\n", + "object and the surrounding environment:\n", + "\n", + "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", + "\n", + "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment.\n", + "\n", + "Newton's so-called \"law \" is really a model: it is a good approximation in some conditions and less good in others.\n", + "\n", + "For example, if the primary mechanism of heat transfer is conduction,\n", + "Newton's law is \"true\", which is to say that $r$ is constant over a\n", + "wide range of temperatures. And sometimes we can estimate $r$ based on\n", + "the material properties and shape of the object.\n", + "\n", + "When convection contributes a non-negligible fraction of heat transfer, $r$ depends on temperature, but Newton's law is often accurate enough, at least over a narrow range of temperatures. In this case $r$ usually has to be estimated experimentally, since it depends on details of surface shape, air flow, evaporation, etc.\n", + "\n", + "When radiation makes up a substantial part of heat transfer, Newton's\n", + "law is not a good model at all. This is the case for objects in space or in a vacuum, and for objects at high temperatures (more than a few\n", + "hundred degrees Celsius, say).\n", + "\n", + "However, for a situation like the coffee cooling problem, we expect\n", + "Newton's model to be quite good." + ] + }, + { + "cell_type": "markdown", + "id": "complex-statement", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "To get started, let's forget about the milk temporarily and focus on the coffee. \n", + "\n", + "Here's a `System` object that contains the parameters of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "advisory-stations", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "def make_system(T_init, volume, r, t_end):\n", + " return System(T_init=T_init,\n", + " volume=volume,\n", + " r=r,\n", + " t_end=t_end,\n", + " T_env=22,\n", + " t_0=0,\n", + " dt=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "simple-shelter", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "legal-shift", + "metadata": {}, + "source": [ + "The values of `volume`, `T_env`, and `t_end` come from the statement of the problem. I chose the value of `r` arbitrarily for now; we will\n", + "figure out how to estimate it soon.\n", + "\n", + "`dt` is the time step we use to simulate the cooling process. Strictly\n", + "speaking, Newton's law is a differential equation, but over a short\n", + "period of time we can approximate it with a difference equation:\n", + "\n", + "$$\\Delta T = -r (T - T_{env}) dt$$ \n", + "\n", + "where $dt$ is a small time step and\n", + "$\\Delta T$ is the change in temperature during that time step.\n", + "\n", + "Note: I use $\\Delta T$ to denote a change in temperature over time, but in the context of heat transfer, you might also see $\\Delta T$ used to denote the difference in temperature between an object and its\n", + "environment, $T - T_{env}$. To minimize confusion, I avoid this second\n", + "use.\n", + "\n", + "Now we can write an update function:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "organic-morrison", + "metadata": {}, + "outputs": [], + "source": [ + "def change_func(T, t, system):\n", + " r, T_env, dt = system.r, system.T_env, system.dt \n", + " return -r * (T - T_env) * dt" + ] + }, + { + "cell_type": "markdown", + "id": "manufactured-alfred", + "metadata": {}, + "source": [ + "Like previous update functions, this one takes a `State` object, a time,\n", + "and a `System` object.\n", + "\n", + "Now if we run" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "olympic-bailey", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.68" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "change_func(coffee.T_init, 0, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "synthetic-montana", + "metadata": {}, + "source": [ + "we see that the temperature after one minute is 89.3 °C, so the\n", + "temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", + "\n", + "Here's a version of `run_simulation` that simulates a series of time\n", + "steps from `t_0` to `t_end`:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "synthetic-danish", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import linrange\n", + "from pandas import Series\n", + "from numpy import empty\n", + "\n", + "def run_simulation(system, change_func):\n", + " t_array = linrange(system.t_0, system.t_end, system.dt)\n", + " n = len(t_array)\n", + " \n", + " T_array = empty(n)\n", + " T_array[0] = system.T_init\n", + " \n", + " for i in range(n-1):\n", + " t = t_array[i]\n", + " T = T_array[i]\n", + " T_array[i+1] = T + change_func(T, t, system)\n", + " \n", + " system.T_final = T_array[-1]\n", + " return Series(T_array, index=t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "finite-paraguay", + "metadata": {}, + "source": [ + "This function is similar to previous versions of `run_simulation`.\n", + "\n", + "One difference is that it uses `linrange` to make an array of values\n", + "from `t_0` to `t_end` with time step `dt`.\n", + "\n", + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "virtual-notebook", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(coffee, change_func)" + ] + }, + { + "cell_type": "markdown", + "id": "impressed-provincial", + "metadata": {}, + "source": [ + "The result is a `TimeSeries` with one row per time step. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "realistic-imagination", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "26.0 74.362934\n", + "27.0 73.839305\n", + "28.0 73.320912\n", + "29.0 72.807702\n", + "30.0 72.299625\n", + "dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "seven-poker", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "72.2996253904031" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "seven-costume", + "metadata": {}, + "source": [ + "The temperature after 30 minutes is 72.3 °C, which is a little higher than stated in the problem, 70 °C. " + ] + }, + { + "cell_type": "markdown", + "id": "acoustic-provider", + "metadata": {}, + "source": [ + "We can adjust `r` and find the right value by trial and error, but we'll see a better way in the next chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "demanding-spending", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results.plot(label='coffee')\n", + "\n", + "decorate(xlabel='Time (minute)',\n", + " ylabel='Temperature (C)',\n", + " title='Coffee Cooling')" + ] + }, + { + "cell_type": "markdown", + "id": "automatic-standard", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", + "\n", + "By trial and error, find a value for `r` that makes the final temperature close to 20 C." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "maritime-pillow", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20.00135627897414" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "milk = make_system(T_init=5, t_end=15, r=0.133, volume=50)\n", + "results_milk = run_simulation(milk, change_func)\n", + "milk.T_final" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "killing-kitchen", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "results_milk.plot(color='C1', label='milk')\n", + "\n", + "decorate(xlabel='Time (minutes)',\n", + " ylabel='Temperature (C)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "buried-sweden", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap16.ipynb b/jupyter/chap16.ipynb new file mode 100644 index 00000000..6aacefe6 --- /dev/null +++ b/jupyter/chap16.ipynb @@ -0,0 +1,1339 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "nearby-contemporary", + "metadata": {}, + "source": [ + "# Chapter 16" + ] + }, + { + "cell_type": "markdown", + "id": "boxed-certificate", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "veterinary-timer", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "coral-content", + "metadata": {}, + "source": [ + "## Code from previous notebooks" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "romantic-edgar", + "metadata": {}, + "outputs": [], + "source": [ + "def change_func(T, t, system):\n", + " r, T_env, dt = system.r, system.T_env, system.dt\n", + " \n", + " return -r * (T - T_env) * dt" + ] + }, + { + "cell_type": "code", + "execution_count": 254, + "id": "unlikely-protest", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import TimeSeries\n", + "from numpy import arange\n", + "\n", + "def run_simulation(system, change_func):\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " results = TimeSeries(quantity='Temperature')\n", + " results[t_0] = system.T_init\n", + " \n", + " for t in arange(t_0, t_end, dt):\n", + " T = results[t]\n", + " results[t+dt] = T + change_func(T, t, system)\n", + " \n", + " system.t_end = results.index[-1]\n", + " system.T_final = results[system.t_end]\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 255, + "id": "rubber-norway", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "def make_system(T_init, volume, r, t_end):\n", + " return System(T_init=T_init,\n", + " T_final=T_init,\n", + " volume=volume,\n", + " r=r,\n", + " t_end=t_end,\n", + " T_env=22,\n", + " t_0=0,\n", + " dt=0.1)" + ] + }, + { + "cell_type": "markdown", + "id": "tamil-mobile", + "metadata": {}, + "source": [ + "In the previous chapter we wrote a simulation of a cooling cup of\n", + "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", + "temperature of the coffee will change over time.\n", + "\n", + "In general, we don't know the value of `r`, but we can use measurements to estimate it. Given an initial temperature, a final temperature, and the time in between, we can find `r` by trial and error.\n", + "\n", + "In this chapter, we'll see a better way to find `r`, using a **bisection search**.\n", + "\n", + "And then we'll get back to solving the coffee cooling problem." + ] + }, + { + "cell_type": "markdown", + "id": "requested-pantyhose", + "metadata": {}, + "source": [ + "## Finding roots\n", + "\n", + "The ModSim library provides a method called `root_bisect` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", + "\n", + "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", + "\n", + "where **root** means a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", + "\n", + "I'll use this example to demonstrate `root_bisect`. First, we have to\n", + "write a function that evaluates $f$:" + ] + }, + { + "cell_type": "code", + "execution_count": 256, + "id": "three-reporter", + "metadata": {}, + "outputs": [], + "source": [ + "def func(x):\n", + " return (x-1) * (x-2) * (x-3)" + ] + }, + { + "cell_type": "markdown", + "id": "sharing-transcript", + "metadata": {}, + "source": [ + "Now we call `root_bisect` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 257, + "id": "stable-costa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 3\n", + " iterations: 2\n", + " root: 2.0" + ] + }, + "execution_count": 257, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy.optimize import root_scalar\n", + "\n", + "res = root_scalar(func, bracket=[1.5, 2.5])\n", + "res" + ] + }, + { + "cell_type": "markdown", + "id": "secondary-sapphire", + "metadata": {}, + "source": [ + "The first argument is the function whose roots we want. The second\n", + "argument is an interval that contains a root. The result is an object\n", + "that contains several variables, including `root`, which stores the root\n", + "that was found." + ] + }, + { + "cell_type": "markdown", + "id": "nonprofit-jordan", + "metadata": {}, + "source": [ + "If we provide a different interval, we find a different root." + ] + }, + { + "cell_type": "code", + "execution_count": 258, + "id": "earned-norfolk", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.0" + ] + }, + "execution_count": 258, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res = root_scalar(func, bracket=[2.5, 3.5])\n", + "\n", + "res.root" + ] + }, + { + "cell_type": "markdown", + "id": "assisted-oregon", + "metadata": {}, + "source": [ + "If the interval doesn't contain a root, you'll get a `ValueError`:\n", + "\n", + "```\n", + "res = root_scalar(func, bracket=[4, 5])\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "selective-sector", + "metadata": {}, + "source": [ + "## Estimating `r`\n", + "\n", + "So how can we use `root_scalar` to estimate `r`?\n", + "\n", + "What we want is the value of `r` that yields a final temperature of\n", + "70 °C. To work with `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" + ] + }, + { + "cell_type": "code", + "execution_count": 259, + "id": "empirical-leisure", + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(r, system):\n", + " system.r = r\n", + " results = run_simulation(system, change_func)\n", + " return system.T_final - 70" + ] + }, + { + "cell_type": "markdown", + "id": "green-manitoba", + "metadata": {}, + "source": [ + "I call a function like this an \"error function\\\" because it returns the\n", + "difference between what we got and what we wanted, that is, the error.\n", + "When we find the right value of `r`, this error will be 0.\n", + "\n", + "We can test `error_func` like this, using the initial guess `r=0.01`:" + ] + }, + { + "cell_type": "code", + "execution_count": 260, + "id": "cubic-shopping", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "0.6000000000000001", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Float64HashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Float64HashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 0.6000000000000001", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mcoffee\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_system\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mT_init\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m90\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvolume\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m300\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.01\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0merror_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.01\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoffee\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36merror_func\u001b[0;34m(r, system)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0merror_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrun_simulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchange_func\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT_final\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m70\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mrun_simulation\u001b[0;34m(system, change_func)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt_0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_end\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mT\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mT\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mchange_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 822\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mkey_is_scalar\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 824\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 825\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_hashable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m_get_value\u001b[0;34m(self, label, takeable)\u001b[0m\n\u001b[1;32m 930\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 931\u001b[0m \u001b[0;31m# Similar to Index.get_value, but we do not fall back to positional\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 932\u001b[0;31m \u001b[0mloc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 933\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_values_for_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 934\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/numeric.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnan_idxs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 395\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 396\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0;31m# ----------------------------------------------------------------\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 0.6000000000000001" + ] + } + ], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)\n", + "error_func(0.01, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "floating-trace", + "metadata": {}, + "source": [ + "The result is an error of 2.3 °C, because the final temperature with\n", + "this value of `r` is too high." + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "id": "conscious-closer", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-10.907066281994297" + ] + }, + "execution_count": 165, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "error_func(0.02, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "compliant-brake", + "metadata": {}, + "source": [ + "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", + "\n", + "Now we can call `root_scalar` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "id": "global-directory", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])" + ] + }, + { + "cell_type": "markdown", + "id": "referenced-virgin", + "metadata": {}, + "source": [ + "The first argument is the error function.\n", + "The second argument is the `System` object, which `root_scalar` will pass as an argument to `error_func`.\n", + "The third argument is an interval that brackets the root.\n", + "\n", + "Here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "id": "swedish-separate", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 7\n", + " iterations: 6\n", + " root: 0.011543084584004043" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "id": "complimentary-remainder", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.011543084584004043" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r_coffee = res.root\n", + "r_coffee" + ] + }, + { + "cell_type": "markdown", + "id": "liable-natural", + "metadata": {}, + "source": [ + "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", + "\n", + "We can confirm that this value is correct by setting `r` to the root we found and running the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "id": "threaded-neutral", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "69.99999999996255" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee.r = res.root\n", + "results = run_simulation(coffee, change_func)\n", + "coffee.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "smaller-experience", + "metadata": {}, + "source": [ + "The result is very close to 70 C." + ] + }, + { + "cell_type": "markdown", + "id": "obvious-integer", + "metadata": {}, + "source": [ + "## Mixing liquids\n", + "\n", + "When we mix two liquids, the temperature of the mixture depends on the\n", + "temperatures of the ingredients, but it might not be obvious how to\n", + "compute it.\n", + "\n", + "Assuming there are no chemical reactions that either produce or consume heat, the total thermal energy of the system is the same before and after mixing; in other words, thermal energy is **conserved**.\n", + "\n", + "If the temperature of the first liquid is $T_1$, the temperature of the second liquid is $T_2$, and the final temperature of the mixture is $T$, the heat transfer into the first liquid is $C_1 (T - T_1)$ and the heat transfer into the second liquid is $C_2 (T - T_2)$, where $C_1$ and $C_2$ are the thermal masses of the liquids.\n", + "\n", + "In order to conserve energy, these heat transfers must add up to 0:\n", + "\n", + "$$C_1 (T - T_1) + C_2 (T - T_2) = 0$$ \n", + "\n", + "We can solve this equation for T:\n", + "\n", + "$$T = \\frac{C_1 T_1 + C_2 T_2}{C_1 + C_2}$$ \n", + "\n", + "For the coffee cooling problem, we have the volume of each liquid; if we also know the density, $\\rho$, and the specific heat capacity, $c_p$, we can compute thermal mass: \n", + "\n", + "$$C = \\rho V c_p$$ \n", + "\n", + "If the liquids have the same density and heat capacity, they drop out of the equation, and we can write:\n", + "\n", + "$$T = \\frac{V_1 T_1 + V_2 T_2}{V_1 + V_2}$$ \n", + "\n", + "where $V_1$ and $V_2$ are the volumes of the liquids.\n", + "\n", + "As an approximation, I'll assume that milk and coffee have the same\n", + "density and specific heat. As an exercise, you can look up these\n", + "quantities and see how good this assumption is.\n", + "\n", + "The following function takes two `System` objects that represent the\n", + "coffee and milk, and creates a new `System` to represent the mixture:" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "id": "going-error", + "metadata": {}, + "outputs": [], + "source": [ + "def mix(system1, system2):\n", + " \n", + " V1, V2 = system1.volume, system2.volume\n", + " T1, T2 = system1.T_final, system2.T_final\n", + " \n", + " V_mix = V1 + V2\n", + " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", + " \n", + " return make_system(T_init=T_mix,\n", + " volume=V_mix,\n", + " r=system1.r,\n", + " t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "quick-frederick", + "metadata": {}, + "source": [ + "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", + "\n", + "This function uses the value of `r` from `system1` as the value of `r`\n", + "for the mixture. If `system1` represents the coffee, and we are adding\n", + "the milk to the coffee, this is probably a reasonable choice. On the\n", + "other hand, when we increase the amount of liquid in the coffee cup,\n", + "that might change `r`. So this is an assumption we might want to\n", + "revisit.\n", + "\n", + "Now we have everything we need to solve the problem." + ] + }, + { + "cell_type": "markdown", + "id": "composite-antibody", + "metadata": {}, + "source": [ + "## Mix first or last?\n", + "\n", + "First I'll create objects to represent the coffee and cream.\n", + "For `r_coffee`, I'll use the value we just computed." + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "id": "latin-herald", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "trying-perception", + "metadata": {}, + "source": [ + "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 236, + "id": "proud-opportunity", + "metadata": {}, + "outputs": [], + "source": [ + "r_milk = 0.133\n", + "milk = make_system(T_init=5, volume=50, r=r_milk, t_end=15)" + ] + }, + { + "cell_type": "markdown", + "id": "changing-newport", + "metadata": {}, + "source": [ + "Now we can mix them and simulate 30 minutes:" + ] + }, + { + "cell_type": "code", + "execution_count": 237, + "id": "powerful-cradle", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "61.428571428540685" + ] + }, + "execution_count": 237, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mix_first = mix(coffee, milk)\n", + "run_simulation(mix_first, change_func)\n", + "\n", + "mix_first.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "ordered-maple", + "metadata": {}, + "source": [ + "The final temperature is 61.4 °C which is still warm enough to be\n", + "enjoyable. Would we do any better if we added the milk last?\n", + "\n", + "I'll simulate the coffee and milk separately, and then mix them:" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "id": "painted-politics", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "63.10928927119819" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee_results = run_simulation(coffee, change_func)\n", + "run_simulation(milk, change_func)\n", + "mix_last = mix(coffee, milk)\n", + "mix_last.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "executive-transcription", + "metadata": {}, + "source": [ + "After mixing, the temperature is 63.1 °C, so it looks like adding the\n", + "milk at the end is better by about 1.7 °C. But is that the best we can\n", + "do?" + ] + }, + { + "cell_type": "markdown", + "id": "appointed-reach", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "Adding the milk after 30 minutes is better than adding it immediately, but maybe there's something in between that's even better. To find out, I'll use the following function, which takes the time to add the milk, `t_add`, as a parameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "id": "shared-disco", + "metadata": {}, + "outputs": [], + "source": [ + "def run_and_mix(t_add, t_total):\n", + " coffee.t_end = t_add\n", + " coffee_results = run_simulation(coffee, change_func)\n", + " \n", + " milk.t_end = t_add\n", + " milk_results = run_simulation(milk, change_func)\n", + " \n", + " mixture = mix(coffee, milk)\n", + " mixture.t_end = t_total - t_add\n", + " results = run_simulation(mixture, change_func)\n", + "\n", + " return mixture.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "pleasant-webster", + "metadata": {}, + "source": [ + "When `t_add=0`, we add the milk immediately; when `t_add=30`, we add it\n", + "at the end. Now we can sweep the range of values in between:" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "id": "authentic-barrier", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "id": "tutorial-momentum", + "metadata": {}, + "outputs": [], + "source": [ + "milk = make_system(T_init=5, volume=50, r=0.133, t_end=15)" + ] + }, + { + "cell_type": "code", + "execution_count": 246, + "id": "split-dance", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import SweepSeries\n", + "from numpy import linspace\n", + "\n", + "sweep = SweepSeries()\n", + "for t_add in linspace(0, 30, 11):\n", + " sweep[t_add] = run_and_mix(t_add, 30)" + ] + }, + { + "cell_type": "markdown", + "id": "measured-consideration", + "metadata": {}, + "source": [ + "Here's what the results look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 247, + "id": "impaired-partnership", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "sweep.plot(label='mixture')\n", + "\n", + "decorate(xlabel='Time until mixing (minutes)',\n", + " ylabel='Final emperature (C)')" + ] + }, + { + "cell_type": "markdown", + "id": "conservative-phrase", + "metadata": {}, + "source": [ + "Note that this is a parameter sweep, not a time series. The x-axis is the time when we add the milk, not the index of a `TimeSeries`.\n", + "\n", + "The final temperature is maximized when `t_add=30`, so adding the milk\n", + "at the end is optimal.\n", + "\n", + "As an exercise you will have a chance to explore this solution and try some variations. For example, suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?" + ] + }, + { + "cell_type": "markdown", + "id": "accomplished-tulsa", + "metadata": {}, + "source": [ + "## Analysis\n", + "\n", + "Simulating Newton's law of cooling is almost silly, because we can solve the differential equation analytically. If\n", + "\n", + "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", + "\n", + "the general solution is\n", + "\n", + "$$T{\\left (t \\right )} = C \\exp(-r t) + T_{env}$$ \n", + "\n", + "and the particular solution where $T(0) = T_{init}$ is\n", + "\n", + "$$T_{env} + \\left(- T_{env} + T_{init}\\right) \\exp(-r t)$$ \n", + "\n", + "If you would like to see this solution done by hand, you can watch this video: ." + ] + }, + { + "cell_type": "markdown", + "id": "opponent-trace", + "metadata": {}, + "source": [ + "Now we can use the observed data to estimate the parameter $r$. If we\n", + "observe the that temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", + "\n", + "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$" + ] + }, + { + "cell_type": "markdown", + "id": "electoral-archives", + "metadata": {}, + "source": [ + "The following function takes a `System` object with a simulated `T_final` and computes `r`:" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "id": "little-bahrain", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import log\n", + "\n", + "def compute_r(system):\n", + " t_end = system.t_end\n", + " T_init = system.T_init\n", + " T_final = system.T_final\n", + " T_env = system.T_env\n", + " \n", + " r = log((T_init - T_env) / (T_final - T_env)) / t_end\n", + " return r" + ] + }, + { + "cell_type": "markdown", + "id": "superior-harmony", + "metadata": {}, + "source": [ + "Can can use this function to compute `r` for the coffee, given the parameters of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "id": "executive-queensland", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.01161022314227386" + ] + }, + "execution_count": 198, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0, t_end=30)\n", + "coffee.T_final = 70\n", + "r_coffee2 = compute_r(coffee)\n", + "r_coffee2" + ] + }, + { + "cell_type": "markdown", + "id": "arctic-retention", + "metadata": {}, + "source": [ + "Notice that this value is not the same as `r_coffee` in the simulations. " + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "id": "defined-wound", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.011543084584004043" + ] + }, + "execution_count": 199, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r_coffee" + ] + }, + { + "cell_type": "markdown", + "id": "passive-impression", + "metadata": {}, + "source": [ + "That's because the simulations use discrete time steps, and the analysis uses continuous time.\n", + "\n", + "Nevertheless, the results of any analysis are consistent with the simulation.\n", + "To check, we'll use the following function, which takes a `System` object and uses the analytic result to compute a time series:" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "id": "mediterranean-arbitration", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import exp\n", + "from pandas import Series\n", + "\n", + "def run_analysis(system):\n", + " T_env, T_init, r = system.T_env, system.T_init, system.r\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " t_array = arange(t_0, t_end+dt, dt) \n", + " T_array = T_env + (T_init - T_env) * exp(-r * t_array)\n", + " \n", + " system.T_final = T_array[-1]\n", + " return Series(T_array, index=t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "efficient-sheffield", + "metadata": {}, + "source": [ + "The first two lines unpack the system variables.\n", + "`t_array` is a NumPy array of time stamps.\n", + "`T_array` is and array of the corresponding temperatures.\n", + "The result is a Pandas `Series`.\n", + "\n", + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "id": "steady-customs", + "metadata": {}, + "outputs": [], + "source": [ + "coffee2 = make_system(T_init=90, r=r_coffee2, \n", + " volume=300, t_end=30)\n", + "results2 = run_analysis(coffee2)" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "id": "suspected-birthday", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "70.0" + ] + }, + "execution_count": 206, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee2.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "alpha-casino", + "metadata": {}, + "source": [ + "The final temperature is 70 °C, as it should be. In fact, the results\n", + "are identical to what we got by simulation, with a small difference due to rounding." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "laden-lloyd", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)\n", + "results = run_simulation(coffee, change_func)" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "id": "mighty-imperial", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 209, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import allclose\n", + "\n", + "allclose(results, results2)" + ] + }, + { + "cell_type": "markdown", + "id": "common-profile", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "greatest-warrant", + "metadata": {}, + "source": [ + "**Exercise:** Use `root_scalar` to estimate `r_milk`, given that it starts at 5 °C and reaches 20 °C after 15 minutes. \n", + "\n", + "1. Write an error function that takes a possible value of `r`, runs a simulation, and returns the difference between `T_final` and 20 °C.\n", + "\n", + "2. Try your error function and find two values of `r` that bracket a root.\n", + "\n", + "3. Use `root_scalar` to compute `r_milk`.\n", + "\n", + "4. Run the simulation with the computed value and confirm that `T_final` is 20 °C." + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "id": "powered-deficit", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def error_func2(r):\n", + " system = make_system(T_init=5, volume=50, r=r, t_end=15)\n", + " run_simulation(system, change_func)\n", + " return system.T_final - 20" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "id": "after-novelty", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-1.500149245609034" + ] + }, + "execution_count": 218, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "error_func2(r=0.1)" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "id": "universal-steel", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.4018656744898585" + ] + }, + "execution_count": 219, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "error_func2(r=0.2)" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "id": "frequent-albuquerque", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 9\n", + " iterations: 8\n", + " root: 0.13296078935466452" + ] + }, + "execution_count": 220, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "res = root_scalar(error_func2, bracket=[0.1, 0.2])\n", + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "id": "future-pregnancy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "r_milk = res.root" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "id": "arctic-wireless", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19.999999999999996" + ] + }, + "execution_count": 224, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "milk = make_system(T_init=5, volume=50, r=r_milk, t_end=15)\n", + "results = run_simulation(milk, change_func)\n", + "milk.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-kingdom", + "metadata": {}, + "source": [ + "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "id": "twenty-andrew", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.14267107756641806" + ] + }, + "execution_count": 229, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "milk = make_system(T_init=5, volume=50, r=0, t_end=15)\n", + "milk.T_final = 20\n", + "r_milk2 = compute_r(milk)\n", + "r_milk2" + ] + }, + { + "cell_type": "code", + "execution_count": 230, + "id": "automated-premium", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "milk2 = make_system(T_init=5, volume=50, r=r_milk2, t_end=15)\n", + "results2 = run_analysis(milk2)" + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "id": "naughty-communication", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20.0" + ] + }, + "execution_count": 231, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "milk2.T_final" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "id": "architectural-hierarchy", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 232, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "from numpy import allclose\n", + "\n", + "allclose(results, results2)" + ] + }, + { + "cell_type": "markdown", + "id": "regulated-liberty", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", + "\n", + "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "significant-corps", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# A refrigerator keeps the milk at a constant temperature,\n", + "# so it is like a container with r = 0.\n", + "\n", + "# With T_init=5 and r_milk = 0, \n", + "# it is best to add the milk at the beginning." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "vocal-illinois", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 0c96f2bbb2d09e6238d9f3a6e43f367102828937 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 31 Jan 2021 20:04:07 -0500 Subject: [PATCH 023/144] Revising chapters --- jupyter/chap15.ipynb | 656 ++++++++++++++++++++---- jupyter/chap16.ipynb | 828 ++++++------------------------ jupyter/chap17.ipynb | 665 ++++++++++++++++++++++++ jupyter/chap18.ipynb | 869 +++++++++++++++++++++++++++++++ jupyter/modsim.py | 1153 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 3390 insertions(+), 781 deletions(-) create mode 100644 jupyter/chap17.ipynb create mode 100644 jupyter/chap18.ipynb create mode 100644 jupyter/modsim.py diff --git a/jupyter/chap15.ipynb b/jupyter/chap15.ipynb index fc9b5f85..cd848e13 100644 --- a/jupyter/chap15.ipynb +++ b/jupyter/chap15.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "third-grass", + "id": "located-subscription", "metadata": {}, "source": [ "# Chapter 15" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "driving-terrain", + "id": "american-article", "metadata": { "tags": [ "remove-cell" @@ -27,7 +27,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "administrative-process", + "id": "adjusted-motivation", "metadata": { "tags": [ "remove-cell" @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "willing-twist", + "id": "italic-murder", "metadata": {}, "source": [ "So far the systems we have studied have been physical in the sense that they exist in the world, but they have not been physics, in the sense of what physics classes are usually about. In the next few chapters, we'll do some physics, starting with **thermal systems**, that is, systems where the temperature of objects changes as heat transfers from one to another." @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "graduate-yahoo", + "id": "honey-rolling", "metadata": {}, "source": [ "## The coffee cooling problem\n", @@ -68,8 +68,14 @@ "\n", "Here is my version of the problem:\n", "\n", - "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?\n", - "\n", + "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?" + ] + }, + { + "cell_type": "markdown", + "id": "appreciated-ukraine", + "metadata": {}, + "source": [ "To help answer this question, I made a trial run with the milk and\n", "coffee in separate containers and took some measurements (not really):\n", "\n", @@ -92,7 +98,7 @@ }, { "cell_type": "markdown", - "id": "technological-invention", + "id": "juvenile-republican", "metadata": {}, "source": [ "## Temperature and heat\n", @@ -111,9 +117,14 @@ "\n", "$$Q = C~\\Delta T$$ \n", "\n", - "where $Q$ is the\n", - "amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the **thermal mass** of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C).\n", - "\n", + "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the **thermal mass** of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." + ] + }, + { + "cell_type": "markdown", + "id": "purple-edward", + "metadata": {}, + "source": [ "For objects made primarily from one material, thermal mass can be\n", "computed like this: \n", "\n", @@ -140,7 +151,7 @@ }, { "cell_type": "markdown", - "id": "hidden-sandwich", + "id": "running-metropolitan", "metadata": {}, "source": [ "## Heat transfer\n", @@ -150,8 +161,7 @@ "\n", "- Conduction: When objects at different temperatures come into\n", " contact, the faster-moving particles of the higher-temperature\n", - " object transfer kinetic energy to the slower-moving particles of the\n", - " lower-temperature object.\n", + " object transfer kinetic energy to the slower-moving particles of the lower-temperature object.\n", "\n", "- Convection: When particles in a gas or liquid flow from place to\n", " place, they carry heat energy with them. Fluid flows can be caused\n", @@ -162,8 +172,14 @@ "- Radiation: As the particles in an object move due to thermal energy,\n", " they emit electromagnetic radiation. The energy carried by this\n", " radiation depends on the object's temperature and surface properties\n", - " (see ).\n", - "\n", + " (see )." + ] + }, + { + "cell_type": "markdown", + "id": "convertible-alabama", + "metadata": {}, + "source": [ "For objects like coffee in a car, the effect of radiation is much\n", "smaller than the effects of conduction and convection, so we will ignore it.\n", "\n", @@ -172,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "precious-phone", + "id": "expected-implementation", "metadata": {}, "source": [ "## Newton's law of cooling\n", @@ -182,8 +198,14 @@ "\n", "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", "\n", - "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment.\n", - "\n", + "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." + ] + }, + { + "cell_type": "markdown", + "id": "educated-accommodation", + "metadata": {}, + "source": [ "Newton's so-called \"law \" is really a model: it is a good approximation in some conditions and less good in others.\n", "\n", "For example, if the primary mechanism of heat transfer is conduction,\n", @@ -203,20 +225,20 @@ }, { "cell_type": "markdown", - "id": "complex-statement", + "id": "determined-seventh", "metadata": {}, "source": [ "## Implementation\n", "\n", "To get started, let's forget about the milk temporarily and focus on the coffee. \n", "\n", - "Here's a `System` object that contains the parameters of the system:" + "Here's a function that takes the parameters of the system and makes a `System` object:" ] }, { "cell_type": "code", "execution_count": 2, - "id": "advisory-stations", + "id": "geological-graph", "metadata": {}, "outputs": [], "source": [ @@ -224,6 +246,7 @@ "\n", "def make_system(T_init, volume, r, t_end):\n", " return System(T_init=T_init,\n", + " T_final=T_init,\n", " volume=volume,\n", " r=r,\n", " t_end=t_end,\n", @@ -232,10 +255,18 @@ " dt=1)" ] }, + { + "cell_type": "markdown", + "id": "further-allen", + "metadata": {}, + "source": [ + "The values of `T_init`, `volume`, and `t_end` come from the statement of the problem:" + ] + }, { "cell_type": "code", "execution_count": 3, - "id": "simple-shelter", + "id": "eastern-alignment", "metadata": {}, "outputs": [], "source": [ @@ -244,32 +275,30 @@ }, { "cell_type": "markdown", - "id": "legal-shift", + "id": "corrected-cross", "metadata": {}, "source": [ - "The values of `volume`, `T_env`, and `t_end` come from the statement of the problem. I chose the value of `r` arbitrarily for now; we will\n", - "figure out how to estimate it soon.\n", + "I chose the value of `r` arbitrarily for now; we will figure out how to estimate it soon.\n", + "\n", + "In addition, `make_system` sets the temperature of the environment, `T_env`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", "\n", - "`dt` is the time step we use to simulate the cooling process. Strictly\n", - "speaking, Newton's law is a differential equation, but over a short\n", - "period of time we can approximate it with a difference equation:\n", + "Strictly speaking, Newton's law is a differential equation, but over a short period of time we can approximate it with a difference equation:\n", "\n", "$$\\Delta T = -r (T - T_{env}) dt$$ \n", "\n", - "where $dt$ is a small time step and\n", - "$\\Delta T$ is the change in temperature during that time step.\n", + "where $dt$ is the time step and $\\Delta T$ is the change in temperature during that time step.\n", "\n", "Note: I use $\\Delta T$ to denote a change in temperature over time, but in the context of heat transfer, you might also see $\\Delta T$ used to denote the difference in temperature between an object and its\n", "environment, $T - T_{env}$. To minimize confusion, I avoid this second\n", "use.\n", "\n", - "Now we can write an update function:" + "The following function takes the current temperature, `T`, the current time `t`, and a `System` object, and computes the change in temperature during a time step:" ] }, { "cell_type": "code", "execution_count": 4, - "id": "organic-morrison", + "id": "vulnerable-sarah", "metadata": {}, "outputs": [], "source": [ @@ -280,19 +309,16 @@ }, { "cell_type": "markdown", - "id": "manufactured-alfred", + "id": "unknown-programming", "metadata": {}, "source": [ - "Like previous update functions, this one takes a `State` object, a time,\n", - "and a `System` object.\n", - "\n", - "Now if we run" + "We can test it with the initial temperature of the coffee, like this:" ] }, { "cell_type": "code", "execution_count": 5, - "id": "olympic-bailey", + "id": "killing-tragedy", "metadata": {}, "outputs": [ { @@ -312,46 +338,44 @@ }, { "cell_type": "markdown", - "id": "synthetic-montana", + "id": "geographic-female", "metadata": {}, "source": [ - "we see that the temperature after one minute is 89.3 °C, so the\n", - "temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", + "With `dt=1` minute, the temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", "\n", - "Here's a version of `run_simulation` that simulates a series of time\n", - "steps from `t_0` to `t_end`:" + "Now here's a version of `run_simulation` that simulates a series of time steps from `t_0` to `t_end`:" ] }, { "cell_type": "code", "execution_count": 6, - "id": "synthetic-danish", + "id": "basic-extra", "metadata": {}, "outputs": [], "source": [ "from modsim import linrange\n", - "from pandas import Series\n", - "from numpy import empty\n", + "from modsim import TimeSeries\n", "\n", "def run_simulation(system, change_func):\n", " t_array = linrange(system.t_0, system.t_end, system.dt)\n", " n = len(t_array)\n", " \n", - " T_array = empty(n)\n", - " T_array[0] = system.T_init\n", + " series = TimeSeries(index=t_array)\n", + " series.iloc[0] = system.T_init\n", " \n", " for i in range(n-1):\n", " t = t_array[i]\n", - " T = T_array[i]\n", - " T_array[i+1] = T + change_func(T, t, system)\n", + " T = series.iloc[i]\n", + " series.iloc[i+1] = T + change_func(T, t, system)\n", " \n", - " system.T_final = T_array[-1]\n", - " return Series(T_array, index=t_array)" + " system.t_end = t_array[-1]\n", + " system.T_final = series.iloc[-1]\n", + " return series" ] }, { "cell_type": "markdown", - "id": "finite-paraguay", + "id": "voluntary-velvet", "metadata": {}, "source": [ "This function is similar to previous versions of `run_simulation`.\n", @@ -365,7 +389,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "virtual-notebook", + "id": "after-championship", "metadata": {}, "outputs": [], "source": [ @@ -374,7 +398,7 @@ }, { "cell_type": "markdown", - "id": "impressed-provincial", + "id": "consecutive-party", "metadata": {}, "source": [ "The result is a `TimeSeries` with one row per time step. " @@ -383,18 +407,19 @@ { "cell_type": "code", "execution_count": 8, - "id": "realistic-imagination", + "id": "proof-guard", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "26.0 74.362934\n", - "27.0 73.839305\n", - "28.0 73.320912\n", - "29.0 72.807702\n", - "30.0 72.299625\n", - "dtype: float64" + "Time\n", + "0.0 90.000000\n", + "1.0 89.320000\n", + "2.0 88.646800\n", + "3.0 87.980332\n", + "4.0 87.320529\n", + "Name: Quantity, dtype: float64" ] }, "execution_count": 8, @@ -403,13 +428,58 @@ } ], "source": [ - "results.tail()" + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "limiting-legislation", + "metadata": {}, + "source": [ + "Here's what the results look like." ] }, { "cell_type": "code", "execution_count": 9, - "id": "seven-poker", + "id": "expected-company", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results.plot(label='coffee')\n", + "\n", + "decorate(xlabel='Time (minute)',\n", + " ylabel='Temperature (C)',\n", + " title='Coffee Cooling')" + ] + }, + { + "cell_type": "markdown", + "id": "alien-score", + "metadata": {}, + "source": [ + "The temperature after 30 minutes is 72.3 °C, which is a little higher than what's stated in the problem, 70 °C. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "protecting-picture", "metadata": {}, "outputs": [ { @@ -418,7 +488,7 @@ "72.2996253904031" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -429,74 +499,390 @@ }, { "cell_type": "markdown", - "id": "seven-costume", + "id": "tight-operation", "metadata": {}, "source": [ - "The temperature after 30 minutes is 72.3 °C, which is a little higher than stated in the problem, 70 °C. " + "By trial and error, we could find the value of `r` where the final temperature is precisely 70 °C.\n", + "But it is more efficient to use a root-finding algorithm." ] }, { "cell_type": "markdown", - "id": "acoustic-provider", + "id": "equipped-blackberry", "metadata": {}, "source": [ - "We can adjust `r` and find the right value by trial and error, but we'll see a better way in the next chapter." + "## Finding roots\n", + "\n", + "The SciPy library provides a function called `root_scalar` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", + "\n", + "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", + "\n", + "A **root** is a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", + "\n", + "I'll use this example to demonstrate `root_scalar`. First, we have to\n", + "write a function that evaluates $f$:" ] }, { "cell_type": "code", - "execution_count": 10, - "id": "demanding-spending", + "execution_count": 11, + "id": "round-budapest", + "metadata": {}, + "outputs": [], + "source": [ + "def func(x):\n", + " return (x-1) * (x-2) * (x-3)" + ] + }, + { + "cell_type": "markdown", + "id": "injured-limitation", + "metadata": {}, + "source": [ + "Now we call `root_scalar` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "regulated-cloud", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA2oUlEQVR4nO3dd3hVVdbA4d9KgdBrQEIHKdLB0CWhN2liA0fENogjIuDYRr+xjzo0FQRFQbGBiAqiCEGkI0hAegudAEII0lsS1vfHPTgRk3BJcnNL1vs898k9+559zjpczcreZ5+9RVUxxhhjfE2QtwMwxhhj0mIJyhhjjE+yBGWMMcYnWYIyxhjjkyxBGWOM8UmWoIwxxvgkS1DGZJKIPCwih0XktIiUEJGWIhLnbPfydnzuEJHWIhKfanuTiLT2XkTG/I8lKJOrichdIhLrJJVDIvKDiNzkRr1QYBTQUVULqmoi8BIw1tmekc1x5hGRF5wEeEZE9ojIJBGplJ3nUdXaqrowO49pTGZZgjK5logMA94E/gOUBioA44CeblQvDYQBm1KVVbxiOztNB3oAdwFFgPrAaqCdh85njNdZgjK5kogUwdXieURVv1bVM6qapKqzVPUJZ5+8IvKmiBx0Xm86ZdWBbc6hjovITyKyE6gCzHJaY3lFpIiITHRaZgdE5BURCU4Vw/0iskVEfheRuSJSMZ1Y2wMdgJ6qukpVk1X1hKq+o6oTnX0iRORbETkmIjtE5O+p6qd5Hemca49zPpwW2zQR+VhETjndf5Gp9m0kIr86n30pIl+IyCuZ/1aM+TNLUCa3ao6rBfRNBvs8CzQDGuBqsTQBnlPV7UBtZ5+iqtpWVasC+4DuThffBWAykAxcDzQEOgIPAjj3qP4F9AbCgSXAlHTiaA/8oqr7M4h1ChAPRAC3Af8RkcutqzSvI4NjpdYDmAoUBb4Fxjrx58H1b/cRUNw5/y1uHtMYt1iCMrlVCeCoqiZnsM/fgJdU9YiqJgAvAv3cObiIlAa6AEOc1tkRYDTQx9nlIeA1Vd3ixPAfoEE6ragSwKEMzlUeuAl4SlXPq+pa4INUsWb6OoClqjpbVVOAT3AlOHAlvBDgbafl+TXwi5vHNMYtlqBMbpUIlBSRkAz2iQD2ptre65S5oyIQChwSkeMichx4DyiV6vO3Un12DBCgbDqxlrlKnMdU9dQVsZZN9Xlmr+O3VO/PAmHOv1kEcED/PNt0Ri08Y66ZJSiTW/0MnAd6ZbDPQVyJ5LIKTpk79gMXgJKqWtR5FVbV2qk+fyjVZ0VVNZ+qLk/jWD8CTUSkXAZxFheRQlfEeiAbriM9h4CyIiKpyspn8ZjG/IklKJMrqeoJ4N/AOyLSS0Tyi0ioiHQRkf86u00BnhORcBEp6ez/qZvHPwTEACNFpLCIBIlIVRGJdnZ5F3hGRGqDa9CGiNyezrF+BOYB34jIjSISIiKFRGSgiNzv3JtaDrwmImEiUg94APgsq9eRgZ+BFGCQE09PXPe2jMk2lqBMrqWqo4BhuAYMJOBq1QwCZji7vALEAuuBDcAap8xd9wB5gM3A77iGipdxzv0N8AYwVUROAhtx3bNKz23AbOAL4ISzfySu1hVAX6ASrpbRN8Dzqjovm67jL1T1Iq4BHg8Ax4G7ge9wtRqNyRZiCxYaY7KDiKwE3lXVD70diwkM1oIyxmSKiESLyHVOF19/oB4wx9txmcCR0QgmY4zJSA1gGlAQ2Anc5tx7MyZbWBefMcYYn2RdfMYYY3xSQHXxlSxZUitVquTtMIwxxlyD1atXH1XV8CvLAypBVapUidjYWG+HYYwx5hqIyN60yq2LzxhjjE+yBGWMMcYnWYIyxhjjkwLqHpQxxviipKQk4uPjOX/+vLdD8aqwsDDKlStHaGioW/tbgjLGGA+Lj4+nUKFCVKpUiT9PAJ97qCqJiYnEx8dTuXJlt+p4tItPRB4TkY3OUtFDnLLiIjJPROKcn8XSqdtZRLY5y1c/7ck4jTHGk86fP0+JEiVybXICEBFKlChxTa1IjyUoEakD/B3XFPz1gW4iUg14GpivqtWA+c72lXWDgXdwze5cC+grIrU8Fasxxnhabk5Ol13rv4EnW1A3ACtU9ayzpPUi4BagJzDZ2WcyaS8Y1wTYoaq7nGn9pzr1PObA8XNMXx2PTf1kjDG+wZMJaiMQJSIlRCQ/0BXXipulL08o6fwslUbdsvx5+eh40l4KGxEZICKxIhKbkJCQ6WAnL9/DP79cx0OfrOboaVvSxhiTOyUkJNC0aVMaNmzIkiVL+PLLL7nhhhto06ZNjsfisQSlqltwLcg2D9cU/OuAZDerp9UOTLNpo6oTVDVSVSPDw/8yU4bbnupck391rcnCbQl0Gr2YmE2/ZfpYxhjjr+bPn0/NmjX59ddfadWqFRMnTmTcuHEsWLAgx2Px6CAJVZ2oqo1UNQo4BsQBh0WkDIDz80gaVeNxtbYuK4drpVCPCQ4SBkRVZdajN1G6cBgDPlnNE1+u49T5JE+e1hhjcsTHH39MvXr1qF+/Pv369WPv3r20a9eOevXq0a5dO/bt28fatWt58sknmT17Ng0aNODFF19k6dKlDBw4kCeeeIKUlBSeeOIJGjduTL169Xjvvff+OP7w4cP/KH/++eezJWaPDjMXkVKqekREKuBaHro5UBnoD7zu/JyZRtVVQDURqQwcAPoAd3ky1stqXFeIGY+05O35cYxbuIPlOxMZeUd9mlUpkROnN8YEuBdnbWLzwZPZesxaEYV5vnvtdD/ftGkTr776KsuWLaNkyZIcO3aM/v37c88999C/f38mTZrE4MGDmTFjBi+99BKxsbGMHTsWgAULFjBixAgiIyOZMGECRYoUYdWqVVy4cIGWLVvSsWNH4uLiiIuL45dffkFV6dGjB4sXLyYqKipL1+XpmSS+EpHNwCzgEVX9HVdi6iAicUAHZxsRiRCR2QDOoIpBwFxgCzBNVTd5ONY/5AkJ4p+davDlwBaEBgt931/BK99t5nxSSk6FYIwx2eann37itttuo2TJkgAUL16cn3/+mbvucv3d369fP5YuXXrV48TExPDxxx/ToEEDmjZtSmJiInFxccTExBATE0PDhg1p1KgRW7duJS4uLstxe7QFpaqt0ihLBNqlUX4Q10CKy9uzgdmejO9qbqxYjNmPteI/s7fwwdLdLNqewOg7G1CnbBFvhmWM8WMZtXQ8RVWvOsTbnSHgqsqYMWPo1KnTn8rnzp3LM888w0MPPZSlOK9kc/FdRf48IbzSqy6T72/CyfNJ9HpnGWPmx5GccsnboRljjFvatWvHtGnTSExMBODYsWO0aNGCqVOnAvDZZ59x0003XfU4nTp1Yvz48SQlue7Nb9++nTNnztCpUycmTZrE6dOnAThw4ABHjqQ1vODa2FRHboquHs7cIVH8e+YmRs7bzvytRxh1R32qhBf0dmjGGJOh2rVr8+yzzxIdHU1wcDANGzbk7bff5v7772f48OGEh4fz4YcfXvU4Dz74IHv27KFRo0aoKuHh4cyYMYOOHTuyZcsWmjdvDkDBggX59NNPKVUqraeI3CeB9GBqZGSk5sSChbPWHeT/Zm7kfFIKT3euyT3NKxEUZE+JG2PStmXLFm644QZvh+ET0vq3EJHVqhp55b7WxZcJ3etHEDMkiuZVSvDCrM3cPXEl8b+f9XZYxhgTUCxBZVKpwmFMurcxr/euy7r9x+n85hKmrdpvUyUZY0w2sQSVBSJCnyYVmDMkijplC/PkV+t5cHIsR07l7jVfjDF/ZX+8Xvu/gSWobFC+eH4+f7AZ/+5Wi6U7jtJx9GK+W+/RiS+MMX4kLCyMxMTEXJ2kLq8HFRYW5nYdGySRzXYcOc3jX65j3f7jdK8fwUs9alOsQB6vxmSM8S5bUdclvRV10xskYQnKA5JTLvHuop28+WMcxQrk4Y1b69K2Zmlvh2WMMT7JRvHloJDgIAa1rcbMQS0pUSAP938Uy5PT13HSJp41xhi3WYLyoNoRRZg5qCX/aF2V6avj6Tx6MUvjjno7LGOM8QuWoDwsb0gwT3auyVcPtyAsTzB3T1zJczM2cOaCu0tjGWNM7mQJKoc0rFCM2YNb8eBNlfls5T66vLWElbsSvR2WMcb4LEtQOSgsNJjnutXiiwHNEYE+76/gxVmbOHfRlvEwxpgrWYLygiaVi/PDY63o16wiHy7bQ9e3l7B67+/eDssYY3yKJSgvyZ8nhJd61uHzB5tyMfkSt7+7nNd+2GKLIhpjjMMSlJe1uL4kc4a04s7G5Xlv0S66j1nK+vjj3g7LGGO8zhKUDygUFsprvevx0X2NOXU+mVvGLWf43K1cSLbWlDEm97IE5UNa1yjF3KFR9G5YlncW7KTHmGVsiD/h7bCMMcYrPJqgRGSoiGwSkY0iMkVEwkTkCxFZ67z2iMjadOruEZENzn7en78ohxTJF8rw2+vz4b2NOX7uIr3GLWPE3G3WmjLG5DoeS1AiUhYYDESqah0gGOijqneqagNVbQB8BXydwWHaOPv+ZY6mQNemZilihkTTq0FZxi7YQY8xy9h4wFpTxpjcw9NdfCFAPhEJAfIDf6xBISIC3AFM8XAMfqtI/lBG3lGfSfdG8vvZi/R8ZxmjYrZxMfmSt0MzxhiP81iCUtUDwAhgH3AIOKGqMal2aQUcVtW49A4BxIjIahEZ4Kk4/UHbmqWZNzSanvUjePunHfQYu9RaU8aYgOfJLr5iQE+gMhABFBCRu1Pt0peMW08tVbUR0AV4RESi0jnPABGJFZHYhISEbIre9xTJH8qoOxvwwT2RJJ65SK93ljFq3nZrTRljApYnu/jaA7tVNUFVk3Dda2oB4HT59Qa+SK+yqh50fh4BvgGapLPfBFWNVNXI8PDwbL4E39O+VmnmDY2ie/0I3p4fZ60pY0zA8mSC2gc0E5H8zv2mdsAW57P2wFZVjU+roogUEJFCl98DHYGNHozVrxTNn4fRdzbgfac11fOdZYyMsZF+xpjA4sl7UCuB6cAaYINzrgnOx324ontPRCJEZLazWRpYKiLrgF+A71V1jqdi9VcdnNZUzwYRjPlph81CYYwJKLbke4D4aeth/vX1RhJOX2BAVBUea1eNsNBgb4dljDFXZUu+B7i2NUszd2gUtzYqy/iFO+k2Zim/7rMZ0o0x/ssSVAApki+U/95Wn8n3N+HMhWRuHb+c12bbDOnGGP9kCSoARVcPJ2ZoFHc2rsB7i3fR9a0lrN57zNthGWPMNbEEFaBcM6TX5dMHmnIh+RK3vfszL83azNmLyd4OzRhj3GIJKsDdVK0kc4dGcXfTikxatpvOby5h+c6j3g7LGGOuyhJULlAwbwgv96rD1AHNEIG73l/Js99s4NT5JG+HZowx6bIElYs0q1KCOY9F8fdWlZnyyz46jV7Mgm1HvB2WMcakyRJULpMvTzDP3lyL6Q+3IH/eEO77cBWPT1vH8bMXvR2aMcb8iSWoXKpRhWJ8P/gmHm17PTPWHqDD6MXM2fibt8Myxpg/WILKxfKGBPN4xxrMfKQl4QXzMvDT1Tzy+RqOnr7g7dCMMcYSlIE6ZYswc1BL/tmxOvM2HabDqEXMXHuAQJoGyxjjfyxBGQBCg4MY1LYa3w++iYolCvDY1LU8ODmWQyfOeTs0Y0wuZQnK/Em10oX46uEW/F+3WizfmUiHUYv5dMVeLl2y1pQxJmdZgjJ/ERwkPHBTZeYOiaJ++SI8N2Mjfd9fwe6jZ7wdmjEmF7EEZdJVoUR+Pn2gKW/cWpfNh07S+c3FvLdoJ8kptsy8McbzLEGZDIkIdzauwI/DoomuHs5rP2zllnHL2XzwpLdDM8YEOEtQxi2lC4fxXr8beeeuRhw6cY4eY5faMvPGGI+yBGXcJiLcXK8M84ZG08NZZt6W8jDGeIolKHPNihXIw6g7GvDRfY05n+RayuP5mRs5fcGW8jDGZB9LUCbTWtcoxdyhUfRvXomPV+yl46hF/LT1sLfDMsYECI8mKBEZKiKbRGSjiEwRkTAReUFEDojIWufVNZ26nUVkm4jsEJGnPRmnybyCeUN4oUdtpg90TT57/0exDJ7yK4k2XZIxJovEU9PZiEhZYClQS1XPicg0YDZQCTitqiMyqBsMbAc6APHAKqCvqm7O6JyRkZEaGxubTVdgrtWF5BTGL9zJOwt2UDBvCP/XrRa3NCyLiHg7NGOMDxOR1aoaeWW5p7v4QoB8IhIC5AcOulmvCbBDVXep6kVgKtDTQzGabJI3JJgh7avz/eBWVCpZgGHT1tH/w1XsP3bW26EZY/yQxxKUqh4ARgD7gEPACVWNcT4eJCLrRWSSiBRLo3pZYH+q7Xin7C9EZICIxIpIbEJCQjZegcms6qULMX1gC17oXovYPcfoOHoxE5fuJsWmSzLGXAOPJSgn8fQEKgMRQAERuRsYD1QFGuBKXCPTqp5GWZq/3VR1gqpGqmpkeHh4doRuskFwkHBvy8rMGxZN0yrFefm7zfQev5ytv9kDvsYY93iyi689sFtVE1Q1CfgaaKGqh1U1RVUvAe/j6s67UjxQPtV2OdzvHjQ+pGzRfHx4b2Pe6tOA/cfO0u3tpYyYu43zSfaArzEmY55MUPuAZiKSX1x3ydsBW0SkTKp9bgE2plF3FVBNRCqLSB6gD/CtB2M1HiQi9GxQlh+HRdOjfgRjF7ge8F2xK9HboRljfJgn70GtBKYDa4ANzrkmAP8VkQ0ish5oAwwFEJEIEZnt1E0GBgFzgS3ANFXd5KlYTc4oXiAPo+5swCcPNCHp0iX6TFjBU9PXc+JskrdDM8b4oAyHmYtIOVytl1a47iOdw9Xi+R74wemm8xk2zNx/nLuYwps/bueDpbsplj8PL/Soxc11y9iQdGNyoWseZi4iHwKTgIvAG0Bf4B/Aj0BnYKmIRHkmXBPo8uUJ5pmuNzDzkZaUKRLGoM9/5cHJsRw4biv4GmNc0m1BiUgdVU3r/tDlz/MAFVR1h6eCu1bWgvJPySmX+Gj5HkbGbCdI4J+danBP80oEB1lrypjcIDMP6h4WkVppHKi2iISr6kVfSk7Gf4UEB/FgqyrEDI0islJxXpxlQ9KNMRknqDFAWg8WlQPe8kw4JjcrXzw/H93nGpIe7wxJf2POVhuSbkwulVGCqquqi64sVNW5QD3PhWRys9RD0m9pWJbxC3fScfRilsTZLCHG5DYZJajQTH5mTJYVK5CH4bfX5/O/NyU4SOg38ReGTP2VozZLujG5RkYJKi6tpTBEpAuwy3MhGfM/LaqW5IfHWjG47fV8v+EQ7UctYtqq/XhqFn5jjO/IaBRfdeA7YDmw2imOBJoD3VR1e45EeA1sFF9gizt8in99s4FVe36nWZXivHpLXaqGF/R2WMaYLLrmUXxOAqoLLMK1hlMl5309X0xOJvBVK12ILwY057Xeddl08CRd3lzCWz/GcSHZBlEYE4gyakGJXqUfxZ19cpK1oHKPI6fO89KszXy3/hBVwwvwWu96NKlc3NthGWMyITPPQS0QkUdFpMIVB8ojIm1FZDLQP7sDNcYdpQqFMfauRnx4X2POJ13ijvd+5qnp6zl+9qK3QzPGZJOMElRnIAWYIiIHRWSziOwG4nBNezRaVT/KgRiNSVebGqWYNyyKAVFVmL4mnnYjF/H1mngbRGFMAMhwstg/dhIJBUoC51T1uKeDyizr4svdNh88yb++2cDa/cdpUbUEr/SqQxUbRGGMz8tMF98fVDVJVQ/5cnIyplZEYb56uAUv96rDhgMn6PyWDaIwxp95csFCY3JccJDQr1lF5g+LpmOt0oz+cTtd3lrCzzttcURj/I0lKBOQShV2DaL46L7GJKVcou/7K3h82jqOnbFBFMb4C7cSlIhUFJH2zvt8IlLIs2EZkz1a1yhFzJBo/tG6KjPXHqDdyIVMi7WZKIzxB1dNUCLyd1xLt7/nFJUDZngwJmOyVb48wTzZuSbfD25F1fCCPDl9PXdOWEHc4VPeDs0YkwF3WlCPAC2BkwCqGgeU8mRQxnhCjesKMe2h5rzeuy7bD5+iy1tL+O+crZy7aIMojPFF7iSoC6r6R8e9iIQAbvWPiMhQEdkkIhtFZIqIhInIcBHZKiLrReQbESmaTt09IrJBRNaKiI0dN9kiKEjo06QC84dF06thWcYt3EmH0YtYsPWIt0MzxlzBnQS1SET+BeQTkQ7Al8Csq1USkbLAYCBSVesAwUAfYB5QR1XrAduBZzI4TBtVbZDW+HhjsqJEwbyMuL0+Uwc0Iyw0mPs+WsXDn67m0Ilz3g7NGONwJ0E9BSQAG4CHgNnAc24ePwRXYgsB8gMHVTVGVZOdz1fguqdljFc0q1KC2YNb8USnGvy09QjtRy5i4tLdJKdc8nZoxuR6Gc4kISJBwHqnBXTtBxd5DHgVOAfEqOrfrvh8FvCFqn6aRt3dwO+4uhPfU9UJ6ZxjADAAoEKFCjfu3bs3M6Eaw77Es/z7240s3JZArTKF+U/vujQoX9TbYRkT8DI1k4SqXgLWXTlhrJsnLAb0BCoDEUABEbk71efPAsnAZ+kcoqWqNgK6AI+ISFQ6MU5Q1UhVjQwPD7/WMI35Q4US+fnw3saM/1sjEs9c4JZxy3huxgZOnEvydmjG5ErudPGVATaJyHwR+fbyy4167YHdqpqgqknA10ALABHpD3QD/pbech2qetD5eQT4BmjixjmNyRIRoUvdMvw4LJr7WlTm85X7aDdyoU1Aa4wXhLixz4uZPPY+oJmI5MfVxdcOiBWRzrjua0Wr6tm0KopIASBIVU857zsCL2UyDmOuWaGwUP7dvRa9G5XluRkbGTZtHV+s2s8rvepQrbQ9p25MTnBrNvNMH1zkReBOXF15vwIPApuAvMDlydFWqOpAEYkAPlDVriJSBVerCVxJ9HNVffVq57PZzI0nXLqkfBG7n9d/2MqZC8k82KoKg9tdT/487vx9Z4y5mvTuQV01QYnIKf733FMeIBQ4o6qFsz3KLLIEZTwp8fQFXv9hK1+ujqds0Xw8370WHWqVRkS8HZoxfi3Ty22oaiFVLey8woBbgbGeCNIYX1aiYF6G316fLwc2p2DeEAZ8spoHJ8ey/1iaPdXGmCy65tnMVXUG0Db7QzHGPzSuVJzvBt/Es11v4OddiXQYvYh3FuywdaeMyWZX7UQXkd6pNoOASNyc6siYQBUaHMTfo6rQrX4ZXv5uM8PnbuOrNfG83LMOLa8v6e3wjAkI7rSguqd6dQJO4Xq+yZhcr0yRfIz72418eF9jklOUv32wkken/MpvJ857OzRj/J47w5A+UNVlqQtEpCVgs2sa42hToxTNh5bg3UU7GbdwJz9tOczQDtXp36ISocG2LqgxmeHO/zlj3CwzJlcLCw1mSPvqzBsaRZPKxXnl+y10e3spv+w+5u3QjPFL6bagRKQ5rpkfwkVkWKqPCuOamdwYk4aKJQow6d7GzNt8mBdnbeaO936md6OyPNPlBsIL5fV2eMb4jYxaUHmAgriSWKFUr5PAbZ4PzRj/JSJ0rH0dPw6L5pE2VZm17iBtRy5k8vI9pFyyMUbGuMOdB3UrqqpfTBFuD+oaX7Uz4TTPz9zE0h1HqR1RmJd71aFRhWLeDssYn5DpB3WBs84quLNF5KfLLw/EaEzAqhpekE8eaMLYuxpy9PQFeo9bzlPT15N4+oK3QzPGZ7mToD4DtuJaNuNFYA+wyoMxGROQRIRu9SKY/3hrBkRV4as18bQduYhPfrZuP2PS4k6CKqGqE4EkVV2kqvcDzTwclzEBq2DeEP7V9QZ+eKwVtcoU5v9mbqLnO0tZvfd3b4dmjE9xJ0FdXq3tkIjcLCINsWXajcmyaqUL8fnfmzKmb0OOnrrIreOX88SX6zhq3X7GAO49qPuKiBQBHsf1/FNhYKhHozImlxARutePoG3NUrz9UxwTl+xm7qbfeLxjDf7WtAIh9pCvycUy/K9fRIKBaqp6QlU3qmobVb1RVd1ZUdcY46YCeUN4pssNzBkSRb1yRXn+2010H7uM2D32kK/JvTJMUKqaAvTIoViMyfWuL+Ua7ffOXY04fvYit737M8OmrSXhlHX7mdzHnS6+5SIyFvgCOHO5UFXXeCwqY3IxEeHmemVoXSOcsQt28MGSXczb5Jrbr1/zija3n8k13HlQd0EaxaqqPrcmlD2oawLRzoTTvPDtJpbEHaV66YK80KM2Larakh4mcGR6yXd/YgnKBCpVJWbzYV7+bjPxv5+jW70yPHvzDZQpks/boRmTZZmeSUJESovIRBH5wdmuJSIPuHnSoSKySUQ2isgUEQkTkeIiMk9E4pyfac73IiKdRWSbiOwQkafdOZ8xgUpE6OTM7TekfTXmbT5M2xG2kq8JbO50Zn8EzAUinO3twJCrVRKRssBgIFJV6+CaAb0P8DQwX1WrAfOd7SvrBgPvAF2AWkBfEanlRqzGBLTLS3r8OCyaqOolGT53G51GL2bBNluezQQedxJUSVWdBlwCUNVkwN0/2UKAfCISAuQHDuJajXey8/lkoFca9ZoAO1R1l6peBKZiq/ga84fyxfPzXr9IJt/fhCAR7vtwFQ9OjmVf4llvh2ZMtnEnQZ0RkRKAAohIM+DE1Sqp6gFgBLAPOAScUNUYoLSqHnL2OQSUSqN6WWB/qu14p+wvRGSAiMSKSGxCQoIbl2NM4IiuHs6cIVE83aUmy3cepf3oRYyM2ca5i9btZ/yfOwlqGPAtUFVElgEfA49erZJzb6knrklmI4ACInK3m3FJGmVpjuZQ1QmqGqmqkeHh4W4e3pjAkSckiIHRVfnp8dZ0rn0dY37aQbuRC/l+/SECaRCUyX2umqCc552ica2u+xBQW1XXu3Hs9sBuVU1Q1STga+cYh0WkDIDzM63O83igfKrtcri6B40x6biuSBhv923ItIeaUyR/Hh75fA1931/B1t9Oejs0YzLFnVF8YbgGO7yMa7mNR5yyq9kHNBOR/CIiQDtgC67WWH9nn/7AzDTqrgKqiUhlEcmDa3CFTa9kjBuaVC7Od4/exCu96rD1t1N0fWsJz8/cyPGzF70dmjHXxJ0uvo+B2rgmih2La1TdJ1erpKorgenAGmCDc64JwOtABxGJAzo424hIhIjMduomA4NwjR7cAkxT1U3XdGXG5GLBQcLdzSqy8J+tubtZRT5ZsZc2Ixby2cq9tvaU8RvuzCSxTlXrX63MF9iDusakbcuhk7zw7SZW7j5G7YjCvNijNpGVins7LGOArC35/qszcu/ygZoCy7IzOGOMZ91QpjBTBzRjTN+GHDvjmoR2yNRf+e3EeW+HZky63GlBbQFq4LqnBFABV7fbJVxz8tXzaITXwFpQxlzd2YvJjF+4k/cW7yIkSHikzfU8cFNlwkKDvR2ayaUyPRefiFTM6HNV3ZvF2LKNJShj3Lcv8Syvzt7M3E2HqVA8P8/efAMda5XGNabJmJyT6S4+JwGdBIoAJS6/VHWvLyUnY8y1qVDCNRvFpw80JSw0iIc+WU2/ib+w/fApb4dmDOBeC+pl4F5gJ/97WNaW2zAmgCSnXOKzlfsYNW87py8k069ZRYa2r06R/KHeDs3kAlnp4tsG1HXmxPNplqCMyZpjZy4yat42Pl+5jyL5QhnWsQZ3NalAcJB1+xnPycoovo1A0WyPyBjjc4oXyMMrvery/eBW1LiuEP83YyM3v72EFbsSvR2ayYXcaUFF4prtYSNw4XK5qvbwbGjXzlpQxmQfVeWHjb/x6vdbOHD8HDfXLcPTXWpSvnh+b4dmAkx6LagQN+pOBt7ANRvEpewOzBjjm0SErnXL0LZmKSYs3sW4hTuYt+UwD0VVYWB0VQrkdefXhzGZ504LapGqRudQPFliLShjPOfQiXO88cNWZqw9SOnCeXmqc016NShLkN2fMlmUlUESo3B17X3Ln7v41mR3kFllCcoYz1u993demrWJdfEnaFC+KP/uXotGFYp5Oyzjx7KSoBakUWzDzI3JxS5dUr759QBvzNnKkVMX6NUggqe61KRMkXzeDs34oUwnKH9iCcqYnHXmQjLjFu7g/SW7CRbh4dZVGRBVxaZNMtck08PMRaS0iEwUkR+c7Voi8oAngjTG+JcCeUN4olNN5g+Lpk3NcEbN2067kYuYte6greZrssyd56A+wrUuU4SzvR0Y4qF4jDF+qHzx/Iz7241MHdCMwvlCeXTKr9z+7s+sjz/u7dCMH0s3QYnI5TGkJVV1Gs4Qc2cxwZQciM0Y42eaVSnBd4/exGu967In8Qw9xi5j2LS1tqyHyZSMWlC/OD/PiEgJnHn4nLWhTng6MGOMfwoOEvo2qcCCf7ZmYHRVvlt3iDYjFvL2/DjOXbS/bY37MkpQlx9uGIZriHlVEVmGawn4Rz0dmDHGvxUKC+XpLjX5MdX9qbYjFzJz7QG7P2Xcku4oPhGJB0Y5m0FAXlxJ6wKQoqqj0qzoRTaKzxjftXJXIi9/v5mNB07SsEJR/q+bPT9lXDIz1VEwUJD/taQuc2siLhGpAXyRqqgK8G+gOa4VesE1Ce1xVW2QRv09wClc97uS0wreGOM/mlYpwbeP3MRXa+L579xt9B63nJ4NIniqc00iitrzU+avMmpBrVHVRtlyEpFg4ADQNPUihyIyEjihqi+lUWcPEKmqR909j7WgjPEPZy64lp1/f8kuRGBAqyo8ZPP75VqZeQ4qOyfYagfsvCI5CXAHMCUbz2OM8QMF8obwz041mP94NB1qXcfbP+2gzYiFTIvdT8oluz9lXDJKUO2y8Tx9+GsiagUcVtW4dOooECMiq0VkQHoHFpEBIhIrIrEJCQnZFK4xJieUK5afMX0b8tXDLShbLB9PTl9P9zFLWb7T7Y4TE8A8PtWRiOQBDgK1VfVwqvLxwA5VHZlOvQhVPSgipYB5wKOqujijc1kXnzH+S1WZtf4Qb/ywlQPHz9H+htL8q2tNqoQX9HZoxsOysqJuVnUB1lyRnEKA3vx5EMWfqOpB5+cR4BugiYfjNMZ4kYjQo34E8x+P5snONVixK5GOoxfz4qxNHD970dvhGS/IiQTVl79277UHtqpqfFoVRKSAiBS6/B7oiGtFX2NMgAsLDeYfra9nwT9bc0fj8kxevofo4QuZuHQ3F5NtzdTcxKMJSkTyAx2Ar6/46C/3pEQkQkRmO5ulgaUisg7XjBbfq+ocT8ZqjPEt4YXy8p9b6jL7sVbUK1eEl7/bTKc3FzN302/2oG8uYcttGGN8nqqycHsCr36/hR1HTtOkcnGeu/kG6pUr6u3QTDbw5j0oY4zJEhGhTY1SzHmsFS/3qsPOI6fpMXYZQ6b+yoHj57wdnvEQa0EZY/zOqfNJjF+4kw+W7kaAB26qzMOtq1IoLNTboZlMsBaUMSZgFAoL5cnONVnwz9Z0rVuGcQt30mbEQj5dsZfkFBtIESgsQRlj/FbZovkYfWcDvh3UkirhBXluxkY6v7WEn7YetoEUAcASlDHG79UrV5QvBjTjvX43knJJuf+jWO6euJLNB096OzSTBZagjDEBQUToVPs6YoZG8UL3Wmw+eJKbxyzh8WnrOHTCBlL4IxskYYwJSCfOJTFu4Q4+XLYHAR5sVZmB0TaQwhfZIAljTK5SJF8oz3S5gZ8ej6ZLnet4Z8FOWg9fyCc/7yHJBlL4BUtQxpiAVq5Yft7s05BvB7WkWumC/N/MTXQavZgYm5HC51mCMsbkCvXKFWXK35vxwT2RrkUSP1nNne+tYO3+494OzaTDEpQxJtcQEdrXKs3cIVG8eksddh09Ta93ljHo8zXsP3bW2+GZK9ggCWNMrnX6QjITFu1kwpJdXLoE/ZpXZFCb6ylWII+3Q8tV0hskYQnKGJPr/XbiPG/+uJ1psfspkDeER9pcz70tKhEWGuzt0HIFG8VnjDHpuK5IGK/fWo85Q6JoUqk4r/+wlbYjFvLV6nhSLgXOH/H+xhKUMcY4qpcuxMR7GzPl780oWSgvj3+5jm5jlrJ4e4K3Q8uVLEEZY8wVmlctwYx/tGRM34acvpDEPZN+od/ElWw8cMLboeUqlqCMMSYNQUFC9/oR/Dgsmn93q8WGAyfoPnYpw75YS/zvNuIvJ9ggCWOMccOJc0m8u2gnk5buRoH+zSvySJvrKZrfRvxllY3iM8aYbHDw+DlGz9vO9DXxFMwbwj9aX899LW3EX1bk+Cg+EakhImtTvU6KyBAReUFEDqQq75pO/c4isk1EdojI056K0xhjrkVE0XwMv70+cx5zjfh7Y85WWg9fyLRV+23EXzbLkRaUiAQDB4CmwH3AaVUdcZX9twMdgHhgFdBXVTdndB5rQRljctqKXYm8/sNW1u4/TvXSBXmyU03a3VAKEfF2aH7D289BtQN2qupeN/dvAuxQ1V2qehGYCvT0WHTGGJNJzaqU4Jt/tGD83xqRlKI8+HEsd763gjX7fvd2aH4vpxJUH2BKqu1BIrJeRCaJSLE09i8L7E+1He+U/YWIDBCRWBGJTUiwZxWMMTlPROhStwwxQ6N4pVcddh09Q+9xyxn4yWp2Jpz2dnh+y+MJSkTyAD2AL52i8UBVoAFwCBiZVrU0ytLsi1TVCaoaqaqR4eHhWQ/YGGMyKTQ4iLubVWTRE60Z2r46S+IS6Dh6Mc98vYHDJ897Ozy/kxMtqC7AGlU9DKCqh1U1RVUvAe/j6s67UjxQPtV2OeCgxyM1xphsUCBvCI+1r8aiJ9vQr1lFpq/eT/TwBbwxZysnziV5Ozy/kRMJqi+puvdEpEyqz24BNqZRZxVQTUQqOy2wPsC3Ho3SGGOyWcmCeXmhR23mD2tN59rX8e6inUT9dwETFu/kfFKKt8PzeR4dxSci+XHdS6qiqiecsk9wde8psAd4SFUPiUgE8IGqdnX26wq8CQQDk1T11audz0bxGWN82aaDJ/jvnG0s2p5AmSJhDG1fnd6NyhISnLsn9bEHdY0xxkf8vDOR1+dsZd3+41xfqiBPdKpBx1qlc+3QdG8PMzfGGONwTUbbgnfvbsQlVR76ZDW3jl/Oyl2J3g7Np1iCMsYYLxAROtcpQ8yQKF7rXZcDx89x54QV3PfhL2w+eNLb4fkE6+IzxhgfcO5iCh8t38P4hTs4eT6Zng0iGNahOhVLFPB2aB5n96CMMcYPnDibxHuLdzJp2W6SU5Q+TcozuG01ShUO83ZoHmMJyhhj/MiRk+d5+6c4pv6yn5Bg4f6WlXkouipF8oV6O7RsZwnKGGP80N7EM4yat52Zaw9SJF8oD7euSv/mlciXJ3CW97AEZYwxfmzTwROMmLuNBdsSKFUoL4+1r8YdkeUJDYBnqGyYuTHG+LHaEUX48L4mfDGgGeWL5+fZbzbSftQiZq49wKUAXYfKEpQxxviRplVKMH1gcz64J5J8ocE8NnUtXd9ewvwthwmkHjGwBGWMMX5HRGhfqzSzB7firT4NOJeUwgOTY7nt3Z9ZEUAP+1qCMsYYPxUUJPRsUJYfh0Xzn1vqEv/7WfpMWEG/iSvZEH/C2+FlmQ2SMMaYAHE+KYVPft7LuIU7+P1sEl3qXMfjHatzfalC3g4tQzaKzxhjcolT55P4YMluPliyi3NJKfRuVI4h7atRrlh+b4eWJktQxhiTyySevsD4hTv5eMVeVJW+TSowqM31PjcrhSUoY4zJpQ6dOMfb83fwZaxrVor+zSsxMLoqxQrk8XZogCUoY4zJ9fYmnuHNH+OYsfYABfKE8GCryjxwU2UKhXl3+iRLUMYYYwDYfvgUo2K2M2fTbxTLH8rA6Krc48XpkyxBGWOM+ZP18ccZEbOdxdsTCC+Ul0fbXk+fxhXIE5KzTyBZgjLGGJOmX3YfY8Tcbfyy5xhli+bjsfbV6N2wLCE5NM9fjicoEakBfJGqqArwb6As0B24COwE7lPV42nU3wOcAlKA5LSCv5IlKGOMyRxVZXHcUUbGbGN9/AkqlyzAkPbV6FYvguAg8ei5vdqCEpFg4ADQFKgB/KSqySLyBoCqPpVGnT1ApKoedfc8lqCMMSZrVJV5mw8zat52tv52iuqlCzKsQ3U61b4OEc8kKm/PZt4O2Kmqe1U1RlWTnfIVQLkcisEYY8xViAgda1/H7MGtGNO3IcmXlIGfrqH72KUs2HokRyekzakE1QeYkkb5/cAP6dRRIEZEVovIAI9FZowx5i+CgoTu9SOIGRLFyNvrc+JcEvd9tIre45ezbMfRHElUHu/iE5E8wEGgtqoeTlX+LBAJ9NY0ghCRCFU9KCKlgHnAo6q6OI39BgADACpUqHDj3r17PXQlxhiTeyWlXGL66njenh/HoRPnaValOI93rEHjSsWzfGyv3YMSkZ7AI6raMVVZf2Ag0E5Vz7pxjBeA06o6IqP97B6UMcZ41vmkFKb+so+xC3Zy9PQFbr+xHMNvr5+lY6aXoEKydFT39CVV956IdAaeAqLTS04iUgAIUtVTzvuOwEs5EKsxxpgMhIUGc2/LytzZuAKfrNhDiQJ5PXYujyYoEckPdAAeSlU8FsgLzHNGhKxQ1YEiEgF8oKpdgdLAN87nIcDnqjrHk7EaY4xxX748wQyIqurRc3g0QTktpBJXlF2fzr4Hga7O+11A1tqMxhhj/JqtqGuMMcYnWYIyxhjjkyxBGWOM8UmWoIwxxvgkS1DGGGN8kiUoY4wxPskSlDHGGJ8UUAsWikgCkJXJ+EoCbi/v4YcC+foC+drArs+fBfK1QfZcX0VVDb+yMKASVFaJSKw7CyP6q0C+vkC+NrDr82eBfG3g2euzLj5jjDE+yRKUMcYYn2QJ6s8meDsADwvk6wvkawO7Pn8WyNcGHrw+uwdljDHGJ1kLyhhjjE+yBGWMMcYnWYJyiEhnEdkmIjtE5Glvx5OdRGSPiGwQkbUiEuvteLJKRCaJyBER2ZiqrLiIzBOROOdnMW/GmBXpXN8LInLA+Q7XikhXb8aYWSJSXkQWiMgWEdkkIo855QHx/WVwfX7//YlImIj8IiLrnGt70Sn32Hdn96AAEQkGtuNa/TceWAX0VdXNXg0sm4jIHiBSVQPiYUERiQJOAx+rah2n7L/AMVV93fkDo5iqPuXNODMrnet7ATitqiO8GVtWiUgZoIyqrhGRQsBqoBdwLwHw/WVwfXfg59+fuJY4L6Cqp0UkFFgKPAb0xkPfnbWgXJoAO1R1l6peBKYCPb0ck0mHqi4Gjl1R3BOY7LyfjOuXgl9K5/oCgqoeUtU1zvtTwBagLAHy/WVwfX5PXU47m6HOS/Hgd2cJyqUssD/VdjwB8h+VQ4EYEVktIgO8HYyHlFbVQ+D6JQGU8nI8njBIRNY7XYB+2QWWmohUAhoCKwnA7++K64MA+P5EJFhE1gJHgHmq6tHvzhKUi6RRFkh9ny1VtRHQBXjE6UIy/mU8UBVoABwCRno1miwSkYLAV8AQVT3p7XiyWxrXFxDfn6qmqGoDoBzQRETqePJ8lqBc4oHyqbbLAQe9FEu2U9WDzs8jwDe4ujQDzWGn///yfYAjXo4nW6nqYeeXwyXgffz4O3TuX3wFfKaqXzvFAfP9pXV9gfT9AajqcWAh0BkPfneWoFxWAdVEpLKI5AH6AN96OaZsISIFnJu1iEgBoCOwMeNafulboL/zvj8w04uxZLvLvwAct+Cn36Fzo30isEVVR6X6KCC+v/SuLxC+PxEJF5Gizvt8QHtgKx787mwUn8MZ9vkmEAxMUtVXvRtR9hCRKrhaTQAhwOf+fm0iMgVojWua/8PA88AMYBpQAdgH3K6qfjnQIJ3ra42re0iBPcBDl/v9/YmI3AQsATYAl5zif+G6T+P3318G19cXP//+RKQerkEQwbgaN9NU9SURKYGHvjtLUMYYY3ySdfEZY4zxSZagjDHG+CRLUMYYY3ySJShjjDE+yRKUMcYYn2QJyph0iEiJVLNP/5ZqNurTIjLOQ+ccIiL3XGOd5Vk4X2sRaeHGft0uz15tTE6xYebGuCEnZhMXkRBgDdBIVZM9dZ4rzvkCblyX8wDqGlzTZp3NidiMsRaUMdfIaXV857x/QUQmi0iMuNbd6i0i/xXX+ltznGlvEJEbRWSRM2Hv3CtmFrisLbDmcnISkYUiMlpEFjvrCzUWka+ddXdeSRXP6VRxLRSR6SKyVUQ+cxLL5TXBSjrvI539KgEDgaFOy7CVM1vAVyKyynm1BNdM1rimtunmmX9VY/7KEpQxWVcVuBnXsgOfAgtUtS5wDrjZSVJjgNtU9UZgEpDWbB4tca0flNpFVY0C3sU1hcwjQB3gXucJ/is1BIYAtYAqzjHTpKp7nOOOVtUGqroEeMvZbgzcCnyQqkos0Cq94xmT3UK8HYAxAeAHVU0SkQ24poGZ45RvACoBNXAllXlOgyYY14zWVyqDa/2g1C7PCbkB2HR5ehwR2YVrguPEK/b/RVXjnX3WOudfeg3X0h6o5cQJUFhECjlrGx0BIq7hWMZkiSUoY7LuAoCqXhKRJP3fjd1LuP4fE1zJpflVjnMOCEvr2M6xLqQqv3zsNGNxpKTaJ5n/9ZhceY7UgoDmqnoujc/CnBiNyRHWxWeM520DwkWkObiWYxCR2mnstwW43kMx7AFudN7fmqr8FFAo1XYMMOjyhog0SPVZdfxwFm7jvyxBGeNhqnoRuA14Q0TWAWuBtIZ2/wB4ajHJF4G3RGQJrpbVZbOAWy4PkgAGA5HOyq+bcQ2iuKwN8L2H4jPmL2yYuTE+RES+AZ5U1Thvx5KaiJTGtVRLO2/HYnIPS1DG+BARqQGUVtXF3o4lNRFpDCSp6lpvx2JyD0tQxhhjfJLdgzLGGOOTLEEZY4zxSZagjDHG+CRLUMYYY3ySJShjjDE+6f8Bf8X9VgqXuosAAAAASUVORK5CYII=\n", "text/plain": [ - "
" + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 3\n", + " iterations: 2\n", + " root: 2.0" ] }, - "metadata": { - "needs_background": "light" + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from scipy.optimize import root_scalar\n", + "\n", + "res = root_scalar(func, bracket=[1.5, 2.5])\n", + "res" + ] + }, + { + "cell_type": "markdown", + "id": "regulated-weekend", + "metadata": {}, + "source": [ + "The first argument is the function whose roots we want. The second\n", + "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which stores the root that was found." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "advised-climate", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0" + ] }, - "output_type": "display_data" + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "from modsim import decorate\n", + "res.root" + ] + }, + { + "cell_type": "markdown", + "id": "changing-winter", + "metadata": {}, + "source": [ + "If we provide a different interval, we find a different root." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "authentic-hunter", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.0" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res = root_scalar(func, bracket=[2.5, 3.5])\n", + "res.root" + ] + }, + { + "cell_type": "markdown", + "id": "bound-freight", + "metadata": {}, + "source": [ + "If the interval doesn't contain a root, you'll get a `ValueError`:\n", "\n", - "results.plot(label='coffee')\n", + "```\n", + "res = root_scalar(func, bracket=[4, 5])\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "caroline-divide", + "metadata": {}, + "source": [ + "Now we can use `root_scalar` to estimate `r`." + ] + }, + { + "cell_type": "markdown", + "id": "imperial-engineering", + "metadata": {}, + "source": [ + "## Estimating `r`\n", "\n", - "decorate(xlabel='Time (minute)',\n", - " ylabel='Temperature (C)',\n", - " title='Coffee Cooling')" + "What we want is the value of `r` that yields a final temperature of\n", + "70 °C. To use `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "quality-colors", + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(r, system):\n", + " system.r = r\n", + " results = run_simulation(system, change_func)\n", + " return system.T_final - 70" + ] + }, + { + "cell_type": "markdown", + "id": "random-loading", + "metadata": {}, + "source": [ + "This is called an \"error function\" because it returns the\n", + "difference between what we got and what we wanted, that is, the error.\n", + "With the right value of `r`, the error is 0.\n", + "\n", + "We can test `error_func` like this, using the initial guess `r=0.01`:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "unknown-pharmacy", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.2996253904030937" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)\n", + "error_func(0.01, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "moderate-monkey", + "metadata": {}, + "source": [ + "The result is an error of 2.3 °C, because the final temperature with\n", + "this value of `r` is too high." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "fossil-israel", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-10.907066281994297" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "error_func(0.02, coffee)" ] }, { "cell_type": "markdown", - "id": "automatic-standard", + "id": "south-fabric", + "metadata": {}, + "source": [ + "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", + "\n", + "So we can call `root_scalar` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "backed-while", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])" + ] + }, + { + "cell_type": "markdown", + "id": "exotic-development", + "metadata": {}, + "source": [ + "The first argument is the error function.\n", + "The second argument is the `System` object, which `root_scalar` passes as an argument to `error_func`.\n", + "The third argument is an interval that brackets the root.\n", + "\n", + "Here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "crazy-panic", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 7\n", + " iterations: 6\n", + " root: 0.011543084584004043" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "early-twelve", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.011543084584004043" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r_coffee = res.root\n", + "r_coffee" + ] + }, + { + "cell_type": "markdown", + "id": "greenhouse-designer", + "metadata": {}, + "source": [ + "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", + "\n", + "We can confirm that this value is correct by setting `r` to the root we found and running the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "foster-lodging", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "69.99999999996255" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "coffee.r = res.root\n", + "run_simulation(coffee, change_func)\n", + "coffee.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "sweet-horizontal", + "metadata": {}, + "source": [ + "The final temperature is very close to 70 °C." + ] + }, + { + "cell_type": "markdown", + "id": "imposed-complement", "metadata": {}, "source": [ "## Exercises\n", "\n", - "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", + "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 °C, in a vessel with `r=0.1`, for 15 minutes, and plot the results.\n", "\n", - "By trial and error, find a value for `r` that makes the final temperature close to 20 C." + "By trial and error, find a value for `r` that makes the final temperature close to 20 °C." ] }, { "cell_type": "code", - "execution_count": 83, - "id": "maritime-pillow", + "execution_count": 22, + "id": "radical-accident", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "20.00135627897414" + "18.499850754390966" ] }, - "execution_count": 83, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -504,20 +890,20 @@ "source": [ "# Solution\n", "\n", - "milk = make_system(T_init=5, t_end=15, r=0.133, volume=50)\n", + "milk = make_system(T_init=5, t_end=15, r=0.1, volume=50)\n", "results_milk = run_simulation(milk, change_func)\n", "milk.T_final" ] }, { "cell_type": "code", - "execution_count": 85, - "id": "killing-kitchen", + "execution_count": 23, + "id": "extraordinary-andrew", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -537,10 +923,92 @@ " ylabel='Temperature (C)')" ] }, + { + "cell_type": "markdown", + "id": "hispanic-ghana", + "metadata": {}, + "source": [ + "**Exercise:** Write an error function that simulates the temperature of the milk and returns the difference between the final temperature and 20 °C. Use it to estimate the value of `r` for the milk." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "naughty-organ", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def error_func2(r, system):\n", + " system.r = r\n", + " results = run_simulation(system, change_func)\n", + " return system.T_final - 20" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "separate-amateur", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 9\n", + " iterations: 8\n", + " root: 0.13296078935466452" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "root_scalar(error_func2, milk, bracket=[0.1, 0.2])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cloudy-reminder", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "19.999999999999996" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "run_simulation(milk, change_func)\n", + "milk.T_final" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "present-french", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, - "id": "buried-sweden", + "id": "mighty-transport", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap16.ipynb b/jupyter/chap16.ipynb index 6aacefe6..d704de50 100644 --- a/jupyter/chap16.ipynb +++ b/jupyter/chap16.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "nearby-contemporary", + "id": "involved-hampshire", "metadata": {}, "source": [ "# Chapter 16" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "boxed-certificate", + "id": "senior-paintball", "metadata": { "tags": [ "remove-cell" @@ -26,8 +26,8 @@ }, { "cell_type": "code", - "execution_count": 88, - "id": "veterinary-timer", + "execution_count": 1, + "id": "surprising-hypothesis", "metadata": { "tags": [ "remove-cell" @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "coral-content", + "id": "capable-programming", "metadata": {}, "source": [ "## Code from previous notebooks" @@ -58,8 +58,8 @@ }, { "cell_type": "code", - "execution_count": 89, - "id": "romantic-edgar", + "execution_count": 2, + "id": "straight-milan", "metadata": {}, "outputs": [], "source": [ @@ -71,33 +71,35 @@ }, { "cell_type": "code", - "execution_count": 254, - "id": "unlikely-protest", + "execution_count": 3, + "id": "enormous-economy", "metadata": {}, "outputs": [], "source": [ + "from modsim import linrange\n", "from modsim import TimeSeries\n", - "from numpy import arange\n", "\n", "def run_simulation(system, change_func):\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " t_array = linrange(system.t_0, system.t_end, system.dt)\n", + " n = len(t_array)\n", " \n", - " results = TimeSeries(quantity='Temperature')\n", - " results[t_0] = system.T_init\n", + " series = TimeSeries(index=t_array)\n", + " series.iloc[0] = system.T_init\n", " \n", - " for t in arange(t_0, t_end, dt):\n", - " T = results[t]\n", - " results[t+dt] = T + change_func(T, t, system)\n", + " for i in range(n-1):\n", + " t = t_array[i]\n", + " T = series.iloc[i]\n", + " series.iloc[i+1] = T + change_func(T, t, system)\n", " \n", - " system.t_end = results.index[-1]\n", - " system.T_final = results[system.t_end]\n", - " return results" + " system.t_end = t_array[-1]\n", + " system.T_final = series.iloc[-1]\n", + " return series" ] }, { "cell_type": "code", - "execution_count": 255, - "id": "rubber-norway", + "execution_count": 4, + "id": "defined-expert", "metadata": {}, "outputs": [], "source": [ @@ -111,371 +113,24 @@ " t_end=t_end,\n", " T_env=22,\n", " t_0=0,\n", - " dt=0.1)" + " dt=1)" ] }, { "cell_type": "markdown", - "id": "tamil-mobile", + "id": "global-shooting", "metadata": {}, "source": [ "In the previous chapter we wrote a simulation of a cooling cup of\n", "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", "temperature of the coffee will change over time.\n", "\n", - "In general, we don't know the value of `r`, but we can use measurements to estimate it. Given an initial temperature, a final temperature, and the time in between, we can find `r` by trial and error.\n", - "\n", - "In this chapter, we'll see a better way to find `r`, using a **bisection search**.\n", - "\n", - "And then we'll get back to solving the coffee cooling problem." - ] - }, - { - "cell_type": "markdown", - "id": "requested-pantyhose", - "metadata": {}, - "source": [ - "## Finding roots\n", - "\n", - "The ModSim library provides a method called `root_bisect` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", - "\n", - "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", - "\n", - "where **root** means a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", - "\n", - "I'll use this example to demonstrate `root_bisect`. First, we have to\n", - "write a function that evaluates $f$:" - ] - }, - { - "cell_type": "code", - "execution_count": 256, - "id": "three-reporter", - "metadata": {}, - "outputs": [], - "source": [ - "def func(x):\n", - " return (x-1) * (x-2) * (x-3)" - ] - }, - { - "cell_type": "markdown", - "id": "sharing-transcript", - "metadata": {}, - "source": [ - "Now we call `root_bisect` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 257, - "id": "stable-costa", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 3\n", - " iterations: 2\n", - " root: 2.0" - ] - }, - "execution_count": 257, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.optimize import root_scalar\n", - "\n", - "res = root_scalar(func, bracket=[1.5, 2.5])\n", - "res" - ] - }, - { - "cell_type": "markdown", - "id": "secondary-sapphire", - "metadata": {}, - "source": [ - "The first argument is the function whose roots we want. The second\n", - "argument is an interval that contains a root. The result is an object\n", - "that contains several variables, including `root`, which stores the root\n", - "that was found." - ] - }, - { - "cell_type": "markdown", - "id": "nonprofit-jordan", - "metadata": {}, - "source": [ - "If we provide a different interval, we find a different root." - ] - }, - { - "cell_type": "code", - "execution_count": 258, - "id": "earned-norfolk", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.0" - ] - }, - "execution_count": 258, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_scalar(func, bracket=[2.5, 3.5])\n", - "\n", - "res.root" - ] - }, - { - "cell_type": "markdown", - "id": "assisted-oregon", - "metadata": {}, - "source": [ - "If the interval doesn't contain a root, you'll get a `ValueError`:\n", - "\n", - "```\n", - "res = root_scalar(func, bracket=[4, 5])\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "selective-sector", - "metadata": {}, - "source": [ - "## Estimating `r`\n", - "\n", - "So how can we use `root_scalar` to estimate `r`?\n", - "\n", - "What we want is the value of `r` that yields a final temperature of\n", - "70 °C. To work with `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" - ] - }, - { - "cell_type": "code", - "execution_count": 259, - "id": "empirical-leisure", - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(r, system):\n", - " system.r = r\n", - " results = run_simulation(system, change_func)\n", - " return system.T_final - 70" - ] - }, - { - "cell_type": "markdown", - "id": "green-manitoba", - "metadata": {}, - "source": [ - "I call a function like this an \"error function\\\" because it returns the\n", - "difference between what we got and what we wanted, that is, the error.\n", - "When we find the right value of `r`, this error will be 0.\n", - "\n", - "We can test `error_func` like this, using the initial guess `r=0.01`:" - ] - }, - { - "cell_type": "code", - "execution_count": 260, - "id": "cubic-shopping", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "0.6000000000000001", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3079\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3080\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Float64HashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.Float64HashTable.get_item\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 0.6000000000000001", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mcoffee\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmake_system\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mT_init\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m90\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvolume\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m300\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.01\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_end\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0merror_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.01\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcoffee\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36merror_func\u001b[0;34m(r, system)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0merror_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrun_simulation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msystem\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchange_func\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT_final\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m70\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mrun_simulation\u001b[0;34m(system, change_func)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt_0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt_end\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mT\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mdt\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mT\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mchange_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msystem\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 822\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mkey_is_scalar\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 824\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 825\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_hashable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/series.py\u001b[0m in \u001b[0;36m_get_value\u001b[0;34m(self, label, takeable)\u001b[0m\n\u001b[1;32m 930\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 931\u001b[0m \u001b[0;31m# Similar to Index.get_value, but we do not fall back to positional\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 932\u001b[0;31m \u001b[0mloc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlabel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 933\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_values_for_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 934\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/numeric.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 393\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnan_idxs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 394\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 395\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 396\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0;31m# ----------------------------------------------------------------\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/home/downey/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3080\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3081\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3082\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3083\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3084\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mKeyError\u001b[0m: 0.6000000000000001" - ] - } - ], - "source": [ - "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)\n", - "error_func(0.01, coffee)" - ] - }, - { - "cell_type": "markdown", - "id": "floating-trace", - "metadata": {}, - "source": [ - "The result is an error of 2.3 °C, because the final temperature with\n", - "this value of `r` is too high." - ] - }, - { - "cell_type": "code", - "execution_count": 165, - "id": "conscious-closer", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-10.907066281994297" - ] - }, - "execution_count": 165, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(0.02, coffee)" - ] - }, - { - "cell_type": "markdown", - "id": "compliant-brake", - "metadata": {}, - "source": [ - "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", - "\n", - "Now we can call `root_scalar` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 166, - "id": "global-directory", - "metadata": {}, - "outputs": [], - "source": [ - "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])" - ] - }, - { - "cell_type": "markdown", - "id": "referenced-virgin", - "metadata": {}, - "source": [ - "The first argument is the error function.\n", - "The second argument is the `System` object, which `root_scalar` will pass as an argument to `error_func`.\n", - "The third argument is an interval that brackets the root.\n", - "\n", - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 167, - "id": "swedish-separate", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 7\n", - " iterations: 6\n", - " root: 0.011543084584004043" - ] - }, - "execution_count": 167, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 170, - "id": "complimentary-remainder", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011543084584004043" - ] - }, - "execution_count": 170, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee = res.root\n", - "r_coffee" - ] - }, - { - "cell_type": "markdown", - "id": "liable-natural", - "metadata": {}, - "source": [ - "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", - "\n", - "We can confirm that this value is correct by setting `r` to the root we found and running the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 171, - "id": "threaded-neutral", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "69.99999999996255" - ] - }, - "execution_count": 171, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee.r = res.root\n", - "results = run_simulation(coffee, change_func)\n", - "coffee.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "smaller-experience", - "metadata": {}, - "source": [ - "The result is very close to 70 C." + "..." ] }, { "cell_type": "markdown", - "id": "obvious-integer", + "id": "ceramic-calibration", "metadata": {}, "source": [ "## Mixing liquids\n", @@ -516,8 +171,8 @@ }, { "cell_type": "code", - "execution_count": 172, - "id": "going-error", + "execution_count": 5, + "id": "orange-beaver", "metadata": {}, "outputs": [], "source": [ @@ -537,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "quick-frederick", + "id": "quiet-payroll", "metadata": {}, "source": [ "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", @@ -554,28 +209,29 @@ }, { "cell_type": "markdown", - "id": "composite-antibody", + "id": "talented-appendix", "metadata": {}, "source": [ "## Mix first or last?\n", "\n", - "First I'll create objects to represent the coffee and cream.\n", - "For `r_coffee`, I'll use the value we just computed." + "First I'll create objects to represent the coffee and milk.\n", + "For `r_coffee` and `r_milk`, I'll use the values we computed in the previous chapter." ] }, { "cell_type": "code", - "execution_count": 235, - "id": "latin-herald", + "execution_count": 6, + "id": "breathing-pizza", "metadata": {}, "outputs": [], "source": [ + "r_coffee = 0.0115\n", "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" ] }, { "cell_type": "markdown", - "id": "trying-perception", + "id": "miniature-doctrine", "metadata": {}, "source": [ "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." @@ -583,8 +239,8 @@ }, { "cell_type": "code", - "execution_count": 236, - "id": "proud-opportunity", + "execution_count": 7, + "id": "faced-start", "metadata": {}, "outputs": [], "source": [ @@ -594,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "changing-newport", + "id": "interior-alpha", "metadata": {}, "source": [ "Now we can mix them and simulate 30 minutes:" @@ -602,17 +258,17 @@ }, { "cell_type": "code", - "execution_count": 237, - "id": "powerful-cradle", + "execution_count": 8, + "id": "stock-release", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "61.428571428540685" + "61.48016207445017" ] }, - "execution_count": 237, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -626,10 +282,10 @@ }, { "cell_type": "markdown", - "id": "ordered-maple", + "id": "committed-preference", "metadata": {}, "source": [ - "The final temperature is 61.4 °C which is still warm enough to be\n", + "The final temperature is 61.5 °C which is still warm enough to be\n", "enjoyable. Would we do any better if we added the milk last?\n", "\n", "I'll simulate the coffee and milk separately, and then mix them:" @@ -637,23 +293,23 @@ }, { "cell_type": "code", - "execution_count": 152, - "id": "painted-politics", + "execution_count": 9, + "id": "integral-character", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "63.10928927119819" + "62.91117032872072" ] }, - "execution_count": 152, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "coffee_results = run_simulation(coffee, change_func)\n", + "run_simulation(coffee, change_func)\n", "run_simulation(milk, change_func)\n", "mix_last = mix(coffee, milk)\n", "mix_last.T_final" @@ -661,17 +317,17 @@ }, { "cell_type": "markdown", - "id": "executive-transcription", + "id": "trying-jacob", "metadata": {}, "source": [ - "After mixing, the temperature is 63.1 °C, so it looks like adding the\n", - "milk at the end is better by about 1.7 °C. But is that the best we can\n", - "do?" + "After mixing, the temperature is 62.9 °C, so it looks like adding the\n", + "milk at the end is better. \n", + "But is that the best we can do?" ] }, { "cell_type": "markdown", - "id": "appointed-reach", + "id": "enclosed-shore", "metadata": {}, "source": [ "## Optimization\n", @@ -681,8 +337,8 @@ }, { "cell_type": "code", - "execution_count": 177, - "id": "shared-disco", + "execution_count": 10, + "id": "accepting-consumer", "metadata": {}, "outputs": [], "source": [ @@ -702,37 +358,16 @@ }, { "cell_type": "markdown", - "id": "pleasant-webster", - "metadata": {}, - "source": [ - "When `t_add=0`, we add the milk immediately; when `t_add=30`, we add it\n", - "at the end. Now we can sweep the range of values in between:" - ] - }, - { - "cell_type": "code", - "execution_count": 238, - "id": "authentic-barrier", - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 245, - "id": "tutorial-momentum", + "id": "critical-pound", "metadata": {}, - "outputs": [], "source": [ - "milk = make_system(T_init=5, volume=50, r=0.133, t_end=15)" + "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" ] }, { "cell_type": "code", - "execution_count": 246, - "id": "split-dance", + "execution_count": 11, + "id": "isolated-georgia", "metadata": {}, "outputs": [], "source": [ @@ -746,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "measured-consideration", + "id": "latin-fireplace", "metadata": {}, "source": [ "Here's what the results look like:" @@ -754,13 +389,13 @@ }, { "cell_type": "code", - "execution_count": 247, - "id": "impaired-partnership", + "execution_count": 12, + "id": "possible-prevention", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzaUlEQVR4nO3deXxU5dn/8c/FEiAQlhB2goAgq4iIuKAIRcGlarXY2roAWpfnp32srVZbRa1aq7a26qNFEYlQQa1aKrUuIIoWCygoCAmgiEDCvqgJaxJy/f6YEwwhywQyOZPk+3695pWZM+ecuU5G8+U+5z73be6OiIhIvKkTdgEiIiIlUUCJiEhcUkCJiEhcUkCJiEhcUkCJiEhcqhd2AVUhJSXFO3fuHHYZIiJSgkWLFm1z91bFl9eKgOrcuTMLFy4MuwwRESmBma0tablO8YmISFxSQImISFxSQImISFyqFdegSpKXl0dWVhZ79+4Nu5S41rBhQzp27Ej9+vXDLkVEaplaG1BZWVkkJSXRuXNnzCzscuKSu7N9+3aysrLo0qVL2OWISC1Ta0/x7d27l5YtWyqcymBmtGzZUq1MEQlFrQ0oQOEUBf2ORCQstTqgREQkftXaa1DVxYwZM8jIyOD2228vdZ3nnnuOESNG0L59+yqsTERqKndnT/4ecnJzyMnNITs3+6CfBx55OeQX5PP7034fkzoUUHHuggsu4IILLihzneeee46+fftWKKDy8/OpV09fv0hN5O7s3b/3oDDJzs0+NGBKCp3gke/5ZX5Go3qNSKqfRPOGzXH3mFwO0F+oEK1Zs4azzz6b0047jfnz53PccccxduxY7r77brZs2cLUqVPJyMhg4cKFPPHEE1x44YX88Ic/5Morr+Tpp5/mgw8+4KKLLmLhwoVcdtllNGrUiHnz5tGrVy8WLlxISkoKCxcu5JZbbmHOnDncc889bNiwgTVr1pCSksJjjz3G9ddfz7p16wB49NFHGTx4cMi/FREpbnfebrbt2ca2PdvYvnf7d8/3bD+kRVMYOvkFZQdMw7oNSUpIOvBo0bAFnZp2omlCU5omND3ovaSEpIOX1U+ift3Y33qigAIe+ughVuxYUan77Jnck9sG3VbueqtWreLll19mwoQJnHjiiUybNo25c+cyY8YMHnjgAX7wgx8cWHfChAkMHjyYLl268MgjjzB//nySk5N54okn+NOf/sTAgQPL/bxFixYxd+5cGjVqxE9/+lNuvvlmTjvtNNatW8fIkSNZvnz5kRy2iEQpd38u2/dsLzV4ii7fk7/nkO3rWB2aN2hOswbNSEpIolnDZqQmpR4aLA2a0rT+oYGTUDchhKOuGAVUyLp06cKxxx4LQJ8+fRg+fDhmxrHHHsuaNWsOWrdNmzbce++9DBs2jOnTp5OcnFzhz7vgggto1KgRAO+88w4ZGRkH3svOziYnJ4ekpKTDPyCRWmx/wX6+3vf1gXApGjbb92xn297vlmXnZpe4j2YNmpHSMIWURikc2+pYUhqlfPdomELLRi1p2aglLRq0oG6dulV8hFVLAQVRtXRipUGDBgee16lT58DrOnXqkJ9/aBN96dKltGzZkg0bNpS6z3r16lFQUABwyD1MjRs3PvC8oKCAefPmHQgsESnd/oL9bN69mXU568jMySQrJ+ugINq2Zxtf7/0axw/ZNrFe4oGQ6da8Gye1Peng4GkUCZ7khsnVomVTVRRQ1chHH33Em2++yaeffsoZZ5zBiBEj6NKlC0lJSeTk5BxYr3PnzixatIhzzjmHV199tdT9jRgxgieeeIJbb70VgMWLF9O/f/9YH4ZI3Mrdn0vWziyycrJYlx0JosLH+p3rySvIO7BuvTr1aNWoFSmNUmjfpD3HphxbYui0bNiSxPqJIR5V9aWAqib27dvHNddcQ1paGu3bt+eRRx7hqquu4t1332XMmDFcf/31BzpJ3H333Vx99dU88MADnHTSSaXu8/HHH+eGG26gX79+5OfnM2TIEJ566qkqPCqRqrczd+eB0FmXs46snKwDzzfv2nxQCyixXiKdmnaie4vuDOs0jE5JnUhNSiU1KZU2iW1q/Cm2sJn7oc3RmmbgwIFefMLC5cuX06tXr5Aqql70u5LqxN3ZsXfHQa2foqflduzdcdD6yQ2TD4RO8Udyw2SNplIFzGyRux/Sy0stKBGpdopfD8rMySQz+7tA2p2/+8C6htG2cVtSk1IZljrsQPh0atqJjk060iShSYhHImVRQIlIXCvwAtZmryV9ezrp29JJ357Oih0rDup6Xb9OfTo06UBqUioD2w48qBXUoUkHdTyopmp1QMXq7ueapDacApb44e6s37meZduXkbEtg/Tt6WRsz2Bn3k4gcnNpz+SeXNz9Yro176brQTVcrQ2ohg0bsn37dk25UYbC+aAaNmwYdilSA7k7m3dvPqhllL49nW/3fQtEWkU9WvTgvK7n0adlH/qk9KFrs67Uq1Nr/2zVOrX2m+7YsSNZWVls3bo17FLiWuGMuiJHatuebWRszzgQRsu2LWP73u0A1LW6dG/RnTM7nUnvlr3pk9KHY5ofUyXD6Uj8qrUBVb9+fc0SKxIj3+779pCW0aZdm4BIp4WuzboyuMPgAy2jHi160LCeWupysFobUCJSOXbm7mT5juUHtYyydmYdeP+opkdxfOvj6dOyD31T+tIruZduXJWoKKBEJGruzoodK1i0edGBltGab9ccuLm1feP29Enpw6hjRtEnpQ+9knvRrEGzkKuW6koBJSJl2rd/Hx9t/Ij3s95nTuYcNu/eDEDrRq3pndKb87qcR5+UPvRu2ZvkhhUfwFikNAooETnEjr07+CDrA+ZkzuG/G/7Lnvw9NKrXiFPbn8oNHW/g1Pan0qZxm7DLlBoupgFlZs2BiUBfwIGrgHOBC4ECYAswxt0PGZrbzM4GHgPqAhPd/cFgeTLwEtAZWAP8yN2/juVxiNR07s7qb1czJ3MOczLnsGTrEhyndWJrzu96PkNThzKo3SAa1G1Q3q5EKk1Mx+Izs8nAf9x9opklAIlAgbtnB+//L9Db3a8vtl1d4HPgLCAL+Bj4ibtnmNnDwA53f9DMbgdauHuZ82WUNBafSG2XV5DHp5s/5b3M93g/630yczIB6JXci2Gpwzgj9Qx6JffSfYISc1U+Fp+ZNQWGAGMA3D0XyC22WmMoYfIUGASscvfVwb5eJNLqygh+Dg3WmwzMAcKb0EmkGsnOzWZu1lzmZM1h7vq55OTmkFAngZPancSYPmMY0nEIbRu3DbtMESC2p/i6AluBNDM7DlgE3OTuu8zs98CVwLfAsBK27QBkFnmdBRTOG9HG3TcCuPtGM2td0oeb2bXAtQCdOnWqhMMRqZ4yszOZkxU5dffJ5k/I93ySGyYzvNNwhqYO5ZR2p6jbt8SlWAZUPWAA8HN3X2BmjwG3A+Pc/Q7gDjP7DXAjcHexbUs6p1Chc5HuPgGYAJFTfBUtXqS62l+wn6XblkZO3WW+z5fffglAt+bdGN1nNENTh3JsyrEau07iXiwDKgvIcvcFwetXiARUUdOAf3NoQGUBqUVedwQKO1JsNrN2QeupHZGOFiK12u683czbMI/3Mt/jP+v/w469O6hn9TihzQmMOmYUZ6SeQWpSavk7EokjMQsod99kZplm1sPdVwLDgQwz6+7uXwSrXQCsKGHzj4HuZtYFWA9cCvw0eG8GMBp4MPj5WqyOQSSebdq1ifcz32dO1hw+2vgRuQW5JCUkcXqH0xmaOpTBHQbTNKFp2GWKHLZY3wf1c2Bq0INvNTAWmGhmPYh0M18LXA9gZu2JdCc/193zzexG4G0i3cwnuXt6sM8Hgb+b2dXAOuCSGB+DSNzIzMnkX1/+izmZc1i+YzkAqUmp/LjnjxmWOoz+rftTv44GWJWaodZO+S5SnSzespjJ6ZN5N/Nd3J3+rfszNHUoQzsOpUuzLuoKLtWapnwXqWb2F+xn9rrZTM6YzGdbP6NpQlOu6nsVP+n5E1onlth5VaRGUUCJxJndebuZvmo6f8v4G+t3rqdjk478ZtBv+EG3H6g7uNQqCiiROLF512amrZjGy5+/TE5uDse3Pp5bB97K0NSh6hIutZICSiRkK3asYEr6FN786k0KKODMTmcyus9o+rXqF3ZpIqFSQImEoMALmLt+LlPSp7Bg0wIS6yVyac9LuazXZXRM6hh2eSJxQQElUoX27d/H61++zpSMKaz+djWtE1tz8wk3M+qYUbpnSaQYBZRIFdixdwcvrXyJF1e8yI69O+iV3Is/nP4HRh41kvp1dd+SSEkUUCIx9NW3X/G3jL8x48sZ7Nu/jyEdhzC692hObHui7l0SKYcCSqSSuTsLNy9kcvpk3s96n4Q6CZx/9Plc2ftKujbvGnZ5ItWGAkqkkuQV5DFzzUwmp09m+Y7ltGjQgv857n/4cY8f07JRy7DLE6l2FFAiRygnN4dXP3+V55c/z+bdm+nSrAt3n3I33+/6fRrWaxh2eSLVlgJK5DBt2LmB55c/zz+++Ae78nYxqO0g7jrlLk7rcBp1rE7Y5YlUewookQpaunUpkzMm887adzCMkV1GcmXvK+ndsnfYpYnUKAookShlbM/goY8e4pMtn5BUP4kr+1zJT3v+lLaN24ZdmkiNpIASKUfu/lye/uxpnl36LMkNk7ntxNu4qPtFNK7fOOzSRGo0BZRIGdK3p3Pn3DtZ9c0qLjz6Qm498VaaNWgWdlkitYICSqQEuftzeWrJU0xaNomWDVvy5PAnGdJxSNhlidQqCiiRYtK3pXPnh9+1mn496NcaJ08kBAookcBBraZGajWJhE0BJcLBraaLul3ELSfeolaTSMgUUFKr5e7PZfyS8aQtSyOlUQrjzxzPaR1OC7ssEUEBJbXY0q1LGffhOL789ksu7n4xtwy8haSEpLDLEpFATAPKzJoDE4G+gANXARcD5wO5wJfAWHf/pth2PYCXiizqCtzl7o+a2T3ANcDW4L3fuvsbsTsKqWn27d/HXxf/lefSn6NVo1Y8deZTDO4wOOyyRKSYWLegHgPecvdRZpYAJAKzgN+4e76ZPQT8Brit6EbuvhLoD2BmdYH1wPQiq/zF3f8U49qlBvps62eM+3Acq79dzQ+7/5BfDfyVWk0icSpmAWVmTYEhwBgAd88l0mqaWWS1+cCocnY1HPjS3dfGoEypJfbt38eTi59kcvpkWie25ukzn+bUDqeGXZaIlCGWQy53JXIaLs3MPjWziWZWfGyYq4A3y9nPpcALxZbdaGafmdkkM2tRSfVKDbVk6xIu+dclpC1L46JuF/GPC/6hcBKpBmIZUPWAAcB4dz8e2AXcXvimmd0B5ANTS9tBcFrwAuDlIovHA0cTOQW4EXiklG2vNbOFZrZw69atJa0iNdze/L38eeGfufLNK9mTv4enz3yae069R6f0RKqJWF6DygKy3H1B8PoVgoAys9HA94Hh7u5l7OMc4BN331y4oOhzM3sGeL2kDd19AjABYODAgWV9htRAi7csZtyH41iTvYZRx4ziVyf8iiYJTcIuS0QqIGYB5e6bzCzTzHoEnR6GAxlmdjaRThFnuPvucnbzE4qd3jOzdu6+MXh5EbCssmuX6mtv/l6eXPwkUzKm0CaxDRPOmsAp7U8JuywROQyx7sX3c2BqcKpuNTAW+BhoAMwyM4D57n69mbUHJrr7uQBmlgicBVxXbJ8Pm1l/It3W15TwvtRSRVtNPzrmR/xy4C81JYZINRbTgHL3xcDAYou7lbLuBuDcIq93Ay1LWO+KSixRaoC9+Xt54tMnmJIxhXaN2/HMiGc4ud3JYZclIkeozIAys1OAy4HTgXbAHiKn1P4NPO/u38a8QpEyfLrlU+768C7WZK/hxz1+zM0n3KxWk0gNUWpAmdmbwAbgNeD3wBagIXAMMAx4zcz+7O4zqqJQkaL25O/h/z79P57PeJ52jdsxccRETmp3UthliUglKqsFdYW7byu2bCfwSfB4xMxSYlaZSCk+2fwJd/33LtZmr1WrSaQGKyugmgc98D4sutDMTgc2uPuXJQSYSMzsyd/D4588ztTlU2nfpD3PjniWQe0GhV2WiMRIWQH1KPDbEpbvCd47Pwb1iJRow84NXDfrOtZkr+HSHpdy8wk3k1g/MeyyRCSGygqozu7+WfGF7r7QzDrHriSRg2XlZHH121eTk5eja00itUhZAdWwjPcaVXYhIiXJzM7kqplXsTtvNxNHTKR3y95hlyQiVaSssfg+NrNrii80s6uBRbErSSRibfZaxr49lr35e3l25LMKJ5FapqwW1C+A6WZ2Gd8F0kAggcgQQyIx89W3X/Gzt39GXkEeE0dMpEdyj7BLEpEqVmpABYOynmpmw4jMiAvwb3d/t0oqk1pr9TeruXrm1RR4Ac+OfJbuLbqHXZKIhKCsG3WbuPtOd38PeK+sdWJWndQ6q75exc9m/gwzI21kGl2bdw27JBEJSVnXoF4zs0fMbEjRiQbNrKuZXW1mbwNnx75EqS0+//pzrp55NXWsDpNGTlI4idRyZZ3iG25m5xIZLXywmSUDecBKImPxjXb3TVVTptR0K3es5Gczf0ZC3QQmjZzEUU2PCrskEQlZmYPFuvsbwBtVVIvUUsu3L+eaWdfQqF4jJo2YRGrT1LBLEpE4EMsp30XKlb4tnatnXk1ivUQmjVQ4ich3FFASmqVbl3LNzGtomtCUtLPTSE1SOInIdxRQEoolW5dw7axradagGWkj0+jQpEPYJYlInIkqoMzsNDMbGzxvZWZdYluW1GSfbvmU62ZdR3LDZNLOTqNdk3ZhlyQicajcgDKzu4HbgN8Ei+oDz8eyKKm5Fm1exHWzrqNVo1ZMGjmJto3bhl2SiMSpaFpQFwEXALsA3H0DkBTLoqRm+njTx/zPO/9D28ZtmTRyEm0atwm7JBGJY9EEVK67O+AARW/aFYnW/I3z+X/v/D/aN27PpJGTaJXYKuySRCTORRNQfzezp4nMsHsN8A7wTGzLkprkv+v/y42zb6RjUkeeHfksKY1Swi5JRKqBMm/UNTMDXgJ6AtlAD+Aud59VBbVJDTB3/VxuevcmujTrwjMjnqFFwxZhlyQi1UR5I0m4mf3T3U8AKhxKZtYcmEhkNHQHrgIuJjJdfC7wJTDW3b8pYds1QA6wH8h394HB8mQiodkZWAP8yN2/rmhtEnsfZH3AL977Bd2ad2PCWRNo3rB52CWJSDUSzSm++WZ24mHu/zHgLXfvCRwHLCcSdH3dvR/wOd/1DizJMHfvXxhOgduB2e7eHZgdvJY4MydzDje9dxPdW3TnmRHPKJxEpMKiCahhwDwz+9LMPjOzpWb2WXkbmVlTYAjwLIC757r7N+4+093zg9XmAx0rWPOFwOTg+WTgBxXcXmJs9rrZ3DznZnol9+KZEc/QrEGzsEsSkWqozFN8gXMOc99dga1AmpkdR2RW3pvcfVeRda4icrquJA7MNDMHnnb3CcHyNu6+EcDdN5pZ65I2NrNrgWsBOnXqdJiHIBU1a+0sfv3+r+md0punznyKpATdkSAihyeaFpSX8ihPPWAAMN7djydyH9WB03FmdgeQD0wtZfvB7j6ASEDeYGZDovjM74p2n+DuA919YKtW6tJcFd5a8xa3vn8rfVP68vSZTyucROSIRNOC+jeRQDKgIdCFyJxQfcrZLgvIcvcFwetXCALKzEYD3weGB/dYHSK4IRh332Jm04FBwAfAZjNrF7Se2gFbojgGibE3Vr/Bb+b+hv6t+vPXM/9K4/q6XU5Ejky5LSh3P9bd+wU/uxMJirlRbLcJyDSzHsGi4UCGmZ1NZOikC9x9d0nbmlljM0sqfA6MAJYFb88ARgfPRwOvlVeLxNa/vvwXv5n7Gwa0HsD4M8crnESkUkTTgjqIu39SgV59PwemmlkCsBoYC3wMNABmRW6zYr67X29m7YGJ7n4u0AaYHrxfD5jm7m8F+3yQyM3DVwPrgEsqegxSeV5b9RrjPhzHoLaDePx7j5NYPzHskkSkhig3oMzsl0Ve1iFyXWlrNDt398XAwGKLu5Wy7gbg3OD5aiLd0ktabzuR1piEbPoX07n7v3dzcruTeex7j9GoXqOwSxKRGiSaFlTRK935RK5JvRqbcqS6ePnzl7l33r0Mbj+YR4c9SsN6DcMuSURqmGgCKsPdXy66wMwuAV4uZX2p4V5a8RL3L7if0zuczl+G/YUGdRuEXZKI1EDRdDMvaaSHskZ/kBps2vJp3L/gfoZ2HMqjwx5VOIlIzJTagjKzc4hcE+pgZo8XeaspkVN9Usv8LeNvPPzxw3wv9Xv86Yw/Ub9u/bBLEpEarKxTfBuAhUQmK1xUZHkOcHMsi5L483zG8zz88cOcddRZPDTkIerXUTiJSGyVGlDuvgRYYmbT3D2vCmuSOLNk6xL+uPCPDO80XOEkIlUmmk4Snc3sD0BvIiNJAODuXWNWlcSNPfl7uHPunbRJbMP9g+9XOIlIlYmmk0QaMJ7IdadhwBTgb7EsSuLHo4seZU32Gu4ffD9NEpqEXY6I1CLRBFQjd58NmLuvdfd7gO/FtiyJB/M3zmfaimlc3utyBrUbFHY5IlLLRHOKb6+Z1QG+MLMbgfVAiVNcSM2Rk5vDuA/H0blpZ24acFPY5YhILRRNC+oXQCLwv8AJwOV8N1ir1FAPfvQgW3dv5YHTHtAoESISijJbUGZWF/iRu98K7CQy2KvUcO+ue5cZX87g2n7XcmyrY8MuR0RqqTJbUO6+HzjBgmHFpebbsXcHv5v3O3ol9+L6fteHXY6I1GLRXIP6FHjNzF4mMisuAO7+j5hVJaFwd+6bdx85uTlMHDFRI0WISKiiCahkYDsH99xzQAFVw7y++nXeWfcOvzzhl3Rv0T3sckSklis3oNxd151qgU27NvGHBX9gQOsBXNn7yrDLEREpvxefmR1jZrPNbFnwup+Z3Rn70qSquDt3fXgX+Z7P/YPvp26dumGXJCISVTfzZ4hMr5EH4O6fAZfGsiipWi+tfIl5G+dxy8BbSG2aGnY5IiJAdAGV6O4fFVum6TZqiHXZ6/jzoj8zuP1gLjnmkrDLERE5IJqA2mZmRxPpGIGZjQI2xrQqqRL7C/bz27m/pV6devzu1N+huwlEJJ5E04vvBmAC0NPM1gNfAZfFtCqpEmnpaSzZuoQHT3+QNo3bhF2OiMhBounFtxo408waA3XcPSf2ZUmsrdyxkicXP8lZR53FuV3ODbscEZFDRNOLr2Uw5ft/gDlm9piZtYx9aRIrefvzuGPuHTRLaMa4k8fp1J6IxKVorkG9CGwFfgiMCp6/FM3Ozay5mb1iZivMbLmZnWJmfwxef2Zm082seQnbpZrZe8E26WZ2U5H37jGz9Wa2OHjon/8VNH7JeFZ+vZJ7Tr2HFg1bhF2OiEiJogmoZHe/z92/Ch73A82j3P9jwFvu3hM4DlgOzAL6uns/4HMiXdiLywd+5e69gJOBG8ysd5H3/+Lu/YPHG1HWIsDiLYt5dtmzXNTtIoamDg27HBGRUkUTUO+Z2aVmVid4/Aj4d3kbmVlTYAjwLIC757r7N+4+090Lu6nPBzoW39bdN7r7J8HzHCLB1iG6Q5LS7M7bzZ0f3knbxLb8+sRfh12OiEiZogmo64BpQG7weBH4pZnlmFl2Gdt1JXI6MM3MPjWziUFHi6KuAt4s68PNrDNwPLCgyOIbg1OEk8ysxHNUZnatmS00s4Vbt24t6yNqjUc/eZS12Wu5b/B9mr5dROJeuQHl7knuXsfd6wWPOsGyJHdvWsam9YABwHh3P57ISOi3F75pZncQOZU3tbQdmFkT4FXgF+5eGIbjgaOB/kTux3qklLonuPtAdx/YqlWr8g6zxpu/cT4vrHhB07eLSLURzX1QmFk/oHPR9aOYbiMLyHL3wpbPKwQBZWajge8Dw93dS/nM+kTCaWrRz3L3zUXWeQZ4PZpjqM2yc7O5c+6ddGnWRdO3i0i1UW5AmdkkoB+QDhQEi8udbsPdN5lZppn1cPeVwHAgw8zOBm4DznD33aV8phG5drXc3f9c7L127l44ksVFwLLyjqG2e+ijh9i2ZxvPD3te07eLSLURTQvqZHfvXf5qJfo5MNXMEoDVRKaM/xhoAMwK7r+Z7+7Xm1l7YKK7nwsMBq4AlprZ4mBfvw167D1sZv2JhOQaItfIpBSz181mxpczuK7fdfRN6Rt2OSIiUYsmoOaZWW93z6jozt19MTCw2OJupay7ATg3eD4XKPHuUXe/oqJ11Fbb92zn3nn30iu5F9f1U46LSPUSTUBNJhJSm4B9RILDg/uYJE65O/fNv4+duTt5dsSzmr5dRKqdaAJqEsHpNr67BiVx7vXVrzN73Wx+dcKv6NaixEariEhciyag1rn7jJhXIpVm065NPLDgAQa0HsAVvXVGVESqp2gCaoWZTQP+ReQUHxBVN3MJQYEXMO7Dcez3/dx/mqZvF5HqK5qAakQkmEYUWVZuN3MJx0srX2L+xvmMO3kcqUmavl1Eqq9o5oMaWxWFyJFbm72WPy/8M4M7aPp2Ean+opkP6hgzm21my4LX/czsztiXJhWRX5DPHXPvIKFuAveeeq/meBKRai+awWKfITIlRh6Au38GXBrLoqTinkt/jiVbl3DHSXfQOrF12OWIiByxaAIq0d0/KrYsv8Q1JRSF07ePOGoE53Q5J+xyREQqRTQBtc3MjibSMQIzG0VkFHGJA7n7c/nt3N/SLKEZd558p07tiUiNEU0vvhuACUBPM1sPfAVcFtOqJGrjl4zn868/54nvPaHp20WkRommF99q4MxgssE6wQy3EgcWb1nMpGWTuLj7xZyRekbY5YiIVKqo5oMCcPddsSxEKmZ33m7umHsHbRPbcuvAW8MuR0Sk0kUdUBJf/rLoL6zLWcekkZM0fbuI1EjRdJKQODNvwzxeXPkil/e6nBPbnhh2OSIiMVFqC8rMLi5rQ43FF47s3GzGfThO07eLSI1X1im+88t4T2PxheTBBQ+ybc82pg6bqunbRaRGKzWgNAZf/Jm9djb/Wv0vrj/uevqk9Am7HBGRmIqqk4SZnQf0AQ78k93d741VUXKo7Xu2c+/8yPTt1/a7NuxyRERirtyAMrOngERgGDARGAUUH/pIYsjduXfevd9N315H07eLSM0XTS++U939SuBrd/8dcAqgiYaq0OurX+fdzHf53wH/q+nbRaTWiCag9gQ/d5tZeyKjmneJXUlSVH5BPk8ufpK+Lftyea/Lwy5HRKTKRBNQr5tZc+CPwCfAGuDFGNYkRcxaO4v1O9dzTb9rNH27iNQq5QaUu9/n7t+4+6vAUUBPdx8Xzc7NrLmZvWJmK8xsuZmdYmZ/DF5/ZmbTg/AraduzzWylma0ys9uLLE82s1lm9kXws8aOkOrupC1Lo3PTzgxNHRp2OSIiVSqqkSTM7FQz+ynwY+BCM7syyv0/Brzl7j2B44DlwCygr7v3Az4nMhli8c+rCzwJnAP0Bn5iZr2Dt28HZrt7d2B28LpGmr9xPst3LGds37HUMQ36ISK1SzS9+P4GHA0sBvYHix2YUs52TYEhwBgAd88FcoGZRVabT6RXYHGDgFXBSOqY2YvAhUBG8HNosN5kYA5wW3nHUR1NWjaJVo1a8f2u3w+7FBGRKhfNfVADgd7u7hXcd1dgK5BmZscBi4Cbio2KfhXwUgnbdgAyi7zOAk4Knrdx940A7r7RzEqc39zMrgWuBejUqVMFSw9fxvYM5m+cz80n3ExC3YSwyxERqXLRnDdaBrQ9jH3XAwYA4939eGAXRU7HmdkdRKaOn1rCtiVNC1uhgHT3Ce4+0N0HtmrVqiKbxoXnlj1H4/qNueSYS8IuRUQkFNG0oFKADDP7CNhXuNDdLyhnuywgy90XBK9fIQgoMxsNfB8YXkrLLIuD77XqCGwInm82s3ZB66kdsCWKY6hWsnKyeHvt24zuPZqkhKSwyxERCUU0AXXP4ezY3TeZWaaZ9XD3lcBwIkF3NpFrRme4++5SNv8Y6G5mXYD1wKXAT4P3ZgCjgQeDn68dTn3xbErGFOpYHS7rdVnYpYiIhCaaKd/fP4L9/xyYamYJwGpgLJHwaQDMMjOA+e5+fXAT8ER3P9fd883sRuBtoC4wyd3Tg30+CPzdzK4G1gE16hzYjr07mP7FdM7vej5tGrcJuxwRkdCUNR/UXHc/zcxyOPj6jwHu7k3L27m7LybSyaKoEsfqcfcNwLlFXr8BvFHCetuJtMZqpBdXvMje/XsZ02dM2KWIiISqrBbUZQDurosgVWR33m5eWPECQ1OH0rV517DLEREJVVm9+KYXPjGzV6ugllrvn6v+yTf7vuGqvleFXYqISOjKCqiiXb31z/kYyy/IZ0rGFPq36s/xrY8PuxwRkdCVFVBeynOJgZlrZrJ+53q1nkREAmVdgzrOzLKJtKQaBc+hAp0kJDruTlp6Gl2adeGM1DPCLkdEJC6UGlDurrkdqsi8jfNYsWMF9556rwaFFREJ6K9hHJi0bBKtG7XmvK7nhV2KiEjcUECFLH17Ogs2LuDy3pdrUFgRkSIUUCF7btlzNKnfhFHHlDTriIhI7aWAClFmTiYz187kkh6XaFBYEZFiFFAhmpIeGRT28l6Xh12KiEjcUUCFZMfeHfxz1T85v+v5tE4scc5FEZFaTQEVkhdWvBAZFLbvmLBLERGJSwqoEBQOCjssdRhdm2kUKRGRkiigQjB91XS+3fethjUSESmDAqqK5RXkMSV9Cse3Pp7+rfuHXY6ISNxSQFWxmWtmsmHXBrWeRETKoYCqQu5O2rI0ujbrypCOQ8IuR0QkrimgqtC8DfNY+fVKxvQZo0FhRUTKob+SVWhSugaFFRGJlgKqimhQWBGRilFAVZG0ZWk0qd+ES465JOxSRESqBQVUFcjMzmTW2ln8qMePaJLQJOxyRESqhZgGlJk1N7NXzGyFmS03s1PM7BIzSzezAjMbWMp2PcxscZFHtpn9InjvHjNbX+S9c2N5DJVhcsZk6lpdLut1WdiliIhUG6VO+V5JHgPecvdRZpYAJALfABcDT5e2kbuvBPoDmFldYD0wvcgqf3H3P8Wo5kq1fc/2yKCwR2tQWBGRiohZQJlZU2AIMAbA3XOBXCIBhZlFu6vhwJfuvrbSi6wCL6x4gdz9uYzpMybsUkREqpVYnuLrCmwF0szsUzObaGaND2M/lwIvFFt2o5l9ZmaTzKxFSRuZ2bVmttDMFm7duvUwPvbIFR0UtkuzLqHUICJSXcUyoOoBA4Dx7n48sAu4vSI7CE4LXgC8XGTxeOBoIqcANwKPlLStu09w94HuPrBVq1YVr74STF81nezcbMb2HRvK54uIVGexDKgsIMvdFwSvXyESWBVxDvCJu28uXODum919v7sXAM8Agyql2kqWV5DH5PTJDGg9QIPCiogchpgFlLtvAjLNrEewaDiQUcHd/IRip/fMrF2RlxcByw67yBh6e83bbNy1Ua0nEZHDFOv7oH4OTDWzz4icknvAzC4ysyzgFODfZvY2gJm1N7M3Cjc0s0TgLOAfxfb5sJktDfY5DLg5xsdQYYWDwh7d7GgNCisicphi2s3c3RcDxe91ms7BXcYL190AnFvk9W6gZQnrXVG5VVa+/274L59//Tn3Db5Pg8KKiBwm/fWMgbRlaZFBYbtoUFgRkcOlgKpk6dvSWbBpAVf0voL6deuHXY6ISLWlgKpkk5ZNIql+EqOOGRV2KSIi1ZoCqhKty17HO+ve0aCwIiKVQAFViaZkTNGgsCIilUQBVUkKB4W94OgLaJUYzsgVIiI1iQKqkkxbMY3c/bmM7jM67FJERGoEBVQl2J23mxdXvMj3On1Pg8KKiFQSBVQl+McX/9CgsCIilUwBdYTyCvKYkjGFAa0HcFyr48IuR0SkxlBAHaG3vnqLjbs2clXfq8IuRUSkRlFAHQF3Jy09Mijs6R1PD7scEZEaRQF1BD7c8CFffP0FY/uO1aCwIiKVTH9Vj0DasjRaJ7bm3C7nlr+yiIhUiALqMC3btoyPNn3Elb2v1KCwIiIxoIA6TIWDwv6w+w/DLkVEpEZSQB2GddnreGftO/y45481KKyISIwooA7D5PTJ1KtTT4PCiojEkAKqgrbt2XZgUNiURilhlyMiUmMpoCpo2vJp5BXkaVBYEZEYU0BVwO683by4UoPCiohUBQVUBbz6xavk5OZoWCMRkSoQ04Ays+Zm9oqZrTCz5WZ2ipldYmbpZlZgZgPL2HaNmS01s8VmtrDI8mQzm2VmXwQ/W8TyGAoVDgp7QpsT6NeqX1V8pIhIrRbrFtRjwFvu3hM4DlgOLAMuBj6IYvth7t7f3YsG2e3AbHfvDswOXsfcW1+9xaZdm9R6EhGpIvVitWMzawoMAcYAuHsukAt8E7x/uLu+EBgaPJ8MzAFuO9ydRcPdmbRsEt2ad+O0DqfF8qNERCQQyxZUV2ArkGZmn5rZRDNrXIHtHZhpZovM7Noiy9u4+0aA4Gfryiu5ZHPXz2XVN6s0KKyISBWK5V/besAAYLy7Hw/somKn4wa7+wDgHOAGMxtSkQ83s2vNbKGZLdy6dWtFNj1EWnoabRLbcE7nc45oPyIiEr1YBlQWkOXuC4LXrxAJrKi4+4bg5xZgOjAoeGuzmbUDCH5uKWX7Ce4+0N0HtmrV6jAPAZZuXcrHmz7mit5XaFBYEZEqFLOAcvdNQKaZ9QgWDQcyotnWzBqbWVLhc2AEkc4VADOAwrtkRwOvVVrRJVibs5Z2jdsx6phRsfwYEREpxtw9djs36w9MBBKA1cBYIh0c/g9oRaTDxGJ3H2lm7YGJ7n6umXUl0mqCyKnCae7++2CfLYG/A52AdcAl7r6jrDoGDhzoCxcuLGuVMu0v2E/dOnUPe3sRESmdmS0q1ls7sjyWARUvjjSgREQkdkoLKHVJExGRuKSAEhGRuKSAEhGRuKSAEhGRuKSAEhGRuKSAEhGRuKSAEhGRuKSAEhGRuFQrbtQ1s63A2iPYRQqwrZLKiTc6tuqnph4X6Niqo8o4rqPc/ZBBU2tFQB0pM1tY0l3ONYGOrfqpqccFOrbqKJbHpVN8IiISlxRQIiISlxRQ0ZkQdgExpGOrfmrqcYGOrTqK2XHpGpSIiMQltaBERCQuKaBERCQuKaDKYWZnm9lKM1tlZreHXU9lMrM1ZrbUzBabWbWd0dHMJpnZFjNbVmRZspnNMrMvgp8twqzxcJVybPeY2frge1tsZueGWePhMLNUM3vPzJabWbqZ3RQsr/bfWxnHVhO+t4Zm9pGZLQmO7XfB8ph8b7oGVQYzqwt8DpwFZAEfAz9x94xQC6skZrYGGOju1frmQTMbAuwEprh732DZw8AOd38w+IdFC3e/Lcw6D0cpx3YPsNPd/xRmbUfCzNoB7dz9EzNLAhYBPwDGUM2/tzKO7UdU/+/NgMbuvtPM6gNzgZuAi4nB96YWVNkGAavcfbW75wIvAheGXJMU4+4fADuKLb4QmBw8n0zkD0S1U8qxVXvuvtHdPwme5wDLgQ7UgO+tjGOr9jxiZ/CyfvBwYvS9KaDK1gHILPI6ixryH1rAgZlmtsjMrg27mErWxt03QuQPBtA65Hoq241m9llwCrDanQYrysw6A8cDC6hh31uxY4Ma8L2ZWV0zWwxsAWa5e8y+NwVU2ayEZTXpnOhgdx8AnAPcEJxOkvg3Hjga6A9sBB4JtZojYGZNgFeBX7h7dtj1VKYSjq1GfG/uvt/d+wMdgUFm1jdWn6WAKlsWkFrkdUdgQ0i1VDp33xD83AJMJ3JKs6bYHFwLKLwmsCXkeiqNu28O/kgUAM9QTb+34BrGq8BUd/9HsLhGfG8lHVtN+d4Kufs3wBzgbGL0vSmgyvYx0N3MuphZAnApMCPkmiqFmTUOLuBiZo2BEcCysreqVmYAo4Pno4HXQqylUhX+IQhcRDX83oKL7c8Cy939z0XeqvbfW2nHVkO+t1Zm1jx43gg4E1hBjL439eIrR9AV9FGgLjDJ3X8fbkWVw8y6Emk1AdQDplXXYzOzF4ChRIb93wzcDfwT+DvQCVgHXOLu1a6zQSnHNpTIaSIH1gDXFZ7/ry7M7DTgP8BSoCBY/Fsi12qq9fdWxrH9hOr/vfUj0gmiLpEGzt/d/V4za0kMvjcFlIiIxCWd4hMRkbikgBIRkbikgBIRkbikgBIRkbikgBIRkbikgJK4ZmYti4z+vKnIaNA7zeyvYdcHYGa/MLPEIq/fKHKvyM5SNyx/vxdYOSPom9m9Znbm4X5GsX2Zmb1rZk0rsE25NZaz/UG/uwpue6OZjT3cz5b4p27mUm3E6yjeZY0Kb2Y73b1J1VdVcWZ2HnCmu99chZ+5hsMcUT8Itg/d/fhKL0ziglpQUi2Z2VAzez14fo+ZTTazmRaZ4+piM3vYInNdvRUMO4OZnWBm7weD475d7M7+wv0+Z2ajirzeWeTz5pjZK2a2wsymBi2O/wXaA++Z2XvBumvMLKWM2jsH+5hoZsuCfZ1pZh9aZD6dQcF6Y8zsieD5a2Z2ZfD8OjObWrze4HN/Z2afBMfeM1jeyiJz9HxiZk+b2dpS6ruMYASAw6zxOTN73Mz+a2ari9R14LsKXj8RbFfS726Emc0Lan3ZIuPZYWYPmlmGRQZa/ROAu+8G1hTWIjWPAkpqiqOB84gM+/888J67HwvsAc4LQur/gFHufgIwCajoyBnHA78AegNdiQy2+ziR8RmHufuwCuyrG/AY0A/oCfwUOA24hcioA8VdC9xlZqcDvwJ+Xsp+twUDAI8P9gWR0SfeDZZPJ3K3f0kGE5m76HBrBGgXrPN94MFS1gGg+O8uCM07ibTiBgALgV+aWTKRoYH6uHs/4P4iu1kInF7W50j1VS/sAkQqyZvunmdmS4kMw/JWsHwp0BnoAfQFZpkZwToVHWbmI3fPArDIdAOdiUzYdji+cvelwb7Sgdnu7kH9nYuv7O6bzewu4D3gojKGkSkcdHURkUnkIBIYFwX7ecvMvi5l2+Rg/qLDqjHwz2Aw1Awza1PKOqU5mUj4fxh8RwnAPCAb2AtMNLN/A68X2WYLkfCUGkgBJTXFPgB3LzCzPP/u4moBkf/ODUh391PK2U8+wZkFi/yVTCj+GYH9HNn/P0X3VVDkdWG9JTkW2E7ktFh5+y1aX0nTxpQk38zqBAFzuDUW3abwcw/8TgMNS9nWiMwv9JND3oicxhtOZMDmG4HvFdnXnlL2J9WcTvFJbbESaGVmp0BkOgQz61PCemuAE4LnFxKZMbQ8OUBSZRRZmuAP9DlETjPeYmZdKrD5XCLTjWNmI4DSJspbSeTUZWVbC/Q2swZm1oxI0BQq+rubDww2s25BrYlmdkxwHaqZu79B5BRr/yLbH0M1HBVcoqOAklrB3XOBUcBDZrYEWAycWsKqzwBnmNlHwEnArih2PwF4s/BCf2UzswZBXVcFc3j9CpgUtPCi8TtghJl9QiTkNhIJhuL+TWSk9Erl7plERrr+DJgKfFrk7QO/O3ffCowBXjCzz4gEVk8iAfZ6sOx9oGgvw8HAO5Vds8QHdTMXqeGCgNvv7vlBC3J8MCNq8fXaAVPc/ayqrvFwmNnxwC/d/Yqwa5HY0DUokZqvE/B3M6sD5ALXlLSSu280s2fMrGk1mX49BRgXdhESO2pBiYhIXNI1KBERiUsKKBERiUsKKBERiUsKKBERiUsKKBERiUv/HzJOPMQtb0bOAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -774,7 +409,7 @@ "source": [ "from modsim import decorate\n", "\n", - "sweep.plot(label='mixture')\n", + "sweep.plot(label='mixture', color='C2')\n", "\n", "decorate(xlabel='Time until mixing (minutes)',\n", " ylabel='Final emperature (C)')" @@ -782,20 +417,24 @@ }, { "cell_type": "markdown", - "id": "conservative-phrase", + "id": "light-poland", "metadata": {}, "source": [ - "Note that this is a parameter sweep, not a time series. The x-axis is the time when we add the milk, not the index of a `TimeSeries`.\n", + "Note that this is a parameter sweep, not a time series.\n", "\n", "The final temperature is maximized when `t_add=30`, so adding the milk\n", "at the end is optimal.\n", "\n", - "As an exercise you will have a chance to explore this solution and try some variations. For example, suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?" + "As an exercise you will have a chance to explore a variation of the coffee cooling problem:\n", + "\n", + "> Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", + "\n", + "But first, let's do some analysis." ] }, { "cell_type": "markdown", - "id": "accomplished-tulsa", + "id": "industrial-circle", "metadata": {}, "source": [ "## Analysis\n", @@ -817,27 +456,21 @@ }, { "cell_type": "markdown", - "id": "opponent-trace", + "id": "molecular-happiness", "metadata": {}, "source": [ "Now we can use the observed data to estimate the parameter $r$. If we\n", "observe the that temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", "\n", - "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$" - ] - }, - { - "cell_type": "markdown", - "id": "electoral-archives", - "metadata": {}, - "source": [ - "The following function takes a `System` object with a simulated `T_final` and computes `r`:" + "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$\n", + "\n", + "The following function takes a `System` object and computes `r`:" ] }, { "cell_type": "code", - "execution_count": 193, - "id": "little-bahrain", + "execution_count": 13, + "id": "dressed-supply", "metadata": {}, "outputs": [], "source": [ @@ -855,16 +488,16 @@ }, { "cell_type": "markdown", - "id": "superior-harmony", + "id": "young-shift", "metadata": {}, "source": [ - "Can can use this function to compute `r` for the coffee, given the parameters of the problem." + "We can use this function to compute `r` for the coffee, given the parameters of the problem." ] }, { "cell_type": "code", - "execution_count": 198, - "id": "executive-queensland", + "execution_count": 14, + "id": "bacterial-tonight", "metadata": {}, "outputs": [ { @@ -873,52 +506,24 @@ "0.01161022314227386" ] }, - "execution_count": 198, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "coffee = make_system(T_init=90, volume=300, r=0, t_end=30)\n", - "coffee.T_final = 70\n", - "r_coffee2 = compute_r(coffee)\n", + "coffee2 = make_system(T_init=90, volume=300, r=0, t_end=30)\n", + "coffee2.T_final = 70\n", + "r_coffee2 = compute_r(coffee2)\n", "r_coffee2" ] }, { "cell_type": "markdown", - "id": "arctic-retention", - "metadata": {}, - "source": [ - "Notice that this value is not the same as `r_coffee` in the simulations. " - ] - }, - { - "cell_type": "code", - "execution_count": 199, - "id": "defined-wound", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011543084584004043" - ] - }, - "execution_count": 199, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee" - ] - }, - { - "cell_type": "markdown", - "id": "passive-impression", + "id": "removable-authority", "metadata": {}, "source": [ + "This value is close to the value of `r` we computed in the previous chapter, `0.115`, but not exactly the same.\n", "That's because the simulations use discrete time steps, and the analysis uses continuous time.\n", "\n", "Nevertheless, the results of any analysis are consistent with the simulation.\n", @@ -927,8 +532,8 @@ }, { "cell_type": "code", - "execution_count": 204, - "id": "mediterranean-arbitration", + "execution_count": 15, + "id": "civic-trail", "metadata": {}, "outputs": [], "source": [ @@ -937,44 +542,31 @@ "\n", "def run_analysis(system):\n", " T_env, T_init, r = system.T_env, system.T_init, system.r\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", " \n", - " t_array = arange(t_0, t_end+dt, dt) \n", + " t_array = linrange(system.t_0, system.t_end, system.dt) \n", " T_array = T_env + (T_init - T_env) * exp(-r * t_array)\n", " \n", " system.T_final = T_array[-1]\n", - " return Series(T_array, index=t_array)" + " return TimeSeries(T_array, index=t_array)" ] }, { "cell_type": "markdown", - "id": "efficient-sheffield", + "id": "eleven-faculty", "metadata": {}, "source": [ - "The first two lines unpack the system variables.\n", - "`t_array` is a NumPy array of time stamps.\n", - "`T_array` is and array of the corresponding temperatures.\n", - "The result is a Pandas `Series`.\n", + "The first line unpacks the system variables.\n", + "The next two lines compute `t_array`, which is a NumPy array of time stamps, and `T_array`, which is an array of the corresponding temperatures.\n", + "\n", + "The last two lines store the final temperature in the `System` object and return the results in a `TimeSeries`.\n", "\n", "We can run it like this:" ] }, { "cell_type": "code", - "execution_count": 205, - "id": "steady-customs", - "metadata": {}, - "outputs": [], - "source": [ - "coffee2 = make_system(T_init=90, r=r_coffee2, \n", - " volume=300, t_end=30)\n", - "results2 = run_analysis(coffee2)" - ] - }, - { - "cell_type": "code", - "execution_count": 206, - "id": "suspected-birthday", + "execution_count": 16, + "id": "terminal-carry", "metadata": {}, "outputs": [ { @@ -983,18 +575,20 @@ "70.0" ] }, - "execution_count": 206, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "coffee2.r = r_coffee2\n", + "results2 = run_analysis(coffee2)\n", "coffee2.T_final" ] }, { "cell_type": "markdown", - "id": "alpha-casino", + "id": "approved-subject", "metadata": {}, "source": [ "The final temperature is 70 °C, as it should be. In fact, the results\n", @@ -1003,19 +597,19 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "laden-lloyd", + "execution_count": 17, + "id": "grand-silence", "metadata": {}, "outputs": [], "source": [ - "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)\n", + "coffee.r = 0.011543\n", "results = run_simulation(coffee, change_func)" ] }, { "cell_type": "code", - "execution_count": 209, - "id": "mighty-imperial", + "execution_count": 18, + "id": "monetary-sensitivity", "metadata": {}, "outputs": [ { @@ -1024,7 +618,7 @@ "True" ] }, - "execution_count": 209, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1037,7 +631,7 @@ }, { "cell_type": "markdown", - "id": "common-profile", + "id": "polish-focus", "metadata": {}, "source": [ "## Exercises" @@ -1045,134 +639,25 @@ }, { "cell_type": "markdown", - "id": "greatest-warrant", - "metadata": {}, - "source": [ - "**Exercise:** Use `root_scalar` to estimate `r_milk`, given that it starts at 5 °C and reaches 20 °C after 15 minutes. \n", - "\n", - "1. Write an error function that takes a possible value of `r`, runs a simulation, and returns the difference between `T_final` and 20 °C.\n", - "\n", - "2. Try your error function and find two values of `r` that bracket a root.\n", - "\n", - "3. Use `root_scalar` to compute `r_milk`.\n", - "\n", - "4. Run the simulation with the computed value and confirm that `T_final` is 20 °C." - ] - }, - { - "cell_type": "code", - "execution_count": 217, - "id": "powered-deficit", + "id": "respected-inclusion", "metadata": {}, - "outputs": [], "source": [ - "# Solution\n", - "\n", - "def error_func2(r):\n", - " system = make_system(T_init=5, volume=50, r=r, t_end=15)\n", - " run_simulation(system, change_func)\n", - " return system.T_final - 20" - ] - }, - { - "cell_type": "code", - "execution_count": 218, - "id": "after-novelty", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1.500149245609034" - ] - }, - "execution_count": 218, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func2(r=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": 219, - "id": "universal-steel", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.4018656744898585" - ] - }, - "execution_count": 219, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func2(r=0.2)" - ] - }, - { - "cell_type": "code", - "execution_count": 220, - "id": "frequent-albuquerque", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 9\n", - " iterations: 8\n", - " root: 0.13296078935466452" - ] - }, - "execution_count": 220, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_scalar(error_func2, bracket=[0.1, 0.2])\n", - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 221, - "id": "future-pregnancy", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "r_milk = res.root" + "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." ] }, { "cell_type": "code", - "execution_count": 224, - "id": "arctic-wireless", + "execution_count": 19, + "id": "headed-circle", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "19.999999999999996" + "0.14267107756641806" ] }, - "execution_count": 224, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1180,85 +665,54 @@ "source": [ "# Solution\n", "\n", - "milk = make_system(T_init=5, volume=50, r=r_milk, t_end=15)\n", - "results = run_simulation(milk, change_func)\n", - "milk.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "competitive-kingdom", - "metadata": {}, - "source": [ - "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." + "milk2 = make_system(T_init=5, volume=50, r=0, t_end=15)\n", + "milk2.T_final = 20\n", + "r_milk2 = compute_r(milk2)\n", + "r_milk2" ] }, { "cell_type": "code", - "execution_count": 229, - "id": "twenty-andrew", + "execution_count": 20, + "id": "enormous-consolidation", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.14267107756641806" + "20.0" ] }, - "execution_count": 229, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], - "source": [ - "# Solution\n", - "\n", - "milk = make_system(T_init=5, volume=50, r=0, t_end=15)\n", - "milk.T_final = 20\n", - "r_milk2 = compute_r(milk)\n", - "r_milk2" - ] - }, - { - "cell_type": "code", - "execution_count": 230, - "id": "automated-premium", - "metadata": {}, - "outputs": [], "source": [ "# Solution\n", "\n", "milk2 = make_system(T_init=5, volume=50, r=r_milk2, t_end=15)\n", - "results2 = run_analysis(milk2)" + "results2 = run_analysis(milk2)\n", + "milk2.T_final" ] }, { "cell_type": "code", - "execution_count": 231, - "id": "naughty-communication", + "execution_count": 23, + "id": "social-stamp", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.0" - ] - }, - "execution_count": 231, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solution\n", "\n", - "milk2.T_final" + "milk = make_system(T_init=5, volume=50, r=0.13296, t_end=15)\n", + "results = run_simulation(milk, change_func)" ] }, { "cell_type": "code", - "execution_count": 232, - "id": "architectural-hierarchy", + "execution_count": 24, + "id": "exclusive-puzzle", "metadata": {}, "outputs": [ { @@ -1267,7 +721,7 @@ "True" ] }, - "execution_count": 232, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1282,7 +736,7 @@ }, { "cell_type": "markdown", - "id": "regulated-liberty", + "id": "chinese-explanation", "metadata": {}, "source": [ "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", @@ -1292,8 +746,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "id": "significant-corps", + "execution_count": null, + "id": "terminal-billy", "metadata": {}, "outputs": [], "source": [ @@ -1309,7 +763,7 @@ { "cell_type": "code", "execution_count": null, - "id": "vocal-illinois", + "id": "nuclear-going", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap17.ipynb b/jupyter/chap17.ipynb new file mode 100644 index 00000000..aca865e8 --- /dev/null +++ b/jupyter/chap17.ipynb @@ -0,0 +1,665 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "interracial-guitar", + "metadata": {}, + "source": [ + "# Chapter 17" + ] + }, + { + "cell_type": "markdown", + "id": "restricted-thumb", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "premier-coach", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "tamil-helping", + "metadata": {}, + "source": [ + "**Pharmacokinetics** is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, we\n", + "implement one of the most widely used pharmacokinetic models: the\n", + "so-called **minimal model** of glucose and insulin in the blood stream.\n", + "\n", + "My presentation in this chapter follows Bergman (2005) \"Minimal Model\"\n", + "(abstract at , PDF at\n", + ")." + ] + }, + { + "cell_type": "markdown", + "id": "stable-lemon", + "metadata": {}, + "source": [ + "## The glucose-insulin system\n", + "\n", + "**Glucose** is a form of sugar that circulates in the blood of animals; it is used as fuel for muscles, the brain, and other organs. The concentration of blood sugar is controlled by the hormone system, and especially by **insulin**, which is produced by the pancreas and has the effect of reducing blood sugar.\n", + "\n", + "In people with normal pancreatic function, the hormone system maintains **homeostasis**; that is, it keeps the concentration of blood sugar in a range that is neither too high or too low.\n", + "\n", + "But if the pancreas does not produce enough insulin, or if the cells\n", + "that should respond to insulin become insensitive, blood sugar can\n", + "become elevated, a condition called **hyperglycemia**. Long term, severe hyperglycemia is the defining symptom of **diabetes mellitus**, a serious disease that affects almost 10% of the population in the U.S. (see )." + ] + }, + { + "cell_type": "markdown", + "id": "sharp-yukon", + "metadata": {}, + "source": [ + "One of the most-used tests for hyperglycemia and diabetes is the\n", + "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to\n", + "measure the concentrations of glucose and insulin.\n", + "\n", + "By analyzing these measurements, we can estimate several parameters of\n", + "the subject's response; the most important is a parameter denoted $S_I$, which quantifies the effect of insulin on the rate of reduction in blood sugar." + ] + }, + { + "cell_type": "markdown", + "id": "round-roommate", + "metadata": {}, + "source": [ + "## The glucose minimal model\n", + "\n", + "The \"minimal model\", as proposed by Bergman, Ider, Bowden, and\n", + "Cobelli, consists of two parts: the glucose model and the insulin model. I will present an implementation of the glucose model; as a case study, you will have the chance to implement the insulin model.\n", + "\n", + "The original model was developed in the 1970s; since then, many\n", + "variations and extensions have been proposed. Bergman's comments on the development of the model provide insight into their process:\n", + "\n", + "> We applied the principle of Occam's Razor, i.e. by asking what was the simplest model based upon known physiology that could account for the insulin-glucose relationship revealed in the data. Such a model must be simple enough to account totally for the measured glucose (given the insulin input), yet it must be possible, using mathematical techniques, to estimate all the characteristic parameters of the model from a single data set (thus avoiding unverifiable assumptions)." + ] + }, + { + "cell_type": "markdown", + "id": "accompanied-battery", + "metadata": {}, + "source": [ + "The most useful models are the ones that achieve this balance: including enough realism to capture the essential features of the system without so much complexity that they are impractical. In this example, the practical limit is the ability to estimate the parameters of the model using data, and to interpret the parameters meaningfully.\n", + "\n", + "Bergman discusses the features he and his colleagues thought were\n", + "essential:\n", + "\n", + "> (1) Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize (2) Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", + "\n", + "To paraphrase the second point, the effect of insulin on glucose\n", + "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a \"remote compartment\" where it has its effect." + ] + }, + { + "cell_type": "markdown", + "id": "bottom-extent", + "metadata": {}, + "source": [ + "At the time, the remote compartment was a modeling abstraction that\n", + "might, or might not, represent something physical. Later, according to\n", + "Bergman, it was \"shown to be interstitial fluid\", that is, the fluid\n", + "that surrounds tissue cells. In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve\n", + "particular effects, to be found later to correspond to physical\n", + "entities.\n", + "\n", + "The glucose model consists of two differential equations:\n", + "\n", + "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", + "\n", + "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", + "\n", + "where\n", + "\n", + "- $G$ is the concentration of blood glucose as a function of time and $dG/dt$ is its rate of change.\n", + "\n", + "- $X$ is the concentration of insulin in the tissue fluid as a\n", + " function of time, and $dX/dt$ is its rate of change.\n", + "\n", + "- $I$ is the concentration of insulin in the blood as a function of\n", + " time, which is taken as an input into the model, based on\n", + " measurements.\n", + "\n", + "- $G_b$ is the basal concentration of blood glucose and $I_b$ is the\n", + " basal concentration of blood insulin, that is, the concentrations at equilibrium. Both are constants estimated from measurements at the\n", + " beginning or end of the test.\n", + "\n", + "- $k_1$, $k_2$, and $k_3$ are positive-valued parameters that control the rates of appearance and disappearance for glucose and insulin." + ] + }, + { + "cell_type": "markdown", + "id": "dutch-retailer", + "metadata": {}, + "source": [ + "We can interpret the terms in the equations one by one:\n", + "\n", + "- $-k_1 \\left[ G(t) - G_b \\right]$ is the rate of glucose\n", + " disappearance due to the effect of glucose itself. When $G(t)$ is\n", + " above basal level, $G_b$, this term is negative; when $G(t)$ is\n", + " below basal level this term is positive. So in the absence of\n", + " insulin, this term tends to restore blood glucose to basal level.\n", + "\n", + "- $-X(t) G(t)$ models the interaction of glucose and insulin in tissue\n", + " fluid, so the rate increases as either $X$ or $G$ increases. This\n", + " term does not require a rate parameter because the units of $X$ are\n", + " unspecified; we can consider $X$ to be in whatever units make the\n", + " parameter of this term 1.\n", + "\n", + "- $k_3 \\left[ I(t) - I_b \\right]$ is the rate at which insulin\n", + " diffuses between blood and tissue fluid. When $I(t)$ is above basal\n", + " level, insulin diffuses from the blood into the tissue fluid. When\n", + " $I(t)$ is below basal level, insulin diffuses from tissue to the\n", + " blood.\n", + "\n", + "- $-k_2 X(t)$ is the rate of insulin disappearance in tissue fluid as\n", + " it is consumed or broken down." + ] + }, + { + "cell_type": "markdown", + "id": "regional-receptor", + "metadata": {}, + "source": [ + "The initial state of the model is $X(0) = I_b$ and $G(0) = G_0$, where\n", + "$G_0$ is a constant that represents the concentration of blood sugar\n", + "immediately after the injection. In theory we could estimate $G_0$ based on measurements, but in practice it takes time for the injected glucose to spread through the blood volume. Since $G_0$ is not measurable, it is treated as a **free parameter** of the model, which means that we are free to choose it to fit the data." + ] + }, + { + "cell_type": "markdown", + "id": "exact-heating", + "metadata": {}, + "source": [ + "## Data\n", + "\n", + "To develop and test the model, we'll use data from Pacini and Bergman, \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122, (1986)." + ] + }, + { + "cell_type": "markdown", + "id": "separated-strip", + "metadata": {}, + "source": [ + "The following cell reads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "looking-needle", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "markdown", + "id": "dressed-regard", + "metadata": {}, + "source": [ + "We can use Pandas to read the data file." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "naval-geology", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
glucoseinsulin
time
09211
235026
4287130
625185
824051
\n", + "
" + ], + "text/plain": [ + " glucose insulin\n", + "time \n", + "0 92 11\n", + "2 350 26\n", + "4 287 130\n", + "6 251 85\n", + "8 240 51" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pandas import read_csv\n", + "\n", + "data = read_csv('glucose_insulin.csv', index_col='time')\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "close-payday", + "metadata": {}, + "source": [ + "`data` has two columns: `glucose` is the concentration of blood glucose in mg/dL; `insulin` is concentration of insulin in the blood in μU/mL (a medical \"unit\", denoted U, is an amount defined by convention in context). The index is time in minutes.\n", + "\n", + "This dataset represents glucose and insulin concentrations over\n", + "182 min for a subject with normal insulin production and sensitivity." + ] + }, + { + "cell_type": "markdown", + "id": "burning-valuable", + "metadata": {}, + "source": [ + "## Interpolation\n", + "\n", + "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. This is a job for interpolation!\n", + "\n", + "The ModSim library provides a function named `interpolate`, which is a\n", + "wrapper for the SciPy function `interp1d`. It takes any kind of `Series` as a parameter, including `TimeSeries` and `SweepSeries`, and returns a function. That's right, I said it returns a *function*.\n", + "\n", + "So we can call `interpolate` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "terminal-teaching", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import interpolate\n", + "\n", + "I = interpolate(data.insulin)" + ] + }, + { + "cell_type": "markdown", + "id": "banner-shakespeare", + "metadata": {}, + "source": [ + "Then we can call the new function, `I`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "intense-thursday", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(31.66666667)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "I(18)" + ] + }, + { + "cell_type": "markdown", + "id": "severe-desire", + "metadata": {}, + "source": [ + "The result is 31.66, which is a linear interpolation between the actual measurements at `t=16` and `t=19`. \n", + "\n", + "We can also pass an array as an argument to `I`. Here's an array of equally-spaced values from `t_0` to `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "least-pattern", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import linrange\n", + "\n", + "t_0 = data.index[0]\n", + "t_end = data.index[-1]\n", + "t_array = linrange(t_0, t_end)" + ] + }, + { + "cell_type": "markdown", + "id": "empirical-tackle", + "metadata": {}, + "source": [ + "And here are the corresponding values of `I`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "mounted-venice", + "metadata": {}, + "outputs": [], + "source": [ + "I_array = I(t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "environmental-variance", + "metadata": {}, + "source": [ + "Here's what the interpolated values look like along with the data." + ] + }, + { + "cell_type": "markdown", + "id": "completed-registrar", + "metadata": {}, + "source": [ + "`interpolate` can take additional arguments, which it passes along to\n", + "`interp1d`. You can read about these options at\n", + "." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "engaging-watershed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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WltbuxrSLuVy/aeOApWgzOzHQAtwd7QowWYJryx299vcvdLdK6MTH2ZadJqj4lAx/Yr7sbVpayfvEBFpr7PlNm655RY++eQTpk6dytSpUwF48sknmThxIuPHj+fss89m27ZtQLiW8rOf/YzJkydz3333MWXKFK688komTZrEIYccwuLFiwH49NNPOf300xk7dixHHnkkr7/++k5xpbq8Rm1tLWeeeSaHH344hx9+eGyJjg0bNjBt2jTGjRvHN7/5TTIxCURgZjM3s5nAKcBxvuMnWw3sE7fZCOCTXMcWFb0GqiRUQklhCZsaNuUrFBHppusXX8/bn76d0X1+duBn+cGEH6S8faLlNq644gpuuukmnn32WQYPHsz69eu55pprePrppykvL+f666/npptu4uqrrwagtLSUF154AYBbb72Vuro6FixYwPPPP88FF1zAG2+8wZw5cxg3bhwPPfQQf//73zn//PNjc/xFpbq8xle+8hW++93vMnnyZD766CNOPPFEVqxYwU9/+lMmT57M1VdfTXV1Nbfddlu3z2cgEpSZTQd+ABzj7vH12keAP5rZTcDewIHA4jyECOxo4isqKKI0VBp7LiLSFYmW25g8eXK7bRYuXMhbb73FUUcdBUBTUxMTJ06MvX7OOee02/68884D4Oijj2bLli1s2rSJF154gQceeACAY489lg0bNrB58+Z270t12Yynn36at956K/Z8y5YtbN26leeff56//OUvQHiZjwEDBqR9PjrKeYIysz8BU4DBZrYamEN41F4J8FRk6veF7n6pu79pZvcCbxFu+vuOu2enoTUF7WpQoRIaWjI3rbyI5FY6NZ1sSWU5DHfnhBNO4E9/+lPCfXScNLbj8hlmlrC5reN2l19+Od/73vf40pe+xPz586mqqkp4vLa2Nl566SX69OnT6T67Kx+j+M5z9wp3L3L3Ee5+u7sf4O77uPthkdulcdtf6+77u/vB7v7YrvadbfEJqrRQNSgRyY74JS2OPPJIXnzxRVauXAlAfX19bFHBRO655x4AXnjhBfr370///v05+uijufvucNf+/PnzGTx4MP369Wv3vlSX15g2bRr//d//HXsebSqMP8Zjjz3Gxo0bu/SzxwvUIImgizXxhcJNfB2XgxYRyYRLLrmEk046ialTpzJkyBDuvPNOzjvvvNggh7ffTt53NmDA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib.pyplot import plot\n", + "from modsim import decorate\n", + "\n", + "data.insulin.plot(style='o', color='C2', label='insulin data')\n", + "plot(t_array, I_array, color='C2', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')" + ] + }, + { + "cell_type": "markdown", + "id": "adopted-locking", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In the next chapter, we will use interpolated data to run the simulation\n", + "of the glucose-insulin system.\n", + "\n", + "\n", + "\n", + "[^1]: Bergman RN, Ider YZ, Bowden CR, Cobelli C., \"Quantitative\n", + " estimation of insulin sensitivity\\\", Am J Physiol. 1979\n", + " Jun;236(6):E667-77. Abstract at .\n", + "\n", + "[^2]: \"MINMOD: A computer program to calculate insulin sensitivity and\n", + " pancreatic responsivity from the frequently sampled intravenous\n", + " glucose tolerance test\\\", *Computer Methods and Programs in\n", + " Biomedicine* 23: 113-122, 1986." + ] + }, + { + "cell_type": "markdown", + "id": "floppy-store", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "hungarian-newman", + "metadata": {}, + "source": [ + "**Exercise:** Read the documentation of `scipy.interpolate.interp1d` at . Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "endless-network", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "I = interpolate(data.insulin, kind='cubic')\n", + "I_array = I(t_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "entire-concern", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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WltbuxrSLuVy/aeOApWgzOzHQAtwd7QowWYJryx299vcvdLdK6MTH2ZadJqj4lAx/Yr7sbVpayfvEBFpr7PlNm655RY++eQTpk6dytSpUwF48sknmThxIuPHj+fss89m27ZtQLiW8rOf/YzJkydz3333MWXKFK688komTZrEIYccwuLFiwH49NNPOf300xk7dixHHnkkr7/++k5xpbq8Rm1tLWeeeSaHH344hx9+eGyJjg0bNjBt2jTGjRvHN7/5TTIxCURgZjM3s5nAKcBxvuMnWw3sE7fZCOCTXMcWFb0GqiRUQklhCZsaNuUrFBHppusXX8/bn76d0X1+duBn+cGEH6S8faLlNq644gpuuukmnn32WQYPHsz69eu55pprePrppykvL+f666/npptu4uqrrwagtLSUF154AYBbb72Vuro6FixYwPPPP88FF1zAG2+8wZw5cxg3bhwPPfQQf//73zn//PNjc/xFpbq8xle+8hW++93vMnnyZD766CNOPPFEVqxYwU9/+lMmT57M1VdfTXV1Nbfddlu3z2cgEpSZTQd+ABzj7vH12keAP5rZTcDewIHA4jyECOxo4isqKKI0VBp7LiLSFYmW25g8eXK7bRYuXMhbb73FUUcdBUBTUxMTJ06MvX7OOee02/68884D4Oijj2bLli1s2rSJF154gQceeACAY489lg0bNrB58+Z270t12Yynn36at956K/Z8y5YtbN26leeff56//OUvQHiZjwEDBqR9PjrKeYIysz8BU4DBZrYamEN41F4J8FRk6veF7n6pu79pZvcCbxFu+vuOu2enoTUF7WpQoRIaWjI3rbyI5FY6NZ1sSWU5DHfnhBNO4E9/+lPCfXScNLbj8hlmlrC5reN2l19+Od/73vf40pe+xPz586mqqkp4vLa2Nl566SX69OnT6T67Kx+j+M5z9wp3L3L3Ee5+u7sf4O77uPthkdulcdtf6+77u/vB7v7YrvadbfEJqrRQNSgRyY74JS2OPPJIXnzxRVauXAlAfX19bFHBRO655x4AXnjhBfr370///v05+uijufvucNf+/PnzGTx4MP369Wv3vlSX15g2bRr//d//HXsebSqMP8Zjjz3Gxo0bu/SzxwvUIImgizXxhcJNfB2XgxYRyYRLLrmEk046ialTpzJkyBDuvPNOzjvvvNggh7ffTt53NmDA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "data.insulin.plot(style='o', color='C2', label='insulin data')\n", + "plot(t_array, I_array, color='C2', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-recognition", + "metadata": {}, + "source": [ + "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "representative-acquisition", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "G = interpolate(data.glucose)\n", + "G_array = G(t_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "rocky-sydney", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "data.glucose.plot(style='o', color='C0', label='gluciose data')\n", + "plot(t_array, G_array, color='C0', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "id": "opened-scheduling", + "metadata": {}, + "source": [ + "### Under the hood" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "still-tolerance", + "metadata": {}, + "outputs": [], + "source": [ + "%psource interpolate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "essential-fishing", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap18.ipynb b/jupyter/chap18.ipynb new file mode 100644 index 00000000..5cb0c53a --- /dev/null +++ b/jupyter/chap18.ipynb @@ -0,0 +1,869 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "electric-netherlands", + "metadata": {}, + "source": [ + "# Chapter 18" + ] + }, + { + "cell_type": "markdown", + "id": "tribal-blame", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "hungry-lucas", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "original-photographer", + "metadata": {}, + "source": [ + "### Code from the previous chapter\n", + "\n", + "Read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "fewer-weather", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "computational-border", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_csv\n", + "\n", + "data = read_csv(filename, index_col='time');" + ] + }, + { + "cell_type": "markdown", + "id": "unique-domestic", + "metadata": {}, + "source": [ + "Interpolate the insulin data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "oriented-translation", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import interpolate\n", + "\n", + "I = interpolate(data.insulin)" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-bridges", + "metadata": {}, + "source": [ + "In this chapter, we implement the glucose minimal model described in the previous chapter. We'll start with `run_simulation`, which solves\n", + "differential equations using discrete time steps. This method works well enough for many applications, but it is not very accurate. In this chapter we explore a better option: using an **ODE solver**." + ] + }, + { + "cell_type": "markdown", + "id": "stunning-giving", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "To get started, let's assume that the parameters of the model are known.\n", + "We'll implement the model and use it to generate time series for `G` and `X`. Then we'll see how to find the parameters that generate the series that best fits the data." + ] + }, + { + "cell_type": "markdown", + "id": "polished-burner", + "metadata": {}, + "source": [ + "We can pass `params` and `data` to `make_system`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "substantial-literacy", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(params, data):\n", + " G0, k1, k2, k3 = params\n", + " \n", + " Gb = data.glucose[0]\n", + " Ib = data.insulin[0]\n", + " I = interpolate(data.insulin)\n", + " \n", + " t_0 = data.index[0]\n", + " t_end = data.index[-1]\n", + " \n", + " init = State(G=G0, X=0)\n", + " \n", + " return System(params=params, init=init, \n", + " Gb=Gb, Ib=Ib, I=I,\n", + " t_0=t_0, t_end=t_end, dt=2)" + ] + }, + { + "cell_type": "markdown", + "id": "metallic-motorcycle", + "metadata": {}, + "source": [ + "`make_system` uses the measurements at `t=0` as the basal levels, `Gb`\n", + "and `Ib`. It gets `t_0` and `t_end` from the data. And it uses the\n", + "parameter `G0` as the initial value for `G`. Then it packs everything\n", + "into a `System` object." + ] + }, + { + "cell_type": "markdown", + "id": "confident-performance", + "metadata": {}, + "source": [ + "Taking advantage of estimates from prior work, we'll start with these\n", + "values:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "under-rhythm", + "metadata": {}, + "outputs": [], + "source": [ + "# G0, k1, k2, k3\n", + "params = 290, 0.03, 0.02, 1e-05\n", + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "id": "stupid-retro", + "metadata": {}, + "source": [ + "Here's the update function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "roman-archive", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " G, X = state\n", + " G0, k1, k2, k3 = system.params \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " dt = system.dt\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " G += dGdt * dt\n", + " X += dXdt * dt\n", + "\n", + " return State(G=G, X=X)" + ] + }, + { + "cell_type": "markdown", + "id": "basic-subdivision", + "metadata": {}, + "source": [ + "As usual, the update function takes a `State` object, a time, and a\n", + "`System` object as parameters. The first line uses multiple assignment\n", + "to extract the current values of `G` and `X`.\n", + "\n", + "The following lines unpack the parameters we need from the `System`\n", + "object.\n", + "\n", + "Computing the derivatives `dGdt` and `dXdt` is straightforward; we just\n", + "translate the equations from math notation to Python.\n", + "\n", + "Then, to perform the update, we multiply each derivative by the discrete\n", + "time step `dt`, which is 2 min in this example. The return value is a\n", + "`State` object with the new values of `G` and `X`.\n", + "\n", + "Before running the simulation, it is a good idea to run the update\n", + "function with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "sapphire-shannon", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "G 278.12\n", + "X 0.00\n", + "dtype: float64" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "update_func(system.init, system.t_0, system)" + ] + }, + { + "cell_type": "markdown", + "id": "strange-citation", + "metadata": {}, + "source": [ + "If it runs without errors and there is nothing obviously wrong with the\n", + "results, we are ready to run the simulation. We'll use this version of\n", + "`run_simulation`, which is very similar to previous versions:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "willing-masters", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import linrange, TimeFrame\n", + "\n", + "def run_simulation(system, update_func):\n", + " init = system.init\n", + " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", + " \n", + " t_array = linrange(system.t_0, system.t_end, system.dt)\n", + " n = len(t_array)\n", + " \n", + " frame = TimeFrame(index=t_array, columns=init.index)\n", + " frame.iloc[0] = system.init\n", + " \n", + " for i in range(n-1):\n", + " t = t_array[i]\n", + " state = frame.iloc[i]\n", + " frame.iloc[i+1] = update_func(state, t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "musical-loading", + "metadata": {}, + "source": [ + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "international-germany", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
GX
0.02900
2.0278.120.0
4.0266.95280.0003
6.0256.295460.002668
8.0245.070140.004041
\n", + "
" + ], + "text/plain": [ + " G X\n", + "0.0 290 0\n", + "2.0 278.12 0.0\n", + "4.0 266.9528 0.0003\n", + "6.0 256.29546 0.002668\n", + "8.0 245.07014 0.004041" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = run_simulation(system, update_func)\n", + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "specialized-thomson", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA0IklEQVR4nO3deZyVdd3/8ddnNmZYh1WZGTYVQfZlJBVEtBLSFMQsjErLO7vvtJ/VLYllpXkbGJZllt6Wpne5loiaKYGIRC7IpiyyKSgzIJvszHrm8/vjXDMehlkOMGdj3s/H43qc63yv6zrnMxeH8znX9/u9vl9zd0RERJJNWqIDEBERqYsSlIiIJCUlKBERSUpKUCIikpSUoEREJCllJDqA49GpUyfv2bNnosMQEZHjsGTJkp3u3rl2eUonqJ49e7J48eJEhyEiIsfBzD6oq1xVfCIikpSUoEREJCkpQYmISFJK6TYoEZGGVFRUUFRURGlpaaJDESA7O5uCggIyMzOj2l8JSkROWEVFRbRp04aePXtiZokOp1lzd3bt2kVRURG9evWK6hhV8YnICau0tJSOHTsqOSUBM6Njx45HdTUbswRlZtlmtsjM3jazVWZ2W1B+q5kVm9nyYLko4pibzWyDma01s7Gxiq0us5YVM3L6PHpNfYGR0+cxa1lxPN9eRGJEySl5HO2/RSyr+MqAC9z9gJllAgvN7MVg293uflfkzmbWD5gE9AfygLlmdrq7h2IYIxBOTjfPXEFJRfitiveUcPPMFQBMGJof67cXEZE6xOwKysMOBE8zg6WhyafGA0+4e5m7bwQ2ACNiFV+kGbPX1iSnaiUVIWbMXhuPtxeRZuY//uM/WL16dZO8Vs+ePdm5c2eD+/z85z8/7Pk555zTJO8dazFtgzKzdDNbDmwH5rj7m8Gm683sHTN7yMzaB2X5wOaIw4uCstqvea2ZLTazxTt27GiSOLfsKTmqchGR4/HHP/6Rfv36xe39aieo1157LW7vfTximqDcPeTuQ4ACYISZDQDuA04FhgBbgV8Gu9dVOXnEFZe7P+Duhe5e2LnzEUM3HZO83JyjKhcRidbBgwe5+OKLGTx4MAMGDODJJ59kzJgxNcO0tW7dmptuuonhw4fzmc98hkWLFjFmzBhOOeUUnnvuOQAefvhhrr/++prX/PznP8/8+fOPeK8JEyYwfPhw+vfvzwMPPADA1KlTKSkpYciQIUyePLnmPSHcs27KlCkMGDCAgQMH8uSTTwIwf/58xowZwxe+8AX69u3L5MmTScTs63HpZu7ue8xsPjAusu3JzP4A/D14WgR0izisANgSj/imjO1zWBsUQE5mOlPG9onH24tIHNz2/CpWb9nXpK/ZL68tP72kf4P7vPTSS+Tl5fHCCy8AsHfvXu67776a7QcPHmTMmDHceeedXHbZZdxyyy3MmTOH1atXc9VVV3HppZdGHc9DDz1Ehw4dKCkp4cwzz+Tyyy9n+vTp3HvvvSxfvvyI/WfOnMny5ct5++232blzJ2eeeSajR48GYNmyZaxatYq8vDxGjhzJv//9b0aNGhV1LE0hlr34OptZbrCeA3wGWGNmXSN2uwxYGaw/B0wysxZm1gvoDSyKVXyRJgzNZ9rEgeTn5mBAfm4O0yYOVAcJETluAwcOZO7cudx0003861//ol27dodtz8rKYty4cTX7nnfeeWRmZjJw4EA2bdp0VO91zz33MHjwYM466yw2b97M+vXrG9x/4cKFXHnllaSnp3PSSSdx3nnn8dZbbwEwYsQICgoKSEtLY8iQIUcdS1OI5RVUV+ARM0snnAifcve/m9mfzWwI4eq7TcC3ANx9lZk9BawGKoHr4tGDr9qEoflKSCInsMaudGLl9NNPZ8mSJfzjH//g5ptv5sILLzxse2ZmZk3367S0NFq0aFGzXllZCUBGRgZVVVU1x9R1L9H8+fOZO3cur7/+Oi1btmTMmDGN3nPUULVddRwA6enpNbHEUyx78b3j7kPdfZC7D3D3nwXlX3X3gUH5pe6+NeKYO9z9VHfv4+4v1v/qIiKpYcuWLbRs2ZKvfOUr3HjjjSxduvSoX6Nnz54sX76cqqoqNm/ezKJFR1Yu7d27l/bt29OyZUvWrFnDG2+8UbMtMzOTioqKI44ZPXo0Tz75JKFQiB07drBgwQJGjIhL5+moaKgjEZEYWrFiBVOmTCEtLY3MzEzuu+8+brzxxqN6jZEjR9KrVy8GDhzIgAEDGDZs2BH7jBs3jvvvv59BgwbRp08fzjrrrJpt1157LYMGDWLYsGE8+uijNeWXXXYZr7/+OoMHD8bM+MUvfsHJJ5/MmjVrjv0PbkKWiJ4ZTaWwsNA1YaGI1Ofdd9/ljDPOSHQYEqGufxMzW+LuhbX31Vh8IiKSlJSgREQkKSlBiYhIUlKCEhGRpKQEJSIiSUkJSkREkpISlIhIAlx99dX87W9/S3QYdTqWKTxiQQlKRCSgmbWjpwQlIhIn1TNrF+8pwflkZu3jTVK33347ffv25bOf/SxXXnkld9111xH7RF6xLF68mDFjxgBw4MABvv71rzNw4EAGDRrE008/DcDjjz9eM6rETTfdBEAoFOLqq6+umTrj7rvvBuC9995j3LhxDB8+nHPPPbfOUSJ27drFhRdeyNChQ/nWt7512Bh90U7hUdd+x0tDHYmI0PDM2sc6kPTixYt5+umnWbZsGZWVlQwbNozhw4dHffztt99Ou3btWLFiBQC7d+9my5Yt3HTTTSxZsoT27dtz4YUXMmvWLLp160ZxcTErV4YniNizZw8QHubo/vvvp3fv3rz55pt8+9vfZt68eYe9z2233caoUaP4yU9+wgsvvHBYgol2Co+69uvYseMxnbdqSlAiIsRmZu2FCxcyfvx4cnLCk59ecsklR3X83LlzeeKJJ2qet2/fngULFjBmzBiqJ2ydPHkyCxYs4Mc//jHvv/8+3/nOd7j44ou58MILOXDgAK+99hpXXHFFzWuUlZUd8T4LFixg5syZAFx88cW0b9++Zts999zDM888A1AzhUddiSfa/Y6GEpSICOEZtIvrSEbHM7N2tGOdRk6nETlFhrvXTMXR2Gu2b9+et99+m9mzZ/O73/2Op556il//+tfk5ubWOVlhbbXfB6KfwuNYpvqIhtqgREQIz6ydk5l+WNnxzqw9atQonn/+eUpLSzlw4EDNrLq19ezZkyVLlgDUtDMBXHjhhdx77701z3fv3s2nPvUpXn31VXbu3EkoFOLxxx/nvPPOY+fOnVRVVXH55Zdz++23s3TpUtq2bUuvXr3461//CoST29tvv33E+48ePbpmlPMXX3yR3bt3A9FP4dHQfsdDCUpEhNjMrH3mmWdy6aWXMnjwYCZOnEhhYeERM+oC/PSnP+WGG27g3HPPJT39kyR5yy23sHv3bgYMGMDgwYN55ZVX6Nq1K9OmTeP8889n8ODBDBs2jPHjx1NcXMyYMWMYMmQIV199NdOmTQPg0Ucf5cEHH2Tw4MH079+fZ599ts73X7BgAcOGDeOf//wn3bt3B8JTeFRWVjJo0CB+/OMf1zmFx+TJkxvc73houg0ROWElw3QbBw4coHXr1hw6dIjRo0fzwAMP1DmfU3NxNNNtqA1KRCSGrr32WlavXk1paSlXXXVVs05OR0sJSkQkhh577LFEh5Cy1AYlIie0VG7GONEc7b+FEpSInLCys7PZtWuXklQScHd27dpFdnZ21Meoik9ETlgFBQUUFRWxY8eORIcihH8wFBQURL2/EpSInLAyMzPp1atXosOQY6QqPhERSUpKUCIikpSUoEREJCkpQYmISFJSghIRkaSkBCUiIklJCUpERJJSzBKUmWWb2SIze9vMVpnZbUF5BzObY2brg8f2EcfcbGYbzGytmY2NVWwiIpL8YnkFVQZc4O6DgSHAODM7C5gKvOzuvYGXg+eYWT9gEtAfGAf83szS63phERE58cUsQXnYgeBpZrA4MB54JCh/BJgQrI8HnnD3MnffCGwARsQqPhERSW4xbYMys3QzWw5sB+a4+5vASe6+FSB47BLsng9sjji8KCir/ZrXmtliM1us8bVERE5cMU1Q7h5y9yFAATDCzAY0sLvV9RJ1vOYD7l7o7oWdO3duokhFRCTZxKUXn7vvAeYTblvaZmZdAYLH7cFuRUC3iMMKgC3xiE9ERJJPLHvxdTaz3GA9B/gMsAZ4Drgq2O0q4Nlg/Tlgkpm1MLNeQG9gUaziExGR5BbL6Ta6Ao8EPfHSgKfc/e9m9jrwlJldA3wIXAHg7qvM7ClgNVAJXOfuoRjGJyIiScxSeabJwsJCX7x4caLDEBGR42BmS9y9sHa5RpIQEZGk1Kxn1J21rJh3ivbyk0v61bltxuy1bNlTQl5uDlPG9mHC0CN6vYuISIw06yuo93cc4E+vbaR4T8lh5bOWFXPzzBUU7ynBgeI9Jdw8cwWzlhUnJlARkWaoWSeoL54Z7tX+5FubDyufMXstJRWH988oqQgxY/bauMUmItLcNesEVdC+Jeed3pm/Lt5MZaiqpnxLrSuqxspFRKTpNesEBTDpzO5s3VvKq+s+GTYpLzenzn3rKxcRkabX7BPUp8/oQuc2LXh80Yc1ZVPG9iEn8/CB1HMy05kytk+8wxMRabaafYLKTE/jiuEFzFuznY/2lgIwYWg+0yYOJD83BwPyc3OYNnGgevGJiMRRg93MzayA8BxN5wJ5QAmwEngBeNHdqxo4PGVMOrM7v5//Hk8t3sz/+3RvIJyklJBERBKn3isoM/sT8BBQDtwJXAl8G5hLeNDXhWY2Oh5Bxlr3ji05t3cnnnxrM6Gq1B1ZQ0TkRNLQFdQv3X1lHeUrgZlmlgV0j01Y8TfpzO5c99hSFqzfwfl9ujR+gIiIxFS9V1D1JCcAzOxJdy939w2xCSv+PtvvJDq1zuLRNz5sfGcREYm5Y+0kcXaTRpEEsjLSmHRmd+at2cbmjw8lOhwRkWav2ffii/TlT3XHzPjLmx8kOhQRkWav3jYoMxtW3yYgMzbhJFZebg4X9juJJ9/azPc+czrZte6FEhGR+Gmwk0QD29Y0dSDJ4mtn9+TFlR/x3Ntb+GJht8YPEBGRmKg3Qbn7+fEMJFmcdUoH+pzUhkde28QVwwsws0SHJCLSLDVUxTexoQPdfWbTh5N4ZsbXzunBj55ZydIPdzO8R4dEhyQi0iw11EnikmC5BngQmBwsfwS+EvvQEmfCkHzaZGfwyGvqLCEikigN3Qf1dXf/OuBAP3e/3N0vB/rHLboEadUigy8WduMfK7ayfV9posMREWmWoulm3tPdt0Y83wacHqN4ksZXz+pByJ2/vKGrKBGRRIgmQc03s9lmdrWZXUV4oNhXYhxXwvXs1IpP9z2Jv7z5IaW1ZtcVEZHYazRBufv1wP8Cg4EhwAPu/p0Yx5UUrhnVi48PljNrWXGiQxERaXYa6sU3G3iJ8LQaM4ETstdeQ846pQP9urblwYUb+dKZ3dTlXEQkjhq6groK2A3camZLzew+MxtvZq3jFFvCmRnXjOrF+u0HWLB+Z6LDERFpVhrqxfeRuz/s7pOAQuD/gOHAbDOba2Y/iFeQiXTJ4Dy6tGnBgws3JjoUEZFmJarBYt29yt1fd/efuPtIwrPsNouGmayMNL52dg8WrNvBum37Ex2OiEiz0eCU7wBm9lvC90JF2gssjklESejLn+rBb+dt4KGFG5l++aBEhyMi0ixEcwXVgnDvvfXBMgjoAFxjZr+OWWRJpEOrLCYOK2DmsmI+Plie6HBERJqFaBLUacAF7v5bd/8t8BngDOAy4MJYBpdMrj6nJ+WVVTy1eHOiQxERaRaiSVD5QKuI562APHcPAWX1HWRm3czsFTN718xWmdkNQfmtZlZsZsuD5aKIY242sw1mttbMxh7j39TkZi0r5hsPvwXAjJfWMnNJUYIjEhE58TXaBgX8AlhuZvMJT1Y4Gvi5mbUC5jZwXCXw3+6+1MzaAEvMbE6w7W53vytyZzPrR7jzRX8gD5hrZqcHiTBhZi0r5uaZKygJRpMIuTN15grS0owJQ/MTGZqIyAktmpEkHgTOAWYFyyh3/6O7H3T3KQ0ct9Xdlwbr+4F3CV+N1Wc88IS7l7n7RmADMCLaPyRWZsxeW5OcqpWHqpgxe22CIhIRaR6i6mYOdCbcky8NOKuxuaJqM7OewFDgzaDoejN7x8weMrP2QVk+ENnAU0QdCc3MrjWzxWa2eMeOHUcTxjHZsqfkqMpFRKRpNJqgzOwh4CHgcj6ZI+rz0b5BMPLE08B33X0fcB9wKuGegVv5ZGr5usYRqt29HXd/wN0L3b2wc+fO0YZxzPJyc+osb9kiPebvLSLSnEXTBnWWu/c7lhc3s0zCyenR6hl43X1bxPY/AH8PnhYB3SIOLwC2HMv7NqUpY/sc1gYFkG5GZWUVB8sqadUimlMoIiJHK5oqvteDDgxHxcIjqz4IvOvuv4oo7xqx22XAymD9OWCSmbUws15Ab2DR0b5vU5swNJ9pEweSn5uDAfm5OVx/wWmUhZxnNMq5iEjMRPPz/xHCSeojwt3KDXB3b2xIhZHAV4EVZrY8KPshcKWZDSFcfbcJ+BbhF1xlZk8Bqwn3ALwu0T34qk0Ymn9Yjz135+U12/i/1zcx+VPdNcq5iEgMRJOgHiJINEBVtC/s7gupu13pHw0ccwdwR7TvkSjPLt9C0e4S9hyq4Mw75nLLxf3U5VxEpIlFk6A+dPfnYh5Jiqh9X9TOA+XcPHMFgJKUiEgTiiZBrTGzx4DniRg5orrTQ3NT131RJRUhZsxeqwQlItKEoklQOYQTU+S4e04znGEXdF+UiEi8NJqg3P3r8QgkVeTl5lBcRzLq2i47AdGIiJy46u1mbma3mFmHBrZfYGZR37B7opgytg85mUfepHt+39jfNCwi0pw0dAW1AnjezEqBpcAOIJvw/UlDCA8U+/NYB5hsqtuZZsxey5Y9JeTlZlMeqmLlFs22KyLSlOpNUO7+LPCsmfUmfE9TV2Af8BfgWndvto0ute+LeuS1Tfz0uVUs37yHId1yExeYiMgJJJrRzNe7+8PuPs3df+3us5tzcqrLxGH5tG6RwZ/+vTHRoYiInDCiHc1cGtAmO5MvFnbjhXe28tHe0kSHIyJyQlCCaiJfH9mTKnceeX1TokMRETkhKEE1kW4dWnJhv5N57M0POVRemehwRERSXqP3QZlZZ+CbQM/I/d39G7ELKzVdc24vXlr1EU8vLearZ/VIdDgiIiktmpEkngX+RbhbeVKMLp6sCnu0Z1BBO/60cCOTR3QnLU2jnIuIHKtoElRLd78p5pGcAMyMa0b14oYnlvPquh2c37dLokMSEUlZ0bRB/d3MLop5JCeIiwZ25eS22Ty4UF3ORUSORzQJ6gbCSarUzPYHy75YB5aqMtPT+No5PVi4YSert+g0iYgcq2hu1G3j7mnunh2st3H3tvEILlVNHtGDVlnpPLDgvUSHIiKSsqLqZm5ml5rZXcHS7AaIPVrtWmZy5YjuPP/OVop2H0p0OCIiKanRBGVm0wlX860OlhuCMgnMWlbMyOnz6DX1BUZOn8esZcV8Y1QvDNQWJSJyjKK5groI+Ky7P+TuDwHjgjLhkyngi/eU4EDxnhJunrmCRRs/5tIheTyxaDO7D5YnOkwRkZQT7UgSuRHr7WIQR8pqaAr4b40+lZKKEH9544MERScikrqiSVDTgGVm9rCZPQIsoRnOA1WfhqaA73NyGy7o24WHX9tEaYXucRYRORrR9OJ7HDgLmBksZ7v7E7EOLFXk5ebUWe7AyOnz6Ne1DbsOlvPXJUXxDUxEJMU1NOV73+BxGOHJCouAzUBeUCbUPwU8hNujHly4ke4dcnhgwXtUhqriHJ2ISOpqaKij7wPXAr+sY5sDF8QkohQTOQV8cR3VfSUVVRwoC/HxwXKeXb6Fy4cXxDtEEZGUZO7e8A5m2e5e2lhZIhQWFvrixYsTHUaNXlNfoK6zaUDfrm0pqwwx53vnka5BZEVEapjZEncvrF0eTSeJ16Isa/bqa4/Ky83hOxecxvs7DvKPFVvjHJWISGpqqA3qZDMbDuSY2VAzGxYsY4CW8QowldTVHpWZZhwqr+S6R5eSkWbc8cJqqqoavmoVEZGG26DGAlcDBcCvIsr3Az+MYUwpK7I9asueEtrlZHKwvJLdhyoAqKxyPtpXxv+8sJqfXNI/kaGKiCS9aNqgLnf3p+MUz1FJtjao2kZOn1dnx4nMdGPd/3wOM7VFiYgccxuUuz9tZheb2Q/M7CfVSxRv2M3MXjGzd81slZndEJR3MLM5ZrY+eGwfcczNZrbBzNaa2dij/SOTTX038VaEnPlrd8Q5GhGR1BLNYLH3A18CvkO4Q9oVQI8oXrsS+G93P4Pwjb7XmVk/YCrwsrv3Bl4OnhNsmwT0Jzze3+/NrO4bjFJEfZ0m0tOMu+euo7GrVxGR5iyaXnznuPvXgN3ufhtwNtCtsYPcfau7Lw3W9wPvAvnAeOCRYLdHgAnB+njgCXcvc/eNwAZgxFH8LUmnrk4TOZnpXFFYwDtFe5mzeluCIhMRSX7RJKjq+50OmVkeUAH0Opo3MbOewFDgTeAkd98K4SQGdAl2yyc8UkW1oqAsZU0Yms+0iQPJz83BgPzcHKZNHMj/jB9Ar06t+NWcderRJyJSj4Z68VV73sxygRnAUsKjSPwh2jcws9bA08B33X1fAx0D6tpwxLe3mV1LeIQLunfvHm0YCTNhaH5N7z4IT89x3oz5NZ0nbn1+FT8bPyBR4YmIJK0Gr6DMLI1we9GeoCdfD6CvuzfaSSI4PpNwcnrU3WcGxdvMrGuwvSuwPSgv4vCqwwJgS+3XdPcH3L3Q3Qs7d+4cTRhJI3LuqGp/fv0DZi7Z3MBRIiLNU4MJyt2riBiLL2gf2hvNC1v4UulB4F13j7yP6jngqmD9KuDZiPJJZtbCzHoBvYFFUf0VKaKuuaMc+NkL7yYmIBGRJBZNFd8/zexyYKYfXbezkcBXgRVmtjwo+yEwHXjKzK4BPiTcKxB3X2VmTxGeVr4SuM7dT6hJlOrrdr7nUAXnTHuZrXtLycvNYcrYPodVC4qINEfRJKjvA62ASjMrJdxW5O7etqGD3H0hdbcrAXy6nmPuAO6IIqaUlJebU+eNuwBb9ob7olRPGQ8oSYlIsxbNjbpt3D3N3bPcvW3wvMHkJHWrq9t5XRm8esp4EZHmLJobdV+OpkwaV1e38/rqTOurDhQRaS7qreIzs2zCo5Z3CoYjqv6x3xbIi0NsJ6Ta3c7rG6+vvlEoRESai4auoL4FLAH6Bo/Vy7PA72IfWvNQ32gTU8b2SVBEIiLJod4rKHf/DfAbM/uOu/82jjE1K3VNGX/9Baepg4SINHuN9uJz99+a2TlAz8j93f3/YhhXs1Jd7bf3UAWjZ7zCG+/v4ttjTtV0HCLSrEXTSeLPwF3AKODMYDli3g45fu1aZnLDp3vzr/U7efnd7Y0fICJyAovmPqhCoN9R3qQrx+irZ/fg8UUf8rO/r2ZU705kZ6b0jCMiIscsmtHMVwInxzoQCctMT+Onl/Tnw48P8eDCjYkOR0QkYaK5guoErDazRUBZdaG7XxqzqJq5Ub07Ma7/ydw7bwOXDc1Xl3MRaZaiSVC3xjoIOdKPLj6DV9ZuZ9qLa/jtlUMTHY6ISNxFM9TRq8AmIDNYf4vwvFASQ906tOQ/zzuV59/ewhvv70p0OCIicRdNL75vAn8D/jcoygdmxTAmCfzXmFMpaJ/DLbNWUlZ5Qg3sLiLSqGg6SVxHeOqMfQDuvp5PpmmXGMrOTOf28QPYsP0A//vq+4kOR0QkrqJpgypz9/Lqm0bNLIM6pmKXpjdrWXHNqOa/mrOOFplpfGv0qQmOSkQkPqK5gnrVzH4I5JjZZ4G/As/HNiypa3r4O19cwzNLixIYlYhI/ESToKYCO4AVhAeQ/QdwSyyDkrqnh69yuO351QmKSEQkvqKp4ssBHnL3PwCYWXpQdiiWgTV39U4PX1LBjv1ldG7TIs4RiYjEVzRXUC8TTkjVcoC5sQlHqjV0c+4ts1agkadE5EQXTYLKdvcD1U+C9ZaxC0mg/nmiLh3UldmrtvHs8i0JikxEJD6iqeI7aGbD3H0pgJkNBzQfeYxFzhO1ZU8Jebk5TBnbh0sG51G8t5SfPLuSs0/tyEltsxMcqYhIbFhjVUVmdibwBFD9k70r8CV3XxLj2BpVWFjoixcvTnQYcbdx50E+95sFnH1KRy4dnMdd/1x3WBLTZIcikkrMbIm7HzGNUzQTFr5lZn2BPoABa9y9IgYxSpR6dWrF1HF9ufX51SzcsJOKUPhHRvGeEm6euQJASUpEUl40bVAQnqRwEDAUuNLMvha7kCQaXzu7J1kZaTXJqVpJRajm5l4RkVTW6BVUMKPuqcByoPrGHAc05XsCpaUZFZVVdW6rr4u6iEgq0Yy6KSwvN+ewkSYiy0VEUp1m1E1h9XVFnzK2T4IiEhFpOppRN4VVd4T4xUtr2LK3lDSDH17cVx0kROSEoBl1U9yEoflMGJrPmo/2Mf7ef/PPVdv48ogepKdZokMTETku0c6ouwZoEyzvBmWSRPqe3JbbLu3Pv9bv5Ndz1yU6HBGR4xbNjLpfBBYBVwBfBN40sy/EOjA5epNGdOdLhd347bwNzFm9LdHhiIgcl2g6SfwIONPdr3L3rwEjgB83dpCZPWRm281sZUTZrWZWbGbLg+WiiG03m9kGM1trZmOP5Y8RuG18fwbmt+P7Ty5n486DiQ5HROSYRZOg0tx9e8TzXVEe9zAwro7yu919SLD8A8DM+gGTgP7BMb8PpvWQo5Sdmc59XxlGerrxn39ewqHyykSHJCJyTKJJNC+Z2Wwzu9rMrgZeAF5s7CB3XwB8HGUc44En3L3M3TcCGwhfqckxKGjfknsmDWXd9v3891NvU1WlW9hEJPVE00liCvC/hIc6Ggw84O4/OI73vN7M3gmqANsHZfnA5oh9ioKyI5jZtWa22MwW79ix4zjCOLGNPr0zP7roDF5c+RG/nKOhj0Qk9dSboMzsNDMbCeDuM939++7+PWCXmZ16jO93H+Fhk4YAW4FfVr9dHfvW+bPf3R9w90J3L+zcufMxhtE8XDOqF1eO6MbvXnmPmUuLEh2OiMhRaegK6tfA/jrKDwXbjpq7b3P3kLtXAX/gk2q8IqBbxK4FfDK9hxwjM+Nn4wdwzqkdmfr0Ct7aFG2Nq4hI4jWUoHq6+zu1C919MdDzWN7MzLpGPL2M8DBKAM8Bk8yshZn1AnoT7touxykzPY3PD+pKyJ0r7n+dT/18LrOWFSc6LBGRRjU0kkRDU7U2OhqpmT0OjAE6mVkR8FNgjJkNIVx9twn4FoC7rzKzp4DVQCVwnbuH6nhZOUqzlhVz+9/fJRR0lNi2r4ypT4d/d2hIJBFJZg0lqLfM7Jvu/ofIQjO7Bmh0Nl13v7KO4gcb2P8O4I7GXleOzozZaympODzXl1ZWcedLa5SgRCSpNZSgvgs8Y2aT+SQhFQJZhKvnJAXUNzfU1r2llFaEyM7U7WYikpzqbYMKOjScA9xGuDpuE3Cbu5/t7h/FJzw5Xg3NDXXDE8uoDNU96aGISKJFcx/UK+7+22CZF4+gpOnUN2fUxKF5zF61je899XZN+5SISDKJZroNSWHV7UwzZq9ly54S8nJzmDK2DxOG5tP7pLbc+dIastLTmPGFQaRpig4RSSJKUM1A9ZxRtf3XmFMpr6zi7rnryMow7pgwUElKRJKGElQz9/8+fRrloRC/e+U9wLhjwgAlKRFJCkpQzZyZceOFfXCH389/j7KKEL/4wiAy0qMZR1hEJHaUoAQz4wfj+tKqRUbNfVO/mTSUrAwlKRFJHH0DSY3rzj+NH3++Hy+u/Ihv/XkxJeUazENEEkcJSg5zzaheTJs4kPnrdvDlP77BxwfLEx2SiDRTSlByhCtHdOe+ycNZvWUfl9/3Gh/s0tTxIhJ/SlBSp3EDTuaxb36K3YfKufy+13h78x4gPPjsyOnz6DX1BUZOn6eR0UUkZsw9dUcRKCws9MWLFyc6jBPaezsOcNVDi9h5oIwvFXbjqcVFhw0+m5OZzrSJAzXwrIgcMzNb4u6Ftct1BSUNOrVza5759kj657Xjkdc/OGJk9JKKEDNma0p5EWl6SlDSqM5tWvDYNz9V7/b6RkwXETkeSlASlRYZ6eTn1j2HZUMjpouIHCslKInalLF9jxgZPTPdmDK2T4IiEpETmRKURG3C0HymTRxIfm4OBmSlp1ERcl57b6du6hWRJqehjuSoRI6MXhmq4tdz13PvKxtYvGk3d39pCIO75SY2QBE5YegKSo5ZRnoaN47tw2P/8SlKKkJMvO817nl5vWbpFZEmoQQlx+2c0zrx0g2j+fygrvxqzjq+cP/rrNu2P9FhiUiKU4KSJtGuZSa/mTSUe64cyge7DnLxPf/i7jnrKKtU25SIHBslKGlSlw7OY+73z+OigV35zcvrufiehby16eNEhyUiKUgJSppcx9Yt+M2kofzp62dSUh7iivtf53tPLmfbvtJEhyYiKUQJSmLm/D5dmPP90Vx//mm88M5Wzr9rPvfNf0/VfiISFSUoiamWWRncOLYPc74/mnNO7cSdL63hgrteZebSIkJVqTtQsYjEnkYzl7hauH4n0196l5XF+8hIMyqrnPzcbKaM7asR0UWaKY1mLklhVO9OXHNOLzLTw8kJoHhPKT/42zs8s7QowdGJSDJRgpK4u2vOOipCh1+5l4eq+MHT7/DSyq2q+hMRQEMdSQLUNz1HRcj5z78spUfHlnxjZC++MLyAVi30ERVprmJ2BWVmD5nZdjNbGVHWwczmmNn64LF9xLabzWyDma01s7GxiksSr77pOfJys/n95GF0aJXFT59bxTnT53HHC6vZuPNgnCMUkWQQyyq+h4FxtcqmAi+7e2/g5eA5ZtYPmAT0D475vZmlIyekKWP7HDFtR05mOj8Y25eLBnblmW+P5On/OodRp3XiT//exPl3zecrf3yTf6zYSnmlxvkTaS5iVn/i7gvMrGet4vHAmGD9EWA+cFNQ/oS7lwEbzWwDMAJ4PVbxSeJU99abMXstW/aUkJebw5SxfQ7rxTe8R3uG92jP9n2lPLV4M48v2sy3H11KbstMLh2cx8RhBQwuaIeZJerPEJEYi2k38yBB/d3dBwTP97h7bsT23e7e3szuBd5w978E5Q8CL7r73+p4zWuBawG6d+8+/IMPPohZ/JI8QlXOgvU7mLm0mH+u+oiyyipO6dSKzw/qyucH53H6SW0SHaKIHKP6upknSwt0XT+D68yc7v4A8ACE74OKZVCSPNLTjPP7dOH8Pl3YW1LBP1Zs5bnlW7j3lQ3cM28Dp5/UmnH9T+az/U5mQH5bXVmJnADinaC2mVlXd99qZl2B7UF5EdAtYr8CYEucY5MU0S4nkytHdOfKEd3Zvr+U2Ss/4u/vbK1JVie3zebTZ3RhTJ8unH1qR1qrJ6BISor3/9zngKuA6cHjsxHlj5nZr4A8oDewKJaBzFpW3GAbiKSGLm2yaZOdSdHuEtyhfctMurTJ4pllxTz65odkpBnDe7Rn9OmdOeuUjgwqaEdmum7/E0kFMUtQZvY44Q4RncysCPgp4cT0lJldA3wIXAHg7qvM7ClgNVAJXOfuMRtRdNayYm6euYKSivBbFO8p4eaZKwCUpFJM7X/L3YcqKK2o4vbx/clrn8Or63awYN1OZsxeC0CrrHQKe3ZgRK8ODO/RnsEFueRkqcOoSDJqlmPxjZw+j+I6bhbNz83h31MvaIrQJE6i/bfceaCMRRs/5o33d/H6e7tYv/0AABlpRv+8tgzulsvA/HYMKsjltC6tSU9TG5ZIpKoqp7QyRGlFFaUVIZ5/Zwt//NdGdu4vO+5aqGTvJBFX9Y1kUF+5JK9o/y07tW7BRQO7ctHArgDsPljOss27WfJBeJm5tJj/ez3cIzQ7M40+J7elX9c2nNG1LX1OasNpXVrTsXWL2P4xIkepOmmUlIcoqQhRWhGipLyqpqy0IlxeVlFFSUXEPhUhSsvDyaa6rLQynHg+WT7ZVlZRRXmo/nsQY1UL1SwTVF5uTp2/uusb4UCS17H+W7ZvlcUFfU/igr4nAeH/6O/vPMiK4j2sKNrHu1v38eLKj3h80eaaYzq0yuK0zq05pXMrenZqRc+OLenZqRXd2rfUkExyBHenrLKqJnkcKg8njUPlleFkEVFeWr29urx6PWK/yIRT/bzsGG9cz8pIIycznezMNLIz08nJTKdFZjo5mWl0aJVFdkY6OVnh7S0y0skO9g0fk87dc9axp6TisNcsqQgxY/ZaJajjNWVsn8PaLSA8ksGUsX0SGJUci6b6t0xLM07r0prTurTmsqHhMnfno32lrNt2gPXb9vPejgOs33aAOau3setg+WHHd2iVRUH7HPJzc+jaLoe83GxObpfNSW2z6dKmBV3aZKutKwlVhKrqTByHyqsTRmXN9pLyEIcqIvetoqS88pN9y0McqqikpDxcXlIR4mjHPc5MN3Iyw8mhOhm0zAo/z83JrCkPJ4/0WvumkZOV8cl6cHzkvtmZaWRnpJN2nFXYtz63qs7ypq6FapYJKpqRDCQ1xPLf0szo2i6ccM47vfNh2/aVVrBp50E27TpE0e5DFO0uYfPHh1i7bT+vrtvBofIj+/i0bpFBx9ZZdGyVRcfWLejQMovcVpnk5mSR2zKTdjmZtMnOoE12Jm2zM2jdIoNWLcJfOMf7hZJKKkNVlFVWUV4ZfiytCNU81q6KKouohqqpwqq5+qiqueqITCiRVy21R9VvTGa61SSNlkEyyMlKp012Bl3atAiSSUb4MdjWMljCx2UcllRqtgXP6+thmmy9juNVC9UsO0mI1KWpvgTcnX2llWzdW8K2fWVs31fKjgNlbN9XxscHy9l1sIxdB8r5+GA5e0oqGh1f0AxaHvFLOJ2sjDRaZKSRlZFGVnoamcFjRpqRkW6kpxkZaWmkmZGeFr5KTDMjzcAIP2JW/13y7nj4Acepcqhyxz1cJRpyr3kMVUGoqorKKidU5VRWOZWhKipDTkXEenmoisqqKioqw+vllVWfPFZWUVZ59FcdkbLS0464ymhZ6wqj+lzmZKUfvp6VTk5mRs0VS05kIgq2J+IWhdo9VSFcSzBt4sCEJammjkmdJEQa0JS3HpgZ7XLCV0R9T258/5LyELsPlbOvtIL9pZXsL61gX0klB8oqWbRxF6+s3cH+0koc6NmxJZ3bZFNaEaI8VEVZRRX7SyupCFUFi1MRqiIUkSiq16u8egkn0erk0/DfEh7mJc0svG5GepDk0sxISwsnwjSzmsSYkRYuz0xLCz8PkmZmutEmMyOcRNONrIx0PtpTwqqt+zhUHqJ1i3Q+3bcLAwtyaZERbhupTsDVbSDh9pDq54dXXbXISG+S3pezlhUzY2byXK3MmL32sEQAsWnvORrxqoVSghIhsV8C4V/wOeRxePXIrGXFzFm9vSauQ+UhVm3Zz7SJPY8ppmiuEN09bsNE1f5RcKAsxMINu7h4UF7SXBkkwz2SydrreMLQ/JifE91SL0Jyfgk0lDSPVvUXb/GeEpxPvnhnLSs+bL94jmHYlH9fU0nGmOqfP+3E73WsBCVCcn4JNGXSTMYv3mT8UZCMMdU3f1pz6HWsBCVC038JzFpWzMjp8+g19QVGTp93xJVKNJoyaSbjF28y/ihIxpgmDM1n2sSB5OfmYIRHSUlkB4l4UhuUCE3b6NtU7RhNeb9eMt6cnoz3IyZjTBCf9p5kpAQlEmiqL4Gm6nDRlEkzGb94k/F+xGSMqTnTfVAiTazX1BfqnG3TgI3TL453ODWS7WZPkWq6D0okTpKxOg2abzWRpC51khBpYs2515VIU9IVlEgTUzuGSNNQghKJAVWniRw/VfGJiEhSUoISEZGkpAQlIiJJSQlKRESSkhKUiIgkJSUoERFJSik91JGZ7QA+OM6X6QTsbIJw4i1V44bUjV1xx1eqxg2pG3ui4u7h7p1rF6Z0gmoKZra4rjGgkl2qxg2pG7vijq9UjRtSN/Zki1tVfCIikpSUoEREJCkpQcEDiQ7gGKVq3JC6sSvu+ErVuCF1Y0+quJt9G5SIiCQnXUGJiEhSUoISEZGk1KwTlJmNM7O1ZrbBzKYmOp76mFk3M3vFzN41s1VmdkNQfquZFZvZ8mC5KNGx1mZmm8xsRRDf4qCsg5nNMbP1wWP7RMcZycz6RJzT5Wa2z8y+m6zn28weMrPtZrYyoqzec2xmNwef+bVmNjYxUdcb9wwzW2Nm75jZM2aWG5T3NLOSiHN/f5LFXe9nI8nP95MRMW8ys+VBeXKcb3dvlguQDrwHnAJkAW8D/RIdVz2xdgWGBettgHVAP+BW4MZEx9dI7JuATrXKfgFMDdanAncmOs5GPicfAT2S9XwDo4FhwMrGznHwuXkbaAH0Cv4PpCdR3BcCGcH6nRFx94zcLwnPd52fjWQ/37W2/xL4STKd7+Z8BTUC2ODu77t7OfAEMD7BMdXJ3be6+9JgfT/wLpDKs+GNBx4J1h8BJiQulEZ9GnjP3Y93xJKYcfcFwMe1ius7x+OBJ9y9zN03AhsI/1+Iu7ridvd/untl8PQNoCDugTWinvNdn6Q+39XMzIAvAo/HNahGNOcElQ9sjnheRAp86ZtZT2Ao8GZQdH1QHfJQslWVBRz4p5ktMbNrg7KT3H0rhJMv0CVh0TVuEof/p032812tvnOcSp/7bwAvRjzvZWbLzOxVMzs3UUE1oK7PRqqc73OBbe6+PqIs4ee7OScoq6Msqfvcm1lr4Gngu+6+D7gPOBUYAmwlfImebEa6+zDgc8B1ZjY60QFFy8yygEuBvwZFqXC+G5MSn3sz+xFQCTwaFG0Furv7UOD7wGNm1jZR8dWhvs9GSpxv4EoO/yGWFOe7OSeoIqBbxPMCYEuCYmmUmWUSTk6PuvtMAHff5u4hd68C/kCCqg4a4u5bgsftwDOEY9xmZl0BgsftiYuwQZ8Dlrr7NkiN8x2hvnOc9J97M7sK+Dww2YMGkaCKbFewvoRwW87piYvycA18NlLhfGcAE4Enq8uS5Xw35wT1FtDbzHoFv5QnAc8lOKY6BfXDDwLvuvuvIsq7Rux2GbCy9rGJZGatzKxN9TrhBvCVhM/zVcFuVwHPJibCRh32qzLZz3ct9Z3j54BJZtbCzHoBvYFFCYivTmY2DrgJuNTdD0WUdzaz9GD9FMJxv5+YKI/UwGcjqc934DPAGncvqi5ImvOd6F4aiVyAiwj3iHsP+FGi42kgzlGEqwXeAZYHy0XAn4EVQflzQNdEx1or7lMI92B6G1hVfY6BjsDLwPrgsUOiY60j9pbALqBdRFlSnm/CSXQrUEH4F/s1DZ1j4EfBZ34t8Lkki3sD4Tab6s/5/cG+lwefobeBpcAlSRZ3vZ+NZD7fQfnDwH/W2jcpzreGOhIRkaTUnKv4REQkiSlBiYhIUlKCEhGRpKQEJSIiSUkJSkREkpISlEicmVmumX07WM8zs78lOiaRZKRu5iJxFoyn+Hd3H5DoWESSWUaiAxBphqYDpwZz76wHznD3AWZ2NeFRx9OBAYTHc8sCvgqUARe5+8dmdirwO6AzcAj4pruvifcfIRJrquITib+phKfwGAJMqbVtAPBlwmO53QEc8vCAna8DXwv2eQD4jrsPB24Efh+PoEXiTVdQIsnlFQ/P+bXfzPYCzwflK4BBwYj25wB/DQ/RCIQnwxM54ShBiSSXsoj1qojnVYT/v6YBe4KrL5ETmqr4ROJvP9DmWA708DxgG83sCgiPdG9mg5syOJFkoQQlEmcenmfn32a2EphxDC8xGbjGzKpHiR/flPGJJAt1MxcRkaSkKygREUlKSlAiIpKUlKBERCQpKUGJiEhSUoISEZGkpAQlIiJJSQlKRESS0v8HXfrbiqZFJV0AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results.G.plot(style='-', label='simulation')\n", + "data.glucose.plot(style='o', color='C0', label='glucose data')\n", + "decorate(ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "authentic-series", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results.X.plot(color='C1', label='remote insulin')\n", + "\n", + "decorate(xlabel='Time (min)', \n", + " ylabel='Concentration (arbitrary units)')" + ] + }, + { + "cell_type": "markdown", + "id": "diagnostic-service", + "metadata": {}, + "source": [ + " shows the results. The top plot shows\n", + "simulated glucose levels from the model along with the measured data.\n", + "The bottom plot shows simulated insulin levels in tissue fluid, which is in unspecified units, and not to be confused with measured insulin\n", + "levels in the blood.\n", + "\n", + "With the parameters I chose, the model fits the data well, except for\n", + "the first few data points, where we don't expect the model to be\n", + "accurate." + ] + }, + { + "cell_type": "markdown", + "id": "valid-evanescence", + "metadata": {}, + "source": [ + "## Solving differential equations\n", + "\n", + "So far we have solved differential equations by rewriting them as\n", + "difference equations. In the current example, the differential equations are: \n", + "\n", + "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", + "\n", + "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", + "\n", + "If we multiply both sides by $dt$, we have:\n", + "\n", + "$$dG = \\left[ -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t) \\right] dt$$\n", + "\n", + "$$dX = \\left[ k_3 \\left[I(t) - I_b \\right] - k_2 X(t) \\right] dt$$ \n", + "\n", + "When $dt$ is very small, or more precisely **infinitesimal**, this equation is exact. But in our simulations, $dt$ is 2 min, which is not very small. In effect, the simulations assume that the derivatives $dG/dt$ and $dX/dt$ are constant during each 2 min time step." + ] + }, + { + "cell_type": "markdown", + "id": "underlying-grave", + "metadata": {}, + "source": [ + "This method, evaluating derivatives at discrete time steps and assuming that they are constant in between, is called **Euler's method** (see ).\n", + "\n", + "Euler's method is good enough for some simple problems, but it is not\n", + "very accurate. Other methods are more accurate, but many of them are\n", + "substantially more complicated.\n", + "\n", + "One of the best simple methods is called **Ralston's method**. The\n", + "ModSim library provides a function called `run_ode_solver` that\n", + "implements it.\n", + "\n", + "The \"ODE\" in `run_ode_solver` stands for \"ordinary differential\n", + "equation\". The equations we are solving are \"ordinary\" because all the\n", + "derivatives are with respect to the same variable; in other words, there are no partial derivatives.\n", + "\n", + "To use `run_ode_solver`, we have to provide a \"slope function\", like\n", + "this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "expected-collapse", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " G, X = state\n", + " G0, k1, k2, k3 = system.params \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " return dGdt, dXdt" + ] + }, + { + "cell_type": "markdown", + "id": "modified-surname", + "metadata": {}, + "source": [ + "`slope_func` is similar to `update_func`; in fact, it takes the same\n", + "parameters in the same order. But `slope_func` is simpler, because all\n", + "we have to do is compute the derivatives, that is, the slopes. We don't\n", + "have to do the updates; `run_ode_solver` does them for us.\n", + "\n", + "Now we can call `run_ode_solver` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "frequent-cartoon", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import run_solve_ivp" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ongoing-constraint", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " message: 'The solver successfully reached the end of the integration interval.'\n", + " nfev: 86\n", + " njev: 0\n", + " nlu: 0\n", + " sol: None\n", + " status: 0\n", + " success: True\n", + " t_events: None\n", + " y_events: None" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results2, details = run_solve_ivp(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "id": "removed-bubble", + "metadata": {}, + "source": [ + "`run_ode_solver` is similar to `run_simulation`: it takes a `System`\n", + "object and a slope function as parameters. It returns two values: a\n", + "`TimeFrame` with the solution and a `ModSimSeries` with additional\n", + "information.\n", + "\n", + "A `ModSimSeries` is like a `System` or `State` object; it contains a set\n", + "of variables and their values. The `ModSimSeries` from `run_ode_solver`,\n", + "which we assign to `details`, contains information about how the solver\n", + "ran, including a success code and diagnostic message.\n", + "\n", + "The `TimeFrame`, which we assign to `results`, has one row for each time\n", + "step and one column for each state variable. In this example, the rows\n", + "are time from 0 to 182 minutes; the columns are the state variables, `G`\n", + "and `X`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "important-crawford", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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lKBERCSUlKBERCSUlKBERCSUlKBERCSUlKBERCSUlKBERFLg8ssv5x//+Eeqw4jpYEp4JIISlIhIQJW146cEJSKSJHWVtUt3leF8Vln7UJPUTTfdxDHHHMMZZ5zBxRdfzC9+8Yv95ok+Ylm8eDETJ04EYO/evXzta1+juLiY4cOH8/DDDwNw//33148qcf311wNQU1PD5ZdfXl8649e//jUA7777LlOmTGHMmDGccsopMUeJ2LFjB5MmTWLUqFF8/etfbzBGX7wlPGLNd6g01JGICM1X1j7YgaQXL17Mww8/zLJly6iurmb06NGMGTMm7uVvuukmunbtysqVKwHYuXMnGzdu5Prrr2fJkiV069aNSZMmMXfuXPr3709paSmrVkUKROzatQuIDHN0++23M2jQIF5//XW+8Y1v8PzzzzfYzo033sjJJ5/Mj370I5588skGCSbeEh6x5jv88MMPar/VUYISESExlbVffvllpk6dSl5epPjpOeecc0DLP/vsszzwwAP177t168aCBQuYOHEidQVbL7nkEhYsWMAPf/hD3nvvPa699lrOPvtsJk2axN69e3n11Ve58MIL69dRUVGx33YWLFjAnDlzADj77LPp1q1b/bTf/va3PPLIIwD1JTxiJZ545zsQSlAiIkQqaJfGSEaHUlk73rFOo8tpRJfIcPf6UhwtrbNbt26sWLGC+fPnc+utt/LQQw/xm9/8hvz8/JjFChtrvB2Iv4THwZT6iIeuQYmIEKmsnZed2aDtUCtrn3zyyTz++OOUl5ezd+/e+qq6jRUWFrJkyRKA+utMAJMmTeL3v/99/fudO3dy/PHH89JLL7F9+3Zqamq4//77OfXUU9m+fTu1tbVccMEF3HTTTSxdupTDDjuMgQMH8ve//x2IJLcVK1bst/0JEybUj3L+1FNPsXPnTiD+Eh7NzXcolKBEREhMZe3jjjuOc889lxEjRnD++eczduzY/SrqAtxwww1861vf4pRTTiEz87Mk+YMf/ICdO3dSVFTEiBEjeOGFF+jTpw8333wzp512GiNGjGD06NFMnTqV0tJSJk6cyMiRI7n88su5+eabAbjvvvu46667GDFiBMOGDePRRx+Nuf0FCxYwevRonn76aQYMGABESnhUV1czfPhwfvjDH8Ys4XHJJZc0O9+hULkNEWmzwlBuY+/evXTu3Jl9+/Yx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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results2.G.plot(style='-', label='simulation')\n", + "data.glucose.plot(style='o', color='C0', label='glucose data')\n", + "decorate(ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "virtual-standard", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "results2.X.plot(color='C1', label='remote insulin')\n", + "\n", + "decorate(xlabel='Time (min)', \n", + " ylabel='Concentration (arbitrary units)')" + ] + }, + { + "cell_type": "markdown", + "id": "corrected-indonesia", + "metadata": {}, + "source": [ + "shows the results from `run_simulation` and\n", + "`run_ode_solver`. The difference between them is barely visible.\n", + "\n", + "We can compute the percentage differences like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "disciplinary-washington", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.004442701427073649" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diff = results.G - results2.G\n", + "percent_diff = diff / results2.G * 100\n", + "percent_diff.abs().max()" + ] + }, + { + "cell_type": "markdown", + "id": "electronic-navigation", + "metadata": {}, + "source": [ + "The largest percentage difference is less than 2%, which is small enough that it probably doesn't matter in practice. " + ] + }, + { + "cell_type": "markdown", + "id": "potential-dispute", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." + ] + }, + { + "cell_type": "markdown", + "id": "north-suspension", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "bright-damage", + "metadata": {}, + "source": [ + "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", + "\n", + "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "charitable-craft", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " message: 'The solver successfully reached the end of the integration interval.'\n", + " nfev: 86\n", + " njev: 0\n", + " nlu: 0\n", + " sol: None\n", + " status: 0\n", + " success: True\n", + " t_events: None\n", + " y_events: None" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "system.dt = 1\n", + "results3, details = run_simulation(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "encouraging-outline", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "results2.G.plot(style='C2--', label='run_ode_solver (dt=2)')\n", + "results3.G.plot(style='C3:', label='run_ode_solver (dt=1)')\n", + "\n", + "decorate(xlabel='Time (m)', ylabel='mg/dL')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "aware-patrick", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "diff = (results2.G - results3.G).dropna()\n", + "percent_diff = diff / results2.G * 100" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "fiscal-baker", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "max(abs(percent_diff))" + ] + }, + { + "cell_type": "markdown", + "id": "turkish-principle", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "Here's the source code for `run_solve_ivp` if you'd like to know how it works.\n", + "\n", + "[RK45](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." + ] + }, + { + "cell_type": "markdown", + "id": "hispanic-summer", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "distinct-advance", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/modsim.py b/jupyter/modsim.py new file mode 100644 index 00000000..3512ea30 --- /dev/null +++ b/jupyter/modsim.py @@ -0,0 +1,1153 @@ +""" +Code from Modeling and Simulation in Python. + +Copyright 2020 Allen Downey + +MIT License: https://opensource.org/licenses/MIT +""" + +import logging + +logger = logging.getLogger(name="modsim.py") + +# make sure we have Python 3.6 or better +import sys + +if sys.version_info < (3, 6): + logger.warning("modsim.py depends on Python 3.6 features.") + +import inspect + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import scipy + +from scipy.interpolate import interp1d +from scipy.interpolate import InterpolatedUnivariateSpline + +from scipy.integrate import odeint +from scipy.integrate import solve_ivp + +from types import SimpleNamespace + + +import pint + +units = pint.UnitRegistry() +Quantity = units.Quantity + + +def flip(p=0.5): + """Flips a coin with the given probability. + + p: float 0-1 + + returns: boolean (True or False) + """ + return np.random.random() < p + + +def cart2pol(x, y, z=None): + """Convert Cartesian coordinates to polar. + + x: number or sequence + y: number or sequence + z: number or sequence (optional) + + returns: theta, rho OR theta, rho, z + """ + x = np.asarray(x) + y = np.asarray(y) + + rho = np.hypot(x, y) + theta = np.arctan2(y, x) + + if z is None: + return theta, rho + else: + return theta, rho, z + + +def pol2cart(theta, rho, z=None): + """Convert polar coordinates to Cartesian. + + theta: number or sequence in radians + rho: number or sequence + z: number or sequence (optional) + + returns: x, y OR x, y, z + """ + x = rho * np.cos(theta) + y = rho * np.sin(theta) + + if z is None: + return x, y + else: + return x, y, z + +from numpy import linspace + +def linrange(start, stop, step=1, **options): + """Make an array of equally spaced values. + + start: first value + stop: last value (might be approximate) + step: difference between elements (should be consistent) + + returns: NumPy array + """ + n = int(round((stop-start) / step)) + return linspace(start, stop, n+1, **options) + + +def leastsq(error_func, x0, *args, **options): + """Find the parameters that yield the best fit for the data. + + `x0` can be a sequence, array, Series, or Params + + Positional arguments are passed along to `error_func`. + + Keyword arguments are passed to `scipy.optimize.leastsq` + + error_func: function that computes a sequence of errors + x0: initial guess for the best parameters + args: passed to error_func + options: passed to leastsq + + :returns: Params object with best_params and ModSimSeries with details + """ + # override `full_output` so we get a message if something goes wrong + options["full_output"] = True + + # run leastsq + t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) + best_params, cov_x, infodict, mesg, ier = t + + # pack the results into a ModSimSeries object + details = ModSimSeries(infodict) + details.set(cov_x=cov_x, mesg=mesg, ier=ier) + + # if we got a Params object, we should return a Params object + if isinstance(x0, Params): + best_params = Params(Series(best_params, x0.index)) + + # return the best parameters and details + return best_params, details + + +def minimize_scalar(min_func, bounds, *args, **options): + """Finds the input value that minimizes `min_func`. + + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + min_func: computes the function to be minimized + bounds: sequence of two values, lower and upper bounds of the range to be searched + args: any additional positional arguments are passed to min_func + options: any keyword arguments are passed as options to minimize_scalar + + returns: ModSimSeries object + """ + try: + min_func(bounds[0], *args) + except Exception as e: + msg = """Before running scipy.integrate.minimize_scalar, I tried + running the slope function you provided with the + initial conditions in system and t=0, and I got + the following error:""" + logger.error(msg) + raise (e) + + underride(options, xatol=1e-3) + + res = scipy.optimize.minimize_scalar( + min_func, + bracket=bounds, + bounds=bounds, + args=args, + method="bounded", + options=options, + ) + + if not res.success: + msg = ( + """scipy.optimize.minimize_scalar did not succeed. + The message it returned is %s""" + % res.message + ) + raise Exception(msg) + + return ModSimSeries(res) + + +def maximize_scalar(max_func, bounds, *args, **options): + """Finds the input value that maximizes `max_func`. + + Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + min_func: computes the function to be maximized + bounds: sequence of two values, lower and upper bounds of the + range to be searched + args: any additional positional arguments are passed to max_func + options: any keyword arguments are passed as options to minimize_scalar + + returns: ModSimSeries object + """ + + def min_func(*args): + return -max_func(*args) + + res = minimize_scalar(min_func, bounds, *args, **options) + + # we have to negate the function value before returning res + res.fun = -res.fun + return res + + +def minimize_golden(min_func, bracket, *args, **options): + """Find the minimum of a function by golden section search. + + Based on + https://en.wikipedia.org/wiki/Golden-section_search#Iterative_algorithm + + :param min_func: function to be minimized + :param bracket: interval containing a minimum + :param args: arguments passes to min_func + :param options: rtol and maxiter + + :return: ModSimSeries + """ + maxiter = options.get("maxiter", 100) + rtol = options.get("rtol", 1e-3) + + def success(**kwargs): + return ModSimSeries(dict(success=True, **kwargs)) + + def failure(**kwargs): + return ModSimSeries(dict(success=False, **kwargs)) + + a, b = bracket + ya = min_func(a, *args) + yb = min_func(b, *args) + + phi = 2 / (np.sqrt(5) - 1) + h = b - a + c = b - h / phi + yc = min_func(c, *args) + + d = a + h / phi + yd = min_func(d, *args) + + if yc > ya or yc > yb: + return failure(message="The bracket is not well-formed.") + + for i in range(maxiter): + + # check for convergence + if abs(h / c) < rtol: + return success(x=c, fun=yc) + + if yc < yd: + b, yb = d, yd + d, yd = c, yc + h = b - a + c = b - h / phi + yc = min_func(c, *args) + else: + a, ya = c, yc + c, yc = d, yd + h = b - a + d = a + h / phi + yd = min_func(d, *args) + + # if we exited the loop, too many iterations + return failure(root=c, message="maximum iterations = %d exceeded" % maxiter) + + +def maximize_golden(max_func, bracket, *args, **options): + """Find the maximum of a function by golden section search. + + :param min_func: function to be maximized + :param bracket: interval containing a maximum + :param args: arguments passes to min_func + :param options: rtol and maxiter + + :return: ModSimSeries + """ + + def min_func(*args): + return -max_func(*args) + + res = minimize_golden(min_func, bracket, *args, **options) + + # we have to negate the function value before returning res + res.fun = -res.fun + return res + + +def minimize_powell(min_func, x0, *args, **options): + """Finds the input value that minimizes `min_func`. + Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html + min_func: computes the function to be minimized + x0: initial guess + args: any additional positional arguments are passed to min_func + options: any keyword arguments are passed as options to minimize_scalar + returns: ModSimSeries object + """ + underride(options, tol=1e-3) + + res = scipy.optimize.minimize(min_func, x0, *args, **options) + + return ModSimSeries(res) + + +# make aliases for minimize and maximize +minimize = minimize_golden +maximize = maximize_golden + + +def run_odeint(system, slope_func, **options): + """Integrates an ordinary differential equation. + + `system` should contain system parameters and `ts`, which + is an array or Series that specifies the time when the + solution will be computed. + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + # make sure `system` contains `ts` + if not hasattr(system, "ts"): + msg = """It looks like `system` does not contain `ts` + as a system variable. `ts` should be an array + or Series that specifies the times when the + solution will be computed:""" + raise ValueError(msg) + + # make sure `system` contains `init` + if not hasattr(system, "init"): + msg = """It looks like `system` does not contain `init` + as a system variable. `init` should be a State + object that specifies the initial condition:""" + raise ValueError(msg) + + # try running the slope function with the initial conditions + try: + slope_func(system.init, system.ts[0], system) + except Exception as e: + msg = """Before running scipy.integrate.odeint, I tried + running the slope function you provided with the + initial conditions in system and t=0, and I got + the following error:""" + logger.error(msg) + raise (e) + + # when odeint calls slope_func, it should pass `system` as + # the third argument. To make that work, we have to make a + # tuple with a single element and pass the tuple to odeint as `args` + args = (system,) + + # now we're ready to run `odeint` with `init` and `ts` from `system` + array = odeint(slope_func, list(system.init), system.ts, args, **options) + + # the return value from odeint is an array, so let's pack it into + # a TimeFrame with appropriate columns and index + frame = TimeFrame( + array, columns=system.init.index, index=system.ts, dtype=np.float64 + ) + return frame + + +from scipy.integrate import solve_ivp + +def run_solve_ivp(system, slope_func, **options): + """Computes a numerical solution to a differential equation. + + `system` must contain `init` with initial conditions, + `t_0` with the start time, and `t_end` with the end time. + + It can contain any other parameters required by the slope function. + + `options` can be any legal options of `scipy.integrate.solve_ivp` + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + # make sure `system` contains `init` + if not hasattr(system, "init"): + msg = """It looks like `system` does not contain `init` + as a system variable. `init` should be a State + object that specifies the initial condition:""" + raise ValueError(msg) + + # make sure `system` contains `t_end` + if not hasattr(system, "t_end"): + msg = """It looks like `system` does not contain `t_end` + as a system variable. `t_end` should be the + final time:""" + raise ValueError(msg) + + # the default value for t_0 is 0 + t_0 = getattr(system, "t_0", 0) + + # try running the slope function with the initial conditions + try: + slope_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the slope function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # TODO: make dense solution the default + + # run the solver + bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, + args=[system], **options) + + # separate the results from the details + y = bunch.pop("y") + t = bunch.pop("t") + + # pack the results into a TimeFrame + results = TimeFrame(y.T, index=t, columns=system.init.index) + return results, bunch + + +def check_system(system, slope_func): + """Make sure the system object has the fields we need for run_ode_solver. + + :param system: + :param slope_func: + :return: + """ + # make sure `system` contains `init` + if not hasattr(system, "init"): + msg = """It looks like `system` does not contain `init` + as a system variable. `init` should be a State + object that specifies the initial condition:""" + raise ValueError(msg) + + # make sure `system` contains `t_end` + if not hasattr(system, "t_end"): + msg = """It looks like `system` does not contain `t_end` + as a system variable. `t_end` should be the + final time:""" + raise ValueError(msg) + + # the default value for t_0 is 0 + t_0 = getattr(system, "t_0", 0) + + # get the initial conditions + init = system.init + + # get t_end + t_end = system.t_end + + # if dt is not specified, take 100 steps + try: + dt = system.dt + except KeyError: + dt = t_end / 100 + + return init, t_0, t_end, dt + + +def run_euler(system, slope_func, **options): + """Computes a numerical solution to a differential equation. + + `system` must contain `init` with initial conditions, + `t_end` with the end time, and `dt` with the time step. + + `system` may contain `t_0` to override the default, 0 + + It can contain any other parameters required by the slope function. + + `options` can be ... + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + # the default message if nothing changes + msg = "The solver successfully reached the end of the integration interval." + + # get parameters from system + init, t_0, t_end, dt = check_system(system, slope_func) + + # make the TimeFrame + frame = TimeFrame(columns=init.index) + frame.row[t_0] = init + ts = linrange(t_0, t_end, dt) * get_units(t_end) + + # run the solver + for t1 in ts: + y1 = frame.row[t1] + slopes = slope_func(y1, t1, system) + y2 = [y + slope * dt for y, slope in zip(y1, slopes)] + t2 = t1 + dt + frame.row[t2] = y2 + + details = ModSimSeries(dict(message="Success")) + return frame, details + + +def run_ralston(system, slope_func, **options): + """Computes a numerical solution to a differential equation. + + `system` must contain `init` with initial conditions, + and `t_end` with the end time. + + `system` may contain `t_0` to override the default, 0 + + It can contain any other parameters required by the slope function. + + `options` can be ... + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + # the default message if nothing changes + msg = "The solver successfully reached the end of the integration interval." + + # get parameters from system + init, t_0, t_end, dt = check_system(system, slope_func) + + # make the TimeFrame + frame = TimeFrame(columns=init.index) + frame.row[t_0] = init + ts = linrange(t_0, t_end, dt) * get_units(t_end) + + event_func = options.get("events", None) + z1 = np.nan + + def project(y1, t1, slopes, dt): + t2 = t1 + dt + y2 = [y + slope * dt for y, slope in zip(y1, slopes)] + return y2, t2 + + # run the solver + for t1 in ts: + y1 = frame.row[t1] + + # evaluate the slopes at the start of the time step + slopes1 = slope_func(y1, t1, system) + + # evaluate the slopes at the two-thirds point + y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3) + slopes2 = slope_func(y_mid, t_mid, system) + + # compute the weighted sum of the slopes + slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)] + + # compute the next time stamp + y2, t2 = project(y1, t1, slopes, dt) + + # check for a terminating event + if event_func: + z2 = event_func(y2, t2, system) + if z1 * z2 < 0: + scale = magnitude(z1 / (z1 - z2)) + y2, t2 = project(y1, t1, slopes, scale * dt) + frame.row[t2] = y2 + msg = "A termination event occurred." + break + else: + z1 = z2 + + # store the results + frame.row[t2] = y2 + + details = ModSimSeries(dict(success=True, message=msg)) + return frame, details + + +run_ode_solver = run_ralston + +# TODO: Implement leapfrog + + +def fsolve(func, x0, *args, **options): + """Return the roots of the (non-linear) equations + defined by func(x) = 0 given a starting estimate. + + Uses scipy.optimize.fsolve, with extra error-checking. + + func: function to find the roots of + x0: scalar or array, initial guess + args: additional positional arguments are passed along to fsolve, + which passes them along to func + + returns: solution as an array + """ + # make sure we can run the given function with x0 + try: + func(x0, *args) + except Exception as e: + msg = """Before running scipy.optimize.fsolve, I tried + running the error function you provided with the x0 + you provided, and I got the following error:""" + logger.error(msg) + raise (e) + + # make the tolerance more forgiving than the default + underride(options, xtol=1e-6) + + # run fsolve + result = scipy.optimize.fsolve(func, x0, args=args, **options) + + return result + + + +def crossings(series, value): + """Find the labels where the series passes through value. + + The labels in series must be increasing numerical values. + + series: Series + value: number + + returns: sequence of labels + """ + values = magnitudes(series - value) + interp = InterpolatedUnivariateSpline(series.index, values) + return interp.roots() + + +def has_nan(a): + """Checks whether the an array contains any NaNs. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.any(np.isnan(a)) + + +def is_strictly_increasing(a): + """Checks whether the elements of an array are strictly increasing. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.all(np.diff(a) > 0) + + +def interpolate(series, **options): + """Creates an interpolation function. + + series: Series object + options: any legal options to scipy.interpolate.interp1d + + returns: function that maps from the index to the values + """ + if has_nan(series.index): + msg = """The Series you passed to interpolate contains + NaN values in the index, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + if not is_strictly_increasing(series.index): + msg = """The Series you passed to interpolate has an index + that is not strictly increasing, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + # make the interpolate function extrapolate past the ends of + # the range, unless `options` already specifies a value for `fill_value` + underride(options, fill_value="extrapolate") + + # call interp1d, which returns a new function object + x = series.index + y = series.values + interp_func = interp1d(x, y, **options) + return interp_func + + +def interpolate_inverse(series, **options): + """Interpolate the inverse function of a Series. + + series: Series object, represents a mapping from `a` to `b` + options: any legal options to scipy.interpolate.interp1d + + returns: interpolation object, can be used as a function + from `b` to `a` + """ + inverse = Series(series.index, index=series.values) + interp_func = interpolate(inverse, **options) + return interp_func + + +def gradient(series, **options): + """Computes the numerical derivative of a series. + + If the elements of series have units, they are dropped. + + series: Series object + options: any legal options to np.gradient + + returns: Series, same subclass as series + """ + x = magnitudes(series.index) + y = magnitudes(series.values) + # units = get_units(series) + + a = np.gradient(y, x, **options) + return series.__class__(a, series.index) + + +def source_code(obj): + """Prints the source code for a given object. + + obj: function or method object + """ + print(inspect.getsource(obj)) + + +def underride(d, **options): + """Add key-value pairs to d only if key is not in d. + + If d is None, create a new dictionary. + + d: dictionary + options: keyword args to add to d + """ + if d is None: + d = {} + + for key, val in options.items(): + d.setdefault(key, val) + + return d + + + +def contour(df, **options): + """Makes a contour plot from a DataFrame. + + Wrapper for plt.contour + https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contour.html + + Note: columns and index must be numerical + + df: DataFrame + options: passed to plt.contour + """ + fontsize = options.pop("fontsize", 12) + underride(options, cmap="viridis") + x = df.columns + y = df.index + X, Y = np.meshgrid(x, y) + cs = plt.contour(X, Y, df, **options) + plt.clabel(cs, inline=1, fontsize=fontsize) + + +def savefig(filename, **options): + """Save the current figure. + + Keyword arguments are passed along to plt.savefig + + https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html + + filename: string + """ + print("Saving figure to file", filename) + plt.savefig(filename, **options) + + +def decorate(**options): + """Decorate the current axes. + + Call decorate with keyword arguments like + decorate(title='Title', + xlabel='x', + ylabel='y') + + The keyword arguments can be any of the axis properties + https://matplotlib.org/api/axes_api.html + """ + ax = plt.gca() + ax.set(**options) + + handles, labels = ax.get_legend_handles_labels() + if handles: + ax.legend(handles, labels) + + plt.tight_layout() + + +def remove_from_legend(bad_labels): + """Removes some labels from the legend. + + bad_labels: sequence of strings + """ + ax = plt.gca() + handles, labels = ax.get_legend_handles_labels() + handle_list, label_list = [], [] + for handle, label in zip(handles, labels): + if label not in bad_labels: + handle_list.append(handle) + label_list.append(label) + ax.legend(handle_list, label_list) + + +def subplot(nrows, ncols, plot_number, **options): + figsize = {(2, 1): (8, 8), (3, 1): (8, 10)} + key = nrows, ncols + default = (8, 5.5) + width, height = figsize.get(key, default) + + plt.subplot(nrows, ncols, plot_number, **options) + fig = plt.gcf() + fig.set_figwidth(width) + fig.set_figheight(height) + + +def TimeSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series + + +def SweepSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Parameter' + if 'name' not in kwargs: + series.name = 'Metric' + return series + + +def show(series): + """ + """ + if not isinstance(series, pd.Series): + return series + df = pd.DataFrame(series) + return df + + +def plot(x, y=None, **options): + """ + """ + if y is not None: + plt.plot(x, y, **options) + else: + # x better be a Series + x.plot(**options) + + +def State(**kwargs): + """Contains state variables and their values.""" + return pd.Series(kwargs) + + +class System(SimpleNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +def TimeFrame(*args, **kwargs): + """DataFrame that maps from time to State. + """ + return pd.DataFrame(*args, **kwargs) + + +def SweepFrame(*args, **kwargs): + """DataFrame that maps from parameter value to SweepSeries. + """ + return pd.DataFrame(*args, **kwargs) + + +def Vector(*args, units=None): + """Make a ModSimVector. + + args: can be a single argument or sequence + units: Pint Unit object or Quantity + + If there's only one argument, it should be a sequence. + + Otherwise, the arguments are treated as coordinates. + + returns: ModSimVector + """ + if len(args) == 1: + args = args[0] + + # if it's a series, pull out the values + if isinstance(args, Series): + args = args.values + + # see if any of the arguments have units; if so, save the first one + for elt in args: + found_units = getattr(elt, "units", None) + if found_units: + break + + if found_units: + # if there are units, remove them + args = [float(magnitude(elt)) for elt in args] + else: + # otherwise, just ensure that all elements are floats (to avoid overflow issues in numpy) + args = [float(elt) for elt in args] + + # if the units keyword is provided, it overrides the units in args + if units is not None: + found_units = units + + return ModSimVector(args, found_units) + + +## Vector functions (should work with any sequence) + + +def vector_mag(v): + """Vector magnitude with units. + + returns: number or Quantity + """ + a = magnitude(v) + units = get_first_unit(v) + return np.sqrt(np.dot(a, a)) * units + + +def vector_mag2(v): + """Vector magnitude squared with units. + + returns: number of Quantity + """ + a = magnitude(v) + units = get_first_unit(v) + return np.dot(a, a) * units * units + + +def vector_angle(v): + """Angle between v and the positive x axis. + + Only works with 2-D vectors. + + returns: number in radians + """ + assert len(v) == 2 + x, y = v + return np.arctan2(y, x) + + +def vector_polar(v): + """Vector magnitude and angle. + + returns: (number or quantity, number in radians) + """ + return vector_mag(v), vector_angle(v) + + +def vector_hat(v): + """Unit vector in the direction of v. + + The result should have no units. + + returns: Vector or array + """ + # get the size of the vector + mag = vector_mag(v) + + # check if the magnitude of the Quantity is 0 + if magnitude(mag) == 0: + if isinstance(v, ModSimVector): + return Vector(magnitude(v)) + else: + return magnitude(np.asarray(v)) + else: + return v / mag + + +def vector_perp(v): + """Perpendicular Vector (rotated left). + + Only works with 2-D Vectors. + + returns: Vector + """ + assert len(v) == 2 + x, y = v + return Vector(-y, x) + + +def vector_dot(v, w): + """Dot product of v and w. + + returns: number or Quantity + """ + a1 = magnitude(v) + a2 = magnitude(w) + return np.dot(a1, a2) * get_first_unit(v) * get_first_unit(w) + + +def vector_cross(v, w): + """Cross product of v and w. + + returns: number or Quantity for 2-D, Vector for 3-D + """ + a1 = magnitude(v) + a2 = magnitude(w) + res = np.cross(a1, a2) + + if len(v) == 3 and (isinstance(v, ModSimVector) or isinstance(w, ModSimVector)): + return ModSimVector(res, get_first_unit(v) * get_first_unit(w)) + else: + return res * get_first_unit(v) * get_first_unit(w) + + +def vector_proj(v, w): + """Projection of v onto w. + + Results has the units of v, but that might not make sense unless + v and w have the same units. + + returns: array or Vector with direction of w and units of v. + """ + w_hat = vector_hat(w) + return vector_dot(v, w_hat) * w_hat + + +def scalar_proj(v, w): + """Returns the scalar projection of v onto w. + + Which is the magnitude of the projection of v onto w. + + Results has the units of v, but that might not make sense unless + v and w have the same units. + + returns: scalar with units of v. + """ + return vector_dot(v, vector_hat(w)) + + +def vector_dist(v, w): + """Euclidean distance from v to w, with units.""" + if isinstance(v, list): + v = np.asarray(v) + return vector_mag(v - w) + + +def vector_diff_angle(v, w): + """Angular difference between two vectors, in radians. + """ + if len(v) == 2: + return vector_angle(v) - vector_angle(w) + else: + # TODO: see http://www.euclideanspace.com/maths/algebra/ + # vectors/angleBetween/ + raise NotImplementedError() + + +class ModSimVector(Quantity): + """Represented as a Pint Quantity with a NumPy array + + x, y, z, mag, mag2, and angle are accessible as attributes. + """ + + @property + def x(self): + """Returns the x component with units.""" + return self[0] + + @property + def y(self): + """Returns the y component with units.""" + return self[1] + + @property + def z(self): + """Returns the z component with units.""" + return self[2] + + @property + def mag(self): + """Returns the magnitude with units.""" + return vector_mag(self) + + @property + def mag2(self): + """Returns the magnitude squared with units.""" + return vector_mag2(self) + + @property + def angle(self): + """Returns the angle between self and the positive x axis.""" + return vector_angle(self) + + # make the vector functions available as methods + polar = vector_polar + hat = vector_hat + perp = vector_perp + dot = vector_dot + cross = vector_cross + proj = vector_proj + comp = scalar_proj + dist = vector_dist + diff_angle = vector_diff_angle + + +def plot_segment(A, B, **options): + """Plots a line segment between two Vectors. + + For 3-D vectors, the z axis is ignored. + + Additional options are passed along to plot(). + + A: Vector + B: Vector + """ + xs = A.x, B.x + ys = A.y, B.y + plot(xs, ys, **options) + +from time import sleep +from IPython.display import clear_output + +def animate(results, draw_func, interval=None): + """Animate results from a simulation. + + results: TimeFrame + draw_func: function that draws state + interval: time between frames in seconds + """ + plt.figure() + try: + for t, state in results.iterrows(): + draw_func(state, t) + plt.show() + if interval: + sleep(interval) + clear_output(wait=True) + draw_func(state, t) + plt.show() + except KeyboardInterrupt: + pass From 3213d25cbb2fdb0df32210f55471b92c2eae9eb4 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Feb 2021 11:05:47 -0500 Subject: [PATCH 024/144] Adding figure --- figs/baseball_drag.png | Bin 0 -> 250310 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 figs/baseball_drag.png diff --git a/figs/baseball_drag.png b/figs/baseball_drag.png new file mode 100644 index 0000000000000000000000000000000000000000..e70632a4d2ec632acee7f11b41b9d8eedd06030a GIT binary patch literal 250310 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
    sk52!gvvJ<9`Du1t4Iu;I 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

    avRjM-kthxW z>kw>7tflo&Xo?7K!(NXsvqs6ZJ|esq-tC}Sfj*EBT;m870i6#tL=a-Z%VBP8d1(x= zxsoXyLGFSLhtp4_HjmS{*bW^1DkhT)!-x1w-H96HFkTCcl-INSHJ8|B8;0y&Z-rQwwzBuuOz|d0?677CTnm zD(nz~=?G5k{QOLa?l$l5Xm{Y3{FM%3DjH@?EP;^x`|+dlQ^VtGZQz+$&L|N$*8P=j z#ivcc96$zvIM88bWVAImvoW5*Z#%yk;tHT?=$!(jUr1tTebekNViU#s!M6=FXNAKx zaC=s<#nJ|28yfJE3L!Jc9Ftj9NxHVC`8>@HvsE(g#^ zqq)R(lJQmWejeZ}3*(zr*6jG3~p!tC`96UA%glgYC0XtfJ zg~_<14TBNX{~9BB_N-`{JIu+bPj;@2sS>VreHN}>0f8(_wr~{$TQphNtFIr!Fu^06 zI(rKPBjvO4FPLiE-lZbgM=1$M=DWQKu;=`d+%#}(fTGjB&-%atRIqodv81t@&78Vt zX!rJL?mD;^s3jpq$6(9PhQSG+Y01RH22IaurXno5vt%f!Av8+7ui(`3jBfw zie>RsV|hn-fp}>2<|=z01`+rV?GT7A=v>gRBc`p{8EG5fETTkKbH>}?9}j~xIN8U? z&jEnKb1=HFvT$!!;fO#yJK`+`*{@;zUTpW)k%Zy^kk0hbz1uJY^{4{R2a0Q)l-T;g zI-{svnNCAh6Fw|?$q00XnkXU5hnS$f`oXGCQM@6!9YeH{@IbmuDu9nXJL=lra;fL=?Z|i@gxgk=qO0>Q!8pG#bs)l6{x9 zM?PSO&L<8}51oUu>2{N*uI|cb+9M5M7*A~KWBYL8l!3@()%b1gv)@J32ySNj-QLiy zO)f*m;EU;dfg5;uXpivWGxrJtt?HgDDlLsYEO2_K79X8II?^c#dd+9$%VFSf+0#b(_M82rgr>a0hkK8`{8K}71 zZF1t^dKlz|UFSbFH;3&J zeJ!3~f&{$T_*gctN?@ABd3kJ)1;8t@v;?0X0t8gV5O%Nzd?_h0&rcS$KmOp3?FE}Q zD3mlEN(vQc&Xc4*T_BGTZ*~%MKhBSL8=#_aeU`wszNw~n0&M+^qX8I&!H6d8xYz>! z*t{8o1E`}$s=Z6CRWXf)T^+uR8O-&E1_xz@m<hJ+q3t;*FkaqAwwtx68xZH!v!@sXle_4Q6>-Xou$g13Kq1Kq3{)eim` zw+sygjt8_Rc4uf2ZT4Kueo@)cKLD_4L2QPsJsOhK-4=UF4HZCP4dOVs&w&Xi-G zpfU&aH`g&N$-wp?Q^Sz{T?lNDREr?CZ$KXL*D+|jP^^NK>r!{EX+RX!*T4VjJF_yp z&(%Br%M-okQ2nT3vFz3*FAfVm%;Jyw=bY^RGz z%iBZX{MMdcaW0y|tw`Wlssg$IQy)PS@yOG~3qU5k)WRp#$_XZW;MMTt$rj5tp6U{C z1i;4te*v8(r5p{;=%`_@0+VH#38Ab?qE6rxp&k@E80>_N%3`J}%-8l$o+$bw6%khi znsJ0fHV8KgmQWuvT&HQA`fvi+7dqDpL<*B^kvljbSM>kR}1Vw(RIN*(|Byho)v)KT4l2enpelh@>mZ+WC1SoimQ9L?Wy3EQHUVq=D+tp zgX+Jl#*j!wfrLH?@{2fjsV68bCdBBnm9C~2S2(U@c+5d;)XAzi{&-!2WMlgn#Vc>O z^3YQJJ&piS!dO0ZN@3~KXc;t8r1&Frmu7mwvlY2^$w)z~0HKo6uUf3hL@N3+C#MXs zfc$lGY_hVm<<@T%;cwYbxww(+>4G^h{APxKDFw!_=1NFOX@|0*dZ_%Dz1Go4eYu^t z(xx(5UQWe!piAcE5&0v)!IIt`sE$)`#|}`c&SL&hs^84*OcJ}EKJEVT+SRKWbw9wt zB@Dz%MJ32vSzxGf=qQ7=J)RBFEPK4M(Y=5n2ys;h_x zVVOtXKXZToy}S*{CW;{Q!_AW+q-$bs&OIdX69~&eIQyUo<50d-Ho&!CRM8&6jc=sR zo!3Gq`UuaSKq}0`rKFJigk3tXMxm)@;3tp)97{M@Au1!#$$wq@d8YE#Jue^fuAa*m`#!AC*GmffEJ-1%$fHdn5|JE# zaZq&YMm9E~NmDAtT3AcaE}+>yq2GL`Q%^uw_(h}jQ>PL}(@=t5U;WNthVPceKC2|z zH8!#l*Af#?lOD?t9XU2pSzs}}ueTMZh_jRZV0FgE#Vw(k_&z#nt~S#yYT_NPBw$|C zw6MmG^JFXM53TzlF<(@7_R-Goj-|bWOs0Jl?aAQ5^LpOzrU@H}RDnDiHdc)0U=3s1 z!rkH6tWZA%4!>6k3fObaEb#;S^2L6KrQ^oNymTYFEGCkW5FoUw3@&uIh}sVv-*mgy zpKx(WZwxCX#qVqW=Vn^k7EDf#DhL4yVIBnT+MQizQ`6q#Thi^iV%SYFoVjjoh&ZBhS)3-qF}1&E+Qretw9BEJ2j@%Nk~^<0@)4$3DfA$>9E8(0>hq0Qz1| z^_OqaWuysMGg$0-V`D)7=$B!w?_P+KV}6h7`c5y!FdXo>8gn8Q9}deA6M9I4ZXB#X zv|aoXioray4ba9S{Y+0?U4%bkX=!X(`bNlPDl~%` zRT+ZFPbl?aUIh6U*13^UBq&$F9p&Ocym!j>m=wqaigy(q4f4fWnDv0}Rr zH1#MuK+6TrA=7{7RLIX1mn6jrkHAn&O;BK}@7xKr7M$7xs%tnNz>!xLS`bv^Wo5gc z7D5&SIUS_Q?O3Z2LYR)+tQ;@)9TiU$&3l91Ir8s1bRrOq7-;vh~_X}Q!h4RXx5PKqBquF04?!pY|NI=gG`_^2ab)N#2 z7Ktfq)Qy(+oKV=x+4!1Q(m+E!^jllJxN`ri3nwg9J||lWprLDPYm+VM74x_U_*hHQ z0wqVLo+yPVxpE*tWCv4o^vG9bA+ibMvrmuliyOQPTLR499it1ibS5Xw9PkvGFbi?{ z`jd@zf6h$KV#KFm8FAro-$2s~{zRE{d$Ysmpvd4Tr%W~S>#I>v$7Hk|idgv#RJL)w zRUJsMMaP@PaPmn(EawEpLtwjuH9^ zCikdUV5SS1rHzdZoaEpOt|FpxM#^Zz)xKZr&07W=QMRDq%*tY=3}RQp-Z@6@$;IG} zvMuxZbKE$V2(BNVwJ%zLBA~sfjbYDa->PxBey?DV*KV9VHGKXrlLRE;G@W|Ksf|o96v)aV_|dE?Ip&U^!?pZepe3f8j(b{aDl#R0Ln?P zw7Chz!d&4V+Z6WzBNhJZpj$9D2@pL|A!S8&4RBaLOmJN)eH(D)X>l>^RtWSQ1hh+7 z(`L-bk9ZDu*U}XumLxVtYjgX8=Y z$d}sN+MsWlz#w+g+o8mFG`V7-ziLUE=9}3%H27JbATN9&UM-hR{pR$Vc|AqiHD%LH zO}jwbknJzk9GboX`vG01uiQLiPxd4!k|7c&o|E3Qm*>4Cq|=C<8_unWQ*ROtwlpRvK8#9j1^*HRa!Y(k znh6_-1V!P7fs#v%zy=%TcMQUiXz&^bXY%3(Sj>TRxbAmMxjg@}z`L^oXHTBCt0`m@ zWGt9*F(__-<8oMrLZ}v#H7nog73WB}r@bp3uvx(v%!N3xB5EQ$QeLp+B%+ebrhj6`*gzQ6K^9!3z*4P&kk zzwwf7_-rD48D4>EUoNgZ6CrD$RBW30ZT#Vr!&xc+{`@4PV%Sq)`h6dcApjCy zZW;dOTgCp|hS*TI3hcm)4QURPus%j8G+)p`K!^`JMW(m&vo_2ia?9u3VUdD(?Q?h3 zyteDsua@?Pzb{Pj4n9n(HByn}@k)7W`xrYTc6;{1xtMYl)=kM(I%#+31Aqa5x0^eG_U3UfeN$V@z(! zCA2KbV77OB-ckK$yk{1b-pb7NW3O1BzUxMvvs5XUV)?@>&;%wrMl z=B{tte8OICgTe38VQn2|#zZNnu%5h-(Z)JRa=wm@4Gz-oTUU&ZU$0)?R<2)iTa?qW z00RHC1{dl3ijAwdkQ#v>dH5mg8aG?-pOIUDx;KAR)SG_ro4ZcaD0R8~F?DJh8c?dr zY6ml?#rT&`_}gz;uxX^?0r->yqr!@>mmS%9^6*We2EUCy1KL&WKmcz#eRqguQ#uBr zJ03qZyJJi5_{`(Am8(CL>8&PtKqQR45<=!LYh^qJCk)xM?l%p4(2k?t%3F^rKyFR8 zK?auGOAG?Q?un{7>F&NW{Xk@`(@kq3J|2em%&Cjs0AsL7;6U-W#t}4ks2qf^##9Ti zspiZ~c6U8c=N3lml$(3%YatR}Dg_pnmmb)Y&Mgi*obvQUIKcepL8}=v_$@)^ha(~H z@YaZ}I~?bKvgQczr&uQ=Gd41UkZVY#;dSX*6m<41yj#)yR!qE-xbVGOv8xLeBKk16 zg;ZEIbf8g!$t~EroVC6V*02{=sR`6c!xR`~8H-hr4PtzSk`BsoFcR;yjQnL6l;x-{ z4lWoBE<3Tgw6y_92o1{C;CB$o*)j4a>TA}Ig{vGfb%C8aLGPI_9PC+qIcQ!b`eMqj zZI!|13wRI&u&!N{OT(gT;MRi{62_s;rS>SbvOoU#0XJMcjT;e?ga}#8>5{EDI<(d0 z&V6|4nPqhnWuBri)Yhg}--EhA97D(we80e;VJVWC>rjqM68`ZR9$GGaGv}z;#cUC z-7XvdTKkaX&_mcZLH~v<9_YcHKJ(a3BMwpI<};@7Y}xhYB2FArt;!sGQkOJ?XT0PyRM1VN7$U zuV&8a2$4o`0suaAsFDDP4ku7Rm0zk%D;dJyvK-b5Cwv{lq=mHMReRhLQ8gqafy}+; z&u&lolbP(X?zpd;zvZy^BvtP?S{oAJhdheVr8)4&2a`#@Y>ovf&Rdf6; zDF;+pm&LjjA}R~MPvHjyxYkYCu$!B6&41sd|GaWdjy0RC{`*H+9|eE#zkcHX{DamX z{O4Lej?dEbX&K`mxUyf6yC3qozrBY`h)`g+RoOFY`2R16mOehrn5EyivwxLvM6Qzk zBX6_tY9~tLEbEHAsFmlcJXG!T#4d0|81!&UFhx`(h2N*{V|^H7F6(SMM}#Q*)=%WS z)*r? z>OC;E=` F{{Wskq(T4y literal 0 HcmV?d00001 From 43c844287133fa9e21943b711c66c7760bc659e5 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 Feb 2021 11:12:55 -0500 Subject: [PATCH 025/144] Revising chapters --- jupyter/chap20.ipynb | 1108 ++++++++++++++++++++++++ jupyter/chap21.ipynb | 1087 +++++++++++++++++++++++ jupyter/chap22.ipynb | 1961 ++++++++++++++++++++++++++++++++++++++++++ jupyter/modsim.py | 173 ++-- 4 files changed, 4236 insertions(+), 93 deletions(-) create mode 100644 jupyter/chap20.ipynb create mode 100644 jupyter/chap21.ipynb create mode 100644 jupyter/chap22.ipynb diff --git a/jupyter/chap20.ipynb b/jupyter/chap20.ipynb new file mode 100644 index 00000000..a2cc521d --- /dev/null +++ b/jupyter/chap20.ipynb @@ -0,0 +1,1108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "funded-utilization", + "metadata": {}, + "source": [ + "# Chapter 20" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-portsmouth", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "pending-adams", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "embedded-gentleman", + "metadata": {}, + "source": [ + "So far the differential equations we've worked with have been **first\n", + "order**, which means they involve only first derivatives. In this\n", + "chapter, we turn our attention to second order ODEs, which can involve\n", + "both first and second derivatives.\n", + "\n", + "We'll revisit the falling penny example from\n", + "Chapter xxx, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." + ] + }, + { + "cell_type": "markdown", + "id": "isolated-louis", + "metadata": {}, + "source": [ + "## Newton's second law of motion\n", + "\n", + "First order ODEs can be written \n", + "\n", + "$$\\frac{dy}{dx} = G(x, y)$$ \n", + "\n", + "where $G$ is some function of $x$ and $y$ (see ). Second order ODEs can be written \n", + "\n", + "$$\\frac{d^2y}{dx^2} = H(x, y, \\frac{dy}{dt})$$\n", + "\n", + "where $H$ is a function of $x$, $y$, and $dy/dx$.\n", + "\n", + "In this chapter, we will work with one of the most famous and useful\n", + "second order ODEs, Newton's second law of motion: \n", + "\n", + "$$F = m a$$ \n", + "\n", + "where $F$ is a force or the total of a set of forces, $m$ is the mass of a moving object, and $a$ is its acceleration." + ] + }, + { + "cell_type": "markdown", + "id": "drawn-symphony", + "metadata": {}, + "source": [ + "Newton's law might not look like a differential equation, until we\n", + "realize that acceleration, $a$, is the second derivative of position,\n", + "$y$, with respect to time, $t$. With the substitution\n", + "\n", + "$$a = \\frac{d^2y}{dt^2}$$ \n", + "\n", + "Newton's law can be written\n", + "\n", + "$$\\frac{d^2y}{dt^2} = F / m$$ \n", + "\n", + "And that's definitely a second order ODE.\n", + "In general, $F$ can be a function of time, position, and velocity." + ] + }, + { + "cell_type": "markdown", + "id": "swiss-vietnam", + "metadata": {}, + "source": [ + "Of course, this \"law\" is really a model in the sense that it is a\n", + "simplification of the real world. Although it is often approximately\n", + "true:\n", + "\n", + "- It only applies if $m$ is constant. If mass depends on time,\n", + " position, or velocity, we have to use a more general form of\n", + " Newton's law (see ).\n", + "\n", + "- It is not a good model for very small things, which are better\n", + " described by another model, quantum mechanics.\n", + "\n", + "- And it is not a good model for things moving very fast, which are\n", + " better described by yet another model, relativistic mechanics.\n", + "\n", + "However, for medium-sized things with constant mass, moving at\n", + "medium-sized speeds, Newton's model is extremely useful. If we can\n", + "quantify the forces that act on such an object, we can predict how it\n", + "will move." + ] + }, + { + "cell_type": "markdown", + "id": "coordinate-three", + "metadata": {}, + "source": [ + "## Dropping pennies\n", + "\n", + "As a first example, let's get back to the penny falling from the Empire State Building, which we considered in\n", + "Chapter xxx. We will implement two models of this system: first without air resistance, then with.\n", + "\n", + "Given that the Empire State Building is 381 m high, and assuming that\n", + "the penny is dropped from a standstill, the initial conditions are:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "compatible-increase", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State\n", + "\n", + "init = State(y=381, v=0)" + ] + }, + { + "cell_type": "markdown", + "id": "intellectual-radiation", + "metadata": {}, + "source": [ + "where `y` is height above the sidewalk and `v` is velocity. \n", + "\n", + "The units `m` and `s` are from the `units` object provided by Pint:" + ] + }, + { + "cell_type": "markdown", + "id": "wicked-thomas", + "metadata": {}, + "source": [ + "The only system parameter is the acceleration of gravity:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "reverse-authorization", + "metadata": {}, + "outputs": [], + "source": [ + "g = 9.8" + ] + }, + { + "cell_type": "markdown", + "id": "developing-newfoundland", + "metadata": {}, + "source": [ + "In addition, we'll specify the duration of the simulation and the step\n", + "size:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "square-toolbox", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 10\n", + "dt = 0.1" + ] + }, + { + "cell_type": "markdown", + "id": "precise-tobago", + "metadata": {}, + "source": [ + "With these parameters, the number of time steps is 100, which is good\n", + "enough for many problems. Once we have a solution, we will increase the\n", + "number of steps and see what effect it has on the results.\n", + "\n", + "We need a `System` object to store the parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "built-piece", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import System\n", + "\n", + "system = System(init=init, g=g, t_end=t_end, dt=dt)" + ] + }, + { + "cell_type": "markdown", + "id": "heavy-boards", + "metadata": {}, + "source": [ + "Now we need a slope function, and here's where things get tricky. As we have seen, `run_solve_ivp` can solve systems of first order ODEs, but Newton's law is a second order ODE. However, if we recognize that\n", + "\n", + "1. Velocity, $v$, is the derivative of position, $dy/dt$, and\n", + "\n", + "2. Acceleration, $a$, is the derivative of velocity, $dv/dt$,\n", + "\n", + "we can rewrite Newton's law as a system of first order ODEs:\n", + "\n", + "$$\\frac{dy}{dt} = v$$ \n", + "\n", + "$$\\frac{dv}{dt} = a$$ \n", + "\n", + "And we can translate those\n", + "equations into a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "occupied-mercury", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " y, v = state\n", + "\n", + " dydt = v\n", + " dvdt = -system.g\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "id": "opening-adolescent", + "metadata": {}, + "source": [ + "The first parameter, `state`, contains the position and velocity of the\n", + "penny. The last parameter, `system`, contains the system parameter `g`,\n", + "which is the magnitude of acceleration due to gravity.\n", + "\n", + "The second parameter, `t`, is time. It is not used in this slope\n", + "function because none of the factors of the model are time dependent. I include it anyway because this function will be called by `run_solve_ivp`, which always provides the same arguments,\n", + "whether they are needed or not.\n", + "\n", + "The rest of the function is a straightforward translation of the\n", + "differential equations, with the substitution $a = -g$, which indicates that acceleration due to gravity is in the direction of decreasing $y$. `slope_func` returns a sequence containing the two derivatives.\n", + "\n", + "Before calling `run_solve_ivp`, it is a good idea to test the slope\n", + "function with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "positive-feeling", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "-9.8\n" + ] + } + ], + "source": [ + "dydt, dvdt = slope_func(0, system.init, system)\n", + "print(dydt)\n", + "print(dvdt)" + ] + }, + { + "cell_type": "markdown", + "id": "false-charlotte", + "metadata": {}, + "source": [ + "The result is 0 m/s for velocity and 9.8 m/s$^2$ for acceleration. Now we call `run_solve_ivp` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "lovely-management", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " message: 'The solver successfully reached the end of the integration interval.'\n", + " nfev: 38\n", + " njev: 0\n", + " nlu: 0\n", + " sol: None\n", + " status: 0\n", + " success: True\n", + " t_events: None\n", + " y_events: None" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "results, details = run_solve_ivp(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "assisted-swimming", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    yv
    0.0381.0000.00
    0.2380.804-1.96
    0.4380.216-3.92
    0.6379.236-5.88
    0.8377.864-7.84
    \n", + "
    " + ], + "text/plain": [ + " y v\n", + "0.0 381.000 0.00\n", + "0.2 380.804 -1.96\n", + "0.4 380.216 -3.92\n", + "0.6 379.236 -5.88\n", + "0.8 377.864 -7.84" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "solved-chambers", + "metadata": {}, + "source": [ + "`results` is a `TimeFrame` with two columns: `y` contains the height of\n", + "the penny; `v` contains its velocity.\n", + "\n", + "We can plot the results like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "authorized-barrier", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results.y.plot()\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')" + ] + }, + { + "cell_type": "markdown", + "id": "differential-airfare", + "metadata": {}, + "source": [ + "Since acceleration is constant, velocity increases linearly and position decreases quadratically; as a result, the height curve is a parabola.\n", + "\n", + "The last value of `results.y` is negative, which means we ran the simulation too long. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "protected-fiber", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-108.99999999999869" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_end = results.index[-1]\n", + "results.y[t_end]" + ] + }, + { + "cell_type": "markdown", + "id": "metallic-tamil", + "metadata": {}, + "source": [ + "One way to solve this problem is to use the results to\n", + "estimate the time when the penny hits the sidewalk.\n", + "\n", + "The ModSim library provides `crossings`, which takes a `TimeSeries` and a value, and returns a sequence of times when the series passes through the value. We can find the time when the height of the penny is `0` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "japanese-clear", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([8.81788535])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import crossings\n", + "\n", + "t_crossings = crossings(results.y, 0)\n", + "t_crossings" + ] + }, + { + "cell_type": "markdown", + "id": "demonstrated-emission", + "metadata": {}, + "source": [ + "The result is an array with a single value, 8.818 s. Now, we could run\n", + "the simulation again with `t_end = 8.818`, but there's a better way." + ] + }, + { + "cell_type": "markdown", + "id": "blind-dominant", + "metadata": {}, + "source": [ + "## Events\n", + "\n", + "As an option, `run_solve_ivp` can take an **event function**, which\n", + "detects an \"event\", like the penny hitting the sidewalk, and ends the\n", + "simulation.\n", + "\n", + "Event functions take the same parameters as slope functions, `state`,\n", + "`t`, and `system`. They should return a value that passes through `0`\n", + "when the event occurs. Here's an event function that detects the penny\n", + "hitting the sidewalk:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "comfortable-simple", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "closing-vehicle", + "metadata": {}, + "source": [ + "The return value is the height of the penny, `y`, which passes through\n", + "`0` when the penny hits the sidewalk.\n", + "\n", + "We pass the event function to `run_solve_ivp` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "exotic-shareware", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " message: 'A termination event occurred.'\n", + " nfev: 38\n", + " njev: 0\n", + " nlu: 0\n", + " sol: None\n", + " status: 1\n", + " success: True\n", + " t_events: [array([8.81788535])]\n", + " y_events: [array([[ 5.68434189e-14, -8.64152764e+01]])]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "id": "recreational-blair", + "metadata": {}, + "source": [ + "Then we can get the flight time and final velocity like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "appropriate-roberts", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8.8" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_end = results.index[-1]\n", + "t_end" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "orange-retro", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.5440000000007217\n", + "-86.24000000000001\n" + ] + } + ], + "source": [ + "y, v = results.iloc[-1]\n", + "print(y)\n", + "print(v)" + ] + }, + { + "cell_type": "markdown", + "id": "cleared-jamaica", + "metadata": {}, + "source": [ + "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", + "\n", + "So it's a good thing there is air resistance." + ] + }, + { + "cell_type": "markdown", + "id": "induced-albert", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "But air resistance...\n" + ] + }, + { + "cell_type": "markdown", + "id": "straight-johns", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", + "\n", + "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", + "\n", + "Use `run_solve_ivp` to answer this question.\n", + "\n", + "Here are some suggestions about how to proceed:\n", + "\n", + "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", + "\n", + "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", + "\n", + "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", + "\n", + "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", + "\n", + "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "forbidden-distributor", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "r_0 = 150e9 # 150 million km in m\n", + "v_0 = 0\n", + "init = State(r=r_0,\n", + " v=v_0)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "former-taxation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "702370000.0" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "radius_earth = 6.37e6 # meters\n", + "radius_sun = 696e6 # meters\n", + "r_final = radius_sun + radius_earth\n", + "r_final" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "biological-creek", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "213.56265216338966" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "r_0 / r_final" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "oriental-riverside", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 1e7 # seconds\n", + "\n", + "system = System(init=init,\n", + " G=6.674e-11, # N m^2 / kg^2\n", + " m1=1.989e30, # kg\n", + " m2=5.972e24, # kg\n", + " r_final=radius_sun + radius_earth,\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "radio-reproduction", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def universal_gravitation(state, system):\n", + " \"\"\"Computes gravitational force.\n", + " \n", + " state: State object with distance r\n", + " system: System object with m1, m2, and G\n", + " \"\"\"\n", + " r, v = state\n", + " G, m1, m2 = system.G, system.m1, system.m2\n", + " \n", + " force = G * m1 * m2 / r**2\n", + " return force" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "heavy-cologne", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.5233701151999997e+22" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "universal_gravitation(init, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "little-electric", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def slope_func(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing `m2`\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " m2 = system.m2 \n", + "\n", + " force = universal_gravitation(state, system)\n", + " dydt = v\n", + " dvdt = -force / m2\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "continental-details", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.0, -0.005899815999999999)" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "suitable-traveler", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def event_func(t, state, system):\n", + " r, v = state\n", + " return r - system.r_final" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "upper-victory", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "149297630000.0" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "event_func(0, init, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "transparent-treat", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " message: 'A termination event occurred.'\n", + " nfev: 188\n", + " njev: 0\n", + " nlu: 0\n", + " sol: None\n", + " status: 1\n", + " success: True\n", + " t_events: [array([5599828.17941854])]\n", + " y_events: [array([[ 7.02370000e+08, -6.13362867e+05]])]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results, details = run_solve_ivp(system, slope_func, \n", + " events=event_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "brutal-woman", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5400000.0" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "t_event = results.index[-1]\n", + "t_event" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "gentle-burst", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "from modsim import units\n", + "\n", + "seconds = t_event * units.second\n", + "days = seconds.to(units.day)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "comfortable-galaxy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "results.index /= 60 * 60 * 24" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "satisfactory-latitude", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "results.r /= 1e9" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "significant-rebound", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "results.r.plot(label='r')\n", + "\n", + "decorate(xlabel='Time (day)',\n", + " ylabel='Distance from sun (million km)')" + ] + }, + { + "cell_type": "markdown", + "id": "right-colleague", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "`solve_ivp`\n", + "\n", + "Here is the source code for `crossings` so you can see what's happening under the hood:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "chief-error", + "metadata": {}, + "outputs": [], + "source": [ + "%psource crossings" + ] + }, + { + "cell_type": "markdown", + "id": "comparable-company", + "metadata": {}, + "source": [ + "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "listed-shelter", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap21.ipynb b/jupyter/chap21.ipynb new file mode 100644 index 00000000..5601492d --- /dev/null +++ b/jupyter/chap21.ipynb @@ -0,0 +1,1087 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "excited-advance", + "metadata": {}, + "source": [ + "# Chapter 21" + ] + }, + { + "cell_type": "markdown", + "id": "unauthorized-constitutional", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "medieval-cheese", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "running-field", + "metadata": {}, + "source": [ + "In the previous chapter we simulated a penny falling in a vacuum, that\n", + "is, without air resistance. But the computational framework we used is\n", + "very general; it is easy to add additional forces, including drag.\n", + "\n", + "In this chapter, I present a model of drag force and add it to the\n", + "simulation." + ] + }, + { + "cell_type": "markdown", + "id": "refined-yield", + "metadata": {}, + "source": [ + "## Drag force\n", + "\n", + "As an object moves through a fluid, like air, the object applies force\n", + "to the air and, in accordance with Newton's third law of motion, the air applies an equal and opposite force to the object (see\n", + ").\n", + "\n", + "The direction of this **drag force** is opposite the direction of\n", + "travel, and its magnitude is given by the drag equation (see\n", + "): \n", + "\n", + "$$F_d = \\frac{1}{2}~\\rho~v^2~C_d~A$$\n", + "\n", + "where\n", + "\n", + "- $F_d$ is force due to drag, in newtons (N).\n", + "\n", + "- $\\rho$ is the density of the fluid in kg/m^3^.\n", + "\n", + "- $v$ is the magnitude of velocity in m/s.\n", + "\n", + "- $A$ is the **reference area** of the object, in m^2^. In this\n", + " context, the reference area is the projected frontal area, that is, the visible area of the object as seen from a point on its line of\n", + " travel (and far away).\n", + "\n", + "- $C_d$ is the **drag coefficient**, a dimensionless quantity that\n", + " depends on the shape of the object (including length but not frontal area), its surface properties, and how it interacts with the fluid." + ] + }, + { + "cell_type": "markdown", + "id": "domestic-studio", + "metadata": {}, + "source": [ + "For objects moving at moderate speeds through air, typical drag\n", + "coefficients are between 0.1 and 1.0, with blunt objects at the high end of the range and streamlined objects at the low end (see\n", + ").\n", + "\n", + "For simple geometric objects we can sometimes guess the drag coefficient with reasonable accuracy; for more complex objects we usually have to take measurements and estimate $C_d$ from data.\n", + "\n", + "Of course, the drag equation is itself a model, based on the assumption that $C_d$ does not depend on the other terms in the equation: density, velocity, and area. For objects moving in air at moderate speeds (below 45 mph or 20 m/s), this model might be good enough, but we should remember to revisit this assumption.\n", + "\n", + "For the falling penny, we can use measurements to estimate $C_d$. In\n", + "particular, we can measure **terminal velocity**, $v_{term}$, which is\n", + "the speed where drag force equals force due to gravity:\n", + "\n", + "$$\\frac{1}{2}~\\rho~v_{term}^2~C_d~A = m g$$ \n", + "\n", + "where $m$ is the mass of the object and $g$ is acceleration due to gravity. Solving this equation for\n", + "$C_d$ yields: \n", + "\n", + "$$C_d = \\frac{2~m g}{\\rho~v_{term}^2~A}$$ \n", + "\n", + "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afraid-expression", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "exempt-mustang", + "metadata": {}, + "source": [ + "Now we are ready to add air resistance to the model." + ] + }, + { + "cell_type": "markdown", + "id": "human-cloud", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "As the number of system parameters increases, and as we need to do more work to compute them, we will find it useful to define a `Params` object to contain the quantities we need to make a `System` object. `Params` objects are similar to `System` and `State` objects; in fact, all three have the same capabilities. I have given them different names to document the different roles they play.\n", + "\n", + "Here's the `Params` object for the falling penny:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "scheduled-element", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "from modsim import State\n", + "from modsim import System\n", + "\n", + "def make_system(mass, diameter, rho, v_init, v_term):\n", + " area = pi * (diameter/2)**2\n", + "\n", + " g = 9.8 # m/s**2\n", + " C_d = 2 * mass * g / (rho * area * v_term**2)\n", + "\n", + " height = 381 # m\n", + " init = State(y=height, v=v_init)\n", + " t_end = 30 # s\n", + "\n", + " return System(init=init,\n", + " rho=rho,\n", + " C_d=C_d,\n", + " g=g,\n", + " area=area,\n", + " mass=mass,\n", + " t_end=t_end\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "circular-techno", + "metadata": {}, + "outputs": [], + "source": [ + "mass = 2.5e-3 # kg\n", + "diameter = 19e-3 # m\n", + "rho = 1.2 # kg/m**3\n", + "v_init = 0 # m / s\n", + "v_term = 18 # m / s\n", + "\n", + "system = make_system(mass, diameter, rho, v_init, v_term)" + ] + }, + { + "cell_type": "markdown", + "id": "instrumental-gross", + "metadata": {}, + "source": [ + "The mass and diameter are from . The density\n", + "of air depends on temperature, barometric pressure (which depends on\n", + "altitude), humidity, and composition (). I\n", + "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n" + ] + }, + { + "cell_type": "markdown", + "id": "primary-advocate", + "metadata": {}, + "source": [ + "Now here's a version of the slope function that includes drag:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "noble-stick", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " y, v = state\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " mass, g = system.mass, system.g\n", + " \n", + " f_drag = rho * v**2 * C_d * area / 2\n", + " a_drag = f_drag / mass\n", + " \n", + " dydt = v\n", + " dvdt = -g + a_drag\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "id": "amended-summit", + "metadata": {}, + "source": [ + "`f_drag` is force due to drag, based on the drag equation. `a_drag` is\n", + "acceleration due to drag, based on Newton's second law.\n", + "\n", + "To compute total acceleration, we add accelerations due to gravity and\n", + "drag. `g` is negated because it is in the direction of decreasing `y`,\n", + "and `a_drag` is positive because it is in the direction of increasing\n", + "`y`. In the next chapter we will use `Vector` objects to keep track of\n", + "the direction of forces and add them up in a less error-prone way." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "collectible-austria", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, -9.8)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "psychological-style", + "metadata": {}, + "source": [ + "To stop the simulation when the penny hits the sidewalk, we'll use the\n", + "event function from Section xxx:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "practical-nowhere", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "seventh-biology", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "381" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "executive-there", + "metadata": {}, + "source": [ + "Now we can run the simulation like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "liberal-dictionary", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "mysterious-whale", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    yv
    0.000000381.0000000.000000
    0.448789380.022075-4.312820
    0.897579377.200545-8.156877
    1.346368372.817221-11.248931
    1.795157367.230596-13.539505
    \n", + "
    " + ], + "text/plain": [ + " y v\n", + "0.000000 381.000000 0.000000\n", + "0.448789 380.022075 -4.312820\n", + "0.897579 377.200545 -8.156877\n", + "1.346368 372.817221 -11.248931\n", + "1.795157 367.230596 -13.539505" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "dimensional-longitude", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    yv
    20.6443083.229229e+01-17.988889
    21.0930972.421654e+01-17.991564
    21.5418861.614743e+01-18.001510
    21.9906768.076745e+00-18.009752
    22.4394657.105427e-15-18.011383
    \n", + "
    " + ], + "text/plain": [ + " y v\n", + "20.644308 3.229229e+01 -17.988889\n", + "21.093097 2.421654e+01 -17.991564\n", + "21.541886 1.614743e+01 -18.001510\n", + "21.990676 8.076745e+00 -18.009752\n", + "22.439465 7.105427e-15 -18.011383" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "emerging-domestic", + "metadata": {}, + "source": [ + "The final height is close to 0, as expected.\n", + "\n", + "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", + "\n", + "We can get the flight time from `results`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cleared-willow", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22.43946505804431" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_sidewalk = results.index[-1]\n", + "t_sidewalk" + ] + }, + { + "cell_type": "markdown", + "id": "rising-nutrition", + "metadata": {}, + "source": [ + "Here's the plot of position as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "touched-calculation", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "def plot_position(results):\n", + " results.y.plot()\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "id": "prospective-favor", + "metadata": {}, + "source": [ + "And velocity as a function of time:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "coordinate-albert", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_velocity(results):\n", + "\n", + " results.v.plot(color='C1', label='v')\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "id": "familiar-antarctica", + "metadata": {}, + "source": [ + "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." + ] + }, + { + "cell_type": "markdown", + "id": "recovered-reverse", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "portable-office", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. \n", + "\n", + "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "powerful-springfield", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "v_init = -30\n", + "system2 = make_system(mass, diameter, rho, v_init, v_term)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "liberal-fighter", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func)\n", + "details2.message" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "informed-representation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "20.635183673114202" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_sidewalk = results2.index[-1]\n", + "t_sidewalk" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "governmental-arena", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_position(results2)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "encouraging-aside", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot_velocity(results2)" + ] + }, + { + "cell_type": "markdown", + "id": "educational-rainbow", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate terminal velocity and coefficient of drag.\n", + "\n", + "You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", + "\n", + "1. Create a `Params` object with the system parameters. \n", + "\n", + "2. Use `make_system` to create a `System` object. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", + "\n", + "3. Call `run_solve_ivp` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", + "\n", + "4. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", + "\n", + "5. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", + "\n", + "6. Use your best estimate of `v_term` to compute `C_d`.\n", + "\n", + "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "advisory-tunnel", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "mass = 5.67e-3 # kg\n", + "diameter = 24.26e-3 # m\n", + "v_term = 18 # m / s\n", + "flight_time = 19.1 # s" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "underlying-sperm", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "namespace(init=y 381\n", + " v 0\n", + " dtype: int64,\n", + " rho=1.2,\n", + " C_d=0.6183600157463346,\n", + " g=9.8,\n", + " area=0.000462244204111976,\n", + " mass=0.00567,\n", + " t_end=30)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "v_init = 0\n", + "system3 = make_system(mass, diameter, rho, v_init, v_term)\n", + "system3" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "standard-allah", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "# Run the simulation\n", + "\n", + "results3, details3 = run_solve_ivp(system3, slope_func, \n", + " events=event_func)\n", + "details3.message" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "atlantic-southeast", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "22.43946505804431" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "# And get the flight time\n", + "\n", + "t_sidewalk = results3.index[-1]\n", + "t_sidewalk" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "sorted-leisure", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "# The flight time is a little long, \n", + "# so we could increase `v_term` and try again.\n", + "\n", + "# Or we could write an error function\n", + "\n", + "def error_func(guess):\n", + " \"\"\"Final height as a function of C_d.\n", + " \n", + " guess: guess at v_term\n", + " params: Params object\n", + " \n", + " returns: height in m\n", + " \"\"\"\n", + " print(guess)\n", + " v_term = guess\n", + " system = make_system(mass, diameter, rho, v_init, v_term)\n", + " results, details = run_solve_ivp(system, slope_func, \n", + " events=event_func)\n", + " t_sidewalk = results.index[-1]\n", + " error = t_sidewalk - flight_time\n", + " return error" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "perfect-suffering", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18\n" + ] + }, + { + "data": { + "text/plain": [ + "3.3394650580443077" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "# We can test the error function like this\n", + "v_guess1 = 18\n", + "error_func(v_guess1)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "juvenile-provincial", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22\n" + ] + }, + { + "data": { + "text/plain": [ + "-0.22717020844738656" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "v_guess2 = 22\n", + "error_func(v_guess2)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "incorporate-jungle", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18.0\n", + "22.0\n", + "21.745227429805748\n", + "21.688258716910187\n", + "21.688401491107182\n", + "21.688401102071705\n", + "21.68840110206904\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "# Now we can use `root_scalar` to find the value of \n", + "# `v_term` that yields the measured flight time.\n", + "\n", + "from scipy.optimize import root_scalar\n", + "\n", + "res = root_scalar(error_func, bracket=[v_guess1, v_guess2])" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "conceptual-questionnaire", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "21.68840110206904" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "v_term = res.root\n", + "v_term" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "designed-variation", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.4259232394493775" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "# Plugging in the estimated value, \n", + "# we can use `make_system` to compute `C_d`\n", + "\n", + "system4 = make_system(mass, diameter, rho, v_init, v_term)\n", + "system4.C_d" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "meaning-instruction", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap22.ipynb b/jupyter/chap22.ipynb new file mode 100644 index 00000000..3e157a17 --- /dev/null +++ b/jupyter/chap22.ipynb @@ -0,0 +1,1961 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "collaborative-people", + "metadata": {}, + "source": [ + "# Chapter 22" + ] + }, + { + "cell_type": "markdown", + "id": "connected-covering", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "widespread-detective", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "regional-block", + "metadata": {}, + "source": [ + "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", + "\n", + "In this chapter we model the flight of a baseball including the effect\n", + "of air resistance. In the next chapter we use this model to solve an\n", + "optimization problem." + ] + }, + { + "cell_type": "markdown", + "id": "looking-sampling", + "metadata": {}, + "source": [ + "## Baseball\n", + "\n", + "To model the flight of a baseball, we have to make some modeling\n", + "decisions. To get started, we ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", + "\n", + "Air resistance has a substantial effect on most projectiles in air, so\n", + "we will include a drag force.\n", + "\n", + "To model air resistance, we'll need the mass, frontal area, and drag\n", + "coefficient of a baseball. Mass and diameter are easy to find (see\n", + "). Drag coefficient is only a little\n", + "harder; according to *The Physics of Baseball*[^1], the drag coefficient of a baseball is approximately 0.33 (with no units).\n", + "\n", + "However, this value *does* depend on velocity. At low velocities it\n", + "might be as high as 0.5, and at high velocities as low as 0.28.\n", + "Furthermore, the transition between these regimes typically happens\n", + "exactly in the range of velocities we are interested in, between 20 m/s and 40 m/s.\n", + "\n", + "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you will have a chance to implement a more detailed model and see what effect is has on the results.\n", + "\n", + "But first we need a new computational tool, the `Vector` object." + ] + }, + { + "cell_type": "markdown", + "id": "worthy-wheel", + "metadata": {}, + "source": [ + "## Vectors\n", + "\n", + "Now that we are working in two dimensions, we will find it useful to\n", + "work with **vector quantities**, that is, quantities that represent both a magnitude and a direction. We will use vectors to represent positions, velocities, accelerations, and forces in two and three dimensions.\n", + "\n", + "The ModSim library provides a `Vector` object that represents a vector\n", + "quantity. A `Vector` object is a like a NumPy array; it contains\n", + "elements that represent the **components** of the vector. For example,\n", + "in a `Vector` that represents a position in space, the components are\n", + "the $x$ and $y$ coordinates (and a $z$ coordinate in 3-D). A `Vector`\n", + "object can also have units, like the quantities we've seen in previous\n", + "chapters.\n", + "\n", + "You can create a `Vector` by specifying its components. The following\n", + "`Vector` represents a point 3 m to the right (or east) and 4 m up (or\n", + "north) from an implicit origin:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "smaller-hudson", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 3\n", + "y 4\n", + "dtype: int64" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import Vector\n", + "\n", + "A = Vector(3, 4)\n", + "A" + ] + }, + { + "cell_type": "markdown", + "id": "suited-helena", + "metadata": {}, + "source": [ + "You can access the components of a `Vector` by name using the dot\n", + "operator: for example, `A.x` or `A.y`. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "prompt-vault", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3, 4)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.x, A.y" + ] + }, + { + "cell_type": "markdown", + "id": "continuous-convert", + "metadata": {}, + "source": [ + "You can also access them by index using brackets: for example, `A[0]` or `A[1]`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "strange-credit", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3, 4)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[0], A[1]" + ] + }, + { + "cell_type": "markdown", + "id": "actual-blond", + "metadata": {}, + "source": [ + "`Vector` objects support most mathematical operations, including\n", + "addition and subtraction:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "integrated-inspector", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 1\n", + "y 2\n", + "dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "B = Vector(1, 2)\n", + "B" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "advance-integral", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 4\n", + "y 6\n", + "dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A + B" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "respected-acrobat", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 2\n", + "y 2\n", + "dtype: int64" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A - B" + ] + }, + { + "cell_type": "markdown", + "id": "incorporate-longer", + "metadata": {}, + "source": [ + "For the definition and graphical interpretation of these operations, see ." + ] + }, + { + "cell_type": "markdown", + "id": "reliable-soundtrack", + "metadata": {}, + "source": [ + "We can think of a `Vector` as a point defined by its coordinates `x` and `y`.\n", + "Equivalently, we can think of it as a point defined by a magnitude and angle.\n", + "\n", + "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is the distance from the origin; if it represents a velocity, magnitude is speed, that is, how fast the object is moving, regardless of direction.\n", + "\n", + "The **angle** of a `Vector` is its direction, expressed as the angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", + "\n", + "ModSim provides functions to compute the magnitude and angle of a `Vector`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "affected-programmer", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(5.0, 0.9272952180016122)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import vector_mag, vector_angle\n", + "\n", + "vector_mag(A), vector_angle(A)" + ] + }, + { + "cell_type": "markdown", + "id": "great-advice", + "metadata": {}, + "source": [ + "The result from `vector_angle` is in radians, and most Python functions expect angles in radians. \n", + "But many people think more naturally in degrees. \n", + "It can be awkward, and error-prone, to use both units in the same program.\n", + "Fortunately, NumPy provides a function to convert degrees to radians:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cellular-community", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7853981633974483" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import deg2rad\n", + "\n", + "angle = 45\n", + "theta = deg2rad(angle)\n", + "theta" + ] + }, + { + "cell_type": "markdown", + "id": "congressional-panel", + "metadata": {}, + "source": [ + "And radians to degrees:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "informed-statistics", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "45.0" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import rad2deg\n", + "\n", + "rad2deg(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "responsible-gentleman", + "metadata": {}, + "source": [ + "Following convention, I'll use `angle` for a value in degrees and `theta` for a value in radians.\n", + "\n", + "If you are given an angle and velocity, you can make a `Vector` using\n", + "`pol2cart`, which converts from polar to Cartesian coordinates. To\n", + "demonstrate, I'll extract the angle and magnitude of `A`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "exempt-douglas", + "metadata": {}, + "outputs": [], + "source": [ + "mag = vector_mag(A)\n", + "angle = vector_angle(A)" + ] + }, + { + "cell_type": "markdown", + "id": "enhanced-toner", + "metadata": {}, + "source": [ + "And then make a new `Vector` with the same components:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "monetary-firmware", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 3.0\n", + "y 4.0\n", + "dtype: float64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import pol2cart\n", + "\n", + "x, y = pol2cart(angle, mag)\n", + "Vector(x, y)" + ] + }, + { + "cell_type": "markdown", + "id": "lucky-plastic", + "metadata": {}, + "source": [ + "Another way to represent the direction of `A` is a **unit vector**,\n", + "which is a vector with magnitude 1 that points in the same direction as\n", + "`A`. You can compute a unit vector by dividing a vector by its\n", + "magnitude:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "explicit-piano", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 0.6\n", + "y 0.8\n", + "dtype: float64" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A / vector_mag(A)" + ] + }, + { + "cell_type": "markdown", + "id": "respected-oliver", + "metadata": {}, + "source": [ + "We can do the same thing using the `hat` function, so named because unit\n", + "vectors are conventionally decorated with a hat, like this: $\\hat{A}$." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "relative-republic", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 0.6\n", + "y 0.8\n", + "dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import vector_hat\n", + "\n", + "vector_hat(A)" + ] + }, + { + "cell_type": "markdown", + "id": "novel-somewhere", + "metadata": {}, + "source": [ + "Now let's get back to the game." + ] + }, + { + "cell_type": "markdown", + "id": "similar-local", + "metadata": {}, + "source": [ + "## Simulating baseball flight\n", + "\n", + "Let's simulate the flight of a baseball that is batted from home plate\n", + "at an angle of 45 ° and initial speed 40 m/s. Using the center of home\n", + "plate as the origin, the x-axis is parallel to the ground; the y-axis is vertical. The initial height is about 1 m.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ancient-thunder", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "\n", + "mass = 145e-3 # kg \n", + "diameter = 73e-3 # m \n", + "area = pi * (diameter/2)**2\n", + "g = 9.8 # m/s**2" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "still-ownership", + "metadata": {}, + "outputs": [], + "source": [ + "rho = 1.2 # kg/m**3\n", + "C_d = 0.33\n", + "t_end = 10 # s" + ] + }, + { + "cell_type": "markdown", + "id": "detected-return", + "metadata": {}, + "source": [ + "The mass, diameter, and drag coefficient of the baseball are from the\n", + "sources in Section xxx. The acceleration of gravity, `g`, is a well-known quantity.\n", + "\n", + "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). I chose the\n", + "value of `t_end` to run the simulation long enough for the ball to land on the ground.\n", + "\n", + "The following function makes a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bored-billy", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "from numpy import deg2rad\n", + "\n", + "def make_system(angle, velocity, C_d, rho):\n", + " \n", + " # convert angle to degrees\n", + " theta = deg2rad(angle)\n", + " \n", + " # compute x and y components of velocity\n", + " vx, vy = pol2cart(theta, velocity)\n", + " \n", + " # make the initial state\n", + " init = State(x=0, y=1, vx=vx, vy=vy)\n", + " \n", + " return System(init=init, \n", + " area=area,\n", + " g=g,\n", + " mass=mass,\n", + " rho=rho,\n", + " C_d=C_d,\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "generic-budapest", + "metadata": {}, + "outputs": [], + "source": [ + "x = 0 # m\n", + "y = 1 # m\n", + "angle = 45 # degree\n", + "velocity = 40 # m / s\n", + "\n", + "system = make_system(angle, velocity, C_d, rho)" + ] + }, + { + "cell_type": "markdown", + "id": "occasional-given", + "metadata": {}, + "source": [ + "`make_system` uses `np.deg2rad` to convert `angle` to radians and\n", + "`pol2cart` to compute the $x$ and $y$ components of the initial\n", + "velocity.\n", + "\n", + "Next we need a function to compute drag force:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "legal-terminal", + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(V, system):\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = -rho * vector_mag(V)**2 * C_d * area / 2\n", + " direction = vector_hat(V)\n", + " f_drag = direction * mag\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "id": "attractive-genome", + "metadata": {}, + "source": [ + "This function takes `V` as a `Vector` and returns `f_drag` as a\n", + "`Vector`. It uses the drag equation to compute the magnitude of the drag\n", + "force, and the `hat` function to compute the direction. `-V.hat()`\n", + "computes a unit vector pointing in the opposite direction of `V`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "functional-thong", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x -0.117197\n", + "y -0.117197\n", + "dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import ModSimVector\n", + "\n", + "V_test = Vector(10, 10)\n", + "drag_force(V_test, system)" + ] + }, + { + "cell_type": "markdown", + "id": "absent-vector", + "metadata": {}, + "source": [ + "\n", + "Now we're ready for a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "suitable-salem", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " V = Vector(vx, vy)\n", + " a_drag = drag_force(V, system) / mass\n", + " a_grav = Vector(0, -g)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V.x, V.y, A.x, A.y" + ] + }, + { + "cell_type": "markdown", + "id": "crude-parcel", + "metadata": {}, + "source": [ + "As usual, the parameters of the slope function are a `State` object,\n", + "time, and a `System` object. In this example, we don't use `t`, but we\n", + "can't leave it out because when `run_solve_ivp` calls the slope\n", + "function, it always provides the same arguments, whether they are needed\n", + "or not.\n", + "\n", + "The `State` object contains two state variables, `R` and `V`, that\n", + "represent position and velocity as `Vector` objects.\n", + "\n", + "The return values from the slope function are the derivatives of these\n", + "quantities. The derivative of position is velocity, so the first return\n", + "value is `V`, which we extracted from the `State` object. The derivative\n", + "of velocity is acceleration, and that's what we have to compute.\n", + "\n", + "The total acceleration of the baseball is the sum of accelerations due\n", + "to gravity and drag. These quantities have both magnitude and direction,\n", + "so they are represented by `Vector` objects.\n", + "\n", + "We already saw how `a_drag` is computed. `a_grav` is a `Vector` with\n", + "magnitude `g` pointed in the negative `y` direction.\n", + "\n", + "Using vectors to represent forces and accelerations makes the code\n", + "concise, readable, and less error-prone. In particular, when we add\n", + "`a_grav` and `a_drag`, the directions are likely to be correct, because\n", + "they are encoded in the `Vector` objects. And the units are certain to\n", + "be correct, because otherwise Pint would report an error.\n", + "\n", + "As always, we can test the slope function by running it with the initial\n", + "conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "closing-simon", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28.284271247461902, 28.2842712474619, -6.466030881564545, -16.266030881564546)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "regulated-railway", + "metadata": {}, + "source": [ + "We can use an event function to stop the simulation when the ball hits\n", + "the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "brief-level", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "victorian-sharing", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "unlikely-dressing", + "metadata": {}, + "source": [ + "The event function takes the same parameters as the slope function, and\n", + "returns the y coordinate of `R`. When the y coordinate passes through 0,\n", + "the simulation stops.\n", + "\n", + "Now we're ready to run the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "special-background", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "thick-ozone", + "metadata": {}, + "source": [ + "`results` is a `TimeFrame` with one column for each of the state variables, `x`, `y`, `vx`, and `vy`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "complex-reviewer", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    xyvxvy
    4.60449693.4739718.296642e+0015.013486-19.334826
    4.70459494.9667566.325368e+0014.802553-20.038175
    4.80469296.4385154.284486e+0014.590855-20.726780
    4.90478997.8890872.175515e+0014.378566-21.400392
    5.00488799.318296-7.105427e-1514.165894-22.058763
    \n", + "
    " + ], + "text/plain": [ + " x y vx vy\n", + "4.604496 93.473971 8.296642e+00 15.013486 -19.334826\n", + "4.704594 94.966756 6.325368e+00 14.802553 -20.038175\n", + "4.804692 96.438515 4.284486e+00 14.590855 -20.726780\n", + "4.904789 97.889087 2.175515e+00 14.378566 -21.400392\n", + "5.004887 99.318296 -7.105427e-15 14.165894 -22.058763" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "dominant-weekly", + "metadata": {}, + "source": [ + "We can get the flight time like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "medieval-calvin", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.004887034868351" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flight_time = results.index[-1]\n", + "flight_time" + ] + }, + { + "cell_type": "markdown", + "id": "convenient-heading", + "metadata": {}, + "source": [ + "And the final `x` coordinate like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "gorgeous-survey", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "99.31829628352206" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x, y, vx, vy = results.iloc[-1]\n", + "x" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "sensitive-century", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    xyvxvy
    4.60449693.4739718.296642e+0015.013486-19.334826
    4.70459494.9667566.325368e+0014.802553-20.038175
    4.80469296.4385154.284486e+0014.590855-20.726780
    4.90478997.8890872.175515e+0014.378566-21.400392
    5.00488799.318296-7.105427e-1514.165894-22.058763
    \n", + "
    " + ], + "text/plain": [ + " x y vx vy\n", + "4.604496 93.473971 8.296642e+00 15.013486 -19.334826\n", + "4.704594 94.966756 6.325368e+00 14.802553 -20.038175\n", + "4.804692 96.438515 4.284486e+00 14.590855 -20.726780\n", + "4.904789 97.889087 2.175515e+00 14.378566 -21.400392\n", + "5.004887 99.318296 -7.105427e-15 14.165894 -22.058763" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "continuous-quick", + "metadata": {}, + "source": [ + "## Trajectories\n", + "\n", + "We can plot the $x$ and $y$ components of position like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "spare-burst", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "results.x.plot(color='C4')\n", + "results.y.plot(color='C2', style='--')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-bench", + "metadata": {}, + "source": [ + "As expected, the $x$\n", + "component increases as the ball moves away from home plate. The $y$\n", + "position climbs initially and then descends, falling to 0 m near 5.0 s.\n", + "\n", + "Another way to view the same data is to plot the $x$ component on the\n", + "x-axis and the $y$ component on the y-axis, so the plotted line follows the trajectory of the ball through the plane:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "dated-browse", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "def plot_trajectory(results):\n", + " plot(results.x, results.y, label='trajectory')\n", + "\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + "\n", + "plot_trajectory(results)" + ] + }, + { + "cell_type": "markdown", + "id": "certified-synthetic", + "metadata": {}, + "source": [ + "This way of visualizing the results is called a **trajectory plot** (see ).\n", + "\n", + "A trajectory plot can be easier to interpret than a time series plot,\n", + "because it shows what the motion of the projectile would look like (at\n", + "least from one point of view). Both plots can be useful, but don't get\n", + "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused.\n", + "\n", + "\n", + "[^1]: Adair, *The Physics of Baseball*, Third Edition, Perennial, 2002." + ] + }, + { + "cell_type": "markdown", + "id": "surprised-bandwidth", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", + "\n", + "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function." + ] + }, + { + "cell_type": "markdown", + "id": "hollow-maintenance", + "metadata": {}, + "source": [ + "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", + "\n", + "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "worth-leeds", + "metadata": {}, + "outputs": [], + "source": [ + "xs = results.x\n", + "ys = results.y\n", + "\n", + "def draw_func(t, state):\n", + " plot(state.x, state.y, 'bo')\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)',\n", + " xlim=(xs.min(), xs.max()),\n", + " ylim=(ys.min(), ys.max()),\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "general-peace", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import animate\n", + "\n", + "animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "id": "tested-friendly", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "strategic-reduction", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "caroline-theta", + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system2 = make_system(angle, velocity, 0, rho)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "perfect-property", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "demographic-destination", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Solution\n", + "\n", + "plot_trajectory(results)\n", + "plot_trajectory(results2)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "understood-colombia", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "99.31829628352206" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "x_dist = results.iloc[-1].x\n", + "x_dist" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "mediterranean-equivalent", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "164.25925502413202" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "x_dist_no_drag = results2.iloc[-1].x\n", + "x_dist_no_drag" + ] + }, + { + "cell_type": "markdown", + "id": "amateur-cowboy", + "metadata": {}, + "source": [ + "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "surprised-polls", + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system3 = make_system(angle, velocity, C_d, 1.0)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "welsh-match", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "105.78838005859807" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results3, details3 = run_solve_ivp(system3, slope_func, \n", + " events=event_func)\n", + "\n", + "x_dist3 = results3.iloc[-1].x\n", + "x_dist3" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "suspended-advantage", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.470083775076006" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "x_dist3 - x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "adjacent-mediterranean", + "metadata": {}, + "source": [ + "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", + "\n", + "\n", + "\n", + "\n", + "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "crazy-sense", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'baseball_drag.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "smaller-armenia", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    Velocity in mphDrag coefficient
    Velocity in meters per second
    0.0261460.0584860.49965
    8.87150919.8450000.49878
    17.64735139.4760000.49704
    22.43291450.1810000.48225
    26.88230360.1340000.45004
    30.63699268.5330000.40914
    32.97769473.7690000.38042
    34.60447277.4080000.36562
    37.49726883.8790000.34822
    40.46024990.5070000.33081
    43.49252297.2900000.31427
    46.733562104.5400000.30035
    50.886563113.8300000.28816
    54.047136120.9000000.28381
    56.926074127.3400000.28033
    60.086646134.4100000.28207
    \n", + "
    " + ], + "text/plain": [ + " Velocity in mph Drag coefficient\n", + "Velocity in meters per second \n", + "0.026146 0.058486 0.49965\n", + "8.871509 19.845000 0.49878\n", + "17.647351 39.476000 0.49704\n", + "22.432914 50.181000 0.48225\n", + "26.882303 60.134000 0.45004\n", + "30.636992 68.533000 0.40914\n", + "32.977694 73.769000 0.38042\n", + "34.604472 77.408000 0.36562\n", + "37.497268 83.879000 0.34822\n", + "40.460249 90.507000 0.33081\n", + "43.492522 97.290000 0.31427\n", + "46.733562 104.540000 0.30035\n", + "50.886563 113.830000 0.28816\n", + "54.047136 120.900000 0.28381\n", + "56.926074 127.340000 0.28033\n", + "60.086646 134.410000 0.28207" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pandas import read_csv\n", + "from modsim import Quantity, units\n", + "\n", + "baseball_drag = read_csv(filename)\n", + "mph = Quantity(baseball_drag['Velocity in mph'], units.mph)\n", + "mps = mph.to(units.meter / units.second)\n", + "baseball_drag.index = mps.magnitude\n", + "baseball_drag.index.name = 'Velocity in meters per second'\n", + "baseball_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "artistic-helping", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import interpolate, linspace\n", + "\n", + "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n", + "vs = linspace(0, 60)\n", + "cds = drag_interp(vs)\n", + "plot(vs, cds)\n", + "decorate(xlabel='Velocity (m/s)', ylabel='C_d')" + ] + }, + { + "cell_type": "markdown", + "id": "reliable-bottom", + "metadata": {}, + "source": [ + "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "empty-palace", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def drag_force(V, system):\n", + " \"\"\"Computes drag force in the opposite direction of `v`.\n", + " \n", + " v: velocity\n", + " system: System object with rho, C_d, area\n", + " \n", + " returns: Vector drag force\n", + " \"\"\"\n", + " rho, area = system.rho, system.area\n", + " \n", + " C_d = drag_interp(vector_mag(V))\n", + " mag = -rho * vector_mag(V)**2 * C_d * area / 2\n", + " direction = vector_hat(V)\n", + " f_drag = direction * mag\n", + " return f_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "satellite-delay", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "system4 = make_system(angle, velocity, C_d, rho)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "tired-sleeve", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x -1.023081\n", + "y -1.023081\n", + "dtype: float64" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "V = Vector(30, 30)\n", + "f_drag = drag_force(V, system4)\n", + "f_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "ambient-castle", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28.284271247461902, 28.2842712474619, -6.534891184395127, -16.334891184395126)" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "slope_func(0, system4.init, system4)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "plain-retail", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results4, details4 = run_solve_ivp(system4, slope_func, \n", + " events=event_func)\n", + "details4.message" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "black-amino", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    xyvxvy
    4.52585485.4431827.746401e+0012.556069-18.457129
    4.62424386.6676395.898175e+0012.324797-19.075086
    4.72263187.8696953.989943e+0012.094833-19.677696
    4.82101989.0493632.023337e+0011.866567-20.265039
    4.91940790.2066471.065814e-1411.640440-20.837214
    \n", + "
    " + ], + "text/plain": [ + " x y vx vy\n", + "4.525854 85.443182 7.746401e+00 12.556069 -18.457129\n", + "4.624243 86.667639 5.898175e+00 12.324797 -19.075086\n", + "4.722631 87.869695 3.989943e+00 12.094833 -19.677696\n", + "4.821019 89.049363 2.023337e+00 11.866567 -20.265039\n", + "4.919407 90.206647 1.065814e-14 11.640440 -20.837214" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "results4.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "uniform-determination", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "x_dist4 = results4.iloc[-1].x" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "earned-cliff", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-9.111649717288998" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "x_dist4 - x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "spiritual-shareware", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "`Vector` " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/modsim.py b/jupyter/modsim.py index 3512ea30..164cd36a 100644 --- a/jupyter/modsim.py +++ b/jupyter/modsim.py @@ -361,8 +361,6 @@ def run_odeint(system, slope_func, **options): return frame -from scipy.integrate import solve_ivp - def run_solve_ivp(system, slope_func, **options): """Computes a numerical solution to a differential equation. @@ -406,7 +404,33 @@ def run_solve_ivp(system, slope_func, **options): logger.error(msg) raise (e) - # TODO: make dense solution the default + # get the list of event functions + events = options.get('events', []) + + # if there's only one event function, put it in a list + try: + iter(events) + except TypeError: + events = [events] + + for event_func in events: + # make events terminal unless otherwise specified + if not hasattr(event_func, 'terminal'): + event_func.terminal = True + + # test the event function with the initial conditions + try: + event_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the event function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get dense output unless otherwise specified + underride(options, dense_output=True) # run the solver bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, @@ -416,8 +440,25 @@ def run_solve_ivp(system, slope_func, **options): y = bunch.pop("y") t = bunch.pop("t") - # pack the results into a TimeFrame - results = TimeFrame(y.T, index=t, columns=system.init.index) + # get the column names from `init`, if possible + if hasattr(system.init, 'index'): + columns = system.init.index + else: + columns = range(len(system.init)) + + # evaluate the results at 51 equally-spaced points + if options.get('dense_output', False): + t_end = t[-1] + t_array = linspace(t_0, t_end, 51) + y_array = bunch.sol(t_array) + + # pack the results into a TimeFrame + results = TimeFrame(y_array.T, index=t_array, + columns=columns) + else: + results = TimeFrame(y.T, index=t, + columns=columns) + return results, bunch @@ -620,7 +661,7 @@ def crossings(series, value): returns: sequence of labels """ - values = magnitudes(series - value) + values = series.values - value interp = InterpolatedUnivariateSpline(series.index, values) return interp.roots() @@ -860,9 +901,9 @@ def plot(x, y=None, **options): x.plot(**options) -def State(**kwargs): - """Contains state variables and their values.""" - return pd.Series(kwargs) +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables) class System(SimpleNamespace): @@ -885,66 +926,16 @@ def SweepFrame(*args, **kwargs): return pd.DataFrame(*args, **kwargs) -def Vector(*args, units=None): - """Make a ModSimVector. - - args: can be a single argument or sequence - units: Pint Unit object or Quantity - - If there's only one argument, it should be a sequence. - - Otherwise, the arguments are treated as coordinates. - - returns: ModSimVector - """ - if len(args) == 1: - args = args[0] - - # if it's a series, pull out the values - if isinstance(args, Series): - args = args.values - - # see if any of the arguments have units; if so, save the first one - for elt in args: - found_units = getattr(elt, "units", None) - if found_units: - break - - if found_units: - # if there are units, remove them - args = [float(magnitude(elt)) for elt in args] - else: - # otherwise, just ensure that all elements are floats (to avoid overflow issues in numpy) - args = [float(elt) for elt in args] - - # if the units keyword is provided, it overrides the units in args - if units is not None: - found_units = units - - return ModSimVector(args, found_units) - - ## Vector functions (should work with any sequence) - def vector_mag(v): - """Vector magnitude with units. - - returns: number or Quantity - """ - a = magnitude(v) - units = get_first_unit(v) - return np.sqrt(np.dot(a, a)) * units + """Vector magnitude.""" + return np.sqrt(np.dot(v, v)) def vector_mag2(v): - """Vector magnitude squared with units. - - returns: number of Quantity - """ - a = magnitude(v) - units = get_first_unit(v) - return np.dot(a, a) * units * units + """Vector magnitude squared.""" + return np.dot(v, v) def vector_angle(v): @@ -952,7 +943,7 @@ def vector_angle(v): Only works with 2-D vectors. - returns: number in radians + returns: angle in radians """ assert len(v) == 2 x, y = v @@ -962,7 +953,7 @@ def vector_angle(v): def vector_polar(v): """Vector magnitude and angle. - returns: (number or quantity, number in radians) + returns: (number, angle in radians) """ return vector_mag(v), vector_angle(v) @@ -970,19 +961,12 @@ def vector_polar(v): def vector_hat(v): """Unit vector in the direction of v. - The result should have no units. - returns: Vector or array """ - # get the size of the vector - mag = vector_mag(v) - # check if the magnitude of the Quantity is 0 - if magnitude(mag) == 0: - if isinstance(v, ModSimVector): - return Vector(magnitude(v)) - else: - return magnitude(np.asarray(v)) + mag = vector_mag(v) + if mag == 0: + return v else: return v / mag @@ -1004,9 +988,7 @@ def vector_dot(v, w): returns: number or Quantity """ - a1 = magnitude(v) - a2 = magnitude(w) - return np.dot(a1, a2) * get_first_unit(v) * get_first_unit(w) + return np.dot(v, w) def vector_cross(v, w): @@ -1014,22 +996,17 @@ def vector_cross(v, w): returns: number or Quantity for 2-D, Vector for 3-D """ - a1 = magnitude(v) - a2 = magnitude(w) - res = np.cross(a1, a2) + res = np.cross(v, w) - if len(v) == 3 and (isinstance(v, ModSimVector) or isinstance(w, ModSimVector)): - return ModSimVector(res, get_first_unit(v) * get_first_unit(w)) + if len(v) == 3: + return Vector(*res) else: - return res * get_first_unit(v) * get_first_unit(w) + return res def vector_proj(v, w): """Projection of v onto w. - Results has the units of v, but that might not make sense unless - v and w have the same units. - returns: array or Vector with direction of w and units of v. """ w_hat = vector_hat(w) @@ -1041,9 +1018,6 @@ def scalar_proj(v, w): Which is the magnitude of the projection of v onto w. - Results has the units of v, but that might not make sense unless - v and w have the same units. - returns: scalar with units of v. """ return vector_dot(v, vector_hat(w)) @@ -1068,7 +1042,7 @@ def vector_diff_angle(v, w): class ModSimVector(Quantity): - """Represented as a Pint Quantity with a NumPy array + """Represented as an array of 2 or 3 elements. x, y, z, mag, mag2, and angle are accessible as attributes. """ @@ -1115,6 +1089,19 @@ def angle(self): diff_angle = vector_diff_angle +def Vector(x, y, z=None, **options): + """ + """ + if z is None: + return pd.Series(dict(x=x, y=y), **options) + else: + return pd.Series(dict(x=x, y=y, z=z), **options) + +mag = vector_mag +angle = vector_angle +hat = vector_hat + + def plot_segment(A, B, **options): """Plots a line segment between two Vectors. @@ -1142,12 +1129,12 @@ def animate(results, draw_func, interval=None): plt.figure() try: for t, state in results.iterrows(): - draw_func(state, t) + draw_func(t, state) plt.show() if interval: sleep(interval) clear_output(wait=True) - draw_func(state, t) + draw_func(t, state) plt.show() except KeyboardInterrupt: pass From 239292e14937e43ec01da6a744287853660c7433 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 3 Feb 2021 14:00:54 -0500 Subject: [PATCH 026/144] Revising chapters --- jupyter/chap21.ipynb | 520 ++++++++-------- jupyter/chap22.ipynb | 701 +++++++++++---------- jupyter/chap23.ipynb | 877 ++++++++++++++++++++++++++ jupyter/chap24.ipynb | 1396 ++++++++++++++++++++++++++++++++++++++++++ jupyter/modsim.py | 115 ++-- 5 files changed, 2976 insertions(+), 633 deletions(-) create mode 100644 jupyter/chap23.ipynb create mode 100644 jupyter/chap24.ipynb diff --git a/jupyter/chap21.ipynb b/jupyter/chap21.ipynb index 5601492d..35762a67 100644 --- a/jupyter/chap21.ipynb +++ b/jupyter/chap21.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "running-field", + "id": "superb-february", "metadata": {}, "source": [ "In the previous chapter we simulated a penny falling in a vacuum, that\n", @@ -63,7 +63,7 @@ }, { "cell_type": "markdown", - "id": "refined-yield", + "id": "interesting-freeware", "metadata": {}, "source": [ "## Drag force\n", @@ -96,7 +96,7 @@ }, { "cell_type": "markdown", - "id": "domestic-studio", + "id": "unable-scheduling", "metadata": {}, "source": [ "For objects moving at moderate speeds through air, typical drag\n", @@ -118,41 +118,63 @@ "\n", "$$C_d = \\frac{2~m g}{\\rho~v_{term}^2~A}$$ \n", "\n", - "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere." + "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere.\n", + "\n", + "Now we are ready to add air resistance to the model." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "afraid-expression", + "cell_type": "markdown", + "id": "human-cloud", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## The Params Object\n", + "\n", + "As the number of system parameters increases, and as we need to do more work to compute them, we will find it useful to define a `Params` object to contain the quantities we need to make a `System` object. `Params` objects are similar to `System` objects, and we initialize them the same way.\n", + "\n", + "Here's the `Params` object for the falling penny:" + ] }, { - "cell_type": "markdown", - "id": "exempt-mustang", + "cell_type": "code", + "execution_count": 2, + "id": "established-knitting", "metadata": {}, + "outputs": [], "source": [ - "Now we are ready to add air resistance to the model." + "from modsim import Params\n", + "\n", + "params = Params(\n", + " mass = 0.0025, # kg\n", + " diameter = 0.019, # m\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + " v_init = 0, # m / s\n", + " v_term = 18, # m / s\n", + " height = 381, # m\n", + " t_end = 30, # s\n", + ")" ] }, { "cell_type": "markdown", - "id": "human-cloud", + "id": "instrumental-gross", "metadata": {}, "source": [ - "## Implementation\n", + "The mass and diameter are from . The density\n", + "of air depends on temperature, barometric pressure (which depends on\n", + "altitude), humidity, and composition (). I\n", + "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n", "\n", - "As the number of system parameters increases, and as we need to do more work to compute them, we will find it useful to define a `Params` object to contain the quantities we need to make a `System` object. `Params` objects are similar to `System` and `State` objects; in fact, all three have the same capabilities. I have given them different names to document the different roles they play.\n", "\n", - "Here's the `Params` object for the falling penny:" + "Here's a version of `make_system` that takes the `Params` object and computes the inital state, `init`, the area, and the coefficient of drag.\n", + "Then it returns a `System` object with the quantities we'll need for the simulation. " ] }, { "cell_type": "code", - "execution_count": 2, - "id": "scheduled-element", + "execution_count": 3, + "id": "published-jesus", "metadata": {}, "outputs": [], "source": [ @@ -160,51 +182,134 @@ "from modsim import State\n", "from modsim import System\n", "\n", - "def make_system(mass, diameter, rho, v_init, v_term):\n", - " area = pi * (diameter/2)**2\n", + "def make_system(params):\n", + " init = State(y=params.height, v=params.v_init)\n", "\n", - " g = 9.8 # m/s**2\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", + " area = pi * (params.diameter/2)**2\n", "\n", - " height = 381 # m\n", - " init = State(y=height, v=v_init)\n", - " t_end = 30 # s\n", + " C_d = (2 * params.mass * params.g / \n", + " (params.rho * area * params.v_term**2))\n", "\n", " return System(init=init,\n", - " rho=rho,\n", - " C_d=C_d,\n", - " g=g,\n", - " area=area,\n", - " mass=mass,\n", - " t_end=t_end\n", - " )" + " area=area,\n", + " C_d=C_d,\n", + " mass=params.mass,\n", + " rho=params.rho,\n", + " g=params.g,\n", + " t_end=params.t_end\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "personalized-kruger", + "metadata": {}, + "source": [ + "And here's how we call it." ] }, { "cell_type": "code", - "execution_count": 3, - "id": "circular-techno", + "execution_count": 4, + "id": "executive-protection", "metadata": {}, "outputs": [], "source": [ - "mass = 2.5e-3 # kg\n", - "diameter = 19e-3 # m\n", - "rho = 1.2 # kg/m**3\n", - "v_init = 0 # m / s\n", - "v_term = 18 # m / s\n", + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "id": "portable-carbon", + "metadata": {}, + "source": [ + "Based on the mass and diameter of the penny, the density of air, and acceleration due to gravity, and the observed terminal velocity, we estimate that the coefficient of drag is about 0.44." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "quick-cedar", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.4445009981135434" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.C_d" + ] + }, + { + "cell_type": "markdown", + "id": "inner-telescope", + "metadata": {}, + "source": [ + "It might not be obvious why it is useful to create a `Params` object just to create a `System` object.\n", + "In fact, if we only run one simulation, it might not be useful. But it helps when we want to change or sweep the parameters.\n", "\n", - "system = make_system(mass, diameter, rho, v_init, v_term)" + "For example, suppose we learn that the terminal velocity of a penny is actually closer to 20 m/s.\n", + "We can make a `Params` object with the new value, and a corresponding `System` object, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "great-crime", + "metadata": {}, + "outputs": [], + "source": [ + "params2 = params.set(v_term=20)" ] }, { "cell_type": "markdown", - "id": "instrumental-gross", + "id": "outstanding-truth", "metadata": {}, "source": [ - "The mass and diameter are from . The density\n", - "of air depends on temperature, barometric pressure (which depends on\n", - "altitude), humidity, and composition (). I\n", - "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n" + "The result from `set` is a new `Params` object that is identical to the original except for the given value of `v_term`. \n", + "\n", + "If we pass `params2` to `make_system`, we see that it computes a different value of `C_d`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "independent-trace", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.3600458084719701" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system2 = make_system(params2)\n", + "system2.C_d" + ] + }, + { + "cell_type": "markdown", + "id": "charged-explorer", + "metadata": {}, + "source": [ + "If the terminal velocity of the penny is 20 m/s, rather than 18 m/s, that implies that the coefficient of drag is 0.36, rather than 0.44.\n", + "And that makes sense, since lower drag implies faster terminal velocity.\n", + "\n", + "Using `Params` objects to make `System` objects helps make sure that relationships like this are consistent. And since we are always making new objects, rather than modifying existing objects, we are less likely to make a mistake." ] }, { @@ -212,12 +317,14 @@ "id": "primary-advocate", "metadata": {}, "source": [ - "Now here's a version of the slope function that includes drag:" + "## Simulation\n", + "\n", + "Now let's get to the simulation. Here's a version of the slope function that includes drag:" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "id": "noble-stick", "metadata": {}, "outputs": [], @@ -238,7 +345,7 @@ }, { "cell_type": "markdown", - "id": "amended-summit", + "id": "baking-class", "metadata": {}, "source": [ "`f_drag` is force due to drag, based on the drag equation. `a_drag` is\n", @@ -253,8 +360,8 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "collectible-austria", + "execution_count": 9, + "id": "velvet-tunisia", "metadata": {}, "outputs": [ { @@ -263,7 +370,7 @@ "(0, -9.8)" ] }, - "execution_count": 5, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -283,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "practical-nowhere", "metadata": {}, "outputs": [], @@ -295,8 +402,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "seventh-biology", + "execution_count": 11, + "id": "animated-clause", "metadata": {}, "outputs": [ { @@ -305,7 +412,7 @@ "381" ] }, - "execution_count": 7, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -324,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "id": "liberal-dictionary", "metadata": {}, "outputs": [ @@ -334,7 +441,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 9, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -343,93 +450,22 @@ "from modsim import run_solve_ivp\n", "\n", "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", + " events=event_func)\n", "details.message" ] }, { - "cell_type": "code", - "execution_count": 10, - "id": "mysterious-whale", + "cell_type": "markdown", + "id": "incident-paradise", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.000000381.0000000.000000
    0.448789380.022075-4.312820
    0.897579377.200545-8.156877
    1.346368372.817221-11.248931
    1.795157367.230596-13.539505
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.000000 381.000000 0.000000\n", - "0.448789 380.022075 -4.312820\n", - "0.897579 377.200545 -8.156877\n", - "1.346368 372.817221 -11.248931\n", - "1.795157 367.230596 -13.539505" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "results.head()" + "Here are the last few time steps:" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "dimensional-longitude", + "execution_count": 13, + "id": "coastal-anthropology", "metadata": {}, "outputs": [ { @@ -496,7 +532,7 @@ "22.439465 7.105427e-15 -18.011383" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -507,7 +543,7 @@ }, { "cell_type": "markdown", - "id": "emerging-domestic", + "id": "suburban-martial", "metadata": {}, "source": [ "The final height is close to 0, as expected.\n", @@ -519,8 +555,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "cleared-willow", + "execution_count": 14, + "id": "interim-underground", "metadata": {}, "outputs": [ { @@ -529,7 +565,7 @@ "22.43946505804431" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -541,7 +577,7 @@ }, { "cell_type": "markdown", - "id": "rising-nutrition", + "id": "institutional-colors", "metadata": {}, "source": [ "Here's the plot of position as a function of time." @@ -549,8 +585,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "touched-calculation", + "execution_count": 15, + "id": "small-franchise", "metadata": {}, "outputs": [ { @@ -580,7 +616,7 @@ }, { "cell_type": "markdown", - "id": "prospective-favor", + "id": "plain-phone", "metadata": {}, "source": [ "And velocity as a function of time:" @@ -588,8 +624,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "coordinate-albert", + "execution_count": 16, + "id": "analyzed-criticism", "metadata": {}, "outputs": [ { @@ -618,7 +654,7 @@ }, { "cell_type": "markdown", - "id": "familiar-antarctica", + "id": "careful-causing", "metadata": {}, "source": [ "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." @@ -626,7 +662,15 @@ }, { "cell_type": "markdown", - "id": "recovered-reverse", + "id": "inside-confidence", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "planned-endorsement", "metadata": {}, "source": [ "## Exercises" @@ -634,31 +678,33 @@ }, { "cell_type": "markdown", - "id": "portable-office", + "id": "respective-address", "metadata": {}, "source": [ - "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. \n", + "**Exercise:** Run the simulation with a downward initial velocity that exceeds the penny's terminal velocity.\n", + "\n", + "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction.\n", "\n", - "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." + "Hint: Use `params.set` to make a new `Params` object with a different initial velocity." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "powerful-springfield", + "execution_count": 17, + "id": "inclusive-twenty", "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", - "v_init = -30\n", - "system2 = make_system(mass, diameter, rho, v_init, v_term)" + "params = params.set(v_init=-30)\n", + "system2 = make_system(params)" ] }, { "cell_type": "code", - "execution_count": 16, - "id": "liberal-fighter", + "execution_count": 18, + "id": "vertical-judge", "metadata": {}, "outputs": [ { @@ -667,7 +713,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 16, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -682,8 +728,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "informed-representation", + "execution_count": 19, + "id": "greenhouse-madagascar", "metadata": {}, "outputs": [ { @@ -692,7 +738,7 @@ "20.635183673114202" ] }, - "execution_count": 17, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -704,8 +750,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "governmental-arena", + "execution_count": 20, + "id": "sudden-details", "metadata": {}, "outputs": [ { @@ -727,8 +773,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "encouraging-aside", + "execution_count": 21, + "id": "opening-jurisdiction", "metadata": { "scrolled": false }, @@ -754,20 +800,20 @@ }, { "cell_type": "markdown", - "id": "educational-rainbow", + "id": "smaller-millennium", "metadata": {}, "source": [ "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate terminal velocity and coefficient of drag.\n", "\n", "You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", "\n", - "1. Create a `Params` object with the system parameters. \n", + "1. Create a `Params` object with new values of `mass` and `diameter`. We don't know `v_term`, so we'll start with the initial guess 18 m/s.\n", "\n", - "2. Use `make_system` to create a `System` object. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", + "2. Use `make_system` to create a `System` object. \n", "\n", "3. Call `run_solve_ivp` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", "\n", - "4. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", + "4. Try a few different values of `v_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", "\n", "5. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", "\n", @@ -778,56 +824,36 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "advisory-tunnel", + "execution_count": 22, + "id": "compact-bunny", "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", - "mass = 5.67e-3 # kg\n", - "diameter = 24.26e-3 # m\n", - "v_term = 18 # m / s\n", - "flight_time = 19.1 # s" + "params_quarter = params.set(\n", + " mass = 0.0057, # kg\n", + " diameter = 0.024, # m\n", + " flight_time = 19.1, # s\n", + ")" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "underlying-sperm", + "execution_count": 23, + "id": "shared-contrary", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "namespace(init=y 381\n", - " v 0\n", - " dtype: int64,\n", - " rho=1.2,\n", - " C_d=0.6183600157463346,\n", - " g=9.8,\n", - " area=0.000462244204111976,\n", - " mass=0.00567,\n", - " t_end=30)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Solution\n", "\n", - "v_init = 0\n", - "system3 = make_system(mass, diameter, rho, v_init, v_term)\n", - "system3" + "system3 = make_system(params_quarter)" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "standard-allah", + "execution_count": 24, + "id": "portable-account", "metadata": {}, "outputs": [ { @@ -836,7 +862,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 22, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -853,17 +879,17 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "atlantic-southeast", + "execution_count": 25, + "id": "arabic-shareware", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "22.43946505804431" + "20.63518367311417" ] }, - "execution_count": 23, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -879,8 +905,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "sorted-leisure", + "execution_count": 26, + "id": "valued-literature", "metadata": {}, "outputs": [], "source": [ @@ -891,7 +917,7 @@ "\n", "# Or we could write an error function\n", "\n", - "def error_func(guess):\n", + "def error_func(guess, params):\n", " \"\"\"Final height as a function of C_d.\n", " \n", " guess: guess at v_term\n", @@ -900,19 +926,19 @@ " returns: height in m\n", " \"\"\"\n", " print(guess)\n", - " v_term = guess\n", - " system = make_system(mass, diameter, rho, v_init, v_term)\n", + " params = params.set(v_term=guess)\n", + " system = make_system(params)\n", " results, details = run_solve_ivp(system, slope_func, \n", " events=event_func)\n", " t_sidewalk = results.index[-1]\n", - " error = t_sidewalk - flight_time\n", + " error = t_sidewalk - params.flight_time\n", " return error" ] }, { "cell_type": "code", - "execution_count": 25, - "id": "perfect-suffering", + "execution_count": 27, + "id": "sufficient-retail", "metadata": {}, "outputs": [ { @@ -925,10 +951,10 @@ { "data": { "text/plain": [ - "3.3394650580443077" + "1.5351836731141688" ] }, - "execution_count": 25, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -938,13 +964,13 @@ "\n", "# We can test the error function like this\n", "v_guess1 = 18\n", - "error_func(v_guess1)" + "error_func(v_guess1, params_quarter)" ] }, { "cell_type": "code", - "execution_count": 26, - "id": "juvenile-provincial", + "execution_count": 28, + "id": "comparable-lounge", "metadata": {}, "outputs": [ { @@ -957,10 +983,10 @@ { "data": { "text/plain": [ - "-0.22717020844738656" + "-2.1591256962719996" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -969,13 +995,13 @@ "# Solution\n", "\n", "v_guess2 = 22\n", - "error_func(v_guess2)" + "error_func(v_guess2, params_quarter)" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "incorporate-jungle", + "execution_count": 29, + "id": "ready-people", "metadata": {}, "outputs": [ { @@ -984,11 +1010,12 @@ "text": [ "18.0\n", "22.0\n", - "21.745227429805748\n", - "21.688258716910187\n", - "21.688401491107182\n", - "21.688401102071705\n", - "21.68840110206904\n" + "19.662214524680426\n", + "19.475274945870567\n", + "19.459673874997012\n", + "19.459697194820343\n", + "19.459697175160358\n", + "19.45969717515935\n" ] } ], @@ -1000,22 +1027,23 @@ "\n", "from scipy.optimize import root_scalar\n", "\n", - "res = root_scalar(error_func, bracket=[v_guess1, v_guess2])" + "res = root_scalar(error_func, params_quarter,\n", + " bracket=[v_guess1, v_guess2])" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "conceptual-questionnaire", + "execution_count": 30, + "id": "miniature-remark", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "21.68840110206904" + "19.459697175160358" ] }, - "execution_count": 28, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1029,17 +1057,17 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "designed-variation", + "execution_count": 31, + "id": "frozen-termination", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.4259232394493775" + "0.5434569672577239" ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1050,17 +1078,21 @@ "# Plugging in the estimated value, \n", "# we can use `make_system` to compute `C_d`\n", "\n", - "system4 = make_system(mass, diameter, rho, v_init, v_term)\n", + "system4 = make_system(params_quarter.set(v_term=res.root))\n", "system4.C_d" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "meaning-instruction", + "cell_type": "markdown", + "id": "colored-oxygen", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Under the Hood\n", + "\n", + "`Params` is a `SimpleNamespace`, like `System`.\n", + "\n", + "`Params` and `System` are actually the same; I have given them different names to document the different roles they play." + ] } ], "metadata": { diff --git a/jupyter/chap22.ipynb b/jupyter/chap22.ipynb index 3e157a17..e75cf06e 100644 --- a/jupyter/chap22.ipynb +++ b/jupyter/chap22.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "markdown", - "id": "regional-block", + "id": "worst-london", "metadata": {}, "source": [ "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", @@ -62,13 +62,13 @@ }, { "cell_type": "markdown", - "id": "looking-sampling", + "id": "contained-bones", "metadata": {}, "source": [ "## Baseball\n", "\n", - "To model the flight of a baseball, we have to make some modeling\n", - "decisions. To get started, we ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", + "To model the flight of a baseball, we have to make some\n", + "decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", "\n", "Air resistance has a substantial effect on most projectiles in air, so\n", "we will include a drag force.\n", @@ -76,7 +76,7 @@ "To model air resistance, we'll need the mass, frontal area, and drag\n", "coefficient of a baseball. Mass and diameter are easy to find (see\n", "). Drag coefficient is only a little\n", - "harder; according to *The Physics of Baseball*[^1], the drag coefficient of a baseball is approximately 0.33 (with no units).\n", + "harder; according to *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*, the drag coefficient of a baseball is approximately 0.33 (with no units).\n", "\n", "However, this value *does* depend on velocity. At low velocities it\n", "might be as high as 0.5, and at high velocities as low as 0.28.\n", @@ -95,26 +95,20 @@ "source": [ "## Vectors\n", "\n", - "Now that we are working in two dimensions, we will find it useful to\n", + "Now that we are working in two dimensions, it will be useful to\n", "work with **vector quantities**, that is, quantities that represent both a magnitude and a direction. We will use vectors to represent positions, velocities, accelerations, and forces in two and three dimensions.\n", "\n", - "The ModSim library provides a `Vector` object that represents a vector\n", - "quantity. A `Vector` object is a like a NumPy array; it contains\n", - "elements that represent the **components** of the vector. For example,\n", - "in a `Vector` that represents a position in space, the components are\n", - "the $x$ and $y$ coordinates (and a $z$ coordinate in 3-D). A `Vector`\n", - "object can also have units, like the quantities we've seen in previous\n", - "chapters.\n", + "ModSim provides a function called `Vector` the creates a Pandas `Series` that contains the **components** of the vector.\n", + "In a `Vector` that represents a position in space, the components are the $x$ and $y$ coordinates in 2-D, plus a $z$ coordinate if the `Vector` is in 3-D.\n", "\n", "You can create a `Vector` by specifying its components. The following\n", - "`Vector` represents a point 3 m to the right (or east) and 4 m up (or\n", - "north) from an implicit origin:" + "`Vector` represents a point 3 units to the right (or east) and 4 units up (or north) from an implicit origin:" ] }, { "cell_type": "code", "execution_count": 2, - "id": "smaller-hudson", + "id": "current-wheel", "metadata": {}, "outputs": [ { @@ -139,17 +133,17 @@ }, { "cell_type": "markdown", - "id": "suited-helena", + "id": "retired-strand", "metadata": {}, "source": [ "You can access the components of a `Vector` by name using the dot\n", - "operator: for example, `A.x` or `A.y`. " + "operator, like this:" ] }, { "cell_type": "code", "execution_count": 3, - "id": "prompt-vault", + "id": "quarterly-startup", "metadata": {}, "outputs": [ { @@ -169,16 +163,16 @@ }, { "cell_type": "markdown", - "id": "continuous-convert", + "id": "welcome-violin", "metadata": {}, "source": [ - "You can also access them by index using brackets: for example, `A[0]` or `A[1]`." + "You can also access them by index using brackets, like this:" ] }, { "cell_type": "code", "execution_count": 4, - "id": "strange-credit", + "id": "occupied-macedonia", "metadata": {}, "outputs": [ { @@ -198,7 +192,7 @@ }, { "cell_type": "markdown", - "id": "actual-blond", + "id": "collective-anthony", "metadata": {}, "source": [ "`Vector` objects support most mathematical operations, including\n", @@ -208,7 +202,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "integrated-inspector", + "id": "authentic-brazil", "metadata": {}, "outputs": [ { @@ -232,7 +226,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "advance-integral", + "id": "hairy-bahamas", "metadata": {}, "outputs": [ { @@ -255,7 +249,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "respected-acrobat", + "id": "assumed-yukon", "metadata": {}, "outputs": [ { @@ -277,7 +271,7 @@ }, { "cell_type": "markdown", - "id": "incorporate-longer", + "id": "criminal-advertiser", "metadata": {}, "source": [ "For the definition and graphical interpretation of these operations, see ." @@ -285,23 +279,23 @@ }, { "cell_type": "markdown", - "id": "reliable-soundtrack", + "id": "exact-texture", "metadata": {}, "source": [ - "We can think of a `Vector` as a point defined by its coordinates `x` and `y`.\n", - "Equivalently, we can think of it as a point defined by a magnitude and angle.\n", + "We can specify a `Vector` with coordinates `x` and `y`, as in the previous examples.\n", + "Equivalently, we can specify a `Vector` with a magnitude and angle.\n", "\n", "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is the distance from the origin; if it represents a velocity, magnitude is speed, that is, how fast the object is moving, regardless of direction.\n", "\n", - "The **angle** of a `Vector` is its direction, expressed as the angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", + "The **angle** of a `Vector` is its direction, expressed as an angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", "\n", - "ModSim provides functions to compute the magnitude and angle of a `Vector`." + "ModSim provides functions to compute the magnitude and angle of a `Vector`. For example, here are the magnitude and angle of `A`:" ] }, { "cell_type": "code", "execution_count": 8, - "id": "affected-programmer", + "id": "altered-march", "metadata": {}, "outputs": [ { @@ -318,7 +312,9 @@ "source": [ "from modsim import vector_mag, vector_angle\n", "\n", - "vector_mag(A), vector_angle(A)" + "mag = vector_mag(A)\n", + "theta = vector_angle(A)\n", + "mag, theta" ] }, { @@ -326,22 +322,23 @@ "id": "great-advice", "metadata": {}, "source": [ - "The result from `vector_angle` is in radians, and most Python functions expect angles in radians. \n", + "The magnitude is 5 because the length of `A` is the hypotenuse of a 3-4-5 triangle.\n", + "\n", + "The result from `vector_angle` is in radians, and most Python functions, like `sin` and `cos`, work with radians. \n", "But many people think more naturally in degrees. \n", - "It can be awkward, and error-prone, to use both units in the same program.\n", - "Fortunately, NumPy provides a function to convert degrees to radians:" + "Fortunately, NumPy provides a function to convert radians to degrees:" ] }, { "cell_type": "code", "execution_count": 9, - "id": "cellular-community", + "id": "departmental-senator", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "0.7853981633974483" + "53.13010235415598" ] }, "execution_count": 9, @@ -350,31 +347,30 @@ } ], "source": [ - "from numpy import deg2rad\n", + "from numpy import rad2deg\n", "\n", - "angle = 45\n", - "theta = deg2rad(angle)\n", - "theta" + "angle = rad2deg(theta)\n", + "angle" ] }, { "cell_type": "markdown", - "id": "congressional-panel", + "id": "younger-mortality", "metadata": {}, "source": [ - "And radians to degrees:" + "And a function to convert degrees to radians:" ] }, { "cell_type": "code", "execution_count": 10, - "id": "informed-statistics", + "id": "cellular-community", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "45.0" + "0.9272952180016122" ] }, "execution_count": 10, @@ -383,9 +379,10 @@ } ], "source": [ - "from numpy import rad2deg\n", + "from numpy import deg2rad\n", "\n", - "rad2deg(theta)" + "theta = deg2rad(angle)\n", + "theta" ] }, { @@ -396,32 +393,12 @@ "Following convention, I'll use `angle` for a value in degrees and `theta` for a value in radians.\n", "\n", "If you are given an angle and velocity, you can make a `Vector` using\n", - "`pol2cart`, which converts from polar to Cartesian coordinates. To\n", - "demonstrate, I'll extract the angle and magnitude of `A`:" + "`pol2cart`, which converts from polar to Cartesian coordinates. For example, here's a new `Vector` with the same angle and magnitude of `A`:" ] }, { "cell_type": "code", "execution_count": 11, - "id": "exempt-douglas", - "metadata": {}, - "outputs": [], - "source": [ - "mag = vector_mag(A)\n", - "angle = vector_angle(A)" - ] - }, - { - "cell_type": "markdown", - "id": "enhanced-toner", - "metadata": {}, - "source": [ - "And then make a new `Vector` with the same components:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, "id": "monetary-firmware", "metadata": {}, "outputs": [ @@ -433,7 +410,7 @@ "dtype: float64" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -441,7 +418,7 @@ "source": [ "from modsim import pol2cart\n", "\n", - "x, y = pol2cart(angle, mag)\n", + "x, y = pol2cart(theta, mag)\n", "Vector(x, y)" ] }, @@ -458,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "explicit-piano", "metadata": {}, "outputs": [ @@ -470,7 +447,7 @@ "dtype: float64" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -484,13 +461,12 @@ "id": "respected-oliver", "metadata": {}, "source": [ - "We can do the same thing using the `hat` function, so named because unit\n", - "vectors are conventionally decorated with a hat, like this: $\\hat{A}$." + "We can do the same thing using the `vector_hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "relative-republic", "metadata": {}, "outputs": [ @@ -502,7 +478,7 @@ "dtype: float64" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -515,7 +491,7 @@ }, { "cell_type": "markdown", - "id": "novel-somewhere", + "id": "italian-payment", "metadata": {}, "source": [ "Now let's get back to the game." @@ -529,35 +505,48 @@ "## Simulating baseball flight\n", "\n", "Let's simulate the flight of a baseball that is batted from home plate\n", - "at an angle of 45 ° and initial speed 40 m/s. Using the center of home\n", - "plate as the origin, the x-axis is parallel to the ground; the y-axis is vertical. The initial height is about 1 m.\n" + "at an angle of 45° and initial speed 40 m/s. We'll use the center of home plate as the origin, a horizontal x-axis (parallel to the ground), and vertical y-axis (perpendicular to the ground). The initial height is about 1 m." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "ancient-thunder", + "execution_count": 14, + "id": "attempted-narrow", "metadata": {}, "outputs": [], "source": [ - "from numpy import pi\n", + "from modsim import Params\n", + "\n", + "params = Params(\n", + " x = 0, # m\n", + " y = 1, # m\n", + " angle = 45, # degree\n", + " velocity = 40, # m / s\n", "\n", - "mass = 145e-3 # kg \n", - "diameter = 73e-3 # m \n", - "area = pi * (diameter/2)**2\n", - "g = 9.8 # m/s**2" + " mass = 145e-3, # kg \n", + " diameter = 73e-3, # m \n", + " C_d = 0.33, # dimensionless\n", + "\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + ")" ] }, { - "cell_type": "code", - "execution_count": 16, - "id": "still-ownership", + "cell_type": "markdown", + "id": "thousand-arlington", + "metadata": {}, + "source": [ + "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag is from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:" + ] + }, + { + "cell_type": "markdown", + "id": "prospective-philadelphia", "metadata": {}, - "outputs": [], "source": [ - "rho = 1.2 # kg/m**3\n", - "C_d = 0.33\n", - "t_end = 10 # s" + "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", + "And we'll need the acceleration of gravity, `g`." ] }, { @@ -565,58 +554,102 @@ "id": "detected-return", "metadata": {}, "source": [ - "The mass, diameter, and drag coefficient of the baseball are from the\n", - "sources in Section xxx. The acceleration of gravity, `g`, is a well-known quantity.\n", - "\n", - "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). I chose the\n", - "value of `t_end` to run the simulation long enough for the ball to land on the ground.\n", - "\n", - "The following function makes a `System` object." + "The following function uses these quantities to make a `System` object." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "bored-billy", "metadata": {}, "outputs": [], "source": [ - "from modsim import State, System\n", - "from numpy import deg2rad\n", + "from modsim import State, System, pol2cart\n", + "from numpy import pi, deg2rad\n", "\n", - "def make_system(angle, velocity, C_d, rho):\n", + "def make_system(params):\n", " \n", " # convert angle to degrees\n", - " theta = deg2rad(angle)\n", + " theta = deg2rad(params.angle)\n", " \n", " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", + " vx, vy = pol2cart(theta, params.velocity)\n", " \n", " # make the initial state\n", - " init = State(x=0, y=1, vx=vx, vy=vy)\n", - " \n", - " return System(init=init, \n", - " area=area,\n", - " g=g,\n", - " mass=mass,\n", - " rho=rho,\n", - " C_d=C_d,\n", - " t_end=t_end)" + " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", + " \n", + " # compute the frontal area\n", + " area = pi * (params.diameter/2)**2\n", + "\n", + " return System(init = init,\n", + " mass = params.mass,\n", + " area = area,\n", + " C_d = params.C_d,\n", + " rho = params.rho,\n", + " g = params.g,\n", + " t_end=10)" + ] + }, + { + "cell_type": "markdown", + "id": "combined-heritage", + "metadata": {}, + "source": [ + "`make_system` uses `deg2rad` to convert `angle` to radians and\n", + "`pol2cart` to compute the $x$ and $y$ components of the initial\n", + "velocity.\n", + "\n", + "`init` is a `State` object with four state variables:\n", + "\n", + "* `x` and `y` are the components of position.\n", + "\n", + "* `vx` and `vy` are the components of velocity.\n", + "\n", + "The `System` object also contains `t_end`, which is 10 seconds, long enough for the ball to land on the ground.\n", + "Here's the `System` object." ] }, { "cell_type": "code", - "execution_count": 18, - "id": "generic-budapest", + "execution_count": 17, + "id": "confirmed-knife", "metadata": {}, "outputs": [], "source": [ - "x = 0 # m\n", - "y = 1 # m\n", - "angle = 45 # degree\n", - "velocity = 40 # m / s\n", - "\n", - "system = make_system(angle, velocity, C_d, rho)" + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "id": "tired-abortion", + "metadata": {}, + "source": [ + "And here's the initial `State`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "dirty-retailer", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 0.000000\n", + "y 1.000000\n", + "vx 28.284271\n", + "vy 28.284271\n", + "dtype: float64" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.init" ] }, { @@ -624,10 +657,6 @@ "id": "occasional-given", "metadata": {}, "source": [ - "`make_system` uses `np.deg2rad` to convert `angle` to radians and\n", - "`pol2cart` to compute the $x$ and $y$ components of the initial\n", - "velocity.\n", - "\n", "Next we need a function to compute drag force:" ] }, @@ -641,34 +670,41 @@ "def drag_force(V, system):\n", " rho, C_d, area = system.rho, system.C_d, system.area\n", " \n", - " mag = -rho * vector_mag(V)**2 * C_d * area / 2\n", - " direction = vector_hat(V)\n", - " f_drag = direction * mag\n", + " mag = rho * vector_mag(V)**2 * C_d * area / 2\n", + " direction = -vector_hat(V)\n", + " f_drag = mag * direction\n", " return f_drag" ] }, { "cell_type": "markdown", - "id": "attractive-genome", + "id": "spatial-cooperation", "metadata": {}, "source": [ "This function takes `V` as a `Vector` and returns `f_drag` as a\n", - "`Vector`. It uses the drag equation to compute the magnitude of the drag\n", - "force, and the `hat` function to compute the direction. `-V.hat()`\n", - "computes a unit vector pointing in the opposite direction of `V`." + "`Vector`. \n", + "\n", + "* It uses `vector_mag` to compute the magnitude of `V`, \n", + "and the drag equation to compute the magnitude of the drag force, `mag`.\n", + "\n", + "* Then it uses `vector_hat` to compute `direction`, which is a unit vector in the opposite direction of `V`.\n", + "\n", + "* Finally, it computes the drag force vector by multiplying `mag` and `direction`.\n", + "\n", + "We can test it like this:" ] }, { "cell_type": "code", "execution_count": 20, - "id": "functional-thong", + "id": "equipped-dragon", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "x -0.117197\n", - "y -0.117197\n", + "x -0.937574\n", + "y -0.937574\n", "dtype: float64" ] }, @@ -680,7 +716,8 @@ "source": [ "from modsim import ModSimVector\n", "\n", - "V_test = Vector(10, 10)\n", + "vx, vy = system.init.vx, system.init.vy\n", + "V_test = Vector(vx, vy)\n", "drag_force(V_test, system)" ] }, @@ -689,6 +726,7 @@ "id": "absent-vector", "metadata": {}, "source": [ + "The result is a `Vector` that represents the drag force on the baseball, in Newtons, under the initial conditions.\n", "\n", "Now we're ready for a slope function:" ] @@ -715,38 +753,40 @@ }, { "cell_type": "markdown", - "id": "crude-parcel", + "id": "pointed-graph", "metadata": {}, "source": [ - "As usual, the parameters of the slope function are a `State` object,\n", - "time, and a `System` object. In this example, we don't use `t`, but we\n", - "can't leave it out because when `run_solve_ivp` calls the slope\n", - "function, it always provides the same arguments, whether they are needed\n", - "or not.\n", + "As usual, the parameters of the slope function are a time, a `State` object, and a `System` object. \n", + "In this example, we don't use `t`, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", "\n", - "The `State` object contains two state variables, `R` and `V`, that\n", - "represent position and velocity as `Vector` objects.\n", + "`slope_func` unpacks the `State` object into variables `x`, `y`, `vx`, and `vy`.\n", + "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force and acceleration due to drag, `a_drag`.\n", "\n", - "The return values from the slope function are the derivatives of these\n", - "quantities. The derivative of position is velocity, so the first return\n", - "value is `V`, which we extracted from the `State` object. The derivative\n", - "of velocity is acceleration, and that's what we have to compute.\n", + "To represent acceleration due to gravity, it makes a `Vector` with magnitude `g` in the negative $y$ direction.\n", "\n", - "The total acceleration of the baseball is the sum of accelerations due\n", - "to gravity and drag. These quantities have both magnitude and direction,\n", - "so they are represented by `Vector` objects.\n", + "The total acceleration of the baseball, `A`, is the sum of accelerations due to gravity and drag." + ] + }, + { + "cell_type": "markdown", + "id": "proved-mother", + "metadata": {}, + "source": [ + "The return value is a sequence that contains:\n", "\n", - "We already saw how `a_drag` is computed. `a_grav` is a `Vector` with\n", - "magnitude `g` pointed in the negative `y` direction.\n", + "* The components of velocity, `V.x` and `V.y`.\n", "\n", - "Using vectors to represent forces and accelerations makes the code\n", - "concise, readable, and less error-prone. In particular, when we add\n", - "`a_grav` and `a_drag`, the directions are likely to be correct, because\n", - "they are encoded in the `Vector` objects. And the units are certain to\n", - "be correct, because otherwise Pint would report an error.\n", + "* The components of acceleration, `A.x` and `A.y`.\n", "\n", - "As always, we can test the slope function by running it with the initial\n", - "conditions:" + "Together, these components represent the slope of the state variables, because `V` is the derivative of position and `A` is the derivative of velocity." + ] + }, + { + "cell_type": "markdown", + "id": "crude-parcel", + "metadata": {}, + "source": [ + "As always, we can test the slope function by running it with the initial conditions:" ] }, { @@ -775,8 +815,11 @@ "id": "regulated-railway", "metadata": {}, "source": [ - "We can use an event function to stop the simulation when the ball hits\n", - "the ground." + "Using vectors to represent forces and accelerations makes the code\n", + "concise, readable, and less error-prone. In particular, when we add\n", + "`a_grav` and `a_drag`, the directions are likely to be correct, because they are encoded in the `Vector` objects.\n", + "\n", + "We're almost ready to run the simulation. The last thing we need is an event function that stops when the ball hits the ground." ] }, { @@ -791,10 +834,20 @@ " return y" ] }, + { + "cell_type": "markdown", + "id": "pressing-oracle", + "metadata": {}, + "source": [ + "The event function takes the same parameters as the slope function, and returns the $y$ coordinate of position. When the $y$ coordinate passes through 0, the simulation stops.\n", + "\n", + "As we did with `slope_func`, we can test `event_func` with the initial conditions." + ] + }, { "cell_type": "code", "execution_count": 24, - "id": "victorian-sharing", + "id": "necessary-registrar", "metadata": {}, "outputs": [ { @@ -817,10 +870,6 @@ "id": "unlikely-dressing", "metadata": {}, "source": [ - "The event function takes the same parameters as the slope function, and\n", - "returns the y coordinate of `R`. When the y coordinate passes through 0,\n", - "the simulation stops.\n", - "\n", "Now we're ready to run the simulation:" ] }, @@ -851,16 +900,18 @@ }, { "cell_type": "markdown", - "id": "thick-ozone", + "id": "solid-tribune", "metadata": {}, "source": [ - "`results` is a `TimeFrame` with one column for each of the state variables, `x`, `y`, `vx`, and `vy`." + "`details` contains information about the simulation, including a message that indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", + "\n", + "`results` is a `TimeFrame` with one column for each of the state variables:" ] }, { "cell_type": "code", "execution_count": 26, - "id": "complex-reviewer", + "id": "alternative-history", "metadata": {}, "outputs": [ { @@ -983,7 +1034,7 @@ "id": "convenient-heading", "metadata": {}, "source": [ - "And the final `x` coordinate like this:" + "And the final state like this:" ] }, { @@ -995,7 +1046,11 @@ { "data": { "text/plain": [ - "99.31829628352206" + "x 9.931830e+01\n", + "y -7.105427e-15\n", + "vx 1.416589e+01\n", + "vy -2.205876e+01\n", + "Name: 5.004887034868351, dtype: float64" ] }, "execution_count": 28, @@ -1004,90 +1059,28 @@ } ], "source": [ - "x, y, vx, vy = results.iloc[-1]\n", - "x" + "final_state = results.iloc[-1]\n", + "final_state" + ] + }, + { + "cell_type": "markdown", + "id": "alternate-present", + "metadata": {}, + "source": [ + "The final value of `y` is close to 0, as it should be. The final value of `x` tells us how far the ball flew, in meters." ] }, { "cell_type": "code", "execution_count": 29, - "id": "sensitive-century", + "id": "conservative-collins", "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    xyvxvy
    4.60449693.4739718.296642e+0015.013486-19.334826
    4.70459494.9667566.325368e+0014.802553-20.038175
    4.80469296.4385154.284486e+0014.590855-20.726780
    4.90478997.8890872.175515e+0014.378566-21.400392
    5.00488799.318296-7.105427e-1514.165894-22.058763
    \n", - "
    " - ], "text/plain": [ - " x y vx vy\n", - "4.604496 93.473971 8.296642e+00 15.013486 -19.334826\n", - "4.704594 94.966756 6.325368e+00 14.802553 -20.038175\n", - "4.804692 96.438515 4.284486e+00 14.590855 -20.726780\n", - "4.904789 97.889087 2.175515e+00 14.378566 -21.400392\n", - "5.004887 99.318296 -7.105427e-15 14.165894 -22.058763" + "99.31829628352206" ] }, "execution_count": 29, @@ -1096,7 +1089,68 @@ } ], "source": [ - "results.tail()" + "final_state.x" + ] + }, + { + "cell_type": "markdown", + "id": "resident-fountain", + "metadata": {}, + "source": [ + "We can also get the final velocity, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "superior-capture", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "x 14.165894\n", + "y -22.058763\n", + "dtype: float64" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_V = Vector(final_state.vx, final_state.vy)\n", + "final_V" + ] + }, + { + "cell_type": "markdown", + "id": "amended-antenna", + "metadata": {}, + "source": [ + "The speed of the ball on impact is about 26 m/s, which is substantially slower than the initial velocity, 40 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "fresh-damages", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "26.215674453237636" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vector_mag(final_V)" ] }, { @@ -1106,12 +1160,12 @@ "source": [ "## Trajectories\n", "\n", - "We can plot the $x$ and $y$ components of position like this:" + "To visualize the results, we can plot the $x$ and $y$ components of position like this:" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "id": "spare-burst", "metadata": {}, "outputs": [ @@ -1143,17 +1197,15 @@ "id": "horizontal-bench", "metadata": {}, "source": [ - "As expected, the $x$\n", - "component increases as the ball moves away from home plate. The $y$\n", - "position climbs initially and then descends, falling to 0 m near 5.0 s.\n", + "As expected, the $x$ component increases as the ball moves away from home plate. The $y$ position climbs initially and then descends, falling to 0 m near 5.0 s.\n", "\n", - "Another way to view the same data is to plot the $x$ component on the\n", + "Another way to view the results is to plot the $x$ component on the\n", "x-axis and the $y$ component on the y-axis, so the plotted line follows the trajectory of the ball through the plane:" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "id": "dated-browse", "metadata": {}, "outputs": [ @@ -1192,15 +1244,12 @@ "A trajectory plot can be easier to interpret than a time series plot,\n", "because it shows what the motion of the projectile would look like (at\n", "least from one point of view). Both plots can be useful, but don't get\n", - "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused.\n", - "\n", - "\n", - "[^1]: Adair, *The Physics of Baseball*, Third Edition, Perennial, 2002." + "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused." ] }, { "cell_type": "markdown", - "id": "surprised-bandwidth", + "id": "healthy-pulse", "metadata": {}, "source": [ "## Animation\n", @@ -1212,7 +1261,7 @@ }, { "cell_type": "markdown", - "id": "hollow-maintenance", + "id": "honest-simple", "metadata": {}, "source": [ "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", @@ -1222,8 +1271,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "worth-leeds", + "execution_count": 34, + "id": "large-gates", "metadata": {}, "outputs": [], "source": [ @@ -1241,8 +1290,8 @@ }, { "cell_type": "code", - "execution_count": 53, - "id": "general-peace", + "execution_count": 35, + "id": "looking-community", "metadata": {}, "outputs": [ { @@ -1266,7 +1315,7 @@ }, { "cell_type": "markdown", - "id": "tested-friendly", + "id": "final-terminal", "metadata": {}, "source": [ "## Exercises" @@ -1274,7 +1323,7 @@ }, { "cell_type": "markdown", - "id": "strategic-reduction", + "id": "romance-serum", "metadata": {}, "source": [ "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" @@ -1282,20 +1331,20 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "caroline-theta", + "execution_count": 37, + "id": "excessive-challenge", "metadata": {}, "outputs": [], "source": [ "# Hint\n", "\n", - "system2 = make_system(angle, velocity, 0, rho)" + "system2 = make_system(params.set(C_d=0))" ] }, { "cell_type": "code", - "execution_count": 35, - "id": "perfect-property", + "execution_count": 38, + "id": "recognized-format", "metadata": {}, "outputs": [ { @@ -1304,7 +1353,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 35, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1319,8 +1368,8 @@ }, { "cell_type": "code", - "execution_count": 36, - "id": "demographic-destination", + "execution_count": 39, + "id": "sitting-combine", "metadata": {}, "outputs": [ { @@ -1345,8 +1394,8 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "understood-colombia", + "execution_count": 44, + "id": "developing-capitol", "metadata": {}, "outputs": [ { @@ -1355,7 +1404,7 @@ "99.31829628352206" ] }, - "execution_count": 37, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1369,8 +1418,8 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "mediterranean-equivalent", + "execution_count": 45, + "id": "elder-variance", "metadata": {}, "outputs": [ { @@ -1379,7 +1428,7 @@ "164.25925502413202" ] }, - "execution_count": 38, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1393,7 +1442,7 @@ }, { "cell_type": "markdown", - "id": "amateur-cowboy", + "id": "bulgarian-nowhere", "metadata": {}, "source": [ "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" @@ -1401,20 +1450,20 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "surprised-polls", + "execution_count": 46, + "id": "conventional-chest", "metadata": {}, "outputs": [], "source": [ "# Hint\n", "\n", - "system3 = make_system(angle, velocity, C_d, 1.0)" + "system3 = make_system(params.set(rho=1.0))" ] }, { "cell_type": "code", - "execution_count": 40, - "id": "welsh-match", + "execution_count": 47, + "id": "south-profession", "metadata": {}, "outputs": [ { @@ -1423,7 +1472,7 @@ "105.78838005859807" ] }, - "execution_count": 40, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1440,8 +1489,8 @@ }, { "cell_type": "code", - "execution_count": 41, - "id": "suspended-advantage", + "execution_count": 48, + "id": "removable-running", "metadata": {}, "outputs": [ { @@ -1450,7 +1499,7 @@ "6.470083775076006" ] }, - "execution_count": 41, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1463,7 +1512,7 @@ }, { "cell_type": "markdown", - "id": "adjacent-mediterranean", + "id": "enormous-auditor", "metadata": {}, "source": [ "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", @@ -1476,8 +1525,8 @@ }, { "cell_type": "code", - "execution_count": 42, - "id": "crazy-sense", + "execution_count": 49, + "id": "artistic-baghdad", "metadata": {}, "outputs": [], "source": [ @@ -1491,8 +1540,8 @@ }, { "cell_type": "code", - "execution_count": 43, - "id": "smaller-armenia", + "execution_count": 50, + "id": "general-ethiopia", "metadata": {}, "outputs": [ { @@ -1631,7 +1680,7 @@ "60.086646 134.410000 0.28207" ] }, - "execution_count": 43, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1650,8 +1699,8 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "artistic-helping", + "execution_count": 51, + "id": "pregnant-small", "metadata": {}, "outputs": [ { @@ -1679,7 +1728,7 @@ }, { "cell_type": "markdown", - "id": "reliable-bottom", + "id": "promotional-background", "metadata": {}, "source": [ "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results." @@ -1687,8 +1736,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "empty-palace", + "execution_count": 52, + "id": "sporting-gazette", "metadata": {}, "outputs": [], "source": [ @@ -1713,20 +1762,20 @@ }, { "cell_type": "code", - "execution_count": 46, - "id": "satellite-delay", + "execution_count": 53, + "id": "scheduled-cutting", "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", - "system4 = make_system(angle, velocity, C_d, rho)" + "system4 = make_system(params)" ] }, { "cell_type": "code", - "execution_count": 47, - "id": "tired-sleeve", + "execution_count": 54, + "id": "streaming-lebanon", "metadata": {}, "outputs": [ { @@ -1737,7 +1786,7 @@ "dtype: float64" ] }, - "execution_count": 47, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1752,8 +1801,8 @@ }, { "cell_type": "code", - "execution_count": 48, - "id": "ambient-castle", + "execution_count": 55, + "id": "animated-prevention", "metadata": {}, "outputs": [ { @@ -1762,7 +1811,7 @@ "(28.284271247461902, 28.2842712474619, -6.534891184395127, -16.334891184395126)" ] }, - "execution_count": 48, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1775,8 +1824,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "id": "plain-retail", + "execution_count": 56, + "id": "practical-reservation", "metadata": {}, "outputs": [ { @@ -1785,7 +1834,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 49, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1800,8 +1849,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "black-amino", + "execution_count": 57, + "id": "supposed-school", "metadata": {}, "outputs": [ { @@ -1880,7 +1929,7 @@ "4.919407 90.206647 1.065814e-14 11.640440 -20.837214" ] }, - "execution_count": 50, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -1893,8 +1942,8 @@ }, { "cell_type": "code", - "execution_count": 51, - "id": "uniform-determination", + "execution_count": 58, + "id": "recognized-blend", "metadata": {}, "outputs": [], "source": [ @@ -1905,8 +1954,8 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "earned-cliff", + "execution_count": 59, + "id": "sensitive-butterfly", "metadata": {}, "outputs": [ { @@ -1915,7 +1964,7 @@ "-9.111649717288998" ] }, - "execution_count": 52, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -1928,7 +1977,7 @@ }, { "cell_type": "markdown", - "id": "spiritual-shareware", + "id": "casual-satisfaction", "metadata": {}, "source": [ "### Under the hood\n", diff --git a/jupyter/chap23.ipynb b/jupyter/chap23.ipynb new file mode 100644 index 00000000..e48d1c72 --- /dev/null +++ b/jupyter/chap23.ipynb @@ -0,0 +1,877 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "foreign-pepper", + "metadata": {}, + "source": [ + "# Chapter 23" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-backing", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "charming-location", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "seeing-contractor", + "metadata": {}, + "source": [ + "### Code from the previous chapter" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "quantitative-montana", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import Params\n", + "\n", + "params = Params(\n", + " x = 0, # m\n", + " y = 1, # m\n", + " angle = 45, # degree\n", + " velocity = 40, # m / s\n", + "\n", + " mass = 145e-3, # kg \n", + " diameter = 73e-3, # m \n", + " C_d = 0.33, # dimensionless\n", + "\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "preliminary-industry", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System, pol2cart\n", + "from numpy import pi, deg2rad\n", + "\n", + "def make_system(params):\n", + " \n", + " # convert angle to degrees\n", + " theta = deg2rad(params.angle)\n", + " \n", + " # compute x and y components of velocity\n", + " vx, vy = pol2cart(theta, params.velocity)\n", + " \n", + " # make the initial state\n", + " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", + " \n", + " # compute the frontal area\n", + " area = pi * (params.diameter/2)**2\n", + "\n", + " return System(init = init,\n", + " mass = params.mass,\n", + " area = area,\n", + " C_d = params.C_d,\n", + " rho = params.rho,\n", + " g = params.g,\n", + " t_end=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "absolute-percentage", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import vector_mag, vector_hat\n", + "\n", + "def drag_force(V, system):\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = rho * vector_mag(V)**2 * C_d * area / 2\n", + " direction = -vector_hat(V)\n", + " f_drag = mag * direction\n", + " return f_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "common-batman", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import Vector\n", + "\n", + "def slope_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " V = Vector(vx, vy)\n", + " a_drag = drag_force(V, system) / mass\n", + " a_grav = Vector(0, -g)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V.x, V.y, A.x, A.y" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "italic-amino", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "angry-pledge", + "metadata": {}, + "source": [ + "In the previous chapter we developed a model of the flight of a\n", + "baseball, including gravity and a simple version of drag, but neglecting spin, Magnus force, and the dependence of the coefficient of drag on velocity.\n", + "\n", + "In this chapter we apply that model to an optimization problem." + ] + }, + { + "cell_type": "markdown", + "id": "decent-birth", + "metadata": {}, + "source": [ + "## The Manny Ramirez problem\n", + "\n", + "Manny Ramirez is a former member of the Boston Red Sox (an American\n", + "baseball team) who was notorious for his relaxed attitude and taste for practical jokes. Our objective in this chapter is to solve the following Manny-inspired problem:\n", + "\n", + "> What is the minimum effort required to hit a home run in Fenway Park?\n", + "\n", + "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its\n", + "most famous features is the \"Green Monster\", which is a wall in left\n", + "field that is unusually close to home plate, only 310 feet away. To\n", + "compensate for the short distance, the wall is unusually high, at 37\n", + "feet (see )." + ] + }, + { + "cell_type": "markdown", + "id": "exposed-diving", + "metadata": {}, + "source": [ + "We want to find the minimum velocity at which a ball can leave home\n", + "plate and still go over the Green Monster. We'll proceed in the\n", + "following steps:\n", + "\n", + "1. For a given velocity, we'll find the optimal **launch angle**, that is, the angle the ball should leave home plate to maximize its height when it reaches the wall.\n", + "\n", + "2. Then we'll find the minimal velocity that clears the wall, given\n", + " that it has the optimal launch angle." + ] + }, + { + "cell_type": "markdown", + "id": "received-diamond", + "metadata": {}, + "source": [ + "## Finding the range\n", + "\n", + "Suppose we want to find the launch angle that maximizes **range**, that is, the distance the ball travels in the air before landing. We'll use a function in the ModSim library, `maximize`, which takes a function and finds its maximum.\n", + "\n", + "The function we pass to `maximize` should take launch angle in degrees, simulate the flight of a ball launched at that angle, and return the distance the ball travels along the $x$ axis." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "forty-knitting", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "def range_func(angle, params):\n", + " params = params.set(angle=angle)\n", + " system = make_system(params)\n", + " results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + " x_dist = results.iloc[-1].x\n", + " print(angle, x_dist)\n", + " return x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "exact-cigarette", + "metadata": {}, + "source": [ + "`range_func` makes a new `System` object with the given value of\n", + "`angle`. Then it calls `run_solve_ivp` and\n", + "returns the final value of `x` from the results.\n", + "\n", + "We can call `range_func` directly like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "senior-counter", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "45 99.31829628352206\n" + ] + }, + { + "data": { + "text/plain": [ + "99.31829628352206" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "range_func(45, params)" + ] + }, + { + "cell_type": "markdown", + "id": "paperback-passing", + "metadata": {}, + "source": [ + "And we can sweep a sequence of angles like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "biological-evans", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20.0 78.09741067882733\n", + "23.0 84.11542610650983\n", + "26.0 89.1319241236397\n", + "29.0 93.17466724082831\n", + "32.0 96.27134737391347\n", + "35.0 98.44725560274013\n", + "38.0 99.72474586365286\n", + "41.0 100.12347299697637\n", + "44.0 99.66100302635327\n", + "47.0 98.35354763684836\n", + "50.0 96.21673516565127\n", + "53.0 93.26623796736264\n", + "56.0 89.51751617672979\n", + "59.0 84.98724481958084\n", + "62.0 79.69434524339994\n", + "65.0 73.66129770133254\n", + "68.0 66.91470886279747\n", + "71.0 59.48269492939761\n", + "74.0 51.40287109940439\n", + "77.0 42.72047925533449\n", + "80.0 33.48437980813933\n" + ] + } + ], + "source": [ + "from modsim import linspace, SweepSeries\n", + "\n", + "angles = linspace(20, 80, 21)\n", + "sweep = SweepSeries()\n", + "\n", + "for angle in angles:\n", + " x_dist = range_func(angle, params)\n", + " sweep[angle] = x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "premium-contribution", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "experienced-providence", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "sweep.plot()\n", + "\n", + "decorate(xlabel='Launch angle (degree)',\n", + " ylabel='Range (meter)')" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-blade", + "metadata": {}, + "source": [ + "It looks like the optimal angle is near 40°.\n", + "\n", + "We can find the optimal angle more precisely and more efficiently using `maximize_scalar`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "vocal-nerve", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 17.468795355645703\n", + "34.37694101250946 98.06996498016372\n", + "55.62305898749054 90.03182421721925\n", + "21.246117974981075 80.72039493627989\n", + "41.173855871043976 100.1200188931698\n", + "40.980120907837964 100.12368377099199\n", + "40.88213731907024 100.12417004431842\n", + "40.879254201241096 100.12417043309691\n", + "40.87958814091176 100.12417042882092\n", + "40.878920261570435 100.12417042669497\n" + ] + }, + { + "data": { + "text/plain": [ + "'Solution found.'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import maximize_scalar\n", + "\n", + "res = maximize_scalar(range_func, [0, 90], params)\n", + "res.message" + ] + }, + { + "cell_type": "markdown", + "id": "violent-explanation", + "metadata": {}, + "source": [ + "The first parameter is the function we want to maximize. The second is\n", + "the range of values we want to search; in this case, it's the range of\n", + "angles from 0° to 90°. \n", + "\n", + "The return value from `maximize` is an object that contains the\n", + "results, including `x`, which is the angle that yielded the highest\n", + "range, and `fun`, which is the value of `range_func` when it's evaluated at `x`, that is, range when the baseball is launched at the optimal angle." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "figured-uniform", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(40.879254201241096, 100.12417043309691)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.x, res.fun" + ] + }, + { + "cell_type": "markdown", + "id": "shaped-southeast", + "metadata": {}, + "source": [ + "For these parameters, the optimal angle is about 41°, which yields a\n", + "range of 100 m.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "temporal-extension", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "\n", + "\n", + "If you enjoy this exercise, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "processed-constitution", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "handmade-rhythm", + "metadata": {}, + "source": [ + "**Exercise:** Let's finish off the Manny Ramirez problem:\n", + "\n", + "> What is the minimum effort required to hit a home run in Fenway Park?\n", + "\n", + "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", + "\n", + "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", + "\n", + "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", + "\n", + "As a first step, write an `event_func` that stops the simulation when the ball reaches the wall at 310 feet (94.5 m).\n", + "Test your function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "studied-association", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def event_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " return x - 94.5" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "developmental-alabama", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-94.5" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "system = make_system(params)\n", + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "novel-appointment", + "metadata": {}, + "source": [ + "Next, write a function called `height_func` that takes a launch angle, simulates the flight of a baseball, and returns the height of the baseball when it reaches the wall.\n", + "Test your function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ignored-decrease", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def height_func(angle, params):\n", + " params = params.set(angle=angle)\n", + " system = make_system(params)\n", + "\n", + " results, details = run_solve_ivp(system, slope_func, \n", + " events=event_func)\n", + " height = results.iloc[-1].y\n", + " return height" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "western-communist", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6.647999317446708" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "height_func(40, params)" + ] + }, + { + "cell_type": "markdown", + "id": "located-lawsuit", + "metadata": {}, + "source": [ + "Now use `maximize_scalar` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "duplicate-madison", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Solution found.'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "bounds = [0, 90]\n", + "res = maximize_scalar(height_func, bounds, params)\n", + "res.message" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "legislative-prospect", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(43.10025059565446, 7.202365708497986)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "res.x, res.fun" + ] + }, + { + "cell_type": "markdown", + "id": "interpreted-telephone", + "metadata": {}, + "source": [ + "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 37 feet (11.3 m), given that it's launched at the optimal angle. And that's a job for `root_scalar`.\n", + "\n", + "Write an error function that takes a velocity and a `System` object as parameters. It should use `maximize_scalar` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11.3 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "egyptian-shadow", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def error_func(velocity, params):\n", + " print(velocity)\n", + " params = params.set(velocity=velocity)\n", + " bounds = [0, 90]\n", + " res = maximize_scalar(height_func, bounds, params)\n", + " return res.fun - 11.3" + ] + }, + { + "cell_type": "markdown", + "id": "documentary-guidance", + "metadata": {}, + "source": [ + "Test your error function before you call `root_scalar`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "sustainable-supply", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "40\n" + ] + }, + { + "data": { + "text/plain": [ + "-4.097634291502015" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "error_func(40, params)" + ] + }, + { + "cell_type": "markdown", + "id": "reserved-shelter", + "metadata": {}, + "source": [ + "Then use `root_scalar` to find the answer to the problem, the minimum velocity that gets the ball out of the park." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "certified-webster", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "30.0\n", + "50.0\n", + "42.96216812977292\n", + "41.04044041129342\n", + "41.04880372505707\n", + "41.048542232137436\n", + "41.04854219528224\n", + "41.048542195283254\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "from scipy.optimize import root_scalar\n", + "\n", + "bracket = [30, 50]\n", + "res = root_scalar(error_func, params, bracket=bracket)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "silver-bernard", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + " converged: True\n", + " flag: 'converged'\n", + " function_calls: 8\n", + " iterations: 7\n", + " root: 41.04854219528224" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "absent-encoding", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "41.04854219528224" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "min_velocity = res.root\n", + "min_velocity" + ] + }, + { + "cell_type": "markdown", + "id": "approved-fiction", + "metadata": {}, + "source": [ + "And just to check, run `error_func` with the value you found." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "thick-jungle", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "41.04854219528224\n" + ] + }, + { + "data": { + "text/plain": [ + "-3.907985046680551e-14" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "error_func(min_velocity, params)" + ] + }, + { + "cell_type": "markdown", + "id": "simple-steps", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "`maximize_scalar` uses a golden section search, which you can read about at )." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/chap24.ipynb b/jupyter/chap24.ipynb new file mode 100644 index 00000000..ed8daff0 --- /dev/null +++ b/jupyter/chap24.ipynb @@ -0,0 +1,1396 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "august-parks", + "metadata": {}, + "source": [ + "# Chapter 24" + ] + }, + { + "cell_type": "markdown", + "id": "suspended-puppy", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cutting-ultimate", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "hispanic-pressure", + "metadata": {}, + "source": [ + "In this chapter we model systems that involve rotating objects. In\n", + "general, rotation is complicated: in three dimensions, objects can\n", + "rotate around three axes; objects are often easier to spin around some\n", + "axes than others; and they may be stable when spinning around some axes but not others.\n", + "\n", + "If the configuration of an object changes over time, it might become\n", + "easier or harder to spin, which explains the surprising dynamics of\n", + "gymnasts, divers, ice skaters, etc.\n", + "\n", + "And when you apply a twisting force to a rotating object, the effect is often contrary to intuition. For an example, see this video on\n", + "gyroscopic precession .\n", + "\n", + "In this chapter, we will not take on the physics of rotation in all its glory. Rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. In that case, we can treat some vector quantities as if they were scalars (in the same way that we sometimes treat velocity as a scalar with an implicit direction).\n", + "\n", + "This approach makes it possible to simulate and analyze many interesting systems, but you will also encounter systems that would be better approached with the more general toolkit." + ] + }, + { + "cell_type": "markdown", + "id": "rural-secret", + "metadata": {}, + "source": [ + "The fundamental ideas in this chapter and the next are **angular\n", + "velocity**, **angular acceleration**, **torque**, and **moment of\n", + "inertia**. If you are not already familiar with these concepts, I will\n", + "define them as we go along, and I will point to additional reading.\n", + "\n", + "At the end of the next chapter, you will use these tools to simulate the behavior of a yo-yo (see ). But we'll work our way up to it gradually, starting with toilet paper." + ] + }, + { + "cell_type": "markdown", + "id": "protecting-photography", + "metadata": {}, + "source": [ + "## The physics of toilet paper\n", + "\n", + "As a simple example of a system with rotation, we'll simulate the\n", + "manufacture of a roll of toilet paper. Starting with a cardboard tube at the center, we will roll up 47 m of paper, the typical length of a roll of toilet paper in the U.S. (see ).\n", + "\n", + "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](figs/paper_roll.pdf){height=\"2.5in\"}\n", + "\n", + "This figure shows a diagram of the system: $r$ represents\n", + "the radius of the roll at a point in time. Initially, $r$ is the radius of the cardboard core, $R_{min}$. When the roll is complete, $r$ is $R_{max}$.\n", + "\n", + "I'll use $\\theta$ to represent the total rotation of the roll in\n", + "radians. In the diagram, $d\\theta$ represents a small increase in\n", + "$\\theta$, which corresponds to a distance along the circumference of the roll of $r~d\\theta$.\n", + "\n", + "Finally, I'll use $y$ to represent the total length of paper that's been rolled. Initially, $\\theta=0$ and $y=0$. For each small increase in $\\theta$, there is a corresponding increase in $y$: \n", + "\n", + "$$dy = r~d\\theta$$\n", + "\n", + "If we divide both sides by a small increase in time, $dt$, we get a\n", + "differential equation for $y$ as a function of time.\n", + "\n", + "$$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$$ \n", + "\n", + "As we roll up the paper, $r$ increases, too. Assuming that $r$ increases by a fixed amount per revolution, we can write \n", + "\n", + "$$dr = k~d\\theta$$ \n", + "\n", + "Where $k$ is an unknown constant we'll have to figure out. Again, we can divide both sides by $dt$ to get a differential equation in time:\n", + "\n", + "$$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$$ \n", + "\n", + "Finally, let's assume that $\\theta$ increases at a constant rate of 10 rad/s (about 95 revolutions per minute): \n", + "\n", + "$$\\frac{d\\theta}{dt} = 10$$ \n", + "\n", + "This rate of change is called an **angular velocity**. Now we have a system of three differential equations we can use to simulate the system." + ] + }, + { + "cell_type": "markdown", + "id": "prostate-smell", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "At this point we have a pretty standard process for writing simulations like this.\n", + "\n", + "First we'll create a `Params` object with the parameters of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "honey-translator", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import Params\n", + "\n", + "params = Params(Rmin = 0.02, # m \n", + " Rmax = 0.055, # m \n", + " L = 47, # m \n", + " omega = 10, # radian / s \n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "caring-unemployment", + "metadata": {}, + "source": [ + "`Rmin` and `Rmax` are the initial and final values for the radius, `r`.\n", + "`L` is the total length of the paper. `t_end` is the length of the\n", + "simulation in time, and `dt` is the time step for the ODE solver.\n", + "\n", + "We use the `Params` object to make a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fresh-domestic", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(params):\n", + " init = State(theta = 0, # radian\n", + " y = 0, # m,\n", + " r = params.Rmin\n", + " )\n", + " \n", + " k = estimate_k(params)\n", + "\n", + " return System(init=init, \n", + " k=k,\n", + " omega = params.omega,\n", + " Rmin = params.Rmin,\n", + " Rmax = params.Rmax,\n", + " L = params.L,\n", + " t_end = 130,\n", + " num = 2000,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "strong-harrison", + "metadata": {}, + "source": [ + "The initial state contains three variables, `theta`, `y`, and `r`.\n", + "\n", + "`estimate_k` computes the parameter, `k`, that relates `theta` and `r`.\n", + "Here's how it works:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "common-sender", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "\n", + "def estimate_k(params):\n", + " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", + " \n", + " Ravg = (Rmax + Rmin) / 2\n", + " Cavg = 2 * pi * Ravg\n", + " revs = L / Cavg\n", + " rads = 2 * pi * revs\n", + " k = (Rmax - Rmin) / rads\n", + " return k" + ] + }, + { + "cell_type": "markdown", + "id": "compact-atlas", + "metadata": {}, + "source": [ + "`Ravg` is the average radius, half way between `Rmin` and `Rmax`, so\n", + "`Cavg` is the circumference of the roll when `r` is `Ravg`.\n", + "\n", + "`revs` is the total number of revolutions it would take to roll up\n", + "length `L` if `r` were constant at `Ravg`. And `rads` is just `revs`\n", + "converted to radians.\n", + "\n", + "Finally, `k` is the change in `r` for each radian of revolution. For\n", + "these parameters, `k` is about `2.8e-5` m/rad." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "environmental-nitrogen", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "theta 0.00\n", + "y 0.00\n", + "r 0.02\n", + "dtype: float64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system = make_system(params)\n", + "system.init" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "improving-acrobat", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.7925531914893616e-05" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "system.k" + ] + }, + { + "cell_type": "markdown", + "id": "beginning-artwork", + "metadata": {}, + "source": [ + "Now we can use the differential equations from the previous section to\n", + "write a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "signed-eight", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " theta, y, r = state\n", + " k, omega = system.k, system.omega\n", + " \n", + " dydt = r * omega\n", + " drdt = k * omega\n", + " \n", + " return omega, dydt, drdt" + ] + }, + { + "cell_type": "markdown", + "id": "celtic-civilian", + "metadata": {}, + "source": [ + "As usual, the slope function takes a `State` object, a time, and a\n", + "`System` object. The `State` object contains hypothetical values of\n", + "`theta`, `y`, and `r` at time `t`. The job of the slope function is to\n", + "compute the time derivatives of these values. The derivative of `theta` is angular velocity, which is often denoted `omega`." + ] + }, + { + "cell_type": "markdown", + "id": "tracked-delay", + "metadata": {}, + "source": [ + "And as usual, we should test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "employed-palestine", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(10, 0.2, 0.0002792553191489362)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "russian-rochester", + "metadata": {}, + "source": [ + "We'd like to stop the simulation when the length of paper on the roll is `L`. We can do that with an event function that passes through 0 when `y` equals `L`:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "strong-custody", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " theta, y, r = state\n", + " return y - system.L" + ] + }, + { + "cell_type": "markdown", + "id": "affecting-pathology", + "metadata": {}, + "source": [ + "Now we can run the simulation like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "stable-lying", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "separated-colleague", + "metadata": {}, + "source": [ + "### Plotting" + ] + }, + { + "cell_type": "markdown", + "id": "satisfied-camel", + "metadata": {}, + "source": [ + "Plotting `theta`" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "excited-marshall", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "def plot_theta(results):\n", + " results.theta.plot(color='C0', label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "id": "legislative-sixth", + "metadata": {}, + "source": [ + "Plotting `y`" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "plastic-operations", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_y(results):\n", + " results.y.plot(color='C1', label='y')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')\n", + " \n", + "plot_y(results)" + ] + }, + { + "cell_type": "markdown", + "id": "enclosed-stand", + "metadata": {}, + "source": [ + "Plotting `r`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "pleased-edward", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_r(results):\n", + " results.r.plot(color='C2', label='r')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Radius (m)')\n", + " \n", + "plot_r(results)" + ] + }, + { + "cell_type": "markdown", + "id": "satellite-evans", + "metadata": {}, + "source": [ + " `theta` grows linearly over time, as we should expect. As a result, `r` also grows linearly. But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope.\n", + "\n", + "Because this system is so simple, it is almost silly to simulate it. As we'll see in the next section, it is easy enough to solve the\n", + "differential equations analytically. But it is often useful to start\n", + "with a simple simulation as a way of exploring and checking assumptions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "quantitative-student", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    thetayr
    125.0825411250.82541346.8621520.054930
    125.1452391251.45239346.8965980.054947
    125.2079371252.07937346.9310540.054965
    125.2706351252.70635346.9655220.054982
    125.3333331253.33333347.0000000.055000
    \n", + "
    " + ], + "text/plain": [ + " theta y r\n", + "125.082541 1250.825413 46.862152 0.054930\n", + "125.145239 1251.452393 46.896598 0.054947\n", + "125.207937 1252.079373 46.931054 0.054965\n", + "125.270635 1252.706353 46.965522 0.054982\n", + "125.333333 1253.333333 47.000000 0.055000" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "potential-strength", + "metadata": {}, + "source": [ + "The elapsed time is about 2 minutes, which is plausible." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "systematic-differential", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.08888888888889" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_final = results.index[-1]\n", + "t_final / 60" + ] + }, + { + "cell_type": "markdown", + "id": "incident-delight", + "metadata": {}, + "source": [ + "The final value of `y` is 47 meters, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "suffering-directory", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(47.0, 47)" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_state = results.iloc[-1] \n", + "final_state.y, params.L" + ] + }, + { + "cell_type": "markdown", + "id": "nasty-triple", + "metadata": {}, + "source": [ + "The final value of radius is `Rmax`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cutting-proceeding", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.05500000000000002, 0.055)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "final_state.r, params.Rmax" + ] + }, + { + "cell_type": "markdown", + "id": "charitable-mystery", + "metadata": {}, + "source": [ + "And the total number of rotations is close to 200, which seems plausible." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "removable-brother", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "199.47419534184226" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "radians = final_state.theta\n", + "rotations = radians / 2 / pi\n", + "rotations" + ] + }, + { + "cell_type": "markdown", + "id": "continued-angel", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "Here's a draw function that animates the results using `matplotlib` patches." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "confused-preview", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Circle, Arrow\n", + "from matplotlib.pyplot import gca, axis\n", + "from modsim import pol2cart\n", + "\n", + "def draw_func(t, state):\n", + " # get radius in mm\n", + " theta, y, r = state\n", + " radius = r\n", + " \n", + " # draw the paper\n", + " circle = Circle([0, 0], radius)\n", + " gca().add_patch(circle)\n", + " \n", + " # draw the core\n", + " core = Circle([0, 0], params.Rmin, color='0.9')\n", + " gca().add_patch(core)\n", + " \n", + " # draw the perimeter\n", + " core = Circle([0, 0], params.Rmax, \n", + " color='0.7', fill=False)\n", + " gca().add_patch(core)\n", + " \n", + " # draw an arrow to show rotation\n", + " dx, dy = pol2cart(theta, radius)\n", + " arrow = Arrow(0, 0, dx, dy, color='C1', width=0.01)\n", + " gca().add_patch(arrow)\n", + "\n", + " # make the aspect ratio 1\n", + " decorate(xlim=[-0.1, 0.1],\n", + " ylim=[-0.07, 0.07])" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "naughty-tenant", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "draw_func(0, system.init)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "distant-nancy", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "draw_func(t_final, final_state)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "identical-expense", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import animate\n", + "\n", + "# animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "id": "contained-taiwan", + "metadata": {}, + "source": [ + "Now that we have a working simulation, it is also useful to do some analysis." + ] + }, + { + "cell_type": "markdown", + "id": "electric-longer", + "metadata": {}, + "source": [ + "## Analysis\n", + "\n", + "The differential equations in Section xx are simple enough that we can just solve them. Since angular velocity is constant: \n", + "\n", + "$$\\frac{d\\theta}{dt} = \\omega$$ \n", + "\n", + "We can find $\\theta$ as a function of time by integrating both sides:\n", + "\n", + "$$\\theta(t) = \\omega t + C_1$$ \n", + "\n", + "With the initial condition $\\theta(0)=0$, we find $C_1=0$. Similarly,\n", + "\n", + "$$\\frac{dr}{dt} = k \\omega$$ \n", + "\n", + "So\n", + "\n", + "$$r(t) = k \\omega t + C_2$$ \n", + "\n", + "With the initial condition $r(0)=R_{min}$, we find $C_2=R_{min}$. Then we can plug the solution for $r$ into the equation for $y$: \n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dy}{dt} & = r \\omega \\\\\n", + " & = \\left[ k \\omega t + R_{min} \\right] \\omega \\nonumber\\end{aligned}$$\n", + " \n", + "Integrating both sides yields:\n", + "\n", + "$$y(t) = \\left[ k \\omega t^2 / 2 + R_{min} t \\right] \\omega + C_3$$ \n", + "\n", + "So $y$ is a parabola, as you might have guessed. With initial condition $y(0)=0$, we find $C_3=0$.\n", + "\n", + "We can also use these equations to find the relationship between $y$ and $r$, independent of time, which we can use to compute $k$. Using a move we saw in Section xxx, I'll divide Equations 1 and\n", + "2, yielding\n", + "\n", + "$$\\frac{dr}{dy} = \\frac{k}{r}$$ \n", + "\n", + "Separating variables yields\n", + "\n", + "$$r~dr = k~dy$$ \n", + "\n", + "Integrating both sides yields \n", + "\n", + "$$r^2 / 2 = k y + C$$ \n", + "\n", + "When $y=0$, $r=R_{min}$, so $$C = \\frac{1}{2} R_{min}^2$$ Solving for $y$, we have \n", + "\n", + "$$y = \\frac{1}{2k} (r^2 - R_{min}^2) \\label{eqn3}$$\n", + "\n", + "When $y=L$, $r=R_{max}$; substituting in those values yields\n", + "\n", + "$$L = \\frac{1}{2k} (R_{max}^2 - R_{min}^2)$$ \n", + "\n", + "Solving for $k$ yields\n", + "\n", + "$$k = \\frac{1}{2L} (R_{max}^2 - R_{min}^2) \\label{eqn4}$$\n", + "\n", + "Plugging in the values of the parameters yields `2.8e-5` m/rad, the same as the \"estimate\" we computed in Section xxx. In this case the estimate turns out to be exact." + ] + }, + { + "cell_type": "markdown", + "id": "welcome-organization", + "metadata": {}, + "source": [ + "We can also see the relationship between `y` and `r`, which I derive analytically in the book." + ] + }, + { + "cell_type": "markdown", + "id": "foreign-needle", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "hindu-civilization", + "metadata": {}, + "source": [ + "### Rolling paper\n", + "\n", + "We'll start by loading the units we need." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "active-absorption", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'UNITS' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mradian\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mradian\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeter\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msecond\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'UNITS' is not defined" + ] + } + ], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second" + ] + }, + { + "cell_type": "markdown", + "id": "fancy-floating", + "metadata": {}, + "source": [ + "And creating a `Params` object with the system parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "british-method", + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(Rmin = 0.02 * m,\n", + " Rmax = 0.055 * m,\n", + " L = 47 * m,\n", + " omega = 10 * radian / s,\n", + " t_end = 130 * s,\n", + " dt = 1*s)" + ] + }, + { + "cell_type": "markdown", + "id": "governing-paraguay", + "metadata": {}, + "source": [ + "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "spread-fabric", + "metadata": {}, + "outputs": [], + "source": [ + "def estimate_k(params):\n", + " \"\"\"Estimates the parameter `k`.\n", + " \n", + " params: Params with Rmin, Rmax, and L\n", + " \n", + " returns: k in meters per radian\n", + " \"\"\"\n", + " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", + " \n", + " Ravg = (Rmax + Rmin) / 2\n", + " Cavg = 2 * pi * Ravg\n", + " revs = L / Cavg\n", + " rads = 2 * pi * revs\n", + " k = (Rmax - Rmin) / rads\n", + " return k" + ] + }, + { + "cell_type": "markdown", + "id": "plain-chambers", + "metadata": {}, + "source": [ + "As usual, `make_system` takes a `Params` object and returns a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "tutorial-direction", + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params with Rmin, Rmax, and L\n", + " \n", + " returns: System with init, k, and ts\n", + " \"\"\"\n", + " init = State(theta = 0 * radian,\n", + " y = 0 * m,\n", + " r = params.Rmin)\n", + " \n", + " k = estimate_k(params)\n", + "\n", + " return System(params, init=init, k=k)" + ] + }, + { + "cell_type": "markdown", + "id": "separate-flexibility", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "latter-retention", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aggressive-bikini", + "metadata": {}, + "outputs": [], + "source": [ + "system.init" + ] + }, + { + "cell_type": "markdown", + "id": "processed-archive", + "metadata": {}, + "source": [ + "Now we can write a slope function based on the differential equations\n", + "\n", + "$\\omega = \\frac{d\\theta}{dt} = 10$\n", + "\n", + "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", + "\n", + "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "unable-track", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object with theta, y, r\n", + " t: time\n", + " system: System object with r, k\n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " theta, y, r = state\n", + " k, omega = system.k, system.omega\n", + " \n", + " dydt = r * omega\n", + " drdt = k * omega\n", + " \n", + " return omega, dydt, drdt" + ] + }, + { + "cell_type": "markdown", + "id": "behind-aaron", + "metadata": {}, + "source": [ + "Testing `slope_func`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "middle-paint", + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "id": "better-filing", + "metadata": {}, + "source": [ + "We'll use an event function to stop when `y=L`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "numerous-legislature", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Detects when we've rolled length `L`.\n", + " \n", + " state: State object with theta, y, r\n", + " t: time\n", + " system: System object with L\n", + " \n", + " returns: difference between `y` and `L`\n", + " \"\"\"\n", + " theta, y, r = state\n", + " \n", + " return y - system.L" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "broad-place", + "metadata": {}, + "outputs": [], + "source": [ + "event_func(system.init, 0, system)" + ] + }, + { + "cell_type": "markdown", + "id": "polished-phrase", + "metadata": {}, + "source": [ + "Now we can run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "monetary-charlotte", + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "id": "religious-conditions", + "metadata": {}, + "source": [ + "And look at the results." + ] + }, + { + "cell_type": "markdown", + "id": "lucky-advance", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." + ] + }, + { + "cell_type": "markdown", + "id": "noted-amount", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "given-panic", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "dydt = gradient(results.y);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "foreign-reservation", + "metadata": {}, + "outputs": [], + "source": [ + "plot(dydt, label='dydt')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Linear velocity (m/s)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "proof-abraham", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "linear_velocity = get_last_value(dydt) * m/s" + ] + }, + { + "cell_type": "markdown", + "id": "advisory-integer", + "metadata": {}, + "source": [ + "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", + "\n", + "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", + "\n", + "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", + "\n", + "Run the simulation and see how much faster we could finish rolling the paper." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "historic-barrier", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def slope_func(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object with theta, y, r\n", + " t: time\n", + " system: System object with r, k\n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " theta, y, r = state\n", + " k, omega = system.k, system.omega\n", + " \n", + " dydt = linear_velocity\n", + " omega = dydt / r\n", + " drdt = k * omega\n", + " \n", + " return omega, dydt, drdt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "false-identity", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "slope_func(system.init, 0, system)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "physical-novelty", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "results, details = run_solve_ivp(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "peaceful-doctor", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "t_final = get_last_label(results) * s" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "limiting-license", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "plot_three(results)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "least-analysis", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/modsim.py b/jupyter/modsim.py index 164cd36a..894cabe3 100644 --- a/jupyter/modsim.py +++ b/jupyter/modsim.py @@ -30,12 +30,12 @@ from scipy.integrate import solve_ivp from types import SimpleNamespace +from copy import copy +#import pint -import pint - -units = pint.UnitRegistry() -Quantity = units.Quantity +#units = pint.UnitRegistry() +#Quantity = units.Quantity def flip(p=0.5): @@ -153,9 +153,8 @@ def minimize_scalar(min_func, bounds, *args, **options): min_func(bounds[0], *args) except Exception as e: msg = """Before running scipy.integrate.minimize_scalar, I tried - running the slope function you provided with the - initial conditions in system and t=0, and I got - the following error:""" + running the function you provided with the + lower bound, and I got the following error:""" logger.error(msg) raise (e) @@ -178,7 +177,7 @@ def minimize_scalar(min_func, bounds, *args, **options): ) raise Exception(msg) - return ModSimSeries(res) + return res def maximize_scalar(max_func, bounds, *args, **options): @@ -194,7 +193,6 @@ def maximize_scalar(max_func, bounds, *args, **options): returns: ModSimSeries object """ - def min_func(*args): return -max_func(*args) @@ -446,10 +444,14 @@ def run_solve_ivp(system, slope_func, **options): else: columns = range(len(system.init)) - # evaluate the results at 51 equally-spaced points + # evaluate the results at equally-spaced points if options.get('dense_output', False): - t_end = t[-1] - t_array = linspace(t_0, t_end, 51) + try: + num = system.num + except AttributeError: + num = 51 + t_final = t[-1] + t_array = linspace(t_0, t_final, num) y_array = bunch.sol(t_array) # pack the results into a TimeFrame @@ -495,7 +497,7 @@ def check_system(system, slope_func): # if dt is not specified, take 100 steps try: dt = system.dt - except KeyError: + except AttributeError: dt = t_end / 100 return init, t_0, t_end, dt @@ -650,7 +652,6 @@ def fsolve(func, x0, *args, **options): return result - def crossings(series, value): """Find the labels where the series passes through value. @@ -906,7 +907,43 @@ def State(**variables): return pd.Series(variables) -class System(SimpleNamespace): +class SettableNamespace(SimpleNamespace): + """Contains a collection of parameters. + + Used to make a System object. + + Takes keyword arguments and stores them as attributes. + """ + def get(self, name, default=None): + """Look up a variable. + + name: string varname + default: value returned if `name` is not present + """ + try: + return self.__getattribute__(name, default) + except AttributeError: + return default + + def set(self, **variables): + """Make a copy and update the given variables. + + returns: Params + """ + new = copy(self) + new.__dict__.update(variables) + return new + + +class System(SettableNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +class Params(SettableNamespace): """Contains system parameters and their values. Takes keyword arguments and stores them as attributes. @@ -1041,54 +1078,6 @@ def vector_diff_angle(v, w): raise NotImplementedError() -class ModSimVector(Quantity): - """Represented as an array of 2 or 3 elements. - - x, y, z, mag, mag2, and angle are accessible as attributes. - """ - - @property - def x(self): - """Returns the x component with units.""" - return self[0] - - @property - def y(self): - """Returns the y component with units.""" - return self[1] - - @property - def z(self): - """Returns the z component with units.""" - return self[2] - - @property - def mag(self): - """Returns the magnitude with units.""" - return vector_mag(self) - - @property - def mag2(self): - """Returns the magnitude squared with units.""" - return vector_mag2(self) - - @property - def angle(self): - """Returns the angle between self and the positive x axis.""" - return vector_angle(self) - - # make the vector functions available as methods - polar = vector_polar - hat = vector_hat - perp = vector_perp - dot = vector_dot - cross = vector_cross - proj = vector_proj - comp = scalar_proj - dist = vector_dist - diff_angle = vector_diff_angle - - def Vector(x, y, z=None, **options): """ """ From 864b94cc1f8c28150b872da1ae01cda43f480d6e Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 4 Feb 2021 12:05:08 -0500 Subject: [PATCH 027/144] Revising chapters --- jupyter/chap22.ipynb | 448 +++++++------ jupyter/chap24.ipynb | 1041 +++++++++++++------------------ jupyter/chap25.ipynb | 1421 ++++++++++++++++++++++++++++++++++++++++++ jupyter/modsim.py | 240 +++---- 4 files changed, 2160 insertions(+), 990 deletions(-) create mode 100644 jupyter/chap25.ipynb diff --git a/jupyter/chap22.ipynb b/jupyter/chap22.ipynb index e75cf06e..ea1b146d 100644 --- a/jupyter/chap22.ipynb +++ b/jupyter/chap22.ipynb @@ -26,8 +26,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "widespread-detective", + "execution_count": null, + "id": "blank-mapping", "metadata": { "tags": [ "remove-cell" @@ -40,17 +40,32 @@ "try:\n", " import pint\n", "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "widespread-detective", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename)\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " urlretrieve(url+filename, filename)" ] }, { "cell_type": "markdown", - "id": "worst-london", + "id": "alert-banks", "metadata": {}, "source": [ "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", @@ -62,7 +77,7 @@ }, { "cell_type": "markdown", - "id": "contained-bones", + "id": "functional-abortion", "metadata": {}, "source": [ "## Baseball\n", @@ -108,7 +123,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "current-wheel", + "id": "incorrect-cigarette", "metadata": {}, "outputs": [ { @@ -133,7 +148,7 @@ }, { "cell_type": "markdown", - "id": "retired-strand", + "id": "digital-sunrise", "metadata": {}, "source": [ "You can access the components of a `Vector` by name using the dot\n", @@ -143,7 +158,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "quarterly-startup", + "id": "bridal-jamaica", "metadata": {}, "outputs": [ { @@ -163,7 +178,7 @@ }, { "cell_type": "markdown", - "id": "welcome-violin", + "id": "under-attribute", "metadata": {}, "source": [ "You can also access them by index using brackets, like this:" @@ -172,7 +187,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "occupied-macedonia", + "id": "incorrect-postage", "metadata": {}, "outputs": [ { @@ -192,7 +207,7 @@ }, { "cell_type": "markdown", - "id": "collective-anthony", + "id": "solved-bathroom", "metadata": {}, "source": [ "`Vector` objects support most mathematical operations, including\n", @@ -202,7 +217,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "authentic-brazil", + "id": "upset-morning", "metadata": {}, "outputs": [ { @@ -226,7 +241,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "hairy-bahamas", + "id": "every-affiliation", "metadata": {}, "outputs": [ { @@ -249,7 +264,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "assumed-yukon", + "id": "ideal-sperm", "metadata": {}, "outputs": [ { @@ -271,7 +286,7 @@ }, { "cell_type": "markdown", - "id": "criminal-advertiser", + "id": "tender-translator", "metadata": {}, "source": [ "For the definition and graphical interpretation of these operations, see ." @@ -279,7 +294,7 @@ }, { "cell_type": "markdown", - "id": "exact-texture", + "id": "fewer-adolescent", "metadata": {}, "source": [ "We can specify a `Vector` with coordinates `x` and `y`, as in the previous examples.\n", @@ -295,7 +310,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "altered-march", + "id": "chinese-assembly", "metadata": {}, "outputs": [ { @@ -332,7 +347,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "departmental-senator", + "id": "awful-defense", "metadata": {}, "outputs": [ { @@ -355,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "younger-mortality", + "id": "excited-catch", "metadata": {}, "source": [ "And a function to convert degrees to radians:" @@ -491,7 +506,7 @@ }, { "cell_type": "markdown", - "id": "italian-payment", + "id": "boring-river", "metadata": {}, "source": [ "Now let's get back to the game." @@ -511,7 +526,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "attempted-narrow", + "id": "positive-current", "metadata": {}, "outputs": [], "source": [ @@ -529,12 +544,13 @@ "\n", " rho = 1.2, # kg/m**3\n", " g = 9.8, # m/s**2\n", + " t_end = 10, # s\n", ")" ] }, { "cell_type": "markdown", - "id": "thousand-arlington", + "id": "bacterial-favorite", "metadata": {}, "source": [ "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag is from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:" @@ -542,7 +558,7 @@ }, { "cell_type": "markdown", - "id": "prospective-philadelphia", + "id": "unknown-extreme", "metadata": {}, "source": [ "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", @@ -581,18 +597,15 @@ " # compute the frontal area\n", " area = pi * (params.diameter/2)**2\n", "\n", - " return System(init = init,\n", - " mass = params.mass,\n", + " return System(params,\n", + " init = init,\n", " area = area,\n", - " C_d = params.C_d,\n", - " rho = params.rho,\n", - " g = params.g,\n", - " t_end=10)" + " )" ] }, { "cell_type": "markdown", - "id": "combined-heritage", + "id": "considered-conservation", "metadata": {}, "source": [ "`make_system` uses `deg2rad` to convert `angle` to radians and\n", @@ -611,8 +624,8 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "confirmed-knife", + "execution_count": 16, + "id": "greatest-soviet", "metadata": {}, "outputs": [], "source": [ @@ -621,7 +634,7 @@ }, { "cell_type": "markdown", - "id": "tired-abortion", + "id": "metropolitan-mainstream", "metadata": {}, "source": [ "And here's the initial `State`:" @@ -629,8 +642,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "dirty-retailer", + "execution_count": 17, + "id": "studied-congo", "metadata": {}, "outputs": [ { @@ -643,7 +656,7 @@ "dtype: float64" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -662,7 +675,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "legal-terminal", "metadata": {}, "outputs": [], @@ -678,7 +691,7 @@ }, { "cell_type": "markdown", - "id": "spatial-cooperation", + "id": "informational-intersection", "metadata": {}, "source": [ "This function takes `V` as a `Vector` and returns `f_drag` as a\n", @@ -696,8 +709,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "equipped-dragon", + "execution_count": 19, + "id": "detailed-league", "metadata": {}, "outputs": [ { @@ -708,13 +721,13 @@ "dtype: float64" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from modsim import ModSimVector\n", + "from modsim import Vector\n", "\n", "vx, vy = system.init.vx, system.init.vy\n", "V_test = Vector(vx, vy)\n", @@ -733,7 +746,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "suitable-salem", "metadata": {}, "outputs": [], @@ -744,7 +757,7 @@ " \n", " V = Vector(vx, vy)\n", " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", + " a_grav = g * Vector(0, -1)\n", " \n", " A = a_grav + a_drag\n", " \n", @@ -753,7 +766,7 @@ }, { "cell_type": "markdown", - "id": "pointed-graph", + "id": "alpha-tiger", "metadata": {}, "source": [ "As usual, the parameters of the slope function are a time, a `State` object, and a `System` object. \n", @@ -769,7 +782,7 @@ }, { "cell_type": "markdown", - "id": "proved-mother", + "id": "wired-judgment", "metadata": {}, "source": [ "The return value is a sequence that contains:\n", @@ -791,7 +804,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "closing-simon", "metadata": {}, "outputs": [ @@ -801,7 +814,7 @@ "(28.284271247461902, 28.2842712474619, -6.466030881564545, -16.266030881564546)" ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -824,7 +837,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "brief-level", "metadata": {}, "outputs": [], @@ -836,7 +849,7 @@ }, { "cell_type": "markdown", - "id": "pressing-oracle", + "id": "martial-strengthening", "metadata": {}, "source": [ "The event function takes the same parameters as the slope function, and returns the $y$ coordinate of position. When the $y$ coordinate passes through 0, the simulation stops.\n", @@ -846,8 +859,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "necessary-registrar", + "execution_count": 23, + "id": "pointed-bathroom", "metadata": {}, "outputs": [ { @@ -856,7 +869,7 @@ "1.0" ] }, - "execution_count": 24, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -875,7 +888,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "special-background", "metadata": {}, "outputs": [ @@ -885,7 +898,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 25, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -900,7 +913,7 @@ }, { "cell_type": "markdown", - "id": "solid-tribune", + "id": "golden-november", "metadata": {}, "source": [ "`details` contains information about the simulation, including a message that indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", @@ -910,8 +923,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "id": "alternative-history", + "execution_count": 25, + "id": "opening-lecture", "metadata": {}, "outputs": [ { @@ -990,7 +1003,7 @@ "5.004887 99.318296 -7.105427e-15 14.165894 -22.058763" ] }, - "execution_count": 26, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1009,7 +1022,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "medieval-calvin", "metadata": {}, "outputs": [ @@ -1019,7 +1032,7 @@ "5.004887034868351" ] }, - "execution_count": 27, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1039,7 +1052,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "gorgeous-survey", "metadata": {}, "outputs": [ @@ -1053,7 +1066,7 @@ "Name: 5.004887034868351, dtype: float64" ] }, - "execution_count": 28, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1065,7 +1078,7 @@ }, { "cell_type": "markdown", - "id": "alternate-present", + "id": "invalid-japan", "metadata": {}, "source": [ "The final value of `y` is close to 0, as it should be. The final value of `x` tells us how far the ball flew, in meters." @@ -1073,8 +1086,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "conservative-collins", + "execution_count": 28, + "id": "agreed-sugar", "metadata": {}, "outputs": [ { @@ -1083,18 +1096,19 @@ "99.31829628352206" ] }, - "execution_count": 29, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "final_state.x" + "x_dist = final_state.x\n", + "x_dist" ] }, { "cell_type": "markdown", - "id": "resident-fountain", + "id": "recreational-template", "metadata": {}, "source": [ "We can also get the final velocity, like this:" @@ -1102,8 +1116,8 @@ }, { "cell_type": "code", - "execution_count": 30, - "id": "superior-capture", + "execution_count": 29, + "id": "instrumental-nurse", "metadata": {}, "outputs": [ { @@ -1114,7 +1128,7 @@ "dtype: float64" ] }, - "execution_count": 30, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1126,7 +1140,7 @@ }, { "cell_type": "markdown", - "id": "amended-antenna", + "id": "economic-chrome", "metadata": {}, "source": [ "The speed of the ball on impact is about 26 m/s, which is substantially slower than the initial velocity, 40 m/s." @@ -1134,8 +1148,8 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "fresh-damages", + "execution_count": 30, + "id": "noted-triumph", "metadata": {}, "outputs": [ { @@ -1144,7 +1158,7 @@ "26.215674453237636" ] }, - "execution_count": 31, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1165,7 +1179,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "spare-burst", "metadata": {}, "outputs": [ @@ -1205,7 +1219,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "dated-browse", "metadata": {}, "outputs": [ @@ -1249,7 +1263,7 @@ }, { "cell_type": "markdown", - "id": "healthy-pulse", + "id": "precise-theology", "metadata": {}, "source": [ "## Animation\n", @@ -1261,7 +1275,7 @@ }, { "cell_type": "markdown", - "id": "honest-simple", + "id": "elegant-century", "metadata": {}, "source": [ "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", @@ -1271,8 +1285,8 @@ }, { "cell_type": "code", - "execution_count": 34, - "id": "large-gates", + "execution_count": 33, + "id": "sensitive-debate", "metadata": {}, "outputs": [], "source": [ @@ -1290,32 +1304,19 @@ }, { "cell_type": "code", - "execution_count": 35, - "id": "looking-community", + "execution_count": 34, + "id": "civic-federation", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from modsim import animate\n", "\n", - "animate(results, draw_func)" + "# animate(results, draw_func)" ] }, { "cell_type": "markdown", - "id": "final-terminal", + "id": "fatal-effort", "metadata": {}, "source": [ "## Exercises" @@ -1323,7 +1324,7 @@ }, { "cell_type": "markdown", - "id": "romance-serum", + "id": "experimental-cooper", "metadata": {}, "source": [ "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" @@ -1331,8 +1332,8 @@ }, { "cell_type": "code", - "execution_count": 37, - "id": "excessive-challenge", + "execution_count": 35, + "id": "negative-dictionary", "metadata": {}, "outputs": [], "source": [ @@ -1343,8 +1344,8 @@ }, { "cell_type": "code", - "execution_count": 38, - "id": "recognized-format", + "execution_count": 36, + "id": "green-folder", "metadata": {}, "outputs": [ { @@ -1353,7 +1354,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 38, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1368,8 +1369,8 @@ }, { "cell_type": "code", - "execution_count": 39, - "id": "sitting-combine", + "execution_count": 37, + "id": "lucky-degree", "metadata": {}, "outputs": [ { @@ -1394,17 +1395,17 @@ }, { "cell_type": "code", - "execution_count": 44, - "id": "developing-capitol", + "execution_count": 38, + "id": "floating-membrane", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "99.31829628352206" + "164.25925502413202" ] }, - "execution_count": 44, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1412,23 +1413,23 @@ "source": [ "# Solution\n", "\n", - "x_dist = results.iloc[-1].x\n", - "x_dist" + "x_dist2 = results2.iloc[-1].x\n", + "x_dist2" ] }, { "cell_type": "code", - "execution_count": 45, - "id": "elder-variance", + "execution_count": 39, + "id": "sorted-century", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "164.25925502413202" + "64.94095874060996" ] }, - "execution_count": 45, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1436,13 +1437,12 @@ "source": [ "# Solution\n", "\n", - "x_dist_no_drag = results2.iloc[-1].x\n", - "x_dist_no_drag" + "x_dist2 - x_dist" ] }, { "cell_type": "markdown", - "id": "bulgarian-nowhere", + "id": "about-martial", "metadata": {}, "source": [ "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" @@ -1450,8 +1450,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "id": "conventional-chest", + "execution_count": 40, + "id": "fifty-burning", "metadata": {}, "outputs": [], "source": [ @@ -1462,8 +1462,8 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "south-profession", + "execution_count": 41, + "id": "adjustable-capital", "metadata": {}, "outputs": [ { @@ -1472,7 +1472,7 @@ "105.78838005859807" ] }, - "execution_count": 47, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1489,8 +1489,8 @@ }, { "cell_type": "code", - "execution_count": 48, - "id": "removable-running", + "execution_count": 42, + "id": "golden-exhibition", "metadata": {}, "outputs": [ { @@ -1499,7 +1499,7 @@ "6.470083775076006" ] }, - "execution_count": 48, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1512,7 +1512,7 @@ }, { "cell_type": "markdown", - "id": "enormous-auditor", + "id": "christian-scotland", "metadata": {}, "source": [ "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", @@ -1525,8 +1525,8 @@ }, { "cell_type": "code", - "execution_count": 49, - "id": "artistic-baghdad", + "execution_count": 43, + "id": "guided-alarm", "metadata": {}, "outputs": [], "source": [ @@ -1540,8 +1540,8 @@ }, { "cell_type": "code", - "execution_count": 50, - "id": "general-ethiopia", + "execution_count": 44, + "id": "listed-austria", "metadata": {}, "outputs": [ { @@ -1600,61 +1600,6 @@ " 60.134000\n", " 0.45004\n", " \n", - " \n", - " 30.636992\n", - " 68.533000\n", - " 0.40914\n", - " \n", - " \n", - " 32.977694\n", - " 73.769000\n", - " 0.38042\n", - " \n", - " \n", - " 34.604472\n", - " 77.408000\n", - " 0.36562\n", - " \n", - " \n", - " 37.497268\n", - " 83.879000\n", - " 0.34822\n", - " \n", - " \n", - " 40.460249\n", - " 90.507000\n", - " 0.33081\n", - " \n", - " \n", - " 43.492522\n", - " 97.290000\n", - " 0.31427\n", - " \n", - " \n", - " 46.733562\n", - " 104.540000\n", - " 0.30035\n", - " \n", - " \n", - " 50.886563\n", - " 113.830000\n", - " 0.28816\n", - " \n", - " \n", - " 54.047136\n", - " 120.900000\n", - " 0.28381\n", - " \n", - " \n", - " 56.926074\n", - " 127.340000\n", - " 0.28033\n", - " \n", - " \n", - " 60.086646\n", - " 134.410000\n", - " 0.28207\n", - " \n", " \n", "\n", "" @@ -1666,21 +1611,10 @@ "8.871509 19.845000 0.49878\n", "17.647351 39.476000 0.49704\n", "22.432914 50.181000 0.48225\n", - "26.882303 60.134000 0.45004\n", - "30.636992 68.533000 0.40914\n", - "32.977694 73.769000 0.38042\n", - "34.604472 77.408000 0.36562\n", - "37.497268 83.879000 0.34822\n", - "40.460249 90.507000 0.33081\n", - "43.492522 97.290000 0.31427\n", - "46.733562 104.540000 0.30035\n", - "50.886563 113.830000 0.28816\n", - "54.047136 120.900000 0.28381\n", - "56.926074 127.340000 0.28033\n", - "60.086646 134.410000 0.28207" + "26.882303 60.134000 0.45004" ] }, - "execution_count": 50, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1694,13 +1628,13 @@ "mps = mph.to(units.meter / units.second)\n", "baseball_drag.index = mps.magnitude\n", "baseball_drag.index.name = 'Velocity in meters per second'\n", - "baseball_drag" + "baseball_drag.head()" ] }, { "cell_type": "code", - "execution_count": 51, - "id": "pregnant-small", + "execution_count": 45, + "id": "american-reverse", "metadata": {}, "outputs": [ { @@ -1728,7 +1662,7 @@ }, { "cell_type": "markdown", - "id": "promotional-background", + "id": "legislative-jamaica", "metadata": {}, "source": [ "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results." @@ -1736,14 +1670,14 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "sporting-gazette", + "execution_count": 46, + "id": "dominant-passing", "metadata": {}, "outputs": [], "source": [ "# Solution\n", "\n", - "def drag_force(V, system):\n", + "def drag_force2(V, system):\n", " \"\"\"Computes drag force in the opposite direction of `v`.\n", " \n", " v: velocity\n", @@ -1762,8 +1696,30 @@ }, { "cell_type": "code", - "execution_count": 53, - "id": "scheduled-cutting", + "execution_count": 47, + "id": "double-carol", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def slope_func2(t, state, system):\n", + " x, y, vx, vy = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " V = Vector(vx, vy)\n", + " a_drag = drag_force2(V, system) / mass\n", + " a_grav = g * Vector(0, -1)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V.x, V.y, A.x, A.y" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "antique-gathering", "metadata": {}, "outputs": [], "source": [ @@ -1774,19 +1730,19 @@ }, { "cell_type": "code", - "execution_count": 54, - "id": "streaming-lebanon", + "execution_count": 49, + "id": "undefined-moral", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "x -1.023081\n", - "y -1.023081\n", + "x -1.054771\n", + "y -1.054771\n", "dtype: float64" ] }, - "execution_count": 54, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1801,17 +1757,17 @@ }, { "cell_type": "code", - "execution_count": 55, - "id": "animated-prevention", + "execution_count": 50, + "id": "atomic-socket", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(28.284271247461902, 28.2842712474619, -6.534891184395127, -16.334891184395126)" + "(28.284271247461902, 28.2842712474619, -6.466030881564545, -16.266030881564546)" ] }, - "execution_count": 55, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1824,8 +1780,8 @@ }, { "cell_type": "code", - "execution_count": 56, - "id": "practical-reservation", + "execution_count": 51, + "id": "abandoned-amount", "metadata": {}, "outputs": [ { @@ -1834,7 +1790,7 @@ "'A termination event occurred.'" ] }, - "execution_count": 56, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1842,15 +1798,15 @@ "source": [ "# Solution\n", "\n", - "results4, details4 = run_solve_ivp(system4, slope_func, \n", + "results4, details4 = run_solve_ivp(system4, slope_func2, \n", " events=event_func)\n", "details4.message" ] }, { "cell_type": "code", - "execution_count": 57, - "id": "supposed-school", + "execution_count": 52, + "id": "adjusted-coating", "metadata": {}, "outputs": [ { @@ -1929,7 +1885,7 @@ "4.919407 90.206647 1.065814e-14 11.640440 -20.837214" ] }, - "execution_count": 57, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1942,20 +1898,32 @@ }, { "cell_type": "code", - "execution_count": 58, - "id": "recognized-blend", + "execution_count": 53, + "id": "excellent-dressing", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "90.20664656623306" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Solution\n", "\n", - "x_dist4 = results4.iloc[-1].x" + "x_dist4 = results4.iloc[-1].x\n", + "x_dist4" ] }, { "cell_type": "code", - "execution_count": 59, - "id": "sensitive-butterfly", + "execution_count": 54, + "id": "equal-component", "metadata": {}, "outputs": [ { @@ -1964,7 +1932,7 @@ "-9.111649717288998" ] }, - "execution_count": 59, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1977,7 +1945,7 @@ }, { "cell_type": "markdown", - "id": "casual-satisfaction", + "id": "italian-coordinate", "metadata": {}, "source": [ "### Under the hood\n", diff --git a/jupyter/chap24.ipynb b/jupyter/chap24.ipynb index ed8daff0..b9fe4d9c 100644 --- a/jupyter/chap24.ipynb +++ b/jupyter/chap24.ipynb @@ -45,12 +45,20 @@ }, { "cell_type": "markdown", - "id": "hispanic-pressure", + "id": "composed-carol", "metadata": {}, "source": [ - "In this chapter we model systems that involve rotating objects. In\n", - "general, rotation is complicated: in three dimensions, objects can\n", - "rotate around three axes; objects are often easier to spin around some\n", + "In this chapter we model systems that involve rotating objects. " + ] + }, + { + "cell_type": "markdown", + "id": "documentary-network", + "metadata": {}, + "source": [ + "## Rotation\n", + "\n", + "Rotation is complicated: in three dimensions, objects can rotate around three axes; objects are often easier to spin around some\n", "axes than others; and they may be stable when spinning around some axes but not others.\n", "\n", "If the configuration of an object changes over time, it might become\n", @@ -67,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "rural-secret", + "id": "political-acrylic", "metadata": {}, "source": [ "The fundamental ideas in this chapter and the next are **angular\n", @@ -75,18 +83,18 @@ "inertia**. If you are not already familiar with these concepts, I will\n", "define them as we go along, and I will point to additional reading.\n", "\n", - "At the end of the next chapter, you will use these tools to simulate the behavior of a yo-yo (see ). But we'll work our way up to it gradually, starting with toilet paper." + "As a case study, you can use these tools to simulate the behavior of a yo-yo (see ). But we'll work our way up to it gradually, starting with toilet paper." ] }, { "cell_type": "markdown", - "id": "protecting-photography", + "id": "integral-welsh", "metadata": {}, "source": [ "## The physics of toilet paper\n", "\n", "As a simple example of a system with rotation, we'll simulate the\n", - "manufacture of a roll of toilet paper. Starting with a cardboard tube at the center, we will roll up 47 m of paper, the typical length of a roll of toilet paper in the U.S. (see ).\n", + "manufacture of a roll of toilet paper, as shown in this video . Starting with a cardboard tube at the center, we will roll up 47 m of paper, the typical length of a roll of toilet paper in the U.S. (see ).\n", "\n", "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](figs/paper_roll.pdf){height=\"2.5in\"}\n", "\n", @@ -95,8 +103,14 @@ "\n", "I'll use $\\theta$ to represent the total rotation of the roll in\n", "radians. In the diagram, $d\\theta$ represents a small increase in\n", - "$\\theta$, which corresponds to a distance along the circumference of the roll of $r~d\\theta$.\n", - "\n", + "$\\theta$, which corresponds to a distance along the circumference of the roll of $r~d\\theta$." + ] + }, + { + "cell_type": "markdown", + "id": "political-prerequisite", + "metadata": {}, + "source": [ "Finally, I'll use $y$ to represent the total length of paper that's been rolled. Initially, $\\theta=0$ and $y=0$. For each small increase in $\\theta$, there is a corresponding increase in $y$: \n", "\n", "$$dy = r~d\\theta$$\n", @@ -114,9 +128,9 @@ "\n", "$$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$$ \n", "\n", - "Finally, let's assume that $\\theta$ increases at a constant rate of 10 rad/s (about 95 revolutions per minute): \n", + "Finally, let's assume that $\\theta$ increases at a constant rate of $\\omega = 300$ rad/s (about 2900 revolutions per minute): \n", "\n", - "$$\\frac{d\\theta}{dt} = 10$$ \n", + "$$\\frac{d\\theta}{dt} = \\omega$$ \n", "\n", "This rate of change is called an **angular velocity**. Now we have a system of three differential equations we can use to simulate the system." ] @@ -135,17 +149,34 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 101, + "id": "artificial-cotton", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import units\n", + "\n", + "m = units.meter\n", + "rad = units.radian\n", + "s = units.second" + ] + }, + { + "cell_type": "code", + "execution_count": 47, "id": "honey-translator", "metadata": {}, "outputs": [], "source": [ "from modsim import Params\n", "\n", - "params = Params(Rmin = 0.02, # m \n", - " Rmax = 0.055, # m \n", - " L = 47, # m \n", - " omega = 10, # radian / s \n", + "params = Params(Rmin = 0.02 * m,\n", + " Rmax = 0.055 * m,\n", + " L = 47 * m,\n", + " theta_0 = 0 * rad,\n", + " y_0 = 0 * m,\n", + " omega = 300 * rad / s,\n", + " t_end = 130 * s\n", " )" ] }, @@ -163,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 48, "id": "fresh-domestic", "metadata": {}, "outputs": [], @@ -171,21 +202,16 @@ "from modsim import State, System\n", "\n", "def make_system(params):\n", - " init = State(theta = 0, # radian\n", - " y = 0, # m,\n", + " init = State(theta = params.theta_0,\n", + " y = params.y_0,\n", " r = params.Rmin\n", " )\n", " \n", " k = estimate_k(params)\n", "\n", - " return System(init=init, \n", + " return System(params,\n", + " init=init, \n", " k=k,\n", - " omega = params.omega,\n", - " Rmin = params.Rmin,\n", - " Rmax = params.Rmax,\n", - " L = params.L,\n", - " t_end = 130,\n", - " num = 2000,\n", " )" ] }, @@ -202,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 49, "id": "common-sender", "metadata": {}, "outputs": [], @@ -222,7 +248,7 @@ }, { "cell_type": "markdown", - "id": "compact-atlas", + "id": "seasonal-cherry", "metadata": {}, "source": [ "`Ravg` is the average radius, half way between `Rmin` and `Rmax`, so\n", @@ -238,20 +264,20 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "environmental-nitrogen", + "execution_count": 50, + "id": "fitting-might", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "theta 0.00\n", - "y 0.00\n", - "r 0.02\n", - "dtype: float64" + "theta 0 radian\n", + "y 0 meter\n", + "r 0.02 meter\n", + "dtype: object" ] }, - "execution_count": 5, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -263,17 +289,23 @@ }, { "cell_type": "code", - "execution_count": 6, - "id": "improving-acrobat", + "execution_count": 51, + "id": "backed-vehicle", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "2.7925531914893616×10-5 meter" + ], + "text/latex": [ + "$2.7925531914893616\\times 10^{-5}\\ \\mathrm{meter}$" + ], "text/plain": [ - "2.7925531914893616e-05" + "2.7925531914893616e-05 " ] }, - "execution_count": 6, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -293,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 52, "id": "signed-eight", "metadata": {}, "outputs": [], @@ -310,7 +342,7 @@ }, { "cell_type": "markdown", - "id": "celtic-civilian", + "id": "maritime-funds", "metadata": {}, "source": [ "As usual, the slope function takes a `State` object, a time, and a\n", @@ -321,25 +353,27 @@ }, { "cell_type": "markdown", - "id": "tracked-delay", + "id": "trained-witness", "metadata": {}, "source": [ - "And as usual, we should test the slope function with the initial conditions." + "And as usual, we'll test the slope function with the initial conditions." ] }, { "cell_type": "code", - "execution_count": 8, - "id": "employed-palestine", + "execution_count": 53, + "id": "exterior-water", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(10, 0.2, 0.0002792553191489362)" + "(300.0 ,\n", + " 6.0 ,\n", + " 0.008377659574468085 )" ] }, - "execution_count": 8, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -358,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 54, "id": "strong-custody", "metadata": {}, "outputs": [], @@ -368,175 +402,78 @@ " return y - system.L" ] }, - { - "cell_type": "markdown", - "id": "affecting-pathology", - "metadata": {}, - "source": [ - "Now we can run the simulation like this:" - ] - }, { "cell_type": "code", - "execution_count": 10, - "id": "stable-lying", + "execution_count": 55, + "id": "moved-present", "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "-47 meter" + ], + "text/latex": [ + "$-47\\ \\mathrm{meter}$" + ], "text/plain": [ - "'A termination event occurred.'" + "-47 " ] }, - "execution_count": 10, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "id": "separated-colleague", - "metadata": {}, - "source": [ - "### Plotting" - ] - }, - { - "cell_type": "markdown", - "id": "satisfied-camel", - "metadata": {}, - "source": [ - "Plotting `theta`" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "excited-marshall", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_theta(results):\n", - " results.theta.plot(color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "id": "legislative-sixth", - "metadata": {}, - "source": [ - "Plotting `y`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "plastic-operations", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_y(results):\n", - " results.y.plot(color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" + "event_func(0, system.init, system)" ] }, { "cell_type": "markdown", - "id": "enclosed-stand", + "id": "affecting-pathology", "metadata": {}, "source": [ - "Plotting `r`" + "Now we can run the simulation like this:" ] }, { "cell_type": "code", - "execution_count": 13, - "id": "pleased-edward", + "execution_count": 56, + "id": "stable-lying", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", "text/plain": [ - "
    " + "'A termination event occurred.'" ] }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "def plot_r(results):\n", - " results.r.plot(color='C2', label='r')\n", + "from modsim import run_solve_ivp\n", "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Radius (m)')\n", - " \n", - "plot_r(results)" + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" ] }, { "cell_type": "markdown", - "id": "satellite-evans", + "id": "experienced-pathology", "metadata": {}, "source": [ - " `theta` grows linearly over time, as we should expect. As a result, `r` also grows linearly. But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope.\n", - "\n", - "Because this system is so simple, it is almost silly to simulate it. As we'll see in the next section, it is easy enough to solve the\n", - "differential equations analytically. But it is often useful to start\n", - "with a simple simulation as a way of exploring and checking assumptions." + "Here are the last few time steps." ] }, { "cell_type": "code", - "execution_count": 14, - "id": "quantitative-student", + "execution_count": 64, + "id": "careful-bahrain", "metadata": {}, "outputs": [ { @@ -567,49 +504,49 @@ " \n", " \n", " \n", - " 125.082541\n", - " 1250.825413\n", - " 46.862152\n", - " 0.054930\n", + " 3.843556\n", + " 1153.066667\n", + " 41.625707\n", + " 0.0522\n", " \n", " \n", - " 125.145239\n", - " 1251.452393\n", - " 46.896598\n", - " 0.054947\n", + " 3.927111\n", + " 1178.133333\n", + " 42.942960\n", + " 0.0529\n", " \n", " \n", - " 125.207937\n", - " 1252.079373\n", - " 46.931054\n", - " 0.054965\n", + " 4.010667\n", + " 1203.200000\n", + " 44.277760\n", + " 0.0536\n", " \n", " \n", - " 125.270635\n", - " 1252.706353\n", - " 46.965522\n", - " 0.054982\n", + " 4.094222\n", + " 1228.266667\n", + " 45.630107\n", + " 0.0543\n", " \n", " \n", - " 125.333333\n", + " 4.177778\n", " 1253.333333\n", " 47.000000\n", - " 0.055000\n", + " 0.0550\n", " \n", " \n", "\n", "" ], "text/plain": [ - " theta y r\n", - "125.082541 1250.825413 46.862152 0.054930\n", - "125.145239 1251.452393 46.896598 0.054947\n", - "125.207937 1252.079373 46.931054 0.054965\n", - "125.270635 1252.706353 46.965522 0.054982\n", - "125.333333 1253.333333 47.000000 0.055000" + " theta y r\n", + "3.843556 1153.066667 41.625707 0.0522\n", + "3.927111 1178.133333 42.942960 0.0529\n", + "4.010667 1203.200000 44.277760 0.0536\n", + "4.094222 1228.266667 45.630107 0.0543\n", + "4.177778 1253.333333 47.000000 0.0550" ] }, - "execution_count": 14, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -620,37 +557,36 @@ }, { "cell_type": "markdown", - "id": "potential-strength", + "id": "underlying-variance", "metadata": {}, "source": [ - "The elapsed time is about 2 minutes, which is plausible." + "At $\\omega = 300$ rad/s, the time it takes to complete one roll is about 4.2 seconds, which is consistent with what we see in the video." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "systematic-differential", + "execution_count": 65, + "id": "individual-patrick", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "2.08888888888889" + "4.177777777777778" ] }, - "execution_count": 15, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "t_final = results.index[-1]\n", - "t_final / 60" + "results.index[-1]" ] }, { "cell_type": "markdown", - "id": "incident-delight", + "id": "informative-porter", "metadata": {}, "source": [ "The final value of `y` is 47 meters, as expected." @@ -658,29 +594,26 @@ }, { "cell_type": "code", - "execution_count": 51, - "id": "suffering-directory", + "execution_count": 19, + "id": "indian-skirt", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(47.0, 47)" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "47.0 47 meter\n" + ] } ], "source": [ "final_state = results.iloc[-1] \n", - "final_state.y, params.L" + "print(final_state.y, params.L)" ] }, { "cell_type": "markdown", - "id": "nasty-triple", + "id": "running-tutorial", "metadata": {}, "source": [ "The final value of radius is `Rmax`." @@ -688,28 +621,25 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "cutting-proceeding", + "execution_count": 20, + "id": "higher-conflict", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "(0.05500000000000002, 0.055)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "0.05500000000000002 0.055 meter\n" + ] } ], "source": [ - "final_state.r, params.Rmax" + "print(final_state.r, params.Rmax)" ] }, { "cell_type": "markdown", - "id": "charitable-mystery", + "id": "tamil-referral", "metadata": {}, "source": [ "And the total number of rotations is close to 200, which seems plausible." @@ -717,8 +647,8 @@ }, { "cell_type": "code", - "execution_count": 52, - "id": "removable-brother", + "execution_count": 21, + "id": "employed-ordinary", "metadata": {}, "outputs": [ { @@ -727,7 +657,7 @@ "199.47419534184226" ] }, - "execution_count": 52, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -740,62 +670,31 @@ }, { "cell_type": "markdown", - "id": "continued-angel", + "id": "otherwise-mississippi", "metadata": {}, "source": [ - "## Animation\n", - "\n", - "Here's a draw function that animates the results using `matplotlib` patches." + "As an exercise, we'll see how fast the paper is moving. But first, let's take a closer look at the results." ] }, { - "cell_type": "code", - "execution_count": 46, - "id": "confused-preview", + "cell_type": "markdown", + "id": "lesser-consumer", "metadata": {}, - "outputs": [], "source": [ - "from matplotlib.patches import Circle, Arrow\n", - "from matplotlib.pyplot import gca, axis\n", - "from modsim import pol2cart\n", + "## Plotting\n", "\n", - "def draw_func(t, state):\n", - " # get radius in mm\n", - " theta, y, r = state\n", - " radius = r\n", - " \n", - " # draw the paper\n", - " circle = Circle([0, 0], radius)\n", - " gca().add_patch(circle)\n", - " \n", - " # draw the core\n", - " core = Circle([0, 0], params.Rmin, color='0.9')\n", - " gca().add_patch(core)\n", - " \n", - " # draw the perimeter\n", - " core = Circle([0, 0], params.Rmax, \n", - " color='0.7', fill=False)\n", - " gca().add_patch(core)\n", - " \n", - " # draw an arrow to show rotation\n", - " dx, dy = pol2cart(theta, radius)\n", - " arrow = Arrow(0, 0, dx, dy, color='C1', width=0.01)\n", - " gca().add_patch(arrow)\n", - "\n", - " # make the aspect ratio 1\n", - " decorate(xlim=[-0.1, 0.1],\n", - " ylim=[-0.07, 0.07])" + "Here's what `theta` looks like over time." ] }, { "cell_type": "code", - "execution_count": 47, - "id": "naughty-tenant", + "execution_count": 66, + "id": "included-schema", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -807,18 +706,35 @@ } ], "source": [ - "draw_func(0, system.init)" + "from modsim import decorate\n", + "\n", + "def plot_theta(results):\n", + " results.theta.plot(color='C0', label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "id": "regulation-runner", + "metadata": {}, + "source": [ + "`theta` grows linearly, as we should expect with constant angular velocity.\n", + "\n", + "Here's what `r` looks like over time." ] }, { "cell_type": "code", - "execution_count": 48, - "id": "distant-nancy", + "execution_count": 67, + "id": "persistent-siemens", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -830,20 +746,34 @@ } ], "source": [ - "draw_func(t_final, final_state)" + "def plot_r(results):\n", + " results.r.plot(color='C2', label='r')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Radius (m)')\n", + " \n", + "plot_r(results)" + ] + }, + { + "cell_type": "markdown", + "id": "dedicated-tuning", + "metadata": {}, + "source": [ + "`r` also increases linearly.\n", + "\n", + "But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope." ] }, { "cell_type": "code", - "execution_count": 50, - "id": "identical-expense", - "metadata": { - "scrolled": true - }, + "execution_count": 68, + "id": "contrary-typing", + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -855,22 +785,29 @@ } ], "source": [ - "from modsim import animate\n", + "def plot_y(results):\n", + " results.y.plot(color='C1', label='y')\n", "\n", - "# animate(results, draw_func)" + " decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')\n", + " \n", + "plot_y(results)" ] }, { "cell_type": "markdown", - "id": "contained-taiwan", + "id": "furnished-executive", "metadata": {}, "source": [ - "Now that we have a working simulation, it is also useful to do some analysis." + "Because this system is so simple, it is almost silly to simulate it; as we'll see in the next section, it is easy enough to solve the\n", + "differential equations analytically. \n", + "\n", + "However, it is often useful to start with simulation as a way of exploring and checking assumptions." ] }, { "cell_type": "markdown", - "id": "electric-longer", + "id": "better-asbestos", "metadata": {}, "source": [ "## Analysis\n", @@ -881,17 +818,17 @@ "\n", "We can find $\\theta$ as a function of time by integrating both sides:\n", "\n", - "$$\\theta(t) = \\omega t + C_1$$ \n", + "$$\\theta(t) = \\omega t$$ \n", "\n", - "With the initial condition $\\theta(0)=0$, we find $C_1=0$. Similarly,\n", + "Similarly, we can solve this equation\n", "\n", "$$\\frac{dr}{dt} = k \\omega$$ \n", "\n", - "So\n", + "to find\n", "\n", - "$$r(t) = k \\omega t + C_2$$ \n", + "$$r(t) = k \\omega t + R_{min}$$ \n", "\n", - "With the initial condition $r(0)=R_{min}$, we find $C_2=R_{min}$. Then we can plug the solution for $r$ into the equation for $y$: \n", + "Then we can plug the solution for $r$ into the equation for $y$: \n", "\n", "$$\\begin{aligned}\n", "\\frac{dy}{dt} & = r \\omega \\\\\n", @@ -899,10 +836,16 @@ " \n", "Integrating both sides yields:\n", "\n", - "$$y(t) = \\left[ k \\omega t^2 / 2 + R_{min} t \\right] \\omega + C_3$$ \n", - "\n", - "So $y$ is a parabola, as you might have guessed. With initial condition $y(0)=0$, we find $C_3=0$.\n", + "$$y(t) = \\left[ k \\omega t^2 / 2 + R_{min} t \\right] \\omega$$ \n", "\n", + "So $y$ is a parabola, as you might have guessed." + ] + }, + { + "cell_type": "markdown", + "id": "meaningful-kazakhstan", + "metadata": {}, + "source": [ "We can also use these equations to find the relationship between $y$ and $r$, independent of time, which we can use to compute $k$. Using a move we saw in Section xxx, I'll divide Equations 1 and\n", "2, yielding\n", "\n", @@ -916,7 +859,11 @@ "\n", "$$r^2 / 2 = k y + C$$ \n", "\n", - "When $y=0$, $r=R_{min}$, so $$C = \\frac{1}{2} R_{min}^2$$ Solving for $y$, we have \n", + "When $y=0$, $r=R_{min}$, so \n", + "\n", + "$$C = \\frac{1}{2} R_{min}^2$$ \n", + "\n", + "Solving for $y$, we have \n", "\n", "$$y = \\frac{1}{2k} (r^2 - R_{min}^2) \\label{eqn3}$$\n", "\n", @@ -928,195 +875,149 @@ "\n", "$$k = \\frac{1}{2L} (R_{max}^2 - R_{min}^2) \\label{eqn4}$$\n", "\n", - "Plugging in the values of the parameters yields `2.8e-5` m/rad, the same as the \"estimate\" we computed in Section xxx. In this case the estimate turns out to be exact." + "Plugging in the values of the parameters yields `2.8e-5` m/rad, the same as the \"estimate\" we computed in Section xxx. " ] }, { - "cell_type": "markdown", - "id": "welcome-organization", + "cell_type": "code", + "execution_count": 72, + "id": "acknowledged-register", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.7925531914893616e-05 meter 2.7925531914893616e-05 meter\n" + ] + } + ], "source": [ - "We can also see the relationship between `y` and `r`, which I derive analytically in the book." + "k = (params.Rmax**2 - params.Rmin**2) / (2 * params.L)\n", + "print(k, system.k)" ] }, { "cell_type": "markdown", - "id": "foreign-needle", + "id": "retired-skill", "metadata": {}, "source": [ - "## Summary" + "In this case the estimate turns out to be exact." ] }, { "cell_type": "markdown", - "id": "hindu-civilization", + "id": "foreign-needle", "metadata": {}, "source": [ - "### Rolling paper\n", - "\n", - "We'll start by loading the units we need." + "## Summary" ] }, { - "cell_type": "code", - "execution_count": 22, - "id": "active-absorption", + "cell_type": "markdown", + "id": "thick-luther", "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'UNITS' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mradian\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mradian\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mm\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmeter\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0ms\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mUNITS\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msecond\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'UNITS' is not defined" - ] - } - ], "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second" + "### Exercises\n", + "\n", + "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. We can use `gradient` to estimate the derivative of `results.y`." ] }, { - "cell_type": "markdown", - "id": "fancy-floating", + "cell_type": "code", + "execution_count": 73, + "id": "cardiac-hospital", "metadata": {}, + "outputs": [], "source": [ - "And creating a `Params` object with the system parameters" + "# Solution\n", + "\n", + "from modsim import gradient\n", + "\n", + "dydt = gradient(results.y);" ] }, { "cell_type": "code", - "execution_count": null, - "id": "british-method", + "execution_count": 90, + "id": "welsh-charleston", "metadata": {}, - "outputs": [], - "source": [ - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " L = 47 * m,\n", - " omega = 10 * radian / s,\n", - " t_end = 130 * s,\n", - " dt = 1*s)" - ] - }, - { - "cell_type": "markdown", - "id": "governing-paraguay", - "metadata": {}, - "source": [ - "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "spread-fabric", - "metadata": {}, - "outputs": [], - "source": [ - "def estimate_k(params):\n", - " \"\"\"Estimates the parameter `k`.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: k in meters per radian\n", - " \"\"\"\n", - " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", - " \n", - " Ravg = (Rmax + Rmin) / 2\n", - " Cavg = 2 * pi * Ravg\n", - " revs = L / Cavg\n", - " rads = 2 * pi * revs\n", - " k = (Rmax - Rmin) / rads\n", - " return k" - ] - }, - { - "cell_type": "markdown", - "id": "plain-chambers", - "metadata": {}, - "source": [ - "As usual, `make_system` takes a `Params` object and returns a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "tutorial-direction", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: System with init, k, and ts\n", - " \"\"\"\n", - " init = State(theta = 0 * radian,\n", - " y = 0 * m,\n", - " r = params.Rmin)\n", - " \n", - " k = estimate_k(params)\n", + "# Solution\n", "\n", - " return System(params, init=init, k=k)" + "dydt.plot(label='dydt')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Linear velocity (m/s)')" ] }, { "cell_type": "markdown", - "id": "separate-flexibility", + "id": "becoming-birthday", "metadata": {}, "source": [ - "Testing `make_system`" + "With constant angular velocity, linear velocity is increasing, reaching its maximum at the end." ] }, { "cell_type": "code", - "execution_count": null, - "id": "latter-retention", + "execution_count": 92, + "id": "informational-washer", "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "aggressive-bikini", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "16.394999999999992" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "system.init" + "max_linear_velocity = dydt.iloc[-1]\n", + "max_linear_velocity" ] }, { "cell_type": "markdown", - "id": "processed-archive", + "id": "bizarre-variation", "metadata": {}, "source": [ - "Now we can write a slope function based on the differential equations\n", + "Now suppose this peak velocity is the limiting factor; that is, we can't move the paper any faster than that.\n", "\n", - "$\\omega = \\frac{d\\theta}{dt} = 10$\n", + "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", "\n", - "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", + "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", "\n", - "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" + "Run the simulation and see how much faster we could finish rolling the paper." ] }, { "cell_type": "code", - "execution_count": null, - "id": "unable-track", + "execution_count": 93, + "id": "excellent-japanese", "metadata": {}, "outputs": [], "source": [ - "def slope_func(state, t, system):\n", + "# Solution\n", + "\n", + "def slope_func(t, state, system):\n", " \"\"\"Computes the derivatives of the state variables.\n", " \n", " state: State object with theta, y, r\n", @@ -1128,245 +1029,167 @@ " theta, y, r = state\n", " k, omega = system.k, system.omega\n", " \n", - " dydt = r * omega\n", + " dydt = system.linear_velocity\n", + " omega = dydt / r\n", " drdt = k * omega\n", " \n", " return omega, dydt, drdt" ] }, - { - "cell_type": "markdown", - "id": "behind-aaron", - "metadata": {}, - "source": [ - "Testing `slope_func`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "middle-paint", - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "id": "better-filing", - "metadata": {}, - "source": [ - "We'll use an event function to stop when `y=L`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "numerous-legislature", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Detects when we've rolled length `L`.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with L\n", - " \n", - " returns: difference between `y` and `L`\n", - " \"\"\"\n", - " theta, y, r = state\n", - " \n", - " return y - system.L" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "broad-place", - "metadata": {}, - "outputs": [], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "id": "polished-phrase", - "metadata": {}, - "source": [ - "Now we can run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "monetary-charlotte", - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_solve_ivp(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "id": "religious-conditions", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "markdown", - "id": "lucky-advance", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." - ] - }, - { - "cell_type": "markdown", - "id": "noted-amount", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" - ] - }, { "cell_type": "code", - "execution_count": null, - "id": "given-panic", + "execution_count": 94, + "id": "steady-member", "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "dydt = gradient(results.y);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "foreign-reservation", - "metadata": {}, - "outputs": [], - "source": [ - "plot(dydt, label='dydt')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Linear velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "proof-abraham", - "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(819.7499999999997 ,\n", + " 16.394999999999992,\n", + " 0.02289195478723403 )" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Solution\n", "\n", - "linear_velocity = get_last_value(dydt) * m/s" - ] - }, - { - "cell_type": "markdown", - "id": "advisory-integer", - "metadata": {}, - "source": [ - "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", - "\n", - "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", - "\n", - "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." + "system.linear_velocity = max_linear_velocity\n", + "slope_func(0, system.init, system)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "historic-barrier", + "execution_count": 95, + "id": "applied-sacramento", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Solution\n", "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = linear_velocity\n", - " omega = dydt / r\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" + "results, details = run_solve_ivp(system, slope_func, \n", + " events=event_func)\n", + "details.message" ] }, { "cell_type": "code", - "execution_count": null, - "id": "false-identity", + "execution_count": 96, + "id": "adult-chuck", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "2.8667276608722188" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Solution\n", "\n", - "slope_func(system.init, 0, system)" + "t_final = results.index[-1]\n", + "t_final" ] }, { "cell_type": "code", - "execution_count": null, - "id": "physical-novelty", + "execution_count": 97, + "id": "conditional-cliff", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Solution\n", "\n", - "results, details = run_solve_ivp(system, slope_func, events=event_func)\n", - "details" + "plot_theta(results)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "peaceful-doctor", + "execution_count": 98, + "id": "arranged-queensland", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Solution\n", "\n", - "t_final = get_last_label(results) * s" + "plot_r(results)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "limiting-license", + "execution_count": 99, + "id": "similar-variance", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# Solution\n", "\n", - "plot_three(results)" + "plot_y(results)" ] }, { "cell_type": "code", "execution_count": null, - "id": "least-analysis", + "id": "lovely-orange", "metadata": {}, "outputs": [], "source": [] diff --git a/jupyter/chap25.ipynb b/jupyter/chap25.ipynb new file mode 100644 index 00000000..93578711 --- /dev/null +++ b/jupyter/chap25.ipynb @@ -0,0 +1,1421 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "unauthorized-winter", + "metadata": {}, + "source": [ + "# Chapter 25" + ] + }, + { + "cell_type": "markdown", + "id": "complete-innocent", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "practical-roman", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + " \n", + "try:\n", + " import modsim\n", + "except ImportError:\n", + " !pip install modsimpy" + ] + }, + { + "cell_type": "markdown", + "id": "desirable-jason", + "metadata": {}, + "source": [ + "Intro" + ] + }, + { + "cell_type": "markdown", + "id": "earned-motorcycle", + "metadata": {}, + "source": [ + "In the previous chapter we modeled a scenario with constant angular\n", + "velocity. In this chapter we make it more complex; we'll model a teapot, on a turntable, revolving with constant angular acceleration and deceleration." + ] + }, + { + "cell_type": "markdown", + "id": "together-tobacco", + "metadata": {}, + "source": [ + "## Angular acceleration\n", + "\n", + "Just as linear acceleration is the derivative of velocity, **angular\n", + "acceleration** is the derivative of angular velocity. And just as linear acceleration is caused by force, angular acceleration is caused by the rotational version of force, **torque**. If you are not familiar with torque, you can read about it at .\n", + "\n", + "In general, torque is a vector quantity, defined as the **cross\n", + "product** of $\\vec{r}$ and $\\vec{F}$, where $\\vec{r}$ is the **lever\n", + "arm**, a vector from the point of rotation to the point where the force is applied, and $\\vec{F}$ is the vector that represents the magnitude and direction of the force." + ] + }, + { + "cell_type": "markdown", + "id": "promotional-trigger", + "metadata": {}, + "source": [ + "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute \n", + "\n", + "$$\\tau = r F \\sin \\theta$$ \n", + "\n", + "where $\\tau$ is torque, $r$ is the length of the lever arm, $F$ is the magnitude of force, and $\\theta$ is the angle between $\\vec{r}$ and $\\vec{F}$.\n", + "\n", + "Since torque is the product of a length and a force, it is expressed in newton meters (Nm)." + ] + }, + { + "cell_type": "markdown", + "id": "infrared-summit", + "metadata": {}, + "source": [ + "## Moment of inertia\n", + "\n", + "In the same way that linear acceleration is related to force by Newton's second law of motion, $F=ma$, angular acceleration is related to torque by another form of Newton's law: \n", + "\n", + "$$\\tau = I \\alpha$$ \n", + "\n", + "where $\\alpha$ is angular acceleration and $I$ is **moment of inertia**. Just as mass is what makes it hard to accelerate an object, moment of inertia is what makes it hard to spin an object.\n", + "(That might sound like a dumb way to describe mass, but might actually be the most fundamental definition.)\n", + "\n", + "In the most general case, a 3-D object rotating around an arbitrary\n", + "axis, moment of inertia is a tensor, which is a function that takes a\n", + "vector as a parameter and returns a vector as a result.\n", + "\n", + "Fortunately, in a system where all rotation and torque happens around a single axis, we don't have to deal with the most general case. We can treat moment of inertia as a scalar quantity.\n", + "\n", + "For a small object with mass $m$, rotating around a point at distance\n", + "$r$, the moment of inertia is $I = m r^2$. For more complex objects, we can compute $I$ by dividing the object into small masses, computing\n", + "moments of inertia for each mass, and adding them up.\n", + "\n", + "However, for most simple shapes, people have already done the\n", + "calculations; you can just look up the answers. For example, see\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "julian-klein", + "metadata": {}, + "source": [ + "## Teapots and turntables\n", + "\n", + "Tables in Chinese restaurants often have a rotating tray or turntable\n", + "that makes it easy for customers to share dishes. These turntables are\n", + "supported by low-friction bearings that allow them to turn easily and\n", + "glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", + "\n", + "Suppose I am sitting at a table with a pot of tea on the turntable\n", + "directly in front of me, and the person sitting directly opposite asks\n", + "me to pass the tea. I push on the edge of the turntable with 1 N of\n", + "force until it has turned 0.5 rad, then let go. The turntable glides\n", + "until it comes to a stop 1.5 rad from the starting position. How much\n", + "force should I apply for a second push so the teapot glides to a stop\n", + "directly opposite me?\n", + "\n", + "We'll answer this question in these steps:\n", + "\n", + "1. I'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", + "\n", + "2. As an exercise, you'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", + "\n", + "Our simulation will use the following parameters:\n", + "\n", + "1. The radius of the turntable is 0.5 m, and its weight is 7 kg.\n", + "\n", + "2. The teapot weights 0.3 kg, and it sits 0.4 m from the center of the turntable.\n", + "\n", + "![Diagram of a turntable with a\n", + "teapot.](figs/teapot.pdf){height=\"2.5in\"}\n", + "\n", + "This figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", + "\n", + "Here's a `Params` object with the parameters of the scenario:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cathedral-lithuania", + "metadata": {}, + "outputs": [], + "source": [ + "import pint\n", + "\n", + "units = pint.UnitRegistry()\n", + "rad = units.radian\n", + "m = units.meter\n", + "s = units.second\n", + "kg = units.kilogram\n", + "N = units.newton" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "enclosed-happiness", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import Params\n", + "from numpy import pi\n", + "\n", + "params = Params(radius_disk=0.5, # m\n", + " mass_disk=7, # kg\n", + " radius_pot=0.4, # m\n", + " mass_pot=0.3, # kg\n", + " force=1, # N\n", + " torque_friction=0.2, # N*m\n", + " theta_0=0, # radian\n", + " theta_push=0.5, # radian\n", + " theta_test=1.5, # radian\n", + " theta_target=pi, # radian\n", + " t_end=20 # s\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "robust-adrian", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import Params\n", + "from numpy import pi\n", + "\n", + "params = Params(radius_disk = 0.5*m,\n", + " mass_disk = 7*kg,\n", + " radius_pot = 0.4*m,\n", + " mass_pot = 0.3*kg,\n", + " force = 1*N,\n", + " torque_friction = 0.2*N*m,\n", + " theta_0 = 0*rad,\n", + " omega_0 = 0*rad/s,\n", + " theta_push = 0.5*rad,\n", + " theta_test = 1.5*rad,\n", + " theta_target = pi*rad,\n", + " t_end = 20*s)" + ] + }, + { + "cell_type": "markdown", + "id": "second-leather", + "metadata": {}, + "source": [ + "`make_system` creates the initial state, `init`, and computes the total\n", + "moment of inertia for the turntable and the teapot." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "acoustic-furniture", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import State, System\n", + "\n", + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", + " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", + " \n", + " init = State(theta=params.theta_0, omega=params.omega_0)\n", + " \n", + " I_disk = mass_disk * radius_disk**2 / 2\n", + " I_pot = mass_pot * radius_pot**2\n", + " \n", + " return System(params, \n", + " init=init, \n", + " I=I_disk+I_pot,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "convenient-control", + "metadata": {}, + "source": [ + "In the initial state, `theta` represents the angle of the table in rad;\n", + "`omega` represents the angular velocity in rad/s.\n", + "\n", + "`I_disk` is the moment of inertia of the turntable, which is based on\n", + "the moment of inertia for a horizontal disk revolving around a vertical axis through its center: \n", + "\n", + "$$I_{disk} = m r^2 / 2$$ \n", + "\n", + "`I_pot` is the moment\n", + "of inertia of the teapot, which I treat as a point mass with:\n", + "\n", + "$$I_{point} = m r^2$$ \n", + "\n", + "In SI units, moment of inertia is expressed in kg m$^2$.\n", + "\n", + "Now we can make a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "objective-station", + "metadata": {}, + "outputs": [], + "source": [ + "system1 = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "id": "crucial-recognition", + "metadata": {}, + "source": [ + "Here's a slope that takes the current state, which contains angle and\n", + "angular velocity, and returns the derivatives, angular velocity and\n", + "angular acceleration:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ranking-local", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " theta, omega = state\n", + " radius_disk, force = system.radius_disk, system.force\n", + " torque_friction, I = system.torque_friction, system.I\n", + " \n", + " torque = radius_disk * force - torque_friction\n", + " alpha = torque / I\n", + " \n", + " return omega, alpha " + ] + }, + { + "cell_type": "markdown", + "id": "exposed-court", + "metadata": {}, + "source": [ + "In this scenario, the force I apply to the turntable is always\n", + "perpendicular to the lever arm, so $\\sin \\theta = 1$ and the torque due\n", + "to force is $\\tau = r F$.\n", + "\n", + "`torque_friction` represents the torque due to friction. Because the\n", + "turntable is rotating in the direction of positive `theta`, friction\n", + "acts in the direction of negative `theta`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "saved-purple", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.0 ,\n", + " 0.32502708559046584 )" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slope_func(0, system1.init, system1)" + ] + }, + { + "cell_type": "markdown", + "id": "decent-microwave", + "metadata": {}, + "source": [ + "We are almost ready to run the simulation, but first there's a problem we have to address.\n", + "\n", + "When I stop pushing on the turntable, the angular acceleration changes\n", + "abruptly. We could implement the slope function with an `if` statement\n", + "that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more\n", + "accurate results if we simulate the system in two phases:\n", + "\n", + "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", + "\n", + "2. During the second phase, force is 0, and we run until `omega` is 0.\n", + "\n", + "Then we can combine the results of the two phases into a single\n", + "`TimeFrame`.\n", + "\n", + "Here's the event function I'll use for Phase 1; it stops the simulation when `theta` reaches `theta_end`, which is when I stop pushing:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "black-wichita", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func1(t, state, system):\n", + " \"\"\"Stops when theta reaches theta_push.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: difference from target\n", + " \"\"\"\n", + " theta, omega = state\n", + " return theta - system.theta_push" + ] + }, + { + "cell_type": "markdown", + "id": "separate-college", + "metadata": {}, + "source": [ + "As usual, we'll test the event function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ranking-google", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "-0.5 radian" + ], + "text/latex": [ + "$-0.5\\ \\mathrm{radian}$" + ], + "text/plain": [ + "-0.5 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "event_func1(0, system1.init, system1)" + ] + }, + { + "cell_type": "markdown", + "id": "reduced-sharp", + "metadata": {}, + "source": [ + "Now we can run the first phase of the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "meaning-philosophy", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from modsim import run_solve_ivp\n", + "\n", + "results1, details1 = run_solve_ivp(system1, slope_func,\n", + " events=event_func1)\n", + "details1.message" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "focused-invention", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    thetaomega
    1.6137200.42320.524503
    1.6488000.44180.535905
    1.6838810.46080.547307
    1.7189620.48020.558709
    1.7540430.50000.570111
    \n", + "
    " + ], + "text/plain": [ + " theta omega\n", + "1.613720 0.4232 0.524503\n", + "1.648800 0.4418 0.535905\n", + "1.683881 0.4608 0.547307\n", + "1.718962 0.4802 0.558709\n", + "1.754043 0.5000 0.570111" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results1.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "willing-receipt", + "metadata": {}, + "source": [ + "\n", + "\n", + "Before we run the second phase, we have to extract the final time and\n", + "state of the first phase." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "russian-experience", + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = results1.index[-1]\n", + "init2 = results1.iloc[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "aware-generator", + "metadata": {}, + "source": [ + "Now we can make a `System` object for Phase 2, with the initial state\n", + "from Phase 1, and with `force=0`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "chinese-cover", + "metadata": {}, + "outputs": [], + "source": [ + "system2 = System(system1, t_0=t_0, init=init2, force=0)" + ] + }, + { + "cell_type": "markdown", + "id": "actual-monaco", + "metadata": {}, + "source": [ + "For the second phase, we need an event function that stops when the\n", + "turntable stops; that is, when angular velocity is 0." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "recovered-section", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func2(t, state, system):\n", + " \"\"\"Stops when omega is 0.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: omega\n", + " \"\"\"\n", + " theta, omega = state\n", + " return omega" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "corporate-taste", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.5701114676889649" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "event_func2(system2.t_0, system2.init, system2)" + ] + }, + { + "cell_type": "markdown", + "id": "administrative-major", + "metadata": {}, + "source": [ + "Now we can run the second phase." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "destroyed-adrian", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'A termination event occurred.'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results2, details2 = run_solve_ivp(system2, slope_func,\n", + " events=event_func2)\n", + "details2.message" + ] + }, + { + "cell_type": "markdown", + "id": "hindu-requirement", + "metadata": {}, + "source": [ + "Pandas provides `combine_first`, which combines `results1` and\n", + "`results2`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "frank-scene", + "metadata": {}, + "outputs": [], + "source": [ + "results = results1.combine_first(results2)" + ] + }, + { + "cell_type": "markdown", + "id": "metropolitan-roommate", + "metadata": {}, + "source": [ + "Now we can plot `theta` for both phases." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "distributed-humanitarian", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import decorate\n", + "\n", + "def plot_theta(results):\n", + " results.theta.plot(label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "id": "excess-confidence", + "metadata": {}, + "source": [ + "And `omega`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "proved-surfing", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def plot_omega(results):\n", + " results.omega.plot(label='omega', color='C1')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')\n", + " \n", + "plot_omega(results)" + ] + }, + { + "cell_type": "markdown", + "id": "handy-frontier", + "metadata": {}, + "source": [ + "Angular velocity, `omega`, increases linearly while I am pushing, and decreases linearly after I let go. The angle, `theta`, is the integral of angular velocity, so it forms a parabola during each phase.\n", + "\n", + "In the next section, we'll use this simulation to estimate the torque\n", + "due to friction." + ] + }, + { + "cell_type": "markdown", + "id": "careful-minneapolis", + "metadata": {}, + "source": [ + "## Estimating friction\n", + "\n", + "Let's take the code from the previous section and wrap it in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "constant-wallace", + "metadata": {}, + "outputs": [], + "source": [ + "def run_two_phases(force, torque_friction, params):\n", + " \"\"\"Run both phases.\n", + " \n", + " force: force applied to the turntable\n", + " torque_friction: friction due to torque\n", + " params: Params object\n", + " \n", + " returns: TimeFrame of simulation results\n", + " \"\"\"\n", + " # put the specified parameters into the Params object\n", + " params = Params(params, \n", + " force=force, \n", + " torque_friction=torque_friction)\n", + "\n", + " # run phase 1\n", + " system1 = make_system(params)\n", + " results1, details1 = run_solve_ivp(system1, slope_func, \n", + " events=event_func1)\n", + "\n", + " # get the final state from phase 1\n", + " t_0 = results1.index[-1]\n", + " init2 = results1.iloc[-1]\n", + " \n", + " # run phase 2\n", + " system2 = System(system1, t_0=t_0, init=init2, force=0)\n", + " results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func2)\n", + " \n", + " # combine and return the results\n", + " results = results1.combine_first(results2)\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "positive-possible", + "metadata": {}, + "source": [ + "Let's test it with the same parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "played-ranking", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    thetaomega
    4.1746221.24524.560892e-02
    4.2272441.24733.420669e-02
    4.2798651.24882.280446e-02
    4.3324861.24971.140223e-02
    4.3851071.25002.775558e-16
    \n", + "
    " + ], + "text/plain": [ + " theta omega\n", + "4.174622 1.2452 4.560892e-02\n", + "4.227244 1.2473 3.420669e-02\n", + "4.279865 1.2488 2.280446e-02\n", + "4.332486 1.2497 1.140223e-02\n", + "4.385107 1.2500 2.775558e-16" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "force = 1\n", + "torque_friction = 0.2\n", + "results = run_two_phases(params.force, params.torque_friction, params)\n", + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "damaged-concert", + "metadata": {}, + "source": [ + "And check the results." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "bulgarian-halloween", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.2499999999999993" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "theta_final = results.iloc[-1].theta\n", + "theta_final" + ] + }, + { + "cell_type": "markdown", + "id": "electronic-latin", + "metadata": {}, + "source": [ + "We can use `run_two_phases` to write an error function we can use, with\n", + "`root_bisect`, to find the torque due to friction that yields the\n", + "observed results from the first push, a total rotation of 1.5 rad." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "skilled-diving", + "metadata": {}, + "outputs": [], + "source": [ + "def error_func1(torque_friction, params):\n", + " \"\"\"Error function for root_scalar.\n", + " \n", + " torque_friction: hypothetical value\n", + " params: Params object\n", + " \n", + " returns: offset from target value\n", + " \"\"\"\n", + " force = 1\n", + " results = run_two_phases(force, torque_friction, params)\n", + " theta_final = results.iloc[-1].theta\n", + " print(torque_friction, theta_final)\n", + " return theta_final - params.theta_test" + ] + }, + { + "cell_type": "markdown", + "id": "generous-parcel", + "metadata": {}, + "source": [ + "Testing the error function." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "united-ranch", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1 2.5000000000000018\n" + ] + }, + { + "data": { + "text/html": [ + "1.0000000000000018 radian" + ], + "text/latex": [ + "$1.0000000000000018\\ \\mathrm{radian}$" + ], + "text/plain": [ + "1.0000000000000018 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "guess1 = 0.1\n", + "error_func1(guess1, params)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "rotary-brazilian", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.2 1.2499999999999993\n" + ] + }, + { + "data": { + "text/html": [ + "-0.25000000000000067 radian" + ], + "text/latex": [ + "$-0.25000000000000067\\ \\mathrm{radian}$" + ], + "text/plain": [ + "-0.25000000000000067 " + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "guess2 = 0.2\n", + "error_func1(guess2, params)" + ] + }, + { + "cell_type": "markdown", + "id": "comparable-physiology", + "metadata": {}, + "source": [ + "And running `root_scalar`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "hungarian-cattle", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.1 2.5000000000000018\n", + "0.2 1.2499999999999993\n", + "0.18 1.388888888888888\n", + "0.16559999999999983 1.5096618357487925\n", + "0.16675199999999987 1.4992323930147764\n", + "0.16666721279999988 1.4999950848161059\n", + "0.16666666666487695 1.5000000000161076\n", + "0.16666666666666669 1.5000000000000002\n", + "0.16666666666766675 1.4999999999909974\n" + ] + } + ], + "source": [ + "from scipy.optimize import root_scalar\n", + "\n", + "res = root_scalar(error_func1, params, bracket=[guess1, guess2])" + ] + }, + { + "cell_type": "markdown", + "id": "abandoned-remedy", + "metadata": {}, + "source": [ + "The result is 0.166 Nm, a little less than the initial guess." + ] + }, + { + "cell_type": "markdown", + "id": "knowing-sleeve", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "\n", + "Here's a draw function we can use to animate the results." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "funky-affect", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Circle, Arrow\n", + "from matplotlib.pyplot import gca, axis\n", + "from modsim import pol2cart\n", + "\n", + "def draw_func(t, state, params):\n", + " theta, omega = state\n", + " \n", + " # draw a circle for the table\n", + " circle1 = Circle([0, 0], params.radius_disk)\n", + " gca().add_patch(circle1)\n", + " \n", + " # draw a circle for the teapot\n", + " center = pol2cart(theta, params.radius_pot)\n", + " circle2 = Circle(center, 0.05, color='C1')\n", + " gca().add_patch(circle2)\n", + "\n", + " axis('equal')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "gentle-transmission", + "metadata": {}, + "outputs": [], + "source": [ + "from modsim import remove_units\n", + "\n", + "params_no_unit = remove_units(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "illegal-remainder", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "state = results.iloc[0]\n", + "draw_func(0, state, params_no_unit)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "toxic-shark", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from modsim import animate\n", + "\n", + "animate(results, draw_func, params_no_unit)" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-shade", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "professional-modem", + "metadata": {}, + "source": [ + "Now that we know the torque due to friction, we can compute the force\n", + "needed to rotate the turntable through the remaining angle, that is,\n", + "from 1.5 rad to 3.14 rad.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "practical-cabinet", + "metadata": {}, + "source": [ + "\n", + "### Exercises\n", + "\n", + "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", + "\n", + "Write an error function that takes `force` and `params` and returns the offset from the desired angle." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "apparent-lancaster", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution\n", + "\n", + "def error_func2(force, params):\n", + " \"\"\"Error function for root_scalar.\n", + " \n", + " force: hypothetical value\n", + " params: Params object\n", + " \n", + " returns: offset from target value\n", + " \"\"\"\n", + " results = run_two_phases(force, params.torque_friction, params)\n", + " theta_final = results.iloc[-1].theta\n", + " print(force, theta_final)\n", + " remaining_angle = params.theta_target - params.theta_test\n", + " return theta_final - remaining_angle" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "persistent-rings", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0 1.2499999999999993\n" + ] + }, + { + "data": { + "text/html": [ + "-0.3915926535897938 radian" + ], + "text/latex": [ + "$-0.3915926535897938\\ \\mathrm{radian}$" + ], + "text/plain": [ + "-0.3915926535897938 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "guess1 = 1.0\n", + "params2 = params.set(torque_friction=torque_friction)\n", + "error_func2(guess1, params)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "previous-pittsburgh", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.0 2.50000000000001\n" + ] + }, + { + "data": { + "text/html": [ + "0.8584073464102171 radian" + ], + "text/latex": [ + "$0.8584073464102171\\ \\mathrm{radian}$" + ], + "text/plain": [ + "0.8584073464102171 " + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "guess2 = 2.0\n", + "error_func2(guess2, params)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "governing-component", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0 1.2499999999999993\n", + "2.0 2.50000000000001\n", + "1.3132741228718323 1.64159265358979\n", + "1.3132741228728328 1.6415926535910412\n" + ] + } + ], + "source": [ + "# Solution\n", + "\n", + "res = root_scalar(error_func2, params, bracket=[guess1, guess2])" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "statistical-behalf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.14159265358979" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "force = res.root\n", + "results = run_two_phases(force, params.torque_friction, params)\n", + "theta_final = results.iloc[-1].theta\n", + "theta_final + 1.5" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "unauthorized-equity", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/jupyter/modsim.py b/jupyter/modsim.py index 894cabe3..b59bd97c 100644 --- a/jupyter/modsim.py +++ b/jupyter/modsim.py @@ -32,10 +32,10 @@ from types import SimpleNamespace from copy import copy -#import pint +import pint -#units = pint.UnitRegistry() -#Quantity = units.Quantity +units = pint.UnitRegistry() +Quantity = units.Quantity def flip(p=0.5): @@ -305,60 +305,6 @@ def minimize_powell(min_func, x0, *args, **options): maximize = maximize_golden -def run_odeint(system, slope_func, **options): - """Integrates an ordinary differential equation. - - `system` should contain system parameters and `ts`, which - is an array or Series that specifies the time when the - solution will be computed. - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # make sure `system` contains `ts` - if not hasattr(system, "ts"): - msg = """It looks like `system` does not contain `ts` - as a system variable. `ts` should be an array - or Series that specifies the times when the - solution will be computed:""" - raise ValueError(msg) - - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # try running the slope function with the initial conditions - try: - slope_func(system.init, system.ts[0], system) - except Exception as e: - msg = """Before running scipy.integrate.odeint, I tried - running the slope function you provided with the - initial conditions in system and t=0, and I got - the following error:""" - logger.error(msg) - raise (e) - - # when odeint calls slope_func, it should pass `system` as - # the third argument. To make that work, we have to make a - # tuple with a single element and pass the tuple to odeint as `args` - args = (system,) - - # now we're ready to run `odeint` with `init` and `ts` from `system` - array = odeint(slope_func, list(system.init), system.ts, args, **options) - - # the return value from odeint is an array, so let's pack it into - # a TimeFrame with appropriate columns and index - frame = TimeFrame( - array, columns=system.init.index, index=system.ts, dtype=np.float64 - ) - return frame - - def run_solve_ivp(system, slope_func, **options): """Computes a numerical solution to a differential equation. @@ -374,6 +320,8 @@ def run_solve_ivp(system, slope_func, **options): returns: TimeFrame """ + system = remove_units(system) + # make sure `system` contains `init` if not hasattr(system, "init"): msg = """It looks like `system` does not contain `init` @@ -740,9 +688,8 @@ def gradient(series, **options): returns: Series, same subclass as series """ - x = magnitudes(series.index) - y = magnitudes(series.values) - # units = get_units(series) + x = series.index + y = series.values a = np.gradient(y, x, **options) return series.__class__(a, series.index) @@ -773,7 +720,6 @@ def underride(d, **options): return d - def contour(df, **options): """Makes a contour plot from a DataFrame. @@ -843,70 +789,6 @@ def remove_from_legend(bad_labels): ax.legend(handle_list, label_list) -def subplot(nrows, ncols, plot_number, **options): - figsize = {(2, 1): (8, 8), (3, 1): (8, 10)} - key = nrows, ncols - default = (8, 5.5) - width, height = figsize.get(key, default) - - plt.subplot(nrows, ncols, plot_number, **options) - fig = plt.gcf() - fig.set_figwidth(width) - fig.set_figheight(height) - - -def TimeSeries(*args, **kwargs): - """ - """ - if args or kwargs: - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Time' - if 'name' not in kwargs: - series.name = 'Quantity' - return series - - -def SweepSeries(*args, **kwargs): - """ - """ - if args or kwargs: - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Parameter' - if 'name' not in kwargs: - series.name = 'Metric' - return series - - -def show(series): - """ - """ - if not isinstance(series, pd.Series): - return series - df = pd.DataFrame(series) - return df - - -def plot(x, y=None, **options): - """ - """ - if y is not None: - plt.plot(x, y, **options) - else: - # x better be a Series - x.plot(**options) - - -def State(**variables): - """Contains the values of state variables.""" - return pd.Series(variables) - - class SettableNamespace(SimpleNamespace): """Contains a collection of parameters. @@ -914,6 +796,12 @@ class SettableNamespace(SimpleNamespace): Takes keyword arguments and stores them as attributes. """ + def __init__(self, namespace=None, **kwargs): + super().__init__() + if namespace: + self.__dict__.update(namespace.__dict__) + self.__dict__.update(kwargs) + def get(self, name, default=None): """Look up a variable. @@ -935,6 +823,46 @@ def set(self, **variables): return new +def magnitude(x): + """Returns the magnitude of a Quantity or number. + + x: Quantity or number + + returns: number + """ + return x.magnitude if hasattr(x, 'magnitude') else x + + +def remove_units(namespace): + """Removes units from the values in a Namespace. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Namespace object + """ + res = copy(namespace) + for label, value in res.__dict__.items(): + if isinstance(value, pd.Series): + value = remove_units_series(value) + res.__dict__[label] = magnitude(value) + return res + + +def remove_units_series(series): + """Removes units from the values in a Series. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Series object + """ + res = copy(series) + for label, value in res.iteritems(): + res[label] = magnitude(value) + return res + + class System(SettableNamespace): """Contains system parameters and their values. @@ -951,6 +879,39 @@ class Params(SettableNamespace): pass +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables) + + +def TimeSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series + + +def SweepSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Parameter' + if 'name' not in kwargs: + series.name = 'Metric' + return series + + def TimeFrame(*args, **kwargs): """DataFrame that maps from time to State. """ @@ -963,6 +924,15 @@ def SweepFrame(*args, **kwargs): return pd.DataFrame(*args, **kwargs) +def Vector(x, y, z=None, **options): + """ + """ + if z is None: + return pd.Series(dict(x=x, y=y), **options) + else: + return pd.Series(dict(x=x, y=y, z=z), **options) + + ## Vector functions (should work with any sequence) def vector_mag(v): @@ -1078,19 +1048,6 @@ def vector_diff_angle(v, w): raise NotImplementedError() -def Vector(x, y, z=None, **options): - """ - """ - if z is None: - return pd.Series(dict(x=x, y=y), **options) - else: - return pd.Series(dict(x=x, y=y, z=z), **options) - -mag = vector_mag -angle = vector_angle -hat = vector_hat - - def plot_segment(A, B, **options): """Plots a line segment between two Vectors. @@ -1105,10 +1062,11 @@ def plot_segment(A, B, **options): ys = A.y, B.y plot(xs, ys, **options) + from time import sleep from IPython.display import clear_output -def animate(results, draw_func, interval=None): +def animate(results, draw_func, *args, interval=None): """Animate results from a simulation. results: TimeFrame @@ -1118,12 +1076,12 @@ def animate(results, draw_func, interval=None): plt.figure() try: for t, state in results.iterrows(): - draw_func(t, state) + draw_func(t, state, *args) plt.show() if interval: sleep(interval) clear_output(wait=True) - draw_func(t, state) + draw_func(t, state, *args) plt.show() except KeyboardInterrupt: pass From 1fa8108b5731986daeb895445ef514f91eb05f6b Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 5 Feb 2021 16:23:42 -0500 Subject: [PATCH 028/144] Adding queue --- book/figs/queue.png | Bin 0 -> 9665 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 book/figs/queue.png diff --git a/book/figs/queue.png b/book/figs/queue.png new file mode 100644 index 0000000000000000000000000000000000000000..1a685e6fa8366184cc08b6b857e11c94c389e01d GIT binary patch literal 9665 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 Kv2qau-~R)NLf)wW literal 0 HcmV?d00001 From 2e049b64202067a37334e1211a723ec5adbddfd3 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 7 Feb 2021 13:54:44 -0500 Subject: [PATCH 029/144] Adding minmod paper --- papers/Bostonetal2003MinModMillenium.pdf | Bin 0 -> 1819085 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 papers/Bostonetal2003MinModMillenium.pdf diff --git a/papers/Bostonetal2003MinModMillenium.pdf b/papers/Bostonetal2003MinModMillenium.pdf new file mode 100644 index 0000000000000000000000000000000000000000..654e82db499b54d61c96fa371111afe676762a39 GIT binary patch literal 1819085 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

    CCBUdb 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 z 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 z

    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

    IEUKrccah@k@<_PFWgH5rnn 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±b@t^Agth*mpCq7C=ej>(HK8@^3!k| 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

    aZeE#NJ=x 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\SRRfec2m$Rb9I^UY(W(Drb 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

    2qu>4}+v9ry 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

  1. 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

    b;kO$+!D$Blbsru2_s*g0 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 aI{-1&|Mfly_(P{;r-vmY6P6Z%{r>=VFA4Vm literal 0 HcmV?d00001 From 6cac03b114a0bf0893aa160048ba6dae460f5f86 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 7 Feb 2021 16:52:41 -0500 Subject: [PATCH 030/144] Adding paper --- papers/pacini1986.pdf | Bin 0 -> 708903 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 papers/pacini1986.pdf diff --git a/papers/pacini1986.pdf b/papers/pacini1986.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f2bc83ad5651cffbbca3157e9ba443c689450797 GIT binary patch literal 708903 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�gD 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

    M2V}IFgcOSf63O;6gr`iN4 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%0ASZ{ zLQzy@Dl1V_98*@5;?R^nNx`e4+vM{StLQ=7U;|Q8ir&$gC3Tr&<;PImTq;^Ih{L*{ z8N>REFA)>HRo(2+$`L+E-ZvOJBkP7aW{*8KXcLMS6l9cZqvSPRU*5zr1fPHIeS;

    km*0Z-H>-p>@avTFj=F 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

    f4V?Fry;hFUOBR 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℘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

    n;^THuDc{@;cYD=IUysf1*AVBPExh_! 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⁣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 Date: Fri, 12 Feb 2021 16:23:44 -0500 Subject: [PATCH 031/144] Removing jupyter directory --- jupyter/chap01.ipynb | 1736 ------------------------------------ jupyter/chap02.ipynb | 1694 ------------------------------------ jupyter/chap03.ipynb | 1075 ----------------------- jupyter/chap04.ipynb | 1208 -------------------------- jupyter/chap05.ipynb | 1455 ------------------------------- jupyter/chap06.ipynb | 785 ----------------- jupyter/chap07.ipynb | 915 ------------------- jupyter/chap08.ipynb | 1037 ---------------------- jupyter/chap09.ipynb | 1378 ----------------------------- jupyter/chap10.ipynb | 656 -------------- jupyter/chap11.ipynb | 918 -------------------- jupyter/chap12.ipynb | 1037 ---------------------- jupyter/chap13.ipynb | 739 ---------------- jupyter/chap14.ipynb | 921 -------------------- jupyter/chap15.ipynb | 1038 ---------------------- jupyter/chap16.ipynb | 793 ----------------- jupyter/chap17.ipynb | 665 -------------- jupyter/chap18.ipynb | 869 ------------------- jupyter/chap20.ipynb | 1108 ----------------------- jupyter/chap21.ipynb | 1119 ------------------------ jupyter/chap22.ipynb | 1978 ------------------------------------------ jupyter/chap23.ipynb | 877 ------------------- jupyter/chap24.ipynb | 1219 -------------------------- jupyter/chap25.ipynb | 1421 ------------------------------ 24 files changed, 26641 deletions(-) delete mode 100644 jupyter/chap01.ipynb delete mode 100644 jupyter/chap02.ipynb delete mode 100644 jupyter/chap03.ipynb delete mode 100644 jupyter/chap04.ipynb delete mode 100644 jupyter/chap05.ipynb delete mode 100644 jupyter/chap06.ipynb delete mode 100644 jupyter/chap07.ipynb delete mode 100644 jupyter/chap08.ipynb delete mode 100644 jupyter/chap09.ipynb delete mode 100644 jupyter/chap10.ipynb delete mode 100644 jupyter/chap11.ipynb delete mode 100644 jupyter/chap12.ipynb delete mode 100644 jupyter/chap13.ipynb delete mode 100644 jupyter/chap14.ipynb delete mode 100644 jupyter/chap15.ipynb delete mode 100644 jupyter/chap16.ipynb delete mode 100644 jupyter/chap17.ipynb delete mode 100644 jupyter/chap18.ipynb delete mode 100644 jupyter/chap20.ipynb delete mode 100644 jupyter/chap21.ipynb delete mode 100644 jupyter/chap22.ipynb delete mode 100644 jupyter/chap23.ipynb delete mode 100644 jupyter/chap24.ipynb delete mode 100644 jupyter/chap25.ipynb diff --git a/jupyter/chap01.ipynb b/jupyter/chap01.ipynb deleted file mode 100644 index c1d987fc..00000000 --- a/jupyter/chap01.ipynb +++ /dev/null @@ -1,1736 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "uniform-persian", - "metadata": {}, - "source": [ - "# Chapter 1" - ] - }, - { - "cell_type": "markdown", - "id": "biblical-enhancement", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "markdown", - "id": "confirmed-budapest", - "metadata": {}, - "source": [ - "## Jupyter\n", - "\n", - "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", - "\n", - "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." - ] - }, - { - "cell_type": "markdown", - "id": "danish-scope", - "metadata": {}, - "source": [ - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "If you run the following cell, it checks whether the libraries you need are installed. If so, the cell produces no output. If not, you'll see updates from the installer." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "asian-america", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " import modsim as ms\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "id": "copyrighted-desperate", - "metadata": {}, - "source": [ - "If the previous cell runs without producing any error messages, you are all set.\n" - ] - }, - { - "cell_type": "markdown", - "id": "hourly-financing", - "metadata": {}, - "source": [ - "## Modeling\n", - "\n", - "This book is about modeling and simulation of physical systems. The\n", - "following diagram shows what I mean by \"modeling\":\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "structured-receiver", - "metadata": {}, - "source": [ - "Starting in the lower left, the **system** is something in the real\n", - "world we are interested in. \n", - "To model the system, we have to decide which elements of the real world to include and which we can leave out.\n", - "This process is called **abstraction**.\n", - "\n", - "The result of abstraction is a **model**, which is a description of the system that includes only the features we think are essential. A model\n", - "can be represented in the form of diagrams and equations, which can be\n", - "used for mathematical **analysis**. It can also be implemented in the\n", - "form of a computer program, which can run **simulations**.\n", - "\n", - "The result of analysis and simulation might be a **prediction** about\n", - "what the system will do, an **explanation** of why it behaves the way it\n", - "does, or a **design** intended to achieve a purpose.\n", - "\n", - "We can **validate** predictions and test designs by taking\n", - "**measurements** from the real world and comparing the **data** we get\n", - "with the results from analysis and simulation." - ] - }, - { - "cell_type": "markdown", - "id": "center-accommodation", - "metadata": {}, - "source": [ - "For any physical system, there are many possible models, each one\n", - "including and excluding different features, or including different\n", - "levels of detail. The goal of the modeling process is to find the model\n", - "best suited to its purpose (prediction, explanation, or design).\n", - "\n", - "Sometimes the best model is the most detailed. If we include more\n", - "features, the model is more realistic, and we expect its predictions to\n", - "be more accurate.\n", - "\n", - "But often a simpler model is better. If we include only the essential\n", - "features and leave out the rest, we get models that are easier to work\n", - "with, and the explanations they provide can be clearer and more\n", - "compelling." - ] - }, - { - "cell_type": "markdown", - "id": "confirmed-highlight", - "metadata": {}, - "source": [ - "As an example, suppose someone asks you why the orbit of the Earth is\n", - "elliptical. If you model the Earth and Sun as point masses (ignoring\n", - "their actual size), compute the gravitational force between them using\n", - "Newton's law of universal gravitation, and compute the resulting orbit\n", - "using Newton's laws of motion, you can show that the result is an\n", - "ellipse.\n", - "\n", - "Of course, the actual orbit of Earth is not a perfect ellipse, because\n", - "of the gravitational forces of the Moon, Jupiter, and other objects in\n", - "the solar system, and because Newton's laws of motion are only\n", - "approximately true (they don't take into account relativistic effects).\n", - "\n", - "But adding these features to the model would not improve the\n", - "explanation; more detail would only be a distraction from the\n", - "fundamental cause. However, if the goal is to predict the position of\n", - "the Earth with great precision, including more details might be\n", - "necessary." - ] - }, - { - "cell_type": "markdown", - "id": "stretch-geneva", - "metadata": {}, - "source": [ - "Choosing the best model depends on what the model is for. It is usually\n", - "a good idea to start with a simple model, even if it is likely to be too\n", - "simple, and test whether it is good enough for its purpose. Then you can\n", - "add features gradually, starting with the ones you expect to be most\n", - "essential. This process is called **iterative modeling**.\n", - "\n", - "Comparing results of successive models provides a form of **internal\n", - "validation**, so you can catch conceptual, mathematical, and software\n", - "errors. And by adding and removing features, you can tell which ones\n", - "have the biggest effect on the results, and which can be ignored.\n", - "\n", - "Comparing results to data from the real world provides **external\n", - "validation**, which is generally the strongest test." - ] - }, - { - "cell_type": "markdown", - "id": "criminal-lunch", - "metadata": {}, - "source": [ - "## The falling penny myth\n", - "\n", - "Let's see an example of how models are used. You might have heard that a\n", - "penny dropped from the top of the Empire State Building would be going\n", - "so fast when it hit the pavement that it would be embedded in the\n", - "concrete; or if it hit a person, it would break their skull.\n", - "\n", - "We can test this myth by making and analyzing a model. To get started,\n", - "we'll assume that the effect of air resistance is small. This will turn out to be a bad assumption, but bear with me.\n", - "If air resistance is negligible, the primary force acting on the penny\n", - "is gravity, which causes the penny to accelerate downward.\n", - "\n", - "If the initial velocity is 0, the velocity after $t$ seconds is \n", - "\n", - "$$v = a t$$\n", - "\n", - "and the distance the penny has dropped is \n", - "\n", - "$$x = a t^2 / 2$$ \n", - "\n", - "To find the time until the penny reaches the sidewalk, we can solve for $t$:\n", - "\n", - "$$t = \\sqrt{ 2 x / a}$$ \n", - "\n", - "Plugging in the acceleration of gravity, $a = 9.8$ m/s$^2$, and the height of the Empire State Building, $x = 381$ m, we get $t = 8.8$ s. \n", - "\n", - "Then computing $v = a t$ we get a velocity on impact of $86$ m/s, which is about 190 miles per hour. That sounds like it could hurt." - ] - }, - { - "cell_type": "markdown", - "id": "documentary-diagnosis", - "metadata": {}, - "source": [ - "Of course, these results are not exact because the model is based on\n", - "simplifications. For example, we assume that gravity is constant. In\n", - "fact, the force of gravity is different on different parts of the globe, and it gets weaker as you move away from the surface. But these differences are small, so ignoring them is probably a good choice for this scenario.\n", - "\n", - "On the other hand, ignoring air resistance is not a good choice. Once\n", - "the penny gets to about 29 m/s, the upward force of air resistance\n", - "equals the downward force of gravity, so the penny stops accelerating.\n", - "This is the **terminal velocity** of the penny in air.\n", - "\n", - "Once the penny reaches terminal velocity, it doesn't matter how much farther it falls; it hits the sidewalk at about 29 m/s.\n", - "That's much less than 86 m/s, as the simple model predicts." - ] - }, - { - "cell_type": "markdown", - "id": "recent-appliance", - "metadata": {}, - "source": [ - "The statistician George Box famously said \"All models are wrong, but\n", - "some are useful.\" He was talking about statistical models, but his wise words apply to all kinds of models. Our first model, which ignores air resistance, is very wrong, and probably not useful. The second model, which takes air resistance into account, is still wrong, but it's better, and it's good enough to refute the myth.\n", - "\n", - "The television show *Mythbusters* has tested the myth of the falling\n", - "penny more carefully; you can view the results at\n", - ". Their work is based on a mathematical model of motion, measurements to determine the force of air resistance on a penny, and a physical model of a human head." - ] - }, - { - "cell_type": "markdown", - "id": "brief-zoning", - "metadata": {}, - "source": [ - "## Computation\n", - "\n", - "Let me show you how I computed the results from the\n", - "previous section using Python.\n", - "First we'll create a variable to represent acceleration due to gravity in meters per second squared (m/s^2)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "eleven-marine", - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8" - ] - }, - { - "cell_type": "markdown", - "id": "upset-myanmar", - "metadata": {}, - "source": [ - "A **variable** is a name that corresponds to a value. In this example, the name is `a` and the value is the number `9.8`.\n", - "\n", - "Suppose we let the penny drop for $3.4$ seconds (s). I'll create a variable to represent this time:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "following-launch", - "metadata": {}, - "outputs": [], - "source": [ - "t = 3.4" - ] - }, - { - "cell_type": "markdown", - "id": "greek-heritage", - "metadata": {}, - "source": [ - "Now we can compute the velocity of the penny after `t` seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "mature-duration", - "metadata": {}, - "outputs": [], - "source": [ - "v = a * t" - ] - }, - { - "cell_type": "markdown", - "id": "qualified-diabetes", - "metadata": {}, - "source": [ - "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation.\n", - "\n", - "When you assign a value to a variable, Jupyter does not show the result automatically, but you can display the value of a variable like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "considered-inclusion", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "33.32" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v" - ] - }, - { - "cell_type": "markdown", - "id": "northern-saturday", - "metadata": {}, - "source": [ - "After $3.4$ s, the velocity of the penny is about $33$ m/s (ignoring air resistance). Now let's see how far it would travel during that time:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "valued-electricity", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "56.644" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = a * t**2 / 2\n", - "x" - ] - }, - { - "cell_type": "markdown", - "id": "yellow-business", - "metadata": {}, - "source": [ - "It would travel about $56$ m. Now, going in the other direction, let's compute the time it takes to fall 381 m, the height of the Empire State Building." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "closed-month", - "metadata": {}, - "outputs": [], - "source": [ - "h = 381" - ] - }, - { - "cell_type": "markdown", - "id": "fuzzy-lease", - "metadata": {}, - "source": [ - "For this computation, we need the square root function, which is provided by a library called NumPy.\n", - "Before we can use it, we have to import it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "nuclear-clone", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import sqrt" - ] - }, - { - "cell_type": "markdown", - "id": "unlimited-swiss", - "metadata": {}, - "source": [ - "Now we can use it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "quarterly-nightmare", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8.817885349720552" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = sqrt(2 * h / a)\n", - "t" - ] - }, - { - "cell_type": "markdown", - "id": "velvet-oklahoma", - "metadata": {}, - "source": [ - "With no air resistance, it would take about $8.8$ s for the penny to reach the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "quality-external", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "86.41527642726142" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v = a * t\n", - "v" - ] - }, - { - "cell_type": "markdown", - "id": "human-phase", - "metadata": {}, - "source": [ - "And its velocity on impact would be about $86$ m/s.\n", - "\n", - "Python displays results with about 16 digits, which gives the impression that they are very precise, but don't be fooled.\n", - "The numbers we get out are only as good as the numbers we put in.\n", - "\n", - "For example, the \"roof height\" of the Empire State Building is $380$ m [according to Wikipedia](https://en.wikipedia.org/wiki/Empire_State_Building).\n", - "I chose $h=381$ m for this example on the assumption that the observation deck is on the roof and you drop the penny from a 1 meter railing.\n", - "But that's probably not right, so we should treat this value as an approximation where only the first two digits are likely to be right.\n", - "\n", - "If the precision of the inputs is two digits, the precision of the outputs is two digits, *at most*.\n", - "That's why, if the output is `86.41527642726142`, I report it as \"about 86\"." - ] - }, - { - "cell_type": "markdown", - "id": "consecutive-sleeve", - "metadata": {}, - "source": [ - "## Computation with units\n", - "\n", - "The computation in the previous section uses numbers without units. \n", - "When we set `h=381`, we left out the meters, and when we set `a=9.8`, we left out the meters per second squared.\n", - "And, when we got the result `v=86`, we added back the meters per second.\n", - "\n", - "Leaving units of out computation is common practice, but it tends to cause errors, including the very expensive failure of the [Mars Climate Orbiter](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter) in 1999.\n", - "When possible, it is better to include units in the computation.\n", - "\n", - "To represent units, we'll use a Python library called [Pint](https://pint.readthedocs.io/en/latest/).\n", - "The ModSim library initializes Pint and provides an object called `units` that contains variables representing pretty much every unit you've ever heard of.\n", - "\n", - "We can import it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "based-belief", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import units" - ] - }, - { - "cell_type": "markdown", - "id": "unlike-opera", - "metadata": {}, - "source": [ - "Now we can create variables named `meter` and `second`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "russian-popularity", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "meter" - ], - "text/latex": [ - "$\\mathrm{meter}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meter = units.meter\n", - "meter" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "endless-paint", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "second = units.second\n", - "second" - ] - }, - { - "cell_type": "markdown", - "id": "spiritual-scenario", - "metadata": {}, - "source": [ - "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." - ] - }, - { - "cell_type": "markdown", - "id": "everyday-location", - "metadata": {}, - "source": [ - "We can use `meter` and `second` to create a variable named `a` and give it the value of acceleration due to gravity. " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "earlier-bandwidth", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.8 meter/second2" - ], - "text/latex": [ - "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "9.8 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = 9.8 * meter / second**2\n", - "a" - ] - }, - { - "cell_type": "markdown", - "id": "generic-bowling", - "metadata": {}, - "source": [ - "The result is a **quantity** with two parts, called `magnitude` and `units`, which we can access like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "missing-privilege", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9.8" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a.magnitude" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "fourth-swedish", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "meter/second2" - ], - "text/latex": [ - "$\\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a.units" - ] - }, - { - "cell_type": "markdown", - "id": "realistic-techno", - "metadata": {}, - "source": [ - "Now we can create a quantity that represents $3.4$ s." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "apart-france", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "3.4 second" - ], - "text/latex": [ - "$3.4\\ \\mathrm{second}$" - ], - "text/plain": [ - "3.4 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = 3.4 * second\n", - "t" - ] - }, - { - "cell_type": "markdown", - "id": "severe-share", - "metadata": {}, - "source": [ - "And use it to compute the distance a penny would fall after `t` seconds with constant acceleration `a`. " - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "alien-scout", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "56.644 meter" - ], - "text/latex": [ - "$56.644\\ \\mathrm{meter}$" - ], - "text/plain": [ - "56.644 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a * t**2 / 2" - ] - }, - { - "cell_type": "markdown", - "id": "wicked-indianapolis", - "metadata": {}, - "source": [ - "Notice that the units of the result are correct.\n", - "If we create a quantity to represent the height of the Empire State Building:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "confidential-costs", - "metadata": {}, - "outputs": [], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "markdown", - "id": "hollow-programmer", - "metadata": {}, - "source": [ - "We can use it to compute the time to reach the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "studied-opera", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.817885349720552 second" - ], - "text/latex": [ - "$8.817885349720552\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.817885349720552 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = sqrt(2 * h / a)\n", - "t" - ] - }, - { - "cell_type": "markdown", - "id": "seasonal-laser", - "metadata": {}, - "source": [ - "And the velocity of the penny on impact:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "exterior-greek", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "86.41527642726142 meter/second" - ], - "text/latex": [ - "$86.41527642726142\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "86.41527642726142 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v = a * t\n", - "v" - ] - }, - { - "cell_type": "markdown", - "id": "superior-biography", - "metadata": {}, - "source": [ - "As in the previous section, the result is about $86$, but now it has the correct units, m/s.\n", - "\n", - "With Pint quantities, we can convert from one set of units to another like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "antique-landing", - "metadata": {}, - "outputs": [], - "source": [ - "mile = units.mile\n", - "hour = units.hour" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "included-failure", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "193.30546802805438 mile/hour" - ], - "text/latex": [ - "$193.30546802805438\\ \\frac{\\mathrm{mile}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "193.30546802805438 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v.to(mile/hour)" - ] - }, - { - "cell_type": "markdown", - "id": "progressive-charleston", - "metadata": {}, - "source": [ - "If you are more familiar with miles per hour, this result might be easier to interpret.\n", - "And it might give you a sense that this model is not realistic." - ] - }, - { - "cell_type": "markdown", - "id": "continuing-democrat", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This chapter introduces a modeling framework that consists of three steps:\n", - "\n", - "* Abstraction is the process of defining a model, deciding which elements of the real world to include and which can be left out.\n", - "\n", - "* Analysis and simulation are ways to use a model to generate predictions, explain why things behave as they to, and design things that behave as we want.\n", - "\n", - "* Validation is how we test whether the model is right, often by comparing predictions with measurements from the real world.\n", - "\n", - "As a first example, we modeled a penny dropped from the Empire State building, including gravity but ignoring air resistance.\n", - "In the exercises, you'll have a chance to try a better model, including air resistance.\n", - "\n", - "This chapter also presents Pint, a library for doing computation with units, which is convenient for converting between different units and important for avoiding catastrophic errors." - ] - }, - { - "cell_type": "markdown", - "id": "thousand-equation", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "handmade-zoning", - "metadata": {}, - "source": [ - "**Exercise** In mathematical notation, we can write an equation like $v = a t$ and it's understood that we are multiplying $a$ and $t$.\n", - "But that doesn't work in Python. If you put two variables side-by-side, like this:\n", - "\n", - "```\n", - "v = a t\n", - "```\n", - "\n", - "you'll get a **syntax error**, which means that something is wrong with the punctuation of the program.\n", - "\n", - "Try it out in the next cell so you see what the error message looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "postal-marking", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "33.32 meter/second" - ], - "text/latex": [ - "$33.32\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "33.32 " - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = 9.8 * meter / second**2\n", - "t = 3.4 * second\n", - "\n", - "v = a * t\n", - "v" - ] - }, - { - "cell_type": "markdown", - "id": "pressing-sugar", - "metadata": {}, - "source": [ - "**Exercise:** In this chapter we used the `sqrt` function from the NumPy library. NumPy also provides a variable named `pi` that contains an approximation of the mathematical constant $\\pi$.\n", - "We can import it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "legal-observer", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.141592653589793" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import pi\n", - "pi" - ] - }, - { - "cell_type": "markdown", - "id": "aggregate-mambo", - "metadata": {}, - "source": [ - "NumPy provides other functions we'll use, including `log`, `exp`, `sin`, and `cos`.\n", - "Import `sin` and `cos` from NumPy and compute\n", - "\n", - "$$sin^2 \\pi/4 + cos^2 \\pi/4$$\n", - "\n", - "Note: A mathematical identity tells us that the answer should be $1$." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "pressing-belgium", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "from numpy import sin, cos\n", - "\n", - "sin(pi/4)**2 + cos(pi/4)**2" - ] - }, - { - "cell_type": "markdown", - "id": "unlimited-delivery", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", - "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", - "\n", - "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "inner-equivalent", - "metadata": {}, - "outputs": [], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "nuclear-thirty", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "384.048 meter" - ], - "text/latex": [ - "$384.048\\ \\mathrm{meter}$" - ], - "text/plain": [ - "384.048 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "foot = units.foot\n", - "pole_height = 10 * foot\n", - "\n", - "h + pole_height" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "available-steering", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1260.0 foot" - ], - "text/latex": [ - "$1260.0\\ \\mathrm{foot}$" - ], - "text/plain": [ - "1260.0 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "pole_height + h" - ] - }, - { - "cell_type": "markdown", - "id": "aggressive-climate", - "metadata": {}, - "source": [ - "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "documentary-doctrine", - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8 * meter / second**2\n", - "t = 3.4 * second" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "primary-partner", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "steady-chancellor", - "metadata": {}, - "source": [ - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", - "\n", - "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", - "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", - "\n", - "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." - ] - }, - { - "cell_type": "markdown", - "id": "valid-empire", - "metadata": {}, - "source": [ - "**Exercise:** Suppose instead of dropping the penny, you throw it downward at its terminal velocity, $29$ m/s. How long would it take to fall $381$ m?" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "greenhouse-reason", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "13.137931034482758 second" - ], - "text/latex": [ - "$13.137931034482758\\ \\mathrm{second}$" - ], - "text/plain": [ - "13.137931034482758 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "h = 381 * meter\n", - "v = 29 * meter / second\n", - "\n", - "t = h / v\n", - "t" - ] - }, - { - "cell_type": "markdown", - "id": "asian-murray", - "metadata": {}, - "source": [ - "**Exercise:** So far we have considered two models of a falling penny:\n", - "\n", - "* If we ignore air resistance, the penny falls with constant acceleration, and we can compute the time to reach the sidewalk and the velocity of the penny when it gets there.\n", - "\n", - "* If we take air resistance into account, and drop the penny at its terminal velocity, it falls with constant velocity. \n", - "\n", - "Now let's consider a third model that includes elements of the first two: let's assume that the acceleration of the penny is `a` until the penny reaches $29$ m/s, and then $0$ m/s afterwards. What is the total time for the penny to fall $381$ m?" - ] - }, - { - "cell_type": "markdown", - "id": "detailed-minnesota", - "metadata": {}, - "source": [ - "You can break this question into three parts:\n", - "\n", - "1. How long would the penny take to reach $29$ m/s with constant acceleration `a`.\n", - "2. How far would it fall during that time?\n", - "3. How long would it take to fall the remaining distance with constant velocity $29$ m/s?\n", - "\n", - "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "secure-crowd", - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8 * meter / second**2\n", - "h = 381 * meter" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "thirty-minneapolis", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "v_terminal = 29 * meter / second " - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "premier-seeking", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time to reach terminal velocity 2.9591836734693877 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t1 = v_terminal / a\n", - "print('Time to reach terminal velocity', t1)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "brave-laundry", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Height fallen in t1 42.90816326530612 meter\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "h1 = a * t1**2 / 2\n", - "print('Height fallen in t1', h1)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "adjusted-consultation", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time to fall remaining distance 11.658339197748065 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t2 = (h - h1) / v_terminal\n", - "print('Time to fall remaining distance', t2)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "understanding-consortium", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total falling time 14.617522871217453 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t_total = t1 + t2\n", - "print('Total falling time', t_total)" - ] - }, - { - "cell_type": "markdown", - "id": "composed-tunnel", - "metadata": {}, - "source": [ - "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that, when he threw a fastball, he was throwing the ball down; that is, the ball was leaving his hand at a downward angle.\n", - "I was skeptical; watching from the side, I thought the ball was leaving his hand at an upward angle.\n", - "\n", - "Can you think of a simple model you could use to settle the argument? What factors would you include and what could you ignore? What quantities would you have to look up or estimate?\n", - "\n", - "I suggest you convert all quantities to [SI units](https://en.wikipedia.org/wiki/International_System_of_Units): meters and seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "about-complex", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# I suggest the following model: \n", - "\n", - "# 1. Let's ignore the motion of the ball toward home plate and\n", - "# think about how far the ball would drop while it's in flight.\n", - "\n", - "# 2. Let's ignore air resistance. Since we are only thinking \n", - "# about the relatively slow motion in the vertical direction, \n", - "# this is probably a good assumption.\n", - "\n", - "# 3. Let's also ignore the effect of spin. This is probably a\n", - "# less good assumption.\n", - "\n", - "# The distance from the pitcher's mound to home plate is about 60\n", - "# feet, but the point where the ball is released is a bit closer.\n", - "\n", - "# An average pitcher in high school might be able to throw a ball\n", - "# at 80 mph." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "unique-owner", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "v = (80 * mile / hour).to(meter/second)\n", - "x = (60 * foot).to(meter)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "minus-batman", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.5113636363636364 second" - ], - "text/latex": [ - "$0.5113636363636364\\ \\mathrm{second}$" - ], - "text/plain": [ - "0.5113636363636364 " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t = x / v\n", - "t" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "exact-vegetable", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.2813145661157026 meter" - ], - "text/latex": [ - "$1.2813145661157026\\ \\mathrm{meter}$" - ], - "text/plain": [ - "1.2813145661157026 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "a = 9.8 * meter / second**2\n", - "h = a * t**2 / 2\n", - "h" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "neutral-lightning", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# In the time it takes the ball to reach home plate, it drops\n", - "# about 1.3 m. If the release point is at 2 m, which is plausible,\n", - "# it would cross the plate at 0.7 m, which is in the strike zone.\n", - "\n", - "# So I could be wrong -- it is plausible that the ball leaves\n", - "# the pitcher's hand at a downward angle, at least for some pitches." - ] - }, - { - "cell_type": "markdown", - "id": "jewish-secret", - "metadata": {}, - "source": [ - "**Exercise:** Suppose I run a 10K race in 44:52. What is my average page in minutes per mile?" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "virgin-cambodia", - "metadata": {}, - "outputs": [], - "source": [ - "mile = units.mile\n", - "kilometer = units.kilometer\n", - "minute = units.minute" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "right-intention", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2692.0 second" - ], - "text/latex": [ - "$2692.0\\ \\mathrm{second}$" - ], - "text/plain": [ - "2692.0 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t = 52 * second + 44 * minute\n", - "t" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "mineral-sally", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.003714710252600297 kilometer/second" - ], - "text/latex": [ - "$0.003714710252600297\\ \\frac{\\mathrm{kilometer}}{\\mathrm{second}}$" - ], - "text/plain": [ - "0.003714710252600297 " - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v = 10 * kilometer / t\n", - "v" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "preceding-cricket", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "7.220590079999998 minute/mile" - ], - "text/latex": [ - "$7.220590079999998\\ \\frac{\\mathrm{minute}}{\\mathrm{mile}}$" - ], - "text/plain": [ - "7.220590079999998 " - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "pace = (1 / v).to(minute / mile)\n", - "pace" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "effective-rendering", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "7.0 minute/mile" - ], - "text/latex": [ - "$7.0\\ \\frac{\\mathrm{minute}}{\\mathrm{mile}}$" - ], - "text/plain": [ - "7.0 " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# To convert to minutes and seconds, we can use np.round.\n", - "# But we haven't covered that yet.\n", - "\n", - "from numpy import round\n", - "\n", - "round(pace)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "printable-reply", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "13.235404799999895 second/mile" - ], - "text/latex": [ - "$13.235404799999895\\ \\frac{\\mathrm{second}}{\\mathrm{mile}}$" - ], - "text/plain": [ - "13.235404799999895 " - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "remainder = pace - round(pace)\n", - "remainder.to(second/mile)" - ] - }, - { - "cell_type": "markdown", - "id": "environmental-wallet", - "metadata": {}, - "source": [ - "## Jupyter" - ] - }, - { - "cell_type": "markdown", - "id": "quality-probe", - "metadata": {}, - "source": [ - "### Adding and removing cells\n", - "\n", - "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", - "\n", - "Try the following exercises:\n", - "\n", - "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", - "\n", - "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", - "\n", - "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", - "\n", - "4. In the new cell, type some text, and then run it.\n", - "\n", - "5. Use the arrow buttons in the toolbar to move cells up and down.\n", - "\n", - "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", - "\n", - "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", - "\n", - "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." - ] - }, - { - "cell_type": "markdown", - "id": "suffering-intro", - "metadata": {}, - "source": [ - "### Restart and run all\n", - "\n", - "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", - "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", - "\n", - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "weighted-quebec", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap02.ipynb b/jupyter/chap02.ipynb deleted file mode 100644 index 3c23b290..00000000 --- a/jupyter/chap02.ipynb +++ /dev/null @@ -1,1694 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "victorian-latitude", - "metadata": {}, - "source": [ - "# Chapter 2" - ] - }, - { - "cell_type": "markdown", - "id": "cathedral-glasgow", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "burning-chorus", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - " \n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "id": "above-denial", - "metadata": {}, - "source": [ - "# Bike share\n", - "\n", - "This chapter presents a simple model of a bike share system and\n", - "demonstrates the features of Python we'll use to develop simulations of\n", - "real-world systems.\n", - "\n", - "Along the way, we'll make decisions about how to model the system. In\n", - "the next chapter we'll review these decisions and gradually improve the\n", - "model.\n", - "\n", - "## Modeling\n", - "\n", - "Imagine a bike share system for students traveling between Olin College\n", - "and Wellesley College, which are about 3 miles apart in eastern\n", - "Massachusetts.\n", - "\n", - "Suppose the system contains 12 bikes and two bike racks, one at Olin and\n", - "one at Wellesley, each with the capacity to hold 12 bikes.\n", - "\n", - "As students arrive, check out a bike, and ride to the other campus, the\n", - "number of bikes in each location changes. In the simulation, we'll need\n", - "to keep track of where the bikes are. To do that, we'll use a function called `State`, which is defined in the ModSim library.\n", - "We can import it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "wrapped-workplace", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State" - ] - }, - { - "cell_type": "markdown", - "id": "accredited-evanescence", - "metadata": {}, - "source": [ - "Now we can call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "incorrect-comparison", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "id": "living-wayne", - "metadata": {}, - "source": [ - "The expressions in parentheses are **keyword arguments**.\n", - "They create two variables, `olin` and `wellesley`, and give them values.\n", - "\n", - "Then we call the `State` function.\n", - "The result is a `State` object, which is a collection of **state variables**.\n", - "\n", - "In this example, the state variables represent the number of\n", - "bikes at each location. The initial values are 10 and 2, indicating that there are 10 bikes at Olin and 2 at Wellesley. \n", - "\n", - "The `State` object is assigned to a new variable named `bikeshare`.\n", - "We can read the variables inside a `State` object using the **dot\n", - "operator**, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "brief-diversity", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "id": "intermediate-midwest", - "metadata": {}, - "source": [ - "And this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "designed-brazilian", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "id": "phantom-oklahoma", - "metadata": {}, - "source": [ - "Or, to display the state variables and their values, you can just type the name of the object:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "impaired-potter", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

    " - ], - "text/plain": [ - "namespace(olin=10, wellesley=2)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "fleet-beijing", - "metadata": {}, - "source": [ - "These values make up the **state** of the system.\n", - "We can update the state by assigning new values to the variables. \n", - "For example, if a student moves a bike from Olin to Wellesley, we can figure out the new values and assign them:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "floppy-trainer", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin = 9\n", - "bikeshare.wellesley = 3" - ] - }, - { - "cell_type": "markdown", - "id": "natural-gossip", - "metadata": {}, - "source": [ - "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", - "`olin` and add 1 to `wellesley`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "hungarian-bride", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1\n", - "bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "radical-mills", - "metadata": {}, - "source": [ - "The result is the same either way." - ] - }, - { - "cell_type": "markdown", - "id": "controversial-opportunity", - "metadata": {}, - "source": [ - "## Defining functions\n", - "\n", - "So far we have used functions defined in NumPy and ModSim. Now we're going to define our own function.\n", - "\n", - "When you are developing code in Jupyter, it is often efficient to write a few lines of code, test them to confirm they do what you intend, and then use them to define a new function. For example, these lines move a bike from Olin to Wellesley:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "vertical-drawing", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1\n", - "bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "approximate-rolling", - "metadata": {}, - "source": [ - "Rather than repeat them every time a bike moves, we can define a new\n", - "function:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "significant-nutrition", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "generous-tracker", - "metadata": {}, - "source": [ - "`def` is a special word in Python that indicates we are defining a new\n", - "function. The name of the function is `bike_to_wellesley`. The empty\n", - "parentheses indicate that this function requires no additional\n", - "information when it runs. The colon indicates the beginning of an\n", - "indented **code block**.\n", - "\n", - "The next two lines are the **body** of the function. They have to be\n", - "indented; by convention, the indentation is 4 spaces.\n", - "\n", - "When you define a function, it has no immediate effect. The body of the\n", - "function doesn't run until you **call** the function. Here's how to call\n", - "this function:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "moving-jurisdiction", - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley()" - ] - }, - { - "cell_type": "markdown", - "id": "meaningful-christmas", - "metadata": {}, - "source": [ - "When you call the function, it runs the statements in the body, which\n", - "update the variables of the `bikeshare` object; you can check by\n", - "displaying the new state." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "proper-symposium", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    State
    olin6
    wellesley6
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=6, wellesley=6)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "eleven-brook", - "metadata": {}, - "source": [ - "When you call a function, you have to include the parentheses. If you\n", - "leave them out, you get this:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "identical-yacht", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bike_to_wellesley" - ] - }, - { - "cell_type": "markdown", - "id": "premier-youth", - "metadata": {}, - "source": [ - "This result indicates that `bike_to_wellesley` is a function. You don't\n", - "have to know what `__main__` means, but if you see something like this,\n", - "it probably means that you looked up a function but you didn't actually\n", - "call it. So don't forget the parentheses." - ] - }, - { - "cell_type": "markdown", - "id": "brazilian-medicare", - "metadata": {}, - "source": [ - "## Print statements\n", - "\n", - "As you write more complicated programs, it is easy to lose track of what\n", - "is going on. One of the most useful tools for debugging is the **print\n", - "statement**, which displays text in the Jupyter notebook.\n", - "\n", - "Normally when Jupyter runs the code in a cell, it displays the value of\n", - "the last line of code. For example, if you run:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "heavy-patrol", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.olin\n", - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "id": "ancient-projection", - "metadata": {}, - "source": [ - "Jupyter runs both lines, but it only displays the value of the\n", - "second. If you want to display more than one value, you can use\n", - "print statements:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "french-preference", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6\n", - "6\n" - ] - } - ], - "source": [ - "print(bikeshare.olin)\n", - "print(bikeshare.wellesley)" - ] - }, - { - "cell_type": "markdown", - "id": "original-hollywood", - "metadata": {}, - "source": [ - "When you call the `print` function, you can put a variable name in\n", - "parentheses, as in the previous example, or you can provide a sequence\n", - "of variables separated by commas, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "alternative-keyboard", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6 6\n" - ] - } - ], - "source": [ - "print(bikeshare.olin, bikeshare.wellesley)" - ] - }, - { - "cell_type": "markdown", - "id": "described-produce", - "metadata": {}, - "source": [ - "Python looks up the values of the variables and displays them; in this\n", - "example, it displays two values on the same line, with a space between\n", - "them.\n", - "\n", - "Print statements are useful for debugging functions. For example, we can\n", - "add a print statement to `move_bike`, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "robust-holly", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " print('Moving a bike to Wellesley')\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "vital-lender", - "metadata": {}, - "source": [ - "Each time we call this version of the function, it displays a message,\n", - "which can help us keep track of what the program is doing.\n", - "The message in this example is a **string**, which is a sequence of\n", - "letters and other symbols in quotes.\n", - "\n", - "Just like `bike_to_wellesley`, we can define a function that moves a\n", - "bike from Wellesley to Olin:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "fifteen-atmosphere", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin():\n", - " print('Moving a bike to Olin')\n", - " bikeshare.wellesley -= 1\n", - " bikeshare.olin += 1" - ] - }, - { - "cell_type": "markdown", - "id": "requested-glasgow", - "metadata": {}, - "source": [ - "And call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "matched-narrow", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Olin\n" - ] - } - ], - "source": [ - "bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "id": "sitting-semiconductor", - "metadata": {}, - "source": [ - "One benefit of defining functions is that you avoid repeating chunks of\n", - "code, which makes programs smaller. Another benefit is that the name you\n", - "give the function documents what it does, which makes programs more\n", - "readable." - ] - }, - { - "cell_type": "markdown", - "id": "enhanced-maintenance", - "metadata": {}, - "source": [ - "## If statements\n", - "\n", - "The ModSim library provides a function called `flip`, which we can import like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "active-graduate", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import flip" - ] - }, - { - "cell_type": "markdown", - "id": "adopted-train", - "metadata": {}, - "source": [ - "When you call it, you provide a probability between 0 and 1, like `0.7`, as an example:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "illegal-metropolitan", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "flip(0.7)" - ] - }, - { - "cell_type": "markdown", - "id": "appropriate-funds", - "metadata": {}, - "source": [ - "The result is one of two values: `True` with probability 0.7 or `False`\n", - "with probability 0.3. If you run `flip` like this 100 times, you should\n", - "get `True` about 70 times and `False` about 30 times. But the results\n", - "are random, so they might differ from these expectations.\n", - "\n", - "`True` and `False` are special values defined by Python. Note that they\n", - "are not strings. There is a difference between `True`, which is a\n", - "special value, and `'True'`, which is a string.\n", - "\n", - "`True` and `False` are called **boolean** values because they are\n", - "related to Boolean algebra ().\n", - "\n", - "We can use boolean values to control the behavior of the program, using\n", - "an **if statement**:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "excessive-murder", - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.5):\n", - " print('heads')" - ] - }, - { - "cell_type": "markdown", - "id": "seventh-profile", - "metadata": {}, - "source": [ - "If the result from `flip` is `True`, the program displays the string\n", - "`'heads'`. Otherwise it does nothing.\n", - "\n", - "The syntax for `if` statements is similar to the syntax for\n", - "function definitions: the first line has to end with a colon, and the\n", - "lines inside the `if` statement have to be indented.\n", - "\n", - "Optionally, you can add an **else clause** to indicate what should\n", - "happen if the result is `False`:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "fundamental-nursing", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "tails\n" - ] - } - ], - "source": [ - "if flip(0.5):\n", - " print('heads')\n", - "else:\n", - " print('tails') " - ] - }, - { - "cell_type": "markdown", - "id": "recovered-chemical", - "metadata": {}, - "source": [ - "Now we can use `flip` to simulate the arrival of students who want to\n", - "borrow a bike. Suppose students arrive at the Olin station every 2\n", - "minutes, on average. In that case, the chance of an arrival during any\n", - "one-minute period is 50%, and we can simulate it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "twenty-health", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n" - ] - } - ], - "source": [ - "if flip(0.5):\n", - " bike_to_wellesley()" - ] - }, - { - "cell_type": "markdown", - "id": "difficult-construction", - "metadata": {}, - "source": [ - "If students arrive at the Wellesley station every 3 minutes, on average,\n", - "the chance of an arrival during any one-minute period is 33%, and we can\n", - "simulate it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "played-character", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Olin\n" - ] - } - ], - "source": [ - "if flip(0.33):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "id": "standard-party", - "metadata": {}, - "source": [ - "We can combine these snippets into a function that simulates a **time\n", - "step**, which is an interval of time, in this case one minute:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "ecological-colon", - "metadata": {}, - "outputs": [], - "source": [ - "def step():\n", - " if flip(0.5):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(0.33):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "id": "amateur-exposure", - "metadata": {}, - "source": [ - "Then we can simulate a time step like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "mediterranean-german", - "metadata": {}, - "outputs": [], - "source": [ - "step()" - ] - }, - { - "cell_type": "markdown", - "id": "sought-mobile", - "metadata": {}, - "source": [ - "Even though there are no values in parentheses, we have to include them." - ] - }, - { - "cell_type": "markdown", - "id": "organic-proportion", - "metadata": {}, - "source": [ - "## Parameters\n", - "\n", - "The previous version of `step` is fine if the arrival probabilities\n", - "never change, but in reality, these probabilities vary over time.\n", - "\n", - "So instead of putting the constant values 0.5 and 0.33 in `step` we can replace them with **parameters**. Parameters are variables whose values are set when a function is called.\n", - "\n", - "Here's a version of `step` that takes two parameters, `p1` and `p2`:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "hollywood-shopping", - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "id": "encouraging-arkansas", - "metadata": {}, - "source": [ - "The values of `p1` and `p2` are not set inside this function; instead,\n", - "they are provided when the function is called, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "buried-alert", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n" - ] - } - ], - "source": [ - "step(0.5, 0.33)" - ] - }, - { - "cell_type": "markdown", - "id": "aggregate-dynamics", - "metadata": {}, - "source": [ - "The values you provide when you call the function are called\n", - "**arguments**. The arguments, `0.5` and `0.33` in this example, get\n", - "assigned to the parameters, `p1` and `p2`, in order. So running this\n", - "function has the same effect as:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "recognized-denmark", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n" - ] - } - ], - "source": [ - "p1 = 0.5\n", - "p2 = 0.33\n", - "\n", - "if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - "if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "id": "raised-museum", - "metadata": {}, - "source": [ - "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", - "\n", - "Adding parameters to a function is called **generalization**, because it makes the function more general, that is, less specialized." - ] - }, - { - "cell_type": "markdown", - "id": "scenic-african", - "metadata": {}, - "source": [ - "## For loops\n", - "\n", - "At some point you will get sick of running cells over and over.\n", - "Fortunately, there is an easy way to repeat a chunk of code, the **for\n", - "loop**. Here's an example:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "polish-river", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "Moving a bike to Wellesley\n", - "1\n", - "Moving a bike to Wellesley\n", - "2\n", - "Moving a bike to Wellesley\n" - ] - } - ], - "source": [ - "for i in range(3):\n", - " print(i)\n", - " bike_to_wellesley()" - ] - }, - { - "cell_type": "markdown", - "id": "compatible-conspiracy", - "metadata": {}, - "source": [ - "The syntax here should look familiar; the first line ends with a\n", - "colon, and the lines inside the `for` loop are indented. The other\n", - "elements of the loop are:\n", - "\n", - "- The words `for` and `in` are special words we have to use in a for\n", - " loop.\n", - "\n", - "- `range` is a Python function we're using here to control the number of times the loop runs.\n", - "\n", - "- `i` is a **loop variable** that gets created when the for loop runs.\n", - "\n", - "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `0`; the second time, it is `1`; the third time, it is `2`.\n", - "\n", - "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley." - ] - }, - { - "cell_type": "markdown", - "id": "breeding-groove", - "metadata": {}, - "source": [ - "## TimeSeries" - ] - }, - { - "cell_type": "markdown", - "id": "flexible-projection", - "metadata": {}, - "source": [ - "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", - "corresponding sequence of quantities.\n", - "\n", - "In this example, the time stamps are integers representing minutes, and the quantities are the number of bikes at one location.\n", - "\n", - "Since we have moved a number of bikes around, let's start again with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "every-consultation", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "id": "cross-sharp", - "metadata": {}, - "source": [ - "We can create a new, empty `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "changing-planet", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "id": "attractive-revision", - "metadata": {}, - "source": [ - "And we can add a quantity like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "aquatic-richardson", - "metadata": {}, - "outputs": [], - "source": [ - "results[0] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "id": "searching-funeral", - "metadata": {}, - "source": [ - "The number in brackets is the time stamp, also called a **label**.\n", - "\n", - "We can use a `TimeSeries` inside a for loop to store the results of the simulation:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "english-titanium", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "1\n", - "Moving a bike to Olin\n", - "2\n" - ] - } - ], - "source": [ - "for i in range(3):\n", - " print(i)\n", - " step(0.6, 0.6)\n", - " results[i+1] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "id": "prospective-joining", - "metadata": {}, - "source": [ - "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", - "Then we store the number of bikes at Olin in `results`. \n", - "We use the loop variable, `i`, to compute the time stamp, `i+1`.\n", - "\n", - "The first time through the loop, the value of `i` is `0`, so the time stamp is `1`.\n", - "The last time, the value of `i` is `2`, so the time stamp is `3`.\n", - "\n", - "When the loop exits, `results` contains 4 time stamps, from 0 through\n", - "3, and the number of bikes at Olin at the end of each time step.\n", - "\n", - "We can display the `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "indonesian-singing", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Time\n", - "0 10\n", - "1 10\n", - "2 11\n", - "3 11\n", - "Name: Quantity, dtype: int64" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "id": "small-encoding", - "metadata": {}, - "source": [ - "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", - "\n", - "At the bottom, `dtype` is the type of the data in the `TimeSeries`; you can ignore this for now.\n", - "\n", - "ModSim provides a function called `show` that displays the `TimeSeries` as a table:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "verbal-bikini", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Quantity
    Time
    010
    110
    211
    311
    \n", - "
    " - ], - "text/plain": [ - " Quantity\n", - "Time \n", - "0 10\n", - "1 10\n", - "2 11\n", - "3 11" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import show\n", - "\n", - "show(results)" - ] - }, - { - "cell_type": "markdown", - "id": "visible-montgomery", - "metadata": {}, - "source": [ - "You don't have to use `show`, but I think it looks better." - ] - }, - { - "cell_type": "markdown", - "id": "following-contrary", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "`results` provides a function called `plot` we can use to plot\n", - "the results, and the ModSim library provides `decorate`, which we can use to label the axes and give the figure a title:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "saved-hands", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.plot()\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "id": "limited-interstate", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This chapter introduces the tools we need to run simulations, record the results, and plot them.\n", - "\n", - "We used a `State` object to represent the state of the system.\n", - "Then we used the `flip` function and an `if` statement to simulate a single time step.\n", - "\n", - "We used `for` loop to simulate a series of steps, and a `TimeSeries` to record the results.\n", - "\n", - "Finally, we used `plot` and `decorate` to plot the results.\n", - "\n", - "In the next chapter, we will extend this simulation to make it a little more realistic." - ] - }, - { - "cell_type": "markdown", - "id": "fallen-surprise", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "capital-internship", - "metadata": {}, - "source": [ - "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", - "\n", - "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "helpful-zambia", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "\n", - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "id": "dirty-multiple", - "metadata": {}, - "source": [ - "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "beneficial-mainland", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    State
    olin10
    wellesley2
    babson0
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=10, wellesley=2, babson=0)" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=10, wellesley=2, babson=0)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "christian-madrid", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", - "\n", - "It should:\n", - "\n", - "1. Create a `TimeSeries` object to hold the results.\n", - "\n", - "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", - "\n", - "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", - "\n", - "4. After the for loop, it should plot the results and\n", - "\n", - "5. Decorate the axes.\n", - "\n", - "To test your function:\n", - "\n", - "1. Create a `State` object with the initial state of the system.\n", - "\n", - "2. Call `run_simulation` with appropriate parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "former-frost", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_simulation(p1, p2, num_steps):\n", - " results = TimeSeries()\n", - " results[0] = bikeshare.olin\n", - " \n", - " for i in range(num_steps):\n", - " step(p1, p2)\n", - " results[i+1] = bikeshare.olin\n", - " \n", - " results.plot()\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "spare-honduras", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Olin\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n", - "Moving a bike to Wellesley\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(0.3, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "id": "instructional-finnish", - "metadata": {}, - "source": [ - "## Opening the hood\n", - "\n", - "This section contains additional information about the functions we've used an pointers to their documentation.\n", - "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." - ] - }, - { - "cell_type": "markdown", - "id": "digital-stretch", - "metadata": {}, - "source": [ - "The `State` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." - ] - }, - { - "cell_type": "markdown", - "id": "declared-collar", - "metadata": {}, - "source": [ - "The `TimeSeries` object is based on the `Series` object defined by a library called Pandas.\n", - "The documentation is at .\n", - "\n", - "`show` works by creating another Pandas object, called a `DataFrame`, which can be displayed as a table.\n", - "We'll use `DataFrame` objects in future chapters." - ] - }, - { - "cell_type": "markdown", - "id": "comfortable-pillow", - "metadata": {}, - "source": [ - "`Series` objects provide their own `plot` function, but the syntax is different from the other functions we've used, so ModSim provides a function called `plot` just to make it consistent.\n", - "\n", - "`decorate` is based on Matplotlib, which is most widely-used plotting function for Python. Matplotlib provides separate functions for `title`, `xlabel`, and `ylabel`.\n", - "`decorate` makes them a little easier to use." - ] - }, - { - "cell_type": "markdown", - "id": "banner-policy", - "metadata": {}, - "source": [ - "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", - "\n", - "You can get the source code for `flip` by running the following cell." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "agricultural-midwest", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def flip(p=0.5):\n", - " \"\"\"Flips a coin with the given probability.\n", - "\n", - " p: float 0-1\n", - "\n", - " returns: boolean (True or False)\n", - " \"\"\"\n", - " return np.random.random() < p\n", - "\n" - ] - } - ], - "source": [ - "from modsim import source_code\n", - "\n", - "source_code(flip)" - ] - }, - { - "cell_type": "markdown", - "id": "running-membership", - "metadata": {}, - "source": [ - "You might not understand everything in this function yet, but you will." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "junior-lindsay", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap03.ipynb b/jupyter/chap03.ipynb deleted file mode 100644 index 3854e10c..00000000 --- a/jupyter/chap03.ipynb +++ /dev/null @@ -1,1075 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "signal-format", - "metadata": {}, - "source": [ - "# Chapter 3" - ] - }, - { - "cell_type": "markdown", - "id": "welcome-gentleman", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "backed-christianity", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "coral-steering", - "metadata": {}, - "source": [ - "To paraphrase two Georges, \"All models are wrong, but some models are\n", - "more wrong than others.\" In this chapter, I demonstrate the process we\n", - "use to make models less wrong.\n", - "\n", - "As an example, we'll review the bikeshare model from the previous\n", - "chapter, consider its strengths and weaknesses, and gradually improve\n", - "it. We'll also see ways to use the model to understand the behavior of\n", - "the system and evaluate designs intended to make it work better." - ] - }, - { - "cell_type": "markdown", - "id": "twelve-length", - "metadata": {}, - "source": [ - "## Iterative modeling\n", - "\n", - "The model we have so far is simple, but it is based on unrealistic\n", - "assumptions. Before you go on, take a minute to review the model from\n", - "the previous chapter. What assumptions is it based on? Make a list of\n", - "ways this model might be unrealistic; that is, what are the differences between the model and the real world?\n", - "\n", - "Here are some of the differences on my list:\n", - "\n", - "- In the model, a student is equally likely to arrive during any\n", - " one-minute period. In reality, this probability varies depending on time of day, day of the week, etc.\n", - "\n", - "- The model does not account for travel time from one bike station to another.\n", - "\n", - "- The model does not check whether a bike is available, so it's\n", - " possible for the number of bikes to be negative (as you might have\n", - " noticed in some of your simulations)." - ] - }, - { - "cell_type": "markdown", - "id": "sweet-heater", - "metadata": {}, - "source": [ - "Some of these modeling decisions are better than others. For example,\n", - "the first assumption might be reasonable if we simulate the system for a short period of time, like one hour.\n", - "\n", - "The second assumption is not very realistic, but it might not affect the results very much, depending on what we use the model for.\n", - "\n", - "On the other hand, the third assumption seems problematic, and it is\n", - "relatively easy to fix. In this chapter, we will.\n", - "\n", - "This process, starting with a simple model, identifying the most\n", - "important problems, and making gradual improvements, is called\n", - "**iterative modeling**.\n", - "\n", - "For any physical system, there are many possible models, based on\n", - "different assumptions and simplifications. It often takes several\n", - "iterations to develop a model that is good enough for the intended\n", - "purpose, but no more complicated than necessary." - ] - }, - { - "cell_type": "markdown", - "id": "female-salem", - "metadata": {}, - "source": [ - "## More than one State object\n", - "\n", - "Before we go on, I want to make a few changes to the code from the\n", - "previous chapter. First I'll generalize the functions we wrote so they\n", - "take a `State` object as a parameter. Then, I'll make the code more\n", - "readable by adding documentation.\n", - "\n", - "Here is one of the functions from the previous chapter, `bike_to_wellesley`:" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "embedded-heavy", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "artificial-remains", - "metadata": {}, - "source": [ - "When this function is called, it modifies `bikeshare`. As long as there\n", - "is only one `State` object, that's fine, but what if there is more than\n", - "one bike share system in the world? Or what if we want to run more than\n", - "one simulation?\n", - "\n", - "This function would be more flexible if it took a `State` object as a\n", - "parameter. Here's what that looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "unusual-advancement", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " state.olin -= 1\n", - " state.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "serial-mortality", - "metadata": {}, - "source": [ - "The name of the parameter is `state` rather than `bikeshare` as a\n", - "reminder that the value of `state` could be any `State` object, not just\n", - "`bikeshare`.\n", - "\n", - "This version of `bike_to_wellesley` requires a `State` object as a\n", - "parameter, so we have to provide one when we call it:" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "packed-hungarian", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State\n", - "\n", - "bikeshare = State(olin=10, wellesley=2)\n", - "bike_to_wellesley(bikeshare)" - ] - }, - { - "cell_type": "markdown", - "id": "fewer-rhythm", - "metadata": {}, - "source": [ - "Again, the argument we provide gets assigned to the parameter, so this\n", - "function call has the same effect as:\n", - "\n", - "```\n", - "state = bikeshare \n", - "state.olin -= 1 \n", - "state.wellesley += 1\n", - "```\n", - "\n", - "Now we can create as many `State` objects as we want:" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "right-assessment", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1 = State(olin=10, wellesley=2)\n", - "bikeshare2 = State(olin=2, wellesley=10)" - ] - }, - { - "cell_type": "markdown", - "id": "occupied-navigator", - "metadata": {}, - "source": [ - "And update them independently:" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "cleared-advocacy", - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley(bikeshare1)\n", - "bike_to_wellesley(bikeshare2)" - ] - }, - { - "cell_type": "markdown", - "id": "brown-ferry", - "metadata": {}, - "source": [ - "Changes in `bikeshare1` do not affect `bikeshare2`, and vice versa. So\n", - "we can simulate different bike share systems, or run multiple\n", - "simulations of the same system." - ] - }, - { - "cell_type": "markdown", - "id": "magnetic-packing", - "metadata": {}, - "source": [ - "## Documentation\n", - "\n", - "Another problem with the code we have so far is that it contains no\n", - "**documentation**. Documentation is text we add to a program to help\n", - "other programmers read and understand it. It has no effect on the\n", - "program when it runs.\n", - "\n", - "There are two forms of documentation, **docstrings** and **comments**:\n", - "\n", - "* A docstring is a string in triple-quotes that appears at the beginning of a function.\n", - "\n", - "* A comment is a line of text that begins with a hash symbol, `#`.\n", - "\n", - "Here's a version of `bike_to_olin` with a docstring and a comment." - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "moral-parallel", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " # We decrease one state variable and increase the\n", - " # other, so the total number of bikes is unchanged.\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "id": "therapeutic-utility", - "metadata": {}, - "source": [ - "Docstrings follow a conventional format:\n", - "\n", - "- The first line is a single sentence that describes what the function does.\n", - "\n", - "- The following lines explain what the parameters are.\n", - "\n", - "A function's docstring should include the information someone needs to\n", - "know to *use* the function; it should not include details about how the function works.\n", - "\n", - "Comments provide details about how the function works, especially if there is something that would not be obvious to someone reading the program." - ] - }, - { - "cell_type": "markdown", - "id": "american-clear", - "metadata": {}, - "source": [ - "## Negative bikes\n", - "\n", - "The changes we've made so far improve the quality of the code, but we\n", - "haven't done anything to improve the quality of the model yet. Let's do that now.\n", - "\n", - "Currently the simulation does not check whether a bike is available when a customer arrives, so the number of bikes at a location can be\n", - "negative. That's not very realistic. Here's a version of\n", - "`bike_to_olin` that fixes the problem:" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "divine-leisure", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin(state):\n", - " if state.wellesley == 0:\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "id": "decimal-denver", - "metadata": {}, - "source": [ - "The first line checks whether the number of bikes at Wellesley is zero. If so, it uses a **return statement**, which causes the function to end immediately, without running the rest of the statements. So if there are no bikes at Wellesley, we \"return\" from `bike_to_olin` without changing the state.\n", - "\n", - "We can test it by initializing the state with no bikes at Wellesley And calling `bike_to_olin`." - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "choice-cooking", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=12, wellesley=0)\n", - "bike_to_olin(bikeshare)" - ] - }, - { - "cell_type": "markdown", - "id": "persistent-denmark", - "metadata": {}, - "source": [ - "The state of the system should be unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "twelve-moderator", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin12
    wellesley0
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=12, wellesley=0)" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "criminal-general", - "metadata": {}, - "source": [ - "No more negative bikes (at least at Wellesley)." - ] - }, - { - "cell_type": "markdown", - "id": "gorgeous-found", - "metadata": {}, - "source": [ - "## Comparison operators\n", - "\n", - "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True` if they are equal and `False` otherwise.\n", - "\n", - "It is easy to confuse the equals operators with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "level-burns", - "metadata": {}, - "outputs": [], - "source": [ - "x = 5" - ] - }, - { - "cell_type": "markdown", - "id": "weighted-monster", - "metadata": {}, - "source": [ - "On the other hand, the following statement checks whether `x` is `5` and\n", - "returns `True` or `False`. It does not create `x` or change its value." - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "civic-remains", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x == 5" - ] - }, - { - "cell_type": "markdown", - "id": "forward-perth", - "metadata": {}, - "source": [ - "You can use the equals operator in an `if` statement, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "affecting-naples", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "yes, x is 5\n" - ] - } - ], - "source": [ - "if x == 5:\n", - " print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "id": "consolidated-anatomy", - "metadata": {}, - "source": [ - "If you make a mistake and use `=` in an `if` statement, like this:\n", - "\n", - "```\n", - "if x = 5:\n", - " print('yes, x is 5')\n", - "```\n", - "\n", - "That's a **syntax error**, which means that the structure of the program is invalid. Python will print an error message and the program won't run." - ] - }, - { - "cell_type": "markdown", - "id": "twelve-defensive", - "metadata": {}, - "source": [ - "The equals operator is one of the **comparison operators**. The others\n", - "are:\n", - "\n", - "| Operation \t| Symbol \t|\n", - "|-----------------------\t|--------\t|\n", - "| Less than \t| `<` \t|\n", - "| Greater than \t| `>` \t|\n", - "| Less than or equal \t| `<=` \t|\n", - "| Greater than or equal \t| `>=` \t|\n", - "| Equal \t| `==` \t|\n", - "| Not equal \t| `!=` \t|" - ] - }, - { - "cell_type": "markdown", - "id": "center-sequence", - "metadata": {}, - "source": [ - "## Metrics\n", - "\n", - "Getting back to the bike share system, at this point we have the ability to simulate the behavior of the system. Since the arrival of customers is random, the state of the system is different each time we run a\n", - "simulation. Models like this are called random or **stochastic**; models\n", - "that do the same thing every time they run are **deterministic**.\n", - "\n", - "Suppose we want to use our model to predict how well the bike share\n", - "system will work, or to design a system that works better. First, we\n", - "have to decide what we mean by \"how well\" and \"better\".\n", - "\n", - "From the customer's point of view, we might like to know the probability of finding an available bike. From the system-owner's point of view, we\n", - "might want to minimize the number of customers who don't get a bike when\n", - "they want one, or maximize the number of bikes in use. Statistics like\n", - "these that quantify how well the system works are called **metrics**.\n", - "\n", - "As a simple example, let's measure the number of unhappy customers.\n", - "Here's a version of `bike_to_olin` that keeps track of the number of\n", - "customers who arrive at a station with no bikes:" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "arbitrary-ferry", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin(state):\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "id": "severe-contact", - "metadata": {}, - "source": [ - "If a customer arrives at the Wellesley station and finds no bike\n", - "available, `bike_to_olin` updates `wellesley_empty` which counts the\n", - "number of unhappy customers.\n", - "\n", - "This function only works if we initialize `wellesley_empty` when we\n", - "create the `State` object, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "cardiovascular-montgomery", - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=12, wellesley=0, \n", - " wellesley_empty=0)" - ] - }, - { - "cell_type": "markdown", - "id": "computational-prior", - "metadata": {}, - "source": [ - "We can test it by calling `bike_to_olin`:" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "cosmetic-above", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "bike_to_olin(bikeshare)" - ] - }, - { - "cell_type": "markdown", - "id": "pleased-gasoline", - "metadata": {}, - "source": [ - "There should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "bulgarian-palestine", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin12
    wellesley0
    wellesley_empty1
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=12, wellesley=0, wellesley_empty=1)" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "revised-associate", - "metadata": {}, - "source": [ - "Looks good!" - ] - }, - { - "cell_type": "markdown", - "id": "native-kidney", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this chapter, we wrote several versions of `bike_to_olin`:\n", - "\n", - "* We added a parameter, `state`, so we can work with more than one `State` object.\n", - "\n", - "* We added a docstring that explains how to use the function and a comment that explains how it works.\n", - "\n", - "* We used a conditional operator, `==`, to check whether a bike is available, in order to avoid negative bikes.\n", - "\n", - "* We added a state variable, `wellesley_empty`, to count the number of unhappy customers, which is a metric we'll use to quantify how well the system works.\n", - "\n", - "In the exercises, you'll update `bike_to_wellesley` the same way and test it by running a simulation." - ] - }, - { - "cell_type": "markdown", - "id": "impaired-cyprus", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "careful-hacker", - "metadata": {}, - "source": [ - "Here's the code we have so far, with docstrings, all in one place." - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "wrong-internet", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries, decorate\n", - "\n", - "def run_simulation(state, p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " state: State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[0] = state.olin\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " results[i+1] = state.olin\n", - " \n", - " results.plot(label='Olin')\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "instrumental-copyright", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import flip\n", - "\n", - "def step(state, p1, p2):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley ride\n", - " p2: probability of a Wellesley->Olin ride\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "improved-renaissance", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "unavailable-maker", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.olin -= 1\n", - " state.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "bigger-rapid", - "metadata": {}, - "source": [ - "**Exercise:** Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add one to `olin_empty`.\n", - "\n", - "To test it, create a `State` that initializes `olin` and `olin_empty` to `0`, run `bike_to_wellesley`, and check the result." - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "phantom-carter", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "adopted-contrary", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=0, wellesley=12,\n", - " olin_empty=0, wellesley_empty=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "comparable-natural", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "bike_to_wellesley(bikeshare)" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "id": "attractive-amendment", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin0
    wellesley12
    olin_empty1
    wellesley_empty0
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=0, wellesley=12, olin_empty=1, wellesley_empty=0)" - ] - }, - "execution_count": 86, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "possible-initial", - "metadata": {}, - "source": [ - "**Exercise:** Now run the simulation a few times and confirm that the number of bikes is never negative. What's the final state of the system?" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "immune-shock", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=10, wellesley=2,\n", - " olin_empty=0, wellesley_empty=0)\n", - "\n", - "run_simulation(bikeshare, 0.3, 0.2, 60)" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "id": "sporting-collectible", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin0
    wellesley12
    olin_empty2
    wellesley_empty0
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=0, wellesley=12, olin_empty=2, wellesley_empty=0)" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "owned-fitting", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap04.ipynb b/jupyter/chap04.ipynb deleted file mode 100644 index 45528b03..00000000 --- a/jupyter/chap04.ipynb +++ /dev/null @@ -1,1208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "existing-guidance", - "metadata": {}, - "source": [ - "# Chapter 4" - ] - }, - { - "cell_type": "markdown", - "id": "hawaiian-detective", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "informed-defendant", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "caring-gnome", - "metadata": {}, - "source": [ - "Here the code from previous chapters we'll reuse." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "stylish-raising", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import flip\n", - "\n", - "def step(state, p1, p2):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley ride\n", - " p2: probability of a Wellesley->Olin ride\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "wound-bottle", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "prescribed-affect", - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "id": "atlantic-collectible", - "metadata": {}, - "source": [ - "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the Customer rate of customers at bike stations.\n", - "\n", - "We also discuss a program development strategy, called incremental\n", - "development, that might help you write programs faster and spend less\n", - "time debugging." - ] - }, - { - "cell_type": "markdown", - "id": "strategic-newspaper", - "metadata": {}, - "source": [ - "## Functions that return values\n", - "\n", - "We have seen several functions that return values; for example, when you run `sqrt`, it returns a number you can assign to a variable." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "imposed-pregnancy", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.4142135623730951" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import sqrt\n", - "\n", - "root_2 = sqrt(2)\n", - "root_2" - ] - }, - { - "cell_type": "markdown", - "id": "unsigned-recipe", - "metadata": {}, - "source": [ - "When you run `State`, it returns a new `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "accessible-wallace", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "namespace(olin=10, wellesley=2)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import State\n", - "\n", - "bikeshare = State(olin=10, wellesley=2)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "id": "missing-pendant", - "metadata": {}, - "source": [ - "Not all functions have return values. For example, when you run `step`,\n", - "it updates a `State` object, but it doesn't return a value.\n", - "\n", - "To write functions that return values, we can use a `return` statement, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "minimal-supervisor", - "metadata": {}, - "outputs": [], - "source": [ - "def add_five(x):\n", - " return x + 5" - ] - }, - { - "cell_type": "markdown", - "id": "sized-intensity", - "metadata": {}, - "source": [ - "`add_five` takes a parameter, `x`, which could be any number. It\n", - "computes `x + 5` and returns the result. So if we run it like this, the\n", - "result is `8`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "warming-program", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "add_five(3)" - ] - }, - { - "cell_type": "markdown", - "id": "rental-representation", - "metadata": {}, - "source": [ - "As a more useful example, here's a version of `run_simulation` that\n", - "creates a `State` object, runs a simulation, and then returns the\n", - "`State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "sitting-cleveland", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(p1, p2, num_steps):\n", - " state = State(olin=10, wellesley=2,\n", - " olin_empty=0, wellesley_empty=0)\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "id": "minimal-ability", - "metadata": {}, - "source": [ - "We can call `run_simulation` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "difficult-shepherd", - "metadata": {}, - "outputs": [], - "source": [ - "final_state = run_simulation(0.3, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "id": "charming-wheel", - "metadata": {}, - "source": [ - "The result is a `State` object that represents the final state of the system, including the metrics we'll use to evaluate the performance of the system:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "tough-sweet", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 1\n" - ] - } - ], - "source": [ - "print(final_state.olin_empty, \n", - " final_state.wellesley_empty)" - ] - }, - { - "cell_type": "markdown", - "id": "aggregate-lightweight", - "metadata": {}, - "source": [ - "The simulation we just ran starts with `olin=10` and `wellesley=2`, and uses the values `p1=0.3`, `p2=0.2`, and `num_steps=60`. \n", - "These five values are **parameters of the model**, which are quantities that determine the behavior of the system.\n", - "\n", - "It is easy to get the parameters of a model confused with the parameters of a function. \n", - "In fact, it is common for the parameters of the model to appear as parameters in functions. \n", - "\n", - "For example, the previous version of `run_simulation` takes `p1`, `p2`, and `num_steps` as parameters.\n", - "So we can call `run_simulation` with different parameters and see how\n", - "the metrics, like the number of unhappy customers, depend on the\n", - "parameters. But before we do that, we need a new version of a `for` loop." - ] - }, - { - "cell_type": "markdown", - "id": "valuable-aircraft", - "metadata": {}, - "source": [ - "## Loops and arrays\n", - "\n", - "In `run_simulation`, we use this `for` loop:\n", - "\n", - "```\n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - "```\n", - "\n", - "In this example, `range` creates a sequence of numbers from 0 to `num_steps` (including `0` but not `num_steps`). \n", - "Each time through the loop, the next number in the sequence gets assigned to the loop variable, `i`.\n", - "\n", - "But `range` only works with integers; to get a sequence of non-integer\n", - "values, we can use `linspace`, which is defined NumPy:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "bound-juice", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. , 0.25, 0.5 , 0.75, 1. ])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import linspace\n", - "\n", - "p1_array = linspace(0, 1, 5)\n", - "p1_array" - ] - }, - { - "cell_type": "markdown", - "id": "ordered-colleague", - "metadata": {}, - "source": [ - "The arguments indicate where the sequence should start and stop, and how\n", - "many elements it should contain. In this example, the sequence contains\n", - "`5` equally-spaced numbers, starting at `0` and ending at `1`.\n", - "\n", - "The result is a NumPy **array**, which is a new kind of object we have\n", - "not seen before. An array is a container for a sequence of numbers.\n", - "\n", - "We can use an array in a `for` loop like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "commercial-methodology", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0\n", - "0.25\n", - "0.5\n", - "0.75\n", - "1.0\n" - ] - } - ], - "source": [ - "for p1 in p1_array:\n", - " print(p1)" - ] - }, - { - "cell_type": "markdown", - "id": "finnish-budapest", - "metadata": {}, - "source": [ - "When this loop runs, it\n", - "\n", - "1. Gets the first value from the array and assigns it to `p1`.\n", - "\n", - "2. Runs the body of the loop, which prints `p1`.\n", - "\n", - "3. Gets the next value from the array and assigns it to `p1`.\n", - "\n", - "4. Runs the body of the loop, which prints `p1`.\n", - "\n", - "And so on, until it gets to the end of the array. This will come in handy in the next section." - ] - }, - { - "cell_type": "markdown", - "id": "crazy-belize", - "metadata": {}, - "source": [ - "## Sweeping parameters\n", - "\n", - "If we know the actual values of parameters like `p1` and `p2`, we can\n", - "use them to make specific predictions, like how many bikes will be at\n", - "Olin after one hour.\n", - "\n", - "But prediction is not the only goal; models like this are also used to\n", - "explain why systems behave as they do and to evaluate alternative\n", - "designs. For example, if we observe the system and notice that we often run out of bikes at a particular time, we could use the model to figure out why that happens. And if we are considering adding more bikes, or another station, we could evaluate the effect of various \"what if\" scenarios.\n", - "\n", - "As an example, suppose we have enough data to estimate that `p2` is\n", - "about `0.2`, but we don't have any information about `p1`. We could run simulations with a range of values for `p1` and see how the results vary. This process is called **sweeping** a parameter, in the sense that the value of the parameter \"sweeps\" through a range of possible values.\n", - "\n", - "Now that we know about loops and arrays, we can use them like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "working-chair", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 0\n", - "0.12 0\n", - "0.24 0\n", - "0.36 0\n", - "0.48 7\n", - "0.6 7\n" - ] - } - ], - "source": [ - "p1_array = linspace(0, 0.6, 6)\n", - "p2 = 0.2\n", - "num_steps = 60\n", - "\n", - "for p1 in p1_array:\n", - " final_state = run_simulation(p1, p2, num_steps)\n", - " print(p1, final_state.olin_empty)" - ] - }, - { - "cell_type": "markdown", - "id": "chicken-mainstream", - "metadata": {}, - "source": [ - "Each time through the loop, we run a simulation with a different value\n", - "of `p1` and the same value of `p2`, `0.2`. Then we print `p1` and the\n", - "number of unhappy customers at Olin.\n", - "\n", - "To save and plot the results, we can use a `SweepSeries` object, which\n", - "is similar to a `TimeSeries`; the difference is that the labels in a\n", - "`SweepSeries` are parameter values rather than time values.\n", - "\n", - "We can create an empty `SweepSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "instrumental-session", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import SweepSeries\n", - "\n", - "sweep = SweepSeries()" - ] - }, - { - "cell_type": "markdown", - "id": "listed-orleans", - "metadata": {}, - "source": [ - "And add values like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "hollywood-technical", - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " final_state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = final_state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "id": "instructional-showcase", - "metadata": {}, - "source": [ - "The result is a `SweepSeries` that maps from each value of `p1` to the\n", - "resulting number of unhappy customers. Then we can plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "hollywood-spirit", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "sweep.plot(label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Customer rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "id": "intense-start", - "metadata": {}, - "source": [ - "NumPy provides functions that compute a variety of summary statistics, like `mean`, `median`, and `std` (which computes standard deviation).\n", - "\n", - "We can use `mean` to compute the average of the values in a series, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "contemporary-enough", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.166666666666667" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import mean\n", - "\n", - "mean(sweep)" - ] - }, - { - "cell_type": "markdown", - "id": "owned-senior", - "metadata": {}, - "source": [ - "In this example, computing the mean might not be useful, but in the exercises below, it will be." - ] - }, - { - "cell_type": "markdown", - "id": "korean-christianity", - "metadata": {}, - "source": [ - "## Incremental development\n", - "\n", - "When you start writing programs that are more than a few lines, you\n", - "might find yourself spending more and more time debugging. The more code you write before you start debugging, the harder it is to find the problem.\n", - "\n", - "**Incremental development** is a way of programming that tries to\n", - "minimize the pain of debugging. The fundamental steps are:\n", - "\n", - "1. Always start with a working program. If you have an example from a\n", - " book, or a program you wrote that is similar to what you are working\n", - " on, start with that. Otherwise, start with something you *know* is\n", - " correct, like `x=5`. Run the program and confirm that it does what\n", - " you expect.\n", - "\n", - "2. Make one small, testable change at a time. A \"testable\" change is\n", - " one that displays something or has some other effect you can check.\n", - " Ideally, you should know what the correct answer is, or be able to\n", - " check it by performing another computation.\n", - "\n", - "3. Run the program and see if the change worked. If so, go back to\n", - " Step 2. If not, you will have to do some debugging, but if the\n", - " change you made was small, it shouldn't take long to find the\n", - " problem.\n", - "\n", - "When this process works, your changes usually work the first time, or if they don't, the problem is obvious. In practice, there are two problems with incremental development:\n", - "\n", - "- Sometimes you have to write extra code to generate visible output\n", - " that you can check. This extra code is called **scaffolding**\n", - " because you use it to build the program and then remove it when you\n", - " are done. That might seem like a waste, but time you spend on\n", - " scaffolding is almost always time you save on debugging.\n", - "\n", - "- When you are getting started, it might not be obvious how to choose\n", - " the steps that get from `x=5` to the program you are trying to\n", - " write. You will see more examples of this process as we go along,\n", - " and you will get better with experience.\n", - "\n", - "If you find yourself writing more than a few lines of code before you\n", - "start testing, and you are spending a lot of time debugging, try\n", - "incremental development." - ] - }, - { - "cell_type": "markdown", - "id": "nominated-assault", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "appreciated-preview", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "primary-quest", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", - "\n", - "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "reflected-freedom", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def make_state():\n", - " state = State(olin=10, wellesley=2)\n", - " return state" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "north-formation", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "init = make_state()" - ] - }, - { - "cell_type": "markdown", - "id": "robust-blair", - "metadata": {}, - "source": [ - "**Exercise:** Read the documentation of `linspace` at <>.\n", - "Then use it to make an array of 101 equally spaced points between 0 and 1 (including both)." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "collected-butter", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,\n", - " 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,\n", - " 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,\n", - " 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,\n", - " 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,\n", - " 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,\n", - " 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,\n", - " 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,\n", - " 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,\n", - " 0.99, 1. ])" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "p1_array = linspace(0, 1, 101)\n", - "p1_array" - ] - }, - { - "cell_type": "markdown", - "id": "fleet-debut", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code from this chapter in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", - "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "authorized-sarah", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_p1(p1_array):\n", - " p2 = 0.2\n", - " num_steps = 60\n", - " sweep = SweepSeries()\n", - " \n", - " for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "romance-wisdom", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p1_array = linspace(0, 1, 101)\n", - "sweep = sweep_p1(p1_array)\n", - "sweep.plot(label='Olin')\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Customer rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "id": "developmental-broad", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "norman-banana", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_p2(p2_array):\n", - " p1 = 0.5\n", - " num_steps = 60\n", - " sweep = SweepSeries()\n", - " \n", - " for p2 in p2_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p2] = state.olin_empty\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "mexican-robert", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p2_array = linspace(0, 1, 101)\n", - "sweep = sweep_p2(p2_array)\n", - "sweep.plot(label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Customer rate at Wellesley (p2 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "id": "separate-mention", - "metadata": {}, - "source": [ - "## Optional Exercises\n", - "\n", - "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now." - ] - }, - { - "cell_type": "markdown", - "id": "bearing-orbit", - "metadata": {}, - "source": [ - "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", - "\n", - "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", - "`num_runs` specifies how many times it should call `run_simulation`.\n", - "\n", - "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`.\n", - "At the end, it should return the `TimeSeries`.\n", - "\n", - "Test your function with parameters\n", - "\n", - "```\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "```\n", - "\n", - "Display the resulting `TimeSeries` and use the `mean` function from NumPy to compute the average number of unhappy customers." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "accredited-salmon", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_multiple_simulations(p1, p2, num_steps, num_runs):\n", - " totals = TimeSeries()\n", - " \n", - " for i in range(num_runs):\n", - " state = run_simulation(p1, p2, num_steps)\n", - " totals[i] = state.olin_empty + state.wellesley_empty\n", - " \n", - " return totals" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "visible-allowance", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Quantity
    Time
    07
    13
    21
    33
    44
    55
    62
    73
    80
    90
    \n", - "
    " - ], - "text/plain": [ - " Quantity\n", - "Time \n", - "0 7\n", - "1 3\n", - "2 1\n", - "3 3\n", - "4 4\n", - "5 5\n", - "6 2\n", - "7 3\n", - "8 0\n", - "9 0" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "from modsim import show\n", - "\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "totals = run_multiple_simulations(p1, p2, num_steps, num_runs)\n", - "show(totals)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "spatial-fundamentals", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.8" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "mean(totals)" - ] - }, - { - "cell_type": "markdown", - "id": "structural-expense", - "metadata": {}, - "source": [ - "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", - "\n", - "```\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "```\n", - "\n", - "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", - "\n", - "What value of `p1` minimizes the average number of unhappy customers?" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "reverse-emphasis", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "p1_array = linspace(0, 1, 20)\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "\n", - "sweep = SweepSeries()\n", - "for p1 in p1_array:\n", - " totals = run_multiple_simulations(p1, p2, num_steps, num_runs)\n", - " sweep[p1] = mean(totals)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "broad-latitude", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABA9ElEQVR4nO3dd3gU5drH8e8dWuhdioIgKNIRYgOkSxMEBFGaYBf1WA56wPIKByyoCDYUsVIEQQFFQGnSixCUooI0gyBI753kfv+YCWeJKZOQ3dkk9+e69sru7JTfzsLeOzPPPo+oKsYYY0y4ifA7gDHGGJMYK1DGGGPCkhUoY4wxYckKlDHGmLBkBcoYY0xYsgJljDEmLFmBMmFHRAaIyFj3flkROSYi2XzONF9E7nPv9xKRxRe5vkYisiN90qVquzeJyO8Bj2NEpFk6rv/8e2fMxbICZULO/YBfJyInRORvEXlfRAolNq+q/qmq+VQ1Ng3b+V1EOgc8ricimsi0YyKSPU0vJsy4BeKs+5qOich6EekY/7yqLlLVSn5mNMYrK1AmpESkD/Aq8DRQELgBuByYLSI503lzC4GGAY8bABsSmbZUVc+l87b9NMEt6vmAJ4CxIlLC50ypllm+NJi0swJlQkZECgD/Bf6lqt+r6llVjQE64xSp7oksU8496snuPp4vIoNEZImIHBWRWSJSLIlNLsQpQPFuwimOCactdNd9g4gsFZFDIrJGRBp5fF1Xi8hsETmQyFFbaxH5zc36l4g8lcQ6SovIJBHZKyJ/iMhj7vSS7pFm0YB567jz5Ugpm6rOBI4CFdxlkzy16L6OP0TkTvdxGxFZ7e6PpSJSI2Devu7rOeq+5qYBq8opIqPd534VkaiA5fqJyBb3ud9EpEPAc73c93WYiBwABohILhEZIiJ/ishuERkhIrlTet0mc7ACZUKpLhAJTA6cqKrHgO+Amz2upytwN3AJkBNI9EMfWABUFZEiIhIBRAETgEIB0+oCC0XkUmA68CJQxF3nJBEpnlwQEckLzAbGuXm6AO+JSFV3lo+BB1U1P1AN+CGRdUQA3wJrgEuBpsATItJCVf8G5uMU8XjdgS9U9WwK2UREbsHZR7+lMG9tYBbOl4cv3MefAA8CRYEPgKluwagEPApc676uFkBMwOpuBb4ACgFTgXcDntuC86WgIM6XlbEiUirg+euBrTj78iWcLxRXAbWAiu7+eSG512IyDytQJpSKAfuSOJ22y33ei09VdaOqngQm4nx4/YOq/gn8ifOBWBPY5C6zJGBaJPAjzof+DFWdoapxqjobiAZap5ClDRCjqp+q6jlV/QmYBHRynz8LVBGRAqp60H0+oWuB4qo6UFXPqOpW4EPgTvf5UW4+xGks0gUYk0ymziJyCDiOUyBeVtVDycx/kztfT1Wd5k67H/hAVX9U1VhVHQWcxjklGwvkcl9XDlWNUdUtAetb7O7HWDdnzfgnVPVLVd3p7uMJwCbguoBld6rqO+6/kVNujidV9YCqHgVeDtgvJpOzAmVCaR9QLIlrC6Xc5734O+D+CSAfgHv6J75xwLPu8/Gn+RoAi9xpiwOm/aiqp3FOMd7uns465H7A13dzJedy4PoEy3UDSrrPd8QpcttEZIGI3JjEOkonWMezQPx1o29wisEVOEeZh1V1RTKZJqpqIVXNg3Nq7y4ReTCZ+R/CuQ43L0GmPgkylQFKq+pmnGtbA4A9IvKFiJQOWDbh+xMZcIr2roDThodwjioDv5hsD7hfHMgDrAqY/3t3uskCrECZUFqG8y38tsCJ7mmyVsDci1m5qj4U3zhAVV92J8cXqJv4X4FaFDBtoTttOzDG/WCPv+VV1cEpbHY7sCDBcvlUtbebaaWqtsM5ZfU1zhFfYuv4I8E68qtqa3cdp9zlugE9SP7oKeE+icE5fdo2mdkeAsqKyLAEmV5KkCmPqo531ztOVevjFDLFORWXLBG5HOfI8FGgqKoWAn4BJDBywP19wEmgakCGgm7jD5MFWIEyIaOqh3GuO7wjIi1FJIeIlAO+BHaQig/eVFgIXIPTcm+JO20dUB5ozP8K1FigrYi0EJFsIhLpNii4LIX1TwOuEpEe7uvJISLXikhlEckpIt1EpKB7vegIzumxhFYAR9yGB7nd7VcTkWsD5hkN9MK5vuP5d0Zu/pbAr8nMdtSdp4GIxBfkD4GHROR691pWXhG5RUTyi0glEWkiIrlwTsOdTOJ1JZQXpwDtdbPdjXMElShVjXNzDBORS9xlLhWRFh62ZTIBK1AmpFT1NZzTV0NwPrB/xPm23tQ91Zbe29sI7AF2xV+HcT/4VgAFgKXutO1AOzfbXjfT06Twf8S9LtIc57rITpzTW6/iXKMB54gnRkSO4Byp/KOlonutpi3OtbQ/cI4cPsJpSBA/zxIgDvjJPSpKzh3xpzqBlTiF+b8pvI5DOKcPW4nIIFWNxrn+8y5wENiMUyBxX9tgN+ffOEeHz5ICVf0NeAPnSHo3UJ3/fWlISl9328vdfTgHsN9xZRFiAxYakzGIyA/AOFX9yO8sxoSCFShjMgD3dN9soIx71GZMpmen+IwJcyIyCufU1hNWnExWYkdQxhhjwpIdQRljjAlLGaIzxmLFimm5cuX8jmGMMSYIVq1atU9V//ED7AxRoMqVK0d0dLTfMYwxxgSBiGxLbLqd4jPGGBOWrEAZY4wJS1agjDHGhKUMcQ0qMWfPnmXHjh2cOnXK7yhBFRkZyWWXXUaOHCmOTWeMMZlKhi1QO3bsIH/+/JQrVw4RSXmBDEhV2b9/Pzt27KB8+fJ+xzHGmJDKsKf4Tp06RdGiRTNtcQIQEYoWLZrpjxKNMSYxGbZAAZm6OMXLCq/RGGMSk6ELlDHGGH+ciT3Dm8vf5EzsmaBtwwpUGh06dIj33nsv2XliYmIYN25ciuuKiYmhWrUkx20zxpiw88K8F3hy5pMsiFkQtG1YgUqj9CxQxhiTkSyIWcBrS17jgdoPcHOFm4O2HStQadSvXz+2bNlCrVq1ePrpp3n66aepVq0a1atXZ8KECefnWbRoEbVq1WLYsGHExMRw0003Ubt2bWrXrs3SpUt9fhXGGJM6h04doseUHlQsUpGhLYYGdVsZtpl5oCe+f4LVf69O13XWKlmLN1u+meTzgwcP5pdffmH16tVMmjSJESNGsGbNGvbt28e1115LgwYNGDx4MEOGDGHatGkAnDhxgtmzZxMZGcmmTZvo0qWL9TFojMlQHp7+MLuO7WLpPUvJmzNvULeVKQqU3xYvXkyXLl3Ili0bJUqUoGHDhqxcuZICBQpcMN/Zs2d59NFHWb16NdmyZWPjxo0+JTbGmNQbt24c438Zz4uNX+TaS68N+vYyRYFK7kgnFLwO+jhs2DBKlCjBmjVriIuLIzIyMsjJjDEmfWw7tI3e03tTr0w9+tXvF5Jt2jWoNMqfPz9Hjzqjbzdo0IAJEyYQGxvL3r17WbhwIdddd90F8wAcPnyYUqVKERERwZgxY4iNjfUrvjHGeBYbF0uPKT1QVcZ0GEO2iGwh2W6mOILyQ9GiRalXrx7VqlWjVatW1KhRg5o1ayIivPbaa5QsWZKiRYuSPXt2atasSa9evXj44Yfp2LEjX375JY0bNyZv3uCevzXGmPTw2pLXWPTnIka3H035wqHrdk28np7yU1RUlCZsTLB+/XoqV67sU6LQykqv1RgTXlbtXMUNH9/AbZVv44uOXwSldxsRWaWqUQmn2yk+Y4wxiTpx9gTdJnejZL6SjLhlRMi7XrNTfMYYYxLVZ2YfNu7fyNy75lI4d+GQbz9oR1AiEikiK0RkjYj8KiL/dacXEZHZIrLJ/ZvmV50RTk9erKzwGo0x4WfaxmmMWDWCPjf2oXH5xr5kCOYpvtNAE1WtCdQCWorIDUA/YK6qXgnMdR+nWmRkJPv378/UH+Dx40FZc3RjTCjtPrabe765h1ola/Fikxd9yxG0U3zqVI5j7sMc7k2BdkAjd/ooYD7QN7Xrv+yyy9ixYwd79+696KzhLH5EXWOMCQVV5Z6p93D0zFE+v+1zcmXP5VuWoF6DEpFswCqgIjBcVX8UkRKqugtAVXeJyCVJLPsA8ABA2bJl//F8jhw5bJRZY4xJZyOiRzBj0wzeafUOVYpX8TVLUFvxqWqsqtYCLgOuExHPY0qo6khVjVLVqOLFiwctozHGGMeGfRvoM6sPLSu25JFrH/E7TmiamavqIZxTeS2B3SJSCsD9uycUGYwxxiTtTOwZuk3uRt6cefm03adhMZp3igVKRPKKSIR7/yoRuVVEcnhYrriIFHLv5waaARuAqUBPd7aewDdpzG6MMSadvDDvBX7a9RMftf2IkvlK+h0H8HYNaiFwk9scfC4QDdwBdEthuVLAKPc6VAQwUVWnicgyYKKI3Av8Cdye5vTGGGMuWvwAhPfXvp92V7fzO855XgqUqOoJt6C8o6qvicjPKS2kqmuBaxKZvh9omvqoxhhj0lvgAITDWgzzO84FPBUoEbkR54jp3lQsZ4wxJsw9PP1hdh7dybJ7lwV9AMLU8lJoHgeeAaao6q8icgUwL7ixjDHGBFv8AISDGg8KyQCEqZVsgXKvH7VV1Vvjp6nqVuCxYAczxhgTPIEDED5T/xm/4yQq2VZ8qhoL1AlRFmOMMSHg1wCEqeXlFN/PIjIV+BI4Hj9RVScHLZUxxpigiR+AcFT7USEdgDC1vBSoIsB+oEnANAWsQBljTAazcNtCXpj/Ap2rdqZHjR5+x0lWigVKVe8ORRBjjDHBteKvFbQZ14aKRSr6MgBhannpSeIqEZkrIr+4j2uIyPPBj2aMMSa9rN29lpZjW1I8b3Hm9JjjywCEqeWlL74PcZqZn4XzP8C9M5ihjDHGpJ8N+zbQbHQz8ubMy9y75nJpgUv9juSJlwKVR1VXJJh2LhhhjDHGpK+tB7fSdHRTIiSCuXfNpVyhcn5H8sxLI4l9IlIBp2EEItIJ2BXUVMYYYy7a9sPbaTq6KafOnWJBrwVcVfQqvyOlipcC9QgwErhaRP4C/gC6BzWVMcaYi7L72G6ajWnGgZMH+OGuH6h2iefh+MKGl1Z8W4FmIpIXiFDVo8GPZYwxJq32n9hPszHN+OvIX8zqMYs6pTNmfwspFih3TKe7gHJA9vhmiapq3R0ZY0yYOXzqMC3GtmDT/k3M6DaDumXq+h0pzbyc4psBLAfWAXHBjWOMMSatjp85zi3jbmHt7rV8fefXNCnfJOWFwpiXAhWpqv8OehJjjDFpdurcKdp90Y5lO5YxsdNEWl/Z2u9IF81LM/MxInK/iJQSkSLxt6AnM8YY48mZ2DN0mtiJH/74gVHtR9GxSke/I6ULL0dQZ4DXgedwm5q7f68IVihjjDHenIs7R7fJ3Zi+aToftPmA7jUyTyNrLwXq30BFVd0X7DDGGGO8i9M47vnmHr767SuGtRjGA3Ue8DtSuvJyiu9X4ESwgxhjjPFOVXlk+iOMWTuGFxu/yBM3POF3pHTn5QgqFlgtIvOA0/ETrZm5Mcb4Q1V5atZTjFg1gmfqP8NzDZ7zO1JQeClQX7s3Y4wxYaD//P4MXT6Ux657jJeavOR3nKDx0pPEKBHJCcR34vS7qp5NaTkRKQOMBkri/H5qpKq+JSIDgPuBve6sz6rqjLSEN8aYrObVxa8yaOEg7rvmPt5s+WbYj+l0Mbz0JNEIGAXEAAKUEZGeqrowhUXPAX1U9ScRyQ+sEpHZ7nPDVHVImlMbY0wW9M6P79Bvbj+6Vu/KiDbhP+DgxfJyiu8NoLmq/g7OAIbAeCDZzp1UdRdur+eqelRE1gMZYxASY4wJEyfOnuDrDV8zas0oZm2ZRYerOzCq/SiyRWTzO1rQeSlQOeKLE4CqbhSRHKnZiIiUA64BfgTqAY+KyF1ANM5R1sHUrM8YYzIzVWXJ9iV8tvozvvztS46cPsLlBS9nQMMB9Kvfj+wRXj66Mz4vrzJaRD4GxriPuwGrvG5ARPIBk4AnVPWIiLwPDML5se8gnCO0exJZ7gHgAYCyZct63ZwxxmRYMYdiGL1mNKPXjGbLwS3kzZGX26veTs+aPWlweQMixMsvgzIPUdXkZxDJhTMmVH2ca1ALgeGqeibFlTtHWtOAmao6NJHnywHTVDXZgUqioqI0Ojo6pc0ZY0yGc/T0USatn8Rnqz9jwbYFCELj8o3pWbMnt1W+jXw58/kdMehEZJWqRiWc7uUI6iG3uJwvMCLyOPBWChsU4GNgfWBxEpFS7vUpgA7ALx4yGGNMphGnccz7Yx6j1oxi0vpJnDh7gopFKvJi4xfpUbMHZQvaWSPwVqB68s9i1CuRaQnVA3oA60RktTvtWaCLiNTCOcUXAzzoLaoxxmRsG/dvZNTqUYxZO4btR7ZTMFdBulfvTs9aPbnxshszfau81EqyQIlIF6ArUF5EpgY8VQDYn9KKVXUxzinBhOw3T8aYLONc3Dk+/flTPl39Kct2LCNCImheoTmv3/w6t1a6ldw5cvsdMWwldwS1FKeZeDGchgzxjgJrgxnKGGMyi4ELBjJo4SCqFq/Ka81eo1uNbpTOX9rvWBlCkgVKVbcB20SkGXBSVePc30BdjTO6rjHGmGT8vu93Xl3yKl2rd2Vsh7F2Ci+VvLRZXAhEisilwFzgbuCzYIYyxpiMTlV5eMbD5M6em6HNh1pxSgMvBUpU9QRwG/COqnYAqgQ3ljHGZGzjfxnPD3/8wCtNX6FEvhJ+x8mQPBUoEbkR5we6091pWeNnzMYYkwaHTh3i3zP/zbWlr810gwiGkpdC8wTwDDBFVX8VkSuAeUFNZYwxGdjzPzzP3hN7mdFtRpboMy9YvAy3sQBYEPB4K2CDFRpjTCKid0bz3sr3ePS6R6ldqrbfcTI0L8NtzMP5Ue0FVLVJUBIZY0wGFRsXy0PTHqJEvhIMajzI7zgZnpdTfE8F3I8EOuKM9WSMMSbAiOgRrNq1ivEdx1MwsqDfcTI8L6f4EvZcvkREFiQ6szHGZFG7ju7i2R+e5eYrbuaOqnf4HSdT8HKKr0jAwwicgQpLBi2RMcZkQH1m9eH0udMMbz3cfvOUTryc4luFcw1KcE7t/QHcG8xQxhiTkczZOofxv4ynf8P+XFn0Sr/jZBpeTvGVD0UQY4zJiE6fO80jMx6hYpGK9Kvfz+84mUqKP9QVkUdEpFDA48Ii8nBQUxljTAbx2pLX2Lh/I8NbDycye6TfcTIVLz1J3K+qh+IfqOpB4P6gJTLGmAxiy4EtvLToJTpX7UzzCs39jpPpeClQERJwxU9EsgE5gxfJGGPCn6ry6HePkjNbToa1GOZ3nEzJSyOJmcBEERmB01jiIeD7oKYyxpgw99VvX/H95u95q+VbNr5TkHgpUH2BB4DeOC35ZgEfBTOUMcaEsyOnj/DEzCe4puQ1PHytXZIPFi+t+OKAEe7NGGOyvP7z+rPr6C6m3DGF7BE2uEOweLkGZYwxxrX679W8veJtHqzzINddep3fcTI1K1DGGONRnMbRe3pviuUpxstNX/Y7Tqbn5XdQ1UIRxBhjwt1HP33E8h3LGXLzEArnLux3nEzPyxHUCBFZISIPB/5g1xhjspI9x/fQb04/GpVrRPca3f2OkyWkWKBUtT7OcO9lgGgRGSciN6e0nIiUEZF5IrJeRH4Vkcfd6UVEZLaIbHL/2tcQY0zYe3r20xw7c4z3b3nfOoMNEU/XoFR1E/A8TpPzhsDbIrJBRG5LZrFzQB9VrQzcADwiIlWAfsBcVb0SmOs+NsaYsLUgZgGj14zm6bpPc3Wxq/2Ok2V4uQZVQ0SGAeuBJkBbt+g0AZL8+bSq7lLVn9z7R93lLwXaAaPc2UYB7S/mBRhjTDCdiT1D7+m9KVeoHM81eM7vOFmKlwb87wIfAs+q6sn4iaq6U0Se97IRESkHXAP8CJRQ1V3uOnaJyCWpTm2MMSEydNlQ1u9bz7Qu08iTI4/fcbIULz/UbSAiOYGrRUSB31X1jPvcmJSWF5F8wCTgCVU94vXcrYg8gNODBWXLlvW0jDHGpKeYQzEMXDCQDld34JarbvE7Tpbj5RRfa2AL8DbO0dRmEWnlZeUikgOnOH2uqpPdybtFpJT7fClgT2LLqupIVY1S1ajixYt72ZwxxqSrx757jAiJ4K2Wb/kdJUvy0khiKNBYVRupakOgMclce4rn9oD+MbBeVYcGPDUV6One7wl8k7rIxhgTfJN+m8S3G7/lv43+S5mCZfyOkyV5uQa1R1U3BzzeShJHPQnUA3oA60RktTvtWWAwTu/o9wJ/Ard7j2uMMcG36+guHpz2IFGlo3js+sf8jpNleSlQv4rIDGAiznAbtwMr45uYB5y6u4CqLsbp/TwxTdOQ1Rhjgk5VuXfqvZw4e4KxHcaSI1sOvyNlWV4KVCSwG+f3TwB7gSJAW5yClWiBMsaYjGhE9Ai+2/wd77Z6l0rFKvkdJ0vz0orv7lAEMcYYv/2+73f6zOpDiwotbJynMOClFd8VIvKtiOwVkT0i8o2IlA9FOGOMCZWzsWfpMaUHuXPk5pN2n1h3RmHASyu+cTjXn0oBpYEvgS+CGcoYY0LtxYUvsnLnSka2GWlDuIcJLwVKVHWMqp5zb2Nxrj0ZY0ymsHzHcl5a9BJ31byLjlU6+h3HuLw0kpgnIv1wjpoUuAOYLiJFAFT1QBDzGWNMUB07c4weU3pwWYHLeLvl237HMQG8FKg73L8PJph+D07BuiJdExljTAg9NespthzYwrye8ygYWdDvOCaAl1Z81iDCGJMpTds4jQ9WfcDTdZ+mYbmGKS9gQsrLEVT8sO9VcH4TBYCqjg5WKGOMCba9x/dy79R7qVGiBoMaD/I7jklEigVKRPoDjXAK1AygFbAYsAJljMmQVJX7v72fQ6cOMafHHHJlz+V3JJMIL634OuF0TfS3+6PdmoC9m8aYDOvT1Z/yze/f8ErTV6heorrfcUwSvBSok6oaB5wTkQI4HcVawwhjTIa09eBWHv/+cRqXa8wTNzzhdxyTDC/XoKJFpBDOqLqrgGPAimCGMsaYYIiNi6XHlB5kk2x81v4zIsTLd3TjFy+t+OI7pBohIt8DBVR1bXBjGWNM+nt1yass3b6UsR3GUragjdQd7ry24rsUuDx+fhFpoKoLgxnMGGPS00+7fqL//P50rtqZrtW7+h3HeOClFd+rOD/W/Q2IdScrYAXKGJMhnDx7ku6Tu3NJ3kt4/5b3rSPYDMLLEVR7oJKqng5yFmOMCYp+c/qxft96ZnWfRZHcRfyOYzzycoVwK2BDShpjMqTZW2bz9oq3eey6x7i5ws1+xzGpkOQRlIi8g3Mq7wSwWkTmAuePolT1seDHSx9xGsfR00etny1jspgDJw/Q65teVC5WmcHNBvsdx6RScqf4ot2/q4CpIcgSNN0nd2f7ke3MvWsuObPl9DuOMSYEVJXe03uz5/gevu3yLblz5PY7kkmlJAuUqo4KZZBgantVW7pO7kqfmX14p/U7fscxxoTAuHXjmPjrRF5q8hK1S9X2O45JAy+t+OoBA/hfM3MBVFUzTG8SXap3YdWuVbyx7A3qlK5Dr1q9/I5kjAmiPw//ySMzHqFumbr0rdfX7zgmjby04vsYeBLnVF9sCvOGrcHNBvPz3z/z0LSHqHZJNaJKR/kdyRgTBHEaR6+vexGrsYzpMIZsEdn8jmTSyEsrvsOq+p2q7lHV/fG3lBYSkU9EZI+I/BIwbYCI/CUiq91b64tKnwrZI7LzRccvKJGvBLdNuI29x/eGatPGmCCK0zjW7V7HuyvepdPETpQcUpJ5MfN4q+VbXFE4w5zoMYnwOuT768BkLmzF91MKy30GvMs/h+UYpqpDUhMyvRTPW5zJnSdT75N6dP6qM7N7zCZ7hKfONIwxYSK+IC3YtoD5MfNZuG0h+08635nLFixLqytb0bpiazpX7exzUnOxvHw6X+/+DTwnpkCT5BZS1YUiUi6NuYKmTuk6jGw7kp5f96Tv7L680eINvyMZY5IRGxfL2t1rLyhIB08dBKBcoXK0rdSWhpc3pFG5RpQrVM7fsCZdeekstnE6b/NREbkLpxl7H1U9mM7rT9FdNe8iemc0Q5cPpU7pOtYvlzFhJDYultV/rz5fkBb9uYhDpw4BUKFwBTpc3YFG5RrRsFxD6/A1kxNVTX4GkRcSm66qA1NcuXMENU1Vq7mPSwD7cI7ABgGlVPWeJJZ9AHgAoGzZsnW2bduW0uZS5WzsWZqObkr0zmiW3ruUWiVrpev6jTGps+XAFp6c+SQLti3gyOkjAFxZ5MrzR0cNyzXksgKX+ZzSBIOIrFLVf7Rc81Kg+gQ8jATaAOuTKiwJli1HQIHy+lxCUVFRGh0dndJsqbb72G7qjKxDzmw5WXn/SormKZru2zDGpExVuXnMzaz4awVdq3el4eUNaViuIaXzl/Y7mgmBpAqUl1N8F1ykEZEhpLFnCREppaq73IcdgF+Smz/YSuQrwaTOk2jwWQO6Tu7KjK4zrEmqMT6YsWkGc/+Yy5st3uTxGx73O44JE2kZTjIPHoZ8F5HxwDKgkojsEJF7gddEZJ2IrAUa4/y+ylfXX3Y9w1sPZ9aWWTz/w/N+xzEmyzkXd46nZz9NxSIV6X1tb7/jmDDipSeJdTjXjACyAcWBFK8/qWqXRCZ/nKp0IXJf7fuI3hnN4CWDqV2qNrdXvd3vSMZkGR+u+pD1+9Yz5Y4p1lemuYCXZuZtAu6fA3ar6rkg5fHNWy3fYs3uNdz9zd1ULl6ZapekeGnMGHORjpw+Qv/5/WlweQPaVWrndxwTZlI8xaeq2wJuf2XG4gSQK3suJnWeRP5c+ekwocP5Zq3GmOB5ZdEr7D2xlzeav2Gj3Jp/SMs1qEyrdP7SfHn7l8QciqHb5G7EaZzfkYzJtLYd2saw5cPoXqO79Y1pEmUFKoH6ZevzVsu3mLFpBgPmD/A7jjGZ1rM/PIuI8HKTl/2OYsKUFahE9I7qzd217mbQwkF8s+Ebv+MYk+ms+GsF49aN4983/JsyBcv4HceEqSQLlIgcFZEjidyOisiRUIYMNRHhvVveI6p0FD2m9GDDvg1+RzIm01BV/j3z31yS9xL61e/ndxwTxpIsUKqaX1ULJHLLr6oFQhnSD5HZI5nceTKR2SPpMKHD+a5XjDEXZ/L6ySzZvoSBjQaSP1d+v+OYMOb5FJ+IXCIiZeNvwQwVLsoULMPE2yeyaf8men7d0xpNGHORzsSeoe+cvlQtXpV7a9/rdxwT5lIsUCJyq4hsAv4AFgAxwHdBzhU2GpVrxJDmQ/h6w9e8vMgu5hpzMYavGM6Wg1sY0nyIjcVmUuTlCGoQcAOwUVXLA02BJUFNFWYev/5xulXvxgvzXmD6xul+xzEmQzpw8gCDFg6ieYXmtKzY0u84JgPwUqDOukO8R4hIhKrOA2oFN1Z4ERFGth1JzZI1aT+hPf3n9edM7Bm/YxmToQxaMIjDpw8z5GZfBtQ2GZCXAnVIRPIBC4HPReQtnC6PspQ8OfIw9665dKnWhYELB1JnZB1W/rXS71jGZAib9m9i+Mrh3FPrHqqXqO53HJNBeClQ7YATOD2Pfw9s4cL++bKMIrmLMLrDaKZ1mcbBkwe54eMb+M/s/3Dy7Em/oxkT1vrO6UvObDkZ1GSQ31FMBuKlQL2gqnGqek5VR6nq20DfYAcLZ7dcdQu/Pvwr915zL68vfZ2aI2qy+M/FfscyJiwt3LaQKRum0LdeX0rmK+l3HJOBeClQNycyrVV6B8loCkYWZGTbkczpMYezcWdp8GkD/jXjXxw7c8zvaMaEjTiNo8+sPlya/1L61O2T8gLGBEiuJ4ne7lhQlURkbcDtD2Bt6CKGt6ZXNGVd73X867p/MXzlcKq/X505W+f4HcuYsDB+3Xiid0bzctOXyZMjj99xTAYjqpr4EyIFgcLAK0BgfyRHVfVACLKdFxUVpdHR0aHcZJos+XMJ90y9h437N3LfNfcxpPkQCkYW9DuWMb44efYkld6tRPG8xVl5/0oixLr+NIkTkVWq+o8u7ZPr6uiwqsa4I+MWAtq6N+vZMQn1ytZj9YOr6VuvL5+s/oQq71Vh2sZpfscyxhdvLn+T7Ue280bzN6w4mTTx0pPEY8DnwCXubayI/CvYwTKq3DlyM7jZYH6870eK5i5K2/Ft6T65O/tP7Pc7mjEhs+f4Hl5Z/Aq3VrqVRuUa+R3HZFBevtbcB1yvqi+o6gs4vUrcH9xYGV9U6SiiH4hmQMMBTPh1AlXeq8JXv33ldyxjQqL/vP6cPHeS15q95ncUk4F5KVACxAY8jnWnmRTkzJaT/o36s+qBVZQpUIbbv7ydjhM78vexv/2OZkzQ/LrnV0b+NJKH6jxEpWKV/I5jMjAvBepT4EcRGSAiA4DlwCdBTZXJ1ChRg+X3LefVZq8yfeN0qgyvwpe/ful3LGOC4unZT5M/Z376N+rvdxSTwaVYoFR1KHA3cAA4CNytqsOCHSyzyR6Rnf/U+w9rHlpDpWKV6DKpC8t3LPc7ljHpavaW2Xy3+Tueb/A8xfIU8zuOyeCSbGZ+fgaRMaraI6VpiSz3CU6XSHtUtZo7rQgwASiHM2xHZ1U9mFLIjNLM3KtDpw5xzQfXALD6wdXWFN1kCrFxsVzzwTUcO3OM9Y+sJ1f2XH5HMhlEqpuZB6iaYEXZgDoelvsMSNinfj9grqpeCczlwt9XZRmFIgsx7rZxbD+8nd7Te5PSlwRjMoLPVn/Guj3rGNxssBUnky6S60niGRE5CtQQkSPu7SiwB/gmpRWr6kKc04KB2gGj3PujgPZpSp0J3FjmRgY0GsD4X8Yzes1ov+MYc1GOnTnG8/Oe58bLbuT2Krf7HcdkEsn9UPcVVc0PvK6qBdxbflUtqqrPpHF7JVR1l7v+XTi/q0qUiDwgItEiEr137940bi68PVP/GRpe3pBHZjzCxv0b/Y5jTJq9vuR1/j72N280fwMRa+Rr0oeXRhJpLUYXRVVHqmqUqkYVL17cjwhBly0iG2NvG0uu7LnoOqmrDYJoMqStB7fy+tLX6Vy1MzeWudHvOCYTCXX/I7tFpBSA+3dPiLcfdi4rcBkf3/oxq3at4rm5z/kdxxjPjpw+wvM/PE+196oRIREMbjrY70gmkwl1gZoK9HTv98TDtaysoP3V7ekd1Zshy4Ywc/NMv+MYk6yzsWd5b+V7VHy7Ii8teol2V7djbe+1lC9c3u9oJpPxVKBEpL6I3O3eLy4iKf5LFJHxwDKc4Tp2iMi9wGDgZhHZhDPOlH3lcr3R/A2qFq9Kz697sud4lj+wNGFIVZm8fjJV36vKIzMeoUrxKqy4bwXjO47nisJX+B3PZELZU5pBRPoDUUAlnF4lcgBjgXrJLef2gp6YpqnMmCXkzpGb8R3Hc+2H19Lz655M7zrdeoA2YWPZ9mU8PftplmxfQuVilZl651TaXNXGGkSYoPLyCdgBuBU4DqCqO4H8wQyVVVUvUZ2hLYby/ebveWv5W37HMYZN+zfRaWIn6n5Sly0Ht/BBmw9Y23stbSu1teJkgi7FIyjgjKqqiCiAiOQNcqYsrXdUb2ZtmUXfOX1pVK4R15S6xu9IJgvae3wvAxcMZMSqEeTKlosBDQfQp24f8uXM53c0k4V4OYKaKCIfAIVE5H5gDvBhcGNlXSLCR7d+RPG8xblz0p0cO3PM70gmCzlx9gQvL3qZCm9X4P3o97n3mnvZ/Nhm+jfqb8XJhJyX30ENAb4CJuFch3pBVd8JdrCsrFieYoztMJZN+zfx+HeP+x3HZAGxcbF8+vOnXPXOVTz3w3M0Lt+Ydb3XMaLNCErmK+l3PJNFeTnFh6rOBmYHOYsJ0Lh8Y56p/wwvL36ZFhVb0LlqZ78jmUxIVZm5ZSb/mf0f1u1Zx3WXXse4juNocHkDv6MZ42nI96MBffHF37aLyBQRsbalQTSg0QCuv/R6Hvj2AWIOxfgdx2QyWw5sofnY5rT6vBXHzhzji45fsPze5VacTNjwcg1qKPA0cClwGfAUzjWoL7CBC4MqR7YcjO84HkXpOqkr5+LO+R3JZBKrdq6i7id1id4ZzbAWw1j/yHruqHaHtcwzYcVLgWqpqh+o6lFVPaKqI4HWqjoBKBzkfFle+cLlGXHLCJbtWMbABQP9jmMygdlbZtNoVCNyZ8/N8nuX88QNT9jwGCYseSlQcSLSWUQi3FvgxRAbyCgEulTvQq9avXhp0UssiFngdxyTgY1fN55bxt1C+ULlWXrvUioVq+R3JGOS5KVAdQN64HTsutu9311EcgOPBjGbCfBOq3eoULgC3ad058DJhMNsGZOyN5e/SdfJXbmxzI0svHshpfOX9juSMcny0sx8q6q2VdViqlrcvb9ZVU+q6uJQhDSQL2c+xnccz+5ju7lv6n02Cq/xTFXpO7svT858ktsq38bM7jMpFFnI71jGpMhLK75IEXlERN4TkU/ib6EIZy5Up3QdXmn6ClM2TGHkqpF+xzEZwNnYs/T6phevLX2N3lG9mdhpIpHZI/2OZYwnXk7xjQFKAi2ABTgt+Y4GM5RJ2pM3PknzCs15YuYT/LrnV7/jmDB2/Mxx2n3RjtFrRjOw0UCGtx5OtohsfscyxjMvBaqiqv4fcFxVRwG3ANWDG8skJUIiGNV+FAVyFaDLpC6cPHvS70gmDO07sY8mo5swc8tMRrYZyf81/D9rQm4yHC8F6qz795CIVAMKAuWClsikqGS+knzW7jPW7VnHfd/ex97je/2OZMJIzKEY6n9Sn7W71zKp8yTur3O/35GMSRMvBWqkiBQGnscZEfc34NWgpjIpanVlK/6vwf8xbt04ygwrw/1T77dTfoa1u9dS9+O67D6+m9k9ZtP+6vZ+RzImzZItUCISARxR1YOqulBVr1DVS1T1gxDlM8kY2Hggvz38G71q9WLsurFUe78aLca2YObmmdbKLwtaELOABp82IEIiWHT3IuqXre93JGMuSrIFSlXjsN86hbXKxSszos0Itj+5nRcbv8i63eto+XlLqr1fjY9++siuUWURk9dPpsXYFpTOX5ql9y6l2iXV/I5kzEXzcopvtog8JSJlRKRI/C3oyUyqFMtTjOcaPEfMEzGMbj+anNlycv+391P2zbK8MO8F/j72t98RTZC8v/J9Ok3sRO1StVl09yLKFizrdyRj0oWkdCpIRP5IZLKqash6Mo+KitLo6OhQbS5TUFUWbFvAsOXD+Pb3b8mRLQddq3flyRuepEaJGn7HM+lAVRkwfwADFw6kzVVtmNBpAnly5PE7ljGpJiKrVDXqH9MzwrUKK1AXZ9P+Tbz141t8uvpTTpw9QZPyTXjyhidpfWVrIsTLQbQJN+fizvHI9EcY+dNI7ql1Dx+0/YDsEZ6GdzMm7CRVoLz0JJFHRJ4XkZHu4ytFpE0wQprguLLolbzb+l12PLmDwU0H8/u+32k7vi2Vh1fm/ZXvc/zMcb8jmlQ4efYknSZ2YuRPI3m2/rN8dOtHVpxMpuTl6/OnwBmgrvt4B/Bi0BKZoCmcuzB96/flj8f/YNxt4yiQqwAPz3iYMsPK8PKil63lXwZw4uwJ2oxvw9Tfp/J2y7d5qelL9gNck2l5KVAVVPU13B/squpJ4KL+R4hIjIisE5HVImLn7kIsR7YcdKnehRX3rTjfHPm5H57jvqn3ERsX63c8k4TjZ47TZlwb5sfMZ1T7Ufzr+n/5HcmYoPJyXuCMO7SGAohIBeB0Omy7saruS4f1mDQSEeqXrU+9MvUYuGAgAxYM4MiZI4ztMNYGsAszx88c55Zxt7Doz0WMbj+abjW6+R3JmKDzUqAGAN8DZUTkc6Ae0CuImUyIiQj9G/WnYGRBnpz5JEdPH2XyHZOtRViYOHbmGLeMu4XFfy5mbIexdKnexe9IxoSEp1Z8IlIUuAHn1N7yiz3ycZuuH8Q5KvvAHUY+4TwPAA8AlC1bts62bdsuZpPGo09+/oT7v72fumXqMq3LNApGFvQ7UpZ29PRRWo9rzbLty/j8ts+5o9odfkcyJt1dTCu+qUBzYL6qTkun03L1VLU20Ap4REQaJJxBVUeqapSqRhUvXjwdNmm8uOeae5jQaQI/7viRxqMas+f4Hr8jZVlHTx+l1eetWLZ9GeM6jrPiZLIcL40k3gBuAn4TkS9FpJOIXNSIZ6q60/27B5gCXHcx6zPpq1OVTnzb5Vs27NtAg08bsP3wdr8jZTlHTh+hxdgWLN+xnC86fUHnqp39jmRMyHkZ8n2Bqj4MXAGMBDoDaf5aLSJ5RSR//H2co7Nf0ro+ExwtKrZgVo9Z7Dq2i/qf1mfT/k1+R8oyDp86TIuxLVi5cyUTOk2gU5VOfkcyxheeuhFwW/F1BB4CrgVGXcQ2SwCLRWQNsAKYrqrfX8T6TJDUL1ufeT3nceLsCW769CbW7l7rd6RM79CpQzQf25zondFM7DSRjlU6+h3JGN94uQY1AVgPNAGG4/wuKs0/wFDVrapa071VVdWX0rouE3zxHZDmyJaDhp81ZPmO5X5HyrQOnTpE8zHN+XnXz3x1+1d0qNzB70jG+MprTxIVVPUhVf0BuFFEhgc5lwkjVxe7msV3L6ZYnmI0G92MOVvn+B0p0zl48iA3j7mZ1X+vZlLnSbS7up3fkYzxnZdrUN8D1UXkVRGJwenmaEOwg5nwcnmhy1l09yKuKHwFt4y7ha83fO13pEzjwMkDNBvTjLW71zL5jsm0rdTW70jGhIUkC5SIXCUiL4jIeuBdnD74RFUbq+o7IUtowkbJfCWZ32s+tUvVptPEToxZM8bvSBnegZMHaDa6Gb/s+YUpd0yhzVXWD7Mx8ZI7gtoANAXaqmp9tyhZR21ZXJHcRZjdYzaNyjXirq/vYvgKO9ubVvtP7Kfp6Kb8tvc3vrnzG1pf2drvSMaEleQKVEfgb2CeiHwoIk25yE5iTeaQL2c+pnWdRrtK7Xj0u0etJ/Q02HdiH01GN2H93vV8c+c3tKzY0u9IxoSdJAuUqk5R1TuAq4H5wJNACRF5X0SahyifCVOR2SP58vYv6V6jO8/98Bx95/S1IuXR3uN7aTKqCRv3b2Rql6m0qNjC70jGhKUUO4tV1ePA58DnIlIEuB3oB8wKcjYT5nJky8Go9qMomKsgry99ncOnDvPeLe+RLSKb39HC1p7je2g6uimbD2zm2y7f0uyKZn5HMiZspWoYTlU9AHzg3owhQiJ4p9U7FMxVkJcXv8zmg5u5+YqbqVGiBtUvqc5lBS6zAfWAM7Fn+GnXT9w39T62HtzK9K7TaVK+id+xjAlrNk60uWgiwktNX+KSvJfwxrI3+OGPH84/VyiyENUvqe7cSlSnRokaVLukGgVyFfAxcfAdOHmApduXsnT7UpZsX8KKv1Zw6twp8uTIw/Su02lcvrHfEY0Je56G2/BbVFSURkfbwLsZxaFTh/hlzy+s3b2WdbvXsW6Pczty+sj5eS4vePn5o6z4wnVV0avIHpHxvjOpKpsPbGbJ9iUs+XMJS7YvYf2+9QBkj8jONSWvoV6ZetQrW4+GlzekeF7rnd+YQEkNt2EFyoSEqvLn4T9Zt2edU7j2rGPd7nVs2LeBWHV+vZAzW04qF6tM9RLVqV+mPj1r9SQy+0V1nB8Up8+d5qddPzkFafsSlm5fen5YkkKRhahbpq5TkMrU49pLr7WBH41JgRUoE5ZOnzvNhn0bLihca3evZefRnZQtWJb/NvovPWr08LXhxYmzJ5i7de75grTyr5Wcjj0NQIXCFahXtt75glS5eGUixFMfzMYYlxUok6HM2TqHZ+Y+Q/TOaKoUr8JLTV6iXaV2IW1wse/EPoavGM47K95h/8n95IjIQZ3Sdc4Xo7pl6lIiX4mQ5TEms7ICZTIcVWXy+sk898Nz/L7/d66/9HoGNxtMo3KNgrrdPw7+wdBlQ/n45485ee4kba9qy2PXP0a9MvXInSN3ULdtTFZkBcpkWOfizjFq9SgGLBjAjiM7aFGhBS83fZnapWqn63ZW7VzF60tf58vfviSbZKNHjR48VfcpKhevnK7bMcZcyAqUyfBOnj3Jeyvf4+XFL3Pg5AHuqHoHgxoP4sqiV6Z5narK7K2zeW3Ja8z9Yy4FchXgoToP8fgNj1M6f+l0TG+MSYoVKJNpHD51mCFLhzB0+VBOnzvNfbXv44WGL6SqoJyLO8fEXyfy2pLXWLN7DaXzl+aJ65/ggToPUDCyYBDTG2MSsgJlMp3dx3bz4sIX+WDVB2SPyM5j1z9G33p9KZy7cJLLHD9znI9//pihy4ay7fA2KherzH/q/Yeu1buSM1vOEKY3xsSzAmUyra0Ht9J/fn8+X/s5BSML0rdeXx67/rELfn+05/ge3l3xLsNXDufAyQPcVPYm/lPvP7S+srU1CzfGZ1agTKa3dvdanvvhOaZtnEapfKV4oeELNCrXiLd/fJtPV3/K6XOnaX91e56u+zQ3lrnR77jGGJcVKJNlLPlzCf3m9mPxn4sBp4eKnjV70ufGPlQqVsnndMaYhJIqUBmv4zNjUlCvbD0W9lrId5u/47e9v9G9RndK5ivpdyxjTCpZgTKZkojQ+srWNoy6MRmYL1eHRaSliPwuIptFpJ8fGYwxxoS3kBcoEckGDAdaAVWALiJSJdQ5jDHGhDc/jqCuAzar6lZVPQN8AbTzIYcxxpgw5keBuhTYHvB4hzvtAiLygIhEi0j03r17QxbOGGNMePCjQCU2XsI/2rqr6khVjVLVqOLFbQRSY4zJavwoUDuAMgGPLwN2+pDDGGNMGPOjQK0ErhSR8iKSE7gTmOpDDmOMMWEs5L+DUtVzIvIoMBPIBnyiqr+GOocxxpjwliG6OhKRvcC2i1xNMWBfOsTJTGyfXMj2xz/ZPrmQ7Y8Lpdf+uFxV/9HYIEMUqPQgItGJ9fWUldk+uZDtj3+yfXIh2x8XCvb+sHEGjDHGhCUrUMYYY8JSVipQI/0OEIZsn1zI9sc/2T65kO2PCwV1f2SZa1DGGGMylqx0BGWMMSYDsQJljDEmLGW6ApXSWFPieNt9fq2I1PYjZ6h42B/d3P2wVkSWikhNP3KGktfxyETkWhGJFZFOocwXal72h4g0EpHVIvKriCwIdcZQ8/D/pqCIfCsia9x9crcfOUNFRD4RkT0i8ksSzwfnc1VVM80Np2eKLcAVQE5gDVAlwTytge9wOq29AfjR79w+74+6QGH3fqvMvD+87pOA+X4AZgCd/M7t87+RQsBvQFn38SV+5w6DffIs8Kp7vzhwAMjpd/Yg7pMGQG3glySeD8rnamY7gvIy1lQ7YLQ6lgOFRKRUqIOGSIr7Q1WXqupB9+FynM57MzOv45H9C5gE7AllOB942R9dgcmq+ieAqto+cUZgyC8iAuTDKVDnQhszdFR1Ic5rTEpQPlczW4HyMtaUp/GoMonUvtZ7cb4FZWYp7hMRuRToAIwIYS6/ePk3chVQWETmi8gqEbkrZOn84WWfvAtUxhmJYR3wuKrGhSZeWArK52rIO4sNMi9jTXkajyqT8PxaRaQxToGqH9RE/vOyT94E+qpqrPMFOVPzsj+yA3WApkBuYJmILFfVjcEO5xMv+6QFsBpoAlQAZovIIlU9EuRs4Soon6uZrUB5GWsqK41H5em1ikgN4COglaruD1E2v3jZJ1HAF25xKga0FpFzqvp1SBKGltf/M/tU9ThwXEQWAjWBzFqgvOyTu4HB6lyA2SwifwBXAytCEzHsBOVzNbOd4vMy1tRU4C631ckNwGFV3RXqoCGS4v4QkbLAZKBHJv5GHCjFfaKq5VW1nKqWA74CHs6kxQm8/Z/5BrhJRLKLSB7gemB9iHOGkpd98ifOESUiUgKoBGwNacrwEpTP1Ux1BKVJjDUlIg+5z4/AaZXVGtgMnMD5JpQpedwfLwBFgffcI4Zzmol7a/a4T7IML/tDVdeLyPfAWiAO+EhVE21unBl4/DcyCPhMRNbhnN7qq6qZdhgOERkPNAKKicgOoD+QA4L7uWpdHRljjAlLme0UnzHGmEzCCpQxxpiwZAXKGGNMWLICZYwxJixZgTLGGBOWrEBlcSLSQURURK5O5XJL07i9ckn1iJyKdTx7McsnWFcvESmdxHMiIs+LyCYR2Sgi80SkasDzMSJSzL2f6v0hIm+KSIMU5mkgIj+JyLnkelVP6/txMUSkvYhUCfV2kyIipURkVirmfyilbptEpLqIfHbR4UyaWIEyXYDFOD9G/AcRyZbYY1WtG6xACbeZiHQrUEAvINECBTyC09t7TVW9CngFmCoikQlnTO3+EJEiwA1uJ5zJ+dPNOC65mYL5fiSjPRDSApXCv42WOL9d8sT9jdfoFOZZB1zm/qDdhJgVqCxMRPIB9XD64LszYHoj92hhHLAu4WN3nmPu3wki0jpg2c9EpKN7pLTI/fb/k4gk+wGaxDa+djsn/VVEHnCnDQZyizM20efutO4issKd9kFiH2Ii8oKIrBSRX0RkpHt01AmnW6PP3WVzJ1isL/AvVT0BoKqzgKVAt0TWH78/GonTqepXIrJBRD4XSbRDv07A9wHLx4jIq+7rWCEiFd1txqhq/A9kk9t/qdq+iFQUkTnijGf0k4hUcJedFjDPuyLSy70/WER+E2esnyHu+3kr8Lq77yqISC0RWe7OM0VECrvLzheRYSKyUETWizPO1mT3yPTFgO0l+j6KyDERGSgiPwI3JswS8LJaAt+5r2OBiEwU58h3sDjjnq0QkXUiUsFd7wAReSogY/z+3ygiNwWs91uS+AJngsyv8UXs5v8N6A587N5fCtR27zcCjgPlE3vsTjvm/u0AjHLv58Tp0Tg3kAeIdKdfCUS798uRyJgySWyjiPs3N/ALUDRw2+79yjgfIDncx+8BdyWy/iIB98cAbd3784GoROYvABxIZPrjwFD3fgxQLMH+aAQcxumLLAJYBtRPZD2j4jMErOs59/5dwLQE839GMuNSpWH7PwId3PuR7vvVKHC7OD129wKKAL/zvx/2F0osE05PEw3d+wOBNwP2cfzYSY/j9NFWCsiF04db0eTeR5xORzvHv49JZMkGrA7YB4cCtvEX8N+A7cfnGgA8FZDxDfd+a2BOwOuqB3zr9//XrHizI6isrQvOWDe4f7sEPLdCVf9I5nG874AmIpILZ8DDhap6EqcblA/F6QrmS7ydCkq4jcdEZA3OOFVlcApdQk1xetpeKSKr3cdXJDJfYxH50c3TBKiayDxeCCn30rxCVXeoM/zCapyinFApYG+CaeMD/t6Yxnwpbl9E8gOXquoUAFU9pe5RYhKOAKeAj0TkNpyubC4gIgVxikX8aLujcAa5ixffl9064FdV3aWqp3H6rytD8u9jLM7YXMlluR6n6MZbGbCNLUD8tal1CfdHgMnu31UJ5tlD0qeBTRBlqr74jHciUhTng7qaiCjON1AVkf+4sxxPsEjCx4Dz4SYi83GGH7iD/33IPgnsxun1OgLnQyUl57chIo2AZsCNqnrC3cY/rv3gFIxRqvpMUisV55rRezhHSttFZEAS6wp8XUdE5LiIXKGqgZ2A1gZSGvL8dMD9WBL/f3YykQyaxP3USmn7SY0hco4LT/tHwvm+6a7DKRp3Ao/i/NtJS6a4BPni3HzJvY+nVDU2hSytCDhlmsg2Aref1Ode/DwJ91kkzvtlQsyOoLKuTjgjYF6uTs/dZYA/SNt4UF/gdA55E/+7SF0Q2OV+i++BUwBToyBw0C1OV+MMIx3vrIjkcO/PBTqJyCXgND4QkcsTrCu+EOwT57pbYGu4o0D+JDK8Drwdf21KRJrh7J9kGyx4tB6omGDaHQF/l6XDNhKlzphFO0SkPYCI5BKnl/JtQBX3cUH+11t3PqCgqs4AngBquas6v+9U9TBwMODaTQ9SLuSBvLyPyWVp6q4jGK7COcVsQsyOoLKuLsDgBNMm4QzvPSGV65oFjAamqjNENjhHLJNE5HZgHkkcgSXje+AhEVmLc81hecBzI4G1IvKTqnYTkeeBWSISAZzFaX23LX5mVT0kIh/inN6JwRlOId5nwAgROYlztBb4TfkdoDBOQ5FY4G+gXYJ50mo68CDOOFzxcrkNASJwT7eKyLXAFDdHWxH5r6qm9fRkoB7AByIyEGef3a6qW0VkIs61pE3Az+68+YFv3CNRwTk6BueLyYci8hhO0e+Jsy/z4Jy689yjtar+ltL7mFQWESmOc5QVrMECG+O8XybErDdzY3wiIouBNm4BjcE5BZlph2wIFhHpDlymqgm/cKXHunPhHAnWV9Vz6b1+kzwrUMb4RESuB06q6lorUOFJRK7EaVAy3+8sWZEVKGOMMWHJGkkYY4wJS1agjDHGhCUrUMYYY8KSFShjjDFhyQqUMcaYsPT/IUkP7CY+Ot4AAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "sweep.plot(label='total', color='green')\n", - " \n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Customer rate at Olin (p1 in customers/min)', \n", - " ylabel='Average total unhappy customers')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "powerful-planner", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap05.ipynb b/jupyter/chap05.ipynb deleted file mode 100644 index 39cea07e..00000000 --- a/jupyter/chap05.ipynb +++ /dev/null @@ -1,1455 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "wicked-mozambique", - "metadata": {}, - "source": [ - "# Chapter 5" - ] - }, - { - "cell_type": "markdown", - "id": "inclusive-theater", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "legislative-rating", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "id": "therapeutic-genealogy", - "metadata": {}, - "source": [ - "In this chapter..." - ] - }, - { - "cell_type": "markdown", - "id": "informal-contractor", - "metadata": {}, - "source": [ - "# World population\n", - "\n", - "In 1968 Paul Erlich published *The Population Bomb*, in which he\n", - "predicted that world population would grow quickly during the 1970s,\n", - "that agricultural production could not keep up, and that mass starvation\n", - "in the next two decades was inevitable (see\n", - "). As someone who grew up during those\n", - "decades, I am happy to report that those predictions were wrong.\n", - "\n", - "But world population growth is still a topic of concern, and it is an\n", - "open question how many people the earth can sustain while maintaining\n", - "and improving our quality of life.\n", - "\n", - "In this chapter and the next, we use tools from the previous chapters to\n", - "explain world population growth since 1950 and generate predictions for\n", - "the next 50-100 years.\n", - "\n", - "For background on world population growth, watch this video from the\n", - "American Museum of Natural History ." - ] - }, - { - "cell_type": "markdown", - "id": "dying-browse", - "metadata": {}, - "source": [ - "## World Population Data\n", - "\n", - "The Wikipedia article on world population contains tables with estimates of world population from prehistory to the present, and projections for the future ()." - ] - }, - { - "cell_type": "markdown", - "id": "continuing-cancellation", - "metadata": {}, - "source": [ - "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "convenient-stroke", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "markdown", - "id": "acknowledged-bracelet", - "metadata": {}, - "source": [ - "To read this data, we will use Pandas, which provides functions for\n", - "working with data. The function we'll use is `read_html`, which can read a web page and extract data from any tables it contains. Before we can use it, we have to import it. You have already seen this import\n", - "statement:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "israeli-finding", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "id": "regulation-parade", - "metadata": {}, - "source": [ - "Now we can use it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "instant-beverage", - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'World_population_estimates.html'\n", - "tables = read_html(filename,\n", - " header=0, \n", - " index_col=0,\n", - " decimal='M')" - ] - }, - { - "cell_type": "markdown", - "id": "dried-immunology", - "metadata": {}, - "source": [ - "The arguments are:\n", - "\n", - "- `filename`: The name of the file (including the directory it's in)\n", - " as a string. This argument can also be a URL starting with `http`.\n", - "\n", - "- `header`: Indicates which row of each table should be considered the\n", - " header, that is, the set of labels that identify the columns. In\n", - " this case it is the first row (numbered 0).\n", - "\n", - "- `index_col`: Indicates which column of each table should be\n", - " considered the **index**, that is, the set of labels that identify\n", - " the rows. In this case it is the first column, which contains the\n", - " years.\n", - "\n", - "- `decimal`: Normally this argument is used to indicate which\n", - " character should be considered a decimal point, because some\n", - " conventions use a period and some use a comma. In this case I am\n", - " abusing the feature by treating `M` as a decimal point, which allows\n", - " some of the estimates, which are expressed in millions, to be read\n", - " as numbers.\n", - "\n", - "The result, which is assigned to `tables`, is a sequence that contains\n", - "one `DataFrame` for each table. A `DataFrame` is an object, defined by\n", - "Pandas, that represents tabular data.\n", - "\n", - "To select a `DataFrame` from `tables`, we can use the bracket operator\n", - "like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "driving-wrapping", - "metadata": {}, - "outputs": [], - "source": [ - "table2 = tables[2]" - ] - }, - { - "cell_type": "markdown", - "id": "simplified-convert", - "metadata": {}, - "source": [ - "This line selects the third table (numbered 2), which contains\n", - "population estimates from 1950 to 2016.\n", - "\n", - "We can use `head` to display the first few lines of the table." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "running-alcohol", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    United States Census Bureau (2017)[28]Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2007)[24]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
    19512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
    19522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
    19532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
    19542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " United States Census Bureau (2017)[28] \\\n", - "Year \n", - "1950 2557628654 \n", - "1951 2594939877 \n", - "1952 2636772306 \n", - "1953 2682053389 \n", - "1954 2730228104 \n", - "\n", - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "1950 2.516000e+09 \n", - "1951 NaN \n", - "1952 NaN \n", - "1953 NaN \n", - "1954 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "1950 2.525149e+09 \n", - "1951 2.572851e+09 \n", - "1952 2.619292e+09 \n", - "1953 2.665865e+09 \n", - "1954 2.713172e+09 \n", - "\n", - " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n", - "Year \n", - "1950 2.544000e+09 2.527960e+09 2.400000e+09 \n", - "1951 2.571663e+09 NaN NaN \n", - "1952 2.617949e+09 NaN NaN \n", - "1953 2.665959e+09 NaN NaN \n", - "1954 2.716927e+09 NaN NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "1950 2.527000e+09 2.500000e+09 2.400000e+09 \n", - "1951 NaN NaN NaN \n", - "1952 NaN NaN NaN \n", - "1953 NaN NaN NaN \n", - "1954 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "1950 NaN 2.486000e+09 \n", - "1951 NaN NaN \n", - "1952 NaN NaN \n", - "1953 NaN NaN \n", - "1954 NaN NaN " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "id": "valid-editing", - "metadata": {}, - "source": [ - "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", - "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", - "\n", - "`NaN` is a special value that indicates missing data." - ] - }, - { - "cell_type": "markdown", - "id": "plastic-senate", - "metadata": {}, - "source": [ - "The column labels are long strings, which makes them hard to work with.\n", - "We can replace them with shorter strings like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "engaging-regular", - "metadata": {}, - "outputs": [], - "source": [ - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "id": "communist-crowd", - "metadata": {}, - "source": [ - "Now we can select a column from the `DataFrame` using the dot operator,\n", - "like selecting a state variable from a `State` object.\n", - "\n", - "Here are the estimates from the United States Census Bureau:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "amended-negative", - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9" - ] - }, - { - "cell_type": "markdown", - "id": "absent-heart", - "metadata": {}, - "source": [ - "The result is a Pandas `Series`, which is similar to the `TimeSeries` and `SweepSeries` objects we've been using.\n", - "\n", - "The number `1e9` is a shorter way to write `1000000000` or one billion.\n", - "When we divide a `Series` by a number, it divides all of the elements of the `Series`.\n", - "From here on, we'll express population estimates in terms of billions.\n", - "\n", - "We can use `tail` to see the last few elements of the `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "graduate-specialist", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "2012 7.013871\n", - "2013 7.092128\n", - "2014 7.169968\n", - "2015 7.247893\n", - "2016 7.325997\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "brilliant-brook", - "metadata": {}, - "source": [ - "The left column is the **index** of the `Series`; in this example it contains the dates.\n", - "The right column contains the **values**, which are population estimates.\n", - "In 2016 the world population was about 7.3 billion.\n", - "\n", - "Here are the estimates from the United Nations\n", - "Department of Economic and Social Affairs (U.N. DESA):" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "linear-admission", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "2012 7.080072\n", - "2013 7.162119\n", - "2014 7.243784\n", - "2015 7.349472\n", - "2016 NaN\n", - "Name: un, dtype: float64" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "un.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "mental-sussex", - "metadata": {}, - "source": [ - "The most recent estimate we have from the U.N. is for 2015, so the value for 2016 is `NaN`.\n", - "\n", - "Now we can plot the estimates like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "ordered-garage", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_estimates():\n", - " census.plot(style=':', label='US Census')\n", - " un.plot(style='--', label='UN DESA')\n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)') " - ] - }, - { - "cell_type": "markdown", - "id": "invisible-mouse", - "metadata": {}, - "source": [ - "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", - "The `label` argument provides the string that appears in the legend.\n", - "\n", - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "periodic-weekend", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_estimates()\n", - "decorate(title='World Population Estimates')" - ] - }, - { - "cell_type": "markdown", - "id": "labeled-magic", - "metadata": {}, - "source": [ - "The lines overlap almost completely, but the most recent estimates diverge slightly.\n", - "In the next section, we'll quantify these differences." - ] - }, - { - "cell_type": "markdown", - "id": "tender-summer", - "metadata": {}, - "source": [ - "## Absolute and relative errors\n", - "\n", - "Estimates of world population from the U.S. Census and the U.N. DESA differ slightly.\n", - "One way to characterize this difference is **absolute error**, which is the absolute value of the difference between the two.\n", - "\n", - "To compute absolute value, we can import `abs` from NumPy:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "secondary-player", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import abs" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "caring-garlic", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "2012 0.066201\n", - "2013 0.069991\n", - "2014 0.073816\n", - "2015 0.101579\n", - "2016 NaN\n", - "dtype: float64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "abs_error = abs(un - census)\n", - "abs_error.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "bridal-extraction", - "metadata": {}, - "source": [ - "When you subtract two `Series` objects, the result is a new `Series`.\n", - "Because one of the estimates from 2016 is `NaN`, the result is `NaN`.\n", - "\n", - "To summarize the results, we can compute the **mean absolute error**." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "corresponding-emerald", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.029034508242424265" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import mean\n", - "\n", - "mean(abs_error)" - ] - }, - { - "cell_type": "markdown", - "id": "identical-archive", - "metadata": {}, - "source": [ - "On average, the estimates differ by about 0.029 billion.\n", - "But we can also use `max` to compute the maximum absolute error." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "headed-witch", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.10157921199999986" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import max\n", - "\n", - "max(abs_error)" - ] - }, - { - "cell_type": "markdown", - "id": "composite-partnership", - "metadata": {}, - "source": [ - "In the worst case, they differ by about 0.1 billion.\n", - "\n", - "Now 0.1 billion is a lot of people, so that might sound like a serious discrepancy.\n", - "But counting everyone is the world is hard, and we should not expect the estimates to be exact.\n", - "\n", - "Another way to quantify the magnitude of the difference is **relative error**, which is the size of the error divided by the estimates themselves." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "advisory-complex", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "2012 0.943860\n", - "2013 0.986888\n", - "2014 1.029514\n", - "2015 1.401500\n", - "2016 NaN\n", - "dtype: float64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rel_error = abs_error / census * 100\n", - "rel_error.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "greater-register", - "metadata": {}, - "source": [ - "I multiplied by 100 so we can interpret the results as a percentage. In 2015, the difference between the estimates is about 1.4%, and that happens to be the maximum.\n", - "\n", - "Again, we can summarize the results by computing the mean." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "frank-owner", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.5946585816022846" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mean(rel_error)" - ] - }, - { - "cell_type": "markdown", - "id": "peaceful-fleece", - "metadata": {}, - "source": [ - "The mean relative error is about 0.6%.\n", - "So that's not bad.\n", - "\n", - "You might wonder why I divided by `census` rather than `un`.\n", - "In general, if you think one estimate is better than the other, you put the better one in the denominator.\n", - "In this case, I don't know which is better, so I put the smaller one in the denominator, which makes the computed errors a little bigger." - ] - }, - { - "cell_type": "markdown", - "id": "vietnamese-excuse", - "metadata": {}, - "source": [ - "## Modeling Population Growth\n", - "\n", - "Suppose we want to predict world population growth over the next 50 or\n", - "100 years. We can do that by developing a model that describes how\n", - "populations grow, fitting the model to the data we have so far, and then using the model to generate predictions.\n", - "\n", - "In the next few sections I demonstrate this process starting with simple models and gradually improving them.\n", - "\n", - "Although there is some curvature in the plotted estimates, it looks like world population growth has been close to linear since 1960 or so. So we'll start with a model that has constant growth.\n", - "\n", - "To fit the model to the data, we'll compute the average annual growth\n", - "from 1950 to 2016. Since the UN and Census data are so close, we'll use the Census data.\n", - "\n", - "We can select a value from a `Series` using the bracket operator:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "undefined-sauce", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.557628654" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census[1950]" - ] - }, - { - "cell_type": "markdown", - "id": "precise-correlation", - "metadata": {}, - "source": [ - "So we can get the total growth during the interval like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "postal-debate", - "metadata": {}, - "outputs": [], - "source": [ - "total_growth = census[2016] - census[1950]" - ] - }, - { - "cell_type": "markdown", - "id": "dutch-sample", - "metadata": {}, - "source": [ - "The numbers in brackets are called **labels**, because they label the\n", - "rows of the `Series`.\n", - "\n", - "In this example, the labels 2016 and 1950 are part of the data, so it\n", - "would be better not to make them part of the program. \n", - "Putting values like these in the program is called **hard coding**; it is considered bad practice because if the data change in the future, we have to change the program (see ).\n", - "\n", - "It would be better to get the labels from the `Series`.\n", - "We can do that by selecting the index from `census` and then selecting the first element." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "functional-trick", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1950" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = census.index[0]\n", - "t_0" - ] - }, - { - "cell_type": "markdown", - "id": "empty-siemens", - "metadata": {}, - "source": [ - "So `t_0` is the label of the first element, which is 1950.\n", - "We can get the label of the last element like this." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "acoustic-south", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2016" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = census.index[-1]\n", - "t_end" - ] - }, - { - "cell_type": "markdown", - "id": "express-metallic", - "metadata": {}, - "source": [ - "The value `-1` indicates the last element; `-2` indicates the second to last element, and so on.\n", - "\n", - "The difference between `t_0` and `t_end` is the elapsed time between them." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "planned-remains", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "66" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "elapsed_time = t_end - t_0\n", - "elapsed_time" - ] - }, - { - "cell_type": "markdown", - "id": "bridal-royal", - "metadata": {}, - "source": [ - "Now we can use `t_0` and `t_end` to select the population at the beginning and end of the interval." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "quarterly-aggregate", - "metadata": {}, - "outputs": [], - "source": [ - "p_0 = census[t_0]\n", - "p_end = census[t_end]" - ] - }, - { - "cell_type": "markdown", - "id": "driven-castle", - "metadata": {}, - "source": [ - "And compute the total growth during the interval." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "prescription-optics", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.768368055" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total_growth = p_end - p_0\n", - "total_growth" - ] - }, - { - "cell_type": "markdown", - "id": "accepted-auditor", - "metadata": {}, - "source": [ - "Finally, we can compute average annual growth." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "convertible-patch", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.07224800083333333" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "annual_growth = total_growth / elapsed_time\n", - "annual_growth" - ] - }, - { - "cell_type": "markdown", - "id": "japanese-merit", - "metadata": {}, - "source": [ - "From 1950 to 2016, world population grew by about 0.07 billion people per year, on average.\n", - "The next step is to use this estimate to simulate population growth." - ] - }, - { - "cell_type": "markdown", - "id": "public-verification", - "metadata": {}, - "source": [ - "## Simulation\n", - "\n", - "Our simulation will start with the observed population in 1950, `p_0`,\n", - "and add `annual_growth` each year. To store the results, we'll use a\n", - "`TimeSeries` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "duplicate-leave", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "results = TimeSeries(time='Year', quantity='Population')" - ] - }, - { - "cell_type": "markdown", - "id": "expired-salmon", - "metadata": {}, - "source": [ - "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", - "These names don't affect the computation, but they appear when we display or plot the `TimeSeries`.\n", - "\n", - "We can set the first value in the new `TimeSeries` like this." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "convenient-thong", - "metadata": {}, - "outputs": [], - "source": [ - "results[t_0] = p_0" - ] - }, - { - "cell_type": "markdown", - "id": "constant-casino", - "metadata": {}, - "source": [ - "Here's what it looks like so far." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "israeli-surveillance", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Population
    Year
    19502.557629
    \n", - "
    " - ], - "text/plain": [ - " Population\n", - "Year \n", - "1950 2.557629" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import show\n", - "\n", - "show(results)" - ] - }, - { - "cell_type": "markdown", - "id": "stretch-snapshot", - "metadata": {}, - "source": [ - "Now we set the rest of the values by simulating annual growth:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "attended-morris", - "metadata": {}, - "outputs": [], - "source": [ - "for t in range(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "markdown", - "id": "signed-colleague", - "metadata": {}, - "source": [ - "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", - "\n", - "Inside the loop, we compute the population for the next year by adding the population for the current year and `annual_growth`. \n", - "\n", - "The last time through the loop, the value of `t` is 2015, so the last label in `results` is 2016.\n", - "\n", - "Here's what the results look like, compared to the estimates." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "wrong-brooks", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results.plot(color='gray', label='model')\n", - "plot_estimates()\n", - "decorate(title='Constant Growth Model')" - ] - }, - { - "cell_type": "markdown", - "id": "automated-albany", - "metadata": {}, - "source": [ - "The keyword argument `color='gray'` specifies the color of the line. For details on color specification see .\n", - "\n", - "From 1950 to 1990, the model does not fit the data particularly well, but after that, it's pretty good." - ] - }, - { - "cell_type": "markdown", - "id": "unnecessary-million", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This chapter is a first step toward modeling changes in world population growth during the last 70 years.\n", - "\n", - "We used Pandas to read data from a web page and store the results in a `DataFrame`.\n", - "From the `DataFrame` we selected two `Series` objects and used them to compute absolute and relative errors.\n", - "\n", - "Then we computed average population growth and used it to build a simple model with constant annual growth.\n", - "The model fits recent data pretty well; nevertheless, there are two reasons we should be skeptical:\n", - "\n", - "* There is no obvious mechanism that could cause population growth to be constant from year to year. Changes in population are determined by the fraction of people who die and the fraction of people who give birth, so we expect them to depend on the current population.\n", - "\n", - "* According to this model, world population would keep growing at the same rate forever, and that does not seem reasonable.\n", - "\n", - "In the next chapter we'll consider other models that might fit the data better and make more credible predictions." - ] - }, - { - "cell_type": "markdown", - "id": "advanced-ivory", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "hearing-today", - "metadata": {}, - "source": [ - "Here's the code from this chapter all in one place." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "terminal-reynolds", - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = census.index[0]\n", - "t_end = census.index[-1]\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = census[t_0]\n", - "p_end = census[t_end]\n", - "\n", - "total_growth = p_end - p_0\n", - "annual_growth = total_growth / elapsed_time\n", - "\n", - "results = TimeSeries(time='Year', quantity='Population')\n", - "results[t_0] = p_0\n", - "\n", - "for t in range(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "organizational-memphis", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results.plot(color='gray', label='model')\n", - "plot_estimates()\n", - "decorate(title='Constant Growth Model')" - ] - }, - { - "cell_type": "markdown", - "id": "ecological-welsh", - "metadata": {}, - "source": [ - "**Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", - "\n", - "Suggestions: \n", - "\n", - "1. Define `t_1` to be 1970 and `p_1` to be the population in 1970. Use `t_1` and `p_1` to compute annual growth, but use `t_0` and `p_0` to run the simulation. \n", - "\n", - "2. You might want to add a constant to the starting value to match the data better." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "rising-anger", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.07854997754347826" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t_0 = census.index[0]\n", - "t_1 = 1970\n", - "t_end = census.index[-1]\n", - "elapsed_time = t_end - t_1\n", - "\n", - "p_0 = census[t_0]\n", - "p_1 = census[t_1]\n", - "p_end = census[t_end]\n", - "\n", - "total_growth = p_end - p_1\n", - "annual_growth = total_growth / elapsed_time\n", - "annual_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "false-handbook", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results = TimeSeries(time='Year', quantity='Population')\n", - "results[t_0] = p_0 - 0.45\n", - "\n", - "for t in range(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "political-loading", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABEMElEQVR4nO3dd1hUZ/bA8e9hQIpdwV7Q2AuCwd4BwcREXUuMMUaTbHoxbfPbmr5pu5vNpm3ipplojKaYYjYq1tiNPfZCxC6CgkqHeX9/3Is7EsXBOMwA5/M88zBz75075x1gzrzvfe89YoxBKaWU8jV+3g5AKaWUuhBNUEoppXySJiillFI+SROUUkopn6QJSimllE/SBKWUUsonaYJSqgyJyH4RifNyDB+KyHNubuv1eFXlpQmqEhORm0RknYicFZGjIvK9iPT14OsNFJFDV3B/k0RkuRvbDRaRxSJyRkTSRGSTiPyfiARdqVgu8rpuJ4KLPH+SiBgReaXY8hH28g9/dZBX0IWSmYhMEZFdIuIUkUmXud9OIjJPRFJF5BcnbopIexFZJCIZIrJXRH7jsm68/fdddMuy37ur7fUiIi/ZfxdpIvKyiMjlxKmuPE1QlZSIPAK8CjwP1AeaAW8Bw70Y1hUnImOAz4FPgObGmLrAWKAJ0PQiz/EvuwgvaR8wtlhMtwC7vRRPaW0G7gU2/Ip95AOzgNuLr7Dfl6+BOUAd4E5gmoi0ATDGTDfGVCu62bEkucRzJzAC6AJEANcBd/2KWNWVZIzRWyW7ATWBs8CYErYJxEpgR+zbq0CgvW4gcAh4FEgBjgK3ujz3WmA7cAY4DDwGVAWyAaf92meBRkB3YBWQbu/nDaCKy74McDewBzgFvAkI0B7IAQrtfaVfoA0CHAQevcT78RRWEpsGnAZ+a8f2DXAS2AvcYW8bZLcj1H78Z6AAqGE/fs5+r+7E+mDNs+P71l6/334/tgAZwEwg6CJxTQKWA3OBofayOsAx4G/Ahy7bDgO22e/jEqC9y7oorA/kM/brfQo857L+OmCT/dyVQITLuv1AnBt/Ux/bv9tsu72PF1u/HJj0K/9uWwGm2LJO9uuJy7L5wLMX2cdi4EmXxyuBO10e3w6s9vb/qN7s34e3A9CbF37pMMT+UPUvYZtngNVAPSDM/kd+1l430H7+M0AAVkLKAmrb648C/ez7tYGuLs87VOx1rgZ6Av5AOLADeMhlvcH6dlwLq5d3Ahhir5sELC+hDe3s54df4v14CiuZjMAaVQgGlmL1KIOASPt1Y+3tfwBG2ffnY/VyrnFZ9xv7/oeuicBeth9Yi5UA69jtvfsicU2yP9hvAmbay+4F3sFKhB/ay9oAmcBg+/fxOFZSrWLfkoGH7XWj7bY+Zz+3K9aXjB6AA5hoxxjoEu8lE9SltuUCCcpuV3oJt2bFtr9QgurMLxNUIjD7AjE0x/pC08JlWQbQw+VxNHDG2/+jerNuOsRXOdUFUo0xBSVsMx54xhiTYow5ATwNTHBZn2+vzzfG/BfrQ6Kty7oOIlLDGHPKGHPR4R1jzHpjzGpjTIExZj/Wh++AYpu9aIxJN8YcwPoGHOlmO0Ptn8eKFojIpyKSbh+LcG3PKmPMV8YYp/28vsD/GWNyjDGbgHdd2r8UGGAPL0UAr9mPg4BuwLJLxPWaMeaIMeYk8K0b7ZkNDBSRmljDex8VWz8W+M4Yk2iMyQf+jpVke2Ml/wDgVft39Tnwo8tz7wDeMcasMcYUGmOmArn28zzKGPOJMaZWCbcDbuxmJ1aC/Z2IBIhIPNbfT8gFtr0FWGaM+dllWTWsJFUkA6imx6F8gyaoyikNCL3EsZZGWN+8iyTby87to1iCy8L6ZwcYhdWrShaRpSLS62IvIiJtRGSOiBwTkdNYx8RCi212zOW+6+tcSpr9s2HRAmPMjcaYWlhDXg6XbQ+63G8EnDTGnHFZlgw0tu8vxeoNdgV+wvrGPgDrQ32vMSb1EnGVqj3GmGzgO6zhxFBjzIpim5z3u7KT7EE73kbAYWOM6+QC199rc+BRO2mni0g61rE519+1z7IT8ghgKNb7+ijW8aoLTca5BZhabNlZoIbL4xrA2WLvl/ISTVCV0yqs4zcjStjmCNaHV5Fm9rJLMsb8aIwZjjU8+BXWBwZYw23F/RvrW3BrY0wN4I9Yx47ceqlLrN+JdQxsZCn3dQSoIyLVXZY1s/cF1nBnW+A3wFJjzHZ7/VCs5OVufKXxEdaH78cXWHfe78r+9t/Ujvco0LhYj6CZy/2DwF+L9VxCjDEzLiPGUrX3AjPsit+aXXovYIzZYowZYIypa4xJAFpiDaO6vlYfrKT7ebGnb8OaIFGki71M+QBNUJWQMSYDeAJ4056yHGIPj1wjIi/bm80A/iwiYSISam8/7VL7FpEq9gdPTfvb7WmscX+A40Bde6iqSHV7m7Mi0g64pxRNOQ40EZEqF2mnwfpQf1JE7hCR2va04tZYMxcvyBhzECsJvSAiQSISgXXwfLq9PgtYD9zH/xLSSqzZX64J6jjWh+WVsBTrGNPrF1g3CxgqIrEiEoDV5lw7plVYxwsfFBF/ERmJNTGlyH+Au0Wkh/3eVBWRocWSM3DuNIGSktAv2mv/PQRhfekIsN9PP/jlDLsL3A7Y+xB7H1Xsx0EiEujyGhH2shAReQyrx/xhsdgmAl8U6xWDlfgfEZHGItLIfu+KP1d5iSaoSsoY8wrwCNaw0Qmsb9L3Y/V4wDoIvw5rttlPWENi7p7TMwHYbw/Z3Q3cbL/mTqzEl2QPJzXCmtF2E9YMs/9gzTJz1yKsb7vHROSCw2rGmJnADXYMB4FUrA/0KcBnJex7HNakjSNYx4CeNMYkuqxfinVsZ63L4+pYkySKvId1LC5dRL4qRbsu1A5jjFloH7cqvm4XVvtex2rf9cD1xpg8Y0weVg9yEtYsyLHAly7PXYd1HOoNe/1ee9sLaYqV8C7mBawvNel2ogBrEkk21vGwKfb9/m402VVz+3lFPZtsYJfL+glYPcUUIBYYbIzJLVppJ7cb+OXwHljHPL/F+hvfijWU+k4p41MeIjrUqpRyh4i8C3xmjJnn7VhU5aAJSimllE/SIT6llFI+SROUUkopn6QJSimllE/ypYtiEhoaasLDw70dhlJKqTK0fv36VGNMWPHlPpWgwsPDWbdunbfDUEopVYZEJPlCy3WITymllE/SBKWUUsonaYJSSinlk3zqGNSF5Ofnc+jQIXJycrwdSoUUFBREkyZNCAgI8HYoSil1Hp9PUIcOHaJ69eqEh4ejJVquLGMMaWlpHDp0iBYtWng7HKWUOo/PD/Hl5ORQt25dTU4eICLUrVtXe6dKKZ/k8wkK0OTkQfreKqV8VblIUEoppbwo57RXXlYTVBkKDw8nNbXkauDubKOUUmVq9Vtw+uh5izJzC/B0NQxNUEoppX4pMxVO2HUh+zwEQTUAyC90AuCPk/U7f/ZoCJqgLmH//v20a9eO3/72t3Tq1Inx48ezYMEC+vTpQ+vWrVm7di0nT55kxIgRRERE0LNnT7Zs2QJAWloa8fHxREVFcdddd533bWPatGl0796dyMhI7rrrLgoLCy8WglJKla0Dq+HtfjBrIjidEBAEVaryyZoDJLz6A+s2bubf/36LBV/PIjc399L7u0w+P83c1dy5czl27NgV3WeDBg0YMmRIidvs3buXzz77jClTptCtWzc++eQTli9fzjfffMPzzz9P06ZNiYqK4quvvmLRokXccsstbNq0iaeffpq+ffvyxBNP8N133zFlyhQAduzYwcyZM1mxYgUBAQHce++9TJ8+nVtuueWKtk0ppUrFWQir3oQFT0GtZjDyHQoRCgucVPH3ozpZhOSk8sXXywlvGMaIESMIDAz0WDjlKkF5S4sWLejcuTMAHTt2JDY2FhGhc+fO7N+/n+TkZL744gsAYmJiSEtLIyMjgx9++IEvv/wSgKFDh1K7dm0AFi5cyPr16+nWrRsA2dnZ1KtXzwstU0op29kUmD4ajm6GdtfBiLc4K1UZ/doy4trUoUX2LrZu3cqgatWIuXYoXbp0wc/Ps4Nw5SpBXaqn4ymu3xD8/PzOPfbz86OgoAB//1++jUXTty80jdsYw8SJE3nhhRc8FLFSSrmpMB8cARASavWaej/I6VbDqBFUhSp5eTSpksWutVvIDcigX79+9O3blypVqpRJaHoM6gro378/06dPB2DJkiWEhoZSo0aN85Z///33nDp1CoDY2Fg+//xzUlJSADh58iTJyRe82rxSSnlGQR6seA1ei7ImRPj5wdhpzMzpTt+XFrNo5Tpef/11mp5YwzURjbj//vuJiYkps+QE5awH5aueeuopbr31ViIiIggJCWHq1KkAPPnkk4wbN46uXbsyYMAAmjVrBkCHDh147rnniI+Px+l0EhAQwJtvvknz5s292QylVGWxdyF8/3+QtgfaDCEnJ4tcv3xqBgfQuEo2rauks2D+j1zVtCFjx46lSZMmXglTPD2PvTSio6NN8YKFO3bsoH379l6KqHLQ91ipSqIgDz6/FXbOgTotYciL5LUczJB//UCXhlXp6Uhi586d1KxZk7i4ODp27FgmV5sRkfXGmOjiy7UHpZRSFZ3TaQ3h+VeBoFoQ+wQH295G03q1cebk0K1WNqd3byIpMJuYmBh69uzpExUOPJagRKQtMNNlUUvgCWPMq556TaWUUi6MsXpLiU/CjZ9AvXYw4k1mbzzEo/9cyYuDarN/03JCsrPp0zWKmJgYqlWr5u2oz/FYgjLG7AIiAUTEARwGZnvq9ZRSSrlI3QPfPw77FkFYe7KyzpCenk2jWsE0DzhLr+qn2LJyA61bNCMhIYEGDRp4O+JfKKshvlhgnzFGp6oppZSnLXoOlr8KAcEw5EWcV9/O8NdXUTtoHcNqJLNv3z561qnD4MFjaNu2rc9WNSirBHUjMKOMXksppSofY6Ao0TgLIWIsWzs8RMfWrcjOymJg3bMcS9rBodMFxMfH0717dxwOh3djvgSPJygRqQIMA/5wkfV3AncC56ZhK6WUKoWjW6zhvP6PQas4iH2CeduPc9f763m8xxFO71pFYV4e1/SIZuDAgYSEhHg7YreUxYm61wAbjDHHL7TSGDPFGBNtjIkOCwsrg3BKZ//+/XTq1Om8ZU899RR///vfAVi9ejU9evQgMjKS9u3b89RTT11wP2vXrqV///60bdv23MVns7KyPB2+UqoiyzoJcx6BKQMgdQ9nTmew7UgGBmjESeJqnuDY5qU0bdqUe+65h2uvvbbcJCcomyG+cVTg4b2JEycya9YsunTpQmFhIbt27frFNsePH2fMmDF8+umn9OrVC2MMX3zxBWfOnClXfyxKKR+y+VOY+wfIyYDud8LAPzDh/W2czlrHhNCDHDiQTNewMOLjb6JVq1bejvayeLQHJSIhwGDgS0++jjelpKTQsGFDABwOBx06dPjFNm+++SYTJ06kV69egHV9vtGjR1O/fn0yMzO57bbb6NatG1FRUXz99dcAfPjhh4wcOZIhQ4bQunVrHn/8cQAKCwuZNGkSnTp1onPnzvzzn/8EYODAgRSd5Jyamkp4eDgA27ZtO1fWIyIigj179nj0/VBKlZH8LEy9DiyP+5K8wS9wpsDBoJqpdDm7jtTUE1x77bXcfffd5TY5gYd7UMaYLKDuldzn2HdWMfrqJoyJbkp+oZOb313Djd2b8puoJmTnFTLpg7Xc3LM513dpxOmcfO6Yuo5b+4QzpFNDTmbmcc+09dzRryVxHeqTciaHetWDflU8Dz/8MG3btmXgwIEMGTKEiRMnEhR0/j63bt3KxIkTL/j8v/71r8TExPD++++Tnp5O9+7diYuLA2DTpk1s3LiRwMBA2rZtywMPPEBKSgqHDx9m69atAKSnp5cY39tvv83kyZMZP348eXl5WndKqfLq9BFIfAKa94bo26DrJFbXGsbN767hzuTFsH8NhYWFXNOnB/379//F51B5pBeLvYSLTb8sWv7EE0+wbt064uPj+eSTT0p9xfX58+fz4osvEhkZycCBA8nJyeHAgQOAdVHZmjVrEhQURIcOHUhOTqZly5YkJSXxwAMPMHfuXGrUqFHi/nv16sXzzz/PSy+9RHJyMsHBwaWKTynlZQW5sOwVeD0atn/D/iMpzNlyBCNC1awjDKt1mLzdy2nVqhX33Xcf8fHxFSI5QTm81NHMu3qdux/g8DvvcXAVx3mPawQFnPe4TtUq5z12p/dUt27dc1chL3Ly5ElatGhx7vFVV13FPffcwx133EFYWBhpaWnUrfu/jmPHjh1Zv349w4cP/8X+i45HtW3b9rzla9asOa/Mh8PhoKCggNq1a7N582bmzZvHm2++yaxZs3j//ffx9/fH6bRKMefk5Jx73k033USPHj347rvvSEhI4N133yUmJuaS7VZK+YCkpfDtZDj1M7QdCgl/5cmvTnB41w6OrvkvR44cpmODBiQkTDw3rF+RaA/qEqpVq0bDhg1ZuHAhYCWnuXPn0rdvXwC+++67c6Xc9+zZg8PhoFatWuft4/7772fq1KmsWbPm3LJp06Zx7NgxEhISeP3118/tY+PGjSXGk5qaitPpZNSoUTz77LNs2LABgPDwcNavXw/A559/fm77pKQkWrZsyYMPPsiwYcPOlaNXSpUDzgLycfBmk7+RPvxD0v1qMyD4IL0yV3D6dAbDhg3jjjvuqJDJCcphD8obPvroI+677z4effRRwCqjcdVVVwHw8ccf8/DDDxMSEoK/vz/Tp0//xclv9evX59NPP+Wxxx4jJSUFPz8/+vfvz8iRI/nLX/7CQw89REREBMYYwsPDmTNnzkVjOXz4MLfeeuu53lJR0cPHHnuMG264gY8//vi8HtLMmTOZNm0aAQEBNGjQgCeeeOKKvjdKqSsoJwOWvmxdASLmz9AqlqQxC5jyn7WY75aSsXstADED+tGnT58yrc3kDVpuQ+l7rJS3OZ2waRosfAYyU9nVdAz/bfoYk+Nas2nTJuYvWkJu5hk6d+587th0RaLlNpRSyhcd+wm+vh+OboKmPWD8Z0xd48/ePUcJTlrC8ePHaNKkCQk33uC1woHeoglKKaW8yVGFgsw03g/7I7HX30stRx4dshOpcmIXObVqMmrUqDIrHOhrNEEppVRZys+Gla/Dqf0w4i0Ia8up29fwwZurODV/OXk/r8Pf35/YWN8pHOgtmqCUUqosGAPbvrSKB2Yc5ECDwbwxaz0vjIrk513bGObYQM6+bKKifK9woLdoglJKKU87mQRf3QcHVkL9zvCbt/lufwP2bjnI62+9Q8bJE7Ro0YL4+HifLBzoLZqglFLKU4pqNAXWoOD0MabWfoh2sffSOkSoenA+ESf34ahbhxtvvJE2bdpUyuNMJdETdS/hUuU2Jk2aROPGjcnNzQXOv1BrcQ6Hg8jISDp27EiXLl145ZVXzp3PtGTJEmrWrElkZOS524IFCwDren0dO3YkIiKCyMjI8074LSgoIDQ0lD/84YLltpRS3pCfA8v+AR8NwzgLoWooBfeu5QsTQ+KKH3n77bc5euQwCQnx3HvvvT5d1dabtAd1BTgcDt5//33uueeeErcLDg5m06ZNgHUV9JtuuomMjAyefvppAPr16/eLk3RXrVrFnDlz2LBhA4GBgaSmppKXl3du/fz582nbti2zZs3i+eef1z9ypbzJGNg22z7OdIBD9WP409uLmfLbAWxY9yP9sleRfzqP6OjyVTjQW7QHdQU89NBD/POf/6SgoMDt59SrV48pU6bwxhtvUNLJ0kePHiU0NPTcdflCQ0Np1KjRufUzZsxg8uTJNGvWjNWrV19+I5RSv07GYXg/AT6/FRNUHW75ho293yTX6eDVt94hMTGR5s2blcvCgd5S/npQHwz95bKOI6D7HZCXBdPH/HJ95E0QNR4y02DWLeevu/W7Xx1Ss2bN6Nu3Lx9//DHXX3+9289r2bIlTqeTlJQUAJYtW0ZkZOS59V988QXx8fE888wztGnThri4OMaOHcuAAQMAyM7OZuHChbzzzjukp6czY8aMczWnlFJlpLAAHP7WMJ7TMKX6g4RefRv9goNIXTqP9mnJVA8LY9T48eW6NpM3aA/qEi5VbqPIH//4R/72t7+dO6bkLtfeU79+/di0adO521VXXUW1atVYv349U6ZMISwsjLFjx/Lhhx8CMGfOHAYNGkRISAijRo1i9uzZWu9JqbKSexYW/RXe6kFu9hnwD8Rx+zw21LmObT/9xJQpU0hNPcHQoUPLfeFAbyl/PaiSejxVQkpeX7VuqXtM7pTbAGjVqhWRkZHMmjXL7X0nJSXhcDioV68eO3bsuOh2DoeDgQMHMnDgQDp37szUqVOZNGkSM2bMYMWKFecmZaSlpbF48eJzBQ+VUh7gLIRN02HRc3D2OPsbXsO9ry5k+gMJbFm/lpZHV+B0OunRuzf9+vWrMLWZvKH8Jagy5lpuIzY29ly5jcmTJ/9i2z/96U8MHXqBIcgLOHHiBHfffTf3339/iRMbdu3ahZ+fH61btwasKrvNmzfn9OnTLF++nIMHD547PvXBBx8wY8YMTVBKeUpmKnw0HI5vxdm4G35jp3PS2YqG8zbz73emkH82nfbt2xMXF0edOnW8HW25pwnKDSWV23DVsWNHunbteq5GU3HZ2dlERkaSn5+Pv78/EyZM4JFHHjm3vvgxqD//+c+0aNGCBx54gPT0dPz9/WnVqhVTpkzhyy+/JCYm5ryihsOHD+fxxx8nNzf3vOVKqV8pOx2Ca0FIXfLDOvB8+jVUbTqasVRlQ+IXNDt6mNCGDUkYPYLmzZt7O9oKQ8ttKH2PlbqYsymw+HnY+gWpk5YR2jAcgOe+2Qwn9lF46CeqVatGbGwsXbp00dM8LpOW21BKKXflZcHqN2H5q1CQw84mNzDxrR/59P7aJG1dB1tWISL079+/UhQO9JYSE5SI9AJuBvoBDYFsYCvwHTDNGJPh8QiVUqos5Z6Ft3pCxkFyW11L4JBnqerXkP5z1jFj6nvkZ58hIiKCmJiYClc40NdcNEGJyPfAEeBr4K9AChAEtAEGAV+LyCvGmG88HaQxRrvOHuJLQ7xKedWJXRDWFgKrURA1kfuXBxLk34/JZxzMm/cx1Y4fp0HTpiQkjKVx48bejrZSKKkHNcEYk1ps2Vlgg337h4iEeiwyW1BQEGlpadStW1eT1BVmjCEtLU2nwarKLWUHJD6B2ZPIjmFz6NC1L/4Df0dvv52k7dvCRx/toGbNyl040FsumqAukJwua5tfq0mTJhw6dIgTJ054+qUqpaCgoEpXRlopAM4csyZAbPwYqlRnQ5uHuWnWCabXSiF19waSf/wRf39/YmJi6NWrF/7+esi+rF3yHReRkcBLQD1A7JsxxtTwcGwABAQE/OKkWKWU+lXyc+DtvpjsdNI73Urta/5MK6pyu/9qFnz2Ibk5WjjQF7jzleBl4HpjzMUvdaCUUr6usAB2fw/troOAIAqHvMy4b7OpcqoVTxxKJTFxBtmpqVo40Ie4k6COa3JSSpVbxsDuebDgSTixk8U932dgwkgcnUdye/4+kjavZsaMvdSpo4UDfY07CWqdiMwEvgJyixYaY770VFBKKXVFHN4AiU/A/mVQ5yrWdHuVW5cEMrXZEc4kbTxXZy0hIYFu3brhcDi8HbFy4U6CqgFkAfEuywygCUop5bsK82HmzeTnZrM/+klaX/MAkYXwhHMlq775mLy8PLp168aAAQO0NpOPumSCMsbcerk7F5FawLtAJ6ykdpsxZtXl7k8ppUqUdRJ+fBf6TAb/QJw3TOfGz1NwHK7BU7v2kJiYSHp6Om3atGHw4MGEhnr8TBn1K7gzi68J8DrQByvJLAcmG2MOubH/fwFzjTGjRaQKoF9TlFJXXkEurJ0CP/wdk5PBzCP1GDF6AkFNovh9ws9sWrmEzz47QL169ZgwYQItW7b0dsTKDe4M8X0AfAIUlaq92V42uKQniUgNoD8wCcAYkwfkXW6gSin1C04nbP0CFj0D6QegVRyb2z7Cn2dnUKfDIbJ+3sjmzZsJCQnhuuuuIyoqCj8/rdNaXriToMKMMR+4PP5QRB5y43ktgRPAByLSBViP1fPKdN1IRO4E7gSrdLpSSpWGWfU66c4Q1kdPIe66sXTMz+fvJ5ez7rvpOJ1OemvhwHLLnQSVKiI3AzPsx+OANDf33RV4wBizRkT+Bfwe+IvrRsaYKcAUsMptuBu4UqqSOrELlr4E1/4dQuogN83i/748QPZxQ9jmzSxatIjTp0/ToUMH4uLiqF27trcjVpfJnb7ubcANwDHgKDDaXnYph4BDxpg19uPPsRKWUkqV3tkTMOcReKsXzt3zefXjzzlxJheqN+DhPmH0K9zCV199RdWqVZk0aRJjxozR5FTOuTOL7wAwrLQ7NsYcE5GDItLWGLMLiAW2X0aMSqnKzBhY/gos+ycUZEO333Kg0318PHU37fYd5ezedWzbto3q1aszfPhwLRxYgZRUbuNxY8zLIvI61uy98xhjHnRj/w8A0+0ZfEnAZU9ZV0pVUiJwZCNJNaKZ2+Bu7r12CA1zc3mux27WzZmmhQMrsJJ6UEWXN1pXwjYlMsZsAn5RxlcppUqUvMq6NNGwNyCsDYx6j4+/38vxjBx+XLeOpUuWkJmZSUREBLGxsdSoUSbXrlZlrKRyG9/aP6eWXThKqUrt1H5IfBK2f0VB1YY8+8kCxo1tQLsGNbipfRALFyzjv98dp2nTpowbN04LB1ZwJQ3xfcsFhvaKGGNKfVxKKaUuavELsPyfGD8HMvCPnI26i9Xvb6HboRNsXPwdu3fvplatWowePZoOHTrocaZKoKQhvr+XWRRKqcrJGOsYE0B+JnvC4vhPlQm8NGAIgTk5PNQuk3Xff4K/vz+xsbH07NlTCwdWIiUN8S0ty0CUUpXMgTXw/eOYuKeQqwbB4GdZtmI/mcknWb5qDauW/0BOTg5RUVEMGjRICwdWQiUN8f1EyUN8ER6JSClVsZ0+Yh1n+mkWhdUa8tKczfRK6MjAtmH0Ccsja9MqFu1No0WLFiQkJFC/fn1vR6y8pKS+8nVlFoVSqnJYMwUWPIVxFiD9HqOw12Q2fbSN8BNpTPtxHklJSdStW5dx48bRunVrPc5UyZU0xJdcloEopSqwomNNIhyu24vn8sfx2sCR5Odkc3OjVDYtTiQwMJAhQ4YQHR2thQMVUPIQ33JjTF8ROYM11CeuP40xeuKBUqpkaftg7h+g/XWYqAlIt9+yo9owMlftJ3HJcjavXUFBQQHdu3dnwIABBAcHezti5UNK6kH1tX9WL7twlFIVQl4mLPsHrHwd46jCRyfbI7nJTOjZnAbOE3Q9s5ofl2vhQFUyt+ZrikhXoC92wUJjzEaPRqWUKr/2LoBvJsPpQxBxI8Q9xYqvDhORkcGHH37IgQNaOFC5x52Kuk9gFSv80l70oYh8Zox5zqORKaXKJ2M461eNJ6q+yJNDfosUZDOk2kF+WrOFnKpVtXCgcps7PahxQJQxJgdARF4ENgCaoJRSkJ8Ny18FPwem/++Q1oNJHn01yd/sYN6SZezZuApjDH369KFfv34EBgZ6O2JVTriToPYDQUCO/TgQ2OepgJRS5cieBfDfR+HUftbVvpbEszv4/bXtKUg7SJ+cNez48YwWDlSXraRZfEVlNnKBbSKSaD8eDCwvm/CUUj7pzDGY+3vYNhtC28DEb5m9qTbm7Fneffddjhw5QqNGjRg9ejTNmjXzdrSqnCqpB1VUZmM9MNtl+RKPRaOUKh8yU3Huns+nVW+h95inqVlF6JK/gB07t3OmenVGjBhBRESEnmirfpWSpplrmQ2l1P8c3Qy758OA30GDTqTdsZH3Pt7BqR/WcWrXWvz8/BgwYAC9e/fWwoHqirhUuY0pwFxjTH6xdS2BScB+Y8z7Ho1QKeVdeVmw5HlY9RY5VWrxt+O9+NPo3hw4eIghznWkbs+kS5cuxMTEaOFAdUWVNMR3B/AI8KqInAROYE2WaAHsBd4wxnzt+RCVUl6zdyHMeRjSk6HrRKYFTWL1tnRe//cU0lOP06xZMxISbqJRo0bejlRVQCUN8R0DHgceF5FwoCGQDew2xmSVTXhKKa/JycB8Nok0apISP4N6bboTND+Rbhm7oXYtxowZQ/v27fU4k/IYt64kYYzZjzXdXClVkRkD+xZBy0EQVJPccV8y9tNUIrcaai38N/7+/gweHEePHj20cKDyOP0LU0pZTh+F7x6FXd8xo9nTjJpwP5uOFRLDTxQeyyGqa1cGDRpE1apVvR2pqiQ0QSlV2RkDmz6BeX+Agly2dnyMv21rzZ433sOcPkbLli2Jj4/XwoGqzGmCUqqy+/ZB2PARp0KjKRz8POtX72IIG6kTUIt4LRyovMidi8X2AZ4CmtvbF9WD0ssQK1VeGQPOQnD4YzqOZMrOYGam92XAp/MIDg5i+DWDtXCg8jp3elDvAQ9jXVGi0LPhKKU87lQy5tsH2e3flgbDn+GnowEcyK9HP+cWevTQwoHKd7iToDKMMd97PBKllGc5nbDuPUh8EifwQVYrju3/lBb5yXRq04b4+Hjq1q3r7SiVOsedBLVYRP6GVQ8qt2ihMWaDx6JSSl1Z6Qdwzr4Xv+Rl5DTuzdcmloxDQo/aOSQkaOFA5ZvcSVA97J/RLssMEHPlw1FKeUTOabIPbeb5/NspOFyHsGpwx4hBREZGauFA5bMumaCMMYPKIhCl1BWWfoDszV+R3vk2du1MZYm5k9SAGtzQrxN9+/bVwoHK57kzi68m8CTQ3160FHjGGJPhxnP3A2ewJlcUGGOiS36GUupXMwbWf4CZ/xeceQU8vMif9n4n6NSxIw/FxVGrVi1vR6iUW9wZ4nsf2ArcYD+eAHwAjHTzNQYZY1IvIzalVGmdSiZ/9v0EHPiBI1Va8Y/C4XRuEMItw26jadOm3o5OqVJxJ0FdZYwZ5fL4aRHZ5KF4lFKXqyCPnCmDKcjKYJYZSkpQNJOui6Nz5856oq0ql9xJUNki0tcYsxzOnbib7eb+DTBfRAzwjjFmSvENRORO4E5AS0MrdTkyDnParyZrVq/iaG5/Fjo7MqJPJPfH9iUgIMDb0Sl12dxJUPcAU+1jUQKcxCpW6I4+xpgjIlIPSBSRncaYH1w3sJPWFIDo6GjjduRKVXbOQpxr3iF//lO8VXAD2Y4wukZdzxsxMVSvXt3b0Sn1q7kzi28T0EVEatiPT7u7c2PMEftniojMBroDP5T8LKXUpTiPbSfv8zsISt3KDtOGgyGdeWz8UFo0a+Lt0JS6Ykoq+X6zMWaaiDxSbDkAxphXStqxiFQF/IwxZ+z78cAzvz5kpSq3lHn/oPaqv5JvAllSbTTNrn2ENzp00ONMqsIpqQdVVPTlQmMF7gzF1Qdm2/80/sAnxpi5pQtPKVUk8+xZfli2jLS122ng7Mqe9vdzx5jrtHCgqrBKKvn+jn13gTFmhes6e6JEiYwxSUCXXxeeUqow8xTb37+HtSl+7PfvQI+rf0OvQYOI08KBqoJz56vX60BXN5Yppa4g43RyZOG/qbnyBTo6z7LVMYTR4yfSpZWez6Qqh5KOQfUCegNhxY5D1QC0SIxSHnRsz0YOzZhMtHMzJxwNSYt/g7E9hul181SlUlIPqgpQzd7G9TjUaWC0J4NSqrI6c+YMixcv5tCGRCaY3XxdZxLX3fsyYQF63TxV+ZR0DGopsFREPjTGJJdhTEpVOgUFBcyf9TbHdqxgt38XBvYciqPnEwyvFebt0JTyGneOQWXZ9aA6AkFFC40xWm5DqV/JGMPO9csx8//MtXmbOOIIpePwP9IjsrO3Q1PK69xJUNOBmcB1wN3AROCEJ4NSqjI4fDCZuVNf5Ib82YRIHumdb6fh9c/SqIrOzlMK3EtQdY0x74nIZJdhv6WeDkypiio9PZ1Fixaxb8sa7mE2h4Lb0PrWd6hVv723Q1PKp7iToPLtn0dFZChwBNDrqShVSnl5ecyZ8zWpG79mhyOS6/rFE9DpdtrVaw16FQilfsGdBPWcfaHYR7HOf6oBPOzRqJSqQIwxbN7wIxnzX+La3B/wczjZMHA8PQfGejs0pXyaOxeLnWPfzQC0/LtSpZCcnMzsT95mZM7nREoK2U0HEDD8FXqGtvJ2aEr5vJJO1H2dEq65Z4x50CMRKVUBnDx5ksTEBezesZU7mUWhfyA5o2YR3CHB26EpVW6U1INaV2ZRKFVB5OTkMPf7/5K24XM2OKK5YVAsddqNJ6BuC/Cv4u3wlCpXSjpRd2pZBqJUeeZ0Olm3dg0Zi/7F4LwlBDtyaH91HL0HDPB2aEqVW5c8BiUii7nAUJ+eqKuUZd++fcz/7D8Mzvqa7n5HyG3UHb/r/0HvhhHeDk2pcs2dWXyPudwPAkYBBZ4JR6nyIyUlhXnzE0nau4fxfvOo6ijk5ND3qHP1KJ02rtQV4M4svvXFFq3QE3VVZZaVlcXiuV9xduMsVjr6MSE+nvD2t+OoFoYEBF16B0opt7gzxFfH5aEfcDXQwGMRKeWjCgsLWbTkBwJWvUpcwUr8HQU07RRD7969vR2aUhWSO0N867GOQQnW0N7PwO2eDEopX2KMYdeuXSz+7C2GFcyhsaSRGx6DY+hL9A5r4+3wlKqw3Bnia1EWgSjli7YnHWTp4sWkHPqZYQHbwb82WSPfJaStzhFSytPcGeILAu4F+mL1pJYD/zbG5Hg4NqW85uzZsyz/+kNCds5kt18C44ZeQ0Tnh3AEVgetaqtUmXBniO8j4AzWdfgAxgEfA2M8FZRS3nImK4fZX39N1J7XSHBuJTugKi0GhtO0e3dvh6ZUpeNOgmprjOni8nixiGz2VEBKeYMxhm3btrHzi2cZ61yAww9yut5JyOA/EhJc29vhKVUpuZOgNopIT2PMagAR6QGs8GxYSpWNgkInHy3YwPF928g7sZ/YYMOxWkNoPvYl/GtqVRmlvMmdBNUDuEVEDtiPmwE7ROQnwBhj9HR5VS5lnEpjx6xnGHrkaz6QkVw/7GYiu/wZP4fD26EppXAvQQ3xeBRKlaFF246wfd673Hj6A3pykhPV2vDwqNEEtuzq7dCUUi7cmWaeLCJdgH72omXGGD0GpcoVY4xVOHDzZkK+eYj7zSbSqzTkbMJ/COs6Ri9NpJQPcmea+WTgDuBLe9E0EZlijHm9hKcp5TOOn87hmXdnUp18gs8cplftLpxo9xvCYu8HhzuDCEopb3Dnv/N2oIcxJhNARF4CVvG/aedK+aQzOfkUHN/N2S8f47WMVXzpfz3tRj5Op06dEO0xKeXz3ElQAhS6PC60lynls174fAWNtr7NTfyX6hiONhvOiNEvE1CzvrdDU0q5yZ0E9QGwRkRmYyWm4cB77r6AiDiwqvMeNsZcd1lRKuWGn1MzaVgjkJ82b2TYtodob/ZwsE4v6o76B02adPB2eEqpUnJnksQrIrIE61JHALcaYzaW4jUmAzuAGqUPTyn37D6WwZuvv4yjeiNq5qbSteFw6vXqRfPOsd4OTSl1mUpzhFgAJ6UY3hORJsBQ4K/AI6ULTamSZWTls+v4GdpkrKDu93/kXwEHWGoGU3/sc7Rt21aPMylVzrkzi+8JrOvufYGVnD4Qkc+MMc+5sf9XgceB6iXs/07gToBmzZq5sUulLK9Mn03MobeoJRvJoAZ7Oj1Gn+H/h39AFW+HppS6AtzpQY0DooquXi4iLwIbgBITlIhcB6QYY9aLyMCLbWeMmQJMAYiOjjbuha0qo0Kn4csNh4hpG8rurZsYeeRV2shedjQZR7Mxf6V1zbreDlEpdQW5k6D2A0FAUXmNQGCfG8/rAwwTkWvt59cQkWnGmJsvJ1Clkg4d5ehXf+Efwe0ILMilc/h4GscMpn1TLRqoVEXkToLKBbaJSCJWPajBwHIReQ3AGPPghZ5kjPkD8AcAuwf1mCYnVVqbD6az9WAa12V/Q5MV/+BB/zOsqHIN9cc+R6tWrbwdnlLKg9xJULPtW5ElnglFqV/6cd50Yg6+QU05wkG/ppzp/Ty94m7GT4sGKlXhuTPNfOqvfRFjzBI0sSk3ZGTl89qiPYy9uhHH9myh7eFvqC45bGz3OO2HP0LT4GBvh6iUKiN6ITLlU/JT93H12keYs7EzZ5zV6NhmPB3jEogK0ytAKFXZaIJSXjd361E27krifjOD2ls/Ic7Pj2rVGtLsN/cRHh7u7fCUUl6iCUp5nd+697h//5tUJZutAZHIoD/Rt2esHmdSqpK7aIISkW+xZu1dkDFmmEciUhVe2tlcnvhqMzde3Yj8o7vJP7CZo9KQU10fJCrhJqpU0RNtlVIl96D+bv8cCTQAptmPx2GdG6VUqRhjEKDqgcU8su93rEjqxs+mOZ073Uj9uDja1Kzp7RCVUj7kognKGLMUQESeNcb0d1n1rYj84PHIVIXy6doDbFm7mL/4f0zwsR+pRU0a1K1FzIjbadKkibfDU0r5IHeOQYWJSEtjTBKAiLQAwjwblqoICp3WCLHDT+i445/cmPo+ZwlhcfA11Lvm/xjcOVIv6KqUuih3EtTDwBIRSbIfhwN3eSwiVSGknMnh/inzGdOtOTWyj3Fi/2kyHH3w6zuZvn1jCAgI8HaISikf586JunNFpDXQzl600xiT69mwVHmVkZVPTUcOoT++xtSzr/HD4h6s5mqiooYTGRNDtWrVvB2iUqqcKGkW38iLrLpKRDDGfOmhmFQ59a9528hf8x4PBXyJf+4pkmhNVuO+3HX9LTRo0MDb4SmlypmSelDXl7DOAJqgFAdPZlErJIDqQQGMOvJ3mji/JCm3KetqjCXi2lsZoYUDlVKXqaRZfLeKiB8w2hgzqwxjUuXEsfRsnn3lFbpd3Y1GVQpIPlCDugE30GzQrYzq0QOHw+HtEJVS5ViJx6CMMU4RuR/QBKUASD2by5ZD6cQE7aH+gqeZ4r+WlT91ZwH9iO6WwMCBAwkJCfF2mEqpCsCdWXyJIvIYMBPILFpojDnpsaiUz5o++2u67n0TZBOZUp0lxHG65XDuSbiGsDA9+0ApdeW4k6Bus3/e57LMAC2vfDjK12Rk5fPvpfsY36MZTeuEMM6xmOp+u0k0/UgKHUxswlAtHKiU8gh3ppm3KItAlG/KO7adLqseZ2veJDYQws7dtQgKuY/egxK44+qr9YKuSimPuWSCEpEA4B6g6HJHS4B3jDH5HoxLedG/l+wj+/BWHgn8htCtXzDYP5C5W75mCx3p0XsQ/fv3JygoyNthKqUqOHeG+P4NBABv2Y8n2Mt+66mgVNnLziskuIo1667nzhfocuxzCh1BbKjSm8V5EYR36Mp9cXHUqVPHy5EqpSoLdxJUN2NMF5fHi0Rks6cCUmVvffJJXvzgM34/cSRXtwijeXhrNmfGknimNbXqt+SG+HgtHKiUKnPuJKhCEbnKGLMPQERaAoWeDUt5WkZ2PmlncmiZuYkuP/yDz1jM/j2Gz9eHsm1bDtWq9SZ+RCxdunTRE22VUl7hToL6HbDYvlisAM2BWz0alfIo43TyzzdeZVze55C/E0dIKHvDxzN7zWHy/NLo378/ffr00cKBSimvKulafA8BK4ClQGugLVaC0ovFlkNZeQV8teEwN3Zvhh/wO/9PCZAcDrSbzJdJwWQk59G5c2diY2OpqYUDlVI+oKQeVBPgX1hXMd8CrMRKWAcBTVDlSdZJkue8So+ts/ix1jx6tGvOydh/MXflFo5sPUGTJvUYPS5BCwcqpXxKSdfiewxARKoA0UBvrJN2/yMi6caYDmUTorochU7DN4uWEnVkJuEHv6J9fhanmw2gTmA6n366il27dlGzZk1GjRpFx44d9TiTUsrnuHMMKhioAdS0b0eAnzwZlPr1/E4l8ZvlwynAHyJvJPfq37Jqewprp32Dv78/MTEx9OzZUwsHKqV8VknHoKYAHYEzwBqsIb5XjDGnyig2VRp5meyc/y4bt+9kxENvEFz3KrISXiGwwzWs3XWIJTMSyc7OJioqihgtHKiUKgdK6kE1AwKBPcBh4BCQXgYxqVI4sGcL9XZOI2jrp7TLzYCA9qSezqJpaHUOh/Zn/rTZpKamEh4eTkJCghYOVEqVGyUdgxoi1oGJjljHnx4FOonISWCVMebJMopRXUTGsik0W/g7CsUBHUdA9ztp26Q7J1JTmTbta/bt20edOnUYO3YsbbVwoFKqnLlUPSgDbBWRdCDDvl0HdAc0QZW1syeYN+1vHKoewe3jb6Zmxzi2H7qPegPuIrRRczIzM1n83/+yYcMGAgMDiY+Pp3v37lo4UClVLpV0DOpBrJ5THyAfa4r5KuB93JgkISJBwA9Yw4T+wOfa6yq9L9cf5MS2xdwVsgS2f0OCM5/lfrcBN0OdlnQY9zwFBQWsXLmSH374gby8PKKjo7VwoFKq3CupBxUOfA48bIw5ehn7zgVijDFn7SuiLxeR740xqy9jX5XGzmOnmb3xMI8ntMPhJ0Qv/y3NTq3GBNZAuv0Wom+jb1gbAIwx7NixgwULFnDq1Clat27N4MGDtXCgUqpCKOkY1CO/Zsf28OBZ+2GAfTO/Zp8VkTGGTQfTuapeNWoE+pO2YxlNV33Ivi7v0KZRHZr2Gw/cjHQaBVX+1yM6cuQI8+fPJzk5mbCwMG6++Wauuuoq7zVEKaWuMHfOg7psIuIA1gOtgDeNMWsusM2dwJ0AzZo182Q4PsUYg4iw4+gZJr01n/ei9hGd9i19UrbTO6ga4ncYqIN0veW85505c4aFCxeyefNmQkJCGDp0KF27dtXCgUqpCkesjo6HX0SkFjAbeMAYs/Vi20VHR5t169Z5PB5vKnQaHpixgZah1XgsoS3m+Hac7wzA4cyDRlFw9a3QaRQEnn+eUn5+PitXrmTFihU4nU569OhBv379tHCgUqrcE5H1xpjo4ss92oMqYoxJF5ElwBDgogmqojqZmcfGA6eIbV8fx9mjXH/6U2o5Q4CnkbB2OPo8aE0Tb9D5F881xvDTTz+xcOFCTp8+Tfv27Rk8eDC1a9cu83YopVRZ8liCEpEwIN9OTsFAHPCSp17P1xQN4QG8mbiNlPVf0b/1VgJ+XsQ1xgl1hlkb+vlB7F8uuI+DBw8yb948Dh8+TMOGDRk5ciTNmzcvqyYopZRXebIH1RCYah+H8gNmGWPmePD1fMbWwxk8MnMjb9zUlTYNavCw8wOqOaZCamPo+whE3gR1Lz6hIT09nQULFrBt2zaqV6/O8OHDtXCgUqrS8ViCMsZsAaI8tX9fYoxhffIpggIcdKqRTYvdn/CfrKlkHn4DGvSjWp+7IWIYtBwEfhc/aTY3N5dly5axevVqREQLByqlKrUyOQZVUeUXOglw+FGQl8Psj/7FTcGrIOtHqhonVRtHQ6j99tbvYN0uwul0snHjRhYvXkxmZiYRERHExsZSo0aNMmqJUkr5Hk1Ql+mF77ayd+9u3ps8kgAxPOP4D+KoBX0esobwQlu7tZ+ff/6ZefPmcfz4cZo2bcq4ceNo3LixR2NXSqnyQBOUm5JOnGXm2gM81jmbgO1f8NCWWZz1q05+wXACqoTguGsp1LnKmvTghrS0NBITE88VDhw9ejQdOnTQ40xKKWXTBFWCw+nZVKviT82QALI3zOTGtS8T8OMxcFQhuNVggiNuAD87objZY8rOzmbp0qX8+OOP5woH9urVC39//VUopZQr/VQspmh6+NH9O5n2n3/SfNAkbozrRbsGNTDhbaDLn6D99RBcuvOQCgsLWb9+PUuWLNHCgUop5QZNUDZjDL//cC4xhStIMCtpeHg9/xcAacG9gF44uoyBLmMua7979uwhMTGR1NRUWrRoQXx8vBYOVEqpS6jUCerbzUfYcegkjw/thORk8HzyeBwUQsMuEPc0dPwNdWtf/omxKSkpzJ8//1zhwBtvvJE2bdrocSallHJDpUpQyWmZJG4/zu1dgpEd3xK5fDqNsiF/yGICgmvh+M1b0DgaQlv9qtfJzMxk8eLF5woHJiQk0K1bNy0cqJRSpVChE1R2XiGrk9KIDq9N9aAADq2YSed178DCXYChcVh7mnYb/b+JDl1u/FWvV1BQwJo1a1i2bBl5eXl069aNAQMGaOFApZS6DBUqQRU6DVsOpVO/RhCNagWz++ckFn78Jjkj7+Oaq1sTXes0jjCDdP49dBiBX712V+R1L1Q4MD4+ntDQ0Cuyf6WUqowqVIJKz8pj4luJvNL5II2cy4lIWkqXgELyqgwEWhPY9wHo/9AVfc0jR44wb948Dhw4QL169bRwoFJKXSEVKkHVLUxlU8i9+O3Jh9rhSN+HoNMoqtSzLzNUwnXwSksLByqllGdVqARFzcb4DfoDtBgIjbuCB2bLFS8c2Lt3by0cqJRSHlCxEhRAv0c9stvihQM7dOhAXFycFg5USikPqXgJygMOHDjAvHnzOHLkiBYOVEqpMqIJqgTFCweOGDGCiIgIPdFWKaXKgCaoCyheOHDAgAH07t1bCwcqpVQZ0gTlQgsHKqWU79AEZUtKSmLevHmkpKRo4UCllPIBlT5BpaamkpiYyO7du6lVq5YWDlRKKR9RaRNU8cKBsbGx9OzZUwsHKqWUj6h0n8aFhYWsW7eOpUuXkpOTQ1RUFIMGDdLCgUop5WMqTYIqKhw4f/580tLSaNGiBQkJCdSvX9/boSmllLqASpGgjh8/zvz580lKSqJu3bqMGzeO1q1b63EmpZTyYRU6QRUvHDhkyBCio6O1cKBSSpUDFTJBFRQUsHr1apYtW0ZBQQHdunVj4MCBBAcHezs0pZRSbqpQCcoYw/bt21mwYAHp6em0adOGwYMHa+FApZQqhypMgjLGMH36dPbt20e9evWYMGECLVu29HZYSimlLlOFSVAiQqtWrWjfvj1RUVFaOFAppco5jyUoEWkKfAQ0AJzAFGPMvzz1egA9e/b05O6VUkqVIU/2oAqAR40xG0SkOrBeRBKNMds9+JpKKaUqCI+NgxljjhpjNtj3zwA7AL36qlJKKbeUyYEaEQkHooA1F1h3p4isE5F1J06cKItwlFJKlQMeT1AiUg34AnjIGHO6+HpjzBRjTLQxJjosLMzT4SillConPJqgRCQAKzlNN8Z86cnXUkopVbF4LEGJdaG794AdxphXPPU6SimlKiZP9qD6ABOAGBHZZN+u9eDrKaWUqkA8Ns3cGLMc0MuFK6WUuixijPF2DOeIyAkg+VfuJhRIvQLh+BJtk++raO0BbVN5URHa1NwY84tZcj6VoK4EEVlnjIn2dhxXkrbJ91W09oC2qbyoiG0qohesU0op5ZM0QSmllPJJFTFBTfF2AB6gbfJ9Fa09oG0qLypim4AKeAxKKaVUxVARe1BKKaUqAE1QSimlfJLPJygReV9EUkRkq8uyLiKySkR+EpFvRaSGvTxcRLJdrlzxtstzrra33ysir9mXYvKK0rTJXhdhr9tmrw+yl5fLNonIeJff0SYRcYpIpL2uvLYpQESm2st3iMgfXJ7jE20qZXuqiMgH9vLNIjLQ5Tk+0R47lqYisth+z7eJyGR7eR0RSRSRPfbP2i7P+YMd+y4RSXBZ7hPtKm2bRKSuvf1ZEXmj2L58ok2XzRjj0zegP9AV2Oqy7EdggH3/NuBZ+36463bF9rMW6IV1dYvvgWvKSZv8gS1AF/txXcBRnttU7HmdgaQK8Hu6CfjUvh8C7AfCfalNpWzPfcAH9v16wHrAz5faY8fSEOhq368O7AY6AC8Dv7eX/x54yb7fAdgMBAItgH2+9v90GW2qCvQF7gbeKLYvn2jT5d58vgdljPkBOFlscVvgB/t+IjCqpH2ISEOghjFmlbF+ax8BI65wqG4rZZvigS3GmM32c9OMMYXlvE2uxgEzoNz/ngxQVUT8gWAgDzjtS20qZXs6AAvt56UA6UC0L7XHju1ihVGHA1PtzabyvxiHY32RyDXG/AzsBbr7UrtK2yZjTKaxLi2X47ofX2rT5fL5BHURW4Fh9v0xQFOXdS1EZKOILBWRfvayxsAhl20O4XvVfS/WpjaAEZF5IrJBRB63l5fnNrkai52gKN9t+hzIBI4CB4C/G2NO4vttulh7NgPDRcRfRFoAV9vrfLY9cn5h1PrGmKNgfeBj9QLBivWgy9OK4vfJdrnZpovxyTaVRnlNULcB94nIeqwucJ69/CjQzBgTBTwCfGKPqV9o3NXX5tdfrE3+WN338fbP34hILOW7TQCISA8gyxhTdEykPLepO1AINMIaOnpURFri+226WHvex/pAWwe8CqwECvDR9sglCqO6bnqBZaaE5V5TijZddBcXWOb131VpeOxq5p5kjNmJNfSFiLQBhtrLc4Fc+/56EdmH1QM5BDRx2UUT4EhZxnwpF2sTVuxLjTGp9rr/Yh1HmEb5bVORG/lf7wnK9+/pJmCuMSYfSBGRFUA0sAwfblMJ/0sFwMNF24nISmAPcAofa49cuDDqcRFpaIw5ag91pdjLD3F+T74ofp/62ytlmy7Gp9p0OcplD0pE6tk//YA/A2/bj8NExGHfbwm0xjoAfxQ4IyI97VkstwBfeyX4i7hYm4B5QISIhNjHNwYA28t5m4qWjQE+LVpWztt0AKv2mYhIVaAnsNPX21TC/1KI3Q5EZDBQYIzxub87O4YLFUb9Bpho35/I/2L8BrhRRALtocvWwFpfatdltOmCfKlNl83bszQudcP6hn0UyMf6RnA7MBlrZstu4EX+d0WMUcA2rPHzDcD1LvuJxhpv3we8UfQcX2+Tvf3Ndru2Ai9XkDYNBFZfYD/lsk1ANeAz+/e0Hfidr7WplO0JB3ZhHaBfgFUOwafaY8fSF2vYaguwyb5dizXbdSFWr28hUMflOX+yY9+Fy6w2X2nXZbZpP9YEmLP277aDL7Xpcm96qSOllFI+qVwO8SmllKr4NEEppZTySZqglFJK+SRNUEoppXySJiillFI+SROUUh5knxe1XESucVl2g4jM9WZcSpUHOs1cKQ8TkU5Y50hFAQ6s81qGGGP2Xca+HMaYwisboVK+SROUUmVARF7GuphsVftnc6xSI/7AU8aYr+0Lg35sbwNwvzFmpVi1mJ7EOsk20hjToWyjV8o7NEEpVQbsywZtwLoY6xxgmzFmmojUwqrZE4V19QCnMSZHRFoDM4wx0XaC+g7oZKwSEUpVCuXyYrFKlTfGmEwRmYl1KZobgOtF5DF7dRDQDOtCnm+IVV24EOtCx0XWanJSlY0mKKXKjtO+CTDKGLPLdaWIPAUcB7pgTWByLUCXWUYxKuUzdBafUmVvHvCAfYVpRCTKXl4TOGqMcQITsCZUKFVpaYJSquw9CwQAW0Rkq/0Y4C1gooisxhre016TqtR0koRSSimfpD0opZRSPkkTlFJKKZ+kCUoppZRP0gSllFLKJ2mCUkop5ZM0QSmllPJJmqCUUkr5pP8HDQO+gWBQRYQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.plot(color='gray', label='model')\n", - "plot_estimates()\n", - "decorate(title='Constant Growth Model, t1=1970')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "improved-sigma", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap06.ipynb b/jupyter/chap06.ipynb deleted file mode 100644 index 26cdf959..00000000 --- a/jupyter/chap06.ipynb +++ /dev/null @@ -1,785 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "creative-motel", - "metadata": {}, - "source": [ - "# Chapter 6" - ] - }, - { - "cell_type": "markdown", - "id": "parental-symposium", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "compound-church", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "id": "quality-spectrum", - "metadata": {}, - "source": [ - "In the previous chapter we simulated a model of world population with\n", - "constant growth. In this chapter we see if we can make a better model\n", - "with growth proportional to the population.\n", - "\n", - "But first, we'll improve the code from the previous chapter by\n", - "encapsulating it in a function and using `System` objects." - ] - }, - { - "cell_type": "markdown", - "id": "ranking-tamil", - "metadata": {}, - "source": [ - "Here's the code that reads the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "annoying-herald", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "shared-offense", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "id": "therapeutic-merchant", - "metadata": {}, - "source": [ - "## System objects\n", - "\n", - "Like a `State` object, a `System` object contains variables and their\n", - "values. The difference is:\n", - "\n", - "- `State` objects contain state variables that get updated in the course of a simulation.\n", - "\n", - "- `System` objects contain **system parameters**, which usually don't get updated over the course of a simulation.\n", - "\n", - "For example, in the bike share model, state variables include the number of bikes at each location, which get updated whenever a customer moves a bike. System parameters include the number of locations, total number of bikes, and arrival rates at each location.\n", - "\n", - "In the population model, the only state variable is the population.\n", - "System parameters include the annual growth rate, the initial time and\n", - "population, and the end time.\n", - "\n", - "Suppose we have the following variables, as computed in the previous\n", - "chapter (assuming `table2` is the `DataFrame` we read from the file):" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "numerous-university", - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9\n", - "\n", - "t_0 = census.index[0]\n", - "t_end = census.index[-1]\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = census[t_0]\n", - "p_end = census[t_end]\n", - "\n", - "total_growth = p_end - p_0\n", - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "id": "starting-cooling", - "metadata": {}, - "source": [ - "Some of these are parameters we need to simulate the system; others are temporary values we can discard. \n", - "To distinguish between them, we'll put the parameters we need into a `System` object like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "colonial-domestic", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " annual_growth=annual_growth)" - ] - }, - { - "cell_type": "markdown", - "id": "fleet-beaver", - "metadata": {}, - "source": [ - "`t0` and `t_end` are the first and last years; `p_0` is the initial\n", - "population, and `annual_growth` is the estimated annual growth.\n", - "\n", - "Here's what `system` looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "floral-routine", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    System
    t_01950.0
    t_end2016.0
    p_02.557629
    annual_growth0.072248
    \n", - "
    " - ], - "text/plain": [ - "namespace(t_0=1950,\n", - " t_end=2016,\n", - " p_0=2.557628654,\n", - " annual_growth=0.07224800083333333)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system" - ] - }, - { - "cell_type": "markdown", - "id": "combined-banking", - "metadata": {}, - "source": [ - "Next we'll wrap the code from the previous chapter in a function:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "pacific-challenge", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "def run_simulation1(system):\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " results[t+1] = results[t] + system.annual_growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "id": "technological-medicine", - "metadata": {}, - "source": [ - "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", - "\n", - "Inside the loop, it stores the results in a `TimeSeries` which it returns at the end.\n", - "\n", - "The following function plots the results along with the estimates\n", - "`census` and `un`:" - ] - }, - { - "cell_type": "markdown", - "id": "grateful-terror", - "metadata": {}, - "source": [ - "\n", - "\n", - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "electoral-breach", - "metadata": {}, - "outputs": [], - "source": [ - "results1 = run_simulation1(system)" - ] - }, - { - "cell_type": "markdown", - "id": "ordinary-sound", - "metadata": {}, - "source": [ - "Here's the function we used in the previous chapter to plot the estimates." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "peripheral-cassette", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_estimates():\n", - " census.plot(style=':', label='US Census')\n", - " un.plot(style='--', label='UN DESA')\n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)') " - ] - }, - { - "cell_type": "markdown", - "id": "warming-audience", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "capable-diana", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABFD0lEQVR4nO3deVxU1/n48c9h2FVAARVBxH1BARXXuOCGuzHuxsQle9LsSfNr2u83SZs2TfpNkzZLU21qYrMajamJjIIo7isqKu674oaAgLIzc35/zGjQKI7AMAM879drXszcuffMc0B5uOeeex6ltUYIIYRwNi6ODkAIIYS4FUlQQgghnJIkKCGEEE5JEpQQQginJAlKCCGEU3J1dABlBQQE6LCwMEeHIYQQohrt2LEjQ2sdePN2p0pQYWFhJCcnOzoMIYQQ1UgpdepW22WITwghhFOSBCWEEMIpSYISQgjhlJzqGtStlJSUkJaWRmFhoaNDqZU8PT0JCQnBzc3N0aEIIcQNnD5BpaWl0aBBA8LCwlBKOTqcWkVrTWZmJmlpabRs2dLR4QghxA2cfoivsLAQf39/SU52oJTC399fzk6FEE7J6RMUIMnJjuR7K4RwVjUiQQkhhKh7JEFVo7CwMDIyMiq9jxBCVKvifId8rCQoIYQQ5XNxvSFJaa3Zv38/RqPRvh9r19ZrgZMnT9KhQwceeeQROnfuzIwZM0hMTOSee+6hbdu2bNu2jaysLMaPH09ERAS9e/dmz549AGRmZhIbG0vXrl15/PHHKVu9+Msvv6Rnz55ERUXx+OOPYzKZHNVFIYT4pcIciHvJ8tXVHdy9ATiWdpE3533HokWLOH36NEVFRXYLwemnmZe1YsUKLly4UKVtNm3alBEjRpS7z9GjR1m0aBHz5s2jR48efP3112zYsIEff/yRt956i+bNm9O1a1f++9//snr1ambOnElKSgq///3v6devH6+99hpxcXHMmzcPgAMHDrBw4UI2btyIm5sbTz31FF999RUzZ86s0r4JIUSF5J6DrybDpYPQfiS0GUpJSQkbN27k94lpnDc1YO7oWPr37YWLi/3Oc2pUgnKUli1b0qVLFwDCw8MZMmQISim6dOnCyZMnOXXqFN9//z0AgwcPJjMzk5ycHNatW8eSJUsAGD16NA0bNgRg1apV7Nixgx49egBQUFBA48aNHdAzIYS4SfpB+HIiFGbDjEXQejBbdx9gbdIqCnIymd6pC9179aJ766Z2D6VGJag7nenYi4eHx/XnLi4u11+7uLhQWlqKq+svv43Xpm/fahq31ppZs2bx5z//2U4RCyFEBZxYB98+AG6eMMdIjncYS7/5jrd2u9Ounj9/e3AUrVq1qrZw5BpUFRgwYABfffUVAGvWrCEgIAAfH58bti9fvpzLly8DMGTIEBYvXkx6ejoAWVlZnDp1y9XmhRCi+vi3heY9Mc2JJ/FQLh9//DFnjh9hRpcGvPtI9SYnqGFnUM7qjTfeYM6cOURERODt7c2CBQsAeP3115k+fTrdunVj4MCBhIaGAtCpUyf++Mc/Ehsbi9lsxs3NjY8//pgWLVo4shtCiLrocALsWQgT/gU+QZzs9y6ffL6K/14K4LF2bXh4Qix+fn4OCU2VnVnmaNHR0frmgoUHDhygY8eODoqobpDvsRB1UNFVSPgd7PgcGncib+JXrNiQQmrqXjx9GrHfO4I/Tu5B80bedg9FKbVDax1983Y5gxJCiLrm9Bb44XG4fArd5xm2NxjOR/9M5FRxPV4b3I8BAwY4RYUDSVBCCFGXmEosyUlr0scs4IcdF7hwYTW+fh1p7hVM7369cHNzjtTgHFEIIYSwr/SD0KgluHpQcN/nrEo+wvz/XiCkHjw+aRIdO3ZEKeVUC0hLghJCiNrMbILNH8HqP6L7vcAu3xEkJiaSV1DEBY9uhHdoTnh4uKOjvCW7JSilVHtgYZlNrYDXtNZ/s9dnCiGEKCPrBPz3STi9mcKWsXx3uB5xaVsZ1jKQWaNH8aJPI3y9HH+t6XbslqC01oeAKACllAE4C/xgr88TQghRxoFl8MPjaKXY0+oplp7wJMPVja0locyM7kqTJk0cHeEdVdeNukOAY1rrGnc36smTJ+ncufMN29544w3effddALZs2UKvXr2IioqiY8eOvPHGG7dsZ9u2bQwYMID27dtfX3w2P98xS9gLIWo/3aglVxp25hPDw/zrmD/do6N558U5LHumH6Mjmjk6PJtU1zWoacA31fRZ1WrWrFl89913REZGYjKZOHTo0C/2uXjxIpMnT+bbb7+lT58+aK35/vvvuXLlCt7e9r/HQAhRR+xfCqc2cSn6ZYwrkjmZ3pddrh05bG7AnwYNxcvLjc7BXo6O0mZ2P4NSSrkD44BFt3n/MaVUslIq+dKlS/YOp8qlp6cTFBQEgMFgoFOnTr/Y5+OPP2bWrFn06dMHsKzPN2nSJJo0aUJeXh4PPfQQPXr0oGvXrixduhSAzz//nAkTJjBixAjatm3LK6+8AoDJZGL27Nl07tyZLl268P777wMQExPDtZucMzIyCAsLA2Dfvn3Xy3pERERw5MgRu34/hBAOUJANSx6H72aSu28lc//xEafPpzN69Gj+/vgo5s6Mxtfbea813U51DPGNBHZqrS/e6k2t9TytdbTWOjowMPCOjU2du5lFyWcAKDGZmTp3Mz/sSgOgoNjE1Lmb+Wn3OQByC0uYOnczK1LPA5CVV8zUuZtJ3G8JJf1KYaU798ILL9C+fXvuu+8+5s6dS2HhL9tMTU2le/futzz+T3/6E4MHD2b79u0kJSXx61//mry8PABSUlJYuHAhe/fuZeHChZw5c4aUlBTOnj1Lamoqe/fuZc6cOeXG989//pPnnnuOlJQUkpOTCQkJqXSfhRBO5FgS+pO+6L2L2OIRw1+vjmWp7kFWi8FER0fTIqA+/dve+XerM6qOBDWdGjy8d7t7Aq5tf+2110hOTiY2Npavv/76rldcT0hI4O233yYqKoqYmBgKCws5ffo0YFlU1tfXF09PTzp16sSpU6do1aoVx48f55lnnmHFihX4+PiU236fPn146623eOeddzh16hReXjXn9F4IcQdFVzAvmk1uQSnz9DR2+Y3g4Yce5qlh4Uzv3dLR0VWaXa9BKaW8gWHA41XV5sLH+1x/7mZwueG1l7vhhtc+nm43vG5Uz/2G140beN7x8/z9/a+vQn5NVlYWLVv+/MNv3bo1Tz75JI8++iiBgYFkZmbi7+9//f3w8HB27NjBvffe+4v2r12Pat++/Q3bt27dekOZD4PBQGlpKQ0bNmT37t3Ex8fz8ccf89133zF//nxcXV0xm80AN5zF3X///fTq1Yu4uDiGDx/Op59+yuDBg+/YbyGEE7u4n9JGbdi4ZSfHSsZyiBasUp2ZP6Y3oc0bMifU0QFWDbueQWmt87XW/lrrHHt+jj3Vr1+foKAgVq1aBViS04oVK+jXrx8AcXFx10u5HzlyBIPB8IuVf59++mkWLFjA1q1br2/78ssvuXDhAsOHD+fDDz+83sauXbvKjScjIwOz2czEiRN588032blzJwBhYWHs2LEDgMWLF1/f//jx47Rq1Ypnn32WcePGXS9HL4SogUqLYdWb6H/ew7q/PcKaNWvw6RjDM489RMeQRrgaDI6OsErJShI2+M9//sOvfvUrXnrpJcBSRqN169YAfPHFF7zwwgt4e3vj6urKV199heGmfyRNmjTh22+/5eWXXyY9PR0XFxcGDBjAhAkT+N///V+ef/55IiIi0FoTFhbGsmXLbhvL2bNnmTNnzvWzpWtFD19++WWmTJnCF198ccMZ0sKFC/nyyy9xc3OjadOmvPbaa1X6vRFCVJOL+zAtfhTDpX2kEM4yUy8uN+vCaxP7o5Tii4f979xGDSPlNoR8j4VwcubkzyDuZQq0O0bDcJoMfIgThhB+2nOBT2dF4+ft7ugQK0XKbQghRA106tQpdm1Ipa1uyV+9nmHsoH4M6NmafmbNzL4tnWpx16omCUoIIZyN2UzRxn9wfN92vrvYCl/f5rSd+iUXEi6RUWhJSC4utTcxXSMJSgghnIj58mmufDUL34ydQGtONJrKR48Oob6XB0vbtcPNUF0r1Dle3empEEI4M625nPQRpR/0wCtjL5sDpnFo5EKSMw0czSgAqFPJCeQMSgghHK6goIBNxm8ZuPc10lyasy3yD0y+dxxKKWK6tKjxkyAqShKUEEI4iDabOZL0FUt3XqCgoADvLn9kfm43du+7yrjRZjzdDHU2OYEM8d3RncptzJ49m+DgYIqKioAbF2q9mcFgICoqivDwcCIjI3nvvfeu38+0Zs0afH19iYqKuv5ITEwELOv1hYeHExERQVRU1A03/JaWlhIQEMCrr75a1V0XQthR+skDnHw3hnbrn6alRybTZj1Mn4lP8YcJkSx5qi+ebrXrptuKkDOoKmAwGJg/fz5PPvlkuft5eXmRkpICWFZBv//++8nJyeH3v/89AP379//FTbqbN29m2bJl7Ny5Ew8PDzIyMiguLr7+fkJCAu3bt+e7777jrbfeqtVTToWoDYqKiti/+G3aHfmERhRzst0j/OnwAEbsyOTPLYIJ8pX1Mq+RM6gq8Pzzz/P+++9TWlpq8zGNGzdm3rx5fPTRR5R3s/T58+cJCAi4vi5fQEAAzZr9XGzsm2++4bnnniM0NJQtW7ZUvBNCCLvSWpOamsqBd0fR9ch7FHk1pfShRMLu/yuv3xvJ04PbOjpEp1PzzqA+G/3LbeHjoeejUJwPX03+5ftR90PXGZCXCd/NvPG9OXGVDik0NJR+/frxxRdfMHbsWJuPa9WqFWazmfT0dADWr19PVFTU9fe///57YmNj+cMf/kC7du0YOnQoU6dOZeDAgYDlwuqqVauYO3cu2dnZfPPNN9drTgkhnEdGRgbLjUaOnzhBP992HAjszv2HB7LApRURwPiuwY4O0SnJGdQd3KncxjW//e1v+b//+7/r15RsVfbsqX///qSkpFx/tG7dmvr167Njxw7mzZtHYGAgU6dO5fPPPwdg2bJlDBo0CG9vbyZOnMgPP/yAyWS6uw4KIeympKSEtSv+y7mPx9L09I+MGDGCQc9+TLMJf2JweAgB9T3u3EgdVvPOoMo743H3Lv/9ev53fcZkS7kNgDZt2hAVFcV3331nc9vHjx/HYDDQuHFjDhw4cNv9DAYDMTExxMTE0KVLFxYsWMDs2bP55ptv2Lhx4/VJGZmZmSQlJTF06FDbOyiEsItDhw5x6Mf3GZT3I/UopCh0MP884EKPHgpfLzf+OiXS0SE6PTmDuoM7ldso63e/+9312X13cunSJZ544gmefvrpcic2HDp06IYy7SkpKbRo0YLc3Fw2bNjA6dOnOXnyJCdPnuTjjz/mm29qbG1IIWqF7Oxsvv/yU4q+mcm4vG/waBiCy+NrONrBUhYvv0RGOWxV886gHKC8chtlhYeH061bt+s1mm5WUFBAVFQUJSUluLq68uCDD/Liiy9ef//ma1D/8z//Q8uWLXnmmWfIzs7G1dWVNm3aMG/ePJYsWcLgwYNvKGp477338sorr1BUVHTDdiGE/ZWWlrJp0ybWr19PC32Gzuoo20If52rPZxkcFMK0ppppPZrLTNu7IOU2hHyPhaikY8eOkRS3mIZZKZjDJxAbG4uX+SrjFhyjR1gj3hzf+c6N1GFSbkMIIapYbm4uCfHx6H0/cL9ag6ehlIX+L+FZrz7urr4sfLwxvl5ujg6zxpIEJYQQd8lkMrFt2za2JcUxvCSeDhxGN41id/c/8+rii9T3v8jYyGaSnCqpRiQorbWM29qJMw3xClETnD59mri4OLIunuUFw3/wcikgLer/ETLqFaIMriwLyqFzsK+jw6wVnD5BeXp6kpmZib+/vySpKqa1JjMzE09PT0eHIoTTy8vLIzExkUO7NuPu15SJ0x7AqziC9/Z6MX+7G5uGaHy9keRUhZw+QYWEhJCWlsalS5ccHUqt5OnpSUhIiKPDEMJpmc1mdu7cyarERDoXJfOiYQMF/T/EHNoa5d2Bqc3z6dM7H19vGc6rak6foNzc3H5xU6wQQlSHc+fOERcXR8HZfcz0XE+QPoqp+UAeXllK82P7+euUSEIaehPS0NvRodZKTp+ghBCiuhUUFLB69WqSk5Pp636QIS6JKO0BYz/A0G0m9247TXgzGcqzN0lQQghhpbVm9+7drFy5koKCAnr16sXAgNbk7ilm+tkpvNNkOBFKMaNXC0eHWidIghJCCCw12uLi4jh76jijfQ7Qum8fGgwZjgIKw6cQungP3u5SRLA6lZuglFJ9gAeA/kAQUACkAnHAl1rrHLtHKIQQdlRUVMTatWvZsmULrdwyeKn+GrxyT3H0dENeWJDMv2ZG4+PlztwHf7HQgbCz2yYopdRy4BywFPgTkA54Au2AQcBSpdR7WusfqyNQIYSoSlpr9u/fT3x8PIW5mTwQeJiWl1aiPIJhxmKSL7enJPUCecWlNPCUGXqOcNu1+JRSAVrrjHIPtmGfu3GrtfiEEKKqZWZmsnz5co4dO0bTpk25r3tTAuNms7vpJLJ6/4bBka2v38Qu91/a312vxWdL4qnK5CSEEPZWUlLC+vXr2bRpE/UNxcyI8KbVvY/i4uJCSdgOXv3qLL1PFzI4UhKTM7jjJAml1ATgHaAxoKwPrbX2sXNsQghRZQ4fPszy5cvJvnyZkc3zic5YjEq9yufeMUwf3APPgFYseiKU+h4yd8xZ2PKT+AswVmt9+5KvQgjhpLKzs1mxYgWHDh2iZSM3Hg1JxvvMegjuzq6oN/nDkkxCmmcwrFMTSU5OxpafxkVJTkKImsZkMrFp0ybWrVuHUorYQf3oveUxyM3nWPf/ofXoF+nqYiAx7CqtA+s7OlxxC7YkqGSl1ELgv0DRtY1a6yX2CkoIISrjxIkTGI1GMjIy6N6mMf3H3I+vry/4v8sfdnqyeIcLm2I19T2Q5OTEbElQPkA+EFtmmwYkQQkhnMqVK1dISEggNTWVAL8GPN35Cv77PuTy0SZc7jCGhuH38XBwARPzi2U4rwa4409Iaz2nOgIRQoiKMpvNbNu2jaSkJEwmE2MiG9Mt7TPU3kOUdprEpDgz3U8c4C+TIgn28yLYz8vRIQsb2DKLLwT4ELgHy5nTBuA5rXWaDcf6AZ8Cna3HPqS13lyZgIUQoqwzZ84QFxfHxYsXadOmDRMaHsBr26uYGzRD3b8I13ax/GpnGt1bNHR0qOIu2XKO+xnwNTDZ+voB67ZhNhz7d2CF1nqSUsodkDXphRBVIj8/n5UrV5KSkoKPjw9TJk+mQ8eOqL2LScueyfiDg/i3V08igQndpOZZTWRLggrUWn9W5vXnSqnn73SQUsoHGADMBtBaFwPFFYhRCCGu01pbCgiuWkVRUREx0Z3od3UZhhwPTLojhojJ+LYbzzDjQYJ8pVp0TWZLgspQSj0AfGN9PR3ItOG4VsAl4DOlVCSwA8vQYF7ZnZRSjwGPAYSGhtoatxCiDjp37hxGo5GzZ8/SIjSUCa2L8Nn0MpTks7EwlH/s28oXD/Wigacbf57QxdHhikpysWGfh4ApwAXgPDDJuu1OXIFuwCda665AHvCbm3fSWs/TWkdrraMDAwNtDlwIUXcUFhZiNBr59NNPyc7OZkpsL2YZluKz+v9BYAd4YgNpnR4lxM+bYpPZ0eGKKmLLLL7TwLgKtJ0GpGmtt1pfL+YWCUoIIW5Ha83evXtJSEggPz+f6OhoBg8ejOeFHeg1ySwNfhGPno8yIrAZUwNhag8ZhalNyiu38YrW+i9KqQ+xzMC7gdb62fIa1lpfUEqdUUq111ofAoYA+ysdsRCiTkhPT8doNHLq1CmCg4OZNSKawLzD4OkJYfdQ+uxe/jU/lZEZ+Y4OVdhJeWdQ15Y3qkz9i2eAr6wz+I4Dck+VEKJcxcXF1wsIuru7M3bUcLpeXY1a8hvMnn68l96Np0d0xbNeQ5Y8eQ/urrZcqRA1UXnlNn6yfl1Q0ca11imAlKEUQtyR1poDBw4QHx9Pbm4uUVFRxIYH4JXwAqTvhy5T2Nbu18z99ih9Ol7mnjYBkpxqufKG+H7iFkN712itK3JdSgghfiErK4vly5dz9OhRmjRpwqRJk2geUB/eC8fk4UNq/7lEDplGb2B9aChNZfp4nVDeEN+71RaFEKJOKikpYePGjWzYsAGDwcDw4cPp2dIXlybNLTtM/Q//b7M7qzYWsrF/Kd7urpKc6pDyhvjWVmcgQoi65ciRIyxfvpzLly/TpUsXhsX0o8G29+GTT7g8dj50GEPDNkN5KbCAJ4tNeLvL4q51TXlDfHspf4gvwi4RCSFqtZycHFasWMHBgwcJCAhg5syZtHS5AF8Oh6zjlHR7iLFxrvQ+foB3J0cS5CsLu9ZV5f1JMqbaohBC1Homk4nNmzezbt06tNYMGTKEPn36YFj/f7Dmbcx+objM+gm3lgN4qXkaXZvL4q51XXlDfKeqMxAhRO118uRJ4uLiyMjIoEOHDgwfPhw/Pz/LmwFtSe/4IBMODeMDQxe6Afd1lcVdRflDfBu01v2UUlewDPWpsl+11j7VFKMQooa6evUqCQkJ7N27Fz8/P6ZPn067Vi0g6S1oEAS9n4DOE/FqM46I7/fg5+Xm6JCFEynvDKqf9WuD6gtHCFEbmM1mtm/fTlJSEqWlpQwYMIB+/frhdmkfzIuB9P2cbvMg7xzbyYfTu9LA041/zOju6LCFk7FpWoxSqhvQD2vBQq31LrtGJYSosdLS0oiLi+PChQu0bt2akSNH4u/nCxveg7XvgHcA3L+ILbkdObX5JFn5xQTU93B02MIJ2VJR9zUsxQqXWDd9rpRapLX+o10jE0LUKPn5+SQmJrJr1y4aNGjApEmT6NSpE0opSEuGpLe4EDqaI91fp3+7dkzWmvu6BuNmkNUgxK3ZcgY1HeiqtS4EUEq9DewEJEEJIdBas2vXLhITEyksLKRPnz4MHDgQD3d3OLMNQntBSDSmx9fz8KJs/LZn0T8SlFK4GZSjwxdOzJYEdRLwBAqtrz2AY/YKSAhRc1y4cIG4uDjS0tIIDQ1l1KhRNGnSBHLPwXe/gmNJ7BnzE+0i++IZ1IVPZxXQqJ67o8MWNUR5s/iuldkoAvYppVZaXw8DNlRPeEIIZ1RYWEhSUhLbt2/Hy8uL8ePHExERYRnO2/df+Ok5MBWTPuAt7v0+h19fPcFTMW3kpltxV8o7g7pWZmMH8EOZ7WvsFo0QwqlprUlNTSUhIYGrV69eLyDo5WVNPD89Dzs+o6RpN9wmf0pj/9Z8FHCeIR0bOzRuUTOVN828wmU2hBC1z6VLlzAajZw8eZJmzZoxffp0mjVrduNOge3Z1/YJ7j/Un6W6KWHA6IggR4QraoE7lduYB6zQWpfc9F4rYDZwUms9364RCiEcqri4mHXr1rF582bc3d0ZPXo03bp1w8XFBUylsO4v0CQc3XEcqveT+HcsZKLPcQIbyNRxUTnlDfE9CrwI/E0plQVcwjJZoiVwFPhIa73U/iEKIRxBa83BgweJj48nJyeHqKgohg4dSr169Sw7XD4F3z8CadvYGzKdz1PD+OuUSJr6evLa2E6ODV7UCuUN8V0AXgFeUUqFAUFAAXBYa51fPeEJIRwhKyuLFStWcOTIERo3bsycOXMIDQ39eYe9i2HZC5bnE/9NUnokhReuUFxqliq3osrYtJKE1voklunmQoharLS0lA0bNlwvIBgbG0vPnj0xGAw/73R6K3z/MJkNo7g47EM6dYrgabNGKcu9TUJUFakAJoQA4OjRoxiNRi5fvkx4eDixsbH4+JRZE7owBzx9IbQXRfd9xn3GBvTcp3m3E7i4SGISVU8SlBB1XE5ODvHx8Rw4cAB/f38efPBBWrVq9fMOWsPWubDmLY6MXkzr8B54RE7gq+b5NPOT+5qE/UiCEqKOMplMbNmyhbVr16K1ZtCgQfTt2xdX1zK/FvKz4Mdn4OAycpsPYcrXx3l5fBNm9GpB80bejgte1Am2LBZ7D/AG0MK6/7V6UK3KO04I4bxOnTpFXFwcly5dol27dowYMYKGDW+qYHtmGyx+CH3lAmr4WzTo9SQvbD3N+KhgxwQt6hxbzqD+DbyAZUUJk33DEULY09WrV1m5ciV79uzB19eXadOm0b59+1vvvH8peSWaZ13/xF+6zMbfxYWZfcKqNV5Rt9mSoHK01svtHokQwm7MZjPJycmsXr2akpIS+vfvT//+/XFzu6mCbcFluHIBGneEIa9ztsOTeG5Il9l5wiFsSVBJSqn/w1IPqujaRq31TrtFJYSoMmfPniUuLo7z58/TsmVLRo0aRUBAwC123AmLZpFXqvi860J+NaQj7VqE8HGLkOoPWghsS1C9rF+jy2zTwOCqD0cIUVUKCgpITExk586d1K9fn4kTJxIeHv7LsyGtIfnfsOJVqN+EBU1/R8LBLB4dKDfdCse6Y4LSWg+qjkCEEFVDa01KSgqJiYkUFBTQu3dvYmJi8PC4xdp4JQWWWXp7F1HQYjBeU//NQ26+PKKUJCfhcLbM4vMFXgcGWDetBf6gtc6xZ2BCiLt38eJF4uLiOHPmDM2bN2f06NGWAoK3Y3DHnJfBvwzT2apnM9+7EZ7VF64Q5bJliG8+kApMsb5+EPgMmGCvoIQQd6eoqIikpCS2bduGl5cX48aNIyoq6vaTG/b/SGHT7ng2Csblge/pcuIy9wbUr96ghbgDWxJUa631xDKvf6+USrFTPEKIu6C1Zt++fcTHx3P16lW6d+/OkCFDfi4geDNTCax8Dbb8g2WuY/AY+3+MjWxG39a3mDQhhIPZkqAKlFL9tNYb4PqNuwX2DUsIcScZGRkYjUZOnDhBUFAQ06ZNIzi4nJtoc8/BojlwZgumno+z7vJEHvSVAT3hvGxJUE8CC6zXohSQhaVYoRDCAUpKSli3bh2bNm3Czc2NUaNG0b17d0sBwds5vxvzFxMoKcyD8Z/iETWZD6ovZCEqxJZZfClApFLKx/o6195BCSFu7dChQyxfvpycnBwiIyMZOnQo9evbcO3IL5Qcv3AeODOW3zUYRF/7hypEpZVX8v0BrfWXSqkXb9oOgNb6PTvHJoSwunz5MitWrODw4cMEBgYye/ZsWrRoUf5BRVcwr3+f3a0fo2vLpjR87Ef+c7UI//pSil3UDOWdQVnrOtPgFu9pWxpXSp0ErmBZw69Uax1d/hFCiLJKS0vZtGkT69evRynFsGHD6NWr140FBG/l0iFY+ABkHOXvaz1466VnaebnJclJ1CjllXyfa32aqLXeWPY960QJWw3SWmdUJDgh6rJjx45hNBrJysqiU6dODB8+/MYCgreTugS99GmUmxdXpixmUmlHqdskaiRbJkl8CHSzYZsQogrk5uaSkJDAvn37aNSoETNmzKBNmza2HbzxA1j5vxz36ESrxxfj6xvMGPuGK4TdlHcNqg/QFwi86TqUD3CH8YXrNJCglNLAXK31vFt8zmPAYwChoaG2xi1ErWMymdi2bRtr1qzBbDYTExPDPffcc2MBwTtpG8ueQ0cwNn6Ul+sHSUVSUaOV9+/XHahv3afsdahcYJKN7d+jtT6nlGoMrFRKHdRaryu7gzVpzQOIjo626dqWELXNqVOnMBqNpKen07ZtW0aOHPnLAoK3oY+v4eC6xVwZ8Ht6tupAxEMfEmHneIWoDuVdg1oLrFVKfa61PlWRxrXW56xf05VSPwA9gXXlHyVE3ZGXl8fKlSvZvXs3vr6+TJ06lfbt29tWf8lshvXvwpo/40Uzvtk2jZ6t+tk/aCGqiS0jAPnWelDh8PM6klrrcsttKKXqAS5a6yvW57HAHyoTrBC1hdlsZseOHaxevZri4mLuueceBgwYgLu7u20NXL1E7tdz8Dm3HtVlCt4D3+aNRo3sG7QQ1cyWBPUVsBAYAzwBzAIu2XBcE+AH61+CrsDXWusVFYxTiFrj3LlzxMXFce7cOcLCwhg1ahSBgYG2N2A2U/jvUXhknWBT+Ov0nfACjaXiraiFbElQ/lrrfyulnisz7Lf2TgdprY8DkZWOUIhaoqCggNWrV5OcnEz9+vWZMGECnTt3tr2cutlMYakJT3c3PEa/TcJpMwP6DQZJTqKWsiVBlVi/nldKjQbOAVIDWggbaa3ZvXs3K1eupKCggF69ehETE4On510s1Ho1nUv/mcVXmW2Z9uxfaNpmCMNtnHkuRE1lS4L6o3Wh2Jew3P/kA7xg16iEqCUuXryI0Wjk9OnThISEMHr0aJo2bXp3jRxbDUsex78wl4CAvrga5IxJ1A22LBa7zPo0B5Dy70LYoKioiDVr1rB161Y8PT3vXEDwVkwlHPzmN7Q/+m9UYHtcZi7lgSad7Be0EE6mvBt1P6ScNfe01s/aJSIhajCtNfv37yc+Pp4rV67QrVs3hgwZgre39903dn4P7Y7OZ7X3CPo/9CnuXlLxVtQt5Z1BJVdbFELUApmZmRiNRo4fP07Tpk2ZMmUKISF3d7lWa83atYk069ibdiHdKX18I4OadMTFRYb1RN1T3o26C6ozECFqqpKSEtavX8+mTZtwdXVl5MiRREdHl19A8FYKcyj58QUG7F/C3LRPaPfAdNyDZEhP1F13vAallEriFkN9d7pRV4i64PDhwyxfvpzs7GwiIiIYNmyYbQUEy9Bas3dTPF22vYx77jkye77EY7G2riYmRO1lyyy+l8s89wQmAqX2CUeImiE7O5sVK1Zw6NAhAgMDmTVrFmFhYRVq68jiNwhP/TsF9UPwfige/+Y9qjZYIWooW2bx7bhp00ZbbtQVojYqLS1l8+bNrFu3DqUUQ4cOpXfv3ncuIHgLl/OKaVjPnTYhTUjLvZfg+z8AL187RC1EzWTLEF/ZBb5cgO7AXd7IIUTNd/z4cYxGI5mZmXTs2JHhw4fj61uBhGI2s/I/f2LdOfh/L71K/d5PEtrnqaoPWIgazpYhvh1YrkEpLEN7J4CH7RmUEM7kypUrJCQkkJqaSsOGDbn//vtp27ZthdrSOWdRS3/FsJNJNA8ciaeriyxVJMRt2DLE17I6AhHC2ZjNZrZt20ZSUhImk4mBAwfSr1+/uysgaFVSauL7z99n/IW/4alMMOZ9OnSfI8lJiHLYMsTnCTwF9MNyJrUB+ERrXWjn2IRwmDNnzhAXF8fFixdp06YNI0eOpFElylm4ndvOtLQ3OdegC81mLwD/1lUYrRC1ky1/Cv4HuIJlHT6A6cAXwGR7BSWEo+Tl5ZGYmEhKSgo+Pj5MnjyZjh073t0SRdfaKirls59WMzl2AE1Ce6OnfkWz9iPB5e4nVAhRF9mSoNprrcuWzUhSSu22V0BCOILWmh07drBq1SqKi4vp27cvAwcOtL2A4M3ys9BLX+bRgz+yOmAJI2MGoDqOqdqghajlbElQu5RSvbXWWwCUUr2AjfYNS4jqc+7cOYxGI2fPnqVFixaMHj367goIllFcamb/moVEpbxO/fxM8u55gZH9+1RxxELUDbYkqF7ATKXUaevrUOCAUmovoLXWEXaLTgg7KiwsZPXq1Wzfvp169epx33330aVLlwoN5wGgNSc+nUnUhZ8o9O+E54zF1AuS/x5CVJQtCWqE3aMQohpprdmzZw8rV64kPz+fnj17MmjQoLsrIFiG2azJKSihYT13Wrdqw8mAZwgb/xq4VnB4UAgB2DbN/JRSKhLob920Xmst16BEjZSeno7RaOTUqVMEBwczY8YMgoKCKt5gXibJ/3yMH9QQ/vDcE7jFvkFYlUUrRN1myzTz54BHgSXWTV8qpeZprT8s5zAhnEpxcfH1AoLu7u6MGTOGbt26VXg4L6+wBO8jS1HLXyG6IBdDp164SkkMIaqULUN8DwO9tNZ5AEqpd4DN/DztXAinpbXmwIEDxMfHk5ubS9euXRk6dGjFCghanT19nGOfPcYAvR2adcNl1kd0bxJehVELIcC2BKUAU5nXJus2IZxaVlYWRqORY8eO0aRJEyZNmkTz5s0r3F6pyYyrwYWg84k0Zjdne/yW4BEvgeHuV5YQQtyZLf+zPgO2KqV+wJKY7gX+bdeohKiEkpISNmzYwMaNGzEYDIwYMYIePXrcfQHBMuLXbmTVlq28/vyz1OvxCC7thhPcsEUVRi2EuJktkyTeU0qtwbLUEcAcrfUuu0YlRAUdOXKE5cuXc/nyZbp06cKwYcNo0KBBxRs0lcCmDxi27m26qgAKip6gnoc3SHISwu7uZmxCAWZkeE84oezsbOLj4zl48CABAQHMnDmTli0rvs6x2az5dOFiJqS9Q0DeEVw63UvjkX+BBhW/diWEuDu2zOJ7Dcu6e99jSU6fKaUWaa3/aO/ghLgTk8l0vYAgwJAhQ+jTp0+FCgiW5ZJxiEcOPcZVN3+Y9jV0GF0V4Qoh7oItZ1DTga7XVi9XSr0N7AQkQQmHOnHiBEajkYyMDDp06MDw4cPx8/OrcHsnM/L45w8JPDdlBEGNO8CYv+HTeTx4SpVbIRzBlgR1EvAErpXX8ACO2SsgIe7kypUrrFy5kr179+Ln58f06dNp165d5RrNPUfj5S/yh7Mr2XN0OUHde+ISPatqAhZCVIgtCaoI2KeUWomlHtQwYINS6gMArfWzdoxPiOvMZjPbt28nKSmJ0tJSBgwYQL9+/XBzc6twmyv2puGS/Bmx5+fibS6hdNBviY7qWoVRCyEqypYE9YP1cc0a+4QixO2lpaURFxfHhQsXaN26NSNHjsTf379yjZpK6ZwwnZArezC1jMEw9n1cG7WqkniFEJVnyzTzBdURiBC3kp+fT2JiIrt27aJBgwaVKiAIUFhi4pNVBxnSOZiIED+adB+Hye9pDJFTpPy6EE5GboEXTklrza5du0hMTKSoqIg+ffowcOBAPDw8KtWu6UgiU7Y8zba83xMRcj9uMb+uooiFEFVNEpRwOufPn8doNJKWlkaLFi0YNWoUjRs3rnB7JzLyWLYphaeL51MvdTGejdpyX882VRixEMIeJEEJp1FYWEhSUhLbt2/H29ub8ePHExERUfECglbn1y9gZsofwVACMb/F0O95cK3cmZgQwv5um6CUUj9hmbV3S1rrcXaJSNQ5Wmv27t1LQkICeXl59OjRg8GDB1e4gKDWmoT9F/FwdSGmfWN6BxkozeiCGv8hBFZyOroQotqUdwb1rvXrBKAp8KX19XQs90bZRCllAJKBs1rrMRWIUdRily5dwmg0cvLkSYKDg7n//vtp1qxZpdo0lxZz4ac3KaoXTEz73+LS81Hcez4KlVgsVghR/W6boLTWawGUUm9qrQeUeesnpdS6u/iM54ADgE/FQhS1UXFxMevWrWPz5s24u7szevRounXrVuEVx4tKTXy15TQzgi/gYXyBWYUHMHWabXlTEpMQNZIt16AClVKttNbHAZRSLYFAWxpXSoUAo4E/AS9WOEpRa2itOXToECtWrCAnJ4eoqCiGDh1KvXr1KtXurqNncFnxCu6uK8GnGUxfiKH9iCqKWgjhCLYkqBeANUqp49bXYcDjNrb/N+AVoBL1DkRtkZWVxYoVKzhy5AiNGzdmzpw5hIaGVry9vGL2ncuhf9tAerscppfrSlTPx2DI/4KH/JMToqaz5UbdFUqptkAH66aDWuuiOx2nlBoDpGutdyilYsrZ7zHgMaBSv6yE8yotLWXDhg1s2LABg8FAbGwsvXr1qlQBQYC/LllPwfFNdH/1VbzbxaKeToYAmT4uRG2htL71RD2l1ITyDtRaLym3YaX+DDwIlGJZbNYHWKK1fuB2x0RHR+vk5OQ7xSxqkLIFBDt37kxsbGylCggev3QVPy83Gh1ZhHnF79DmUgwv7gMvv6oLWghRrZRSO7TW0TdvL+8Mamw572mg3ASltX4VeNX64THAy+UlJ1G75OTkEB8fz4EDB/D39+fBBx+kVavKrXOXk1/CUx8u5mOf/9Do6g5cQvvC2L9LchKilipvFt8cpZQLMElr/V01xiRqMJPJxJYtW1i7di1aawYNGkTfvn1xda34PeHnsgto5ueFL1dY5v4qLsUGGPM+dJstM/SEqMXK/a2htTYrpZ4GKpWgtNZrkFXQa72TJ09iNBq5dOkS7dq1Y8SIETRs2LBSbf60+xx/WbiKfzw1ji4hjXAd+zdo2d8yU08IUavZ8mftSqXUy8BCIO/aRq11lt2iEjXK1atXWblyJXv27MHPz49p06bRvn37SrVZUGzCSxUTe+4fjPL4B8V5wcBgiJxaNUELIZyeLQnqIevXX5XZpgEpnFPHmc1mkpOTWb16NSUlJfTv35/+/ftXqoAgwKtL9lLv7EZ+p+fikXUcus3EK1SKCApR19gyzbxldQQiapa0tDSMRiPnz5+nVatWjBw5koCAgAq3p7W+vijsnCtzaZf5BbpRK5j1E7QccIejhRC10R0TlFLKDXgSuPZbYg0wV2tdYse4hJPKz89n1apV7Ny5kwYNGjBp0iQ6depUqRXHs/KKeebrHczqE0Zs5yDahXeDZv6omN+Am1fVBS+EqFFsGeL7BHAD/mF9/aB12yP2Cko4n7IFBAsLC+nduzcxMTGVLiAI0KDoAs9nvIHh2Fjo/DREP3Tng4QQtZ4tCaqH1jqyzOvVSqnd9gpIOJ8LFy4QFxdHWloazZs3Z/To0TRp0qRSbR5Nv8onqw/xduh23Na8SbTZhGo2pYoiFkLUBrYkKJNSqrXW+hiAUqoVYLJvWMIZFBUVkZSUxLZt2/Dy8uLee+8lMjKy0gUEAS6f3M3Mg8/hdvAItB6MGvM+NAyrfNBCiFrDlgT1ayDJulisAloAc+walXAorTWpqakkJCRw9epVunfvzpAhQ/Dyqtz1oJQz2ZzJymdsZDN6+F5Be2XByH9Bl8lQBUlPCFG7lFdR93lgI7AWaAu0x5KgbFosVtRMGRkZGI1GTpw4QVBQENOmTSM4OLhK2k5Ytgj37KOUdv4zru1HoJ7fLauOCyFuq7wzqBDg71hWMd8DbMKSsM4AkqBqmZKSEtatW8emTZtwd3dn1KhRdO/evdIrjicdTCcqwEzDDW/yysUvMfm3w4AJcJHkJIQoV3lr8b0MoJRyB6KBvlhu2v2XUipba92pekIU9nRzAcHIyEiGDRtW6QKCAOcu57Psy/fp5fk1mK9CvxcxDHwFDJW7kVcIUTfYcg3KC0upDF/r4xyw155Biepx+fJlVqxYweHDh2ncuDGzZ8+mRYsWlWrTbNbsOnOZ7i0a0cx8nnfd5qKbdINxf4cm4VUUuRCiLijvGtQ8IBy4AmzFMsT3ntb6cjXFJuyktLSUTZs2sX79elxcXBg2bBi9evXCYDBUuu356w6xdeV3vPLsC7Rt0ho1ZzkqJBpcKt+2EKJuKe8MKhTwAI4AZ4E0ILsaYhJ2dOzYMYxGI1lZWYSHhxMbG4uPj0+l2iwoNpFbWEKTy7uYk/ocj7gdQpvHAxEQ2qtK4hZC1D3lXYMaoSw3vIRjuf70EtBZKZUFbNZav15NMYoqkJubS3x8PPv376dRo0Y88MADtG7dutLtaq2Z80k8jxR9QZN8Iwbf5jD9W1RQRBVELYSoy+5UD0oDqUqpbCDH+hgD9AQkQdUAJpOJrVu3smbNmiorIAiQnltIYAMPlDbz7+Lf4F2QBn2ehphXwaN+FUUvhKjLyrsG9SyWM6d7gBIsU8w3A/ORSRI1wqlTpzAajaSnp9O2bVtGjhxZ6QKCADtPX+aVef/llWkjiO0cRL3Rf4RGraBp5yqIWgghLMr7MzoMWAy8oLU+Xz3hiKpw9epVEhMT2b17N76+vkydOpX27dtXaokirTVZecX4u5cSeejvxLt9wJVcF2AWdBpXdcELIYRVedegXqzOQETlmc1mduzYwapVqygpKaFfv34MGDCg0gUEAX73w17cDi/jDfcvMeSehcj78YsYVQVRCyHErVXuQoRwGmfPniUuLo7z58/TsmVLRo0aVakCggC5hSV4uRlwM7jwTN6HBBV+h/YJh4n/hhZ9qihyIYS4NUlQNVxBQQGrVq1ix44d1K9fn4kTJxIeHl7pFccv5BQy5YMEHhrQjtkDOxDUewq0i0ZFPwwG+WcjhLA/+U1TQ2mt2b17NytXrqSgoIBevXoRExODp6dnpdrNyS/B19NAk+OLMbq8Rn7Og8Dvoe2wqglcCCFsJAmqBrp48SJGo5HTp08TEhLC6NGjadq0aaXbnb/hBOtXL+NfjRfjeiGF+sHR1O82tgoiFkKIuycJqgYpKipizZo1bN26FU9PT8aNG0dUVFSlhvNKTGZKTGa83V0Zm/stD5nfxny1Kdw3z1KnqZKrmQshREVJgqoBtNbs37+f+Ph4rly5Qrdu3RgyZAje3t6Vareo1MS0DxLo06IBr0zsR2DXUeBpwuWe5+VmWyGEw0mCcnKZmZkYjUaOHz9O06ZNmTJlCiEhIZVqM7ewBB9XjUfyfL7Of4vLVwYD/SAo0vIQQggnIAnKSZWUlLB+/Xo2btyIm5sbI0eOJDo6utIFBONTz5GwaC5/9v0v7rkn8Wo5EK/YF6ooaiGEqDqSoJzQtQKC2dnZREREMGzYMOrXr/iQm9aawhIzXu4G+p3/nOHqb5S6d4AZ30ObIVDJKelCCGEPkqCcSHZ2NitWrODQoUMEBgYya9YswsLCKt3ue/O/4IrJnTcem0a9nrMgsCWuEVOkRpMQwqlJgnICpaWlbN68mXXr1qGUYujQofTu3btSBQSLSk14pO+FpLd46Uw8xxsPxWyeiotvMERNr8LohRDCPiRBOdjx48cxGo1kZmbSsWNHhg8fjq+vb6XaPJm6lVNL/oeB5m3g6QtDXqdVr8fBRYbyhBA1hyQoB8nNzSUhIYF9+/bRsGFDZsyYQZs2bSrVZnGpGXdXF4Iz1tGYfVzo9iJNY5+3JCkhhKhhJEFVM7PZfL2AoMlkIiYmhnvuuadyBQTP7+HI4tf5vqgHL7/wG9z6PoVbr0fx9vKrsriFEKK6SYKqRqdPn8ZoNHLx4kXatGnDyJEjadSoUYXbO7hzLe0OfoLL4eWEudYnMrg7JSaNq3u9KoxaCCEcQxJUNcjLyyMxMZGUlBR8fHyYMmUKHTp0qNQSRenfPkOHg/+h2M0H95jf4tbrcUbKGZMQohaRBGVHWuvrBQSLi4u55557GDBgAO7u7nfdltlkZv4Xn+Ea2pPZg7sQ2GUIe2lIq1HP4+5T8bMwIYRwVnZLUEopT2Ad4GH9nMVa69ft9XnO5ty5cxiNRs6ePUtYWBijRo0iMDDwrtpIOZPNkQs5TK6/F5f1f+WRcztZrV4CuqDCx9MlfLxdYhdCCGdgzzOoImCw1vqqUsoN2KCUWq613mLHz3S4goICVq9eTXJyMvXq1eO+++6jS5cuNg/nncnKp3kjb9Caw/Hz6J62AEiDhmEw9u8MjpR7mIQQdYPdEpTWWgNXrS/drA9tr89zNK01e/bsYeXKleTn59OzZ08GDRp0VwUEv912mt8tSSHp10MJ9fdmPEkYAhtA/08h/D6pZCuEqFPs+htPKWUAdgBtgI+11ltvsc9jwGMAoaGh9gzHbtLT0zEajZw6dYrg4GBmzJhBUFDQHY+7UljCv9YdJ6ZDY7r5mxmVtYCxvgswla4GQnGf/iV4N5K18oQQdZJdE5TW2gREKaX8gB+UUp211qk37TMPmAcQHR1do86wiouLrxcQ9PDwYOzYsXTt2vWOw3mFJSY83QwYXBRrtmwj9uRaSF+GT2kBtBsJriWWHev5V0MvhBDCOVXLmJHWOlsptQYYAaTeYXenp7XmwIEDxMfHk5ubS9euXRk6dKhNBQRfW5rKvnO5LH6iD94lOSzlBdQFIGIq9H0aGne0fweEEKIGsOcsvkCgxJqcvIChwDv2+rzqkpmZyfLlyzl27BhNmzZl0qRJNG/e/Lb7a61JPnWZ7qENccHMCNedjHHbgcncG9d6/qjx/4Cw/uBz5yFBIYSoS+x5BhUELLBeh3IBvtNaL7Pj59lVSUkJGzZsYOPGjRgMBoYPH07Pnj3vWEBw7eFLPPnZer7vfZJOp7+kb9Zx8AuF0jwwNICIKdXUAyGEqFnsOYtvD9DVXu1XpyNHjmA0GsnOzqZLly4MGzaMBg0a3HJfs1nzw66z1PMwMKJzEP3dDrK7wfO4p+RCcDRMfg06jJUZeUIIcQfyW7Ic2dnZxMfHc/DgQQICApg5cyYtW7a85b5ms8bFRaHQbFsXh7+3GyM6P4ShaWcM7YZC7yehec9q7oEQQtRckqBuwWQysXnzZtauXYtSiiFDhtCnT5/bFhD8766zfLJqHz8NuoR78lzeydmN9h8EPGSZJj75s+rtgBBC1AKSoG5y4sQJjEYjGRkZdOjQgREjRtyygOC+czk08/WiYT13Is8vYnH+e7j/lAMB7WH0e6jIaQ6IXgghag9JUFZXrlwhISGB1NRU/Pz8mD59Ou3atbvlvmlZefzpo38yYOBwnhgeRcsmDaFtP+j5CLQaJDfWCiFEFajzCcpsNrNt2zaSkpIwmUwMGDCAfv364ebmdsN+X2w5RUH2JR7z3UpI8ny+dj9KgU8jIAq6z7I8hBBCVJk6naDOnDlDXFwcFy9epHXr1owcORJ//59XbzibXUCwnxeUFtNxyytE5KwGXQzNe8GAX+PVabzjghdCiFquTiao/Px8EhMT2bVrFw0aNGDy5Ml07NjxhiWKFm9M5ce4n/jTy8/RvJE33fxLcGk7E7rPgaadHRi9EELUDXUqQWmt2blzJ6tWraKoqIi+ffsycOBA3N3dyc4v5qNVR5gcdJ72aUuYmLqE+zxKuaoeAbxxeeB7ubYkhBDVqM4kqPPnzxMXF8fZs2dp0aIFo0aNwqNBQ87kFNE60B2v89uZtuNx2nAG3OujIqdh6D4L34bWIoOSnIQQolrV+gRVWFh4vYCgt7c39957L5GRkSitefW9jzF7+vLO0zPx8GtKq2aNofvL0HkSeNR3dOhCCFGn1doEpbVm7969JCQkkJ+fT3R0NOk+7Xh/TSqf5SSiUr7gz1dPcrnJvcBM8G+Ny2OrHR22EEIIq1qZoK4VEEw9cZ40r1a88UAfOrQK5fSCx5iZvQiXJLNlBfHB/0vDDmMcHa4QQohbqFUJ6mp+IfOWruX84RQCPGFA9w6c2B5HVukAAELbd4PgYOj6APi3dnC0QgghylNrEpTWmn99/gWfnA7kpcA8HvHfjWHnn8FVoTwfAYKg9xOODlMIIYSNak2CUkoxrmdrnsx5BM8rmaCCIeY3lrMl3xBHhyeEEOIu1ZoEBdC6+yA4Nwbaj4Q2w6TmkhBC1GC16ze4UjDuA0dHIYQQogqUX69cCCGEcBBJUEIIIZySJCghhBBOSRKUEEIIpyQJSgghhFOSBCWEEMIpSYISQgjhlCRBCSGEcEqSoIQQQjglpbV2dAzXKaUuAacq2UwAkFEF4TgT6ZPzq239AelTTVEb+tRCax1480anSlBVQSmVrLWOdnQcVUn65PxqW39A+lRT1MY+XSNDfEIIIZySJCghhBBOqTYmqHmODsAOpE/Or7b1B6RPNUVt7BNQC69BCSGEqB1q4xmUEEKIWkASlBBCCKfk9AlKKTVfKZWulEotsy1SKbVZKbVXKfWTUsrHuj1MKVWglEqxPv5Z5pju1v2PKqU+UEopR/THGovNfbK+F2F9b5/1fU/r9hrZJ6XUjDI/oxSllFkpFWV9r6b2yU0ptcC6/YBS6tUyxzhFn+6yP+5Kqc+s23crpWLKHOMU/bHG0lwplWT9nu9TSj1n3d5IKbVSKXXE+rVhmWNetcZ+SCk1vMx2p+jX3fZJKeVv3f+qUuqjm9pyij5VmNbaqR/AAKAbkFpm23ZgoPX5Q8Cb1udhZfe7qZ1tQB9AAcuBkTWkT67AHiDS+tofMNTkPt10XBfgeC34Od0PfGt97g2cBMKcqU932Z9fAZ9ZnzcGdgAuztQfayxBQDfr8wbAYaAT8BfgN9btvwHesT7vBOwGPICWwDFn+/9UgT7VA/oBTwAf3dSWU/Spog+nP4PSWq8Dsm7a3B5YZ32+EphYXhtKqSDAR2u9WVt+av8BxldxqDa7yz7FAnu01rutx2ZqrU01vE9lTQe+gRr/c9JAPaWUK+AFFAO5ztSnu+xPJ2CV9bh0IBuIdqb+WGM7r7XeaX1+BTgABAP3Agusuy3g5xjvxfKHRJHW+gRwFOjpTP262z5prfO01huAwrLtOFOfKsrpE9RtpALjrM8nA83LvNdSKbVLKbVWKdXfui0YSCuzT5p1mzO5XZ/aAVopFa+U2qmUesW6vSb3qaypWBMUNbtPi4E84DxwGnhXa52F8/fpdv3ZDdyrlHJVSrUEulvfc9r+KKXCgK7AVqCJ1vo8WH7hYzkLBEusZ8ocdi1+p+yXjX26Hafs092oqQnqIeBXSqkdWE6Bi63bzwOhWuuuwIvA19Yx9VuNuzrb/Prb9ckVy+n7DOvX+5RSQ6jZfQJAKdULyNdaX7smUpP71BMwAc2wDB29pJRqhfP36Xb9mY/lF1oy8DdgE1CKk/ZHKVUf+B54XmudW96ut9imy9nuMHfRp9s2cYttDv9Z3Q1XRwdQEVrrg1iGvlBKtQNGW7cXAUXW5zuUUsewnIGkASFlmggBzlVnzHdyuz5hiX2t1jrD+p4Ry3WEL6m5fbpmGj+fPUHN/jndD6zQWpcA6UqpjUA0sB4n7lM5/5dKgReu7aeU2gQcAS7jZP1RSrlh+UX+ldZ6iXXzRaVUkNb6vHWoK926PY0bz+Svxe9U//busk+341R9qogaeQallGps/eoC/A/wT+vrQKWUwfq8FdAWywX488AVpVRv6yyWmcBShwR/G7frExAPRCilvK3XNwYC+2t4n65tmwx8e21bDe/TaWCwsqgH9AYOOnufyvm/5G3tB0qpYUCp1trp/t1ZY/g3cEBr/V6Zt34EZlmfz+LnGH8EpimlPKxDl22Bbc7Urwr06ZacqU8V5uhZGnd6YPkL+zxQguUvgoeB57DMbDkMvM3PK2JMBPZhGT/fCYwt0040lvH2Y8BH145x9j5Z93/A2q9U4C+1pE8xwJZbtFMj+wTUBxZZf077gV87W5/usj9hwCEsF+gTsZRDcKr+WGPph2XYag+QYn2MwjLbdRWWs75VQKMyx/zOGvshysxqc5Z+VbBPJ7FMgLlq/dl2cqY+VfQhSx0JIYRwSjVyiE8IIUTtJwlKCCGEU5IEJYQQwilJghJCCOGUJEEJIYRwSpKghLAj631RG5RSI8tsm6KUWuHIuISoCWSauRB2ppTqjOUeqa6AAct9LSO01scq0JZBa22q2giFcE6SoISoBkqpv2BZTLae9WsLLKVGXIE3tNZLrQuDfmHdB+BprfUmZanF9DqWm2yjtNadqjd6IRxDEpQQ1cC6bNBOLIuxLgP2aa2/VEr5YanZ0xXL6gFmrXWhUqot8I3WOtqaoOKAztpSIkKIOqFGLhYrRE2jtc5TSi3EshTNFGCsUupl69ueQCiWhTw/UpbqwiYsCx1fs02Sk6hrJEEJUX3M1ocCJmqtD5V9Uyn1BnARiMQygalsAbq8aopRCKchs/iEqH7xwDPWFaZRSnW1bvcFzmutzcCDWCZUCFFnSYISovq9CbgBe5RSqdbXAP8AZimltmAZ3pOzJlGnySQJIYQQTknOoIQQQjglSVBCCCGckiQoIYQQTkkSlBBCCKckCUoIIYRTkgQlhBDCKUmCEkII4ZT+PxzJqcH0uZb3AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results1.plot(label='model', color='gray')\n", - "plot_estimates()\n", - "decorate(title='Constant Growth Model')" - ] - }, - { - "cell_type": "markdown", - "id": "exposed-witness", - "metadata": {}, - "source": [ - "It might not be obvious that using functions and `System` objects is a\n", - "big improvement, and for a simple model that we run only once, maybe\n", - "it's not. But as we work with more complex models, and when we run many simulations with different parameters, we'll see that the organization of the code makes a big difference.\n", - "\n", - "Now let's see if we can improve the model." - ] - }, - { - "cell_type": "markdown", - "id": "geographic-hormone", - "metadata": {}, - "source": [ - "## Proportional growth model\n", - "\n", - "The biggest problem with the constant growth model is that it doesn't\n", - "make any sense. It is hard to imagine how people all over the world\n", - "could conspire to keep population growth constant from year to year.\n", - "\n", - "On the other hand, if some fraction of the population dies each year,\n", - "and some fraction gives birth, we can compute the net change in the\n", - "population like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "laughing-wesley", - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation2(system):\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " births = system.birth_rate * results[t]\n", - " deaths = system.death_rate * results[t]\n", - " results[t+1] = results[t] + births - deaths\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "id": "educated-portugal", - "metadata": {}, - "source": [ - "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", - "\n", - "For the death rate, I'll use 7.7 deaths per 1000 people, which was roughly the global death rate in 2020 (see ).\n", - "I chose the birth rate by hand to fit the data." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "wired-brief", - "metadata": {}, - "outputs": [], - "source": [ - "system.death_rate = 7.7 / 1000\n", - "system.birth_rate = 25 / 1000" - ] - }, - { - "cell_type": "markdown", - "id": "sufficient-contest", - "metadata": {}, - "source": [ - "Then I ran the simulation and plotted the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "looking-trace", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results2 = run_simulation2(system)\n", - "results2.plot(label='model', color='gray')\n", - "plot_estimates()\n", - "decorate(title='Proportional Growth Model')" - ] - }, - { - "cell_type": "markdown", - "id": "suited-costs", - "metadata": {}, - "source": [ - "The proportional model fits\n", - "the data well from 1950 to 1965, but not so well after that. Overall,\n", - "the **quality of fit** is not as good as the constant growth model,\n", - "which is surprising, because it seems like the proportional model is\n", - "more realistic.\n", - "\n", - "In the next chapter we'll try one more time to find a model that makes\n", - "sense and fits the data. But first, I want to make a few more\n", - "improvements to the code." - ] - }, - { - "cell_type": "markdown", - "id": "appropriate-checkout", - "metadata": {}, - "source": [ - "## Factoring out the update function\n", - "\n", - "`run_simulation1` and `run_simulation2` are nearly identical except for the body of the `for` loop, where we compute the population for the next year.\n", - "\n", - "Rather than repeat identical code, we can separate the things that\n", - "change from the things that don't. First, I'll pull out the update code from `run_simulation2` and make it a function:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "handmade-permit", - "metadata": {}, - "outputs": [], - "source": [ - "def growth_func1(pop, t, system):\n", - " births = system.birth_rate * pop\n", - " deaths = system.death_rate * pop\n", - " return births - deaths" - ] - }, - { - "cell_type": "markdown", - "id": "fabulous-bankruptcy", - "metadata": {}, - "source": [ - "This function takes as arguments the current population, current year,\n", - "and a `System` object; it returns the net population growth during the current year.\n", - "\n", - "This update function does not use `t`, so we could leave it out. But we will see other functions that need it, and it is convenient if they all take the same parameters, used or not.\n", - "\n", - "Now we can write a function that runs any model:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "civilian-accused", - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, growth_func):\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", - " results[t+1] = results[t] + growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "id": "failing-assist", - "metadata": {}, - "source": [ - "This function demonstrates a feature we have not seen before: it takes a\n", - "function as a parameter! When we call `run_simulation`, the second\n", - "parameter is a function, like `growth_func1`, that computes the\n", - "population for the next year.\n", - "\n", - "Here's how we call it:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "wicked-seeking", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, growth_func1)" - ] - }, - { - "cell_type": "markdown", - "id": "simple-camel", - "metadata": {}, - "source": [ - "Passing a function as an argument is the same as passing any other\n", - "value. The argument, which is `growth_func1` in this example, gets\n", - "assigned to the parameter, which is called `growth_func`. Inside\n", - "`run_simulation`, we can run `growth_func` just like any other function.\n", - "\n", - "Each time through the loop, `run_simulation` calls `growth_func1` to compute net growth, and uses it to compute the population during the next year." - ] - }, - { - "cell_type": "markdown", - "id": "spectacular-paradise", - "metadata": {}, - "source": [ - "## Combining birth and death\n", - "\n", - "We can simplify the code slightly by combining births and deaths to compute the net growth rate. \n", - "Instead of two parameters, `birth_rate` and `death_rate`, we can write the update function in terms of a single parameter that represents the difference:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "impressive-model", - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = system.birth_rate - system.death_rate" - ] - }, - { - "cell_type": "markdown", - "id": "modern-uncertainty", - "metadata": {}, - "source": [ - "The name of this parameter, `alpha`, is the conventional name for a\n", - "proportional growth rate.\n", - "\n", - "Here's the modified version of `growth_func1`:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "familiar-helena", - "metadata": {}, - "outputs": [], - "source": [ - "def growth_func2(pop, t, system):\n", - " return system.alpha * pop" - ] - }, - { - "cell_type": "markdown", - "id": "understanding-typing", - "metadata": {}, - "source": [ - "And here's how we run it:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "independent-effectiveness", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, growth_func2)" - ] - }, - { - "cell_type": "markdown", - "id": "everyday-delicious", - "metadata": {}, - "source": [ - "The results are the same as the previous versions, but now the code is organized in a way that makes it easy to explore other models." - ] - }, - { - "cell_type": "markdown", - "id": "attractive-steps", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this chapter, we wrapped the code from the previous chapter in functions and used a `System` object to store the parameters of the system.\n", - "\n", - "We explored a new model of population growth, where the number of births and deaths is proportional to the current population. This model seems more realistic, but it turns out not to fit the data particularly well.\n", - "\n", - "In the next chapter, we'll try one more model, which is based on the assumption that the population can't keep growing forever.\n", - "But first, you might want to work on some exercises." - ] - }, - { - "cell_type": "markdown", - "id": "looking-douglas", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "compliant-preserve", - "metadata": {}, - "source": [ - "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", - "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use.\n", - "\n", - "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "minus-recommendation", - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def growth_func3(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " if t < 1980:\n", - " return system.alpha1 * pop\n", - " else:\n", - " return system.alpha2 * pop" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "headed-amsterdam", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "system.alpha1 = 19 / 1000\n", - "system.alpha2 = 15 / 1000\n", - "\n", - "results3 = run_simulation(system, growth_func3)\n", - "results3.plot(label='model', color='gray')\n", - "plot_estimates()\n", - "decorate(title='Proportional growth, parameter changes over time')" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "preliminary-carnival", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# Using two parameters, we can make the model fit the data better.\n", - "# But it still seems like the shape of the function is not right." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "median-policy", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap07.ipynb b/jupyter/chap07.ipynb deleted file mode 100644 index e331b338..00000000 --- a/jupyter/chap07.ipynb +++ /dev/null @@ -1,915 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "regular-director", - "metadata": {}, - "source": [ - "# Chapter 7" - ] - }, - { - "cell_type": "markdown", - "id": "disciplinary-occasion", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "similar-wellington", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "indie-scoop", - "metadata": {}, - "source": [ - "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", - "\n", - "There are a few things we could try to improve the model:\n", - "\n", - "- Maybe net growth depends on the current population, but the\n", - " relationship is quadratic, not linear.\n", - "\n", - "- Maybe the net growth rate varies over time.\n", - "\n", - "In this chapter, we'll explore the first option.\n", - "In the exercises, you will have a chance to try the second. " - ] - }, - { - "cell_type": "markdown", - "id": "qualified-houston", - "metadata": {}, - "source": [ - "Here's the code that reads the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "major-arkansas", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "intense-columbus", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "wound-necklace", - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9" - ] - }, - { - "cell_type": "markdown", - "id": "intended-matrix", - "metadata": {}, - "source": [ - "And here are the functions from the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "former-accuracy", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(system, growth_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " growth_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", - " results[t+1] = results[t] + growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "duplicate-insert", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_estimates():\n", - " census.plot(style=':', label='US Census')\n", - " un.plot(style='--', label='UN DESA')\n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)')" - ] - }, - { - "cell_type": "markdown", - "id": "champion-retreat", - "metadata": {}, - "source": [ - "## Quadratic growth\n", - "\n", - "It makes sense that net growth should depend on the current population, but maybe it's not a linear relationship, like this:\n", - "\n", - "```\n", - "net_growth = system.alpha * pop\n", - "```\n", - "\n", - "Maybe it's a quadratic relationship, like this:\n", - "\n", - "```\n", - "net_growth = system.alpha * pop + system.beta * pop**2\n", - "```\n", - "\n", - "We can test that conjecture with a new update function:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "sized-hawaiian", - "metadata": {}, - "outputs": [], - "source": [ - "def growth_func_quad(pop, t, system):\n", - " return system.alpha * pop + system.beta * pop**2" - ] - }, - { - "cell_type": "markdown", - "id": "amateur-strand", - "metadata": {}, - "source": [ - "Here's the `System` object we'll use, initialized with `t_0`, `p_0`, and `t_end`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "interstate-canal", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "t_0 = census.index[0]\n", - "p_0 = census[t_0]\n", - "t_end = census.index[-1]\n", - "\n", - "system = System(t_0=t_0,\n", - " p_0=p_0,\n", - " t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "id": "acting-transportation", - "metadata": {}, - "source": [ - "Now we have to add the parameters `alpha` and `beta` .\n", - "I chose the following values by trial and error; we'll see better ways to do it later." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "banned-dallas", - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = 25 / 1000\n", - "system.beta = -1.8 / 1000" - ] - }, - { - "cell_type": "markdown", - "id": "supreme-wellington", - "metadata": {}, - "source": [ - "And here's how we run it:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "positive-scheme", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, growth_func_quad)" - ] - }, - { - "cell_type": "markdown", - "id": "satisfied-density", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "flush-fellowship", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results.plot(color='gray', label='model')\n", - "plot_estimates()\n", - "decorate(title='Quadratic Growth Model')" - ] - }, - { - "cell_type": "markdown", - "id": "organized-combining", - "metadata": {}, - "source": [ - "The model fits the data well over the whole range, with just a bit of space between them in the 1960s.\n", - "\n", - "Of course, we should expect the quadratic model to fit better than the\n", - "constant and proportional models because it has two parameters we can\n", - "choose, where the other models have only one. In general, the more\n", - "parameters you have to play with, the better you should expect the model\n", - "to fit.\n", - "\n", - "But fitting the data is not the only reason to think the quadratic model\n", - "might be a good choice. It also makes sense; that is, there is a\n", - "legitimate reason to expect the relationship between growth and\n", - "population to have this form.\n", - "\n", - "To understand it, let's look at net growth as a function of population." - ] - }, - { - "cell_type": "markdown", - "id": "powerful-century", - "metadata": {}, - "source": [ - "## Net growth\n", - "\n", - "Let's plot the relationship between growth and population in the quadratic model.\n", - "\n", - "I'll use `linspace` to make an array of 101 populations from 0 to 15 billion." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "excited-catch", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linspace\n", - "\n", - "pop_array = linspace(0, 15, 101)" - ] - }, - { - "cell_type": "markdown", - "id": "tracked-guide", - "metadata": {}, - "source": [ - "Now I'll use the quadratic model to compute net growth for each population." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "classical-badge", - "metadata": {}, - "outputs": [], - "source": [ - "growth_array = (system.alpha * pop_array + \n", - " system.beta * pop_array**2)" - ] - }, - { - "cell_type": "markdown", - "id": "quantitative-differential", - "metadata": {}, - "source": [ - "To plot the growth rate versus population, we can import the `plot` function from Matplotlib:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "interim-consent", - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.pyplot import plot" - ] - }, - { - "cell_type": "markdown", - "id": "published-average", - "metadata": {}, - "source": [ - "And use it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "received-crossing", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(pop_array, growth_array, label='growth')\n", - "\n", - "decorate(xlabel='Population (billions)',\n", - " ylabel='Net growth (billions)',\n", - " title='Growth vs. Population')" - ] - }, - { - "cell_type": "markdown", - "id": "plastic-wisdom", - "metadata": {}, - "source": [ - "Note that the x-axis is not time, as in the previous figures, but population. We can divide this curve into four regimes of behavior:\n", - "\n", - "- When the population is less than 3-4 billion, net growth is\n", - " proportional to population, as in the proportional model. In this\n", - " regime, the population grows slowly because the population is small.\n", - "\n", - "- Between 4 billion and 10 billion, the population grows quickly\n", - " because there are a lot of people.\n", - "\n", - "- Above 10 billion, population grows more slowly; this behavior models\n", - " the effect of resource limitations that decrease birth rates or\n", - " increase death rates.\n", - "\n", - "- Above 14 billion, resources are so limited that the death rate\n", - " exceeds the birth rate and net growth becomes negative.\n", - "\n", - "Just below 14 billion, there is a point where net growth is 0, which\n", - "means that the population does not change. At this point, the birth and death rates are equal, so the population is in **equilibrium**." - ] - }, - { - "cell_type": "markdown", - "id": "relevant-detection", - "metadata": {}, - "source": [ - "## Equilibrium\n", - "\n", - "To find the equilibrium point, we can find the roots, or zeros, of this equation: \n", - "\n", - "$$\\Delta p = \\alpha p + \\beta p^2$$ \n", - "\n", - "where $\\Delta p$ is net\n", - "population growth, $p$ is current population, and $\\alpha$ and $\\beta$\n", - "are the parameters of the model. We can rewrite the right hand side like\n", - "this: \n", - "\n", - "$$\\Delta p = p (\\alpha + \\beta p)$$ \n", - "\n", - "which is $0$ when $p=0$ or $p=-\\alpha/\\beta$.\n", - "We can use the parameters of the system to compute the second equilibrium point:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "lightweight-entrepreneur", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13.88888888888889" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "id": "stuck-flood", - "metadata": {}, - "source": [ - "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", - "\n", - "In the context of population modeling, the quadratic model is more\n", - "conventionally written like this: \n", - "\n", - "$$\\Delta p = r p (1 - p / K)$$ \n", - "\n", - "This is the same model; it's just a different way to **parameterize** it. Given $\\alpha$ and $\\beta$, we can compute $r=\\alpha$ and $K=-\\alpha/\\beta$.\n", - "\n", - "In this version, it is easier to interpret the parameters: $r$ is the\n", - "maximum growth rate, observed when $p$ is small, and $K$ is the\n", - "equilibrium point. $K$ is also called the **carrying capacity**, since\n", - "it indicates the maximum population the environment can sustain." - ] - }, - { - "cell_type": "markdown", - "id": "derived-oliver", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this chapter we implemented a quadratic growth model where net growth depends on the current population and the population squared.\n", - "\n", - "This model fits the data well, and we saw one reason why: it is based on the assumption that there is a limit to the number of people the Earth can support.\n", - "\n", - "In the next chapter we'll use the models we have developed to generate\n", - "predictions.\n", - "But first, I want to warn you about a few things that can go wrong when you write functions." - ] - }, - { - "cell_type": "markdown", - "id": "bibliographic-handy", - "metadata": {}, - "source": [ - "## Dysfunctions\n", - "\n", - "When people learn about functions, there are a few things they often\n", - "find confusing. In this section I present and explain some common\n", - "problems.\n", - "\n", - "As an example, suppose you want a function that takes a\n", - "`System` object, with variables `alpha` and `beta`, and computes the\n", - "carrying capacity, `-alpha/beta`. \n", - "Here's a good solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "lucky-insurance", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "id": "accredited-fitting", - "metadata": {}, - "source": [ - "Now let's see all the ways that can go wrong." - ] - }, - { - "cell_type": "markdown", - "id": "transparent-cotton", - "metadata": {}, - "source": [ - "Dysfunction \\#1: Not using parameters. In the following version, the\n", - "function doesn't take any parameters; when `sys1` appears inside the\n", - "function, it refers to the object we create outside the function." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "aggregate-baker", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "def carrying_capacity():\n", - " K = -sys1.alpha / sys1.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity()\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "id": "otherwise-belarus", - "metadata": {}, - "source": [ - "This version actually works, but it is not as versatile as it could be.\n", - "If there are several `System` objects, this function can only work with one of them, and only if it is named `sys1`." - ] - }, - { - "cell_type": "markdown", - "id": "naughty-crazy", - "metadata": {}, - "source": [ - "Dysfunction \\#2: Clobbering the parameters. When people first learn\n", - "about parameters, they often write functions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "outdoor-petroleum", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "# WRONG\n", - "def carrying_capacity(system):\n", - " system = System(alpha=0.025, beta=-0.0018)\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.03, beta=-0.002)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "id": "afraid-street", - "metadata": {}, - "source": [ - "In this example, we have a `System` object named `sys1` that gets passed\n", - "as an argument to `carrying_capacity`. But when the function runs, it\n", - "ignores the argument and immediately replaces it with a new `System`\n", - "object. As a result, this function always returns the same value, no\n", - "matter what argument is passed.\n", - "\n", - "When you write a function, you generally don't know what the values of\n", - "the parameters will be. Your job is to write a function that works for\n", - "any valid values. If you assign your own values to the parameters, you\n", - "defeat the whole purpose of functions." - ] - }, - { - "cell_type": "markdown", - "id": "expired-detail", - "metadata": {}, - "source": [ - "Dysfunction \\#3: No return value. Here's a version that computes the\n", - "value of `K` but doesn't return it." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "increasing-database", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "# WRONG\n", - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "id": "brutal-chile", - "metadata": {}, - "source": [ - "A function that doesn't have a return statement actually returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause." - ] - }, - { - "cell_type": "markdown", - "id": "meaning-thriller", - "metadata": {}, - "source": [ - "Dysfunction \\#4: Ignoring the return value. Finally, here's a version\n", - "where the function is correct, but the way it's used is not.\n", - "\n", - "```\n", - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys1)\n", - "print(K)\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "opposed-vessel", - "metadata": {}, - "source": [ - "In this example, `carrying_capacity` runs and returns `K`, but the\n", - "return value doesn't get displayed or assigned to a variable.\n", - "If we try to print `K`, we get a `NameError`, because `K` only exists inside the function.\n", - "\n", - "When you call a function that returns a value, you should do something\n", - "with the result." - ] - }, - { - "cell_type": "markdown", - "id": "quarterly-ethiopia", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "painted-samuel", - "metadata": {}, - "source": [ - "**Exercise:** In a previous section, we saw a different way to parameterize the quadratic model:\n", - "\n", - "$$ \\Delta p = r p (1 - p / K) $$\n", - "\n", - "where $r=\\alpha$ and $K=-\\alpha/\\beta$. \n", - "\n", - "Write a version of `growth_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "unauthorized-settle", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.025, 13.88888888888889)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system.r = system.alpha\n", - "system.K = -system.alpha/system.beta\n", - "\n", - "system.r, system.K" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "primary-roman", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def growth_func_quad2(pop, t, system):\n", - " return system.r * pop * (1 - pop / system.K)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "ordinary-solid", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results2 = run_simulation(system, growth_func_quad2)\n", - "results2.plot(color='gray', label='model')\n", - "plot_estimates()\n", - "decorate(title='Quadratic Growth Model, alternate parameters')" - ] - }, - { - "cell_type": "markdown", - "id": "ignored-architect", - "metadata": {}, - "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes.\n", - "\n", - "Hint: If there are too many labels in the legend, you can plot results like this:\n", - "\n", - "```\n", - " results.plot(label='_nolegend')\n", - "```\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "intermediate-kazakhstan", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p0_array = linspace(1, 25, 11)\n", - "\n", - "for p_0 in p0_array:\n", - " system.p_0 = p_0\n", - " results3 = run_simulation(system, growth_func_quad)\n", - " results3.plot(label='_nolegend')\n", - "\n", - "decorate(xlabel='Year',\n", - " ylabel='Population (billions)',\n", - " title='Projections with hypothetical starting populations')" - ] - }, - { - "cell_type": "markdown", - "id": "positive-enforcement", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "Explain the difference between the Pandas and Matplotlib `plot` functions." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "described-funds", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap08.ipynb b/jupyter/chap08.ipynb deleted file mode 100644 index 92c864d6..00000000 --- a/jupyter/chap08.ipynb +++ /dev/null @@ -1,1037 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "external-reward", - "metadata": {}, - "source": [ - "# Chapter 8" - ] - }, - { - "cell_type": "markdown", - "id": "compound-announcement", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "tropical-medicine", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "chicken-emphasis", - "metadata": {}, - "source": [ - "In the previous chapter we developed a quadratic model of world\n", - "population growth from 1950 to 2016. It is a simple model, but it fits\n", - "the data well and the mechanisms it's based on are plausible.\n", - "\n", - "In this chapter we'll use the quadratic model to generate projections of future growth, and compare our results to projections from actual\n", - "demographers." - ] - }, - { - "cell_type": "markdown", - "id": "global-international", - "metadata": {}, - "source": [ - "Here's the code that downloads the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "necessary-factor", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "markdown", - "id": "designed-entrance", - "metadata": {}, - "source": [ - "And here's the code that reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "changed-desktop", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "metallic-inventory", - "metadata": {}, - "outputs": [], - "source": [ - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "id": "further-armstrong", - "metadata": {}, - "source": [ - "## Generating Projections" - ] - }, - { - "cell_type": "markdown", - "id": "concrete-lightning", - "metadata": {}, - "source": [ - "Now let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", - "\n", - "Here's the code we'll need from the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "extraordinary-shade", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(system, growth_func):\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", - " results[t+1] = results[t] + growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "indirect-russia", - "metadata": {}, - "outputs": [], - "source": [ - "def growth_func_quad(pop, t, system):\n", - " return system.alpha * pop + system.beta * pop**2" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "collaborative-schedule", - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "un = table2.un / 1e9" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "comfortable-compression", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "t_0 = census.index[0]\n", - "p_0 = census[t_0]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "working-cleveland", - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0,\n", - " p_0=p_0,\n", - " t_end=2100)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "sophisticated-adult", - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = 25 / 1000\n", - "system.beta = -1.8 / 1000" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "broken-windsor", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, growth_func_quad)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "latest-function", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Quantity
    Time
    209612.462519
    209712.494516
    209812.525875
    209912.556607
    210012.586719
    \n", - "
    " - ], - "text/plain": [ - " Quantity\n", - "Time \n", - "2096 12.462519\n", - "2097 12.494516\n", - "2098 12.525875\n", - "2099 12.556607\n", - "2100 12.586719" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import show\n", - "\n", - "show(results.tail())" - ] - }, - { - "cell_type": "markdown", - "id": "outer-ensemble", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "portable-pottery", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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CZgZgwYN4ujRoxw7dowFCxYAMH78eM6fP8/Fixd57733WLhwIQDTpk379DB57dq15OTkcN999wFw7do1OnToEMArE5G6qLi4mNzcXA4dOsRHH33EtWvXaNCgAd27d2fIkCH07duXtm3bxkUP4TpRoCI50omWRo0afXq/QYMGnz5u0KABZWVl3HHHH77FFb/4qv4AnHM8++yzfO9734tSYhGpby5evMiHH37IwYMHOXbsGKFQiCZNmtCnTx/69OlD7969AztKqk6dKFDxbMyYMbzxxhv83d/9HRs2bCA5OZmWLVt+Ov1b3/oWK1as4MKFCwBMmDCBGTNm8JWvfIUOHTpQUFDA5cuX6d69e8CvREQSSUFBAfv37+fDDz/k5MmTACQnJzNixAjuvvtuunbtGrNzSTWlAhVlL7/8Ms8//zxpaWk0bdqU1157DYCXXnqJOXPmMHToUMaOHUu3bt0A6N+/P6+88gqTJk0iFAqRlJTEv/7rv6pAiUi1nHOcPXuWAwcOcODAAU6fPg1ASkoK48ePp3///rRr1y7glLfGwnuPxav09HRX+YKFBw4c4J577gkoUXzReyFSf50+fZq9e/dy4MABzp8/D0C3bt2455576NevH61btw42YATMLMc5l155etSOoMzsVWA6cMY5N9Cf9o/AI0ApkAs875wrjFYGEZG66MKFC+zdu5c9e/Zw9uxZzIzU1NRPm+9atGgRdMRaEc0mvl8DPwf+K2zaauCbzrkyM/sB8E3gr6OYQUSkTrh8+TL79u1j7969n55Tuuuuu5g6dSr9+/enWbNmASesfVErUM6598ysR6Vpq8IeZgIZt7mNuOgKGaREaKIVkZopKSlh//797Nmzh6NHj+Kco1OnTjz00EMMGDAgIZrvbkeQnSReAN680UwzexF4Efi0A0G4xo0bc/78+Xp9yY2K60HFY/dQEamZUCjE0aNH2blzJwcOHKCsrIy2bdsyevRoBg4cSPv27YOOGDOBFCgz+1ugDHjjRss45+YB88DrJFF5fteuXcnLy/v0m8/1VcUVdUUksZ0/f55du3axa9cuLl26ROPGjRk8eDD33nsvXbp0qZf/iMe8QJnZs3idJya422ifSkpK0lVkRSShFRcXs2/fPnbt2sWJEycwM3r16sWkSZO4++67q/yif30S01dvZlPwOkWMdc5djeW2RUTigXOO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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.plot(color='gray', label='model')\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Quadratic Model Projection')" - ] - }, - { - "cell_type": "markdown", - "id": "macro-carroll", - "metadata": {}, - "source": [ - "According to the model, population growth will slow gradually after 2020, approaching 12.5 billion by 2100.\n", - "\n", - "I am using the word \"projection\" deliberately, rather than\n", - "\"prediction\", with the following distinction: \"prediction\" implies\n", - "something like \"this is what we should reasonably expect to happen, at\n", - "least approximately\"; \"projection\" implies something like \"if this\n", - "model is actually a good description of what is happening in this\n", - "system, and if nothing in the future causes the parameters of the model to change, this is what would happen.\"\n", - "\n", - "Using \"projection\" leaves open the possibility that there are important things in the real world that are not captured in the model. It also suggests that, even if the model is good, the parameters we estimate based on the past might be different in the future.\n", - "\n", - "The quadratic model we've been working with is based on the assumption\n", - "that population growth is limited by the availability of resources; in\n", - "that scenario, as the population approaches carrying capacity, birth\n", - "rates fall and death rates rise because resources become scarce.\n", - "\n", - "If that assumption is valid, we might be able to use actual population\n", - "growth to estimate carrying capacity, especially if we observe the\n", - "transition into the regime where the growth rate starts to fall.\n", - "\n", - "But in the case of world population growth, those conditions don't\n", - "apply. Over the last 50 years, the net growth rate has leveled off, but not yet started to fall, so we don't have enough data to make a credible estimate of carrying capacity. And resource limitations are probably *not* the primary reason growth has slowed. As evidence, consider:\n", - "\n", - "- First, the death rate is not increasing; rather, it has declined\n", - " from 1.9% in 1950 to 0.8% now (see ).\n", - " So the decrease in net growth is due entirely to declining birth\n", - " rates.\n", - "\n", - "- Second, the relationship between resources and birth rate is the\n", - " opposite of what the model assumes; as nations develop and people\n", - " become more wealthy, birth rates tend to fall.\n", - "\n", - "We should not take too seriously the idea that this model can estimate\n", - "carrying capacity. But the predictions of a model can be credible even\n", - "if the assumptions of the model are not strictly true. For example,\n", - "population growth might behave *as if* it is resource limited, even if\n", - "the actual mechanism is something else.\n", - "\n", - "In fact, demographers who study population growth often use models\n", - "similar to ours. In the next section, we'll compare our projections to\n", - "theirs." - ] - }, - { - "cell_type": "markdown", - "id": "small-seminar", - "metadata": {}, - "source": [ - "## Projections" - ] - }, - { - "cell_type": "markdown", - "id": "greater-illness", - "metadata": {}, - "source": [ - "From the same page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "precious-contribution", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    United States Census Bureau (2015)[28]Population Reference Bureau (1973-2015)[15]United Nations Department of Economic and Social Affairs (2015)[16]
    Year
    20167.334772e+09NaN7.432663e+09
    20177.412779e+09NaNNaN
    20187.490428e+09NaNNaN
    20197.567403e+09NaNNaN
    20207.643402e+09NaN7.758157e+09
    \n", - "
    " - ], - "text/plain": [ - " United States Census Bureau (2015)[28] \\\n", - "Year \n", - "2016 7.334772e+09 \n", - "2017 7.412779e+09 \n", - "2018 7.490428e+09 \n", - "2019 7.567403e+09 \n", - "2020 7.643402e+09 \n", - "\n", - " Population Reference Bureau (1973-2015)[15] \\\n", - "Year \n", - "2016 NaN \n", - "2017 NaN \n", - "2018 NaN \n", - "2019 NaN \n", - "2020 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \n", - "Year \n", - "2016 7.432663e+09 \n", - "2017 NaN \n", - "2018 NaN \n", - "2019 NaN \n", - "2020 7.758157e+09 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table3 = tables[3]\n", - "table3.head()" - ] - }, - { - "cell_type": "markdown", - "id": "coated-smoke", - "metadata": {}, - "source": [ - "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", - "\n", - "The column names are long strings; for convenience, I'll replace them with abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "headed-tuner", - "metadata": {}, - "outputs": [], - "source": [ - "table3.columns = ['census', 'prb', 'un']" - ] - }, - { - "cell_type": "markdown", - "id": "ceramic-scroll", - "metadata": {}, - "source": [ - "The following function plots projections from the U.N. DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "paperback-delay", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projections(table):\n", - " \"\"\"Plot world population projections.\n", - " \n", - " table: DataFrame with columns 'un' and 'census'\n", - " \"\"\"\n", - " census_proj = table.census.dropna() / 1e9\n", - " un_proj = table.un.dropna() / 1e9\n", - " \n", - " census_proj.plot(style=':', label='US Census')\n", - " un_proj.plot(style='--', label='UN DESA')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)')" - ] - }, - { - "cell_type": "markdown", - "id": "prostate-matrix", - "metadata": {}, - "source": [ - "Here are their projections compared to the results of the quadratic model." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "billion-dynamics", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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JjDj7lBGd2lJ5pUCnp6XyJODwhkR2Zy07DyaNahzR/HMnDmTTp06MXToUEaPHs20adOoU+f6fR44cIBp06aVuf2bb77JsGHDmDt3LllZWfTp04cRI0YAsGfPHnbv3o2/vz+dOnXimWeeIS0tjTNnzlxrcszKyio3vn/84x8899xzPPbYYxQUFFBcXHxHr1cpVfXYbDZSUlI4cuQIR44c4cKFCwA0btyYrl27EhERQVhY2A3fXe5SbRKUu92sl1tJ+auvvspjjz3GmjVr+O9//8v8+fPZuHGj0/tfs2YNy5Yt49133wWsbvWnTlmT0Q4fPpxGjRoBEBkZycmTJ4mKiuL48eM888wzjB07ltjY2HL3379/f958801SUlKYNGmS1p6UqiHy8vJITk7myJEjHD16lNzcXHx8fGjXrh09evSgY8eOBAYGekVP3mqToD79Qf9rj/18fa57Xre273XPG9bxu+55YP3a1z13pvYUFBTExYsXryvLzMy87sLWiIgInn76aZ588kmaNm1KRkYGQUFB15ZHRUWRmJjIhAkTbth/yfmoTp06XVe+Y8cO/P39rz339fWlqKiIJk2asHfvXlavXs1f//pXPvvsM+bOnUutWrWw2WwA113X9Oijj9K3b19WrFjBqFGj+Ne//sWwYcNu+bqVUlXPpUuX+Oabb0hKSuLkyZPYbDbq1q1Lhw4d6NChA+3bt/dYLak81SZBuVtAQAAtW7Zk/fr1DB8+nMzMTFatWsVzzz0HwIoVKxgzZgwiwtGjR/H19aVx48bX7eMnP/kJffr0YezYsfTt2xeAefPmMWLECEaNGsV7773He++9h4iwe/duevTocdN40tPTqV27Ng888AARERFMnz4dsKYqSUxMpE+fPixYsODa+sePHyc8PJxnn32W48ePs2/fPk1QSlUjmZmZHDp0iG+++YYzZ84AEBwcTL9+/ejUqROtW7d227mkitIEdQf+85//8OMf/5if/vSnALz22mvXult+9NFHzJw5k3r16lGrVi0+/vhjfH19r9u+efPmfPLJJ8yaNYu0tDR8fHwYPHgwkyZN4pe//CXPP/880dHRGGMIDQ1l+fLlN43lzJkzzJgx41pt6e233wZg1qxZPPjgg3z00UfXJaBPP/2UefPm4efnR4sWLXj11Vcr9b1RSrmXMYYLFy5w+PBhDh8+zPnz5wEICQlh2LBhREZGXteCUxWIMcbTMdxSTEyMKT1h4eHDh7nrrrs8FFHNoO+xUt7v/PnzHDhwgMOHD5ORkQFA27Ztueuuu+jcufMNLTfeSEQSjTExpctdVoMSkbnAOCDNGNPFXva/wH1AAZAMzDDGZLkqBqWUqo4uXrzIgQMH2L9/PxcuXEBECAsLu9Z816BBA0+HWClc2cT3AfAX4D8OZWuBl40xRSLyW+Bl4GcujEEppaqF7OxsDh48yIEDB66dU2rTpg1jxowhMjKS+vXrezjCyueyBGWM+UpEQkuVrXF4uh2Y7KrjK6VUVZefn8+hQ4fYv38/J06cwBhDixYtGDFiBFFRUVWi+e5OeLKTxBPApzdbKCJPAU+B1Z6qlFI1gc1m48SJE+zZs4fDhw9TVFREYGAggwYNokuXLjRt2tTTIbqNRxKUiPwCKAI+vtk6xpg5wBywOkm4KTSllPKIjIwM9u7dy969e7l8+TJ16tShW7dudO/enVatWnnFhbPu5vYEJSLTsDpPDDdVoQuhUkq5SF5eHgcPHmTv3r2cPn0aESEiIoLY2Fg6depErVo1+0ogt16lJSKjsTpFjDfGXHXnsSvbiRMn6NKly3Vls2fPvjY00fTp02nVqhX5+fmAdSFtaGhomfvy9fWle/fuREVF0a1bN37/+99fu55p48aNNGrUiO7du1+7rVu3DrDG64uKiiI6Opru3buzY8eOa/ssKioiODiYl19+ubJfulLqDhhjOH36NEuWLOF3v/sdy5cvJzc3lxEjRjBz5kwee+wxoqKianxyAtd2M58PDAWCRSQFeA2r154/sNZeXd1ujPmhq2LwNF9fX+bOncvTTz9d7np169Zlz549gDUK+qOPPsqlS5d4/fXXARg0aNANF+lu27aN5cuXs2vXLvz9/UlPT79u4rA1a9bQqVMnPvvsM956660a2TyglDfJy8tj3759JCYmkpaWRu3atYmOjqZnz56EhIToZ7QMruzF90gZxf921fG80fPPP88f/vAHnnzySae3adasGXPmzKF3795lTnBY4uzZswQHB18bly84OPi65fPnz+e5557j73//O9u3b782pYdSyn2MMaSmppKQkMDBgwcpLCykZcuWjBs3ji5dulw3rqa6UfWpQ74/9sayqInQ50kouAofT7lxefdHocdjcCUDPpt6/bIZK+44pLZt2zJw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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_projections(table3)\n", - "results.plot(color='gray', label='model')\n", - "decorate(title='Quadratic Model Projection')" - ] - }, - { - "cell_type": "markdown", - "id": "integrated-there", - "metadata": {}, - "source": [ - "The U.N. DESA expects the world population to reach 11 billion around 2100, and then level off.\n", - "Projections by U.S. Census are a little lower, and they only go until 2050.\n", - "\n", - "Real demographers expect world population to grow more slowly than our model projects, probably because their models are broken down by region and country, where conditions are different, and they take into account expected economic development.\n", - "\n", - "Nevertheless, their projections are qualitatively similar to ours, and\n", - "theirs differ from each other almost as much as they differ from ours.\n", - "So the results from this model, simple as it is, are not entirely unreasonable.\n" - ] - }, - { - "cell_type": "markdown", - "id": "serial-binary", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "\n", - "You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." - ] - }, - { - "cell_type": "markdown", - "id": "authorized-suggestion", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate more realistic projections, by extrapolating observed changes in growth rate.\n", - "\n", - "To compute past growth rates, we'll use a function called `diff`, which computes the difference between successive elements in a `Series`. For example, here are the changes from one year to the next in `census`:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "handmade-funeral", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 NaN\n", - "1951 0.037311\n", - "1952 0.041832\n", - "1953 0.045281\n", - "1954 0.048175\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = census.diff()\n", - "diff.head()" - ] - }, - { - "cell_type": "markdown", - "id": "discrete-scanner", - "metadata": {}, - "source": [ - "The first element is `NaN` because we don't have the data for 1945, so we can't compute the first difference.\n", - "\n", - "If we divide these differences by the populations, the result is an estimate of the growth rate during each year: " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "objective-accused", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 NaN\n", - "1951 0.014378\n", - "1952 0.015865\n", - "1953 0.016883\n", - "1954 0.017645\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = census.diff() / census\n", - "alpha.head()" - ] - }, - { - "cell_type": "markdown", - "id": "weighted-trouble", - "metadata": {}, - "source": [ - "The following function computes and plots the growth rates for the `census` and `un` estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "unique-matrix", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_alpha():\n", - " alpha_census = census.diff() / census\n", - " alpha_census.plot(style='.', label='US Census')\n", - "\n", - " alpha_un = un.diff() / un\n", - " alpha_un.plot(style='.', label='UN DESA')\n", - "\n", - " decorate(xlabel='Year', label='Net growth rate')" - ] - }, - { - "cell_type": "markdown", - "id": "flexible-amateur", - "metadata": {}, - "source": [ - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "pressing-proceeding", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAArsElEQVR4nO3deZhcdZ3v8fe3qzsERCEmgDFbJ6RJSFgCaZpkNJoEhOBC5ooLy2gAuTxBwrAzLI7i48igqNxRcsmNGllNZBSHDHJZDKjBoU3SEBiymbZvQhqjCTGAipB09/f+UaeaSvWpzqnu6qpzqj6v56mnqs75nZPfL91d3/rt5u6IiIjETU25MyAiIhJGAUpERGJJAUpERGJJAUpERGJJAUpERGKpttwZKMSwYcO8vr6+3NkQEZEiamlpecXdD8s9nqgAVV9fz5o1a8qdDRERKSIz2xp2XE18IiISS5EClJnNMbNNZtZqZteHnDcz+3Zw/gUzOzE4PsrMnjKzDWa2zswuz7rmNjPbGKT/qZkdWrRSiYhI4u03QJlZClgInAFMAs4xs0k5yc4AGoLHxcCdwfEO4Gp3PxqYBlyade0TwDHufhzwW+CGfpZFREQqSJQ+qCag1d3bAMxsGTAXWJ+VZi5wj6fXTWo2s0PNbLi7bwe2A7j7n81sAzACWO/uj2dd3wx8ov/FERHpu71799Le3s6bb75Z7qxUpMGDBzNy5Ejq6uoipY8SoEYA27LetwMnR0gzgiA4AZhZPXAC8JuQf+NC4Edh/7iZXUy6Vsbo0aMjZFdEpG/a29t55zvfSX19PWZW7uxUFHdn165dtLe3M3bs2EjXROmDCvsp5a4w22saMzsY+Alwhbu/vs+FZjeRbgq8P+wfd/fF7t7o7o2HHdZjFKKISNG8+eabDB06VMFpAJgZQ4cOLah2GqUG1Q6Myno/Evh91DRmVkc6ON3v7g/mZHge8FHgFNey6iISAwpOA6fQ/9soNajVQIOZjTWzQcDZwPKcNMuBzwaj+aYBr7n7dkvn5vvABnf/Vk5G5wD/BJzp7m8UlGspipatu1n4VCstW3eXOysiIj3sN0C5ewewAHgM2AA84O7rzGy+mc0Pkj0CtAGtwHeBzwfH3wd8BphtZmuDx4eDc3cA7wSeCI4vKlqppIfcYNSydTfnfa+Zbz6+ifO+16wgJRIDW7Zs4Zhjjtnn2M0338w3vvENAJqbmzn55JOZMmUKRx99NDfffHPofVatWsUHPvABJkyYwMSJE7nooot4443k1QMirSTh7o+QDkLZxxZlvXbg0pDrnia8fwp3H19QTqXPMsFoT0cXg2pruP+iaTS37WJPRxddDns7umhu28XUMUPKnVUR6cW8efN44IEHOP744+ns7GTTpk090vzxj3/kk5/8JMuWLWP69Om4Oz/5yU/485//zEEHHVSGXPedVpKoAmHBaNq4oQyqrSFlUFdbw7RxQ8udTZFEKmVT+Y4dOxg+fDgAqVSKSZNyp6TCwoULmTdvHtOnTwfS/T6f+MQnOOKII/jrX//KhRdeyEknncQJJ5zAQw89BMBdd93Fxz/+cebMmUNDQwPXXXcdAJ2dnZx//vkcc8wxHHvssdx+++0AzJw5s3vZuVdeeYXMGqnr1q2jqamJKVOmcNxxx7F58+Z+lTdRa/FJ32SC0d6Oru5gNHXMkO6aVOa9iBQmrHViIP+WrrzySiZMmMDMmTOZM2cO8+bNY/DgwfukefHFF5k3b17o9V/96leZPXs2S5Ys4dVXX6WpqYlTTz0VgLVr1/Lcc89xwAEHMGHCBC677DJ27NjByy+/zIsvvgjAq6++2mv+Fi1axOWXX855553Hnj176Ozs7Fd5VYOqAplgdNVpE/b5A5o6ZgiXzhqv4CTSR2GtE/2Rb5Rb5vgXv/hF1qxZw2mnncYPf/hD5syZU9D9H3/8cW699VamTJnCzJkzefPNN3nppZcAOOWUUzjkkEMYPHgwkyZNYuvWrYwbN462tjYuu+wyHn30Ud71rnf1ev/p06dzyy238LWvfY2tW7dy4IEHFpS/XApQVULBSKT4it1UPnToUHbv3rep8E9/+hPDhg3rfn/kkUdyySWXsGLFCp5//nl27do3KE6ePJmWlpbQ+2f6o9auXcvatWt56aWXOProowE44IADutOlUik6OjoYMmQIzz//PDNnzmThwoVcdNFFANTW1tLV1QWwz7ymc889l+XLl3PggQdy+umn8+STT/bjf0MBSkSkz/K1TvTVwQcfzPDhw1mxYgWQDk6PPvoo73//+wH42c9+RmbK6ObNm0mlUhx66KH73GPBggXcfffd/OY3by/ac9999/GHP/yB008/ne985zvd93juued6zc8rr7xCV1cXZ511Fl/5yld49tlngfTWR5kg+OMf/7g7fVtbG+PGjeMf//EfOfPMM3nhhRf68b+hPigRkX6ZOmZIUVsm7rnnHi699FKuvvpqAL70pS9x5JFHAnDvvfdy5ZVXctBBB1FbW8v9999PKpXa5/ojjjiCZcuWcc0117Bjxw5qamr4wAc+wMc//nH++Z//mSuuuILjjjsOd6e+vp6HH344b15efvllLrjggu7a0r/+678CcM011/CpT32Ke++9l9mzZ3en/9GPfsR9991HXV0d73nPe/jiF7/Yr/8LS9ICDo2Nja4NC0VkoGzYsKG7yUsGRtj/sZm1uHtjblo18YmISCwpQImISCwpQImISCwpQImISCwpQImISCwpQImISCwpQImIxMT+tts4//zzGTFiBG+99Raw70KtuVKpFFOmTGHy5Mkcf/zxfOtb3+qez/SLX/yCQw45hClTpnQ/fv7znwPp9fomT57Mcccdx5QpU/aZ8NvR0cGwYcO44YYbil30UJqoKyKSIKlUiiVLlnDJJZf0mu7AAw9k7dq1QHoV9HPPPZfXXnuNL3/5ywDMmDGjxyTdZ555hocffphnn32WAw44gFdeeYU9e/Z0n3/88ceZMGECDzzwALfccsuA7z6sGpSISH9sWwUrv5l+LoErrriC22+/nY6OjsjXHH744SxevJg77riD3hZn2L59O8OGDetel2/YsGG8973v7T6/dOlSLr/8ckaPHk1zc3PfCxGRApSISF9tWwV3nwlPfjX9XIIgNXr0aN7//vdz7733FnTduHHj6OrqYseOHQCsXLlynya+3/3ud5x22mls27aNo446is9//vP88pe/7L7+b3/7GytWrOCjH/0o55xzDkuXLi1qucIoQMk+Srn5mkjibVkJnXvAO9PPW1b263b7224j48Ybb+S2227r7lOKKrv2NGPGjO5VzdeuXcuRRx7JwQcfTEtLC4sXL+awww7j05/+NHfddRcADz/8MLNmzeKggw7irLPO4qc//Wm/93vaH/VBSbeibL62bVX6j7R+BoxqGpiMisRF/QxIDUoHp9Sg9Pt+yLfdxtixY/c5Nn78eKZMmcIDDzwQ+d5tbW2kUikOP/xwNmzYkDddKpVi5syZzJw5k2OPPZa7776b888/n6VLl/LrX/+6e1DGrl27eOqpp7o3PBwIClDSLWzztYICVKa5I/PHOm85jGpi4+qfs3v9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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_alpha()" - ] - }, - { - "cell_type": "markdown", - "id": "cross-reducing", - "metadata": {}, - "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", - "\n", - "We can model the decline by fitting a line to this data and extrapolating into the future.\n", - "\n", - "Here's a function that takes a time stamp and computes a line that roughly fits the growth rates since 1970." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "mexican-denver", - "metadata": {}, - "outputs": [], - "source": [ - "def alpha_func(t):\n", - " intercept = 0.02\n", - " slope = -0.00021\n", - " return intercept + slope * (t - 1970)" - ] - }, - { - "cell_type": "markdown", - "id": "handy-dubai", - "metadata": {}, - "source": [ - "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "addressed-worker", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linspace\n", - "\n", - "t_array = linspace(1960, 2020, 5)\n", - "alpha_array = alpha_func(t_array)" - ] - }, - { - "cell_type": "markdown", - "id": "jewish-operations", - "metadata": {}, - "source": [ - "Here's what it looks like, compared to the data." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "cathedral-shakespeare", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from matplotlib.pyplot import plot\n", - "\n", - "plot_alpha()\n", - "plot(t_array, alpha_array, color='gray')" - ] - }, - { - "cell_type": "markdown", - "id": "expensive-viewer", - "metadata": {}, - "source": [ - "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", - "\n", - "Now, as an exercise, you can use this function to make a projection of world population until 2100.\n", - "\n", - "1. Create a `System` object that includes `alpha_func` as a system variable.\n", - "\n", - "2. Define a growth function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", - "\n", - "3. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", - "\n", - "4. Compare your projections with those from the US Census and UN." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "common-april", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "t_0 = 1960\n", - "t_end = 2100\n", - "p_0 = census[t_0]" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "ignored-chain", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha_func=alpha_func)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "color-accountability", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def growth_func_alpha(pop, t, system):\n", - " return system.alpha_func(t) * pop" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "numeric-raise", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.06725033332680001" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "growth_func_alpha(p_0, t_0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "included-vehicle", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results2 = run_simulation(system, growth_func_alpha);" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "brown-rating", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABGoElEQVR4nO3dd1xUV/r48c9DB0VUULEhghUsqKixG3uiicaoiTFr1M0mm91N281mWzabLcnWX7Zmvxs3cVPtxhKNxhLRaOxK7EbFhg1QwQZIOb8/7gVHBByBYQZ43q8XL2buvXPvc6Y9c8499xwxxqCUUkp5Gi93B6CUUkoVRxOUUkopj6QJSimllEfSBKWUUsojaYJSSinlkTRBKaWU8kiaoNRdE5FJIrKyEo7znoj8ztXHKea4kSJiRMTHiW2niMgGJ/d7y7YiclVEosoTa1ncTfmc2NdrIvJRRcTlaiLST0QOuTsO5TxNUB5CRI6LSKb9pXVeRP4nIrU9IK7bvsyMMR8bY4a5M67qwBhT2xiT5O44agpjzJfGmLbujgNARAaKSLK74/B0mqA8ywPGmNpAV6A78ErRDSriV6+zKvNYqnJUhde0KsRYGrHod2sF0CfRAxljTgPLgQ4Adg3m+yJyGDhsL/uOiBwRkYsiskREmhQ83t7+ORFJEpE0EflzwQdGRLxE5BUROSEiKSLygYiE2OsKakvfFpGTwBfAenu36XbtrlcxTVW9RWSbiGTY/3s7rEsQkd+KyEYRuSIiK0UkzGH9PBE5Zz92vYjEOvMc2TFsFJG/iki6Xdbe9vJTdtmecNg+xC5rql32VxyeE28R+Yv9XCUBI4scK0RE3hWRsyJyWkR+JyLezsR5hzIYEWll335PRN4SkWX287RFRKIdtm0nIqvs1/uQiExwWDdSRHaJyGW77K85rCvuNXWMYbyI7Ciy7EcisqiEmFuKyDo7xlVAWJH194jIV/Zr8rWIDHRYV1+sloEzInKp4BgFtQkR+YmInAP+Z79PfyoiR0XkgojMFZH6Dvsq8X0jIveLyH47xtMi8pLjcRy2Oy4iL4nIbns/c0QkwGH9y/ZrfkZEnnR8vYp5XhJE5HUR2QhcB6JEZKqIHLDjSBKRp+1ta2F9vpuI9Zm6KiJN7lTmGskYo38e8AccB4bYt5sD+4Df2vcNsAqoDwQCg4A0rJqWP/BPYL3Dvgyw1t4+AvgGeNJeNw04AkQBtYFPgA/tdZH2Yz8AatnHKljm47D/KcAG+3Z94BLwLcAHmGjfD7XXJwBHgTb2/hKAPzjsaxoQbJfjb0Ciw7r3gN+V8HxNAXKBqYA38DvgJPCWva9hwBWgtr39B8Bi+1iR9nPybXvdd4GD9vNe337uCssMLALetp+ThsBW4Omiz4UTr/Et29rHaOVQ1otAD/t5/BiYba+rBZyyy+pjv+5pQKy9fiDQEesHZyfgPDDGmdfUfq4uAu0d4toFPFxCGTYBb9qP628/xx/Z65oCF4D77ViG2vcb2OuXAXOAeoAvMMAh/lzgj/Z+A4EXgM1AM3vZ28AsJ983Z4F+9u16QFeH4yQX+cxtBZrYr/sB4Lv2uhHAOSAWCAI+dHy9inleErDef7H28+qL9UMnGhBgAFbiKjYWe1mpZa6Jf24PQP/sF8L6sFwF0oETwL+BQHudAQY5bPsu8CeH+7WBHCDSYfsRDuu/B6yxb68Bvuewrq39WB9ufnFFOawvWFZSgvoWsLVIWTYBU+zbCcArRWJZUcJzUNc+Voh9/z1KT1CHHe53tB/byGHZBSAOK4FlAzEO654GEuzbXxR8Mdn3h3HzC7yR/dhAh/UTgbVFnwsnXuNbtuX2BPWOw7r7gYP27UeAL4vs623gVyUc52/AX4u8fiW+psD/Aa/bt2OxfmD4F7PfCKxEUsth2UxuJqifYP/YcVj/OfAE0BjIB+oVs9+BwA0gwGHZAWCww/3G2O9TJ943J+3Xt04xxymaoB53uP8n4D/27RnA7x3WteLOCeo3d3j9FwHPFxfL3Za5pvxpE59nGWOMqWuMaWGM+Z4xJtNh3SmH202wkhgAxpirWF/GTUvY/oT9mNsea98u+CIu7rF3UnR/Bft0jOWcw+3rWAm1oGntD3aTxmWsLwwo0mxUivMOtzMBjDFFl9W29+fH7eUuiLEJtz9fBVpg/Ro+azdbpWMlh4ZOxng3in2e7Bh6FhzfjmESEA4gIj1FZK3dfJmBVSMs+hyW9pq+DzwmIoL1g2OuMSa7mO2aAJeMMdcclhV9rsYXibMv1hdtc+CiMeZSCTGkGmOyiuxrocN+DgB5QCMn3jcPYyX4E3ZzZK9Syl7Sc170PeHMZ+KWbUTkPhHZbDfLptsxlfbeLrHMThy7WtIEVXUYh9tnsN7MQGGbdihw2mGb5g63I+zH3PZYbv4qdvxiNyXcLk7R/RXs83Qx2xb1GDAaGAKEYP2yB6tJpCKlYf0SLVrughjPcvvzVeAUVg0qzP7xUNcYU8cY49S5sgpyCljncPy6xuoB+Iy9fiawBGhujAkB/sPtz2GJr6MxZjNWDaYf1mvyYQmbngXq2e+3AkWfqw+LxFnLGPMHe119EalbUhjFlPm+IvsKMNb52VLfN8aYbcaY0Vg/IhYBc0sqeynOYjW1FWhe0obFlUFE/IEFwF+wavV1gc+4+boU93qUVuYaSRNU1TQTmCoicfYH4Q1gizHmuMM2PxaReiLSHHgeq+0fYBbwon2yu7b92DnGmNwSjpWK1TRT0vU6nwFtROQxEfERkUeAGGCpE+UIxvryv4DVzv+GE4+5a8aYPKwvqddFJFhEWgA/BAqu35kLPCcizUSkHvBTh8eeBVYC/09E6tgnsqNFZEBxx7JPlr9WwUVYivUcf0tEfO2/7iLS3l4fjFU7yRKRHlhf4HfrA+BfQK4xptjruowxJ4DtwK9FxE9E+gIPOGzyEfCAiAy3azkBdseEZvbzuBz4t/2+9BWR/qXE8x+s16sFgIg0EJHRDuUt9n1jxzVJREKMMTnAZaxayN2ai/UZay8iQcCrd/l4P6zzSKlArojch9V0XOA8ECp2ByVbaWWukTRBVUHGmDXAL7F+oZ3FOhH7aJHNFgM7gESsk9Pv2stnYP1CXg8cA7KAZ0s51nXgdWCj3fRwT5H1F4BRwI+wvjBeBkYZY9KcKMoHWE1Ep4H9WCeIXeVZ4BqQBGzASvIz7HX/xTpX8jWwE6vjiKPJWF84+7HOz8zHarYqTnNgY0UGboy5gvXl9ihWjfUcNzsUgHVe7zcicgXri7QsNYYPsXqNllR7KvAY0BOrY8WvsF7DgjhPYdVsfo71xXwK+DE3v2e+hVWTPQikYHUKKMnfsWqFK+1ybbaPC3d+33wLOG43/30XePwOZbqNMWY58A+sDjNHsM6rgpUYnXn8FeA5rNfiEtbztsRh/UGsH4tJ9ueqCaWXuUYS+2ScqkZExACtjTFH3B1LTSIizYB5xpjSznl4JBEJxEoaXY0xh90dj6exa6t7sTqPlNTaoCqY1qCUqiDGmOSqmJxszwDbNDndJCIP2U2G9bBqrJ9qcqpcVfqKbaVU+YnIcayT92PcG4nHeRqr+38esA6rKVVVIm3iU0op5ZG0iU8ppZRHqhJNfGFhYSYyMtLdYSillHKBHTt2pBljGhRdXiUSVGRkJNu3b3d3GEoppVxARIqORgNoE59SSikPpQlKKaWUR9IEpZRSyiNViXNQxcnJySE5OZmsrKw7b6zuWkBAAM2aNcPX19fdoSilaqgqm6CSk5MJDg4mMjISa5YAVVGMMVy4cIHk5GRatmzp7nCUUjVUlW3iy8rKIjQ0VJOTC4gIoaGhWjtVSrlVlU1QgCYnF9LnVinlblU6QSmllKpk+flw+QycdOXsOBZNUGV0/PhxOnTocMuy1157jb/85S8AbN68mZ49exIXF0f79u157bXXit3P1q1b6d+/P23btqVdu3Y8+eSTXL9+3dXhK6VUyfLzIf0U5NmDtx/8DGZPgn/3gjeawJvtYcZwuHHNpWFU2U4Snu6JJ55g7ty5dO7cmby8PA4dOnTbNufPn2f8+PHMnj2bXr16YYxhwYIFXLlyhaCgIDdErZSqkc7vg91zIe0buJgEF49BXjb8YDuEtYar5+DCEagfBdGDoH5L67aXa3v5uqwGJSIzRCRFRPY6LBsvIvtEJF9E4l11bE+QkpJC48bWpKve3t7ExMTcts1bb73FE088Qa9e1hRCIsK4ceNo1KgR165dY9q0aXTv3p0uXbqwePFiAN577z3Gjh3LiBEjaN26NS+//DIAeXl5TJkyhQ4dOtCxY0f++te/AjBw4MDCYaLS0tIoGNNw37599OjRg7i4ODp16sThwzoNkFLVVn4+XDgKB5bCuj/BvCnwrx5wfIO1/tJx2PSWlZhCW0HPp2HU3yCwvrU+fhp8fwtMnAXDX4fuT1qJysfPpWG7sgb1HvAvHKaExpqRcizwdkUf7JG3NzGuWzPGxzcnJy+fx9/ZwqM9mvNQl2Zk3shjyv+28vg9LXigcxMuZ+Xwnfe3M7VPJCM6NObitRs889EOvtMviiExjUi5kkXD4IByxfPiiy/Stm1bBg4cyIgRI3jiiScICLh1n3v37uWJJ54o9vGvv/46gwYNYsaMGaSnp9OjRw+GDBkCQGJiIrt27cLf35+2bdvy7LPPkpKSwunTp9m71/o9kJ6eXmp8//nPf3j++eeZNGkSN27cIC8vr1zlVUp5iBvX4NweOLMLmnSFiJ5wNhH+e+/NbepFQsNY8LYTTKuh8Iuz4O1Z1z26LEEZY9aLSGSRZQegevQQK6kMBctfffVVJk2axMqVK5k5cyazZs0iISHB6f2vXLmSJUuWFJ7TysrK4uTJkwAMHjyYkJAQAGJiYjhx4gSxsbEkJSXx7LPPMnLkSIYNG1bq/nv16sXrr79OcnIyY8eOpXXr1k7HppTyEMaACNy4Dp+9ZCWl1INg8q31A35qJagG7eDBf1pJqUFb8K99635cXBMqq2pzDmrO0zdn2vb19rrlfqCf9y336wT43nK/fi2/W+47U3sKDQ3l0qVLtyy7ePHiLRe2RkdH88wzz/Cd73yHBg0acOHCBUJDQwvXx8bGsmPHDkaPHn3b/gvOR7Vt2/aW5Vu2bMHf37/wvre3N7m5udSrV4+vv/6azz//nLfeeou5c+cyY8YMfHx8yM+33qyO1zU99thj9OzZk2XLljF8+HDeeecdBg0adMdyK6XcJPcGpOyDM4lWIjqzCxp3gtFvgW8gnN4BIc2h3Sho0sX6q2OdZsAvCLpOdmv4ZeGxvfhE5CkR2S4i21NTU90dzm1q165N48aNWbNmDWAlpxUrVtC3b18Ali1bRsFsxYcPH8bb25u6deveso8f/OAHvP/++2zZsqVw2UcffcS5c+cYPnw4//znPwv3sWvXrlLjSUtLIz8/n4cffpjf/va37Ny5E7CmKtmxYwcA8+fPL9w+KSmJqKgonnvuOR588EF2795djmdDKVXhMi9ZSafAO4Ng+kBY+gLsXwxBodCoo7VOxDpH9Ph8GPQLaHf/zeRUhXlsDcoYMx2YDhAfH++R89J/8MEHfP/73+dHP/oRAL/61a+Ijo4G4MMPP+TFF18kKCgIHx8fPv74Y7y9vW95fKNGjZg9ezYvvfQSKSkpeHl50b9/f8aOHcsvf/lLXnjhBTp16oQxhsjISJYuXVpiLKdPn2bq1KmFtaXf//73ALz00ktMmDCBDz/88JYa0pw5c/joo4/w9fUlPDycV199tUKfG6XUXco4DSc2wslN1jVGKfshoC68fAy8vKDvD63tmnSxziFVg1MldyIFv9BdsnPrHNRSY0yHIssTgJeMMU7NQhgfH2+KTlh44MAB2rdvX0GRquLoc6yUi+Tnw/m9ViLqOhl8A2DVq7Dx7+BfB5p1h4heEHEPtOgNXt533mcVJiI7jDG39ex2WQ1KRGYBA4EwEUkGfgVcBP4JNACWiUiiMWa4q2JQSimPce0CHFoGR9fCsXVw/YK1vHFnqyND/DToOB4axlT7hOQsV/bim1jCqoWuOqZSSnmMrMtw/Euo1xIaxVgXwS55FmqHW926o++FFn2gbnNr+3qRbg3XE3nsOSillKpS8vMheatVQ0paC8nbweRBrx9YF7c2i4dnNkHD9jXi/FFF0ASllFJldf2iNQpD067W/VkTISvd6sjQ90WrltSsu7XO29eqSSmnaYJSSqm7cTEJDi23/k58BSHN4PmvrZ52k+ZBaDQE1nN3lNWCJiillCpNfr7VJCdys6cdWJ0Z+r4Ibe+/uW2zaj3EaKXz2At1Pd2dptuYMmUKTZs2JTs7G7h1oNaivL29iYuLIzY2ls6dO/Pmm28WXs+UkJBASEgIcXFxhX+rV68GrPH6YmNj6dSpE3Fxcbdc8Jubm0tYWBg/+9nPKrroSlV/OVnwzefw6fPW1BKp9mwErYfD8N/Dc4nwvU0w+JfQrJueU3IRrUG5kLe3NzNmzOCZZ54pdbvAwEASExMBaxT0xx57jIyMDH79618D0K9fv9su0t20aRNLly5l586d+Pv7k5aWxo0bNwrXr1y5krZt2zJ37lzeeOONajH+oVIud/kMrPkNHFwG2ZfBrza0GnJzbLvIPtafqhRag3KhF154gb/+9a/k5uY6/ZiGDRsyffp0/vWvf1HaRdRnz54lLCyscFy+sLAwmjRpUrh+1qxZPP/880RERLB5s+tnvlSqSsrPg2PrISnBuu9XC45+ATEPwqQF8HISTHhfOze4SfWpQf1v5O3LYsdAj+9YI/1+PP729XGPQZdJ1gV0c4sMpDh1WblDioiIoG/fvnz44Yc88MADTj8uKiqK/Px8UlJSAPjyyy+Ji4srXL9gwQKGDRvGb37zG9q0acOQIUN45JFHGDBgAACZmZmsWbOGt99+m/T0dGbNmlU455RSNZ4xkLwN9i6AfQvh6nlo0ReiBkJACPzwgF4o6yG0BlVGd5puo8DPf/5z/vznPxeeU3KWY+2pX79+JCYmFv5FR0dTu3ZtduzYwfTp02nQoAGPPPII7733HgBLly7l3nvvJSgoiIcffpiFCxfqfE9KFVjwJLw7FLb/D5r3gPHvWb3vCmhy8hjVpwZVWo3HL6j09bVC77rG5Mx0GwCtWrUiLi6OuXPnOr3vpKQkvL29adiwIQcOHChxO29vbwYOHMjAgQPp2LEj77//PlOmTGHWrFls3LixsFPGhQsXWLt2beGEh0rVGFfOwdezYfccmLwEajeAzhOt80rtRkJAHXdHqEpRfRJUJXOcbmPw4MGF0208//zzt237i1/8gpEji2mCLEZqairf/e53+cEPflBqx4ZDhw7h5eVVONFgYmIiLVq04PLly2zYsIFTp04Vnp/63//+x6xZszRBqZohL8fqgbfrIzi80hrNofk91th3tRtAa/0cVBWaoMqhtOk2HMXGxtK1a9fCOZqKyszMJC4ujpycHHx8fPjWt77FD3/4w8L1Rc9BvfLKK7Rs2ZJnn32W9PR0fHx8aNWqFdOnT+eTTz5h0KBBt0xqOHr0aF5++WWys7NvWa5UtZKTaU3cd/k0zJlkjXnX5zmImwRhOmN0VeTS6TYqik634R76HCuPl5VhdXbY9RHUagiPzbaWn9wCTbuBt/4GrwoqfboNpZRymZNbYPu71syyuVnWqA7R995cH9HTfbGpCqMJSilVNdy4Bt7+Vq3o2Do4tMJqvuvyuDU4q16MXu1oglJKebZLJ2Dbf2HnB/DA3yH2Ibjne9D7Weuck6q2XDmj7gxgFJBSMOW7iNQH5gCRwHFggjHmUkn7UErVUMbA8Q2w5T9w6DNAoP0DUD/KWu9f263hqcrhygt13wNGFFn2U2CNMaY1sMa+r5RSloIL2o2BpS9Y01n0eQFe2G0NOdS4szujU5XMlVO+rxeRyCKLRwMD7dvvAwnAT1wVg1Kqikg/BdvegQNL4LsbrDHxHp0JdSO0Ga8Gq+yhjhoZY84C2P8blrShiDwlIttFZHtqamqlBegukZGRpKWllXsbpaqU1EPwyVPw987w1T+gUazVdRygQVtNTjWcx3aSMMZMB6aDdR2Um8NRSlW01G/grZ5WErrnGej5tFVjUspW2TWo8yLSGMD+n1LJx69Qx48fp127djz55JN06NCBSZMmsXr1avr06UPr1q3ZunUrFy9eZMyYMXTq1Il77rmH3bt3A9b4eMOGDaNLly48/fTTtwwO+9FHH9GjRw/i4uJ4+umndaBXVX2c3gE73rNuN2gDo96EF/bC8Nc1OanbVHYNagnwBPAH+//iitjpihUrOHfuXEXsqlB4eDgjRhTt43G7I0eOMG/ePKZPn0737t2ZOXMmGzZsYMmSJbzxxhs0b96cLl26sGjRIr744gsmT55MYmIiv/71r+nbty+vvvoqy5YtY/r06YA1esOcOXPYuHEjvr6+fO973+Pjjz9m8uTJd4hEKQ92cjOs+xMcXWMNQdTpUfANgPhp7o5MeTBXdjOfhdUhIkxEkoFfYSWmuSLybeAkUMwkTVVLy5Yt6dixI2CNuTd48GBEhI4dO3L8+HFOnDjBggULABg0aBAXLlwgIyOD9evX88knnwAwcuRI6tWrB8CaNWvYsWMH3bt3B6xx+ho2LPFUnVKe7fx+WP4yHP8SgsJgyGvQ/UkrOSl1B67sxTexhFWDK/pYztR0XMVx8FUvL6/C+15eXuTm5uLjc/tTXDBKeXGjlRtjeOKJJ/j973/vooiVcjFjIPuKNZWFjz9cTILhb0C3KVbvvAqQm5vL5cuXycjI4MqVK1y/fp3MzMzC/9nZ2eTk5JCbm1v4v6AZXUQKP3u+vr74+fnd8hcYGEitWrUK/2rXrk1ISAiBgYGlzjCgKp7HdpKoLvr378/HH3/ML3/5SxISEggLC6NOnTqFy1955RWWL19eOLfU4MGDGT16NC+++CINGzbk4sWLXLlyhRYtWri5JEo54cRXsOpVa+DWiTMhNBpe2FOmSQBzc3O5cOECaWlppKWlceHChcIWiGvXrhX7mMDAQIKCgvD398fHx4eAgABq166Nr69vYXIpSFTGGHJzc7lx4waZmZlkZGSQnZ3N9evXyc3NvW3ffn5+1K1bl3r16lG3bl0aNGhAgwYNaNiwIQEBWiN0BU1QLvbaa68xdepUOnXqRFBQEO+//z5gTc0xceJEunbtyoABA4iIsE4Qx8TE8Lvf/Y5hw4aRn5+Pr68vb731liYo5dlSDsDq1+CbFRDcGLp86+Y6J5JTdnY2586d48yZM5w7d46zZ8+SlpZ2S+ehunXrUr9+fRo1akRISEjhX3BwMEFBQQQEBODlVf5+X8YYbty4wbVr17h27RpXr14lIyODS5cukZ6ezqVLl0hKSiInJ6fwMcHBwTRs2JAmTZrQpEkTmjZtSnBwcLljqel0ug1VIn2OlVP2LYT508CvNvR9EXp+15rFuhQZGRmcPHmy8C8l5WaH3uDgYBo3bkx4eDgNGjQgLCyM0NBQfH19XV0SpxljyMjIICUlhdTUVFJTUzl37hwpKSmFSTU4OJimTZvSokULIiMjadSokTYRlkCn21BKVZzMdLiaYnUVjxoIvZ+DPs9DUP3iN8/MJCkpiaNHj3Ls2DHS09MBq9msefPmxMTE0KRJExo3bkzt2p4/zp6IULduXerWrUubNm0Kl+fk5HDu3DlOnz7NmTNnOHXqFAcPHgQgICCgMFm1atWK0NBQTVh3UGqCEpFewONAP6AxkAnsBZYBHxljMlweoVLKc+RkWSOLr/8L1GsBT62DwHow9Ne3bGaM4dy5cxw6dIgjR45w5swZjDH4+/vTsmVLevbsSUREBOHh4RXSLOcpfH19ad68Oc2bNy9clpGRUdij98SJExw6dIjPP/+cevXq0apVK1q1akXLli09qoboKUpMUCKyHDiDda3S61gX1QYAbYB7gcUi8qYxZkllBFocY4z+AnGRqtD0qypRfh7sngtrX4eMUxA92EpKDp+//Px8Tpw4wcGDBzl06BAZGRmICE2bNqV///5ER0fTtGnTapWQnBESEkLnzp3p3Nka6PbSpUscOXKEI0eOkJiYyLZt2/D19aVVq1a0b9+eNm3a3NI7uCYr8RyUiIQZY0od+M2ZbSpCceegjh07RnBwsFaTXcAYw4ULF7hy5QotW7Z0dzjKE3w9BxY+BY3jrMQUNRCw3isnT55kz5497N+/n8zMTHx8fIiOjqZdu3a0adOGoKDSz0fVZLm5uYVJ/eDBg1y9ehVvb2+ioqKIjY2lffv2+Pn5uTtMlyvpHFSV7SSRk5NDcnIyWVlZboqqegsICKBZs2ba7FCTXTpuTRYYNQDycuDQcmg3Cry8OHfuHHv27GHv3r1cvnwZX19f2rZtS0xMDNHR0TXiS7WiGWM4deoUBw4c4MCBA2RkZODr60u7du3o1KkTUVFR1bb2WeYEJSJjgT9ijTwu9p8xxtRxRaDFKS5BKaVcJCcTNvwNNv7N6jL+7A7w8iYrK4s9e/awa9cuzp49i5eXF61ataJDhw60bduWPLz5yYLd9IoOZWIPHVevPAqS1e7du9m3bx9ZWVnUqlWLTp060a1bN0JDQ90dYoUqTy++PwEPGGMOVHxYSimPYQwcXAqf/xzST0KHhzFDfsOJk6fYuXMnBw4cIDc3l/DwcO677z46dOiAf0Agx9Ku4ufnZzUNX8vmatbtF7mquyMiREREEBERwYgRIzh8+DC7d+9my5YtbNq0icjISLp27Ur79u2LHa2munCmBrXRGNOnkuIpltaglKoEJzfDjOHQMIYbQ95g9+Vgtm3bRkpKCv7+/nTs2JGuXbvSuHHjwof8dMFuVu4/z1c/HUSAr7d2XHKxK1eukJiYyK5du7h06RKBgYF06dKFHj16EBIS4u7wyqw8TXx/B8KBRUB2wXJjzCcVHGOJNEEp5SLZVyB5G0QPAmO4uH0BW9Nqkfj112RnZxMeHk6PHj3o0KEDvr6+pF+/wXtfHWdyr0jq1/JjT3IGp9OvMzQmHG8vTUyVxRjDsWPH2L59e+F1Vu3bt6dnz540b968yv1IKE8TXx3gOjDMYZkBKi1BKaUqmDGwZx6s/CVkZZD86Bd8tXMvBw4cwMvLi5iYGHr06EGzZs0QkcLLDlKuZPOPNYeJDK3FmC5N6dgshI7Nqu4v96pKRIiKiiIqKoqMjAy2bt3Kzp072b9/P40bN6ZXr17ExsZW+U4VVbYXn1KqjM7tgc9+jDm5iW/qD+Erv4GcPH8Rf39/4uPj6dmzZ+E4csYYfrl4L/4+3vxyVAwAZ9IzaVJXp2L3NDdu3Cg8T5WWlkbdunXp3bs3cXFxHt8bt8w1KBFpBvwT6INVc9oAPG+MSa7wKJVSrnX5LGb6IPb7dmB9nZ+QcimHkJA8hg8fTpcuXQovEE27mk1YbX9EBG8RHFvvNDl5Jj8/P+Lj4+nWrRuHDh1iw4YNfPbZZ6xbt46ePXvSo0ePKncBsDPnoFYBM4EP7UWPA5OMMUPLfFCR54HvYHVZ/68x5m+lba81KKXKKfUQJqwN+/fvZ93KT0m9nE1YWBj9+vUjNjYWb++bI44v2nWaH8//mpUvDqBlWMXM36QqnzGGEydOsHHjRo4cOUJgYCC9e/emR48eHnedWnk6SSQaY+LutOwuAukAzAZ6ADeAFcAzxpjDJT1GE5RSZXQtjfwVP2f/nl2sr/coqelXCQsLY8CAAcTExBSeozieZs2vFBlWi9Qr2byzIYmn+0dTv5ZnfZGpsjlz5gwJCQkcPnyYoKAg+vTpQ/fu3T2m6a88CWo18B4wy140EZhqjCnTzLgiMh4Ybox50r7/SyDbGPOnkh6jCUqpu2QMJnEW+5b/l3U5nUijPg3CQuk/YOAtiQkgOzePXr//gl5Robw1qasbg1aulpycTEJCAkePHqVWrVr07duX+Ph4t19LVZ4EFQH8C+iFdQ7qK6xzUCfKGEh7rAFoe2GNjr4G2G6MebbIdk8BTwFERER0O3GiTIdTquYxhmMzvsOqU76clXAa1KvDgMHDiImJKex+nHolm8/2nOWJ3pEArP8mlXaNg2kYrDPD1gQnT54kISGhcEzT/v3707VrV7f1+vOosfhE5NvA94GrwH4g0xjzYknbaw1KKSfk5XI+NY3Va9Zw5MgR6gR4M2j4KDp17nzbdTHvfJnE75cfZNWL/Ylq4PnzLynXOH78OF988QWnTp2iQYMGDB06lFatWlX6dVR3naBE5GVjzJ9E5J9YNadbGGOeq6DA3gCSjTH/LmkbTVBKlS7j0EYSFr1PYlZTAgIC6NevHz169ChsurmRm88Hm47TLrwOfVuHkZWTx9mMLO0EoTDGcPDgQVavXs3Fixdp2bIlw4YNIzw8vNJiKEs384Kx9yo8M4hIQ2NMit18OBaruU8pdZeyr1ziy9l/ZcsZgyGcXm3D6Td6MoGBt3cF/2DTCQa1a0jf1mEE+HprclKAddFvwTxU27dvZ926dbz99tvExcVx7733UqdOpY0Lfntsbmri+xIIBXKAHxpj1pS2vdaglLqVMYav1y5k9YZtXDMBdKp/g3vHP03d8JujiO84cYkPNh3n/43vjI+3Fxev3dBeeeqOMjMz+fLLL9m6dSsiQu/evenbt69Le/zddQ1KRD6lmKa9AsaYB8sajDGmX1kfq1RNd+bMGZYvX05ycjJNva8zcXhfmnYfedt2qVey2HbsIsmXMokMq6XJSTklMDCQYcOG0b17d9asWcP69ev5+uuvGTFiBG3btq3U81OlnYMaUNoDjTHrXBJRMbQGpRRcv36dNUvmsPPQSWrVqsXgwYOJi22H+FnNeTdy8/njioO0aVSbR7pHYIwhOzefAF/vO+xZqZIdP36czz77jNTUVFq3bs2IESOoX79+hR7jrmtQlZmAlFIly8/PZ/vWzaxdvYrsvHzu8U9iwHf/RUDtWwdp9fUW9p3JwNfb6iosIpqcVLlFRkby9NNPs3XrVhISEvj3v/9Nnz59XN7sB6XXoPZQehNfJ1cFVZTWoFRNdebMGT79ZC7nLmTQ0pzgvna1aTD6NxBYF4CvT6Xz588P8e/Hu1InwJecvPzCBKVURbty5QqrVq1iz5491K1bt7DZr7zK0otvVLmPqpQqkxs3bvDFF1+wdetWapmrjPPfScyYHyHt7rtlOy8RTly8xqmL14ltEqLJSblUcHAwY8eOpWvXrnz22WfMnj2bxx57jNatW7vkeDrdhlIe5ptvvuGzpZ+SceUq8fHxDG5yjYC2QyCoPsYY3l6fxI3cfJ4bbH0p5Obl46OJSVWyvLw89uzZQ+diLgS/W2XpxbfBGNNXRK5gNfWJ439jjPs6xytVDV25coUVy5ez/8ABGnCBaSOG0rznrb3zRITD56+SlZtXOL26JiflDt7e3sTFxbn0GKV1kuhr/w92aQRK1XDGGHbu3MmqlZ+TeyObQeYrerdvjHcH6/r11CvZ/GH5QV4Y0prm9YP4/diO+PloUlLVn1ND2IpIV6Av9oSFxphdLo1KqRoiPT2dJUuWcOzYMVrKaUb6biR01K+g43iwm01y8vL54uB5BrRtQPP6QZqcVI3hzIy6rwLjgU/sRe+JyDxjzO9cGplS1Zgxhh07drBq1SoARsWG0DV9I/LwMqgXyYGzl1m9/zzPDm5Nk7qBbPzpIIL83DslglKVzZl3/ESgizEmC0BE/gDsBDRBKVUGjrWmqEZ1eODRqdQNCYH8H4C39ZFcsfccH285wWM9Iwit7a/JSdVIzrzrjwMBQJZ93x846qqAlKqubqk15d1gJGvolp+H1HkeRPjqeDrB/r50bBbC9+6NZkrvSOrp8ESqBiutF1/BNBvZwD4RWWXfHwpsqJzwlKoeMjIyWLJkCUlJSbT0z+DB3LnU7TAMRr4JXl5k5+bxo7lf06FpCP+dHI+/jzf+PjoKhKrZSqtBFVx4tANY6LA8wWXRKFUN7d27l2XLlpGXl8tIn410y9uHjPkLdH6ULccu0j3S4O/jzXtTe9AiNMjd4SrlMUrrZv5+ZQaiVHWTlZXF8uXL2b17N82aNeOhhx6i/r5AiPk/CI3mqyNpPPbOFv76SGce6tKMtuF6RYdSju403cZ0YIUxJqfIuihgCnDcGDPDpREqVQWdOHGChQsXcvnyZQYGHaHffQ/hVb8+9PuhNS8T0Cs6lL+M78zIjk3cHa5SHqm0Jr7vAD8E/iYiF4FUrM4SLYEjwL+MMYtdH6JSVUdeXh5r165l48aN1A/yZhpzaeaVB7mZAPx99WE+3nKCz1/oT71afozr1szNESvluUpr4jsHvAy8LCKRQGMgE/jGGHO9PAcVkReBJ7E6XewBphZ0Y1eqqkpLS2PBggWcO3eOrvWuMvzi//BrNRDGTscE1kOAITENycvPp5a/dhtX6k6c+pQYY45jdTcvNxFpCjwHxBhjMkVkLvAo8F5F7F+pymaMITExkeXLl+Pr68sjnYJo9/Vf4d5fkN/3h/xm2UFq+6fy0vC2xDYJIbZJyJ13qpRyLkG56LiBIpIDBAFn3BSHUuWSnZ3N0qVL2bt3Ly0jmvHQuAkEBwVA/ABo3gMvIPNGHj5eUji4q1LKOZWeoIwxp0XkL8BJrCbDlcaYlUW3E5GngKcAIiIiKjdIpZxw+vRpFixYQHp6OoOaZtPn4pt4eT9EntTmv0mhjKx1vXBwVy8vTUxK3a1KH3VSROoBo7E6WzQBaonI40W3M8ZMN8bEG2PiGzRoUNlhKlUiYwxfffUVM2bMID/3BlPq76Bf8lt4dRgD/sGkXMnirS+OsDjxNIAmJ6XKyJnBYvsArwEt7O0L5oOKKuMxhwDHjDGp9v4/AXoDH5Vxf0pVmmvXrrFo0SKOHDlCu2b1eTDlHwRmZ8EjH7E7uB+dvH1pHOLLZ8/3o1m9QHeHq1SV5kwN6l3gTazpNroD8fb/sjoJ3CMiQWI1yA8GDpRjf0pVihMnTvCf//yHY8eOcf/99zPBdy2BdRvBUwl8lhvPg//ayLpvUgFoXj9IzzcpVU7OnIPKMMYsr6gDGmO2iMh8rBHRc4FdWBcEK+WRjDFs2rSJ1atXU69uHSY99BDhUbEQ+w553gF4+wcxtG4+vxkdS+/oUHeHq1S1IcaY0jewptfwxpoPKrtguTFmp2tDuyk+Pt5s3779zhsqVcGysrJYvHgxBw8eJCayMQ+m/gP/hq1g8iLm70jm/a+OM/fpXgT66cCuSpWViOwwxsQXXe5MDaqn/d/xwQYYVBGBKeWpzp49y7x588jIyGB4hzB67nsFqdMIhv0WgIbB/jQI9ic7N08TlFIucMcEZYy5tzICUcpTGGPYuXMny5cvp1ZQEFPaZdJ8z88hsh/7+v6Do+cDeDAc+rdpQL/WYXquSSkXcaYXXwjwK6C/vWgd8BtjTIYrA1PKHW7cuMFnn33G119/TXR0NA/dN4haH4+Ent+FYb/jzQ8TOXbhGvd1CMfX20uTk1Iu5EwT3wxgLzDBvv8t4H/AWFcFpZQ7pKWlMW/ePFJSUhjQvSP9h9yHl18gVyavxgTUoY63L38e3xkvAV/vSr+EUKkax5kEFW2Medjh/q9FJNFF8SjlFvv27WPJkiX4+PjweP/WRG96FryncGPwbxk7Yy9tGgXz1qSu1Ncp2JWqNM4kqEwR6WuM2QCFF+5mujYspSpHfn4+a9as4auvvqJZ06aMa5ZGyLpnoElX6PV9/Hy8mNa3JVFhtdwdqlI1jjMJ6hngfftclAAXsSYrVKpKu379OgsWLCApKYn4Lp0ZcX0+3ps/Ja/jo7zu9RQjLwXQrQ5M7KFjQSrlDs704ksEOotIHfv+ZVcHpZSrnT17lrlz53LlyhUefPBBujSvDe88D8N/z9XOT/LFWxtpWP8S3VrUd3eoStVYpU35/rgx5iMR+WGR5QAYY950cWxKucTu3bv59NNPCQwMZOrUqTRt2hSAPePWExMVQYiXsOy5fjqpoFJuVtonsKDRPbiYdaUPP6GUB8rLy2PVqlVs2bKFFi1aMG7cOGrXrg3A3tMZPPjuXl4dlc/UPi01OSnlAUqb8v1t++ZqY8xGx3V2Rwmlqoxr164xb948Tpw4Qc+ePRk6dCje3jdHf4htUoc3HurI6LgmboxSKeXImZ+J/wS6OrFMKY90+vRp5s6dy/Xr13nooYfo1KnTbduIiHaGUMrDlHYOqhfWPE0NipyHqoM1eKxSHi8xMZGlS5dSu3Ztpk2bRuPGjd0dklLKSaXVoPyA2vY2juehLgPjXBmUUuWVn5/PqlWr2Lx5My1btmTcuHEEBQW5Oyyl1F0o7RzUOmCdiLxnjDlRiTEpVS5ZWVnMnz+fo0eP0qNHD4YNG3bL+SalVNXgzDmo6yLyZyAWCChYaIwp03QbItIWmOOwKAp41Rjzt7LsTylHaWlpzJ49m0uXLjFq1Ci6devm7pCUUmXkTIL6GCuhjAK+CzwBpJb1gMaYQ0AcgIh4A6eBhWXdn1IFjhw5wvz58/H29mby5Mm0aNHC3SEppcrBmQQVaox5V0Sed2j2W1dBxx8MHNUmRFUexhg2b97MqlWraNiwIY8++ih169Z1d1hKqXJyJkHl2P/PishI4AzQrIKO/ygwq7gVIvIU8BRARIR2/1XFy83NZdmyZSQmJtK+fXvGjBmDn5+OOK5UdSDGlD4ohIiMAr4EmmNd/1QH+LUxZkm5Dizih5XsYo0x50vbNj4+3mzfvr08h1PV0NWrV5kzZw7JyckMGDCAAQMG6ASCSlVBIrLDGBNfdLkzg8UutW9mABU5/ft9wM47JSelinPmzBnmzJlDZmYm48ePJyYmxt0hKaUqWGkX6v6TUsbcM8Y8V85jT6SE5j2lSrN3714WL15MrVq1mDZtGuHh4e4OSSnlAqXVoFzWpiYiQcBQ4GlXHUNVP8YY1q5dy5dffknz5s155JFHqFVLJxJUqroq7ULd9111UGPMdSDUVftX1U9OTg6LFi1i//79xMXFMWrUKL34Vqlq7o7noERkLcU09ZX1Ql2l7tbVq1eZPXs2p0+fZujQofTq1Us7QyhVAzjTzfwlh9sBwMNArmvCUepW58+fZ9asWVy/fp1HHnmEdu3auTskpVQlcaYX344iizZW4IW6SpXom2++YcGCBfj7+zN16lQdiVypGsaZJr76Dne9gG6AdptSLmOMYcuWLaxcuZLw8HAeffRR6tSp4+6wlFKVzJkmvh1Y56AEq2nvGPBtVwalaq78/HyWL1/O9u3badeuHQ899JCODKFUDeVME1/LyghEKcdpMnr37s2QIUO0M4RSNZgzTXwBwPeAvlg1qQ3A/xljslwcm6pBLl26xKxZs7hw4QIPPPAAXbt2dXdISik3c6aJ7wPgCtY4fGCNAPEhMN5VQama5eTJk8yZM4f8/Hwef/xxWrbUSrtSyrkE1dYY09nh/loR+dpVAamaZffu3SxZsoSQkBAee+wxQkP1+m2llMWZBLVLRO4xxmwGEJGewEbXhqWqO2MMCQkJrF+/nhYtWjBhwgSCgoLcHZZSyoM4k6B6ApNF5KR9PwI4ICJ7AGOM6eSy6FS1lJOTw5IlS9i7d68OW6SUKpEzCWqEy6NQNYbjHE6DBw+mT58+2lNPKVUsZ7qZnxCRzkA/e9GXxhg9B6XuWkpKCjNnzuTatWtMmDCB9u3buzskpZQH87rTBiLyPPAx0ND++0hEnnV1YKp6OXLkCO+++y55eXlMnTpVk5NS6o6caeL7NtDTGHMNQET+CGziZrdzpUq1detWVqxYQaNGjZg4caIOW6SUcoozCUqAPIf7efayMhORusA7QAesi3+nGWM2lWefyvPk5+ezYsUKtm3bRtu2bRk7dqwOW6SUcpozCep/wBYRWYiVmEYD75bzuH8HVhhjxomIH6D9i6uZ7Oxs5s+fz5EjR+jVqxdDhgzBy+uOLcpKKVXImU4Sb4pIAtZQRwBTjTG7ynpAEakD9Aem2Pu/Adwo6/6U50lPT2fmzJlcuHCBUaNG0a1bN3eHpJSqgpypQRUQIJ9yNu8BUUAq8D+7d+AO4PmCc1yqaktOTmb27Nnk5uYyadIkoqKi3B2SUqqKcqYX36vA+0A9IAwrsbxSjmP6AF2xBpztAlwDflrMcZ8Ske0isj01NbUch1OVZe/evbz33nv4+fnx5JNPanJSSpWLGGNK30DkANClYPRyEQkEdhpjytRPWETCgc3GmEj7fj/gp8aYkSU9Jj4+3mzfvr0sh1OVwBjD+vXrSUhIICIigkceeUSHLVJKOU1Edhhj4osud6aJ7zgQABRMr+EPHC1rIMaYcyJySkTaGmMOAYOB/WXdn3Kv3NxclixZwp49e+jcuTOjRo3Cx+duWo6VUqp4znyTZAP7RGQVVpfwocAGEfkHgDHmuTIc91ngY7sHXxIwtQz7UG527do15syZw6lTpxg0aBB9+/bVYYuUUhXGmQS10P4rkFDegxpjEoHbqnOq6khNTWXmzJlcvXqV8ePHExMT4+6QlFLVjDPdzN+vjEBU1XH06FHmzZuHr68vU6ZMoWnTpu4OSSlVDenJAnVXtm3bxvLly2nYsCETJ04kJCTE3SEppaopTVDKKfn5+axcuZItW7bQunVrHn74Yfz9/d0dllKqGtMEpe4oOzubBQsWcPjwYe655x6GDh2qwxYppVyuxAQlIp9i9dorljHmQZdEpDxKeno6s2bNIjU1lZEjRxIfr31blFKVo7Qa1F/s/2OBcOAj+/5ErGujVDVXdNii6Ohod4eklKpBSkxQxph1ACLyW2NMf4dVn4rIepdHptxqz549LF68mDp16jBlyhTCwsLcHZJSqoZx5hxUAxGJMsYkAYhIS6CBa8NS7mKMISEhgfXr19OiRQsmTJigwxYppdzCmQT1IpAgIkn2/UjgaZdFpNwmJyeHxYsXs2/fPuLi4hg1ahTe3t7uDkspVUM5c6HuChFpDbSzFx00xmS7NixV2a5evcrs2bM5ffo0Q4YMoXfv3jpskVLKrUrrxTe2hFXRIoIx5hMXxaQq2fnz55k5cyaZmZlMmDCB9u3LNFC9UkpVqNJqUA+Uss4AmqCqgUOHDrFgwQICAgKYOnUqjRs3dndISikFlN6Lb6qIeAHjjDFzKzEmVQmMMWzevJmVK1fSuHFjJk6cSHBwsLvDUkqpQqWegzLG5IvIDwBNUNVIXl4ey5YtY9euXcTExDBmzBh8fX3dHZZSSt3CmV58q0TkJWAO1vTsABhjLrosKuUymZmZzJ07l+PHj9OvXz/uvfde7QyhlPJIziSoafb/7zssM0BUxYejXOnChQvMnDmTjIwMxowZQ+fOnd0dklJKlciZbuYtK/qgInIcuALkAbnFzUWvKtaxY8eYO3cuXl5eTJ48mYiICHeHpJRSpbpjghIRX+AZoGC4owTgbWNMTjmPfa8xJq2c+1BO2LlzJ8uWLSM0NJSJEydSr149d4eklFJ35EwT3/8BvsC/7fvfspc96aqgVMVwnMMpOjqacePGERAQ4O6wlFLKKc4kqO7GGMeTFV+IyNflPK4BVoqIwaqNTS+6gYg8BTwFaHNUGWRmZjJ//nySkpLo2bMnw4YN0zmclFJVijMJKk9Eoo0xRwFEJArr3FF59DHGnBGRhli9BA8aY24ZId1OWtMB4uPjS5yXSt0uLS2NWbNmkZ6ezoMPPkiXLl3cHZJSSt01ZxLUj4G19mCxArQAppbnoMaYM/b/FBFZCPQAdAqPCnDkyBHmz5+Pt7c3TzzxhNY+lVJVVmlj8b0AbATWAa2BtlgJqlyDxYpILcDLGHPFvj0M+E1Z96csBSNDrFq1ioYNGzJx4kRCQkLcHZZSSpVZaTWoZsDfsUYx3w18hZWwTgHlGc28EbDQvjjUB5hpjFlRjv3VeLm5uSxbtozExETat2/PmDFj8PPzc3dYSilVLqWNxfcSgIj4AfFAb6yLdv8rIunGmJiyHNCe+FCvEK0gV69eZc6cOSQnJzNgwAAGDBigI0MopaoFZ85BBQJ1gBD77wywx5VBKeecPXuW2bNnk5mZyfjx44mJKdNvBqWU8kilnYOaDsRijfiwBauJ701jzKVKik2VYt++fSxatIigoCCmTZtGeHi4u0NSSqkKVVoNKgLwBw4Dp4FkIL0SYlKlMMaQkJDA+vXrad68ORMmTKB27druDksppSpcaeegRoh1MiMW6/zTj4AOInIR2GSM+VUlxahs2dnZLFy4kEOHDhEXF8fIkSPx8XGmlVYppaqeO80HZYC9IpIOZNh/o7CuW9IEVYnS0tKYPXs2Fy9eZMSIEfTo0UM7QyilqrXSzkE9h1Vz6gPkYHUx3wTMQDtJVKpDhw7xySef4OPjw+TJk4mMjHR3SEop5XKl1aAigfnAi8aYs5UTjnJkjGHdunWsW7eOJk2aMGHCBL34VilVY5R2DuqHlRmIulVWVhYLFy7km2++0fNNSqkaSb/xPFBqaipz5szh0qVL3HfffXTv3l3PNymlahxNUB7m4MGDLFy4EF9fXyZPnkyLFi3cHZJSSrmFJigP4Xh9k55vUkopTVAeISsri08++YTDhw/r+SallLLpt6CbpaamMnv2bNLT07n//vuJj4/X801KKYUmKLfas2cPn376KX5+fnq+SSmlitAE5QZ5eXl8/vnnbNu2jebNmzNu3Djq1Knj7rCUUsqjuC1BiYg3sB04bYwZ5a44KltGRgbz588nOTmZe+65hyFDhuDt7e3usJRSyuO4swb1PHAAa66pGiEpKYkFCxaQm5vLuHHjiI2NdXdISinlsdySoESkGTASeB2o9iNWGGP48ssvWbt2LQ0aNGDChAmEhYW5OyyllPJo7qpB/Q14GQguaQMReQp4CiAiIqJyonKBzMxMFi5cyOHDh+nYsSOjRo3Cz8/P3WEppZTHq/QEJSKjgBRjzA4RGVjSdsaY6cB0gPj4eFM50VWsM2fOMG/ePC5fvqxdyJVS6i65owbVB3hQRO4HAoA6IvKRMeZxN8TiEsYYduzYwYoVK6hVqxZTp06lWbNm7g5LKaWqlEpPUMaYnwE/A7BrUC9Vp+SUlZXF0qVL2bdvH9HR0YwdO5agoCB3h6WUUlWOXgdVgc6cOcP8+fNJT09n8ODB9OnTR5v0lFKqjNyaoIwxCUCCO2OoCMYYtm7dyqpVq6hVqxZTpkyp0h07lFLKE2gNqpyysrJYsmQJBw4coE2bNowePVqb9JRSqgJogiqH06dPM3/+fC5fvszQoUPp1auXNukppVQF0QRVBsYYNm/ezOrVqwkODtZeekop5QKaoO7S9evXWbJkCYcOHaJdu3Y8+OCDBAYGujsspZSqdjRB3YWkpCQWLlxIZmYmI0aMoEePHtqkp5RSLqIJygl5eXmsWbOGTZs2ERYWxqRJkwgPD3d3WEopVa1pgrqDtLQ0FixYwLlz5+jWrRvDhw/H19fX3WEppVS1pwmqBMYYdu7cyYoVK/D19eWRRx6hXbt27g5LKaVqDE1Qxbh+/TqffvopBw8eJCoqijFjxhAcXOLA60oppVxAE1QRSUlJLFq0iGvXrum1TUop5UaaoGy5ubmsXbuWr776itDQUCZOnEjjxo3dHZZSStVYmqCAc+fOsXDhQlJSUujatSvDhw/XSQWVUsrNanSCys/PZ8OGDaxbt46goCAmTpxImzZt3B2WUkopanCCSktLY9GiRZw+fZrY2Fjuv/9+HeRVKaU8SI1LUAVTY6xevRpfX18efvhhOnTo4O6wlFJKFVGjElR6ejqLFy/m+PHjtG7dmgceeEC7jyullIeq9AQlIgHAesDfPv58Y8yvXHlMYwyJiYmsWLECgAceeIAuXbpo93GllPJg7qhBZQODjDFXRcQX2CAiy40xm111wEWLFrF7925atGjB6NGjqVevnqsOpZRSqoJUeoIyxhjgqn3X1/4zrjxmVFQU4eHh3HPPPVprUkqpKsIt56BExBvYAbQC3jLGbClmm6eApwAiIiLKdbzOnTuX6/FKKaUqn5c7DmqMyTPGxAHNgB4icls3OmPMdGNMvDEmvkGDBpUeo1JKKfdyS4IqYIxJBxKAEe6MQymllOep9AQlIg1EpK59OxAYAhys7DiUUkp5Nnecg2oMvG+fh/IC5hpjlrohDqWUUh7MHb34dgNdKvu4Simlqha3noNSSimlSqIJSimllEfSBKWUUsojiTWwg2cTkVTgRDl3EwakVUA47qRl8AxaBs+gZXC/ioq/hTHmtgteq0SCqggist0YE+/uOMpDy+AZtAyeQcvgfq6OX5v4lFJKeSRNUEoppTxSTUpQ090dQAXQMngGLYNn0DK4n0vjrzHnoJRSSlUtNakGpZRSqgrRBKWUUsojVdkEJSIzRCRFRPY6LOssIptEZI+IfCoidRzWdbLX7bPXB9jLu9n3j4jIP6QSp9y9mzKIiK+IvG8vPyAiP3N4jDvL0FxE1tox7ROR5+3l9UVklYgctv/Xc3jMz+xYD4nIcHeX427LICJDRWSHHesOERlU1crg8LgIEbkqIi9VxTJ42ue6DO8lj/pclxL/ePt+vojEF3mM6z7Pxpgq+Qf0B7oCex2WbQMG2LenAb+1b/sAu4HO9v1QwNu+vRXoBQiwHLjPQ8vwGDDbvh0EHAciPaAMjYGu9u1g4BsgBvgT8FN7+U+BP9q3Y4CvAX+gJXDU3a9FGcrQBWhi3+4AnHbYV5Uog8PjFgDzgJeqWhk88XNdhjJ41Oe6lPjbA22x5u+Ld9jepZ9nl79gLn4yI7n1y/0yNzt+NAf227fvBz4q4cU46HB/IvC2h5ZhIvCp/aEMtd849T2hDEXKsxgYChwCGjs8z4fs2z8Dfuaw/ef2m9hjynGnMhTZVoAL9ge0SpUBGAP8GXgNO0FVpTJ48uf6Lsrg0Z/rgvgd7idwa4Jy6ee5yjbxlWAv8KB9ezzWFzxAG8CIyOcislNEXraXNwWSHR6fbC9zp5LKMB+4BpwFTgJ/McZcxIPKICKRWLWLLUAjY8xZAPt/Q3uzpsAph4cVxOsR5XCyDI4eBnYZY7KpQmUQkVrAT4BfF3l4lSkDHv65drIMHvu5LhJ/SVz6eXbHhIWuNA34h4i8CiwBbtjLfYC+QHfgOrBGRHZg1VaKcne/+5LK0APIA5oA9YAvRWQ11i/4oiq9DCJSG6u56AVjzOVSmptLitft5biLMhRsHwv8ERhWsKiYzTy1DL8G/mqMuVpkm6pUBo/9XN9FGTzyc100/tI2LWZZhX2eq1WCMsYcxP6yEJE2wEh7VTKwzhiTZq/7DOvcz0dAM4ddNAPOVFrAxSilDI8BK4wxOUCKiGwE4oEvcXMZRMQX6838sTHmE3vxeRFpbIw5KyKNgRR7eTI3a4VwM95k3FiOuywDItIMWAhMNsYctRdXpTL0BMaJyJ+AukC+iGTZj68qZfDIz/VdlsHjPtclxF8Sl36eq1UTn4gUNF94Aa8A/7FXfQ50EpEgEfEBBmCd2zkLXBGRe+weJpOx2lzdppQynAQGiaUWcA9WG69by2Af813ggDHmTYdVS4An7NtPOMS0BHhURPxFpCXQGtjqznLcbRlEpC6wDKvtfWPBxlWpDMaYfsaYSGNMJPA34A1jzL+qUhnwwM91GcrgUZ/rUuIviWs/z5V90q0CT97Nwmq3zcHK1t8Gnsc6yfgN8Afszgb29o8D+7DO8fzJYXm8vewo8C/Hx3hSGYDaWL2t9gH7gR97SBn6YlXddwOJ9t/9WCd81wCH7f/1HR7zCzvWQzj07HFXOe62DFg/HK45bJsINKxKZSjy2Ne4tRdflSmDp32uy/Be8qjPdSnxP4T1HZUNnAc+d3iMyz7POtSRUkopj1StmviUUkpVH5qglFJKeSRNUEoppTySJiillFIeSROUUkopj6QJSikXE5FQEUm0/86JyGn79lUR+be741PKU2k3c6UqkYi8Blw1xvzF3bEo5em0BqWUm4jIQBFZat9+Tax5gVaKyHERGSsifxJrPp0V9vAzBXPsrBNrHqrP7WFzlKqWNEEp5TmiscZeHI01ntxaY0xHIBMYaSepfwLjjDHdgBnA6+4KVilXq1aDxSpVxS03xuSIyB7AG1hhL9+DNW9YW6wJElfZo2N7Yw2VpVS1pAlKKc+RDWCMyReRHHPzBHE+1mdVgH3GmF7uClCpyqRNfEpVHYeABiLSC6xpEew5qZSqljRBKVVFGGNuAOOAP4rI11gjTfd2a1BKuZB2M1dKKeWRtAallFLKI2mCUkop5ZE0QSmllPJImqCUUkp5JE1QSimlPJImKKWUUh5JE5RSSimP9P8BUsWYZ+r5wgIAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_projections(table3)\n", - "results2.plot(color='gray', label='model')\n", - "decorate(title='Proportional model, linearly decreasing rate')" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "laughing-cylinder", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# If the net growth rate continues to decrease linearly,\n", - "# world population will peak around 2065 at about 9.8 billion,\n", - "# and then start to decline." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "personalized-parking", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(2100, 12.58671867833247)" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.idxmax(), results.max()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "simple-version", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap09.ipynb b/jupyter/chap09.ipynb deleted file mode 100644 index 87d7b420..00000000 --- a/jupyter/chap09.ipynb +++ /dev/null @@ -1,1378 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "asian-customer", - "metadata": {}, - "source": [ - "# Chapter 9" - ] - }, - { - "cell_type": "markdown", - "id": "gentle-purchase", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "appropriate-burns", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "biblical-murder", - "metadata": {}, - "source": [ - "In this chapter we express the models from previous chapters as\n", - "difference equations and differential equations, solve the equations,\n", - "and derive the functional forms of the solutions. We also discuss the\n", - "complementary roles of mathematical analysis and simulation." - ] - }, - { - "cell_type": "markdown", - "id": "hybrid-retrieval", - "metadata": {}, - "source": [ - "## Recurrence relations\n", - "\n", - "The population models in the previous chapter and this one are simple\n", - "enough that we didn't really need to run simulations. We could have\n", - "solved them mathematically. For example, we wrote the constant growth\n", - "model like this:\n", - "\n", - "```\n", - "results[t+1] = results[t] + annual_growth\n", - "```\n", - "\n", - "In mathematical notation, we would write the same model like this:\n", - "\n", - "$$x_{n+1} = x_n + c$$ \n", - "\n", - "where $x_n$ is the population during year $n$,\n", - "$x_0$ is a given initial population, and $c$ is constant annual growth.\n", - "This way of representing the model is a **recurrence relation**; see\n", - ".\n", - "\n", - "Sometimes it is possible to solve a recurrence relation by writing an\n", - "equation that computes $x_n$, for a given value of $n$, directly; that\n", - "is, without computing the intervening values from $x_1$ through\n", - "$x_{n-1}$." - ] - }, - { - "cell_type": "markdown", - "id": "specified-mexican", - "metadata": {}, - "source": [ - "In the case of constant growth we can see that $x_1 = x_0 + c$, and\n", - "$x_2 = x_1 + c$. Combining these, we get $x_2 = x_0 + 2c$, then\n", - "$x_3 = x_0 + 3c$, and it is not hard to conclude that in general\n", - "\n", - "$$x_n = x_0 + nc$$ \n", - "\n", - "So if we want to know $x_{100}$ and we don't care\n", - "about the other values, we can compute it with one multiplication and\n", - "one addition." - ] - }, - { - "cell_type": "markdown", - "id": "motivated-consumer", - "metadata": {}, - "source": [ - "We can also write the proportional model as a recurrence relation:\n", - "\n", - "$$x_{n+1} = x_n + \\alpha x_n$$ \n", - "\n", - "Or more conventionally as:\n", - "\n", - "$$x_{n+1} = x_n (1 + \\alpha)$$ \n", - "\n", - "Now we can see that\n", - "\n", - "$x_1 = x_0 (1 + \\alpha)$, and $x_2 = x_0 (1 + \\alpha)^2$, and in general\n", - "\n", - "$$x_n = x_0 (1 + \\alpha)^n$$ \n", - "\n", - "This result is a **geometric progression**;\n", - "see . When $\\alpha$ is positive, the factor\n", - "$1+\\alpha$ is greater than 1, so the elements of the sequence grow\n", - "without bound.\n", - "\n", - "Finally, we can write the quadratic model like this:\n", - "\n", - "$$x_{n+1} = x_n + \\alpha x_n + \\beta x_n^2$$ \n", - "\n", - "or with the more\n", - "conventional parameterization like this:\n", - "\n", - "$$x_{n+1} = x_n + r x_n (1 - x_n / K)$$ \n", - "\n", - "There is no analytic solution to\n", - "this equation, but we can approximate it with a differential equation\n", - "and solve that, which is what we'll do in the next section." - ] - }, - { - "cell_type": "markdown", - "id": "decreased-location", - "metadata": {}, - "source": [ - "## Differential equations\n", - "\n", - "Starting again with the constant growth model \n", - "\n", - "$$x_{n+1} = x_n + c$$ \n", - "\n", - "If we define $\\Delta x$ to be the change in $x$ from one time step to the next, we can write: \n", - "\n", - "$$\\Delta x = x_{n+1} - x_n = c$$ \n", - "\n", - "If we define\n", - "$\\Delta t$ to be the time step, which is one year in the example, we can\n", - "write the rate of change per unit of time like this:\n", - "\n", - "$$\\frac{\\Delta x}{\\Delta t} = c$$ \n", - "\n", - "This model is **discrete**, which\n", - "means it is only defined at integer values of $n$ and not in between.\n", - "But in reality, people are born and die all the time, not once a year,\n", - "so a **continuous** model might be more realistic." - ] - }, - { - "cell_type": "markdown", - "id": "covered-defense", - "metadata": {}, - "source": [ - "We can make this model continuous by writing the rate of change in the\n", - "form of a derivative: \n", - "\n", - "$$\\frac{dx}{dt} = c$$ \n", - "\n", - "This way of representing the model is a **differential equation**; see .\n", - "\n", - "We can solve this differential equation if we multiply both sides by\n", - "$dt$: \n", - "\n", - "$$dx = c dt$$ \n", - "\n", - "And then integrate both sides: \n", - "\n", - "$$x(t) = c t + x_0$$\n", - "\n", - "Similarly, we can write the proportional growth model like this:\n", - "\n", - "$$\\frac{\\Delta x}{\\Delta t} = \\alpha x$$ \n", - "\n", - "And as a differential equation\n", - "like this: \n", - "\n", - "$$\\frac{dx}{dt} = \\alpha x$$ \n", - "\n", - "If we multiply both sides by\n", - "$dt$ and divide by $x$, we get \n", - "\n", - "$$\\frac{1}{x}~dx = \\alpha~dt$$ \n", - "\n", - "Now we\n", - "integrate both sides, yielding: \n", - "\n", - "$$\\ln x = \\alpha t + K$$ \n", - "\n", - "where $\\ln$ is the natural logarithm and $K$ is the constant of integration." - ] - }, - { - "cell_type": "markdown", - "id": "underlying-visitor", - "metadata": {}, - "source": [ - "Exponentiating both sides, we have\n", - "\n", - "$$\\exp(\\ln(x)) = \\exp(\\alpha t + K)$$ \n", - "\n", - "The exponential function can be written $\\exp(x)$ or $e^x$. In this book I use the first form because it resembles the Python code.\n", - "\n", - "We can rewrite the previous equation as\n", - "\n", - "$$x = \\exp(\\alpha t) \\exp(K)$$ \n", - "\n", - "Since $K$ is an arbitrary constant,\n", - "$\\exp(K)$ is also an arbitrary constant, so we can write\n", - "\n", - "$$x = C \\exp(\\alpha t)$$ \n", - "\n", - "where $C = \\exp(K)$. There are many solutions\n", - "to this differential equation, with different values of $C$. The\n", - "particular solution we want is the one that has the value $x_0$ when\n", - "$t=0$.\n", - "\n", - "When $t=0$, $x(t) = C$, so $C = x_0$ and the solution we want is\n", - "$$x(t) = x_0 \\exp(\\alpha t)$$ If you would like to see this derivation\n", - "done more carefully, you might like this video:\n", - "." - ] - }, - { - "cell_type": "markdown", - "id": "czech-scratch", - "metadata": {}, - "source": [ - "## Analysis and simulation\n", - "\n", - "Once you have designed a model, there are generally two ways to proceed: simulation and analysis. Simulation often comes in the form of a computer program that models changes in a system over time, like births and deaths, or bikes moving from place to place. Analysis often comes in the form of algebra; that is, symbolic manipulation using mathematical notation.\n", - "\n", - "Analysis and simulation have different capabilities and limitations.\n", - "Simulation is generally more versatile; it is easy to add and remove\n", - "parts of a program and test many versions of a model, as we have done in the previous examples.\n", - "\n", - "But there are several things we can do with analysis that are harder or impossible with simulations:" - ] - }, - { - "cell_type": "markdown", - "id": "embedded-miniature", - "metadata": {}, - "source": [ - "- With analysis we can sometimes compute, exactly and efficiently, a\n", - " value that we could only approximate, less efficiently, with\n", - " simulation. For example, in the quadratic model we plotted growth rate versus population and saw net crossed through zero when the population is\n", - " near 14 billion. We could estimate the crossing point using a\n", - " numerical search algorithm (more about that later). But with the\n", - " analysis in Section xxx, we get the general result that\n", - " $K=-\\alpha/\\beta$.\n", - "\n", - "- Analysis often provides \"computational shortcuts\", that is, the\n", - " ability to jump forward in time to compute the state of a system\n", - " many time steps in the future without computing the intervening\n", - " states.\n", - "\n", - "- We can use analysis to state and prove generalizations about models;\n", - " for example, we might prove that certain results will always or\n", - " never occur. With simulations, we can show examples and sometimes\n", - " find counterexamples, but it is hard to write proofs.\n", - "\n", - "- Analysis can provide insight into models and the systems they\n", - " describe; for example, sometimes we can identify regimes of\n", - " qualitatively different behavior and key parameters that control\n", - " those behaviors." - ] - }, - { - "cell_type": "markdown", - "id": "impressive-planning", - "metadata": {}, - "source": [ - "When people see what analysis can do, they sometimes get drunk with\n", - "power, and imagine that it gives them a special ability to see past the veil of the material world and discern the laws of mathematics that govern the universe. When they analyze a model of a physical system, they talk about \"the math behind it\" as if our world is the mere shadow of a world of ideal mathematical entities (I am not making this up; see .).\n", - "\n", - "This is, of course, nonsense. Mathematical notation is a language\n", - "designed by humans for a purpose, specifically to facilitate symbolic\n", - "manipulations like algebra. Similarly, programming languages are\n", - "designed for a purpose, specifically to represent computational ideas\n", - "and run programs.\n", - "\n", - "Each of these languages is good for the purposes it was designed for and less good for other purposes. But they are often complementary, and one of the goals of this book is to show how they can be used together." - ] - }, - { - "cell_type": "markdown", - "id": "graduate-conducting", - "metadata": {}, - "source": [ - "## Analysis with WolframAlpha\n", - "\n", - "Until recently, most analysis was done by rubbing graphite on wood\n", - "pulp, a process that is laborious and error-prone. A useful\n", - "alternative is symbolic computation. If you have used services like\n", - "WolframAlpha, you have used symbolic computation.\n", - "\n", - "For example, if you go to and type\n", - "\n", - "```\n", - "df(t) / dt = alpha f(t)\n", - "```\n", - "\n", - "WolframAlpha infers that `f(t)` is a function of `t` and `alpha` is a\n", - "parameter; it classifies the query as a \"first-order linear ordinary\n", - "differential equation\\\", and reports the general solution:\n", - "\n", - "$$f(t) = c_1 \\exp(\\alpha t)$$ \n", - "\n", - "If you add a second equation to specify\n", - "the initial condition:\n", - "\n", - "```\n", - "df(t) / dt = alpha f(t), f(0) = p_0\n", - "```\n", - "\n", - "WolframAlpha reports the particular solution:\n", - "\n", - "$$f(t) = p_0 \\exp(\\alpha t)$$\n", - "\n", - "WolframAlpha is based on Mathematica, a powerful programming language\n", - "designed specifically for symbolic computation." - ] - }, - { - "cell_type": "markdown", - "id": "beginning-tamil", - "metadata": {}, - "source": [ - "## Analysis with SymPy\n", - "\n", - "Python has a library called SymPy that provides symbolic computation\n", - "tools similar to Mathematica. They are not as easy to use as\n", - "WolframAlpha, but they have some other advantages.\n", - "\n", - "Before we can use SymPy, we have to import it:" - ] - }, - { - "cell_type": "markdown", - "id": "civic-payday", - "metadata": {}, - "source": [ - "SymPy defines a `Symbol` object that represents symbolic variable names,\n", - "functions, and other mathematical entities.\n", - "\n", - "The `symbols` function takes a string and returns `Symbol` objects. So\n", - "if we run this assignment:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "flush-balance", - "metadata": {}, - "outputs": [], - "source": [ - "from sympy import symbols\n", - "\n", - "t = symbols('t')" - ] - }, - { - "cell_type": "markdown", - "id": "faced-praise", - "metadata": {}, - "source": [ - "Python understands that `t` is a symbol, not a numerical value. If we\n", - "now run" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ancient-anderson", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle t + 1$" - ], - "text/plain": [ - "t + 1" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr = t + 1\n", - "expr" - ] - }, - { - "cell_type": "markdown", - "id": "industrial-confidence", - "metadata": {}, - "source": [ - "Python doesn't try to perform numerical addition; rather, it creates a\n", - "new `Symbol` that represents the sum of `t` and `1`. We can evaluate the\n", - "sum using `subs`, which substitutes a value for a symbol. This example\n", - "substitutes 2 for `t`:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "familiar-oakland", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle 3$" - ], - "text/plain": [ - "3" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "id": "progressive-celebration", - "metadata": {}, - "source": [ - "Functions in SymPy are represented by a special kind of `Symbol`:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "incomplete-sleep", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "f" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sympy import Function\n", - "\n", - "f = Function('f')\n", - "f" - ] - }, - { - "cell_type": "markdown", - "id": "legislative-dispatch", - "metadata": {}, - "source": [ - "Now if we write `f(t)`, we get an object that represents the evaluation of a function, $f$, at a value, $t$. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "inside-sally", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)}$" - ], - "text/plain": [ - "f(t)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "id": "interior-index", - "metadata": {}, - "source": [ - "But again SymPy doesn't actually\n", - "try to evaluate it." - ] - }, - { - "cell_type": "markdown", - "id": "indian-trout", - "metadata": {}, - "source": [ - "## Differential equations in SymPy\n", - "\n", - "SymPy provides a function, `diff`, that can differentiate a function. We can apply it to `f(t)` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "requested-program", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)}$" - ], - "text/plain": [ - "Derivative(f(t), t)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sympy import diff\n", - "\n", - "dfdt = diff(f(t), t)\n", - "dfdt" - ] - }, - { - "cell_type": "markdown", - "id": "treated-commissioner", - "metadata": {}, - "source": [ - "The result is a `Symbol` that represents the derivative of `f` with\n", - "respect to `t`. But again, SymPy doesn't try to compute the derivative\n", - "yet.\n", - "\n", - "To represent a differential equation, we use `Eq`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "incomplete-parker", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)}$" - ], - "text/plain": [ - "Eq(Derivative(f(t), t), alpha*f(t))" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sympy import Eq\n", - "\n", - "alpha = symbols('alpha')\n", - "eq1 = Eq(dfdt, alpha*f(t))\n", - "eq1" - ] - }, - { - "cell_type": "markdown", - "id": "concerned-asthma", - "metadata": {}, - "source": [ - "The result is an object that represents an equation. Now\n", - "we can use `dsolve` to solve this differential equation:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "described-overhead", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{\\alpha t}$" - ], - "text/plain": [ - "Eq(f(t), C1*exp(alpha*t))" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sympy import dsolve\n", - "\n", - "solution_eq = dsolve(eq1)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "id": "inside-medicine", - "metadata": {}, - "source": [ - "The result is the **general\n", - "solution**, which still contains an unspecified constant, $C_1$. To get the **particular solution** where $f(0) = p_0$, we substitute `p_0` for `C1`. First, we have to create two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "material-voice", - "metadata": {}, - "outputs": [], - "source": [ - "C1, p_0 = symbols('C1 p_0')" - ] - }, - { - "cell_type": "markdown", - "id": "serious-license", - "metadata": {}, - "source": [ - "Now we can perform the substitution:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "supposed-domestic", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = p_{0} e^{\\alpha t}$" - ], - "text/plain": [ - "Eq(f(t), p_0*exp(alpha*t))" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = solution_eq.subs(C1, p_0)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "id": "modern-raleigh", - "metadata": {}, - "source": [ - "The result is called the **exponential growth curve**; see\n", - "." - ] - }, - { - "cell_type": "markdown", - "id": "negative-chance", - "metadata": {}, - "source": [ - "## Solving the quadratic growth model" - ] - }, - { - "cell_type": "markdown", - "id": "arabic-victorian", - "metadata": {}, - "source": [ - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "political-chinese", - "metadata": {}, - "outputs": [], - "source": [ - "r, K = symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "id": "virtual-temperature", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "lined-queen", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = r \\left(1 - \\frac{f{\\left(t \\right)}}{K}\\right) f{\\left(t \\right)}$" - ], - "text/plain": [ - "Eq(Derivative(f(t), t), r*(1 - f(t)/K)*f(t))" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", - "eq2" - ] - }, - { - "cell_type": "markdown", - "id": "relative-zoning", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "printable-typing", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" - ], - "text/plain": [ - "Eq(f(t), K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1))" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution_eq = dsolve(eq2)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "id": "convertible-simple", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "final-treatment", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" - ], - "text/plain": [ - "K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1)" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "markdown", - "id": "phantom-melbourne", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "freelance-admission", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{K e^{C_{1} K}}{e^{C_{1} K} - 1}$" - ], - "text/plain": [ - "K*exp(C1*K)/(exp(C1*K) - 1)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "at_0 = general.subs(t, 0)\n", - "at_0" - ] - }, - { - "cell_type": "markdown", - "id": "precise-radar", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "orange-glasgow", - "metadata": {}, - "outputs": [], - "source": [ - "from sympy import solve\n", - "\n", - "solutions = solve(Eq(at_0, p_0), C1)" - ] - }, - { - "cell_type": "markdown", - "id": "periodic-bikini", - "metadata": {}, - "source": [ - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "expensive-palace", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(list, 1)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "worthy-sleeve", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\log{\\left(- \\frac{p_{0}}{K - p_{0}} \\right)}}{K}$" - ], - "text/plain": [ - "log(-p_0/(K - p_0))/K" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "markdown", - "id": "lightweight-pickup", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "aggressive-queue", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle - \\frac{K p_{0} e^{r t}}{\\left(K - p_{0}\\right) \\left(- \\frac{p_{0} e^{r t}}{K - p_{0}} - 1\\right)}$" - ], - "text/plain": [ - "-K*p_0*exp(r*t)/((K - p_0)*(-p_0*exp(r*t)/(K - p_0) - 1))" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = general.subs(C1, value_of_C1)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "id": "electric-albania", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a function that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "funded-tolerance", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{K p_{0} e^{r t}}{K + p_{0} e^{r t} - p_{0}}$" - ], - "text/plain": [ - "K*p_0*exp(r*t)/(K + p_0*exp(r*t) - p_0)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular.simplify()" - ] - }, - { - "cell_type": "markdown", - "id": "scenic-preparation", - "metadata": {}, - "source": [ - "This function is called the **logistic growth curve**; see\n", - ". In the context of growth models, the\n", - "logistic function is often written like this:\n", - "\n", - "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", - "\n", - "where $A = (K - p_0) / p_0$." - ] - }, - { - "cell_type": "markdown", - "id": "burning-sherman", - "metadata": {}, - "source": [ - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "institutional-finish", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{K - p_{0}}{p_{0}}$" - ], - "text/plain": [ - "(K - p_0)/p_0" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A = (K - p_0) / p_0\n", - "A" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "noble-auditor", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{K}{1 + \\frac{\\left(K - p_{0}\\right) e^{- r t}}{p_{0}}}$" - ], - "text/plain": [ - "K/(1 + (K - p_0)*exp(-r*t)/p_0)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from sympy import exp\n", - "\n", - "logistic = K / (1 + A * exp(-r*t))\n", - "logistic" - ] - }, - { - "cell_type": "markdown", - "id": "brave-conditions", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "industrial-administrator", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle 0$" - ], - "text/plain": [ - "0" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(particular - logistic).simplify()" - ] - }, - { - "cell_type": "markdown", - "id": "therapeutic-topic", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "id": "cutting-access", - "metadata": {}, - "source": [ - "If you would like to see this differential equation solved by hand, you might like this video: " - ] - }, - { - "cell_type": "markdown", - "id": "outstanding-launch", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this chapter we wrote the growth models from the previous chapters in terms of difference and differential equations.\n", - "\n", - "What I called the constant growth model is more commonly called **linear growth** because the solution is a line. If we model time as continuous, the solution is\n", - "\n", - "$$f(t) = p_0 + \\alpha t$$\n", - "\n", - "where $\\alpha$ is the growth rate.\n", - "\n", - "Similarly, the proportional growth model is usually called **exponential growth** because the solution is exponential:\n", - "\n", - "$$f(t) = p_0 \\exp{\\alpha t}$$\n", - "\n", - "Finally, the quadratic growth model is called **logistic growth** because the solution is the logistic function:\n", - "\n", - "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", - "\n", - "where $A = (K - p_0) / p_0$." - ] - }, - { - "cell_type": "markdown", - "id": "adjacent-tracy", - "metadata": {}, - "source": [ - "I avoided these terms until now because they are based on results we had not derived yet." - ] - }, - { - "cell_type": "markdown", - "id": "offshore-passage", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "ideal-ecology", - "metadata": {}, - "source": [ - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "internal-knock", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "alpha, beta = symbols('alpha beta')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "smooth-sunglasses", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)} + \\beta f^{2}{\\left(t \\right)}$" - ], - "text/plain": [ - "Eq(Derivative(f(t), t), alpha*f(t) + beta*f(t)**2)" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "eq3 = Eq(diff(f(t), t), alpha*f(t) + beta*f(t)**2)\n", - "eq3" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "fundamental-arlington", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" - ], - "text/plain": [ - "Eq(f(t), alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t)))))" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "solution_eq = dsolve(eq3)\n", - "solution_eq" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "desirable-alpha", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" - ], - "text/plain": [ - "alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t))))" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "coupled-grounds", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "at_0 = general.subs(t, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "looking-ground", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\log{\\left(\\frac{\\beta p_{0}}{\\alpha + \\beta p_{0}} \\right)}}{\\alpha}$" - ], - "text/plain": [ - "log(beta*p_0/(alpha + beta*p_0))/alpha" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "solutions = solve(Eq(at_0, p_0), C1)\n", - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "anticipated-paragraph", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\alpha p_{0} e^{\\alpha t}}{\\alpha - \\beta p_{0} e^{\\alpha t} + \\beta p_{0}}$" - ], - "text/plain": [ - "alpha*p_0*exp(alpha*t)/(alpha - beta*p_0*exp(alpha*t) + beta*p_0)" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "particular = general.subs(C1, value_of_C1)\n", - "particular.simplify()" - ] - }, - { - "cell_type": "markdown", - "id": "residential-spanking", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap10.ipynb b/jupyter/chap10.ipynb deleted file mode 100644 index e404b395..00000000 --- a/jupyter/chap10.ipynb +++ /dev/null @@ -1,656 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "dense-storm", - "metadata": {}, - "source": [ - "# Chapter 10" - ] - }, - { - "cell_type": "markdown", - "id": "confused-bargain", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "inner-scott", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "thirty-medication", - "metadata": {}, - "source": [ - "# Case studies\n", - "\n", - "This chapter presents case studies where you can practice the tools we have learned so far." - ] - }, - { - "cell_type": "markdown", - "id": "industrial-mercy", - "metadata": {}, - "source": [ - "## Prehistoric World Population\n", - "\n", - "On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "usual-penguin", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "thick-lincoln", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pandas import read_html\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "id": "disciplinary-chosen", - "metadata": {}, - "source": [ - "Select `tables[1]`, which is the second table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "conscious-orange", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    -10000NaNNaNNaN2M[24]NaNNaN4.01–10MNaNNaN
    -9000NaNNaNNaN4.NaNNaNNaNNaNNaNNaN
    -80005.NaNNaN5.NaNNaNNaNNaN5–10MNaN
    -7000NaNNaNNaN8.NaNNaNNaNNaNNaNNaN
    -6000NaNNaNNaN11.NaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "-10000 NaN \n", - "-9000 NaN \n", - "-8000 5. \n", - "-7000 NaN \n", - "-6000 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "-10000 NaN \n", - "-9000 NaN \n", - "-8000 NaN \n", - "-7000 NaN \n", - "-6000 NaN \n", - "\n", - " Maddison (2008)[17] HYDE (2010)[citation needed] Tanton (1994)[18] \\\n", - "Year \n", - "-10000 NaN 2M[24] NaN \n", - "-9000 NaN 4. NaN \n", - "-8000 NaN 5. NaN \n", - "-7000 NaN 8. NaN \n", - "-6000 NaN 11. NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "-10000 NaN 4.0 1–10M \n", - "-9000 NaN NaN NaN \n", - "-8000 NaN NaN NaN \n", - "-7000 NaN NaN NaN \n", - "-6000 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "-10000 NaN NaN \n", - "-9000 NaN NaN \n", - "-8000 5–10M NaN \n", - "-7000 NaN NaN \n", - "-6000 NaN NaN " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table1 = tables[1]\n", - "table1.head()" - ] - }, - { - "cell_type": "markdown", - "id": "hungry-monster", - "metadata": {}, - "source": [ - "Not all researchers provide estimates for the same dates.\n", - "\n", - "Again, we'll replace the long column names with more convenient abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "thick-blanket", - "metadata": {}, - "outputs": [], - "source": [ - "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", - " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" - ] - }, - { - "cell_type": "markdown", - "id": "substantial-implement", - "metadata": {}, - "source": [ - "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "ranking-prescription", - "metadata": {}, - "outputs": [], - "source": [ - "for col in table1.columns:\n", - " table1[col] = pd.to_numeric(table1[col], errors='coerce')" - ] - }, - { - "cell_type": "markdown", - "id": "amazing-difference", - "metadata": {}, - "source": [ - "Here are the results. Notice that we are working in millions now, not billions." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "metallic-offense", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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hCWqOiAzM5O33nqLk08+mdmzZ9O5c+dq9x89ejSTJk2qdp9QevbZZ/nHP/5B3759yc3Njdh5jTF1R7i/B1XdZLFbgLHAWPf7TOlAAfCTqoZkVF805L23hqJNe2tcT0LLBiSf2bHK7RkZGaxfvx5V5e233+bcc88t2/bvf/+byZMnk5CQwAMPPFDpjOaPP/44GRkZjBo1ilWrVjF+/HhefvnlSieMfeSRR3jvvffo168fPp+P4uJiTj75ZBYsWAA4ye/RRx+lQ4f93w7wer3MmjWLfv36kZqaWm1bN2zYwBVXXEFxcTE9e/bk2WefZcqUKbz77rsUFhaybds23nnnHVq2bMmUKVN48cUX8fl8PPzww5xyyimMGTOGNWvWICK88sortGvX7hDfbWNMLNLi8M7FF1Stqpqtql+o6tLanJwibdCgQcybN4+cnBzS09MByMnJ4cUXX2T+/PnMmzePoUOHAvDGG2+UXeKbMWMGo0ePZvr06WXbRo8ezQcffFA2YeyECROYMGECW7Zs4eOPP+bzzz/npptuYvv27Xi9Xvr06cPixYvZtWsXO3bsKJecAFJSUvjvf//Lp59+etB2TJgwgbFjxzJ//nwKCgqYO3cuAMnJyXzwwQdce+21zJgxg99++43XX3+defPmMXv2bMaPH09xcTErV65k3rx5zJs3j7Zt24bwHTbGRFMszMVXp1TX6wm1kSNHMnr0aC6//PKysrVr19KnTx+8XufWXmnvqbJLfLm5uezZs4fZs2dz11138be//e2ACWOzs7M59thjERG6dOlCkyZNALj88suZOnUqvXr1YuTIkeXqXbhwIYWFhcycOZOzzz6bjIwMbrzxRj744AM8Hs8B7VizZg39+/cHYMCAAaxevRqPx0OfPn0AaNOmDV999RVr165lxYoVZdMx5eTk4PV6ufnmm7nqqqto0qQJDz/8MA0bNgzF22uMibLSUXzhetyGPS0vjDp37szgwYM5//zzy8o6dOjA0qVLKSkpAZyHFlblrLPO4tFHH6Vr1654vV66devGqFGjyMrKYu7cubz00ku0a9eOZcuWoaqsXr2anTt3AtC/f3++//57pk2bxqhRo8rVu2vXLrZs2UJqairTpk3jvPPO49RTT600OQF06tSJRYsWAfDVV1+V3U8LnKhWVenQoQPHHnssc+bMISsri6VLl+Lz+bjg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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "table1.plot()\n", - "decorate(xlim=[-10000, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='Prehistoric population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "id": "human-conservation", - "metadata": {}, - "source": [ - "We can use `xlim` to zoom in on everything after Year 0." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "solar-action", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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eEtErgQ2AxcCqOoKEXkLWImvBeANqupx1rsOmAHEAZ86ryPy50V/ZnX26iPdzH6Obn00dw67s8blJk6cyIMPPsjYsWNZtmwZU6dO5ZtvvvFt4+ijmT9/PpGRkcyePZt77rmHd955h3/+8580adKEZcuWsWzZMn83SNu3b2fatGksWbKEFi1aMGbMGAYNGnTQPh999FE2btxITEwMOTk5AEybNo1Bgwbx3nvv8dVXX3HFFVeQlpYGwOrVq5k7dy55eXn07duX6667jqioqNo5UcYYE4CgJShVXUDl948ATq5inUeARyopXwwMOHiN+iklJYWMjAxef/11zjzzzP3m5ebmMmnSJNauXYuIUFbmG9Vy/vz53Hzzzf71U1JSAPjhhx8YPXo05ffcJkyYwJo1ayrd56WXXso555zDOeecA8CCBQt45513ADjppJPIysoiNzcXgLPOOouYmBhiYmJo164dO3fupHPnzgdt1xhjgqXGBCUiQ4CRQEegCEgHZqtqdpBjC6pAajrBNG7cOG6//XbmzZtHVtavI1b+4Q9/YMyYMbz77rtkZGQwevRo/7xAxpKqyscff8z8+fP54IMPeOihh1ixYgW+VvuVbysmJsZf5nK5bIRfY0ydq/IelIhMFpGfgLvxXVr7BV+DhhOAL0Vkpoh0rZswG56pU6dy//33k5ycvF95bm6uv9FExc5jR40axaxZswBIT0/33y869thj/UmurKyM//73vwfty+v1smXLFsaMGcNjjz1GTk4O+fn5+21z3rx5JCQk0Lx56AYnM8aYiqqrQcUDI1S1qLKZIpKKryHD5iDE1eB17tyZW2655aDyO+64g0mTJvHEE09w0kkn+cuvu+46pkyZQkpKCqmpqQwbNgyAxMREpk+fznHHHUdiYiKDBw/G4/Hst02Px8Nll11Gbm4uqsptt91Gy5YtmT59un+bTZo0YebMmRhjTLiQyi7zNARDhgzRA58TWrVqFf369QtRRKYu2HdsTGiJyBJVHVIb26qxmbmIPCYizUUkSkTmiMgeEbmsNnZujDHGVCWQ56BOdXqAGIvvodk+wO+DGpUxxpiQ+cO3f+DD9R+GOoyAElT5wy9nAq/X99Z7xhhjqpZfms97695ja/7WUIcS0HNQH4rIanxNzK8XkbZAcXDDMsYYEwors1YCMCAh9I+e1liDUtW7gOOAIapaBhTgGxrDGGNMA5OelQ5A/zb9QxxJ4D1J9AO6i0jF5a2bbGOMaWBW7FlBp6adaBXbquaFgyyQVnyvAI/je0B3qPOqlSaEjVHTpk33+1w+PMYXX3zBcccd5+/dwePxkJqaynfffcf06dPp1KkTqamp9O7dm/POO4+VK1f6tzF69Gj69u1LamoqqampXHDBBXV6TMaYhmNF1oqwqD1BYI0khuB7YPd6Vb3Jed0c7MAam1NPPZVu3brxwgsvAPD3v/+doUOHcvzxxwNw2223kZaWxtq1a5kwYQInnXQSFQdlnDVrFmlpaaSlpfH222+H5BiMMfVbdnE2W/O30j+h/iSodKBDsAMx8OSTT/KnP/2JFStW8Mwzz/DnP/+50uUmTJjAqaeeymuvvVbHERpjGrI9RXs4quVRJCck17xwHQjkHlQCsFJEFgEl5YWqOi5oUdWBHX/8IyWrane4jZh+R9PhnnuqXaaoqIjU1FT/5+zsbMaN853KxMREbr31Vo477jiefvppWrduXeV2Bg8ezOrVv8Z/6aWXEhcXB8App5zCX/7ylyM4EmNMY9SnVR/eHf9uqMPwCyRBTQ92EI1JXFycf8wl8N2Dqtgl0w033MBdd93F5MmTq93OgV1UzZo1iyFD7NagMeYIlORDdDwEMEJCXagxQanq1yLSHl/jCPCNcrurunXqg5pqOqESERER0PAZP//8syUkY0ztev962LsJrvk61JEAgbXiuwhYhG/k24uAH0TEmomF0DvvvMMXX3yx31DxxhhzxLb+DK17hjoKv0Au8d0LDC2vNTk9ScwGrKlYHXryySd59dVXKSgoYMCAAXz11Vf+UXRh/3tQCQkJzJ49O1ShGmPqo4I9kLsZhl0V6kj8ahxuQ0SWq2pyhc8RwNKKZeHIhttonOw7NuYwrf0SZl0Akz+G7icc9mZqc7iNQGpQn4nI58DrzucJwCe1sXNjjDFhYutPgEDiwFBH4hdII4nfi8j5wAhAgOdUNXzaIRpjjDly236ChD4Q0yzUkfgF1Befqr4DvBPkWIwxxoSCKmz7GXqdFOpI9lNlghKRBap6gojkARVvVAmgqto86NEZY4wJvn3bIH8ndBwU6kj2U2WCUtUTnPfwqe8ZY4ypfdt+8r13HBzaOA5QXQ2q6n52ABtZ1xhjGojdqyEiEjqEfpDCiqq7B7UE36W9yro1UCB8nuaqJ7Kysjj55JMB2LFjBy6Xy/8s06JFi4iOjq5xGxkZGXz33XdccsklQY3VGNN4lPW7AXfTC4klptIf/FCp7hJfj7oMpDFo06aNvx++6dOn07RpU26//fZD2kZGRgavvfaaJShjTK0pWraHfV9uoWP/LmGVoKrs6khEBlf3qssgG7Lnn3+eoUOHMnDgQM4//3wKCwsBmDx5MjfffDPHH388PXv29I/xdNddd/HNN9+QmprKk08+SXFxMVOmTCE5OZlBgwYxd+5cwNcJ7Xnnncfpp59O7969ueOOO0J2jMaY8Fa2swBX61giYlyhDmU/1V3i+2s18xQIr/aIh+ibt9awZ0t+rW4zoUtTRl7U55DWOe+887jqKl/XIvfddx8vvPACN910EwDbt29nwYIFrF69mnHjxnHBBRfw6KOP8vjjj/PRRx8B8Ne/+r6m5cuXs3r1ak499VTWrFkDQFpaGj///DMxMTH07duXm266iS5dutTW4RpjGoiynYVEtW8S6jAOUt0lvjF1GUhjlZ6ezn333UdOTg75+fmcdtpp/nnnnHMOERERJCUlsXPnzkrXX7BggT+hHX300XTr1s2foE4++WRatGgBQFJSEps2bbIEZYzZj7q9uHcXEdev2nZxIVFdK76TVPUrETmvsvmq+r/ghRV8h1rTCZbJkyfz3nvvMXDgQGbMmMG8efP882JiYvzTVfWZWF1fihXXd7lcuN3uIw/YGNOguLOKwKtEtY8PdSgHqW64jROd97MreY0NclyNRl5eHomJiZSVlTFr1qwal2/WrBl5eXn+z6NGjfKvt2bNGjZv3kzfvn2DFq8xpmEp2+G77x1Zzy7xTXPep9RdOI3PQw89xLHHHku3bt1ITk7eL/lUJiUlhcjISAYOHMjkyZO5/vrrufbaa0lOTiYyMpIZM2bsV3MyxpjqlO0sgAiIaht+CSqQ4TZaAlcA3amQ0FT15mAGdqRsuI3Gyb5jYw7NnpdX4t5dSIf/q50RumtzuI0aR9TFN7RGd2A5vod3y1/VEpEXRWSXiKRXKJsuIltFJM15nVlh3t0isk5EfhGR0yqUHyMiy515T0sg46EbY4wJiHtnAVEdwu/+EwTWm3msqv7uMLY9A3gGePmA8idV9fGKBSKSBEwE+gMdgdki0kdVPcA/gauB7/Ely9OBTw8jHmOMMRV4Sz24s4tpMqhdqEOpVCA1qFdE5CoRSRSR1uWvmlZS1flAoP31jQfeUNUSVd0IrAOGiUgi0FxVF6rvWuTLwDkBbtMYY0w13LsKQSEyDFvwQWAJqhT4C7CQXy/vLa52jerdKCLLnEuArZyyTsCWCstkOmWdnOkDyyslIleLyGIRWbx79+4jCNEYYxq+sp2+FnxRHcKvgQQElqB+Bxylqt1VtYfzOtyOYv8J9AJSge382ltFVR3SVlVeKVV9TlWHqOqQ8k5YjTHGVK5sZyG4hMjWcaEOpVKBJKgVQGFt7ExVd6qqR1W9wPPAMGdWJlCxi4POwDanvHMl5cYYY46Qe2cBUe2aIK7wbHsWSILyAGki8m+nFd3TIvL04ezMuadU7lygvIXfB8BEEYkRkR5Ab2CRqm4H8kRkuNN67wrg/cPZd7hwuVykpqYycOBABg8ezHfffQfAtm3buOCCCw5pWxkZGQwYEF7jtxhj6o+yHeHZB1+5QFrxvee8DomIvA6MBhJEJBOYBowWkVR8l+kygGsAVHWFiLwFrATcwA1OCz6A6/C1CIzD13qvXrfgi4uL8w+58fnnn3P33Xfz9ddf07FjR3+P5RW53W4iIwP5mowxJnDeYjee3BIiw7SJOQSQoFR15uFsWFUvrqT4hWqWfwR4pJLyxUCDrCbs27ePVq187UQyMjIYO3Ys6enpzJgxg48//pji4mIKCgr44IMPGD9+PHv37qWsrIyHH36Y8ePHA74ENmnSJH7++Wf69OnDyy+/TJMmTViyZAm/+93vyM/PJyEhgRkzZpCYmMjo0aM59thjmTt3Ljk5ObzwwguMHDkylKfBGBMC/gYS9bEGJSIfAs8Bn6lq2QHzegKTgQxVfTGoEQbJ3BnPsWvThlrdZrtuPRkz+epqlykqKiI1NZXi4mK2b9/OV199VelyCxcuZNmyZbRu3Rq32827775L8+bN2bNnD8OHD2fcuHEA/PLLL7zwwguMGDGCqVOn8o9//INbbrmFm266iffff5+2bdvy5ptvcu+99/Lii76vyu12s2jRIj755BMeeOABZs+eXavnwRgT/sp2FgCEZSex5aqrQV2FrwXfUyKSDewGYoEe+J5TekZV6/X9oFCoeIlv4cKFXHHFFaSnpx+03CmnnELr1r7HzVSVe+65h/nz5xMREcHWrVv9w2906dKFESNGAHDZZZfx9NNPc/rpp5Oens4pp5wCgMfjITHx19t/553n66D+mGOOISMjI1iHaowJY+4dhUi0C1fL8O27s7rOYncAdwB3iEh3IBEoAtaoaq206gulmmo6deG4445jz549VPbMVnz8r3/VzJo1i927d7NkyRKioqLo3r07xcXFABzY85OIoKr079+fhQsXVrrf8s5kbQgOYxqvsp0FRLVvgkSEZws+CKwVH6qa4fTmkNYQklO4WL16NR6PhzZt2lS7XG5uLu3atSMqKoq5c+eyadMm/7zNmzf7E9Hrr7/OCSecQN++fdm9e7e/vKysjBUrVgTvQIwx9U7ZzsKwHGKjImseVsfK70GB79LdzJkzcblc1a5z6aWXcvbZZzNkyBBSU1M5+uij/fP69evHzJkzueaaa+jduzfXXXcd0dHRvP3229x8883k5ubidru59dZb6d+/fzAPzRhTT3jyS/Hml4X1/ScIYLiN+sqG22ic7Ds2pmbF63PY8/xyEq4cQGzvVjWvcAjqergNY4wxDYh7R/i34IMALvGJyAhgOtDNWV4APYL++IwxxoRQ2a5CIppEEtEsKtShVCuQe1AvALfh68XcU8OyxhhjwlzZDl8DiXAf/zWQBJWrqvW6eyFjjDG/cjWPJrJtePZgXlEgCWquiPwF+B9QUl6oqj8FLSpjjDFB0+bS+tGQKJAEdazzXrFVhgIn1X44xhhjjE+NrfhUdUwlL0tOh0lEuPzyy/2f3W43bdu2ZezYsdWu1717d5KTk0lNTSU1NZWbb775iGM5nOE6vv/+ewYOHEhycjKTJk2qcrl58+bVeEzGGFOdQFrxtcA3VMYop+hr4EFVzQ1mYA1VfHw86enpFBUVERcXx5dffkmnTlWOYr+fuXPnkpCQEOQIq3fvvffy1FNPMWbMGDZu3BjSWIwxDVsgz0G9COQBFzmvfcBLwQyqoTvjjDP4+OOPAV/3RBdf/OvIJPn5+UyZMoXk5GRSUlJ45513qtzOqlWrGDZsmP9zRkYGKSkpACxZsoQTTzyRY445htNOO43t27f7ywcOHMhxxx3Hs88+61935MiR/k5sAUaMGMGyZcsO2md0dDSZmZkA9OjRI6Djzc7O5pxzziElJYXhw4f7tzt9+nSmTp3K6NGj6dmzJ08//es4mK+++irDhg0jNTWVa665Bo/Hg8fjYfLkyQwYMIDk5GSefPLJgPZvjKmfArkH1UtVz6/w+QERSQtSPHUm58P1lG4rqNVtRneMp+XZvWpcbuLEiTz44IOMHTuWZcuWMXXqVL755hsAHnroIVq0aMHy5csB2Lt3r3+9MWPG+LtFmjRpErfddhulpaVs2LCBnj178uabb3LRRRdRVlZW5XAbU6ZM4e9//zsnnngiv//97/3b/u1vf8uMGTN46qmnWLNmDSUlJf5kV1GvXr24++676devH0OGBPaw+LRp0xg0aBDvvfceX331FVdccYU/Ga5evZq5c+eSl5dH3759ue6661i3bh1vvvkm3377LVFRUVx//fXMmjWL/v37s3XrVn/v7zk5OQHt3xhTPwVSgyoSkRPKPzgP7hYFL6SGLyUlhYyMDF5//XXOPPPM/ebNnj2bG264wf+5fEBD8F3iS0tLIy0tjdtuuw2Aiy66iLfeeguAN998kwkTJvDLL7/4h9tITU3l4YcfJjMzk9zcXHJycjjxxBMB9rsXduGFF/LRRx9RVlbGiy++yOTJkw+K+/333yc3N5dPP/2USy65hLVr17J7926GDh1a7fEuWLDAv6+TTjqJrKwscnN9V4jPOussYmJiSEhIoF27duzcuZM5c+awZMkShg4dSmpqKnPmzPEn4Q0bNnDTTTfx2Wef0bx580BPuTGmHgqkBnUdMNO5FyVANr7BCuu1QGo6wTRu3Dhuv/125s2bR1ZWlr9cVQ/p4bkJEyZw4YUXct555yEi9O7dm+XLl1c63EZOTk6V227SpAmnnHIK77//Pm+99RYH9mMIviHqTz75ZJKTk3nhhRcYP348F154IRMmTKg2xsr6eyyPo3zoD/h1+A9VZdKkSfzpT386aL2lS5fy+eef8+yzz/LWW2/5B2E0xjQ8gbTiS1PVgUAKkKyqg1R1afBDa9imTp3K/fffT3Jy8n7lp556Ks8884z/c8VLfJXp1asXLpeLhx56yJ8oqhpuo2XLlrRo0YIFCxYAvnGmKvrtb3/LzTffzNChQ/2DJVY0aNAg3nzzTYqLixk5ciTnnnsujzzyyH730CozatQo/77mzZtHQkJCtbWfk08+mbfffptdu3YBvntYmzZtYs+ePXi9Xs4//3weeughfvrJHsUzpiGrbsj3y1T1VRH53QHlAKjqE0GOrUHr3Lkzt9xyy0Hl9913HzfccAMDBgzA5XIxbdo0/wi4Fe9BpaSk8PLLLwO+WtTvf/97f6u66obbeOmll5g6dSpNmjThtNNO22/fxxxzDM2bN2fKlCmVxnzllVeydu1aUlNTadq0KSkpKTz++ONccMEFzJkzhyZNfh1bxu12+2tH06dPZ8qUKaSkpNCkSRNmzpxZ7blJSkri4Ycf5tRTT8Xr9RIVFcWzzz5LXFwcU6ZMwev1AlRawzLGNBxVDrchIteo6r9FZFols1VVHwxuaEfGhts4dNu2bWP06NGsXr2aiIgj6+j+b3/7G1u3buWxxx6rpegCY9+xMaFVm8NtVDfk+7+dydmq+u0BAYyojZ2b8PHyyy9z77338sQTTxxxcrryyitJT0/3N94wxpjDUeOAhSLyk6oOrqks3FgNqnGy79iY0KqTGpSIHAccD7Q94D5Uc6D6McqNMcaYI1RdM/NooKmzTLMK5fuAC4IZlDHGGFPdPaivga9FZIaqbqrDmIwxxpiAHtQtdMaD6g/Elhdaj+bGGGOCKZDmWrOA1UAP4AEgA/gxiDE1WFlZWf7hMjp06ECnTp1ITU2lZcuWJCUlBWWfTZs2BXxNyC+4wK7MGmPqj0ASVBtVfQEoU9WvVXUqMDzIcTVIbdq08feld+2113Lbbbf5Px9p0+6adOzYkbfffjuo+zDGmNoUyK9imfO+XUTOEpFBQOcgxtQoeTwerrrqKvr378+pp55KUZGvP960tDSGDx9OSkoK5557rr/ro9GjR3PbbbcxatQo+vXrx48//sh5551H7969ue+++w7afsXBCWfMmMF5553H6aefTu/evbnjjjv8MVQ2nEV1Mdx5550MGzaMPn36+HtkN8aY2hDIPaiHnY5i/w/4O75m5rcFNao68Omnn7Jjx45a3WaHDh0444wzDmvdtWvX8vrrr/P8889z0UUX8c4773DZZZdxxRVX+IfHuP/++3nggQd46qmnAF+XRvPnz+dvf/sb48ePZ8mSJbRu3ZpevXpx22230aZNmyr3l5aWxs8//0xMTAx9+/blpptuYteuXZUOZ1FdDG63m0WLFvHJJ5/wwAMPMHv27MM6fmOMOVAgncV+pKq5qpruDPd+jKp+UBfBNSY9evQgNTUV8PWJl5GRcdDwGJMmTWL+/Pn+dcaNGwdAcnIy/fv3JzExkZiYGHr27MmWLVuq3d/JJ59MixYtiI2NJSkpiU2bNlU6nEVNMZT3E1geszHG1JbqHtT9O1BlNxOqenNQIqojh1vTCZYDh50ov8QXyDoRERH7rR8REYHb7T6k/bndblq1anXQcBY1jVpbvp3ybRhjTG2p7hLfwQMCmTrVokULWrVqxTfffMPIkSN55ZVX/DWZYNizZw/R0dGcf/759OrVi8mTJ9d5DMYYU666B3WrHxOhBiLyIjAW2KWqA5yy1sCbQHd8zdUvUtW9zry7gSsBD3Czqn7ulB8DzADigE+AW7SmDgQbkJkzZ3LttddSWFhIz549eemll4K2r61bt1Y6nEVdxmCMMeUC6Sx2LpVc6qvpQV0RGQXkAy9XSFCPAdmq+qiI3AW0UtU7RSQJeB0YBnQEZgN9VNUjIouAW4Dv8SWop1X105oOzDqLbZzsOzYmtOqks9gKbq8wHQucD9R4s0FV54tI9wOKxwOjnemZwDzgTqf8DVUtATaKyDpgmIhkAM1VdSGAiLwMnAPUmKCMMcbUbzUmKFVdckDRtyLy9WHur72qbne2u11E2jnlnfDVkMplOmVlzvSB5ZUSkauBqwG6du16mCEaY0w9smcttDkKnNHOG5Iam5mLSOsKrwQROQ3oUMtxVHZmtZrySqnqc6o6RFWHtG3bttaCM8aYsJS/C54bDV89FOpIgiKQS3xL+DVZuIGN+BozHI6dIpLo1J4SgV1OeSbQpcJynYFtTnnnSsqNMcbMe5R9hR6aD7wk1JEERSAP6vZQ1Z7Oe29VPVVVFxzm/j4AJjnTk4D3K5RPFJEYEekB9AYWOZcD80RkuIgIcEWFdYwxpvHavYbCH17l5YxhfDf3h1BHExQ11qBEJBa4HjgBX01qAfBPVS2uYb3X8TWISBCRTGAa8CjwlohcCWwGLgRQ1RUi8hawEl8t7QZV9Tibuo5fm5l/ijWQMMYYmPMA32f3oNSt9Bl+QqijCYpALvG9DOTh64cP4GLgFZzkUhVVvbiKWSdXsfwjwCOVlC8GBgQQZ73gcrlITk6mrKyMyMhIJk2axK233hr03swPNHr0aB5//HGGDKmV1qDGmLq06Tuyl85hafZQkk8+jYQu3UIdUVAEkqD6qurACp/nisjSYAXU0MXFxZGWlgbArl27uOSSS8jNzeWBBx4IeBsejweXyxWkCI0xYU0VvvgD87OPxhUdw/EXXhrqiIImkD/bfxYR//hPInIs8G3wQmo82rVrx3PPPcczzzyDqjJjxgxuvPFG//yxY8cyb948wDfw4P3338+xxx7LwoULefDBBxk6dCgDBgzg6quvpvyB66qGwCgqKmLixImkpKQwYcKEgPr6M8aEoRXvsmXNWtbnNOXYcy7ix49/YNf6raGOKigCqUEdC1whIpudz12BVSKyHFBVTQladEG0Zs1D5OWvqtVtNmvajz59/nBI6/Ts2ROv18uuXbuqXa6goIABAwbw4IMPApCUlMT9998PwOWXX85HH33E2WefDVQ+BMY///lPmjRpwrJly1i2bBmDBw8+jCM0xoSUuxSd/QDzspNo1iaB1h2SuGb9Gs77fjk39qryEdF6K5AEdXrQo2jkAula0OVycf755/s/z507l8cee4zCwkKys7Pp37+/P0FVNgTG/PnzuflmXwf0KSkppKTUy78rjGncFr/Aqk2F7MqP5IxJk3hq+SpW9u7NRV0b5nOfgfQksUlEBgIjnaJvVLXe34M61JpOsGzYsAGXy0W7du2IjIz0d9QKUFz8a0PJ2NhY/32n4uJirr/+ehYvXkyXLl2YPn36fstWNQSGNMAnzY1pNIpyKJv7GN9k96d9z6PIKWrBR93j6VtWytU9O4Y6uqAIpCeJW4BZQDvn9aqI3BTswBqD3bt3c+2113LjjTciInTv3p20tDS8Xi9btmxh0aJFla5XnowSEhLIz8/n7bffrnFfo0aNYtasWQCkp6ezbNmy2jsQY0zwLXiCJVvjyS+G0ROv5A+5Wbhdkfxj6NFENNA/PgO5xHclcKyqFgCIyJ+Bhfza7NwcgqKiIlJTU/3NzC+//HJ+97vfATBixAh69OhBcnIyAwYMqPI+UcuWLbnqqqtITk6me/fuDB06tMb9XnfddUyZMoWUlBRSU1MZNmxYrR6XMSaIcrZQ8M0LLNo7mKOGHstHGwtZ0bYtF5cV0b9V81BHFzSBDLexHBha/mCu8+Duj6qaXAfxHTYbbqNxsu/YNEj/u4Yvv/iZ9NwOjLvvKU7bsps4dyk/nHIsTWKiQx3dfup6uI2XgB9E5F18/fGNB16ojZ0bY4ypwfal7Fn0IctzBpN6+lk8uHYXBc1jmB5H2CWn2hZII4knRGQevq6OAKao6s9BjcoYY4z/odyvs3oTHdeE0oGn8nlOLsO2ZTBxwthQRxd0h9K/jlD1EBjGGGNq27o5ZCxfSsa+ZqSeezF37syieVE+d/XpSmRkIBfA6rdAWvHdj2/021ZAAvCSiNwX7MCMMaZR83rxfnE/X2f1pUW79nzaKomdMZGM3byOYwcPrHn9BiCQGtTF+BpJTFfVacBwoOF2/mSMMeEgIoL0tpexpzCathdO5cWyQvpt28jk4wc3mr44A0lQGUBshc8xwPqgRGOMMQaAdT9+z9wP59C+3wD+WtaM+NISxmZvZ8CABjO4Q40CSVAlwAoRmSEiLwHpQL6IPC0iTwc3vIZnx44dTJw4kV69epGUlMSZZ57JmjVrDvkfXUZGRqP6h2pMY5L2xSd88Nc/ktClK5nnXsWaCC8nrE3jjJNH1/nQPKEUyF22d51XuXnBCaXhU1XOPfdcJk2axBtvvAFAWloaO3fuPKTteDyemhcyxtQ7qsqC12ey6P236Tl4KH2vupW70jbSd/d2hkdoo3vGL5Ah32dW96qLIBuKuXPnEhUVxbXXXusvS01NpUuXLv7PGRkZjBw5ksGDBzN48GC+++47AObNm8eYMWO45JJLSE7e/xnpDRs2MGjQIH788ce6ORBjTK3zuMv49NknWPT+26ScfDrDb7qT61dmElPm4dh1aZx0ysmNrj/Nht9OsQp/WJtJen7tjok0oGkcD/XuXOX89PR0jjnmmGq30a5dO7788ktiY2NZu3YtF198MeU9YixatIj09HR69Ojh76X8l19+YeLEibz00kukpqbW1qEYY+pQSWEBH/z1j2xOX8qICZfT8tRxjP15PdnFpZy5+id6t0ugd+/eoQ6zzjXaBBWuysrKuPHGG0lLS8PlcrFmzRr/vGHDhtGjRw//5927dzN+/Hjeeecd+vfvH4pwjTFHKC97D+/+aTpZW7dw+vW3kZMyjHE/rSW62MudP29kR9FWTj77ikZXe4JGnKCqq+kES//+/WvsefzJJ5+kffv2LF26FK/XS2zsrw0o4+Pj91u2RYsWdOnShW+//dYSlDH10J4tm/jfn6ZTXJDPuXdO46cOPbhl6Qa6lCh3L8pkKSvp3r37fn+YNiZV3oMSkQ9F5IOqXnUZZENx0kknUVJSwvPPP+8v+/HHH9m0aZP/c25uLomJiURERPDKK69U2yAiOjqa9957j5dffpnXXnstqLEbY2rXlpXLeWPaHXg9bi6a9ic+aNmJ61duYmARPPDtJtL0Z1q3ac0FF1zQKGtPUH0jiceBvwIbgSLgeeeVj6+puTlEIsK7777Ll19+Sa9evejfvz/Tp0+nY8dfBxu7/vrrmTlzJsOHD2fNmjUH1ZoOFB8fz0cffcSTTz7J+++/H+xDMMbUkg0//Uh8i1Zc+OBfeKIshj9u2M5ZxS5uX7Ceha6ltGvfjsmTJ9O0adNQhxoygQy3MV9VR9VUFm5suI3Gyb5jU1+o18veggJu2rCbOdn7uLokmpPmr2R+zAoSO3bksssuIy4uLtRhHrK6Hm6jrYj0VNUNzs57AG1rY+fGGNNY7S7zcNnqbaTnF/GApwl95y/l6+iVdOnShUsuuWS/+8+NVSAJ6jZgnohscD53B64JWkTGGNPAFXg8XLJsA+sLS/i3qznxs39kXvQqunfvzsUXX0xMTEyoQwwLgYwH9ZmI9AaOdopWq2pJcMMKHlVttDccG7qaLlcbEw68qtyyajMr8ov4T1wrYj5cyPyo1fTq2YsJEycQHd2wByE8FFUmKBE5r4pZvUQEVf1fkGIKmtjYWLKysmjTpo0lqQZGVcnKyrLLIibsPZmxk49253JXdFMiP/yWBVFr6H1Uby6acBFRUVGhDi+sVFeDOruaeQrUuwTVuXNnMjMz2b17d6hDMUEQGxtL5851/3ybMYH6aFcOf8nYwbh90HvR9yyMWsfRffpywUUXNooBCA9VlWdEVaeISARwgaq+VYcxBU1UVFSjfeDNGFN78rL30LTVoV2JSc8p4Kb0DJL3eThj6Wp+jFpH/6T+nHf+eY1mfKdDVW1nsarqBW6so1iMMSbsrfh6Di/eeg0r538V8DpbN+zl8h/W0KzEy+Rtm1iqa0lJSbHkVINA6pRfisjtwJtAQXmhqmYHLSpjjAkzZcXFzHnxX6z4ejbt+vahS3LNw657i93s/mwjV3pz2dvcxZ15O1m7axmDBg3i7LPPblRjOx2OQBLUVOf9hgplCvSs/XCMMSb8ZGVu5sMnHyVr6xbkuJ682iyN1pu/47SI06pcp3TLPvZ+uIGHughpnaO5tjibnek/MGTIEM4880xLTgEIpJm53bQxxjRa6fNmM+fFf6KRwsIRheTELmPG2odgLexgUbXr/ndAPO91iuCs0n3ww3yGDx/OaaedZq2IA1RjghKRKOA6oLxro3nAv1W17HB3KiIZQB7gAdyqOkREWuO7jNgdyAAuUtW9zvJ3A1c6y9+sqp8f7r6NMSYQvkt6/2TF13PIbR/BZ/0306fLAJ4ceAettrWrcf1vI8p4fF8WA8sK6bzwK0aMGMFvfvMbS06HIJBLfP8EooB/OJ8vd8p+e4T7HqOqeyp8vguYo6qPishdzuc7RSQJmAj0BzoCs0Wkj6rauOfGmKDYs2UT7/71YXK3b2fpUTlsHxjLtCGPcGaPM30JptPB63hU2VRUyqqCIlblF/OfzBzae0o55oevGH3iiYwePdqS0yEKJEENVdWKdwO/EpGlQYhlPDDamZ6Jr6Z2p1P+htN7xUYRWQcMAxYGIQZjTCP305xPmPvivyhylfH98H2cNeYyJg+YTFzkrx237i4tY2V+Mavyi1hVUMyqgiLWFhRT5PX1ZiJAR3cJJy75mtNPHMWoUWHdt3bYCiRBeUSkl6quBxCRnvgutR0JBb4QEcV3ufA5oL2qbgdQ1e0iUl6H7gR8X2HdTCr9+wVE5GrgaoCuXbseYYjGmMakpKiQmX+7l7yf17KtTRHRZw/kP6PuoEN8B8CXlD7clcN7u3JYlOtv0Ey76EiOjo/lio4JHN00ln7xcexblc5Xn37KKaecwogRI0J1SPVeIAnq98Bcp7NYAboBU45wvyNUdZuThL4UkdXVLFtZnbjSTtecRPcc+IbbOMIYjTGNxIK0z5n3j2eJzfWwLSWGy698kEEdBpNb5ua17Vm8vzOHb/bm4QWOjo/lzh4dGNoinqPj40iIPvhn1Dt0CImtW9G7d++6P5gGpLq++G4FvgW+BnoDffEliyPuLFZVtznvu0TkXXyX7HaKSKJTe0oEdjmLZwJdKqzeGdh2JPs3xhiA7fnb+der02jydSYSJXS+cizXnnQVs7PyeGr5BuZm5VGqSrfYaG7u1p7x7VrSr2nNYzRFRERYcqoF1dWgOgN/w9eL+TLgO3wJawtw2AlKROKBCFXNc6ZPBR4EPgAmAY867+XDw34AvCYiT+BrJNEbamjbaYwx1ShyF/HST/9h5Zvv0SMzDk+P9vS+6n7mFAt3f7uSIq+XxJgopnRO4Jx2rUhtFmcNHEKgur74bgcQkWhgCHA8vod2nxeRHFVNOsx9tgfedb7sSOA1Z0iPH4G3RORKYDNwoRPHChF5C1gJuIEbrAWfMfWXqlKUt4+cHdvJ3b2TVh060qFX3dQ2VJVPNn7C8189Rf+FkdAqme+vOIulzdqzb3MuraNcXNShFee0b8WxLeKJsKQUUoHcg4oDmgMtnNc2YPnh7tAZmfegPkJUNQs4uYp1HgEeOdx9GmPqlqpSmJtD9tYtZG/LZO+O7eTu3E7uzh3k7NpJWXHRfsv3OW4koy6ZRIt2HYIa161zb2VFejauiPN5/YJkCmPjaeaK4Iy2LTi3XStOaNWMqAhLSuGiuntQz+F79igP+AHfJb4nyh+eNcYYj7uMnB07yN62heytmWRvc15bMyktKvQvFxkVTYv2HWjRrj2d+yfTsn0iLdp1oHnbdqz94Vt+/PB/rP9xIYPOGMex515EbHzTWouxrLSE7WtWs2VlOkt0DOuSuxPlcXNKm+Zc0LkdJ7VuTqzLuh0KR9XVoLoCMcBaYCu+xgo5dRCTMSbMFOXt2z8Bbctk77ZMcnbuQL1e/3JNW7ehdcfOJI0aQ+uOnWndsQutOnaiWes2SBV9z7Xt2p3kk0/j2zdfZfFH75I+bzbHX3AxKb85A9dhjJFUVlzMtjWryVy1nC0rl7Nj3Ro8bjciEYw4dgznNI/jmt+MoVmUjVwb7qS6YbLFd6OoP777T8cDA4BsYKGqTquTCA/TkCFDdPHixaEOw5h6yeMuY8Xc2aR/+Sk52Xsoytvnn+eKiqJVYidaJ3aidafOtOrYmTadutAqsSPRcU2OaL+7Mjbw9Sv/YXP6Mlp17MyoS6fQ65hh1TZQKC0uYtsvq9iycjmZK9PZsX4tXo8biYigfc+j6JKUTOekAXTq25+YJkcWn6mZiCxR1SG1sq3qElSFHXYGRuBLUmOBNqrasjYCCBZLUMYEzltSQsmateQvX8aK779h5Y5MikRpVlRC1zEnk9C7L607+WpEzdu2JSIieGMYqSobfvqR+a++SPa2TLokJXPi5VfSvudRAJQWFbLVn5CWs3PDOrweDxEuV4WElEynvv2OOGGaQ1cnCUpEbsaXkEYAZfiamC903pc7gxmGLUtQxlTOW1hI8epfKF650v/K37CezS3i2di2BaVRkSRIJCk9j6bH8ONpNmYMrmbN6jxOj9vN8jmf891/Z1GUn0evY46lICebnRvWoV4vEa5IOvTqTZf+yXTuN4COffsRHVvzM0omuOoqQT2B8+xTeRdE9YklKGPAk5tL8arV+yWj0o0bwfl/70low5YenVnnKabU46Zr3ySGT7yCzkf3x727kNJtBTRJaYu4QteyraSwgB/e+y/pX31B606dfTWkfsl07HM0UbGxIYvLVK7OL/HVR5agTGOlXi9bf/d/FKenU5aZ6S+PTEwkNimJ2KR+eLt3Y+XWDJYvmIenpJT+g05iQPIY4tzxlG3Np2x7AVrmu0jS/rbBRLWPD9XhmHqmNhPUoTeRMcaENYmIwJufT2zyAFpOuMhJSklEtmpF7vYdpP/vM7I/WEyLyLac3u1KmniaQg54v9lHYUwBUR3jiR/WgaiOTYnu1JTIBLuPY0LDalDGNFDeYjdl2/Ip3VpA/vpdFKzfTUxpDCJOc+/YCGK6NPcloo5NierUlMjWsYg9qGqOgNWgjDEH8Ra7KVmfQ/G6HErW5eDe/WtvDYXuPHLLdhPduRmdT0ilRb+OuFrEWP9yJqxZgjKmnlK3l9LNeRSv20vJuhxKt+SBgkRF4G0bwba4jazbuJh8yaXfb0ZzzFnnEN+yVajDNiZglqCMqSdUFffOQl8Nae1eSjbmoqVeEPC2gpyELDKzV7N2wyLca0qJjW/KoLPGMeiMs4lrWvfNxI05UpagjAljnn0lFK/1XbIrXrcXb16Zr7yJl5zo3WzOW8nGHUsp21CCKzKS9j17k3rGWDr27Ue3AQPtQVVTr1mCMuYwqdeLe/duSjdtonTTJso2byZ+xAnEDz/28LbnUTz7SijbUUDJWt+9JPcuX4ernkgPe2U3m3NXsHXfGgrd+4hr3oJOfftx3EmX0rFPP9r3PIrIqKjaPERjQsoSlDHVUK8X9/btlG7eTOmmzb73zZso27SZ0i1b0OLiXxeOisLVqnWVCUrLPLhzSvDsLcGdU4xnbwmenBLce4vx5JTgyS0Bp1GtV7zk6C627F3NjsKN5JTtJqFzVzoO6seoviPp2LcfLdsnWiMH06BZgjKNnre42KkJVUg+m32vsi1b0NJS/7ISHU1U1y5Ed+1G/IgRRHfrSlRX3yuyZVs8+R6KVmb5Eo+ThHxJqRhvftl++1WUMlcpRd588oqzyC3cQ6E7lzz3XvZpNu1796LjoH4k9T2TxN59a3UICmPqA0tQpkFQtxtPXh6enBy8+/bhyc3Fk7sPz75cPLm5eHOdMmeed18unhzfZy0p2W9bEhtLdNeuxPTsQfyJJxLdsQeutp1wNW8LkfF488vw7CvFm1dKWU4ZxVtK8X62GS3L2D+mCKUssoxiLSC/dC9783eSV5xFoTuXAvc+itx5xLdu7RsbqWsHWrbvTrf2HWjVsTNtu3YnwhW8DlmNqQ8sQZmwoKp4Cwp8ySUvz//u2bfPN70vD2+e792Ttw/vvorz9uHNz69624CnaTzuNm3xNGuJJ745no7t8XaLwRMZjZcoIiJiiI5qRlREE6KlCWg0qjF4s2NwZ0cAbuDXLinLtJQSLaJUiyjWQoq9hRR7C8jN30V+6V4K3fso9hTgioykebsOtGzfgZZHJ9KzfV9atE+kZfsONG/XnqjomKCfW2PqK0tQYUZVweNBPR7/u7rd4PXiatkSOYK/qvdu34qnrKzmBetA1kszKFq6FE9hId6CfDwFheB0kK8IiIuIqBhwxRARGQuuWFxNmhHRpDmuuKZExHYgokU8EdFxaGQMSBQqkUAkqAvRCCLUhUsjcUkUkRJV4/0aRSnTUkoppkxKKHTlUyoluF1llEWU+t5dZbhdbnApEuFCRIiIiEBEkIhIOrTqT0snAbVo34GmrdsEdWgKYxoyS1BVKNu+nbLMTLzFJWhpCd7iYtQ/XYKWFPvKSkqd6RK0uBhvaYlvueJivCUlaEkJ6najHje4Pb7RR91uX+KpkIRwu33zPJ4qYzpqzmyiOnU67GP64Ik/sWdzxmGvX51IiSYyIppIiSIq4tfpyIgYoiTK9zkimkiJJioiikhpT2SnsURGRBMt0URGRPnnR0ZE45LAftRVFbeW4vaUUuYtxSsevC4PRHogyo1Eu3HFunHFeXDFxxDdNI7o5k2Ibt6U2BZNcTWJJiLGRURsJBFNoxAb+tuYsGEJqgo57/yPPc88U/1CERFIbCwR0dG+95gYJDYWiYkhIibGV+OJiUaiohBXpO/HzxXpqwVFuiovi3Ahka5fy1wRvuUiXUS0aHFExzSmx6XQ2n1E2wCca2YgbsANUnVOPXjVCHyVnMj934kS/7tGCu5IgSggUpAo8ZVHRfinxZmWqAiaNmtGk+YtiGvW3O7bGNOANNwE5T2yTnBbjDubJkOOQaJjiIh1Ek+F6YjoaIiq+bJROGnWqS2e+JKaFwyAxLiIiHYhMS4k2kVEjKvKMn95tCuk4woZY+qXBpug3LlH9kMc3bUr0V271lI04aHV+KNCHYIxxgSswV5wdzWxJ+qNMaY+a7AJSmLsXoQxxtRnDTZBGWOMqd8sQRljjAlLlqCMMcaEJUtQxhhjwpIlKGOMMWHJEpQxxpiwZAnKGGNMWLIEZYwxJixZgjLGGBOW6k2CEpHTReQXEVknIneFOh5jjDHBVS8SlIi4gGeBM4Ak4GIRSQptVMYYY4KpXiQoYBiwTlU3qGop8AYwPsQxGWOMCaL6kqA6AVsqfM50yvYjIleLyGIRWbx79+46C84YY0ztqy8JqrJR7g4akVBVn1PVIao6pG3btnUQljHGmGCpLwkqE+hS4XNnYFuIYjHGGFMH6kuC+hHoLSI9RCQamAh8EOKYjDHGBFG9GPJdVd0iciPwOeACXlTVFSEOyxhjTBDViwQFoKqfAJ+EOg5jjDF1o75c4jPGGNPIWIIyxhgTlixBGWOMCUuWoIwxxoQlUT3oedcGQUTygF9CHcchSAD2hDqIANWnWMHiDTaLN7jqW7x9VbVZbWyo3rTiOwy/qOqQUAcRKBFZXF/irU+xgsUbbBZvcNXHeGtrW3aJzxhjTFiyBGWMMSYsNeQE9VyoAzhE9Sne+hQrWLzBZvEGV6ONt8E2kjDGGFO/NeQalDHGmHrMEpQxxpiw1OASlIicLiK/iMg6Ebkr1PEAiEgXEZkrIqtEZIWI3OKUTxeRrSKS5rzOrLDO3c4x/CIip4Ug5gwRWe7Etdgpay0iX4rIWue9VTjEKyJ9K5zDNBHZJyK3htP5FZEXRWSXiKRXKDvk8ykixzjfyzoReVpEKhvMM1jx/kVEVovIMhF5V0RaOuXdRaSownn+V13GW0Wsh/zdh/jcvlkh1gwRSXPKQ3punf1U9fsV/H+/qtpgXviG4lgP9ASigaVAUhjElQgMdqabAWuAJGA6cHslyyc5sccAPZxjctVxzBlAwgFljwF3OdN3AX8Ol3gP+DewA+gWTucXGAUMBtKP5HwCi4Dj8I0y/SlwRh3GeyoQ6Uz/uUK83Ssud8B2gh5vFbEe8ncfynN7wPy/AveHw7l19lPV71fQ//02tBrUMGCdqm5Q1VLgDWB8iGNCVber6k/OdB6wCuhUzSrjgTdUtURVNwLr8B1bqI0HZjrTM4FzKpSHS7wnA+tVdVM1y9R5vKo6H8iuJI6Az6eIJALNVXWh+v63v1xhnaDHq6pfqKrb+fg9vpGtq1RX8VZxbqsSlue2nFOjuAh4vbpt1HG8Vf1+Bf3fb0NLUJ2ALRU+Z1J9IqhzItIdGAT84BTd6FwyebFCFTkcjkOBL0RkiYhc7ZS1V9Xt4PtHC7RzysMh3nIT2f8/d7ieXzj089nJmT6wPBSm4vsLuFwPEflZRL4WkZFOWajjPZTvPtSxlhsJ7FTVtRXKwubcHvD7FfR/vw0tQVV2PTNs2tGLSFPgHeBWVd0H/BPoBaQC2/FV7SE8jmOEqg4GzgBuEJFR1SwbDvEiItHAOOC/TlE4n9/qVBVfWMQtIvcCbmCWU7Qd6Kqqg4DfAa+JSHNCG++hfvdhcW6Bi9n/D6ywObeV/H5VuWglZYd1jhtagsoEulT43BnYFqJY9iMiUfi+3Fmq+j8AVd2pqh5V9QLP8+tlppAfh6puc953Ae86se10qunllxh2OYuHPF7HGcBPqroTwvv8Og71fGay/2W1Oo9bRCYBY4FLncs0OJdyspzpJfjuOfQJZbyH8d2Hw7mNBM4D3iwvC5dzW9nvF3Xw77ehJagfgd4i0sP5a3oi8EGIYyq/rvwCsEpVn6hQnlhhsXOB8lY9HwATRSRGRHoAvfHdXKyreONFpFn5NL6b4+lOXJOcxSYB74dDvBXs99dnuJ7fCg7pfDqXUfJEZLjzb+qKCusEnYicDtwJjFPVwgrlbUXE5Uz3dOLdEMp4D/W7D/W5dfwGWK2q/stg4XBuq/r9oi7+/Qaj1UcoX8CZ+FqZrAfuDXU8Tkwn4KvKLgPSnNeZwCvAcqf8AyCxwjr3OsfwC0FqnVNNvD3xtcJZCqwoP49AG2AOsNZ5bx0O8Tr7bwJkAS0qlIXN+cWXOLcDZfj+krzycM4nMATfj+164Bmc3mDqKN51+O4tlP8b/pez7PnOv5OlwE/A2XUZbxWxHvJ3H8pz65TPAK49YNmQnltnP1X9fgX93691dWSMMSYsNbRLfMYYYxoIS1DGGGPCkiUoY4wxYckSlDHGmLBkCcoYY0xYsgRlTB0RnwUickaFsotE5LNQxmVMuLJm5sbUIREZgK8rpkH4el5PA05X1fWHsS2XqnpqN0JjwoclKGPqmIg8BhQA8c57NyAZiASmq+r7TqecrzjLANyoqt+JyGhgGr4HPVNVNaluozem7liCMqaOOd1H/QSUAh8BK1T1VfENALgIX+1KAa+qFotIb+B1VR3iJKiPgQHqG8rAmAYrMtQBGNPYqGqBiLwJ5OMb++dsEbndmR0LdMXXieYzIpIKePB1EFpukSUn0xhYgjImNLzOS4DzVfWXijNFZDqwExiIrzFTcYXZBXUUozEhZa34jAmtz4GbnN6dEZFBTnkLYLv6hou4HF+DCmMaFUtQxoTWQ0AUsExE0p3PAP8AJonI9/gu71mtyTQ61kjCGGNMWLIalDHGmLBkCcoYY0xYsgRljDEmLFmCMsYYE5YsQRljjAlLlqCMMcaEJUtQxhhjwtL/A6Lfu8Zz+njJAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "table1.plot()\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')" - ] - }, - { - "cell_type": "markdown", - "id": "wanted-fantasy", - "metadata": {}, - "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "together-jackson", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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6N69e9h2EOsvkFZ8SXiHyjjZKvoMeMAYUxbMwDqquLg4cnJyqKmpISYmhk8++YTevZscxf4AS5cuJSUltB073n333Tz22GNMmTKFH3/8MaSxKKUOT3FxMW63m9TU8G5e3iCQFPosUAFcYk3lwHPBDKqjO/PMM3n//fcBb/dEl17608gklZWVzJs3j4yMDDIzM3njjTea3M6GDRuYMGGC73Nubi6ZmZkArF69mlNOOYVjjz2W008/nfz8fF/56NGjOf7443nyySd965500km+TmwBJk2axJo1aw7ZZ2RkJHl5eQAMGDAgoOMtKSnhvPPOIzMzk4kTJ/q2O3/+fK666iomT57MwIEDefzxn8bBfPHFF5kwYQJZWVlcd911uN1u3G43c+fOZdSoUWRkZPDoo48GtH+llFdhYSGRkZF06dIl1KEEJJB7UIOMMRf6fb5fRLKDFE+bKX13G/V7qlp1m5G94uhyzqAWl5s1axYPPPAA06dPZ82aNVx11VV8/vnnADz44IMkJSWxdu1awHtDs8GUKVN83SLNmTOHO+64g/r6erZv387AgQN59dVXueSSS3A6nU0OtzFv3jz+9re/ccopp/CLX/zCt+2f/exnLFiwgMcee4zNmzdTV1fnS3b+Bg0axK9//WuGDx/OuHGBPSx+3333MWbMGN566y0+/fRTZs+e7UuGGzduZOnSpVRUVDB06FBuuOEGtm7dyquvvsoXX3yBw+HgxhtvZNGiRYwcOZLdu3f7en8vLS0NaP9KKe/thJKSEtLS0sK6eyN/gdSgakTkxIYP1oO7NcELqePLzMwkNzeXl19+mbPOOuuAeYsXL+amm27yffa/kbl06VKys7PJzs7mjjvuAOCSSy7htddeA+DVV19l5syZbNq0yTfcRlZWFg899BB5eXmUlZVRWlrKKaecAnDAvbCLL76Y9957D6fTybPPPsvcuXMPifvtt9+mrKyMDz/8kMsuu4wtW7awb98+xo8f3+zxrlixwrevU089leLiYsrKvFeIzz77bKKiokhJSSE1NZWCggKWLFnC6tWrGT9+PFlZWSxZssSXhLdv384tt9zCRx99FLbDVCsVjoqKivB4PO3m8h4EVoO6AVho3YsSoATvYIXtWiA1nWA699xzufPOO1m2bBnFxcW+cmPMYf13M3PmTC6++GIuuOACRITBgwezdu3aRofb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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "# The function I found that best matches the data has the form\n", - "# a + b / (c - x)\n", - "\n", - "# This function is hard to explain physically; that is, it doesn't\n", - "# correspond to a growth model that makes sense in terms of human \n", - "# behavior.\n", - "\n", - "# And it implies that the population goes to infinity in 2040.\n", - "\n", - "from numpy import linspace\n", - "from matplotlib.pyplot import plot\n", - "\n", - "xs = linspace(100, 1950)\n", - "ys = 110 + 200000 / (2040 - xs)\n", - "table1.plot()\n", - "plot(xs, ys, color='gray', alpha=0.5, label='model')\n", - "\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "simple-verse", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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drxDatRp560ws/OA+4Ex4f4GuLuPa22h4SCL+Nz5JSLSjdU9cDA/P59FixZx1llnxTukJkUzsdLvga8SzChRE9twREQkVo4cOcKjjz5KcXEx119/PVOnTo13SM2KJkGVu/tLMY9ERERipm76ooqKCm655RbOPPPMeId0WtEkqFfN7P8SXC86UbfS3d+JWVQiItJuDh48yCOPPMKJEye4/fbbO829pdEkqHnhe+QYdQcubv9wRESkPRUVFbFkyRLMjDvvvJMRI0bEO6SonTZBuXvHPT5RRETaTV5eHo8//jh9+vTh9ttvj9us5K0VzSi+QcB9wIXhqlXA99y9PJaBiYhI6+3YsYMnn3ySwYMHc/vtt5OSkhLvkFosmvug/gAcBm4MXxXAA7EMSkREWu/dd9/liSeeID09nbvuuqtTJieI7hrUGe7+qYjP3zWzTTGKR0REWsndefXVV/nb3/5GdnY2N998M7179453WK0WTYI6bmbnu/saqL9x93hswxIRkZaoqqpi+fLlvP/++8yePZuFCxfSs2fPeIfVJtEkqH8GHgqvRRlQCtwZy6BERCR6hw8f5oknnqCwsJDLLruMc845BzOLd1htFs0ovk3ATDNLCT9XxDooERGJTlFREY8//jgnTpzg5ptvZuLEifEOqd00maDM7DZ3X2JmX2uwHgB3/0WMYxMRkWZs27aNZ555hn79+nH33XczfPjweIfUrpprQfUP3wc2si0+TzkUERHcnbVr17Jy5UoyMjK46aabGDBgQLzDanfNPfL9t+HiCndfG7ktHCghIiIdrLq6mj/96U9s3ryZadOmce2115KUFM1wgs4nmlr9Gmg4H3tj60REJIYqKipYunQp+fn5XHTRRVx44YVdYjBEU5q7BnUu8DEgvcF1qBSgc49dFBHpZHbt2sWyZcuoqqrqFI/KaA/NtaB6AQPCfSKvQ1UA17elUDMbDPwOmEZwPetud3+jLecUEemKamtrWb16NatWrSI9PZ0bb7yRoUOHxjusDtHcNahVwCoze9Dd89q53F8BL7v79WbWC+jXzucXEen0jh49yrJly9i9ezczZsxg4cKF9OrVK95hdZhorkEdC58HNRXoU7fS3Vv1uI3wfqoLCW/2dfeTwMnWnEtEpKvau3cvS5cu5dixY1x99dWcddZZXfp6U2OimSz2UeDvwFjgu0Au8HYb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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "# And it doesn't do a particularly good job of predicting\n", - "# actual growth from 1940 to the present.\n", - "\n", - "# TODO: load these series from table2\n", - "#plot(census, ':', label='US Census')\n", - "#plot(un, '--', label='UN DESA')\n", - "\n", - "xs = linspace(1940, 2020)\n", - "ys = 110 + 200000 / (2040 - xs)\n", - "plot(xs, ys/1000, color='gray', label='model')\n", - "\n", - "decorate(xlim=[1950, 2016], xlabel='Year', \n", - " ylabel='World population (billions)',\n", - " title='Prehistoric population estimates')" - ] - }, - { - "cell_type": "markdown", - "id": "ruled-spain", - "metadata": {}, - "source": [ - "## One queue or two?\n", - "\n", - "This case study is related to **queueing theory**, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", - "\n", - "Suppose you are designing the checkout area for a new store. There is\n", - "enough room in the store for two checkout counters and a waiting area\n", - "for customers. You can make two lines, one for each counter, or one line that feeds both counters.\n", - "\n", - "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you might have to install barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", - "\n", - "So you'd like to check whether the single line is really better and by\n", - "how much. Simulation can help answer this question.\n", - "\n", - "This figure shows the three scenarios we'll consider:\n", - "\n", - "![One queue, one server (left), one queue, two servers (middle), two\n", - "queues, two servers (right).](figs/queue.pdf){width=\"4.5in\"}\n", - "\n", - "As we did in the bike share model, we'll assume that a customer is equally likely to arrive during any time step. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", - "\n", - "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they always have the same probability of finishing during the next time step, regardless of how long they have been checking out. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", - "\n", - "If we choose $\\mu=1/5$ per minute, the average time for each checkout\n", - "will be 5 minutes, which is consistent with the data. Most people takes less than 5 minutes, but a few take substantially longer, which is probably not a bad model of the distribution in real stores.\n", - "\n", - "Now we're ready to get started. In the repository for this book, you'll find a notebook called `queue.ipynb` that contains some code to get you started and instructions.\n", - "\n", - "As always, you should practice incremental development: write no more\n", - "than one or two lines of code a time, and test as you go!" - ] - }, - { - "cell_type": "markdown", - "id": "forward-point", - "metadata": {}, - "source": [ - "## Predicting salmon populations\n", - "\n", - "Each year the U.S. Atlantic Salmon Assessment Committee reports\n", - "estimates of salmon populations in oceans and rivers in the northeastern United States. The reports are useful for monitoring changes in these populations, but they generally do not include predictions.\n", - "\n", - "The goal of this case study is to model year-to-year changes in\n", - "population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", - "\n", - "As an example, I use data from page 18 of the 2017 report, which\n", - "provides population estimates for the Narraguagus and Sheepscot Rivers\n", - "in Maine.\n", - "\n", - "In the repository for this book, you'll find a notebook called\n", - "`salmon.ipynb` that contains some code to get you started and\n", - "instructions.\n", - "\n", - "You should take my instructions as suggestions; if you want to try\n", - "something different, please do!" - ] - }, - { - "cell_type": "markdown", - "id": "limiting-moore", - "metadata": {}, - "source": [ - "## Tree growth\n", - "\n", - "This case study is based on \"Height-Age Curves for Planted Stands of\n", - "Douglas Fir, with Adjustments for Density\", a working paper by\n", - "Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", - "\n", - "It provides \"site index curves\", which are curves that show the\n", - "expected height of the tallest tree in a stand of Douglas firs as a\n", - "function of age, for a stand where the trees are the same age.\n", - "\n", - "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\\\" that indicates the quality of the site.\n", - "\n", - "The following figure shows site curves for three different site\n", - "indices. \n", - "\n", - "![Site index curves for tree\n", - "growth.](figs/trees-fig01.pdf){height=\"3in\"}\n", - "\n", - "The goal of this case study is to explain the shape of these\n", - "curves, that is, why trees grow the way they do.\n", - "\n", - "As a starting place, let's assume that the ability of the tree to gain\n", - "mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A$$\n", - "\n", - "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", - "\n", - "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power: $m = \\beta h^D$ where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. I start by assuming $D=3$, but then revisit that assumption.\n", - "\n", - "Finally, we'll assume that area is proportional to height squared:\n", - "\n", - "$$A = \\gamma h^2$$\n", - "\n", - "I specify height in feet, and choose units for mass and area so that\n", - "$\\beta=1$ and $\\gamma=1$. Putting all that together, we can write a\n", - "difference equation for height:\n", - "\n", - "$$h_{n+1}^D = h_n^D + \\alpha h_n^2$$\n", - "\n", - "With $D=3$, the solution to this equation is close to a straight line,\n", - "which is not a bad model for the growth curves. But the model implies\n", - "that trees can grow forever, and we know that's not true. As trees get\n", - "taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", - "\n", - "We can model this effect by adding a factor to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A$$\n", - "\n", - "Let's assume\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A (1 - h / K)$$\n", - "\n", - "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", - "\n", - "In the repository for this book, you'll find a notebook called\n", - "`trees.ipynb` that implements both models and uses them to fit the data.\n", - "\n", - "There are no exercises in this case study; it is mostly meant as an\n", - "example of what you can do with the tools we have so far, and a preview of what we will be able to do with the tools in the next few chapters." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "australian-gregory", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap11.ipynb b/jupyter/chap11.ipynb deleted file mode 100644 index 040c405c..00000000 --- a/jupyter/chap11.ipynb +++ /dev/null @@ -1,918 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "pressing-munich", - "metadata": {}, - "source": [ - "# Chapter 11" - ] - }, - { - "cell_type": "markdown", - "id": "detected-creation", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "breathing-commonwealth", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "persistent-carbon", - "metadata": {}, - "source": [ - "In this chapter, we develop a model of an epidemic as it spreads in a\n", - "susceptible population, and use it to evaluate the effectiveness of\n", - "possible interventions.\n", - "\n", - "My presentation of the model in the next few chapters is based on an excellent article by David Smith and Lang Moore, [^1]: Smith and Moore, \"The SIR Model for Spread of Disease,\" Journal of Online Mathematics and its Applications, December 2001, available at ." - ] - }, - { - "cell_type": "markdown", - "id": "working-patent", - "metadata": {}, - "source": [ - "## The Freshman Plague\n", - "\n", - "Every year at Olin College, about 90 new students come to campus from\n", - "around the country and the world. Most of them arrive healthy and happy, but usually at least one brings with them some kind of infectious disease. A few weeks later, predictably, some fraction of the incoming class comes down with what we call \"The Freshman Plague\".\n", - "\n", - "In this chapter we introduce a well-known model of infectious disease,\n", - "the Kermack-McKendrick model, and use it to explain the progression of\n", - "the disease over the course of the semester, predict the effect of\n", - "possible interventions (like immunization) and design the most effective intervention campaign.\n", - "\n", - "So far we have done our own modeling; that is, we've chosen physical\n", - "systems, identified factors that seem important, and made decisions\n", - "about how to represent them. In this chapter we start with an existing\n", - "model and reverse-engineer it. Along the way, we consider the modeling\n", - "decisions that went into it and identify its capabilities and\n", - "limitations." - ] - }, - { - "cell_type": "markdown", - "id": "distant-expense", - "metadata": {}, - "source": [ - "## The SIR model\n", - "\n", - "The Kermack-McKendrick model is a simple version of an **SIR model**,\n", - "so-named because it considers three categories of people:\n", - "\n", - "- **S**: People who are \"susceptible\\\", that is, capable of\n", - " contracting the disease if they come into contact with someone who\n", - " is infected.\n", - "\n", - "- **I**: People who are \"infectious\\\", that is, capable of passing\n", - " along the disease if they come into contact with someone\n", - " susceptible.\n", - "\n", - "- **R**: People who are \"recovered\\\". In the basic version of the\n", - " model, people who have recovered are considered to be immune to\n", - " reinfection. That is a reasonable model for some diseases, but not\n", - " for others, so it should be on the list of assumptions to reconsider\n", - " later." - ] - }, - { - "cell_type": "markdown", - "id": "reasonable-kitchen", - "metadata": {}, - "source": [ - "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average. If 100 people are infectious at a\n", - "particular point in time, and we ignore the particular time each one\n", - "became infected, we expect about 1 out of 4 to recover on any particular day.\n", - "\n", - "Putting that a different way, if the time between recoveries is 4 days, the recovery rate is about 0.25 recoveries per day, which we'll denote with the Greek letter gamma, $\\gamma$, or the variable name `gamma`.\n", - "\n", - "If the total number of people in the population is $N$, and the fraction currently infectious is $i$, the total number of recoveries we expect per day is $\\gamma i N$." - ] - }, - { - "cell_type": "markdown", - "id": "important-yugoslavia", - "metadata": {}, - "source": [ - "Now let's think about the number of new infections. Suppose we know that each susceptible person comes into contact with 1 person every 3 days, on average, in a way that would cause them to become infected if the other person is infected. We'll denote this contact rate with the Greek letter beta, $\\beta$.\n", - "\n", - "It's probably not reasonable to assume that we know $\\beta$ ahead of\n", - "time, but later we'll see how to estimate it based on data from previous outbreaks.\n", - "\n", - "If $s$ is the fraction of the population that's susceptible, $s N$ is\n", - "the number of susceptible people, $\\beta s N$ is the number of contacts per day, and $\\beta s i N$ is the number of those contacts where the other person is infectious." - ] - }, - { - "cell_type": "markdown", - "id": "virgin-cambodia", - "metadata": {}, - "source": [ - "In summary:\n", - "\n", - "- The number of recoveries we expect per day is $\\gamma i N$; dividing by $N$ yields the fraction of the population that recovers in a day, which is $\\gamma i$.\n", - "\n", - "- The number of new infections we expect per day is $\\beta s i N$;\n", - " dividing by $N$ yields the fraction of the population that gets\n", - " infected in a day, which is $\\beta s i$.\n", - "\n", - "This model assumes that the population is closed; that is, no one\n", - "arrives or departs, so the size of the population, $N$, is constant." - ] - }, - { - "cell_type": "markdown", - "id": "fourth-celtic", - "metadata": {}, - "source": [ - "## The SIR equations\n", - "\n", - "If we treat time as a continuous quantity, we can write differential\n", - "equations that describe the rates of change for $s$, $i$, and $r$ (where $r$ is the fraction of the population that has recovered):\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{ds}{dt} &= -\\beta s i \\\\\n", - "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", - "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", - "\n", - "To avoid cluttering the equations, I leave it implied that $s$ is a function of time, $s(t)$, and likewise for $i$ and $r$.\n", - "\n", - "SIR models are examples of **compartment models**, so-called because\n", - "they divide the world into discrete categories, or compartments, and\n", - "describe transitions from one compartment to another. Compartments are\n", - "also called **stocks** and transitions between them are called\n", - "**flows**.\n", - "\n", - "In this example, there are three stocks---susceptible, infectious, and\n", - "recovered---and two flows---new infections and recoveries. Compartment\n", - "models are often represented visually using stock and flow diagrams (see ).\n", - "\n", - "The following figure shows the stock and flow diagram for an SIR\n", - "model.\n", - "\n", - "![Stock and flow diagram for an SIR\n", - "model.](figs/stock_flow1.pdf){width=\"4in\"}\n", - "\n", - "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." - ] - }, - { - "cell_type": "markdown", - "id": "martial-details", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "For a given physical system, there are many possible models, and for a\n", - "given model, there are many ways to represent it. For example, we can\n", - "represent an SIR model as a stock-and-flow diagram, as a set of\n", - "differential equations, or as a Python program. The process of\n", - "representing a model in these forms is called **implementation**. In\n", - "this section, we implement the SIR model in Python.\n", - "\n", - "I'll represent the initial state of the system using a `State` object\n", - "with state variables `S`, `I`, and `R`; they represent the fraction of\n", - "the population in each compartment.\n", - "\n", - "We can initialize the `State` object with the *number* of people in each compartment, assuming there is one infected student in a class of 90:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "criminal-change", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "S 89\n", - "I 1\n", - "R 0\n", - "dtype: int64" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(S=89, I=1, R=0)\n", - "init" - ] - }, - { - "cell_type": "markdown", - "id": "chronic-jonathan", - "metadata": {}, - "source": [ - "And then convert the numbers to fractions by dividing by the total:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "pediatric-ratio", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "S 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtype: float64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import sum\n", - "\n", - "init /= sum(init)\n", - "init" - ] - }, - { - "cell_type": "markdown", - "id": "ordinary-scottish", - "metadata": {}, - "source": [ - "For now, let's assume we know the time between contacts and time between\n", - "recoveries:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "little-stylus", - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days" - ] - }, - { - "cell_type": "markdown", - "id": "covered-avenue", - "metadata": {}, - "source": [ - "We can use them to compute the parameters of the model:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "veterinary-aerospace", - "metadata": {}, - "outputs": [], - "source": [ - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day" - ] - }, - { - "cell_type": "markdown", - "id": "lightweight-delta", - "metadata": {}, - "source": [ - "Now we need a `System` object to store the parameters and initial\n", - "conditions. The following function takes the system parameters and returns a new `System` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "nasty-sherman", - "metadata": {}, - "outputs": [], - "source": [ - "#export\n", - "def make_system(beta, gamma):\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "markdown", - "id": "victorian-blogger", - "metadata": {}, - "source": [ - "The default value for `t_end` is 14 weeks, about the length of a\n", - "semester.\n", - "\n", - "Here's what the `System` object looks like. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "supported-shadow", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "namespace(init=S 0.988889\n", - " I 0.011111\n", - " R 0.000000\n", - " dtype: float64,\n", - " t0=0,\n", - " t_end=98,\n", - " beta=0.3333333333333333,\n", - " gamma=0.25)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(beta, gamma)\n", - "system" - ] - }, - { - "cell_type": "markdown", - "id": "alone-desire", - "metadata": {}, - "source": [ - "## The update function\n", - "\n", - "At any point in time, the state of the system is represented by a\n", - "`State` object with three variables, `S`, `I` and `R`. So I'll define an\n", - "update function that takes as parameters a `State` object, the current\n", - "time, and a `System` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "wound-wayne", - "metadata": {}, - "outputs": [], - "source": [ - "#export\n", - "def update_func(state, t, system):\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "id": "aboriginal-malpractice", - "metadata": {}, - "source": [ - "The first line uses a feature we have not seen before, **multiple\n", - "assignment**. The value on the right side is a `State` object that\n", - "contains three values. The left side is a sequence of three variable\n", - "names. The assignment does just what we want: it assigns the three\n", - "values from the `State` object to the three variables, in order.\n", - "\n", - "The variables `s`, `i` and `r`, are lowercase to distinguish them\n", - "from the state variables, `S`, `I` and `R`.\n", - "\n", - "The update function computes `infected` and `recovered` as a fraction of the population, then updates `s`, `i` and `r`. The return value is a `State` that contains the updated values.\n", - "\n", - "When we call `update_func` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "assigned-feelings", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "S 0.985226\n", - "I 0.011996\n", - "R 0.002778\n", - "dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = update_func(init, 0, system)\n", - "state" - ] - }, - { - "cell_type": "markdown", - "id": "standard-search", - "metadata": {}, - "source": [ - "You might notice that this version of `update_func` does not use one of its parameters, `t`. I include it anyway because update functions\n", - "sometimes depend on time, and it is convenient if they all take the same parameters, whether they need them or not." - ] - }, - { - "cell_type": "markdown", - "id": "informational-cisco", - "metadata": {}, - "source": [ - "## Running the simulation\n", - "\n", - "Now we can simulate the model over a sequence of time steps:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "occasional-pottery", - "metadata": {}, - "outputs": [], - "source": [ - "#export\n", - "from numpy import arange\n", - "\n", - "def run_simulation(system, update_func):\n", - " state = system.init\n", - "\n", - " for t in arange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - "\n", - " return state" - ] - }, - { - "cell_type": "markdown", - "id": "fifteen-metallic", - "metadata": {}, - "source": [ - "The parameters of `run_simulation` are the `System` object and the\n", - "update function. The `System` object contains the parameters, initial\n", - "conditions, and values of `t0` and `t_end`.\n", - "\n", - "We can call `run_simulation` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "differential-difference", - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(beta, gamma)\n", - "final_state = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "incredible-marsh", - "metadata": {}, - "source": [ - "The result is the final state of the system:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "weekly-acrobat", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "S 0.520568\n", - "I 0.000666\n", - "R 0.478766\n", - "dtype: float64" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_state" - ] - }, - { - "cell_type": "markdown", - "id": "behind-removal", - "metadata": {}, - "source": [ - "This result indicates that after 14 weeks (98 days), about 52% of the\n", - "population is still susceptible, which means they were never infected,\n", - "less than 1% are actively infected, and 48% have recovered, which means they were infected at some point." - ] - }, - { - "cell_type": "markdown", - "id": "serial-genius", - "metadata": {}, - "source": [ - "## Collecting the results\n", - "\n", - "The previous version of `run_simulation` only returns the final state,\n", - "but we might want to see how the state changes over time. We'll consider two ways to do that: first, using three `TimeSeries` objects, then using a new object called a `TimeFrame`.\n", - "\n", - "Here's the first version:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "advanced-recommendation", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(system, update_func):\n", - " S = TimeSeries()\n", - " I = TimeSeries()\n", - " R = TimeSeries()\n", - "\n", - " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", - " \n", - " for t in arange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " S[t+1], I[t+1], R[t+1] = state\n", - " \n", - " return S, I, R" - ] - }, - { - "cell_type": "markdown", - "id": "behind-breathing", - "metadata": {}, - "source": [ - "First, we create `TimeSeries` objects to store the results. Notice that\n", - "the variables `S`, `I`, and `R` are `TimeSeries` objects now.\n", - "\n", - "Next we initialize `state`, `t0`, and the first elements of `S`, `I` and\n", - "`R`.\n", - "\n", - "Inside the loop, we use `update_func` to compute the state of the system\n", - "at the next time step, then use multiple assignment to unpack the\n", - "elements of `state`, assigning each to the corresponding `TimeSeries`.\n", - "\n", - "At the end of the function, we return the values `S`, `I`, and `R`. This\n", - "is the first example we have seen where a function returns more than one\n", - "value.\n", - "\n", - "Now we can run the function like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "subtle-zambia", - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "smoking-toddler", - "metadata": {}, - "source": [ - "We'll use the following function to plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "welcome-tractor", - "metadata": {}, - "outputs": [], - "source": [ - "#export\n", - "from modsim import decorate\n", - "\n", - "def plot_results(S, I, R):\n", - " S.plot(style='--', label='Susceptible')\n", - " I.plot(style='-', label='Infected')\n", - " R.plot(style=':', label='Resistant')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "id": "important-command", - "metadata": {}, - "source": [ - "And run it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "agricultural-joining", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(S, I, R)" - ] - }, - { - "cell_type": "markdown", - "id": "civic-pharmacy", - "metadata": {}, - "source": [ - "Notice that it takes about three weeks (21 days) for the outbreak to get going, and about six weeks (42 days) before it peaks. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." - ] - }, - { - "cell_type": "markdown", - "id": "unexpected-empire", - "metadata": {}, - "source": [ - "## Now with a TimeFrame\n", - "\n", - "If the number of state variables is small, storing them as separate\n", - "`TimeSeries` objects might not be so bad. But a better alternative is to use a `TimeFrame`, which is another object defined in the ModSim\n", - "library.\n", - "\n", - "A `TimeFrame` is a kind of a `DataFrame`, which we used in.\n", - "\n", - "Here's a more concise version of `run_simulation` using a `TimeFrame`:" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "native-central", - "metadata": {}, - "outputs": [], - "source": [ - "#export\n", - "from modsim import TimeFrame\n", - "\n", - "def run_simulation(system, update_func):\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.loc[system.t0] = system.init\n", - " \n", - " for t in arange(system.t0, system.t_end):\n", - " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "id": "beginning-secret", - "metadata": {}, - "source": [ - "The first line creates an empty `TimeFrame` with one column for each\n", - "state variable. Then, before the loop starts, we store the initial\n", - "conditions in the `TimeFrame` at `t0`. Based on the way we've been using\n", - "`TimeSeries` objects, it is tempting to write:\n", - "\n", - "```\n", - "frame[system.t0] = system.init\n", - "```\n", - "\n", - "But when you use the bracket operator with a `TimeFrame` or `DataFrame`, it selects a column, not a row. \n", - "\n", - "To select a row, we have to use `loc`, like this:\n", - "\n", - "```\n", - "frame.loc[system.t0] = system.init\n", - "```\n", - "\n", - "Since the value on the right side is a `State`, the assignment matches\n", - "up the index of the `State` with the columns of the `TimeFrame`; that\n", - "is, it assigns the `S` value from `system.init` to the `S` column of\n", - "`frame`, and likewise with `I` and `R`.\n", - "\n", - "We use the same feature to write the loop more concisely, assigning the `State` we get from `update_func` directly to the next row of\n", - "`frame`.\n", - "\n", - "Finally, we return `frame`. We can call this version of `run_simulation` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "quick-fifty", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "global-complement", - "metadata": {}, - "source": [ - "And plot the results like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "listed-enough", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "markdown", - "id": "welsh-distinction", - "metadata": {}, - "source": [ - "As with a `DataFrame`, we can use the dot operator to select columns\n", - "from a `TimeFrame`.\n" - ] - }, - { - "cell_type": "markdown", - "id": "neutral-replacement", - "metadata": {}, - "source": [ - "## Summary\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "induced-tunnel", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "floral-remove", - "metadata": {}, - "source": [ - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", - "\n", - "Hint: what is the change in `S` between the beginning and the end of the simulation?" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "recovered-freeze", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.3787177442414792" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "tc = 4 # time between contacts in days \n", - "tr = 5 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "s_0 = system.init.S\n", - "\n", - "final = run_simulation(system, update_func)\n", - "s_end = final.S[system.t_end]\n", - "\n", - "s_0 - s_end" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "interpreted-colony", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "given-canberra", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap12.ipynb b/jupyter/chap12.ipynb deleted file mode 100644 index c515d65c..00000000 --- a/jupyter/chap12.ipynb +++ /dev/null @@ -1,1037 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "combined-semiconductor", - "metadata": {}, - "source": [ - "# Chapter 12" - ] - }, - { - "cell_type": "markdown", - "id": "excellent-orchestra", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "absolute-density", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "athletic-diameter", - "metadata": {}, - "source": [ - "### Code\n", - "\n", - "Here's the code from the previous notebook that we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "expensive-venice", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "satellite-fleet", - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "affiliated-metabolism", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import arange\n", - "from modsim import TimeFrame\n", - "\n", - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.loc[system.t0] = system.init\n", - " \n", - " for t in arange(system.t0, system.t_end):\n", - " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "id": "identical-steam", - "metadata": {}, - "source": [ - "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects." - ] - }, - { - "cell_type": "markdown", - "id": "complex-renewal", - "metadata": {}, - "source": [ - "## Immunization\n", - "\n", - "Models like this are useful for testing \"what if?\" scenarios. As an\n", - "example, we'll consider the effect of immunization.\n", - "\n", - "Suppose there is a vaccine that causes a student to become immune to the Freshman Plague without being infected. How might you modify the model to capture this effect?\n", - "\n", - "One option is to treat immunization as a shortcut from susceptible to\n", - "recovered without going through infectious. We can implement this\n", - "feature like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "recent-cooper", - "metadata": {}, - "outputs": [], - "source": [ - "def add_immunization(system, fraction):\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" - ] - }, - { - "cell_type": "markdown", - "id": "arranged-screening", - "metadata": {}, - "source": [ - "`add_immunization` moves the given fraction of the population from `S`\n", - "to `R`. " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "found-learning", - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "unsigned-joseph", - "metadata": {}, - "source": [ - "If we assume that 10% of students are vaccinated at the\n", - "beginning of the semester, and the vaccine is 100% effective, we can\n", - "simulate the effect like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "funny-copper", - "metadata": {}, - "outputs": [], - "source": [ - "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", - "results2 = run_simulation(system2, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "bronze-techno", - "metadata": {}, - "source": [ - "The following figure shows `S` as a function of time, with and\n", - "without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "divided-biotechnology", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results.S.plot(label='No immunization')\n", - "results2.S.plot(label='10% immunization')\n", - "\n", - "decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "id": "postal-cemetery", - "metadata": {}, - "source": [ - "## Metrics\n", - "\n", - "When we plot a time series, we get a view of everything that happened\n", - "when the model ran, but often we want to boil it down to a few numbers\n", - "that summarize the outcome. These summary statistics are called\n", - "**metrics**, as we saw in Section xxx.\n", - "\n", - "In the SIR model, we might want to know the time until the peak of the\n", - "outbreak, the number of people who are sick at the peak, the number of\n", - "students who will still be sick at the end of the semester, or the total number of students who get sick at any point.\n", - "\n", - "As an example, I will focus on the last one --- the total number of sick students --- and we will consider interventions intended to minimize it.\n", - "\n", - "When a person gets infected, they move from `S` to `I`, so we can get\n", - "the total number of infections by computing the difference in `S` at the beginning and the end:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "synthetic-element", - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results, system):\n", - " s_0 = results.S[system.t0]\n", - " s_end = results.S[system.t_end]\n", - " return s_0 - s_end" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "recovered-picnic", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.468320811028781" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "calc_total_infected(results, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "american-transfer", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.30650802853979753" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "calc_total_infected(results2, system2)" - ] - }, - { - "cell_type": "markdown", - "id": "adverse-trance", - "metadata": {}, - "source": [ - "Without immunization, almost 47% of the population gets infected at some point. With 10% immunization, only 31% get infected. That's pretty good." - ] - }, - { - "cell_type": "markdown", - "id": "eight-maximum", - "metadata": {}, - "source": [ - "## Sweeping Immunization\n", - "\n", - "Now let's see what happens if we administer more vaccines. This\n", - "following function sweeps a range of immunization rates:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "progressive-architect", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_immunity(immunize_array):\n", - " sweep = SweepSeries()\n", - "\n", - " for fraction in immunize_array:\n", - " sir = make_system(beta, gamma)\n", - " add_immunization(sir, fraction)\n", - " results = run_simulation(sir, update_func)\n", - " sweep[fraction] = calc_total_infected(results, sir)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "id": "indie-seeker", - "metadata": {}, - "source": [ - "The parameter of `sweep_immunity` is an array of immunization rates. The\n", - "result is a `SweepSeries` object that maps from each immunization rate\n", - "to the resulting fraction of students ever infected.\n", - "\n", - "The following figure shows a plot of the `SweepSeries`. Notice that\n", - "the x-axis is the immunization rate, not time." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "measured-pavilion", - "metadata": {}, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "interior-humanitarian", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "infected_sweep.plot()\n", - "\n", - "decorate(xlabel='Fraction immunized',\n", - " ylabel='Total fraction infected',\n", - " title='Fraction infected vs. immunization rate')" - ] - }, - { - "cell_type": "markdown", - "id": "turkish-mumbai", - "metadata": {}, - "source": [ - "As the immunization rate increases, the number of infections drops\n", - "steeply. If 40% of the students are immunized, fewer than 4% get sick.\n", - "That's because immunization has two effects: it protects the people who get immunized (of course) but it also protects the rest of the\n", - "population.\n", - "\n", - "Reducing the number of \"susceptibles\" and increasing the number of\n", - "\"resistants\" makes it harder for the disease to spread, because some\n", - "fraction of contacts are wasted on people who cannot be infected. This\n", - "phenomenon is called **herd immunity**, and it is an important element\n", - "of public health (see )." - ] - }, - { - "cell_type": "markdown", - "id": "french-spouse", - "metadata": {}, - "source": [ - "The steepness of the curve is a blessing and a curse. It's a blessing\n", - "because it means we don't have to immunize everyone, and vaccines can\n", - "protect the \"herd\" even if they are not 100% effective.\n", - "\n", - "But it's a curse because a small decrease in immunization can cause a\n", - "big increase in infections. In this example, if we drop from 80%\n", - "immunization to 60%, that might not be too bad. But if we drop from 40% to 20%, that would trigger a major outbreak, affecting more than 15% of the population. For a serious disease like measles, just to name one, that would be a public health catastrophe.\n", - "\n", - "One use of models like this is to demonstrate phenomena like herd\n", - "immunity and to predict the effect of interventions like vaccination.\n", - "Another use is to evaluate alternatives and guide decision making. We'll see an example in the next section." - ] - }, - { - "cell_type": "markdown", - "id": "changed-capability", - "metadata": {}, - "source": [ - "## Hand washing\n", - "\n", - "Suppose you are the Dean of Student Life, and you have a budget of just \\$1200 to combat the Freshman Plague. You have two options for spending this money:\n", - "\n", - "1. You can pay for vaccinations, at a rate of \\$100 per dose.\n", - "\n", - "2. You can spend money on a campaign to remind students to wash hands\n", - " frequently.\n", - "\n", - "We have already seen how we can model the effect of vaccination. Now\n", - "let's think about the hand-washing campaign. We'll have to answer two\n", - "questions:\n", - "\n", - "1. How should we incorporate the effect of hand washing in the model?\n", - "\n", - "2. How should we quantify the effect of the money we spend on a\n", - " hand-washing campaign?\n", - "\n", - "For the sake of simplicity, let's assume that we have data from a\n", - "similar campaign at another school showing that a well-funded campaign\n", - "can change student behavior enough to reduce the infection rate by 20%.\n", - "\n", - "In terms of the model, hand washing has the effect of reducing `beta`.\n", - "That's not the only way we could incorporate the effect, but it seems\n", - "reasonable and it's easy to implement." - ] - }, - { - "cell_type": "markdown", - "id": "alpine-guest", - "metadata": {}, - "source": [ - "Now we have to model the relationship between the money we spend and the\n", - "effectiveness of the campaign. Again, let's suppose we have data from\n", - "another school that suggests:\n", - "\n", - "- If we spend \\$500 on posters, materials, and staff time, we can\n", - " change student behavior in a way that decreases the effective value of `beta` by 10%.\n", - "\n", - "- If we spend \\$1000, the total decrease in `beta` is almost 20%.\n", - "\n", - "- Above \\$1000, additional spending has little additional benefit." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "closed-feature", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "agricultural-trinidad", - "metadata": {}, - "source": [ - "### Logistic function" - ] - }, - { - "cell_type": "markdown", - "id": "cheap-structure", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "blond-armstrong", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import exp\n", - "\n", - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "id": "seven-budget", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "disturbed-amount", - "metadata": {}, - "outputs": [], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "id": "supreme-nutrition", - "metadata": {}, - "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", - "\n", - "`M` is chosen so the transition happens around \\$500.\n", - "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", - "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "otherwise-answer", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "expected-venture", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "seventh-strike", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "plot(spending, percent_reduction)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate')" - ] - }, - { - "cell_type": "markdown", - "id": "legal-michigan", - "metadata": {}, - "source": [ - "The result is the following function, which\n", - "takes spending as a parameter and returns `factor`, which is the factor\n", - "by which `beta` is reduced:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "obvious-congress", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "sunset-investing", - "metadata": {}, - "source": [ - "I use `compute_factor` to write `add_hand_washing`, which takes a\n", - "`System` object and a budget, and modifies `system.beta` to model the\n", - "effect of hand washing:" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "polish-multiple", - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "id": "worthy-fellowship", - "metadata": {}, - "source": [ - "Now we can sweep a range of values for `spending` and use the simulation\n", - "to compute the effect:" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "statistical-garden", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results, system)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "id": "clinical-surge", - "metadata": {}, - "source": [ - "Here's how we run it:" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "joined-graduation", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linspace\n", - "\n", - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep2 = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "id": "designing-smile", - "metadata": {}, - "source": [ - "The following figure shows the result. " - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "cheap-decision", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "infected_sweep2.plot()\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections')" - ] - }, - { - "cell_type": "markdown", - "id": "selective-right", - "metadata": {}, - "source": [ - "Below \\$200, the campaign has little effect. \n", - "\n", - "At \\$800 it has a substantial effect, reducing total infections from more than 45% to about 20%. \n", - "\n", - "Above \\$800, the additional benefit is small." - ] - }, - { - "cell_type": "markdown", - "id": "lucky-boulder", - "metadata": {}, - "source": [ - "## Optimization\n", - "\n", - "Let's put it all together. With a fixed budget of \\$1200, we have to\n", - "decide how many doses of vaccine to buy and how much to spend on the\n", - "hand-washing campaign.\n", - "\n", - "Here are the parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "surrounded-copying", - "metadata": {}, - "outputs": [], - "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)" - ] - }, - { - "cell_type": "markdown", - "id": "expired-conditioning", - "metadata": {}, - "source": [ - "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", - "built-in function that converts numbers to integers, rounding down.\n", - "\n", - "We'll sweep the range of possible doses:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "shaped-utility", - "metadata": {}, - "outputs": [], - "source": [ - "dose_array = arange(max_doses+1)" - ] - }, - { - "cell_type": "markdown", - "id": "occupational-reply", - "metadata": {}, - "source": [ - "In this example we call `linrange` with only one argument; it returns a\n", - "NumPy array with the integers from 0 to `max_doses`. With the argument\n", - "`endpoint=True`, the result includes both endpoints.\n", - "\n", - "Then we run the simulation for each element of `dose_array`:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "recognized-release", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results, system)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "id": "cardiac-mitchell", - "metadata": {}, - "source": [ - "For each number of doses, we compute the fraction of students we can\n", - "immunize, `fraction` and the remaining budget we can spend on the\n", - "campaign, `spending`. Then we run the simulation with those quantities\n", - "and store the number of infections.\n", - "\n", - "The following figure shows the result." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "worth-mounting", - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep3 = sweep_doses(dose_array)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "adjusted-highlight", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "infected_sweep3.plot()\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses')" - ] - }, - { - "cell_type": "markdown", - "id": "dynamic-easter", - "metadata": {}, - "source": [ - "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", - "\n", - "As we increase the number of doses, we have to cut campaign spending,\n", - "which turns out to make things worse. But interestingly, when we get\n", - "above 10 doses, the effect of herd immunity starts to kick in, and the\n", - "number of sick students goes down again." - ] - }, - { - "cell_type": "markdown", - "id": "amino-excess", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "timely-bottom", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "id": "drawn-hindu", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "impressive-librarian", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "\"\"\"There is no unique best answer to this question,\n", - "but one simple option is to model quarantine as an\n", - "effective reduction in gamma, on the assumption that\n", - "quarantine reduces the number of infectious contacts\n", - "per infected student.\n", - "\n", - "Another option would be to add a fourth compartment\n", - "to the model to track the fraction of the population\n", - "in quarantine at each point in time. This approach\n", - "would be more complex, and it is not obvious that it\n", - "is substantially better.\n", - "\n", - "The following function could be used, like \n", - "add_immunization and add_hand_washing, to adjust the\n", - "parameters in order to model various interventions.\n", - "\n", - "In this example, `high` is the highest duration of\n", - "the infection period, with no quarantine. `low` is\n", - "the lowest duration, on the assumption that it takes\n", - "some time to identify infectious students.\n", - "\n", - "`fraction` is the fraction of infected students who \n", - "are quarantined as soon as they are identified.\n", - "\"\"\"\n", - "\n", - "def add_quarantine(system, fraction):\n", - " \"\"\"Model the effect of quarantine by adjusting gamma.\n", - " \n", - " system: System object\n", - " fraction: fraction of students quarantined\n", - " \"\"\"\n", - " # `low` represents the number of days a student \n", - " # is infectious if quarantined.\n", - " # `high` is the number of days they are infectious\n", - " # if not quarantined\n", - " low = 1\n", - " high = 4\n", - " tr = high - fraction * (high-low)\n", - " system.gamma = 1 / tr" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap13.ipynb b/jupyter/chap13.ipynb deleted file mode 100644 index 02d03388..00000000 --- a/jupyter/chap13.ipynb +++ /dev/null @@ -1,739 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "artistic-wells", - "metadata": {}, - "source": [ - "# Chapter 13" - ] - }, - { - "cell_type": "markdown", - "id": "ceramic-rendering", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "upper-basic", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "extraordinary-router", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "id": "spiritual-product", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "entitled-playlist", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "monthly-width", - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "antique-timer", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import arange\n", - "from modsim import TimeFrame\n", - "\n", - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.loc[system.t0] = system.init\n", - " \n", - " for t in arange(system.t0, system.t_end):\n", - " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "swiss-system", - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results, system):\n", - " s_0 = results.S[system.t0]\n", - " s_end = results.S[system.t_end]\n", - " return s_0 - s_end" - ] - }, - { - "cell_type": "markdown", - "id": "electoral-montgomery", - "metadata": {}, - "source": [ - "In the previous chapters I presented an SIR model of infectious disease, specifically the Kermack-McKendrick model. We extended the model to include vaccination and the effect of a hand-washing campaign, and used the extended model to allocate a limited budget optimally, that is, to minimize the number of infections.\n", - "\n", - "But we assumed that the parameters of the model, contact rate and\n", - "recovery rate, were known. In this chapter, we explore the behavior of\n", - "the model as we vary these parameters, use analysis to understand these relationships better, and propose a method for using data to estimate parameters." - ] - }, - { - "cell_type": "markdown", - "id": "nervous-spread", - "metadata": {}, - "source": [ - "## Sweeping beta\n", - "\n", - "Recall that $\\beta$ is the contact rate, which captures both the\n", - "frequency of interaction between people and the fraction of those\n", - "interactions that result in a new infection. If $N$ is the size of the\n", - "population and $s$ is the fraction that's susceptible, $s N$ is the\n", - "number of susceptibles, $\\beta s N$ is the number of contacts per day\n", - "between susceptibles and other people, and $\\beta s i N$ is the number\n", - "of those contacts where the other person is infectious.\n", - "\n", - "As $\\beta$ increases, we expect the total number of infections to\n", - "increase. To quantify that relationship, I'll create a range of values\n", - "for $\\beta$:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "amazing-operations", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linspace\n", - "\n", - "beta_array = linspace(0.1, 1.1, 11)\n", - "gamma = 0.25" - ] - }, - { - "cell_type": "markdown", - "id": "adopted-selling", - "metadata": {}, - "source": [ - "Then run the simulation for each value and print the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "brief-minutes", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 0.0072309016649785285\n", - "0.2 0.038410532615067994\n", - "0.30000000000000004 0.33703425948982\n", - "0.4 0.6502429153895082\n", - "0.5 0.8045061124629623\n", - "0.6 0.8862866308018508\n", - "0.7000000000000001 0.9316695082755875\n", - "0.8 0.9574278300784942\n", - "0.9 0.9720993156325133\n", - "1.0 0.9803437149675784\n", - "1.1 0.9848347293510136\n" - ] - } - ], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(beta, calc_total_infected(results, system))" - ] - }, - { - "cell_type": "markdown", - "id": "understanding-teach", - "metadata": {}, - "source": [ - "We can wrap that code in a function and store the results in a\n", - "`SweepSeries` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "single-burke", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[beta] = calc_total_infected(results, system)\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "id": "wired-wrist", - "metadata": {}, - "source": [ - "Now we can run `sweep_beta` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "collected-practice", - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "markdown", - "id": "exempt-binary", - "metadata": {}, - "source": [ - "And plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "competitive-amount", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'gamma = 0.25'" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "label = f'gamma = {gamma}'\n", - "label" - ] - }, - { - "cell_type": "markdown", - "id": "imported-huntington", - "metadata": {}, - "source": [ - "The first line uses string operations to assemble a label for the\n", - "plotted line:\n", - "\n", - "- When the `+` operator is applied to strings, it joins them\n", - " end-to-end, which is called **concatenation**.\n", - "\n", - "- The function `str` converts any type of object to a String\n", - " representation. In this case, `gamma` is a number, so we have to\n", - " convert it to a string before trying to concatenate it.\n", - "\n", - "If the value of `gamma` is `0.25`, the value of `label` is the string\n", - "`'gamma = 0.25'`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "certain-second", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "infected_sweep.plot(label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')" - ] - }, - { - "cell_type": "markdown", - "id": "affiliated-honduras", - "metadata": {}, - "source": [ - "Remember that this figure\n", - "is a parameter sweep, not a time series, so the x-axis is the parameter\n", - "`beta`, not time.\n", - "\n", - "When `beta` is small, the contact rate is low and the outbreak never\n", - "really takes off; the total number of infected students is near zero. As\n", - "`beta` increases, it reaches a threshold near 0.3 where the fraction of\n", - "infected students increases quickly. When `beta` exceeds 0.5, more than\n", - "80% of the population gets sick." - ] - }, - { - "cell_type": "markdown", - "id": "worst-alexandria", - "metadata": {}, - "source": [ - "## Sweeping gamma\n", - "\n", - "Let's see what that looks like for a few different values of `gamma`.\n", - "Again, we'll use `linspace` to make an array of values:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "advised-venice", - "metadata": {}, - "outputs": [], - "source": [ - "gamma_array = linspace(0.1, 0.7, 4)" - ] - }, - { - "cell_type": "markdown", - "id": "sensitive-folder", - "metadata": {}, - "source": [ - "And run `sweep_beta` for each value of `gamma`:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "determined-consent", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for gamma in gamma_array:\n", - " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(infected_sweep, label=label)\n", - " \n", - "decorate()" - ] - }, - { - "cell_type": "markdown", - "id": "tutorial-venture", - "metadata": {}, - "source": [ - "The following figure shows the results. When `gamma` is low, the\n", - "recovery rate is low, which means people are infectious longer. In that\n", - "case, even a low contact rate (`beta`) results in an epidemic.\n", - "\n", - "When `gamma` is high, `beta` has to be even higher to get things going." - ] - }, - { - "cell_type": "markdown", - "id": "rising-flour", - "metadata": {}, - "source": [ - "## SweepFrame\n", - "\n", - "In the previous section, we swept a range of values for `gamma`, and for\n", - "each value, we swept a range of values for `beta`. This process is a\n", - "**two-dimensional sweep**.\n", - "\n", - "If we want to store the results, rather than plot them, we can use a\n", - "`SweepFrame`, which is a kind of `DataFrame` where the rows sweep one\n", - "parameter, the columns sweep another parameter, and the values contain\n", - "metrics from a simulation.\n", - "\n", - "This function shows how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "aquatic-federal", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "id": "level-distinction", - "metadata": {}, - "source": [ - "`sweep_parameters` takes as parameters an array of values for `beta` and\n", - "an array of values for `gamma`.\n", - "\n", - "It creates a `SweepFrame` to store the results, with one column for each\n", - "value of `gamma` and one row for each value of `beta`.\n", - "\n", - "Each time through the loop, we run `sweep_beta`. The result is a\n", - "`SweepSeries` object with one element for each value of `beta`. The\n", - "assignment inside the loop stores the `SweepSeries` as a new column in\n", - "the `SweepFrame`, corresponding to the current value of `gamma`.\n", - "\n", - "At the end, the `SweepFrame` stores the fraction of students infected\n", - "for each pair of parameters, `beta` and `gamma`.\n", - "\n", - "We can run `sweep_parameters` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "julian-liberia", - "metadata": {}, - "outputs": [], - "source": [ - "frame = sweep_parameters(beta_array, gamma_array)" - ] - }, - { - "cell_type": "markdown", - "id": "sharing-contemporary", - "metadata": {}, - "source": [ - "With the results in a `SweepFrame`, we can plot each column like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "superior-redhead", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for gamma in gamma_array:\n", - " label = f'gamma = {gamma}'\n", - " plot(frame[gamma], label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "english-photographer", - "metadata": {}, - "source": [ - "Alternatively, we can plot each row like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "regular-drama", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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AqJjYmIi4+PjL6tLvP/++246nS5ap9NFv//++24Nz589e1YTExMTqdPposePHx9cVVUloF6a6a677vIPCAiIDg8Pj9q9e/dlTcOO9l4a2LFjh61Sqey9ZMmSJg9LN0enTUhOVk708OxxVUJSWFvjeuedlO/eTeWpplX3Iwb40G2EluO/ppFwoFmR4csIhYJ+k6cz85//QV9dzbd/X8iJrVssOlBqFeiEy+QQalJLKd2V3mSbvn37Mnz4cI4dO8avv/7a7Fh+frPo2eNramsLOXhoKvkFu1u8di8nOzb3CeeVMD+OlJQz4kA8r13IpLKVGSPUz7b6BLryybzebF84nDn9dWyOy2Lce7v468rj1OhbH0PmxmXp0qXuqamp7ZaQ9Ho9Tz75ZMBPP/2UkJCQcGrNmjWuhw8fvup8xMSJE0saFB+++OKL5IceekjXWv9//vOfPsOHDy9NSUmJGz58eOkLL7zgDXD48GHrtWvXusbHx5/avHlzwhNPPBGg19cvOT/88MO6jz76KCU5OTnuwoUL1qtXr3YEePfdd92dnJz0qampcY888kj2ggULtFCfKF577TXfAwcOnDl06NCZ1157zbchWSxYsED7yCOPZKekpMQ5OTnp3333XXeAVatWOV24cME6OTk57uOPP055+OGHAzrqe2mI+5lnntEOGTLkasWBVui0CQnql+3iC+PJKv9jUnGZdTsKe3vyP/u82b6Dp4fiE+rEtm/OkptmXCWdNrIr8157D78uXfnl0/fZ/OHb1FaZv2Rl090Dm27ulPySQm1W04fghw0bRp8+fdizZw/79u1rdiwXl/707fM91lY+HDt2N6lpS1pMmEohuFfrwZ7+XZjg6cw7KdkMO3CWX/ONn+no3Ox4cVJX9j07kvnDQ1hzJJ17vzpIWbW8v3SjoNfrmTp1amB4eHjUmDFjgktLSxVQfzfdt2/fiK5du3YZMmRIWEpKinrJkiUucXFxtnfccUdwZGRkVFlZmVi4cKFPdHR0l7CwsK6zZs3SGVpQMzGG7du32+l0uuqoqKgaa2traerUqQWrV692vrKdk5OToUERv7S0VNFwGLyl/ps3b3Z+8MEH8wEefPDB/E2bNrkArF692nnq1KkFNjY2UmRkZI1Op6vevn27XUpKirqsrExx8803lysUCubMmZP/ww8/uABs2LDB+Z577skHuPvu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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for beta in beta_array:\n", - " label = f'beta = {beta}'\n", - " plot(frame.loc[beta], label=label)\n", - " \n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "markdown", - "id": "selective-evaluation", - "metadata": {}, - "source": [ - "This example demonstrates one use of a `SweepFrame`: we can run the analysis once, save the results, and then generate different visualizations.\n", - "\n", - "Another way to visualize the results of a two-dimensional sweep is a\n", - "**contour plot**, which shows the parameters on the axes and contour\n", - "lines, that is, lines of constant value. In this example, the value is\n", - "the fraction of students infected.\n", - "\n", - "The ModSim library provides `contour`, which takes a `SweepFrame` as a\n", - "parameter:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "logical-method", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import contour\n", - "\n", - "contour(frame)\n", - "\n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')" - ] - }, - { - "cell_type": "markdown", - "id": "corresponding-headline", - "metadata": {}, - "source": [ - "Infection rates are lowest in the lower right, where the contact rate is and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", - "\n", - "This figure suggests that there might be a relationship between `beta`\n", - "and `gamma` that determines the outcome of the model. In fact, there is.\n", - "In the next chapter we'll explore it by running simulations, then derive it by analysis.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "located-double", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "flying-tracker", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "stopped-breathing", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "talented-crack", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# Sweep beta with fixed gamma\n", - "gamma = 1/2\n", - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "pressed-isaac", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# Interpolating by eye, we can see that the infection rate passes through 0.4\n", - "# when beta is between 0.6 and 0.7\n", - "# We can use the `crossings` function to interpolate more precisely\n", - "# (although we don't know about it yet :)\n", - "beta_estimate = crossings(infected_sweep, 0.4)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "equal-crazy", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# Time between contacts is 1/beta\n", - "time_between_contacts = 1/beta_estimate" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap14.ipynb b/jupyter/chap14.ipynb deleted file mode 100644 index 81ead454..00000000 --- a/jupyter/chap14.ipynb +++ /dev/null @@ -1,921 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "happy-minutes", - "metadata": {}, - "source": [ - "# Chapter 14" - ] - }, - { - "cell_type": "markdown", - "id": "impressed-headline", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "conditional-complaint", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "therapeutic-scanning", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "level-struggle", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "offshore-remainder", - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "ordinary-elephant", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import arange\n", - "from modsim import TimeFrame\n", - "\n", - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.loc[system.t0] = system.init\n", - " \n", - " for t in arange(system.t0, system.t_end):\n", - " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "fiscal-testament", - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results, system):\n", - " s_0 = results.S[system.t0]\n", - " s_end = results.S[system.t_end]\n", - " return s_0 - s_end" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "engaging-consequence", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import SweepSeries\n", - "\n", - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[beta] = calc_total_infected(results, system)\n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "proud-ability", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import SweepFrame\n", - "\n", - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "flying-chosen", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    0.20.40.60.8
    Parameter
    0.10.0107560.0036420.0021910.001567
    0.20.1189840.0107630.0054470.003644
    0.30.5890950.0301850.0107710.006526
    0.40.8013390.1315630.0209170.010780
    0.50.8965770.3964090.0461400.017640
    \n", - "
    " - ], - "text/plain": [ - " 0.2 0.4 0.6 0.8\n", - "Parameter \n", - "0.1 0.010756 0.003642 0.002191 0.001567\n", - "0.2 0.118984 0.010763 0.005447 0.003644\n", - "0.3 0.589095 0.030185 0.010771 0.006526\n", - "0.4 0.801339 0.131563 0.020917 0.010780\n", - "0.5 0.896577 0.396409 0.046140 0.017640" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "id": "disturbed-joshua", - "metadata": {}, - "source": [ - "In the previous chapters we used simulation to predict the effect of an infectious disease in a susceptible population and to design\n", - "interventions that would minimize the effect.\n", - "\n", - "In this chapter we use analysis to investigate the relationship between the parameters, `beta` and `gamma`, and the outcome of the simulation." - ] - }, - { - "cell_type": "markdown", - "id": "respiratory-twelve", - "metadata": {}, - "source": [ - "## Nondimensionalization\n", - "\n", - "The figures in\n", - "Section [\\[sweepframe\\]](#sweepframe){reference-type=\"ref\"\n", - "reference=\"sweepframe\"} suggest that there is a relationship between the parameters of the SIR model, `beta` and `gamma`, that determines the outcome of the simulation, the fraction of students infected. Let's think what that relationship might be.\n", - "\n", - "- When `beta` exceeds `gamma`, that means there are more contacts\n", - " (that is, potential infections) than recoveries during each day (or other unit of time). The difference between `beta` and `gamma` might be called the \"excess contact rate\\\", in units of contacts per day.\n", - "\n", - "- As an alternative, we might consider the ratio `beta/gamma`, which\n", - " is the number of contacts per recovery. Because the numerator and\n", - " denominator are in the same units, this ratio is **dimensionless**, which means it has no units.\n", - "\n", - "Describing physical systems using dimensionless parameters is often a\n", - "useful move in the modeling and simulation game. It is so useful, in\n", - "fact, that it has a name: **nondimensionalization** (see\n", - ").\n", - "\n", - "So we'll try the second option first." - ] - }, - { - "cell_type": "markdown", - "id": "caroline-compiler", - "metadata": {}, - "source": [ - "## Exploring the results\n", - "\n", - "Suppose we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`. Each element in the `SweepFrame` is the fraction of students infected in a simulation with a given pair of parameters.\n", - "\n", - "We can print the values in the `SweepFrame` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "satisfied-japan", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 0.2 0.010756340768063644\n", - "0.2 0.2 0.11898421353185373\n", - "0.3 0.2 0.5890954199973404\n", - "0.4 0.2 0.8013385277185551\n", - "0.5 0.2 0.8965769637207062\n", - "0.6 0.2 0.942929291399791\n", - "0.7 0.2 0.966299311298026\n", - "0.8 0.2 0.9781518959989762\n", - "0.9 0.2 0.9840568957948106\n", - "1.0 0.2 0.9868823507202488\n", - "1.1 0.2 0.988148177093735\n", - "0.1 0.4 0.0036416926514175607\n", - "0.2 0.4 0.010763463373360094\n", - "0.3 0.4 0.030184952469116566\n", - "0.4 0.4 0.131562924303259\n", - "0.5 0.4 0.3964094037932606\n", - "0.6 0.4 0.5979016626615987\n", - "0.7 0.4 0.7284704154876106\n", - "0.8 0.4 0.8144604459153759\n", - "0.9 0.4 0.8722697237137128\n", - "1.0 0.4 0.9116692168795855\n", - "1.1 0.4 0.9386802509510287\n", - "0.1 0.6 0.002190722188881611\n", - "0.2 0.6 0.005446688837466351\n", - "0.3 0.6 0.010771139974975585\n", - "0.4 0.6 0.020916599304195316\n", - "0.5 0.6 0.04614035896610047\n", - "0.6 0.6 0.13288938996079536\n", - "0.7 0.6 0.3118432512847451\n", - "0.8 0.6 0.47832565854255393\n", - "0.9 0.6 0.605687582114665\n", - "1.0 0.6 0.7014254793376209\n", - "1.1 0.6 0.7738176405451065\n", - "0.1 0.8 0.0015665254038139675\n", - "0.2 0.8 0.003643953969662994\n", - "0.3 0.8 0.006526163529085194\n", - "0.4 0.8 0.010779807499500693\n", - "0.5 0.8 0.017639902596349066\n", - "0.6 0.8 0.030291868201986594\n", - "0.7 0.8 0.05882382948158804\n", - "0.8 0.8 0.13358889291095588\n", - "0.9 0.8 0.2668895539427739\n", - "1.0 0.8 0.40375121210421994\n", - "1.1 0.8 0.519583469821867\n" - ] - } - ], - "source": [ - "for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" - ] - }, - { - "cell_type": "markdown", - "id": "automotive-solution", - "metadata": {}, - "source": [ - "This is the first example we've seen with one `for` loop inside another:\n", - "\n", - "- Each time the outer loop runs, it selects a value of `gamma` from\n", - " the columns of the `DataFrame` and extracts the corresponding\n", - " column.\n", - "\n", - "- Each time the inner loop runs, it selects a value of `beta` from the\n", - " column and selects the corresponding element, which is the fraction\n", - " of students infected.\n", - "\n", - "In the example from the previous chapter, `frame` has 4 columns, one for\n", - "each value of `gamma`, and 11 rows, one for each value of `beta`. So\n", - "these loops print 44 lines, one for each pair of parameters.\n", - "\n", - "The following function encapulates the previous loop and plots the\n", - "fraction infected as a function of the ratio `beta/gamma`:" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "baking-tactics", - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.pyplot import plot\n", - "\n", - "def plot_sweep_frame(frame):\n", - " for gamma in frame.columns:\n", - " series = frame[gamma]\n", - " for beta in series.index:\n", - " frac_infected = series[beta]\n", - " plot(beta/gamma, frac_infected, 'o', \n", - " color='C1', alpha=0.4)" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "id": "dental-outreach", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAiIklEQVR4nO3de5hddX3v8fcnM5nMhJkkYxIlJGA406DgKWg6YMVIiVewVeqliqJUa8vDc6RqfXoq9undnqO9WVsvYIqUpu0pVfGCLWotRgEVySQC4aKYAYSBBEIMyQRym+R7/vitbXaGPZPNzKy91t7783qe/ay1fmvttb57b5hvfmv9LooIzMzMymZW0QGYmZnV4gRlZmal5ARlZmal5ARlZmal5ARlZmal1Fl0AE/XokWLYvny5UWHYWZmM2TDhg2PRcTi8eVNl6CWL1/O0NBQ0WGYmdkMkfSTWuW+xWdmZqXkBGVmZqXkBGVmZqWUW4KSdKWkRyXdMcF+Sfp7SZsl3S5pZV6xmJlZ88mzBnUVcM4k+88FVmSvi4DLcozFzMyaTG4JKiJuAH46ySHnAWsjuRlYIGlJXvGYmVlzKbKZ+VLgwartkaxsSzHhmJk1ke3DMLwORrdA3xIYWA0LB1rq+kU2klCNsppzf0i6SNKQpKFt27blHJaZWR22D8MtV8D1H0rL7cONvfbGtbB/N8w7Li03rm1cDA26fpEJagQ4vmp7GfBwrQMjYk1EDEbE4OLFT+lsbGbtqqgkUXSCGF4HPf3QPR80Ky17+lN5C12/yAR1LXBh1prvF4GdEeHbe2ZWnyKTRNEJYnQLzOk7smxOH+ze2lLXz+0ZlKR/A84GFkkaAf4YmA0QEZcD1wGvBjYDTwLvzCsWM2tB1UkCDi+H1+X/LGZ0S0qK1eb0pfJG6FsC+0YPf2ZI273HttT1c0tQEfGWo+wP4N15Xd/MGqDIB/VFJomiE8TA6lRbhPSZ943Cnh1w8mta6voeScLMpqbo5zCVJFGtUUliYHX6g7x3J8ShtNyzI5U3wsIBWHkhdPWmhNzVm7Yb9Y+DBl2/6UYzN7OSKPIWGxRbi6j8ga7UHnuPTddtZDPvhQONvV4B13eCMrOpKfo5TNFJougE0QacoMxsaop+DgNOEi3OCcqs2RXVUKHoB/XW8txIwqxo0+lsWmRDhaIf1FvLcw3KrEiVBNPTnxLMvtG0Xe8f+qIbKvgWm+XINSizIk13RIKiRxQwy5ETlFmRpptgiuwLZJYzJyizIk03wRTdYdQsR05QZkWaboJxQwVrYW4kYTZd02nmPROdTd1QwVqUE5TZdEy3FR44wZhNwLf4zKaj6HmBzFqYa1Bm0zG6BTq64P6b0vOj7vmw6KTUYdbMpsU1KLPp6OiE+26AsX3QsyAt77sBZnUUHZlZ03OCMpuOQ1XrMUG5mU2JE5TZdMQYLH8JdM5Jt/g656RtDhYdmVnT8zMos+noW5KeNy1fdbhs787UH8nMpsUJymw6/Zg85YRZbnyLz9rbdKer8EgOZrlxDcra20xMV+GOtma5cA3K2punqzArLScoa2+ersKstJygrL15ugqz0nKCsvbmRg5mpeVGEmZu5GBWSq5BmZlZKTlBmZlZKTlBmZlZKTlBmZlZKTlBmZlZKbkVn7WG6Qz4amal5BqUNb/pDvhqZqXkBGXNr3rAV81Ky57+VG5mTSvXBCXpHEk/krRZ0qU19s+X9BVJt0m6U9I784zHWtToFhjbB/ffBD/8z7Qc2+cBX82aXG4JSlIH8EngXOAU4C2SThl32LuBuyLiNOBs4G8kdeUVk7Wojk6474aUlHoWpOV9N8CsjqIjM7NpyLMGdQawOSLujYj9wNXAeeOOCaBPkoBe4KfAWI4xWSs6VLUeE5SbWdPJM0EtBR6s2h7Jyqp9AjgZeBjYBLw3Ip7yZ0XSRZKGJA1t27Ytr3itWcUYLH8JdM5Jo5F3zknbHCw6MjObhjybmatGWYzbfhVwK/BSYAD4hqQbI2LXEW+KWAOsARgcHBx/Dmt3fUtSy73lqw6X7d2ZRiY3s6aVZw1qBDi+ansZqaZU7Z3AFyLZDNwHPDfHmKwVeU4ns5aUZw1qPbBC0onAQ8D5wFvHHfMA8DLgRknPAp4D3JtjTNZM6u18W5nTqXJs77Fw8mvcUdesyeWWoCJiTNIlwNeBDuDKiLhT0sXZ/suBDwFXSdpEuiX4gYh4LK+YrIlUOt/29KfOt/tG0/ZEkwl6TiezlpPrUEcRcR1w3biyy6vWHwZemWcM1qSqO9/C4eXwOiciszbhkSSsnEa3wJy+I8vm9LnzrVkbcYKycupbkm7rVds3mp4vmVlbcIKycnLLPLO25wRl5VRpmdfVm273dfVO3EDCzFqS54Oy8nLLPLO25hqUmZmVkmtQVg6eEdfMxnENyornGXHNrAYnKCueZ8Q1sxqcoKx47pRrZjU4QVnx3CnXzGpwgrLiuVOumdXgVnzWeLVa7Hm6DDMbxwnKGmuyaTTO+M2iozOzEvEtPmsst9gzszo5QVljucWemdXJCcoayy32zKxOTlDWWG6xZ2Z1coKyxvI0GmZWJ7fis8bzNBpmVgfXoMzMrJQmrEFJGgViov0RMS+XiMzMzJgkQUVEH4CkPwO2Av8MCLgA6JvofWZmZjOhnlt8r4qIT0XEaETsiojLgDfkHZiZmbW3ehLUQUkXSOqQNEvSBcDBvAMzM7P2Vk+CeivwJuCR7PVrWZmZmVlujtrMPCLuB87LPxQzM7PDjlqDknSSpOsl3ZFtnyrpD/IPzczM2lk9t/j+AfggcAAgIm4Hzs8zKDMzs3oS1NyIuGVc2VgewZiZmVXUk6AekzRA1mlX0huBLblGZWZmba+esfjeDawBnivpIeA+UmddMzOz3NSToCIiXi7pGGBWRIxKOjHvwMzMrL3Vk6CuAVZGxBNVZZ8HfiGfkKwpbR9O07aPbkmTEg6s9ojlZjYtEz6DkvRcSW8A5kt6fdXrHUB3PSeXdI6kH0naLOnSCY45W9Ktku6U9O0pfQor1vZh2LgW9u+Gecel5ca1qdzMbIomq0E9B/gVYAHwmqryUeC3jnZiSR3AJ4FXACPAeknXRsRdVccsAD4FnBMRD0h65tP9AFYCw+vS7LhbN6UZcrvnp0Q1vM61KDObsslGM/8y8GVJL4qI703h3GcAmyPiXgBJV5NGpLir6pi3Al+IiAeyaz46hetY0R69C356H3QdAz0L4MBe2HoHHHiy6MjMrInV08z84qymA4CkfklX1vG+pcCDVdsjWVm1k4B+Sd+StEHShbVOJOkiSUOShrZt21bHpa2h9uyAsX2w66GUmHY9lLaf/GnRkZlZE6snQZ0aEY9XNiJiB/CCOt6nGmXjJ0DsJDW2+GXgVcAfSjrpKW+KWBMRgxExuHjx4joubY01C3Y+CAf2wOyetNz5IKij6MDMrInV04pvlqT+LDEh6Rl1vm8EOL5qexnwcI1jHstaCD4h6QbgNOCeOs5vpXEI5i2Dg3sPJ6nufgjPymJmU1dPovkb4LuSPk+qAb0J+D91vG89sCLrM/UQafy+8dN0fBn4hKROoAt4IfC3dcZuZdG9APY+DrMXQmc3jO2FA09AT3/RkZlZE6tnuo21koaAl5Ju272+uiXeJO8bk3QJ8HWgA7gyIu6UdHG2//KIuFvS14DbgUPAFRFxxzQ+jxXhWc9LDSRGt2St+OZB//L0MjObIkWMfyxU4yBpFbAiIv5R0mKgNyLuyz26GgYHB2NoaKiIS9tEKv2gevphTh/sG00NJ1Ze6GbmZnZUkjZExOD48nrmg/pj4AOkKTcAZgP/MrPhWVNbOJCSUVdvqkV19To5mdm01fMM6nWkVnsbASLiYUl9uUZlzWfhgBOSmc2oepqZ7490H7Ay3cYx+YZkZmZWX4L6rKRPAwsk/Rbw36RZds3MzHIz4S0+SXMiYl9E/LWkVwC7SOPz/VFEfKNhEZqZWVua7BnU94CVkv45It4OOCmZmVnDTJaguiT9OnCmpNeP3xkRX8gvLDMza3eTJaiLSVO7L+DI6TYgNZhwgjIzs9xMNt3GTcBNkoYi4jMNjMnMzKyuoY4+I+lMYHn18RGxNse4rGw8pbuZNVg9I0n8M/DXwCrg9Oz1lCEprIV5SnczK0A9I0kMAqdEPYP2WWsaXpfG2euen7YrS0/pbmY5qqej7h3AsXkHYiU2uiUNAlttTh/s3lpMPGbWFuqpQS0C7pJ0C7CvUhgRr80tKiuXviVphPJKzQnSdq//3WJm+aknQf1J3kFYyQ2sTs+c4MjpNE4e3/vAzGzm1NOK79uNCMRKrDKdRqUVX++xKTn5+ZOZ5WiysfhuiohVkkbJRjKv7AIiIublHp2Vh6fTMLMGm6yj7qps6bmfzMys4ep5BmXtyp1zzaxA9TQzt3bkzrlmVjAnKKutunOuZqVlT38qNzNrACcoq82dc82sYPWMxfd6ST+WtFPSLkmjknY1IjgrUKVzbjV3zjWzBqqnBvWXwGsjYn5EzIuIPjcxbwMDq1Nn3L07IQ6l5Z4dqdzMrAHqSVCPRMTduUdi5VLpnNvVm273dfWmbbfiM7MGqaeZ+ZCkfwe+xJFj8XlG3VbnzrlmVqB6EtQ84EnglVVlnvLdzMxyVc9YfO9sRCBmZmbV6mnFt0zSFyU9KukRSddIWtaI4MzMrH3V00jiH4FrgeOApcBXsjIzM7Pc1JOgFkfEP0bEWPa6Clicc1xmZtbm6klQj0l6m6SO7PU2YHvegZmZWXurJ0H9BvAmYCuwBXhjVmZmZpabelrxPQC8tgGxmJmZ/cxkM+r+XkT8paSPc+SMugBExHuOdnJJ5wB/B3QAV0TERyY47nTgZuDNEfH5eoO3GeS5n8ysZCarQVWGNxqayokldQCfBF4BjADrJV0bEXfVOO4vgK9P5To2A7YPw3f+Hp7YBmP7oPNu2LoJXvweJykzK8yEz6Ai4ivZ6pMR8U/VL9LIEkdzBrA5Iu6NiP3A1cB5NY77beAa4NGnGbvNlE2fhe2b07xPc/vTcvvmVG5mVpB6Gkl8sM6y8ZYCD1Ztj2RlPyNpKfA64PI6zmd5eXAIuhfA7B5Aadm9IJWbmRVksmdQ5wKvBpZK+vuqXfOAsTrOrRpl459lfQz4QEQclGod/rNYLgIuAjjhhBPquLQ9beO/ftUoMzNroMmeQT1Mev70WmBDVfko8Dt1nHsEOL5qe1l2zmqDwNVZcloEvFrSWER8qfqgiFgDrAEYHBx8SoMNm6alg/CTmwBBZzeM7YU9j8OzVxUdmZm1sQkTVETcBtwm6YvAExFxEH7WqGFOHedeD6yQdCLwEHA+8NZx1zixsi7pKuA/xicna4DT3pRa7+15DPbugM458IyBVG5mVpB6ptv4L+DlwO5suycrO3OyN0XEmKRLSK3zOoArI+JOSRdn+/3cqSwWDsCq96Zm5ru3pmnd3czczApWT4LqjohKciIidkuaW8/JI+I64LpxZTUTU0S8o55zWk48OaGZlUw9rfiekLSysiHpF4A9+YVkZmZWXw3qfcDnJFUaOCwB3pxbRGZmZtQ3Ft96Sc8FnkNqePzDiDiQe2RmZtbW6qlBQUpOpwDdwAskERFr8wvLzMza3VETlKQ/Bs4mJajrgHOBmwAnKDMzy009jSTeCLwM2BoR7wROo75+UGZmZlNWT4LaExGHgDFJ80iDuv6PfMMyM7N2V88zqCFJC4B/IA15tBu4Jc+gzMzMJk1QSoPkfTgiHgcul/Q1YF5E3N6I4MzMrH1NeosvIgL4UtX2/U5OZmbWCPU8g7o5m5LdzMysYep5BrUauFjS/cATpM66ERGn5hmY5Wj7cBoYdnQL9C3xwLBmVkqTTVh4QkQ8QOr3ZK1i+zBsXAs9/TDvONg3mrZXXugkZWalMlkN6kvAyoj4iaRrIuINDYrJ8jS8LiWn7vlpu7IcXucEZWalMtkzqOoJv93vqVWMboE5fUeWzelL80CZmZXIZAkqJli3Zta3JN3Wq7ZvNE1SaGZWIpMlqNMk7ZI0Cpyare+SNCppV6MCtBk2sBr27IC9OyEOpeWeHanczKxEJnwGFREdjQzEGmThQGoQUWnF13ssnPwaP38ys9Kpd7oNayWe3t3MmkA9HXXNzMwazgnKzMxKybf42oVHjzCzJuMaVDuojB6xf3caPWL/7rS9fbjoyMzMJuQE1Q6qR4/QrLTs6U/lZmYl5QTVDjx6hJk1ISeoduDRI8ysCTlBtQOPHmFmTcgJqh1URo/o6k23+7p6Pb2GmZWem5m3C48eYWZNxjUoMzMrJScoMzMrJScoMzMrJScoMzMrJScoMzMrJScoMzMrpVwTlKRzJP1I0mZJl9bYf4Gk27PXdyWdlmc8ZmbWPHJLUJI6gE8C5wKnAG+RdMq4w+4DfikiTgU+BKzJKx4zM2suedagzgA2R8S9EbEfuBo4r/qAiPhuROzINm8GluUYj5mZNZE8E9RS4MGq7ZGsbCLvAr5aa4ekiyQNSRratm3bDIZoZmZllWeCUo2yqHmgtJqUoD5Qa39ErImIwYgYXLx48QyGaGZmZZXnWHwjwPFV28uAh8cfJOlU4Arg3IjYnmM8ZmbWRPKsQa0HVkg6UVIXcD5wbfUBkk4AvgC8PSLuyTEWMzNrMrnVoCJiTNIlwNeBDuDKiLhT0sXZ/suBPwIWAp+SBDAWEYN5xWRmZs1DETUfC5XW4OBgDA0NFR2GmZnNEEkbalVOPJKEmZmVkhOUmZmVkhOUmZmVkhOUmZmVkhOUmZmVUp4dda2Rtg/D8DoY3QJ9S2BgNSwcKDoqM7Mpc4JqBduH4fo/h8fugf27oasX7v8OvOwPnKTMrGn5Fl8r+P6nYeT7EAdh7jPScuT7qdzMrEm5BtUK7v0WdPVB19y03TUXIlK5mVmTcoJqBWP7oKMLdm+Dg/vTemc3HNpfdGRmZlPmW3ytYN5S2L01S06z03L3VuibbPotM7Nyc4JqBc98HnT2pPWDB9KysyeVm5k1Kd/iawU98+CUX4WRW2Dv49C9AJadkcrNzJqUE1Qr6FsCc/rgWb9+uGzvztTc3MysSfkWXysYWA17dqSkFIfScs+OVG5m1qScoFrBwgFYeWGqMY1uScuVF7qTrpk1Nd/iaxULB5yQzKyluAZlZmal5ARlZmal5ARlZmal5ARlZmal5ARlZmal5FZ8zcSTEppZG3ENqllsH4aNa9OEhPOOS8uNa1O5mVkLcg2q7Cq1ph99FTrnwHHPB82C7vlp//A616LMrCW5BlVm1bUmAQgeuBme2Jb2z+lL02qYmbUgJ6gyG14HPf2pttS9ACSYPRe2/Sjt3zcKvccWGqKZWV6coMpsdEuqJQEsOgkOPAlEGgzWA8KaWYvzM6gy2bwOfrAWdj2cGkIcswj29aUaVO8z4fgXwtbbICINCHvya/z8ycxalhNUWWxeB+v+HLr7Yf4y2LMTtt0Di1akhhFz+lIjiYUrPFK5mbUFJ6gi1OrP9IO1KTnN7U/HVJb7nzg8jUbvsa41mVnbcIJqpO3DsOmzsPmb0LsYnnXqkf2ZFq048vie+bBrBM74zWLiNTMrkBPUTLrhozD0Gdj7eGp1N/guOOv9aV+lyfhjP4ZjngkIRm5Jz5V6+tP2np2Ha06QtvuOa/znMDMrASeoo6m+HafO1O7x4NhThxq64aNw419Dx5yUnPY/mbYhJalKk/GD+6FnAVnHJnjsHnj2man2tOO+VNYzPyWnvTvgRe9u7Oc1MyuJXBOUpHOAvwM6gCsi4iPj9ivb/2rgSeAdEbExt4Cqk01HJxwCoirZ7HjgyFZ0Ay+H7fekxDJrNtx/YzrPiWcdvjVXabAw9JksOfWmY7p7YS+p/Kz3p2vOOy61yDuwF2b3QGd3ai6+bxRO+EV4/gXZ9UdSzelF74afczNyM2tPuSUoSR3AJ4FXACPAeknXRsRdVYedC6zIXi8ELsuWM69yi62nHzq64L4bUvnyl6Rkc/2H0u23viWHW9F9+8Nw4tnQvxy2bspuxZFqPctXpfXKUEOV23rVuuamckjn3TcKi5+TRoMAIKBzdurPVGn84IRkZgbk21H3DGBzRNwbEfuBq4Hzxh1zHrA2kpuBBZKW5BJN9agMj2W1op5+2P7jrOzHqTY1tz+NdTe3H2Z1psQEqabT2Q2zu2HfrlRWPdRQ5bZetf1PHk5aA6tTIuroSs+d4hDsfhSe+fNuNm5mVkOeCWop8GDV9khW9nSPQdJFkoYkDW3btm1q0VSPyrB3Z0o0nd2wN0s2+3enDrDVuufDnp8eXh/bm27PzZmXyqqHGhp8FxzcB3t3w6FDaXlwXyqHlIBWXpiajB86AAMvhdddDi/9oJOTmVkNeT6DUo2ymMIxRMQaYA3A4ODgU/bXpXKLrXv+4edAAN1ZsunqTTWoarPnwuwnU0JbuOLIZ1CVoYZOfk0qq7TWO6IV328fLoeUiJyMzMzqkmeCGgGOr9peBjw8hWNmxsDq9AwK0rh21c+g9u5Mrege+zE8ueNwK7qD++HM98HYnlTDevaqVOc8dAC6Fj610+xZ7z8yIZmZ2ZTlmaDWAysknQg8BJwPvHXcMdcCl0i6mtQ4YmdEbMklmsottuF1KdmcuOpwK76uXnjZH1a14nMrOjOzouWWoCJiTNIlwNdJzcyvjIg7JV2c7b8cuI7UxHwzqZn5O/OKBzj6LTa3ojMzK41c+0FFxHWkJFRddnnVegDuiWpmZk/h+aDMzKyUnKDMzKyUnKDMzKyUnKDMzKyUnKDMzKyUFOOH9yk5SduAnxzlsEXAYw0Ip4za+bNDe39+f/b21Aqf/dkRsXh8YdMlqHpIGoqIwaLjKEI7f3Zo78/vz+7P3mp8i8/MzErJCcrMzEqpVRPUmqIDKFA7f3Zo78/vz96eWvazt+QzKDMza36tWoMyM7Mm5wRlZmal1HIJStI5kn4kabOkS4uOp1EkXSnpUUl3FB1Lo0k6XtI6SXdLulPSe4uOqVEkdUu6RdJt2Wf/06JjajRJHZJ+IOk/io6l0STdL2mTpFslDRUdz0xrqWdQkjqAe4BXkGbrXQ+8JSLuKjSwBpB0FrAbWBsR/7PoeBpJ0hJgSURslNQHbAB+tU1+dwHHRMRuSbOBm4D3RsTNBYfWMJLeDwwC8yLiV4qOp5Ek3Q8MRkSzd9StqdVqUGcAmyPi3ojYD1wNnFdwTA0RETcAPy06jiJExJaI2JitjwJ3A0uLjaoxItmdbc7OXq3zr86jkLQM+GXgiqJjsZnXaglqKfBg1fYIbfKHyhJJy4EXAN8vOJSGyW5x3Qo8CnwjItrmswMfA34POFRwHEUJ4L8kbZB0UdHBzLRWS1CqUdY2/5psd5J6gWuA90XErqLjaZSIOBgRzweWAWdIaotbvJJ+BXg0IjYUHUuBXhwRK4FzgXdnt/pbRqslqBHg+KrtZcDDBcViDZQ9f7kG+NeI+ELR8RQhIh4HvgWcU2wkDfNi4LXZc5irgZdK+pdiQ2qsiHg4Wz4KfJH0mKNltFqCWg+skHSipC7gfODagmOynGUNBT4D3B0RHy06nkaStFjSgmy9B3g58MNCg2qQiPhgRCyLiOWk/9e/GRFvKzishpF0TNYoCEnHAK8EWqoVb0slqIgYAy4Bvk56UP7ZiLiz2KgaQ9K/Ad8DniNpRNK7io6pgV4MvJ30L+hbs9eriw6qQZYA6yTdTvoH2jciou2aW7epZwE3SboNuAX4z4j4WsExzaiWamZuZmato6VqUGZm1jqcoMzMrJScoMzMrJScoMzMrJScoMzMrJScoKwhJB0r6WpJw5LuknSdpJOmeK73SZo7xfc+v4gm6JJ2H/2op3W+F0i6Ilv/E0m/+zTeu0DS/3oax39a0ounEmcjZP9drSg6Dpt5TlCWu6wj7ReBb0XEQEScAvw+qR/HVLwPmFKCAp4PNFUfKUmdNYp/H/j4FE+5AKg7QQEvBMo8OvplpPH4rMU4QVkjrAYORMTllYKIuDUiblTyV5LuyOa1eTOApLMlfUvS5yX9UNK/Zse+BziO1Dl1XXbsZZKGxs+HJOl0Sd/N5kq6RdJ84M+AN2eded9cHaSkd0j6gqSvSfqxpL+s2re7av2Nkq7K1q/Krr9O0r2Sfklpbq67K8dUve9vJG2UdL2kxVnZQHa9DZJulPTcqvN+NPuMfzHuPH3AqRFxW1XxaZK+mcX9W1XH/m9J6yXdXvXdfAQYyL6Dv5LUm8W0MfsNzqt6/8nAPRFxMPs+b5f0vcpvlh2zPIt9Y/Y6s+o3/Lakz0q6R9JHJF2Q/RabJA08ne9wot8ZuBF4+QSJ3JpZRPjlV64v4D3A306w7w3AN4AOUo3qAdLoCGcDO0njKc4ijZKxKnvP/cCiqnM8I1t2kMaiOxXoAu4FTs/2zQM6gXcAn5gglndk75kPdAM/AY7P9u2uOu6NwFXZ+lWkceBEmtplF/DzWcwbgOdnxwVwQbb+R5UYgOuBFdn6C0nD9VTO+x9AR404VwPXVG3/CXAb0AMsIo3ofxxp6Js1WWyzsvOdBSwH7qh6fydpLiWy92/mcCf+9wO/ka3fAZyZrX+kcg5SbbY7W18BDGXrZwOPZ7/nHOAh4E+zfe8FPvY0v8On/M5Vn+EbwC8U/d+6XzP7cg3KirYK+LdII3I/AnwbOD3bd0tEjETEIeBW0h/WWt4kaSPwA+B5wCnAc4AtEbEeICJ2RRoK62iuj4idEbEXuAt4dh3v+Uqkv5KbgEciYlMW851VMR8C/j1b/xdgldLo62cCn1OaLuPTpD/mFZ+LiIM1rrcE2Dau7MsRsSfSxHXrSIOGvjJ7/QDYCDyXlEDGE/B/lYZL+m/SFDWV26+vAr6mNN5fX0R8Nyv/f1Xvnw38g6RNwOdI33/F+kjzde0DhoH/yso3ceTvWc93WOt3rniUlJSthbhKbI1wJ6nWUUutKVIq9lWtH6TGf6+STgR+l1RT2pHdEurOzjuVcbwmumb1uboneM+hce8/VCvmqvPNAh6PNFVGLU9MUL6nRgzjP2uQvoMPR8Snq3cozZlV7QJgMakGckBpdPBupYYoCyLiYUn9E8QC8DvAI8BppM+0t2rf+O+j+rvqrHFcze9wkt+5opv0vVgLcQ3KGuGbwJxxz0ZOl/RLwA2kZ0Id2XOZs0gDX05mFOjL1ueR/pDvlPQs0rw4kEb0Pk7S6dn1+rJnFNXvfToekXSypFnA66bw/lkcTtJvBW6KNGfVfZJ+LYtRkk6r41x3Az83ruw8Sd2SFpJura0nDZr8G1lNDUlLJT2Tp34H80nzKh2QtJrDtcbVpNoYEbEDGJX0i9m+88e9f0tW43k76RbcTJvod644ifQPIWshrkFZ7iIiJL0O+JikS0n/wr6f1BrvBuBFpGcoAfxeRGytNBaYwBrgq5K2RMRqST8g/XG6F/hOds39WSOIjytNQ7GHNBXFOuDS7JbahyPi32te4akuJT3DeZD0LKa33s+feQJ4nqQNpGdrlQYaFwCXSfoD0q2yq0nfxYQi4oeS5kvqizTFPWSjWQMnAB+KNE/Qw1kjh+9JAtgNvC0ihiV9J2vk8FVSI4yvSBoi3UqtTNdxLvD5qku/i3Qr7wnSM6CdWfmngGuyRLuOiWt+UxYRt9X6nQGyhLUnIrbM9HWtWB7N3KwJSfodYDQirsjxGhuBF0bEgWy7NyJ2Z+uXAksi4r15Xb9e2XexKyI+U3QsNrN8i8+sOV3Gkc9qZlxErKwkp8wvZ03T7wBeAvx5ntd/Gh4H/qnoIGzmuQZlZmal5BqUmZmVkhOUmZmVkhOUmZmVkhOUmZmVkhOUmZmV0v8Hz1KTiFZvcNQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "plot_sweep_frame(frame)\n", - "\n", - "decorate(xlabel='Contact number (beta/gamma)',\n", - " ylabel='Fraction infected')" - ] - }, - { - "cell_type": "markdown", - "id": "systematic-gossip", - "metadata": {}, - "source": [ - "The results fall on a single curve, at least approximately. That means that we can predict the fraction of students who will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." - ] - }, - { - "cell_type": "markdown", - "id": "theoretical-arrow", - "metadata": {}, - "source": [ - "## Contact number\n", - "\n", - "From Section xxx, recall that the number of new infections in a\n", - "given day is $\\beta s i N$, and the number of recoveries is\n", - "$\\gamma i N$. If we divide these quantities, the result is\n", - "$\\beta s / \\gamma$, which is the number of new infections per recovery\n", - "(as a fraction of the population).\n", - "\n", - "When a new disease is introduced to a susceptible population, $s$ is\n", - "approximately 1, so the number of people infected by each sick person is $\\beta / \\gamma$. This ratio is called the \"contact number\\\" or \"basic reproduction number\\\" (see ). By convention it is usually denoted $R_0$, but in the context of an SIR model, this notation is confusing, so we'll use $c$ instead." - ] - }, - { - "cell_type": "markdown", - "id": "intimate-romance", - "metadata": {}, - "source": [ - "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", - "Section xxx:\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{ds}{dt} &= -\\beta s i \\\\\n", - "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", - "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", - "\n", - "In the same way we divided the\n", - "contact rate by the infection rate to get the dimensionless quantity\n", - "$c$, now we'll divide $di/dt$ by $ds/dt$ to get a ratio of rates:\n", - "\n", - "$$\\frac{di}{ds} = -1 + \\frac{1}{cs}$$ \n", - "\n", - "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." - ] - }, - { - "cell_type": "markdown", - "id": "revolutionary-motorcycle", - "metadata": {}, - "source": [ - "Here's how the derivation goes. We multiply both sides of the previous\n", - "equation by $ds$: \n", - "\n", - "$$di = \\left( -1 + \\frac{1}{cs} \\right) ds$$ \n", - "\n", - "And then integrate both sides: \n", - "\n", - "$$i = -s + \\frac{1}{c} \\log s + q$$ \n", - "\n", - "where $q$ is a constant of integration. Rearranging terms yields:\n", - "\n", - "$$q = i + s - \\frac{1}{c} \\log s$$ \n", - "\n", - "Now let's see if we can figure out what $q$ is. At the beginning of an epidemic, if the fraction infected is small and nearly everyone is susceptible, we can use the approximations $i(0) = 0$ and $s(0) = 1$ to compute $q$:\n", - "\n", - "$$q = 0 + 1 + \\frac{1}{c} \\log 1$$ \n", - "\n", - "Since $\\log 1 = 0$, we get $q = 1$." - ] - }, - { - "cell_type": "markdown", - "id": "spread-convert", - "metadata": {}, - "source": [ - "Now, at the end of the epidemic, let's assume that $i(\\infty) = 0$, and $s(\\infty)$ is an unknown quantity, $s_{\\infty}$. Now we have:\n", - "\n", - "$$q = 1 = 0 + s_{\\infty}- \\frac{1}{c} \\log s_{\\infty}$$ \n", - "\n", - "Solving for $c$, we get $$c = \\frac{\\log s_{\\infty}}{s_{\\infty}- 1}$$ By relating $c$ and $s_{\\infty}$, this equation makes it possible to estimate $c$ based on data, and possibly predict the behavior of future epidemics." - ] - }, - { - "cell_type": "markdown", - "id": "intended-worker", - "metadata": {}, - "source": [ - "## Analysis and simulation\n", - "\n", - "Let's compare this analytic result to the results from simulation. I'll create an array of values for $s_{\\infty}$" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "id": "previous-schedule", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linspace\n", - "\n", - "s_inf_array = linspace(0.0001, 0.999, 31)" - ] - }, - { - "cell_type": "markdown", - "id": "positive-float", - "metadata": {}, - "source": [ - "And compute the corresponding values of $c$:" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "valuable-landscape", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import log\n", - "\n", - "c_array = log(s_inf_array) / (s_inf_array - 1)" - ] - }, - { - "cell_type": "markdown", - "id": "premium-carry", - "metadata": {}, - "source": [ - "To get the total infected, we compute the difference between $s(0)$ and\n", - "$s(\\infty)$, then store the results in a `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "id": "composite-cabinet", - "metadata": {}, - "outputs": [], - "source": [ - "frac_infected = 1 - s_inf_array" - ] - }, - { - "cell_type": "markdown", - "id": "bottom-print", - "metadata": {}, - "source": [ - "Recall from Section [\\[dataframe\\]](#dataframe){reference-type=\"ref\"\n", - "reference=\"dataframe\"} that a `Series` object contains an index and a\n", - "corresponding sequence of values. In this case, the index is `c_array`\n", - "and the values are from `frac_infected`.\n", - "\n", - "Now we can plot the results:" - ] - }, - { - "cell_type": "markdown", - "id": "active-street", - "metadata": {}, - "source": [ - " compares the analytic results from this\n", - "section with the simulation results from\n", - "Section [\\[nondim\\]](#nondim){reference-type=\"ref\" reference=\"nondim\"}." - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "integral-reading", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_sweep_frame(frame)\n", - "plot(c_array, frac_infected, label='analysis')\n", - "\n", - "decorate(xlabel='Contact number (c)',\n", - " ylabel='Fraction infected')" - ] - }, - { - "cell_type": "markdown", - "id": "peaceful-interest", - "metadata": {}, - "source": [ - "When the contact number exceeds 1, analysis and simulation agree. When\n", - "the contact number is less than 1, they do not: analysis indicates there should be no infections; in the simulations there are a small number of infections.\n", - "\n", - "The reason for the discrepancy is that the simulation divides time into a discrete series of days, whereas the analysis treats time as a\n", - "continuous quantity. In other words, the two methods are actually based on different models. So which model is better?\n", - "\n", - "Probably neither. When the contact number is small, the early progress\n", - "of the epidemic depends on details of the scenario. If we are lucky, the original infected person, \"patient zero\", infects no one and there is no epidemic. If we are unlucky, patient zero might have a large number of close friends, or might work in the dining hall (and fail to observe safe food handling procedures).\n", - "\n", - "For contact numbers near or less than 1, we might need a more detailed\n", - "model. But for higher contact numbers the SIR model might be good\n", - "enough." - ] - }, - { - "cell_type": "markdown", - "id": "beginning-capital", - "metadata": {}, - "source": [ - "## Estimating contact number\n", - "\n", - "Figure xxx shows that if we know the contact number, we can compute the fraction infected. But we can also read the figure the other way; that is, at the end of an epidemic, if we can estimate the fraction of the population that was ever infected, we can use it to estimate the contact number.\n", - "\n", - "Well, in theory we can. In practice, it might not work very well,\n", - "because of the shape of the curve. When the contact number is near 2,\n", - "the curve is quite steep, which means that small changes in $c$ yield\n", - "big changes in the number of infections. If we observe that the total\n", - "fraction infected is anywhere from 20% to 80%, we would conclude that\n", - "$c$ is near 2.\n", - "\n", - "On the other hand, for larger contact numbers, nearly the entire\n", - "population is infected, so the curve is nearly flat. In that case we\n", - "would not be able to estimate $c$ precisely, because any value greater\n", - "than 3 would yield effectively the same results. Fortunately, this is\n", - "unlikely to happen in the real world; very few epidemics affect anything close to 90% of the population.\n", - "\n", - "So the SIR model has limitations; nevertheless, it provides insight into the behavior of infectious disease, especially the phenomenon of herd immunity. As we saw in Chapter xxx, if we know the parameters of the model, we can use it to evaluate possible interventions. And as we saw in this chapter, we might be able to use data from earlier outbreaks to estimate the parameters.\n" - ] - }, - { - "cell_type": "markdown", - "id": "olive-niger", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "upper-interim", - "metadata": {}, - "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", - "\n", - "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", - "\n", - "What do the results look like, and what does that imply? " - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "talented-discovery", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def plot_sweep_frame_difference(frame):\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta - gamma, frac_infected, 'ro', \n", - " color='C1', alpha=0.4)" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "bright-label", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_sweep_frame_difference(frame)\n", - "\n", - "decorate(xlabel='Excess infection rate (infections-recoveries per day)',\n", - " ylabel='Fraction infected')" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "suspended-louisiana", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# The results don't fall on a line, which means that if we \n", - "# know the difference between `beta` and `gamma`, \n", - "# but not their ratio, that's not enough to predict \n", - "# the fraction infected." - ] - }, - { - "cell_type": "markdown", - "id": "understanding-fault", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", - "\n", - "What is your best estimate of `c`?\n", - "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "another-timing", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9.211261 0.999900\n", - "3.516747 0.966603\n", - "2.901137 0.933307\n", - "2.558511 0.900010\n", - "2.325167 0.866713\n", - "2.150496 0.833417\n", - "2.012246 0.800120\n", - "1.898689 0.766823\n", - "1.802908 0.733527\n", - "1.720492 0.700230\n", - "1.648460 0.666933\n", - "1.584709 0.633637\n", - "1.527703 0.600340\n", - "1.476285 0.567043\n", - "1.429566 0.533747\n", - "1.386847 0.500450\n", - "1.347569 0.467153\n", - "1.311281 0.433857\n", - "1.277610 0.400560\n", - "1.246247 0.367263\n", - "1.216935 0.333967\n", - "1.189452 0.300670\n", - "1.163613 0.267373\n", - "1.139256 0.234077\n", - "1.116242 0.200780\n", - "1.094449 0.167483\n", - "1.073772 0.134187\n", - "1.054117 0.100890\n", - "1.035401 0.067593\n", - "1.017551 0.034297\n", - "1.000500 0.001000\n", - "dtype: float64" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "from pandas import Series\n", - "\n", - "Series(frac_infected, index=c_array)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "gross-terry", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# It looks like the fraction infected is 0.26 when the contact \n", - "# number is about 1.16" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "stopped-zealand", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap15.ipynb b/jupyter/chap15.ipynb deleted file mode 100644 index cd848e13..00000000 --- a/jupyter/chap15.ipynb +++ /dev/null @@ -1,1038 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "located-subscription", - "metadata": {}, - "source": [ - "# Chapter 15" - ] - }, - { - "cell_type": "markdown", - "id": "american-article", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "adjusted-motivation", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "italic-murder", - "metadata": {}, - "source": [ - "So far the systems we have studied have been physical in the sense that they exist in the world, but they have not been physics, in the sense of what physics classes are usually about. In the next few chapters, we'll do some physics, starting with **thermal systems**, that is, systems where the temperature of objects changes as heat transfers from one to another." - ] - }, - { - "cell_type": "markdown", - "id": "honey-rolling", - "metadata": {}, - "source": [ - "## The coffee cooling problem\n", - "\n", - "The coffee cooling problem was discussed by Jearl Walker in \n", - "\"The Amateur Scientist\", *Scientific American*, Volume 237, Issue 5, November 1977. Since then it has become a standard example of modeling and simulation.\n", - "\n", - "Here is my version of the problem:\n", - "\n", - "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?" - ] - }, - { - "cell_type": "markdown", - "id": "appreciated-ukraine", - "metadata": {}, - "source": [ - "To help answer this question, I made a trial run with the milk and\n", - "coffee in separate containers and took some measurements (not really):\n", - "\n", - "- When served, the temperature of the coffee is 90 °C. The volume is\n", - " 300 mL.\n", - "\n", - "- The milk is at an initial temperature of 5 °C, and I take about\n", - " 50 mL.\n", - "\n", - "- The ambient temperature in my car is 22 °C.\n", - "\n", - "- The coffee is served in a well insulated cup. When I arrive at work after 30 minutes, the temperature of the coffee has fallen to 70 °C.\n", - "\n", - "- The milk container is not as well insulated. After 15 minutes, it\n", - " warms up to 20 °C, nearly the ambient temperature.\n", - "\n", - "To use this data and answer the question, we have to know something\n", - "about temperature and heat, and we have to make some modeling decisions." - ] - }, - { - "cell_type": "markdown", - "id": "juvenile-republican", - "metadata": {}, - "source": [ - "## Temperature and heat\n", - "\n", - "To understand how coffee cools (and milk warms), we need a model of\n", - "temperature and heat. **Temperature** is a property of an object or a\n", - "system; in SI units it is measured in degrees Celsius (°C). Temperature quantifies how hot or cold the object is, which is related to the average velocity of the particles that make up the object.\n", - "\n", - "When particles in a hot object contact particles in a cold object, the\n", - "hot object gets cooler and the cold object gets warmer as energy is\n", - "transferred from one to the other. The transferred energy is called\n", - "**heat**; in SI units it is measured in joules (J).\n", - "\n", - "Heat is related to temperature by the following equation (see\n", - "): \n", - "\n", - "$$Q = C~\\Delta T$$ \n", - "\n", - "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the **thermal mass** of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." - ] - }, - { - "cell_type": "markdown", - "id": "purple-edward", - "metadata": {}, - "source": [ - "For objects made primarily from one material, thermal mass can be\n", - "computed like this: \n", - "\n", - "$$C = m c_p$$ \n", - "\n", - "where $m$ is the mass of the object and $c_p$ is the **specific heat capacity** of the material (see ).\n", - "\n", - "We can use these equations to estimate the thermal mass of a cup of\n", - "coffee. The specific heat capacity of coffee is probably close to that\n", - "of water, which is 4.2 J/g/°C. Assuming that the density of coffee is\n", - "close to that of water, which is 1 g/mL, the mass of 300 mL of coffee is 300 g, and the thermal mass is 1260 J/°C.\n", - "\n", - "So when a cup of coffee cools from 90 °C to 70 °C, the change in\n", - "temperature, $\\Delta T$ is 20 °C, which means that 25 200 J of heat\n", - "energy was transferred from the coffee to the surrounding environment\n", - "(the cup holder and air in my car).\n", - "\n", - "To give you a sense of how much energy that is, if you were able to\n", - "harness all of that heat to do work (which you cannot), you could\n", - "use it to lift a cup of coffee from sea level to 8571 m, just shy of the height of Mount Everest, 8848 m.\n", - "\n", - "Assuming that the cup has less mass than the coffee, and is made from a material with lower specific heat, we can ignore the thermal mass of the cup. For a cup with substantial thermal mass, like a ceramic mug, we might consider a model that computes the temperature of coffee and cup separately." - ] - }, - { - "cell_type": "markdown", - "id": "running-metropolitan", - "metadata": {}, - "source": [ - "## Heat transfer\n", - "\n", - "In a situation like the coffee cooling problem, there are three ways\n", - "heat transfers from one object to another (see ):\n", - "\n", - "- Conduction: When objects at different temperatures come into\n", - " contact, the faster-moving particles of the higher-temperature\n", - " object transfer kinetic energy to the slower-moving particles of the lower-temperature object.\n", - "\n", - "- Convection: When particles in a gas or liquid flow from place to\n", - " place, they carry heat energy with them. Fluid flows can be caused\n", - " by external action, like stirring, or by internal differences in\n", - " temperature. For example, you might have heard that hot air rises,\n", - " which is a form of \"natural convection\\\".\n", - "\n", - "- Radiation: As the particles in an object move due to thermal energy,\n", - " they emit electromagnetic radiation. The energy carried by this\n", - " radiation depends on the object's temperature and surface properties\n", - " (see )." - ] - }, - { - "cell_type": "markdown", - "id": "convertible-alabama", - "metadata": {}, - "source": [ - "For objects like coffee in a car, the effect of radiation is much\n", - "smaller than the effects of conduction and convection, so we will ignore it.\n", - "\n", - "Convection can be a complex topic, since it often depends on details of fluid flow in three dimensions. But for this problem we will be able to get away with a simple model called \"Newton's law of cooling\"." - ] - }, - { - "cell_type": "markdown", - "id": "expected-implementation", - "metadata": {}, - "source": [ - "## Newton's law of cooling\n", - "\n", - "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the\n", - "object and the surrounding environment:\n", - "\n", - "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", - "\n", - "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." - ] - }, - { - "cell_type": "markdown", - "id": "educated-accommodation", - "metadata": {}, - "source": [ - "Newton's so-called \"law \" is really a model: it is a good approximation in some conditions and less good in others.\n", - "\n", - "For example, if the primary mechanism of heat transfer is conduction,\n", - "Newton's law is \"true\", which is to say that $r$ is constant over a\n", - "wide range of temperatures. And sometimes we can estimate $r$ based on\n", - "the material properties and shape of the object.\n", - "\n", - "When convection contributes a non-negligible fraction of heat transfer, $r$ depends on temperature, but Newton's law is often accurate enough, at least over a narrow range of temperatures. In this case $r$ usually has to be estimated experimentally, since it depends on details of surface shape, air flow, evaporation, etc.\n", - "\n", - "When radiation makes up a substantial part of heat transfer, Newton's\n", - "law is not a good model at all. This is the case for objects in space or in a vacuum, and for objects at high temperatures (more than a few\n", - "hundred degrees Celsius, say).\n", - "\n", - "However, for a situation like the coffee cooling problem, we expect\n", - "Newton's model to be quite good." - ] - }, - { - "cell_type": "markdown", - "id": "determined-seventh", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "To get started, let's forget about the milk temporarily and focus on the coffee. \n", - "\n", - "Here's a function that takes the parameters of the system and makes a `System` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "geological-graph", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "def make_system(T_init, volume, r, t_end):\n", - " return System(T_init=T_init,\n", - " T_final=T_init,\n", - " volume=volume,\n", - " r=r,\n", - " t_end=t_end,\n", - " T_env=22,\n", - " t_0=0,\n", - " dt=1)" - ] - }, - { - "cell_type": "markdown", - "id": "further-allen", - "metadata": {}, - "source": [ - "The values of `T_init`, `volume`, and `t_end` come from the statement of the problem:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "eastern-alignment", - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)" - ] - }, - { - "cell_type": "markdown", - "id": "corrected-cross", - "metadata": {}, - "source": [ - "I chose the value of `r` arbitrarily for now; we will figure out how to estimate it soon.\n", - "\n", - "In addition, `make_system` sets the temperature of the environment, `T_env`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", - "\n", - "Strictly speaking, Newton's law is a differential equation, but over a short period of time we can approximate it with a difference equation:\n", - "\n", - "$$\\Delta T = -r (T - T_{env}) dt$$ \n", - "\n", - "where $dt$ is the time step and $\\Delta T$ is the change in temperature during that time step.\n", - "\n", - "Note: I use $\\Delta T$ to denote a change in temperature over time, but in the context of heat transfer, you might also see $\\Delta T$ used to denote the difference in temperature between an object and its\n", - "environment, $T - T_{env}$. To minimize confusion, I avoid this second\n", - "use.\n", - "\n", - "The following function takes the current temperature, `T`, the current time `t`, and a `System` object, and computes the change in temperature during a time step:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "vulnerable-sarah", - "metadata": {}, - "outputs": [], - "source": [ - "def change_func(T, t, system):\n", - " r, T_env, dt = system.r, system.T_env, system.dt \n", - " return -r * (T - T_env) * dt" - ] - }, - { - "cell_type": "markdown", - "id": "unknown-programming", - "metadata": {}, - "source": [ - "We can test it with the initial temperature of the coffee, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "killing-tragedy", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.68" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "change_func(coffee.T_init, 0, coffee)" - ] - }, - { - "cell_type": "markdown", - "id": "geographic-female", - "metadata": {}, - "source": [ - "With `dt=1` minute, the temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", - "\n", - "Now here's a version of `run_simulation` that simulates a series of time steps from `t_0` to `t_end`:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "basic-extra", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import linrange\n", - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(system, change_func):\n", - " t_array = linrange(system.t_0, system.t_end, system.dt)\n", - " n = len(t_array)\n", - " \n", - " series = TimeSeries(index=t_array)\n", - " series.iloc[0] = system.T_init\n", - " \n", - " for i in range(n-1):\n", - " t = t_array[i]\n", - " T = series.iloc[i]\n", - " series.iloc[i+1] = T + change_func(T, t, system)\n", - " \n", - " system.t_end = t_array[-1]\n", - " system.T_final = series.iloc[-1]\n", - " return series" - ] - }, - { - "cell_type": "markdown", - "id": "voluntary-velvet", - "metadata": {}, - "source": [ - "This function is similar to previous versions of `run_simulation`.\n", - "\n", - "One difference is that it uses `linrange` to make an array of values\n", - "from `t_0` to `t_end` with time step `dt`.\n", - "\n", - "We can run it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "after-championship", - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(coffee, change_func)" - ] - }, - { - "cell_type": "markdown", - "id": "consecutive-party", - "metadata": {}, - "source": [ - "The result is a `TimeSeries` with one row per time step. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "proof-guard", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Time\n", - "0.0 90.000000\n", - "1.0 89.320000\n", - "2.0 88.646800\n", - "3.0 87.980332\n", - "4.0 87.320529\n", - "Name: Quantity, dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "markdown", - "id": "limiting-legislation", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "expected-company", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.plot(label='coffee')\n", - "\n", - "decorate(xlabel='Time (minute)',\n", - " ylabel='Temperature (C)',\n", - " title='Coffee Cooling')" - ] - }, - { - "cell_type": "markdown", - "id": "alien-score", - "metadata": {}, - "source": [ - "The temperature after 30 minutes is 72.3 °C, which is a little higher than what's stated in the problem, 70 °C. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "protecting-picture", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "72.2996253904031" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "tight-operation", - "metadata": {}, - "source": [ - "By trial and error, we could find the value of `r` where the final temperature is precisely 70 °C.\n", - "But it is more efficient to use a root-finding algorithm." - ] - }, - { - "cell_type": "markdown", - "id": "equipped-blackberry", - "metadata": {}, - "source": [ - "## Finding roots\n", - "\n", - "The SciPy library provides a function called `root_scalar` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", - "\n", - "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", - "\n", - "A **root** is a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", - "\n", - "I'll use this example to demonstrate `root_scalar`. First, we have to\n", - "write a function that evaluates $f$:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "round-budapest", - "metadata": {}, - "outputs": [], - "source": [ - "def func(x):\n", - " return (x-1) * (x-2) * (x-3)" - ] - }, - { - "cell_type": "markdown", - "id": "injured-limitation", - "metadata": {}, - "source": [ - "Now we call `root_scalar` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "regulated-cloud", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 3\n", - " iterations: 2\n", - " root: 2.0" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from scipy.optimize import root_scalar\n", - "\n", - "res = root_scalar(func, bracket=[1.5, 2.5])\n", - "res" - ] - }, - { - "cell_type": "markdown", - "id": "regulated-weekend", - "metadata": {}, - "source": [ - "The first argument is the function whose roots we want. The second\n", - "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which stores the root that was found." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "advised-climate", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "id": "changing-winter", - "metadata": {}, - "source": [ - "If we provide a different interval, we find a different root." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "authentic-hunter", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_scalar(func, bracket=[2.5, 3.5])\n", - "res.root" - ] - }, - { - "cell_type": "markdown", - "id": "bound-freight", - "metadata": {}, - "source": [ - "If the interval doesn't contain a root, you'll get a `ValueError`:\n", - "\n", - "```\n", - "res = root_scalar(func, bracket=[4, 5])\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "caroline-divide", - "metadata": {}, - "source": [ - "Now we can use `root_scalar` to estimate `r`." - ] - }, - { - "cell_type": "markdown", - "id": "imperial-engineering", - "metadata": {}, - "source": [ - "## Estimating `r`\n", - "\n", - "What we want is the value of `r` that yields a final temperature of\n", - "70 °C. To use `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "quality-colors", - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(r, system):\n", - " system.r = r\n", - " results = run_simulation(system, change_func)\n", - " return system.T_final - 70" - ] - }, - { - "cell_type": "markdown", - "id": "random-loading", - "metadata": {}, - "source": [ - "This is called an \"error function\" because it returns the\n", - "difference between what we got and what we wanted, that is, the error.\n", - "With the right value of `r`, the error is 0.\n", - "\n", - "We can test `error_func` like this, using the initial guess `r=0.01`:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "unknown-pharmacy", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.2996253904030937" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)\n", - "error_func(0.01, coffee)" - ] - }, - { - "cell_type": "markdown", - "id": "moderate-monkey", - "metadata": {}, - "source": [ - "The result is an error of 2.3 °C, because the final temperature with\n", - "this value of `r` is too high." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "fossil-israel", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-10.907066281994297" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(0.02, coffee)" - ] - }, - { - "cell_type": "markdown", - "id": "south-fabric", - "metadata": {}, - "source": [ - "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", - "\n", - "So we can call `root_scalar` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "backed-while", - "metadata": {}, - "outputs": [], - "source": [ - "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])" - ] - }, - { - "cell_type": "markdown", - "id": "exotic-development", - "metadata": {}, - "source": [ - "The first argument is the error function.\n", - "The second argument is the `System` object, which `root_scalar` passes as an argument to `error_func`.\n", - "The third argument is an interval that brackets the root.\n", - "\n", - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "crazy-panic", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 7\n", - " iterations: 6\n", - " root: 0.011543084584004043" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "early-twelve", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011543084584004043" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee = res.root\n", - "r_coffee" - ] - }, - { - "cell_type": "markdown", - "id": "greenhouse-designer", - "metadata": {}, - "source": [ - "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", - "\n", - "We can confirm that this value is correct by setting `r` to the root we found and running the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "foster-lodging", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "69.99999999996255" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee.r = res.root\n", - "run_simulation(coffee, change_func)\n", - "coffee.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "sweet-horizontal", - "metadata": {}, - "source": [ - "The final temperature is very close to 70 °C." - ] - }, - { - "cell_type": "markdown", - "id": "imposed-complement", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 °C, in a vessel with `r=0.1`, for 15 minutes, and plot the results.\n", - "\n", - "By trial and error, find a value for `r` that makes the final temperature close to 20 °C." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "radical-accident", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "18.499850754390966" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "milk = make_system(T_init=5, t_end=15, r=0.1, volume=50)\n", - "results_milk = run_simulation(milk, change_func)\n", - "milk.T_final" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "extraordinary-andrew", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results_milk.plot(color='C1', label='milk')\n", - "\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "markdown", - "id": "hispanic-ghana", - "metadata": {}, - "source": [ - "**Exercise:** Write an error function that simulates the temperature of the milk and returns the difference between the final temperature and 20 °C. Use it to estimate the value of `r` for the milk." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "naughty-organ", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func2(r, system):\n", - " system.r = r\n", - " results = run_simulation(system, change_func)\n", - " return system.T_final - 20" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "separate-amateur", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 9\n", - " iterations: 8\n", - " root: 0.13296078935466452" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "root_scalar(error_func2, milk, bracket=[0.1, 0.2])" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "cloudy-reminder", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.999999999999996" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "run_simulation(milk, change_func)\n", - "milk.T_final" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "present-french", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "mighty-transport", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap16.ipynb b/jupyter/chap16.ipynb deleted file mode 100644 index d704de50..00000000 --- a/jupyter/chap16.ipynb +++ /dev/null @@ -1,793 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "involved-hampshire", - "metadata": {}, - "source": [ - "# Chapter 16" - ] - }, - { - "cell_type": "markdown", - "id": "senior-paintball", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "surprising-hypothesis", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "capable-programming", - "metadata": {}, - "source": [ - "## Code from previous notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "straight-milan", - "metadata": {}, - "outputs": [], - "source": [ - "def change_func(T, t, system):\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " return -r * (T - T_env) * dt" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "enormous-economy", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import linrange\n", - "from modsim import TimeSeries\n", - "\n", - "def run_simulation(system, change_func):\n", - " t_array = linrange(system.t_0, system.t_end, system.dt)\n", - " n = len(t_array)\n", - " \n", - " series = TimeSeries(index=t_array)\n", - " series.iloc[0] = system.T_init\n", - " \n", - " for i in range(n-1):\n", - " t = t_array[i]\n", - " T = series.iloc[i]\n", - " series.iloc[i+1] = T + change_func(T, t, system)\n", - " \n", - " system.t_end = t_array[-1]\n", - " system.T_final = series.iloc[-1]\n", - " return series" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "defined-expert", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "def make_system(T_init, volume, r, t_end):\n", - " return System(T_init=T_init,\n", - " T_final=T_init,\n", - " volume=volume,\n", - " r=r,\n", - " t_end=t_end,\n", - " T_env=22,\n", - " t_0=0,\n", - " dt=1)" - ] - }, - { - "cell_type": "markdown", - "id": "global-shooting", - "metadata": {}, - "source": [ - "In the previous chapter we wrote a simulation of a cooling cup of\n", - "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", - "temperature of the coffee will change over time.\n", - "\n", - "..." - ] - }, - { - "cell_type": "markdown", - "id": "ceramic-calibration", - "metadata": {}, - "source": [ - "## Mixing liquids\n", - "\n", - "When we mix two liquids, the temperature of the mixture depends on the\n", - "temperatures of the ingredients, but it might not be obvious how to\n", - "compute it.\n", - "\n", - "Assuming there are no chemical reactions that either produce or consume heat, the total thermal energy of the system is the same before and after mixing; in other words, thermal energy is **conserved**.\n", - "\n", - "If the temperature of the first liquid is $T_1$, the temperature of the second liquid is $T_2$, and the final temperature of the mixture is $T$, the heat transfer into the first liquid is $C_1 (T - T_1)$ and the heat transfer into the second liquid is $C_2 (T - T_2)$, where $C_1$ and $C_2$ are the thermal masses of the liquids.\n", - "\n", - "In order to conserve energy, these heat transfers must add up to 0:\n", - "\n", - "$$C_1 (T - T_1) + C_2 (T - T_2) = 0$$ \n", - "\n", - "We can solve this equation for T:\n", - "\n", - "$$T = \\frac{C_1 T_1 + C_2 T_2}{C_1 + C_2}$$ \n", - "\n", - "For the coffee cooling problem, we have the volume of each liquid; if we also know the density, $\\rho$, and the specific heat capacity, $c_p$, we can compute thermal mass: \n", - "\n", - "$$C = \\rho V c_p$$ \n", - "\n", - "If the liquids have the same density and heat capacity, they drop out of the equation, and we can write:\n", - "\n", - "$$T = \\frac{V_1 T_1 + V_2 T_2}{V_1 + V_2}$$ \n", - "\n", - "where $V_1$ and $V_2$ are the volumes of the liquids.\n", - "\n", - "As an approximation, I'll assume that milk and coffee have the same\n", - "density and specific heat. As an exercise, you can look up these\n", - "quantities and see how good this assumption is.\n", - "\n", - "The following function takes two `System` objects that represent the\n", - "coffee and milk, and creates a new `System` to represent the mixture:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "orange-beaver", - "metadata": {}, - "outputs": [], - "source": [ - "def mix(system1, system2):\n", - " \n", - " V1, V2 = system1.volume, system2.volume\n", - " T1, T2 = system1.T_final, system2.T_final\n", - " \n", - " V_mix = V1 + V2\n", - " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", - " \n", - " return make_system(T_init=T_mix,\n", - " volume=V_mix,\n", - " r=system1.r,\n", - " t_end=30)" - ] - }, - { - "cell_type": "markdown", - "id": "quiet-payroll", - "metadata": {}, - "source": [ - "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", - "\n", - "This function uses the value of `r` from `system1` as the value of `r`\n", - "for the mixture. If `system1` represents the coffee, and we are adding\n", - "the milk to the coffee, this is probably a reasonable choice. On the\n", - "other hand, when we increase the amount of liquid in the coffee cup,\n", - "that might change `r`. So this is an assumption we might want to\n", - "revisit.\n", - "\n", - "Now we have everything we need to solve the problem." - ] - }, - { - "cell_type": "markdown", - "id": "talented-appendix", - "metadata": {}, - "source": [ - "## Mix first or last?\n", - "\n", - "First I'll create objects to represent the coffee and milk.\n", - "For `r_coffee` and `r_milk`, I'll use the values we computed in the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "breathing-pizza", - "metadata": {}, - "outputs": [], - "source": [ - "r_coffee = 0.0115\n", - "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" - ] - }, - { - "cell_type": "markdown", - "id": "miniature-doctrine", - "metadata": {}, - "source": [ - "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "faced-start", - "metadata": {}, - "outputs": [], - "source": [ - "r_milk = 0.133\n", - "milk = make_system(T_init=5, volume=50, r=r_milk, t_end=15)" - ] - }, - { - "cell_type": "markdown", - "id": "interior-alpha", - "metadata": {}, - "source": [ - "Now we can mix them and simulate 30 minutes:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "stock-release", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "61.48016207445017" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mix_first = mix(coffee, milk)\n", - "run_simulation(mix_first, change_func)\n", - "\n", - "mix_first.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "committed-preference", - "metadata": {}, - "source": [ - "The final temperature is 61.5 °C which is still warm enough to be\n", - "enjoyable. Would we do any better if we added the milk last?\n", - "\n", - "I'll simulate the coffee and milk separately, and then mix them:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "integral-character", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "62.91117032872072" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_simulation(coffee, change_func)\n", - "run_simulation(milk, change_func)\n", - "mix_last = mix(coffee, milk)\n", - "mix_last.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "trying-jacob", - "metadata": {}, - "source": [ - "After mixing, the temperature is 62.9 °C, so it looks like adding the\n", - "milk at the end is better. \n", - "But is that the best we can do?" - ] - }, - { - "cell_type": "markdown", - "id": "enclosed-shore", - "metadata": {}, - "source": [ - "## Optimization\n", - "\n", - "Adding the milk after 30 minutes is better than adding it immediately, but maybe there's something in between that's even better. To find out, I'll use the following function, which takes the time to add the milk, `t_add`, as a parameter:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "accepting-consumer", - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_mix(t_add, t_total):\n", - " coffee.t_end = t_add\n", - " coffee_results = run_simulation(coffee, change_func)\n", - " \n", - " milk.t_end = t_add\n", - " milk_results = run_simulation(milk, change_func)\n", - " \n", - " mixture = mix(coffee, milk)\n", - " mixture.t_end = t_total - t_add\n", - " results = run_simulation(mixture, change_func)\n", - "\n", - " return mixture.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "critical-pound", - "metadata": {}, - "source": [ - "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "isolated-georgia", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import SweepSeries\n", - "from numpy import linspace\n", - "\n", - "sweep = SweepSeries()\n", - "for t_add in linspace(0, 30, 11):\n", - " sweep[t_add] = run_and_mix(t_add, 30)" - ] - }, - { - "cell_type": "markdown", - "id": "latin-fireplace", - "metadata": {}, - "source": [ - "Here's what the results look like:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "possible-prevention", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "sweep.plot(label='mixture', color='C2')\n", - "\n", - "decorate(xlabel='Time until mixing (minutes)',\n", - " ylabel='Final emperature (C)')" - ] - }, - { - "cell_type": "markdown", - "id": "light-poland", - "metadata": {}, - "source": [ - "Note that this is a parameter sweep, not a time series.\n", - "\n", - "The final temperature is maximized when `t_add=30`, so adding the milk\n", - "at the end is optimal.\n", - "\n", - "As an exercise you will have a chance to explore a variation of the coffee cooling problem:\n", - "\n", - "> Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "But first, let's do some analysis." - ] - }, - { - "cell_type": "markdown", - "id": "industrial-circle", - "metadata": {}, - "source": [ - "## Analysis\n", - "\n", - "Simulating Newton's law of cooling is almost silly, because we can solve the differential equation analytically. If\n", - "\n", - "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", - "\n", - "the general solution is\n", - "\n", - "$$T{\\left (t \\right )} = C \\exp(-r t) + T_{env}$$ \n", - "\n", - "and the particular solution where $T(0) = T_{init}$ is\n", - "\n", - "$$T_{env} + \\left(- T_{env} + T_{init}\\right) \\exp(-r t)$$ \n", - "\n", - "If you would like to see this solution done by hand, you can watch this video: ." - ] - }, - { - "cell_type": "markdown", - "id": "molecular-happiness", - "metadata": {}, - "source": [ - "Now we can use the observed data to estimate the parameter $r$. If we\n", - "observe the that temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", - "\n", - "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$\n", - "\n", - "The following function takes a `System` object and computes `r`:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "dressed-supply", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import log\n", - "\n", - "def compute_r(system):\n", - " t_end = system.t_end\n", - " T_init = system.T_init\n", - " T_final = system.T_final\n", - " T_env = system.T_env\n", - " \n", - " r = log((T_init - T_env) / (T_final - T_env)) / t_end\n", - " return r" - ] - }, - { - "cell_type": "markdown", - "id": "young-shift", - "metadata": {}, - "source": [ - "We can use this function to compute `r` for the coffee, given the parameters of the problem." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "bacterial-tonight", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.01161022314227386" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee2 = make_system(T_init=90, volume=300, r=0, t_end=30)\n", - "coffee2.T_final = 70\n", - "r_coffee2 = compute_r(coffee2)\n", - "r_coffee2" - ] - }, - { - "cell_type": "markdown", - "id": "removable-authority", - "metadata": {}, - "source": [ - "This value is close to the value of `r` we computed in the previous chapter, `0.115`, but not exactly the same.\n", - "That's because the simulations use discrete time steps, and the analysis uses continuous time.\n", - "\n", - "Nevertheless, the results of any analysis are consistent with the simulation.\n", - "To check, we'll use the following function, which takes a `System` object and uses the analytic result to compute a time series:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "civic-trail", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import exp\n", - "from pandas import Series\n", - "\n", - "def run_analysis(system):\n", - " T_env, T_init, r = system.T_env, system.T_init, system.r\n", - " \n", - " t_array = linrange(system.t_0, system.t_end, system.dt) \n", - " T_array = T_env + (T_init - T_env) * exp(-r * t_array)\n", - " \n", - " system.T_final = T_array[-1]\n", - " return TimeSeries(T_array, index=t_array)" - ] - }, - { - "cell_type": "markdown", - "id": "eleven-faculty", - "metadata": {}, - "source": [ - "The first line unpacks the system variables.\n", - "The next two lines compute `t_array`, which is a NumPy array of time stamps, and `T_array`, which is an array of the corresponding temperatures.\n", - "\n", - "The last two lines store the final temperature in the `System` object and return the results in a `TimeSeries`.\n", - "\n", - "We can run it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "terminal-carry", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "70.0" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee2.r = r_coffee2\n", - "results2 = run_analysis(coffee2)\n", - "coffee2.T_final" - ] - }, - { - "cell_type": "markdown", - "id": "approved-subject", - "metadata": {}, - "source": [ - "The final temperature is 70 °C, as it should be. In fact, the results\n", - "are identical to what we got by simulation, with a small difference due to rounding." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "grand-silence", - "metadata": {}, - "outputs": [], - "source": [ - "coffee.r = 0.011543\n", - "results = run_simulation(coffee, change_func)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "monetary-sensitivity", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import allclose\n", - "\n", - "allclose(results, results2)" - ] - }, - { - "cell_type": "markdown", - "id": "polish-focus", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "respected-inclusion", - "metadata": {}, - "source": [ - "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "headed-circle", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.14267107756641806" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "milk2 = make_system(T_init=5, volume=50, r=0, t_end=15)\n", - "milk2.T_final = 20\n", - "r_milk2 = compute_r(milk2)\n", - "r_milk2" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "enormous-consolidation", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.0" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "milk2 = make_system(T_init=5, volume=50, r=r_milk2, t_end=15)\n", - "results2 = run_analysis(milk2)\n", - "milk2.T_final" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "social-stamp", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "milk = make_system(T_init=5, volume=50, r=0.13296, t_end=15)\n", - "results = run_simulation(milk, change_func)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "exclusive-puzzle", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "from numpy import allclose\n", - "\n", - "allclose(results, results2)" - ] - }, - { - "cell_type": "markdown", - "id": "chinese-explanation", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "terminal-billy", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# A refrigerator keeps the milk at a constant temperature,\n", - "# so it is like a container with r = 0.\n", - "\n", - "# With T_init=5 and r_milk = 0, \n", - "# it is best to add the milk at the beginning." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "nuclear-going", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap17.ipynb b/jupyter/chap17.ipynb deleted file mode 100644 index aca865e8..00000000 --- a/jupyter/chap17.ipynb +++ /dev/null @@ -1,665 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "interracial-guitar", - "metadata": {}, - "source": [ - "# Chapter 17" - ] - }, - { - "cell_type": "markdown", - "id": "restricted-thumb", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "premier-coach", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "tamil-helping", - "metadata": {}, - "source": [ - "**Pharmacokinetics** is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, we\n", - "implement one of the most widely used pharmacokinetic models: the\n", - "so-called **minimal model** of glucose and insulin in the blood stream.\n", - "\n", - "My presentation in this chapter follows Bergman (2005) \"Minimal Model\"\n", - "(abstract at , PDF at\n", - ")." - ] - }, - { - "cell_type": "markdown", - "id": "stable-lemon", - "metadata": {}, - "source": [ - "## The glucose-insulin system\n", - "\n", - "**Glucose** is a form of sugar that circulates in the blood of animals; it is used as fuel for muscles, the brain, and other organs. The concentration of blood sugar is controlled by the hormone system, and especially by **insulin**, which is produced by the pancreas and has the effect of reducing blood sugar.\n", - "\n", - "In people with normal pancreatic function, the hormone system maintains **homeostasis**; that is, it keeps the concentration of blood sugar in a range that is neither too high or too low.\n", - "\n", - "But if the pancreas does not produce enough insulin, or if the cells\n", - "that should respond to insulin become insensitive, blood sugar can\n", - "become elevated, a condition called **hyperglycemia**. Long term, severe hyperglycemia is the defining symptom of **diabetes mellitus**, a serious disease that affects almost 10% of the population in the U.S. (see )." - ] - }, - { - "cell_type": "markdown", - "id": "sharp-yukon", - "metadata": {}, - "source": [ - "One of the most-used tests for hyperglycemia and diabetes is the\n", - "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to\n", - "measure the concentrations of glucose and insulin.\n", - "\n", - "By analyzing these measurements, we can estimate several parameters of\n", - "the subject's response; the most important is a parameter denoted $S_I$, which quantifies the effect of insulin on the rate of reduction in blood sugar." - ] - }, - { - "cell_type": "markdown", - "id": "round-roommate", - "metadata": {}, - "source": [ - "## The glucose minimal model\n", - "\n", - "The \"minimal model\", as proposed by Bergman, Ider, Bowden, and\n", - "Cobelli, consists of two parts: the glucose model and the insulin model. I will present an implementation of the glucose model; as a case study, you will have the chance to implement the insulin model.\n", - "\n", - "The original model was developed in the 1970s; since then, many\n", - "variations and extensions have been proposed. Bergman's comments on the development of the model provide insight into their process:\n", - "\n", - "> We applied the principle of Occam's Razor, i.e. by asking what was the simplest model based upon known physiology that could account for the insulin-glucose relationship revealed in the data. Such a model must be simple enough to account totally for the measured glucose (given the insulin input), yet it must be possible, using mathematical techniques, to estimate all the characteristic parameters of the model from a single data set (thus avoiding unverifiable assumptions)." - ] - }, - { - "cell_type": "markdown", - "id": "accompanied-battery", - "metadata": {}, - "source": [ - "The most useful models are the ones that achieve this balance: including enough realism to capture the essential features of the system without so much complexity that they are impractical. In this example, the practical limit is the ability to estimate the parameters of the model using data, and to interpret the parameters meaningfully.\n", - "\n", - "Bergman discusses the features he and his colleagues thought were\n", - "essential:\n", - "\n", - "> (1) Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize (2) Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", - "\n", - "To paraphrase the second point, the effect of insulin on glucose\n", - "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a \"remote compartment\" where it has its effect." - ] - }, - { - "cell_type": "markdown", - "id": "bottom-extent", - "metadata": {}, - "source": [ - "At the time, the remote compartment was a modeling abstraction that\n", - "might, or might not, represent something physical. Later, according to\n", - "Bergman, it was \"shown to be interstitial fluid\", that is, the fluid\n", - "that surrounds tissue cells. In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve\n", - "particular effects, to be found later to correspond to physical\n", - "entities.\n", - "\n", - "The glucose model consists of two differential equations:\n", - "\n", - "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", - "\n", - "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", - "\n", - "where\n", - "\n", - "- $G$ is the concentration of blood glucose as a function of time and $dG/dt$ is its rate of change.\n", - "\n", - "- $X$ is the concentration of insulin in the tissue fluid as a\n", - " function of time, and $dX/dt$ is its rate of change.\n", - "\n", - "- $I$ is the concentration of insulin in the blood as a function of\n", - " time, which is taken as an input into the model, based on\n", - " measurements.\n", - "\n", - "- $G_b$ is the basal concentration of blood glucose and $I_b$ is the\n", - " basal concentration of blood insulin, that is, the concentrations at equilibrium. Both are constants estimated from measurements at the\n", - " beginning or end of the test.\n", - "\n", - "- $k_1$, $k_2$, and $k_3$ are positive-valued parameters that control the rates of appearance and disappearance for glucose and insulin." - ] - }, - { - "cell_type": "markdown", - "id": "dutch-retailer", - "metadata": {}, - "source": [ - "We can interpret the terms in the equations one by one:\n", - "\n", - "- $-k_1 \\left[ G(t) - G_b \\right]$ is the rate of glucose\n", - " disappearance due to the effect of glucose itself. When $G(t)$ is\n", - " above basal level, $G_b$, this term is negative; when $G(t)$ is\n", - " below basal level this term is positive. So in the absence of\n", - " insulin, this term tends to restore blood glucose to basal level.\n", - "\n", - "- $-X(t) G(t)$ models the interaction of glucose and insulin in tissue\n", - " fluid, so the rate increases as either $X$ or $G$ increases. This\n", - " term does not require a rate parameter because the units of $X$ are\n", - " unspecified; we can consider $X$ to be in whatever units make the\n", - " parameter of this term 1.\n", - "\n", - "- $k_3 \\left[ I(t) - I_b \\right]$ is the rate at which insulin\n", - " diffuses between blood and tissue fluid. When $I(t)$ is above basal\n", - " level, insulin diffuses from the blood into the tissue fluid. When\n", - " $I(t)$ is below basal level, insulin diffuses from tissue to the\n", - " blood.\n", - "\n", - "- $-k_2 X(t)$ is the rate of insulin disappearance in tissue fluid as\n", - " it is consumed or broken down." - ] - }, - { - "cell_type": "markdown", - "id": "regional-receptor", - "metadata": {}, - "source": [ - "The initial state of the model is $X(0) = I_b$ and $G(0) = G_0$, where\n", - "$G_0$ is a constant that represents the concentration of blood sugar\n", - "immediately after the injection. In theory we could estimate $G_0$ based on measurements, but in practice it takes time for the injected glucose to spread through the blood volume. Since $G_0$ is not measurable, it is treated as a **free parameter** of the model, which means that we are free to choose it to fit the data." - ] - }, - { - "cell_type": "markdown", - "id": "exact-heating", - "metadata": {}, - "source": [ - "## Data\n", - "\n", - "To develop and test the model, we'll use data from Pacini and Bergman, \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122, (1986)." - ] - }, - { - "cell_type": "markdown", - "id": "separated-strip", - "metadata": {}, - "source": [ - "The following cell reads the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "looking-needle", - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" - ] - }, - { - "cell_type": "markdown", - "id": "dressed-regard", - "metadata": {}, - "source": [ - "We can use Pandas to read the data file." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "naval-geology", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    glucoseinsulin
    time
    09211
    235026
    4287130
    625185
    824051
    \n", - "
    " - ], - "text/plain": [ - " glucose insulin\n", - "time \n", - "0 92 11\n", - "2 350 26\n", - "4 287 130\n", - "6 251 85\n", - "8 240 51" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pandas import read_csv\n", - "\n", - "data = read_csv('glucose_insulin.csv', index_col='time')\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "id": "close-payday", - "metadata": {}, - "source": [ - "`data` has two columns: `glucose` is the concentration of blood glucose in mg/dL; `insulin` is concentration of insulin in the blood in μU/mL (a medical \"unit\", denoted U, is an amount defined by convention in context). The index is time in minutes.\n", - "\n", - "This dataset represents glucose and insulin concentrations over\n", - "182 min for a subject with normal insulin production and sensitivity." - ] - }, - { - "cell_type": "markdown", - "id": "burning-valuable", - "metadata": {}, - "source": [ - "## Interpolation\n", - "\n", - "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. This is a job for interpolation!\n", - "\n", - "The ModSim library provides a function named `interpolate`, which is a\n", - "wrapper for the SciPy function `interp1d`. It takes any kind of `Series` as a parameter, including `TimeSeries` and `SweepSeries`, and returns a function. That's right, I said it returns a *function*.\n", - "\n", - "So we can call `interpolate` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "terminal-teaching", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import interpolate\n", - "\n", - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "id": "banner-shakespeare", - "metadata": {}, - "source": [ - "Then we can call the new function, `I`, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "intense-thursday", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(31.66666667)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I(18)" - ] - }, - { - "cell_type": "markdown", - "id": "severe-desire", - "metadata": {}, - "source": [ - "The result is 31.66, which is a linear interpolation between the actual measurements at `t=16` and `t=19`. \n", - "\n", - "We can also pass an array as an argument to `I`. Here's an array of equally-spaced values from `t_0` to `t_end`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "least-pattern", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import linrange\n", - "\n", - "t_0 = data.index[0]\n", - "t_end = data.index[-1]\n", - "t_array = linrange(t_0, t_end)" - ] - }, - { - "cell_type": "markdown", - "id": "empirical-tackle", - "metadata": {}, - "source": [ - "And here are the corresponding values of `I`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "mounted-venice", - "metadata": {}, - "outputs": [], - "source": [ - "I_array = I(t_array)" - ] - }, - { - "cell_type": "markdown", - "id": "environmental-variance", - "metadata": {}, - "source": [ - "Here's what the interpolated values look like along with the data." - ] - }, - { - "cell_type": "markdown", - "id": "completed-registrar", - "metadata": {}, - "source": [ - "`interpolate` can take additional arguments, which it passes along to\n", - "`interp1d`. You can read about these options at\n", - "." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "engaging-watershed", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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WltbuxrSLuVy/aeOApWgzOzHQAtwd7QowWYJryx299vcvdLdK6MTH2ZadJqj4lAx/Yr7sbVpayfvEBFpr7PlNm655RY++eQTpk6dytSpUwF48sknmThxIuPHj+fss89m27ZtQLiW8rOf/YzJkydz3333MWXKFK688komTZrEIYccwuLFiwH49NNPOf300xk7dixHHnkkr7/++k5xpbq8Rm1tLWeeeSaHH344hx9+eGyJjg0bNjBt2jTGjRvHN7/5TTIxCURgZjM3s5nAKcBxvuMnWw3sE7fZCOCTXMcWFb0GqiRUQklhCZsaNuUrFBHppusXX8/bn76d0X1+duBn+cGEH6S8faLlNq644gpuuukmnn32WQYPHsz69eu55pprePrppykvL+f666/npptu4uqrrwagtLSUF154AYBbb72Vuro6FixYwPPPP88FF1zAG2+8wZw5cxg3bhwPPfQQf//73zn//PNjc/xFpbq8xle+8hW++93vMnnyZD766CNOPPFEVqxYwU9/+lMmT57M1VdfTXV1Nbfddlu3z2cgEpSZTQd+ABzj7vH12keAP5rZTcDewIHA4jyECOxo4isqKKI0VBp7LiLSFYmW25g8eXK7bRYuXMhbb73FUUcdBUBTUxMTJ06MvX7OOee02/68884D4Oijj2bLli1s2rSJF154gQceeACAY489lg0bNrB58+Z270t12Yynn36at956K/Z8y5YtbN26leeff56//OUvQHiZjwEDBqR9PjrKeYIysz8BU4DBZrYamEN41F4J8FRk6veF7n6pu79pZvcCbxFu+vuOu2enoTUF7WpQoRIaWjI3rbyI5FY6NZ1sSWU5DHfnhBNO4E9/+lPCfXScNLbj8hlmlrC5reN2l19+Od/73vf40pe+xPz586mqqkp4vLa2Nl566SX69OnT6T67Kx+j+M5z9wp3L3L3Ee5+u7sf4O77uPthkdulcdtf6+77u/vB7v7YrvadbfEJqrRQNSgRyY74JS2OPPJIXnzxRVauXAlAfX19bFHBRO655x4AXnjhBfr370///v05+uijufvucNf+/PnzGTx4MP369Wv3vlSX15g2bRr//d//HXsebSqMP8Zjjz3Gxo0bu/SzxwvUIImgizXxhcJNfB2XgxYRyYRLLrmEk046ialTpzJkyBDuvPNOzjvvvNggh7ffTt53NmDA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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from matplotlib.pyplot import plot\n", - "from modsim import decorate\n", - "\n", - "data.insulin.plot(style='o', color='C2', label='insulin data')\n", - "plot(t_array, I_array, color='C2', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "id": "adopted-locking", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In the next chapter, we will use interpolated data to run the simulation\n", - "of the glucose-insulin system.\n", - "\n", - "\n", - "\n", - "[^1]: Bergman RN, Ider YZ, Bowden CR, Cobelli C., \"Quantitative\n", - " estimation of insulin sensitivity\\\", Am J Physiol. 1979\n", - " Jun;236(6):E667-77. Abstract at .\n", - "\n", - "[^2]: \"MINMOD: A computer program to calculate insulin sensitivity and\n", - " pancreatic responsivity from the frequently sampled intravenous\n", - " glucose tolerance test\\\", *Computer Methods and Programs in\n", - " Biomedicine* 23: 113-122, 1986." - ] - }, - { - "cell_type": "markdown", - "id": "floppy-store", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "hungarian-newman", - "metadata": {}, - "source": [ - "**Exercise:** Read the documentation of `scipy.interpolate.interp1d` at . Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "endless-network", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "I = interpolate(data.insulin, kind='cubic')\n", - "I_array = I(t_array)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "entire-concern", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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WltbuxrSLuVy/aeOApWgzOzHQAtwd7QowWYJryx299vcvdLdK6MTH2ZadJqj4lAx/Yr7sbVpayfvEBFpr7PlNm655RY++eQTpk6dytSpUwF48sknmThxIuPHj+fss89m27ZtQLiW8rOf/YzJkydz3333MWXKFK688komTZrEIYccwuLFiwH49NNPOf300xk7dixHHnkkr7/++k5xpbq8Rm1tLWeeeSaHH344hx9+eGyJjg0bNjBt2jTGjRvHN7/5TTIxCURgZjM3s5nAKcBxvuMnWw3sE7fZCOCTXMcWFb0GqiRUQklhCZsaNuUrFBHppusXX8/bn76d0X1+duBn+cGEH6S8faLlNq644gpuuukmnn32WQYPHsz69eu55pprePrppykvL+f666/npptu4uqrrwagtLSUF154AYBbb72Vuro6FixYwPPPP88FF1zAG2+8wZw5cxg3bhwPPfQQf//73zn//PNjc/xFpbq8xle+8hW++93vMnnyZD766CNOPPFEVqxYwU9/+lMmT57M1VdfTXV1Nbfddlu3z2cgEpSZTQd+ABzj7vH12keAP5rZTcDewIHA4jyECOxo4isqKKI0VBp7LiLSFYmW25g8eXK7bRYuXMhbb73FUUcdBUBTUxMTJ06MvX7OOee02/68884D4Oijj2bLli1s2rSJF154gQceeACAY489lg0bNrB58+Z270t12Yynn36at956K/Z8y5YtbN26leeff56//OUvQHiZjwEDBqR9PjrKeYIysz8BU4DBZrYamEN41F4J8FRk6veF7n6pu79pZvcCbxFu+vuOu2enoTUF7WpQoRIaWjI3rbyI5FY6NZ1sSWU5DHfnhBNO4E9/+lPCfXScNLbj8hlmlrC5reN2l19+Od/73vf40pe+xPz586mqqkp4vLa2Nl566SX69OnT6T67Kx+j+M5z9wp3L3L3Ee5+u7sf4O77uPthkdulcdtf6+77u/vB7v7YrvadbfEJqrRQNSgRyY74JS2OPPJIXnzxRVauXAlAfX19bFHBRO655x4AXnjhBfr370///v05+uijufvucNf+/PnzGTx4MP369Wv3vlSX15g2bRr//d//HXsebSqMP8Zjjz3Gxo0bu/SzxwvUIImgizXxhcJNfB2XgxYRyYRLLrmEk046ialTpzJkyBDuvPNOzjvvvNggh7ffTt53NmDA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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "data.insulin.plot(style='o', color='C2', label='insulin data')\n", - "plot(t_array, I_array, color='C2', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "id": "furnished-recognition", - "metadata": {}, - "source": [ - "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "representative-acquisition", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "G = interpolate(data.glucose)\n", - "G_array = G(t_array)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "rocky-sydney", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "data.glucose.plot(style='o', color='C0', label='gluciose data')\n", - "plot(t_array, G_array, color='C0', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "markdown", - "id": "opened-scheduling", - "metadata": {}, - "source": [ - "### Under the hood" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "still-tolerance", - "metadata": {}, - "outputs": [], - "source": [ - "%psource interpolate" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "essential-fishing", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap18.ipynb b/jupyter/chap18.ipynb deleted file mode 100644 index 5cb0c53a..00000000 --- a/jupyter/chap18.ipynb +++ /dev/null @@ -1,869 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "electric-netherlands", - "metadata": {}, - "source": [ - "# Chapter 18" - ] - }, - { - "cell_type": "markdown", - "id": "tribal-blame", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "hungry-lucas", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "original-photographer", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "fewer-weather", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "computational-border", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_csv\n", - "\n", - "data = read_csv(filename, index_col='time');" - ] - }, - { - "cell_type": "markdown", - "id": "unique-domestic", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "oriented-translation", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import interpolate\n", - "\n", - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "id": "horizontal-bridges", - "metadata": {}, - "source": [ - "In this chapter, we implement the glucose minimal model described in the previous chapter. We'll start with `run_simulation`, which solves\n", - "differential equations using discrete time steps. This method works well enough for many applications, but it is not very accurate. In this chapter we explore a better option: using an **ODE solver**." - ] - }, - { - "cell_type": "markdown", - "id": "stunning-giving", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "To get started, let's assume that the parameters of the model are known.\n", - "We'll implement the model and use it to generate time series for `G` and `X`. Then we'll see how to find the parameters that generate the series that best fits the data." - ] - }, - { - "cell_type": "markdown", - "id": "polished-burner", - "metadata": {}, - "source": [ - "We can pass `params` and `data` to `make_system`:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "substantial-literacy", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(params, data):\n", - " G0, k1, k2, k3 = params\n", - " \n", - " Gb = data.glucose[0]\n", - " Ib = data.insulin[0]\n", - " I = interpolate(data.insulin)\n", - " \n", - " t_0 = data.index[0]\n", - " t_end = data.index[-1]\n", - " \n", - " init = State(G=G0, X=0)\n", - " \n", - " return System(params=params, init=init, \n", - " Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "markdown", - "id": "metallic-motorcycle", - "metadata": {}, - "source": [ - "`make_system` uses the measurements at `t=0` as the basal levels, `Gb`\n", - "and `Ib`. It gets `t_0` and `t_end` from the data. And it uses the\n", - "parameter `G0` as the initial value for `G`. Then it packs everything\n", - "into a `System` object." - ] - }, - { - "cell_type": "markdown", - "id": "confident-performance", - "metadata": {}, - "source": [ - "Taking advantage of estimates from prior work, we'll start with these\n", - "values:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "under-rhythm", - "metadata": {}, - "outputs": [], - "source": [ - "# G0, k1, k2, k3\n", - "params = 290, 0.03, 0.02, 1e-05\n", - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "id": "stupid-retro", - "metadata": {}, - "source": [ - "Here's the update function:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "roman-archive", - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " G, X = state\n", - " G0, k1, k2, k3 = system.params \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " dt = system.dt\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " G += dGdt * dt\n", - " X += dXdt * dt\n", - "\n", - " return State(G=G, X=X)" - ] - }, - { - "cell_type": "markdown", - "id": "basic-subdivision", - "metadata": {}, - "source": [ - "As usual, the update function takes a `State` object, a time, and a\n", - "`System` object as parameters. The first line uses multiple assignment\n", - "to extract the current values of `G` and `X`.\n", - "\n", - "The following lines unpack the parameters we need from the `System`\n", - "object.\n", - "\n", - "Computing the derivatives `dGdt` and `dXdt` is straightforward; we just\n", - "translate the equations from math notation to Python.\n", - "\n", - "Then, to perform the update, we multiply each derivative by the discrete\n", - "time step `dt`, which is 2 min in this example. The return value is a\n", - "`State` object with the new values of `G` and `X`.\n", - "\n", - "Before running the simulation, it is a good idea to run the update\n", - "function with the initial conditions:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "sapphire-shannon", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "G 278.12\n", - "X 0.00\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update_func(system.init, system.t_0, system)" - ] - }, - { - "cell_type": "markdown", - "id": "strange-citation", - "metadata": {}, - "source": [ - "If it runs without errors and there is nothing obviously wrong with the\n", - "results, we are ready to run the simulation. We'll use this version of\n", - "`run_simulation`, which is very similar to previous versions:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "willing-masters", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import linrange, TimeFrame\n", - "\n", - "def run_simulation(system, update_func):\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " t_array = linrange(system.t_0, system.t_end, system.dt)\n", - " n = len(t_array)\n", - " \n", - " frame = TimeFrame(index=t_array, columns=init.index)\n", - " frame.iloc[0] = system.init\n", - " \n", - " for i in range(n-1):\n", - " t = t_array[i]\n", - " state = frame.iloc[i]\n", - " frame.iloc[i+1] = update_func(state, t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "id": "musical-loading", - "metadata": {}, - "source": [ - "We can run it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "international-germany", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    0.02900
    2.0278.120.0
    4.0266.95280.0003
    6.0256.295460.002668
    8.0245.070140.004041
    \n", - "
    " - ], - "text/plain": [ - " G X\n", - "0.0 290 0\n", - "2.0 278.12 0.0\n", - "4.0 266.9528 0.0003\n", - "6.0 256.29546 0.002668\n", - "8.0 245.07014 0.004041" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = run_simulation(system, update_func)\n", - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "specialized-thomson", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.G.plot(style='-', label='simulation')\n", - "data.glucose.plot(style='o', color='C0', label='glucose data')\n", - "decorate(ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "authentic-series", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results.X.plot(color='C1', label='remote insulin')\n", - "\n", - "decorate(xlabel='Time (min)', \n", - " ylabel='Concentration (arbitrary units)')" - ] - }, - { - "cell_type": "markdown", - "id": "diagnostic-service", - "metadata": {}, - "source": [ - " shows the results. The top plot shows\n", - "simulated glucose levels from the model along with the measured data.\n", - "The bottom plot shows simulated insulin levels in tissue fluid, which is in unspecified units, and not to be confused with measured insulin\n", - "levels in the blood.\n", - "\n", - "With the parameters I chose, the model fits the data well, except for\n", - "the first few data points, where we don't expect the model to be\n", - "accurate." - ] - }, - { - "cell_type": "markdown", - "id": "valid-evanescence", - "metadata": {}, - "source": [ - "## Solving differential equations\n", - "\n", - "So far we have solved differential equations by rewriting them as\n", - "difference equations. In the current example, the differential equations are: \n", - "\n", - "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", - "\n", - "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", - "\n", - "If we multiply both sides by $dt$, we have:\n", - "\n", - "$$dG = \\left[ -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t) \\right] dt$$\n", - "\n", - "$$dX = \\left[ k_3 \\left[I(t) - I_b \\right] - k_2 X(t) \\right] dt$$ \n", - "\n", - "When $dt$ is very small, or more precisely **infinitesimal**, this equation is exact. But in our simulations, $dt$ is 2 min, which is not very small. In effect, the simulations assume that the derivatives $dG/dt$ and $dX/dt$ are constant during each 2 min time step." - ] - }, - { - "cell_type": "markdown", - "id": "underlying-grave", - "metadata": {}, - "source": [ - "This method, evaluating derivatives at discrete time steps and assuming that they are constant in between, is called **Euler's method** (see ).\n", - "\n", - "Euler's method is good enough for some simple problems, but it is not\n", - "very accurate. Other methods are more accurate, but many of them are\n", - "substantially more complicated.\n", - "\n", - "One of the best simple methods is called **Ralston's method**. The\n", - "ModSim library provides a function called `run_ode_solver` that\n", - "implements it.\n", - "\n", - "The \"ODE\" in `run_ode_solver` stands for \"ordinary differential\n", - "equation\". The equations we are solving are \"ordinary\" because all the\n", - "derivatives are with respect to the same variable; in other words, there are no partial derivatives.\n", - "\n", - "To use `run_ode_solver`, we have to provide a \"slope function\", like\n", - "this:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "expected-collapse", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " G, X = state\n", - " G0, k1, k2, k3 = system.params \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "id": "modified-surname", - "metadata": {}, - "source": [ - "`slope_func` is similar to `update_func`; in fact, it takes the same\n", - "parameters in the same order. But `slope_func` is simpler, because all\n", - "we have to do is compute the derivatives, that is, the slopes. We don't\n", - "have to do the updates; `run_ode_solver` does them for us.\n", - "\n", - "Now we can call `run_ode_solver` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "frequent-cartoon", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import run_solve_ivp" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "ongoing-constraint", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " message: 'The solver successfully reached the end of the integration interval.'\n", - " nfev: 86\n", - " njev: 0\n", - " nlu: 0\n", - " sol: None\n", - " status: 0\n", - " success: True\n", - " t_events: None\n", - " y_events: None" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2, details = run_solve_ivp(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "id": "removed-bubble", - "metadata": {}, - "source": [ - "`run_ode_solver` is similar to `run_simulation`: it takes a `System`\n", - "object and a slope function as parameters. It returns two values: a\n", - "`TimeFrame` with the solution and a `ModSimSeries` with additional\n", - "information.\n", - "\n", - "A `ModSimSeries` is like a `System` or `State` object; it contains a set\n", - "of variables and their values. The `ModSimSeries` from `run_ode_solver`,\n", - "which we assign to `details`, contains information about how the solver\n", - "ran, including a success code and diagnostic message.\n", - "\n", - "The `TimeFrame`, which we assign to `results`, has one row for each time\n", - "step and one column for each state variable. In this example, the rows\n", - "are time from 0 to 182 minutes; the columns are the state variables, `G`\n", - "and `X`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "important-crawford", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAy+0lEQVR4nO3deXxU9b3/8dcnC0lYJCAgEMCgF1BI2MUFRexVQK2CWlutttrr0vtr9df+eqVCN+u1rVi63bZWa9Vbba1LK+JWwV2qosgqi6C4krAjIEj2fH5/zEmchEkyQGbmTPJ+Ph7zmJnv2T45mcwn55zv+X7M3REREQmbjFQHICIiEosSlIiIhJISlIiIhJISlIiIhJISlIiIhFJWqgM4FD169PDCwsJUhyEiIodgyZIl2929Z+P2tE5QhYWFLF68ONVhiIjIITCzD2O16xSfiIiEkhKUiIiEkhKUiIiEUlpfgxIRaU5VVRUlJSWUl5enOhQBcnNz6devH9nZ2XHNrwQlIm1WSUkJXbp0obCwEDNLdTjtmruzY8cOSkpKGDhwYFzL6BSfiLRZ5eXlHH744UpOIWBmHH744Qd0NJuwBGVmuWa2yMxWmNlqM7sxaP+xmZWa2fLgcVbUMjPNbL2ZrTOzyYmKLZa5y0oZP+t5Bs54kvGznmfustJkbl5EEkTJKTwO9HeRyFN8FcDn3H2vmWUDL5vZU8G0X7v7L6JnNrOhwEXAMKAv8KyZDXb3mgTGCESS08w5KymrimyqdFcZM+esBGDaqIJEb15ERGJI2BGUR+wN3mYHj+aKT00FHnD3Cnd/H1gPjEtUfNFmz19Xn5zqlFXVMHv+umRsXkTamSuvvJI1a9a0yroKCwvZvn17s/P87Gc/a/D+pJNOapVtJ1pCr0GZWaaZLQe2As+4++vBpGvM7E0zu9vMugVtBcCGqMVLgrbG67zazBab2eJt27a1Spwbd5UdULuIyKG48847GTp0aNK21zhBvfrqq0nb9qFIaIJy9xp3Hwn0A8aZWRFwG3A0MBLYBPwymD3Wycn9jrjc/Q53H+vuY3v23G/opoPSNz/vgNpFROL16aefcvbZZzNixAiKiop48MEHmThxYv0wbZ07d+b6669nzJgxnH766SxatIiJEydy1FFH8dhjjwHw5z//mWuuuaZ+nZ///Od58cUX99vWtGnTGDNmDMOGDeOOO+4AYMaMGZSVlTFy5EguueSS+m1CpGfd9OnTKSoqori4mAcffBCAF198kYkTJ/KFL3yBY445hksuuYRUVF9PSjdzd99lZi8CU6KvPZnZn4AngrclQP+oxfoBG5MR3/TJQxpcgwLIy85k+uQhydi8iCTBjY+vZs3GT1p1nUP7HsYN5wxrdp558+bRt29fnnzySQB2797NbbfdVj/9008/ZeLEidxyyy2cd955/OAHP+CZZ55hzZo1XHbZZZx77rlxx3P33XfTvXt3ysrKOO6447jggguYNWsWv//971m+fPl+88+ZM4fly5ezYsUKtm/fznHHHceECRMAWLZsGatXr6Zv376MHz+eV155hZNPPjnuWFpDInvx9TSz/OB1HnA6sNbM+kTNdh6wKnj9GHCRmeWY2UBgELAoUfFFmzaqgJvPL6YgPw8DCvLzuPn8YnWQEJFDVlxczLPPPsv111/Pv/71L7p27dpgeocOHZgyZUr9vKeeeirZ2dkUFxfzwQcfHNC2fvvb3zJixAhOOOEENmzYwDvvvNPs/C+//DIXX3wxmZmZHHHEEZx66qm88cYbAIwbN45+/fqRkZHByJEjDziW1pDII6g+wD1mlkkkET7k7k+Y2V/MbCSR03cfAF8HcPfVZvYQsAaoBr6ZjB58daaNKlBCEmnDWjrSSZTBgwezZMkS/vnPfzJz5kwmTZrUYHp2dnZ99+uMjAxycnLqX1dXVwOQlZVFbW1t/TKx7iV68cUXefbZZ1m4cCEdO3Zk4sSJLd5z1Nxpu7o4ADIzM+tjSaZE9uJ7091Huftwdy9y9/8O2r/i7sVB+7nuvilqmZ+6+9HuPsTdn2p67SIi6WHjxo107NiRSy+9lOuuu46lS5ce8DoKCwtZvnw5tbW1bNiwgUWL9j+5tHv3brp160bHjh1Zu3Ytr732Wv207Oxsqqqq9ltmwoQJPPjgg9TU1LBt2zYWLFjAuHFJ6TwdFw11JCKSQCtXrmT69OlkZGSQnZ3NbbfdxnXXXXdA6xg/fjwDBw6kuLiYoqIiRo8evd88U6ZM4fbbb2f48OEMGTKEE044oX7a1VdfzfDhwxk9ejT33Xdffft5553HwoULGTFiBGbGz3/+c3r37s3atWsP/gduRZaKnhmtZezYsa6ChSLSlLfeeotjjz021WFIlFi/EzNb4u5jG8+rsfhERCSUlKBERCSUlKBERCSUlKBERCSUlKBERCSUlKBERCSUlKBERFLg8ssv5x//+Eeqw4jpYEp4JIISlIhIQJW146cEJSKSJHWVtUt3leF8Vln7UJPUTTfdxDHHHMMZZ5zBxRdfzC9+8Yv95ok+Ylm8eDETJ04EYO/evXzta1+juLiY4cOH8/DDDwNw//33148qcf311wNQU1PD5ZdfXl8649e//jUA7777LlOmTGHMmDGccsopMUeJ2LFjB5MmTWLUqFF8/etfbzBGX7wlPGLNd6g01JGICM1X1j7YgaQXL17Mww8/zLJly6iurmb06NGMGTMm7uVvuukmunbtysqVKwHYuXMnGzdu5Prrr2fJkiV069aNSZMmMXfuXPr3709paSmrVkUKROzatQuIDHN0++23M2jQIF5//XW+8Y1v8PzzzzfYzo033sjJJ5/Mj370I5588skGCSbeEh6x5jv88MMPar/VUYISESExlbVffvllpk6dSl5epPjpOeecc0DLP/vsszzwwAP177t168aCBQuYOHEidQVbL7nkEhYsWMAPf/hD3nvvPa699lrOPvtsJk2axN69e3n11Ve58MIL69dRUVGx33YWLFjAnDlzADj77LPp1q1b/bTf/va3PPLIIwD1JTxiJZ545zsQSlAiIkQqaJfGSEaHUlk73rFOo8tpRJfIcPf6UhwtrbNbt26sWLGC+fPnc+utt/LQQw/xm9/8hvz8/JjFChtrvB2Iv4THwZT6iIeuQYmIEKmsnZed2aDtUCtrn3zyyTz++OOUl5ezd+/e+qq6jRUWFrJkyRKA+utMAJMmTeL3v/99/fudO3dy/PHH89JLL7F9+3Zqamq4//77OfXUU9m+fTu1tbVccMEF3HTTTSxdupTDDjuMgQMH8ve//x2IJLcVK1bst/0JEybUj3L+1FNPsXPnTiD+Eh7NzXcolKBEREhMZe3jjjuOc889lxEjRnD++eczduzY/SrqAtxwww1861vf4pRTTiEz87Mk+YMf/ICdO3dSVFTEiBEjeOGFF+jTpw8333wzp512GiNGjGD06NFMnTqV0tJSJk6cyMiRI7n88su5+eabAbjvvvu46667GDFiBMOGDePRRx+Nuf0FCxYwevRonn76aQYMGABESnhUV1czfPhwfvjDH8Ys4XHJJZc0O9+hULkNEWmzwlBuY+/evXTu3Jl9+/Yx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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results2.G.plot(style='-', label='simulation')\n", - "data.glucose.plot(style='o', color='C0', label='glucose data')\n", - "decorate(ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "virtual-standard", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results2.X.plot(color='C1', label='remote insulin')\n", - "\n", - "decorate(xlabel='Time (min)', \n", - " ylabel='Concentration (arbitrary units)')" - ] - }, - { - "cell_type": "markdown", - "id": "corrected-indonesia", - "metadata": {}, - "source": [ - "shows the results from `run_simulation` and\n", - "`run_ode_solver`. The difference between them is barely visible.\n", - "\n", - "We can compute the percentage differences like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "disciplinary-washington", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.004442701427073649" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "percent_diff.abs().max()" - ] - }, - { - "cell_type": "markdown", - "id": "electronic-navigation", - "metadata": {}, - "source": [ - "The largest percentage difference is less than 2%, which is small enough that it probably doesn't matter in practice. " - ] - }, - { - "cell_type": "markdown", - "id": "potential-dispute", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." - ] - }, - { - "cell_type": "markdown", - "id": "north-suspension", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "bright-damage", - "metadata": {}, - "source": [ - "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", - "\n", - "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "charitable-craft", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " message: 'The solver successfully reached the end of the integration interval.'\n", - " nfev: 86\n", - " njev: 0\n", - " nlu: 0\n", - " sol: None\n", - " status: 0\n", - " success: True\n", - " t_events: None\n", - " y_events: None" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system.dt = 1\n", - "results3, details = run_simulation(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "encouraging-outline", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA2xElEQVR4nO3dd3hUZfr/8fedTkjokU4A6SUQCIjSUQQVKTYQLNgQQRfFtbCuon5df651V12XRUVYFwUFVARRFCkiiCZ0pPdIhBBqTCDt/v0xkzjBkATI5Mwk9+u65sqZ55T55Dhy55zznPOIqmKMMcb4mgCnAxhjjDEFsQJljDHGJ1mBMsYY45OsQBljjPFJVqCMMcb4JCtQxhhjfJLXCpSIhInIjyKyTkQ2icgz7vZqIvK1iGx3/6zqsc4EEdkhIltFpJ+3shljjPF94q37oEREgIqqmioiwcByYBxwHXBEVV8QkceBqqr6mIi0Aj4EOgN1gG+AZqqa7ZWAxhhjfJrXjqDUJdX9Ntj9UmAQMM3dPg0Y7J4eBMxQ1dOquhvYgatYGWOMKYeCvLlxEQkEEoAmwL9UdZWI1FTVJABVTRKRi9yL1wV+8Fg90d125jZHAaMAKlas2LFFixbe/BWMMcZ4WUJCwmFVjTqz3asFyn16rr2IVAE+EZE2hSwuBW2igG1OBiYDxMXFaXx8fElENcYY4xAR2VtQe6n04lPVY8ASoD9wUERqu0PVBg65F0sE6nusVg84UBr5jDHG+B5v9uKLch85ISIVgCuALcBc4Hb3YrcDn7mn5wLDRCRURBoBTYEfvZXPGGOMb/PmKb7awDT3dagA4CNVnSciK4GPROQuYB9wI4CqbhKRj4CfgSxgrPXgM8aY8str3cxLg12DMsb7MjMzSUxM5NSpU05HMX4uLCyMevXqERwcnK9dRBJUNe7M5b3aScIY4/8SExOJjIykYcOGuG5vNObcqSopKSkkJibSqFGjYq1jjzoyxhTq1KlTVK9e3YqTuSAiQvXq1c/pSNwKlDGmSFacTEk41++RFShjjDE+qVwXqKPJ+1k+/WVycnKcjmKMMeYM5bpAJUx/ner/9y471y5xOooxxkeNHDmSWbNmefUzpk6dyv333++Vba9Zs4a77767wHkNGzbk8OHDHDt2jLfeeuuctjtixAiaN29OmzZtuPPOO8nMzARg3rx5TJw48YJzQzkvUK1vuJsnbgtkaeBOp6MYY4pBVe2MRyGysrL+0Pb888/zwAMPFLre+RaoLVu2sGHDBtLT03nnnXcAuOaaa5g7dy5paWnntL2ClOtu5rXrNSckpg3fJi7m7nb3OB3HGL9wx5d3/KGtX8N+DGsxjPSsdMZ8M+YP8wc1GcTgJoM5euoo45eMzzfvvf7vFfp5e/bs4aqrrqJ3796sXLmSTz/9lNatW5Oa6hosYdasWcybN4+pU6cycuRIKlWqRHx8PL/++isvvvgiN9xwQ4HbVVUeffRRFixYgIjw17/+laFDh6KqPPDAA3z77bc0atQIz3tFExISGD9+PKmpqdSoUYOpU6dSu3btArf/+uuvM2nSJIKCgmjVqhUzZszgyJEj3HnnnezatYvw8HAmT55MTExM3jrHjx+nXbt27Nq1i4CAANLS0mjevDm7du1i3759jB07luTkZMLDw3n77bdp0aIFI0eOpFq1aqxZs4YOHTrwyiuv5G3v5MmTrF+/nnbt2gGQkpLCzTffTHJyMp07d8773R5//HF27txJ+/bt6du3Ly+99FKh/00Arr766rzpzp07k5iYCLg6QvTq1Yt58+Zx0003FbmdwpTrAgXQP6Iz+95/h1/bbKZWdEun4xhjCrB161bee++9Yv2Vn5SUxPLly9myZQsDBw48a4GaM2cOa9euZd26dRw+fJhOnTrRo0cPVq5cydatW9mwYQMHDx6kVatWeaewHnjgAT777DOioqKYOXMmTzzxBFOmTClw+y+88AK7d+8mNDSUY8eOATBx4kRiY2P59NNP+fbbb7nttttYu3Zt3jqVK1emXbt2LF26lN69e/P555/Tr18/goODGTVqFJMmTaJp06asWrWKMWPG8O233wKwbds2vvnmGwIDA/NliI+Pp02b35/R/cwzz9CtWzeeeuop5s+fz+TJk/Oybty4MS/LyZMn6d69e4G/1wcffECrVq3y3mdmZvL+++/zz3/+M68tLi6O7777zgrUhbosIoZOK5TN331qBcqYYijsiKdCUIVC51cNq1rkEVNBoqOj6dKlS7GWHTx4MAEBAbRq1YqDBw+edbnly5dz8803ExgYSM2aNenZsyc//fQTy5Yty2uvU6cOffr0AVxFcuPGjfTt2xeA7Ozssx49AcTExDBixAgGDx7M4MGD8z5z9uzZAPTp04eUlBSOHz+eb72hQ4cyc+ZMevfuzYwZMxgzZgypqamsWLGCG2+8MW+506dP503feOONfyhO4CrWUVG/j2KxbNky5syZA7hOxVWtWvUP6wBERkbmK5yFGTNmDD169MhX0C666CIOHLjwZ32X+wLVpEMf9n/1Ea0btHU6ijHmLCpWrJjvvef9NGfe+BkaGpo3Xdij3AqbV9D9OqpK69atWblyZZF5AebPn8+yZcuYO3cu//d//8emTZsK/MwzP2vgwIFMmDCBI0eOkJCQQJ8+ffjtt9+oUqXKWYvGmfsnV4UKFf6wf4pzL1Jxj6CeeeYZkpOT+c9//pNvmVOnTlGhQoUiP6co5bqTBEBAQADRVpyM8Ss1a9Zk8+bN5OTk8Mknn5zXNnr06MHMmTPJzs4mOTmZZcuW0blzZ3r06MGMGTPIzs4mKSmJxYsXA9C8eXOSk5PzClRmZiabNm0qcNs5OTns37+f3r178+KLL3Ls2DFSU1Pp0aMH06dPB2DJkiXUqFGDSpUq5Vs3IiKCzp07M27cOAYMGEBgYCCVKlWiUaNGfPzxx4CrWK5bt67I37Fly5bs2LEj3++c+/kLFizg6NGjgOuI6eTJk3nL5R5BFfTKLU7vvPMOX331FR9++CEBAflLybZt2/KdWjxf5b5AARz5dS/zb72cFR+97nQUY0wxvPDCCwwYMIA+ffoUepqtMEOGDCEmJoZ27drRp08fXnzxRWrVqsWQIUNo2rQpbdu25b777qNnz54AhISEMGvWLB577DHatWtH+/btWbFiRYHbzs7O5pZbbqFt27bExsby0EMPUaVKFZ5++mni4+OJiYnh8ccfZ9q0aQWuP3ToUP73v/8xdOjQvLbp06fz7rvv0q5dO1q3bs1nn31W4LqeWrRowfHjx/OKz8SJE1m2bBkdOnRg4cKFNGjQAIDq1avTtWtX2rRpwyOPPFKs/Td69GgOHjzIpZdeSvv27Xn22Wfz5i1evJhrrrmmWNspjD3NHMjMOMWyy+PY3b8Ndz8xowSSGVN2bN68mZYt7fqsv3rttdeIjIw8671QJe3gwYMMHz6cRYsWFTi/oO/T2Z5mbkdQQHBIGIufH8SUxvvIzMl0Oo4xxpSY++67L991OW/bt29fvq7uF6Lcd5LI1Sf6cj7bNZeEAz/Rpd5lTscxxpSQDRs2cOutt+ZrCw0NZdWqVSWy/bFjx/L999/naxs3bhx33PHH+8WcEBYW9off35s6depUYtuyAuXWpXYXnv1fDofjX4Q3PnU6jjGmhLRt27bYXabPx7/+9S+vbbu889opPhGpLyKLRWSziGwSkXHu9pkistb92iMia93tDUUk3WPeJG9lK0h4cDjSrhVc3LA0P9YYY8xZePMIKgt4WFVXi0gkkCAiX6tqXrcUEXkF8LxLbaeqtvdipkINfvljpz7aGGPMGbx2BKWqSaq62j19EtgM1M2dL667xW4CPvRWhvORcTqNxO1rnI5hjDHlXqn04hORhkAs4HlVsjtwUFW3e7Q1EpE1IrJURAq8jVlERolIvIjEJycnl3jWRTf3ZduoO0t8u8YYY86N1wuUiEQAs4EHVfWEx6ybyX/0lAQ0UNVYYDzwgYjkv8UaUNXJqhqnqnGez5gqKaevu4L/XZpB4snEEt+2Mcb/2HhQBXvzzTdp0qQJIsLhw4fz2v1mPCgRCcZVnKar6hyP9iDgOmBmbpuqnlbVFPd0ArATaObNfAXpMPAufmoewNLEpaX90caYIth4UIUrzfGgunbtyjfffEN0dHS+9pIcD8qbvfgEeBfYrKqvnjH7CmCLqiZ6LB8lIoHu6cZAU2CXt/KdTYNKDWgv0eyd792/mIzxV3tvvY1jc1zPv9PMTPbeehvH584FICc9nb233saJL74AIPvkSdf7hQsByDp6lL233sbJb13Pt8sqxmn6PXv20LJlS8aMGUOHDh3Yv38/ERERefNnzZrFyJEjAdfRzp/+9Ccuu+wyGjduXOiRj6ryyCOP0KZNG9q2bcvMmTPz2u+//35atWrFNddcw6FDh/LWSUhIoGfPnnTs2JF+/fqRlJR01u2//vrrtGrVipiYGIYNGwbAkSNHGDx4MDExMXTp0oX169fnW+f48eM0bNgwrwinpaVRv359MjMz2blzJ/3796djx450796dLVu25P3O48ePp3fv3jz22GP5tlfQeFBXXnklsbGx3HvvvQWOB1XcRx3FxsbSsGHDP7R7jgd1obzZi68rcCuwIbcrOfAXVf0CGMYfO0f0AJ4VkSwgGxitqke8mO+shm2sRPTnazh6+36qRtV3IoIxxoONB+W740EVxOfHg1LV5UCBz3VX1ZEFtM3GdTrQcW3ueZjk6/YTUa2W01GM8TnR7/83b1qCg/O9D6hQId/7wMjIfO+DqlbN/76Y15FtPCjfHQ+qIDYelBdFN+1IdNOOTscwxrjZeFC+OR7U2dh4UF62Y91S5o+/ifS0E0UvbIwpVTYelPPjQRXGxoPyspSdP1Pvqw2sWXF+X35jjPfYeFDOjwf1+uuvU69ePRITE4mJicnXld3Gg6LkxoMqyOlTv3HljD70bnYVT1/2tFc+wxh/YONB+TcbD6oMCg2rSFzDbixNXEqO2n0Xxhj/ZONBlVF9g9sSO20BG2t+QkzP652OY4w5DzYelI0HVSZd0uxy1h57maNJe5yOYoyjVLVYvb98kY0H5TvO9ZKSFahCVI2qT8/l6wkQOxNqyq+wsDBSUlKoXr263xYp4zxVJSUlhbCwsGKvYwWqCAESQE5ODtlZGQSHFH/HGlNW5PbU8sboAaZ8CQsLo169esVe3gpUEVKPH2b1NX1Iu+oy+j9RqoP8GuMTgoODadSokdMxTDlk566KEFG5BrubRvJjsA2/YYwxpckKVDGkjbuFWTX3cTj9cNELG2OMKRFWoIqhd4PeBGfmsGL1XKejGGNMuWEFqhiaV23Oy9OEoH+853QUY4wpN6yTRDGICHrPzURWKfjR9MYYY0qeFahi6nPbX5yOYIwx5Yqd4jsHuzeu4IfZdte4McaUBq8VKBGpLyKLRWSziGwSkXHu9qdF5BcRWet+Xe2xzgQR2SEiW0Wkn7eyna9NL08k4Ll/kZl5uuiFjTHGXBBvHkFlAQ+rakugCzBWRHJHunpNVdu7X18AuOcNA1oD/YG3ROSPYxg7KHzUSB69I4C1KeudjmKMMWWe1wqUqiap6mr39ElgM1C3kFUGATNU9bSq7gZ2AJ29le98XNJpMCeqhrB4/2KnoxhjTJlXKtegRKQhEAvkPt/+fhFZLyJTRCS3a1xdYL/HaokUUNBEZJSIxItIfGk/G6xicEUGnm5JxcmzycmxMaKMMcabvF6gRCQCmA08qKongH8DFwPtgSQgd2Srgh6T/Idns6vqZFWNU9W4qKgo74QuRLe0enRZdYLEXetK/bONMaY88WqBEpFgXMVpuqrOAVDVg6qarao5wNv8fhovEajvsXo94IA3852PLnc8xsXfL6NBk1inoxhjTJnmzV58ArwLbFbVVz3aa3ssNgTY6J6eCwwTkVARaQQ0BX70Vr7zFRFZjSqRpX/kZowx5Y03j6C6ArcCfc7oUv6iiGwQkfVAb+AhAFXdBHwE/Ax8CYxV1Wwv5jtvG5Z+wsKrO3Ng1wanoxhjTJnltSdJqOpyCr6u9EUh6/wN+Ju3MpWUCpWqkp16kp82LmRQ47ZOxzHGmDLJniRxHi5u35O3HmrCFxW2OR3FGGPKLCtQ50FE6F2/Nz8lreJE2lGn4xhjTJlkBeo89QlqzRuvn2btzH87HcUYY8okK1DnqU3r3hxqU4fgWrWcjmKMMWWSDbdxnoKCQxgydZHTMYwxpsyyI6gLdPTQPvZu9rnbtYwxxu/ZEdQFyMnJYdPAqznRsAbRM5Y4HccYY8oUO4K6AAEBAewY2YN3Oh4nNSPV6TjGGFOmWIG6QO2vG8X2i7JsCA5jjClhVqAuUExUDB1Sq7P3gylORzHGmDLFCtQFCpAAbtpVk24zt3D82CGn4xhjTJlhnSRKQOy4iWSOy6ZylYucjmKMMWWGFagSUKdBK6cjGGNMmWOn+ErI1p8WMv/mXhxKtAfIGmNMSbACVUJEAqi27SA/rJrjdBRjjCkT7BRfCWkWdwXX/bU5kWGbGeh0GGOMKQPsCKoE9Wt8FasPrSbp5AGnoxhjjN/zWoESkfoislhENovIJhEZ525/SUS2iMh6EflERKq42xuKSLrH8PCTvJXNW/pd1IMX381i/Zs+PyiwMcb4PG8eQWUBD6tqS6ALMFZEWgFfA21UNQbYBkzwWGenqrZ3v0Z7MZtXNKzdktNN6iI1rbu5McZcKK9dg1LVJCDJPX1SRDYDdVV1ocdiPwA3eCuDEwZP+cbpCMYYUyaUyjUoEWkIxAKrzph1J7DA430jEVkjIktFpPtZtjVKROJFJD45Odk7gS9QRnqaDcFhjDEXyOu9+EQkApgNPKiqJzzan8B1GnC6uykJaKCqKSLSEfhURFp7rgOgqpOByQBxcXHq7fznY9HwKwg9lk704jVORzHGGL/l1SMoEQnGVZymq+ocj/bbgQHACFVVAFU9raop7ukEYCfQzJv5vCXzpv5M7ZbBzmM7nY5ijDF+y5u9+AR4F9isqq96tPcHHgMGqmqaR3uUiAS6pxsDTYFd3srnTZcOuo+1TQJZuGdh0QsbY4wpkDePoLoCtwJ9PLqOXw28CUQCX5/RnbwHsF5E1gGzgNGqesSL+bwmKjyKnhViOPzxDHJycpyOY4wxfsmbvfiWA1LArC/OsvxsXKcDy4RBSbWpOzuBbdd/S4sOVzgdxxhj/I496shLOo54kL1dexET28fpKMYY45esQHlJ1Rp1qVqjrtMxjDHGb9mz+Lzo0P6tzBs7iM0r5jkdxRhj/I4VKC8KqRBBreXbWLtyrtNRjDHG71iB8qIqNery/ot9eKfBTnLUevMZY8y5sALlZVc2vZpDaYdYc3C101GMMcavWIHysl71evHoHOXA32wIDmOMORfWi8/LKoZUpFL0xWRXq+R0FGOM8StWoErBoNc/czqCMcb4HTvFV0pycnI4sHO90zGMMcZvWIEqJV88dCMHrh9GRnpa0QsbY4yxAlVaql1zLf/tI/yQtNLpKMYY4xesQJWSTpePIKFTFRb8YkPCG2NMcViBKiXBgcH0r9eX9LlfcChxm9NxjDHG51mBKkW3VL2Se+Zl8OPUl5yOYowxPs+6mZeiRm0uI37SM1zZbbDTUYwxxudZgSplcT1vAlzdzgMC7ADWGGPOxmv/QopIfRFZLCKbRWSTiIxzt1cTka9FZLv7Z1WPdSaIyA4R2Soi/byVzWkrP36DpX06cPLYIaejGGOMzzrvAiUilxSxSBbwsKq2BLoAY0WkFfA4sEhVmwKL3O9xzxsGtAb6A2+JSOD55vNlkbXqczgkg7kJ/3M6ijHG+KwLOYL6uLCZqpqkqqvd0yeBzUBdYBAwzb3YNGCwe3oQMENVT6vqbmAH0PkC8vmsNt0H880j3Zl8+DNOZZ1yOo4xxvikCylQUuwFRRoCscAqoKaqJoGriAEXuRerC+z3WC3R3XbmtkaJSLyIxCcnJ59ndOfd0/Ye0o+lsOCLN5yOYowxPulCCpQWZyERiQBmAw+q6onCFi3OZ6jqZFWNU9W4qKio4iX1QXG14njyywhqPjeNjNPpTscxxhifU2gvPhH5nIILkQDVi9q4iATjKk7TVXWOu/mgiNRW1SQRqQ3k9hRIBOp7rF4POFDUZ/iz6IcfIy0zjeCQMKejGGOMzymqm/nL5zkPERHgXWCzqr7qMWsucDvwgvvnZx7tH4jIq0AdoCnwYxH5/FpMtyFORzDGGJ9VaIFS1aUXsO2uwK3ABhFZ6277C67C9JGI3AXsA250f9YmEfkI+BlXD8Cxqpp9AZ/vF9JSj7H4qVFEtu9Ij9seczqOMcb4jKJO8W2gkGtNqhpTyLzlnL0jxeVnWedvQLkaGz20QgRha7axIf0Xut36CAFiN+8aYwwUfYpvgPvnWPfP990/RwA2sFEJCAwM4vSkZ5n0wxM03/ctV0Rf4XQkY4zxCYX+ua6qe1V1L9BVVR9V1Q3u1+NAmX3SQ2nr1/QaGkQ24MPv/kVOTo7TcYwxxicU93xSRRHplvtGRC4DKnonUvkTGBDIAwFX8ODzW/jx0/84HccYY3xCcR8WexcwRUQq47omdRy402upyqE+/e5l/vLviWnT0ekoxhjjE4rqJHEp8IOqJgDtRKQSIKp6vFTSlSMhFcIZ8vIsp2MYY4zPKOoU3+1AgojMEJGRQLgVJ+/anrCIBc/e43QMY4xxXFGdJEaragfgaaAqMFVEVorI8yLSo6w+bdxJO7/8mJqzlrNh84XcgmaMMf6vWJ0kVHWLqr6mqv2BPsByXDfYrvJmuPKo6/3PMeHBqkxOstN9xpjyrVgFyj3IYDURqQZUAH4AxqtqnFfTlUORlWswuOOtLNm/hC0HNzodxxhjHFPcbuargWRgG7DdPb1bRFaLiHU7K2HDWwznz58JOx8e53QUY4xxTHEL1JfA1apaQ1WrA1cBHwFjgLe8Fa68qhxamRrtO5PRpK7duGuMKbdEtehhnUQk/szTebltIrJWVdt7K2Bh4uLiND4+3omPNsYYU0JEJKGgS0bFPYI6IiKPiUi0+/UocMzdi8/+xPeSnJwcfvr8HX7ZsdbpKMYYU+qKW6CG4xpA8BPgU1wDCw4DAoGbvJLMcPiX7YQ99go//etZp6MYY0ypK26BaoirQAmup0/0Ar5V1QxV3eGdaOai+s1Z9khv/l/MHpLTkp2OY4wxpaq4BWo6MAW4DtcQHAOAa70Vyvxu4PUTOBWYzbRN05yOYowxpaq4BSpZVT9X1d25Q3C4h+E4KxGZIiKHRGSjR9tMEVnrfu3JHWlXRBqKSLrHvEnn/yuVLfUr1ee2nC40m/AeKUm7nY5jjDGlprhPM58oIu8Ai4DTuY2qOqeQdaYCbwL/9Vh+aO60iLyC66nouXY61RvQ1w1qN4x9765g347VVK/dyOk4xhhTKopboO4AWgDB/N5rT4GzFihVXSYiDQuaJyKCq3NFn2InLceaxPYmeslqggODnY5ijDGlprgFqp2qti3Bz+0OHFTV7R5tjURkDXAC+KuqfleCn+f3ggODyTidxu71y2ne6Uqn4xhjjNcV9xrUDyLSqgQ/92bgQ4/3SUADVY0FxgMfuMee+gMRGSUi8SISn5xcvnq2LRx7PcfvfZDU4ylORzHGGK8rboHqBqwVka0isl5ENojI+vP5QBEJwtUbcGZum6qeVtUU93QCsBNoVtD6qjpZVeNUNS4qKup8Ivit+iNH8a+rhTn75zkdxRhjvK64p/j6l+BnXgFsUdXE3AYRiQKOqGq2iDQGmgK7SvAzy4R23YYQ+NvnTP15GkNbDiM0MNTpSMYY4zXFHQ9qb0GvwtYRkQ+BlUBzEUkUkbvcs4aR//QeQA9gvYisA2YBo1X1yLn9KuXDqNZ302npQZZMec7pKMYY41XFPYI6Z6p681naRxbQNhuY7a0sZUnnOl04uT2M1NTlYCPDG2PKMK8VKOMdAQEBtJs+hxo16jsdxRhjvKq4nSSMD7koKpoACeDEkV/JysxwOo4xxniFFSg/tT1hEdt792HFh685HcUYY7zCCpSfahTTnTUdKjEz/TuKM+ikMcb4GytQfiooOISoJyawLGwvyxKXOR3HGGNKnBUoP3Z146tpobVY8+Zz5OTYwMbGmLLFCpQfCw4IZtSxdvSdm8jmhIVOxzHGmBJl3cz9XLdRT7GjZz/axvZ1OooxxpQoO4LycxXCK+UVp+zsLIfTGGNMybECVUbMf3goXw2/3OkYxhhTYqxAlRXVqrAlKJnNhzY6ncQYY0qEFagyovsjL/HxNZV5++cpTkcxxpgSYQWqjKgUUombW9zMlviv2fnzCqfjGGPMBbMCVYaMaHg9z/03i59fedbpKMYYc8Gsm3kZUr1aXTY9NZr2l1iXc2OM/7MCVcb0uGGc0xGMMaZE2Cm+Mmjn+u/44sbuHNi1wekoxhhz3rxWoERkiogcEpGNHm1Pi8gvIrLW/braY94EEdkhIltFpJ+3cpUHIWHhVN59mAVL3nE6ijHGnDdvHkFNBfoX0P6aqrZ3v74AEJFWwDCgtXudt0Qk0IvZyrT6zTqy4JXBTApZQUp6itNxjDHmvHitQKnqMuBIMRcfBMxQ1dOquhvYAXT2Vrby4K72oziddYpZS/7ldBRjjDkvTlyDul9E1rtPAVZ1t9UF9nssk+huM+epUeVGTFjXkE6Pfcjxw784HccYY85ZaReofwMXA+2BJOAVd7sUsGyBw8SKyCgRiReR+OTkZK+ELCtihz/Azlu6UTGyutNRjDHmnJVqgVLVg6qarao5wNv8fhovEajvsWg94MBZtjFZVeNUNS4qKsq7gf1ci05XcuOjbxMUGsahxG02qKExxq+UaoESkdoeb4cAuT385gLDRCRURBoBTYEfSzNbWZa0eyO7Bg9h/tN3OB3FGGOKzWs36orIh0AvoIaIJAITgV4i0h7X6bs9wL0AqrpJRD4CfgaygLGqmu2tbOVNzehWfN+zOe9UTuC3LTMY1mKY05GMMaZIolrgpR6/EBcXp/Hx8U7H8AtZOVk8tPghliYu5Z+t/krvTjc5HckYYwAQkQRVjTuz3Z4kUU4EBQTxYs8XGbGnLtVGTmT99585HckYYwplBaocqRBUgXvuncSuq1pzcWwvp+MYY0yhrECVM9VqRTPk5VlUDK9M6vHDJO22EXiNMb7JnmZeTuXk5LD8tmsJOZZG2PxFVI2o4XQkY4zJx46gyqmAgACi7hvDBz3ggWUPkp6V7nQkY4zJxwpUOdax/60Mvftl1iev54UPx5CZccrpSMYYk8cKVDnXN7ovExuNYcjff2DBU3c6HccYY/LYNSjD9T1G8+Xd22h/nRUoY4zvsCMoA0D/B1+lQYM2ZGdnse7bj5yOY4wxVqBMfoteGU/Q2Iks/Xaa01GMMeWcFSiTz2WjJzL/pmjGJ/6ThIMJTscxxpRjVqBMPhGVqnPPhA+pE1mXpz4Zy7bVi5yOZIwpp6xAmT+oGlaVf1/xb8bOSuOXBx8iw7qfG2McYL34TIHqRdYj9fmXSD19gpCQMKfjGGPKITuCMmfVonM/4rrfCMAPc94iLfWYs4GMMeWKFShTpD2bVhL5xBvMemoEWTlZTscxxpQTVqBMkRq2vpRdTwzjH6338rdVf8OfB7k0xvgPrxUoEZkiIodEZKNH20siskVE1ovIJyJSxd3eUETSRWSt+zXJW7nM+bn2loncHnsPn236mNn/Ge90HGNMOeDNI6ipQP8z2r4G2qhqDLANmOAxb6eqtne/RnsxlzlPf4r9E3/e3ZKW//iSjT8ucDqOMaaM81qBUtVlwJEz2haqau5FjB+Aet76fFPyRIQbnprG0ZfG0abzVU7HMcaUcU5eg7oT8PwzvJGIrBGRpSLS/WwricgoEYkXkfjk5GTvpzT5hISG0+1a1wHupuWfsXbRDIcTGWPKKkfugxKRJ4AsYLq7KQlooKopItIR+FREWqvqiTPXVdXJwGSAuLg4u1rvkJycHH59+hkyszLYHtuRptWaOh3JGFPGlPoRlIjcDgwARqi7O5iqnlbVFPd0ArATaFba2UzxBQQE0Oytt5l0SzXuW3Qfv/72q9ORjDFlTKkWKBHpDzwGDFTVNI/2KBEJdE83BpoCu0ozmzl39Zt15O/Xvc1vGalMe3YYR5P3Ox3JGFOGeLOb+YfASqC5iCSKyF3Am0Ak8PUZ3cl7AOtFZB0wCxitqkcK3LDxKc2rNeeNix/nqnkHWfbviU7HMcaUIeLPN13GxcVpfHy80zEMsH7lXFp07k9IYIjTUYwxfkZEElQ17sx2e5KEKRExlw4kJDCEQ4nb+PK5e8nJyXE6kjHGz1mBMiVq9dRXqTlzGe8v/LvTUYwxfs4KlClRV/7lLb58+kpePvgBs7fNdjqOMcaPWYEyJSogIIA/D3mZrnW7smDq06yY+U+nIxlj/JQVKFPiggOCeaX7ywxNCOHo+++TnZPtdCRjjB+yEXWNV1QMjSB26scEhoUTGBDodBxjjB+yIyjjNTVqN6Zq1VqcTk9l3p+uI2n3xqJXMsYYNytQxuv2b4mn9tLNvPPuA5zI+MPjFY0xpkBWoIzXNYntReYH/2BO82Pcu/BeVn3/sd0nZYwpkhUoUyq6tO7Hiz1eJPXX/YTf8xRzn7rN6UjGGB9nBcqUmr7Rfflo+Bckj7uRFkPvAWDrTwuZN+569u5d73A6Y4yvsV58plRVCK9En3ufzXufuGoxtZb8zNCWw4lt0p0RtQdyaYu+BAbaV9OY8s6OoIyjLr///9Hg26+4vctYthzZwt5HHmbhtV3IUbtGZUx5ZwXKOO6i6g24r/19LLx+IfVuHAFX9yZAAsjJyWHBU3eyY8N3Tkc0xjjAzqMYnxEcGEzPO57Ie79n0wrqzl7JGydXkX5VV4Y3G0a3ut0ICrYhPYwpD+wIyvisxm27UXvh57QdMZadx3cy460H+KFHR3ZsXul0NGNMKbAjKOPTouo24e66Tbi9wz18HzyJlKQ5xDVpD8CPc9+mSp1GNIu7wtmQxhiv8OaQ71NE5JCIbPRoqyYiX4vIdvfPqh7zJojIDhHZKiL9vJXL+KfggGB6DX6AQe8vJiy4Ajk5OaS9/CYbJjzAnV/dyTd7vyEzO9PpmMaYEuTNU3xTgf5ntD0OLFLVpsAi93tEpBUwDGjtXuctEbEnjJqzCggIIOajuZx++A4STyby+MIHWdanI8tmvOJ0NGNMCfFagVLVZcCRM5oHAdPc09OAwR7tM1T1tKruBnYAnb2VzZQN1WpFM7z/oyy4bgEvxzxJZqVwAqpUAeBQ4jY2r5zvbEBjzAUp7WtQNVU1CUBVk0TkInd7XeAHj+US3W1/ICKjgFEADRo08GJU4y8CAwLpdclQ+HxoXlv8W/9H9Jx4xk78H9deejuXN7ic4IBgB1MaY86Vr/TikwLatKAFVXWyqsapalxUVJSXYxl/delDz7Pz0SHsCjnGI0sf4a17L+OL5+9zOpYx5hyUdoE6KCK1Adw/D7nbE4H6HsvVAw6UcjZThlSNqs/AO59n3pB5vNn7DS4+Fkr63l1583esW+pgOmNMcZR2gZoL3O6evh34zKN9mIiEikgjoCnwYylnM2VQYEAgPRv0YsDHy7n2TdfXbce6pWQOHc1LT17J5zs/JyM7w+GUxpiCeLOb+YfASqC5iCSKyF3AC0BfEdkO9HW/R1U3AR8BPwNfAmNVNdtb2Uz5FBIcBkDN6Jbsv7sfCc0C+cvyvzD61V7M/8utHD1iB+3G+BJRLfBSj1+Ii4vT+Ph4p2MYP5WjOaw8sJKt/3ie1ot203zxYqpUrsnR5P1Url6XgABfuURrTNkmIgmqGveHditQxsDRlANUrV4HgG/6duRI9WBCnnucqxpdRWhgqMPpjCnbzlag7E9EYyCvOGVnZ8E1fdjQKpwnv3+SfjOuYO5Tt3Fg9waHExpT/tiz+IzxEBgYxBUPvsTlqgz49UcWzX+Liz/+kQ1NPqFOo7ZkZpwiMCjETv8Zv5aRnUFqchISGEjVqHoA/PT5O6RVqcDxOpGkZfxG5dlLqBLbiUuvuZuM9DS+vudatravxvo2FclKPck9/9zOyet6M+Chf3otpxUoYwogIlxS+xIuufsS9vdcTfcGzQBY/PrjyFdLWfO3YUSGVKLW9hQqHcukz91PIyL8smMtGZmnqNSwKZEhkYQE2tAgpmQcStzGyfRjnKpakd8yfyMzfg1hoRXpeOUtACx8+UEOh2awM642v2X9Ruf3fiKocSMG/vUdABZdHsuGBjCtD2TlZDHltSz2XdaI69/6AoCgv7zCqljh/ctdT5mb/mEWO1IOwTV3ExQaRsTeZLIbCEIElSOjSI0+RkSt+gWHLSFWoIwpQv2mHfKmK9ZpQErFYGZvn0NaVhr3zcsmag/IPc8AsOa5R4jYksgD97n+13pgntLgeDD9F64B4IsnR3LyyK9sHN6JiOAILo5PokpwZa5wr79l1ZdkBwoRzVoQERxBREAFQkPDS/cXNuctJyeHU9mnSMtKIzVpPxnHj9EstjcAa7/+kORfd3EoriFpmWlU/iaB8N+yGfDk2wDM//NQjh5J4pPBUfyW+Rt3TEsiPCCMaz9dBcC6O2/mcGA6zw9zFZAXpmSRVb1SXoEKnreEjGrZfHNRNcKDwul8/CQ5J1Pzsp1q15TqdSMZ2TqG8KBwUu7aRv2mbfLmB73xHAMvqsnN9aKpEFyBCtcF0KZiFcD17Mue362np+cvWwqP9LYCZcw56Dp8PAwfz0AgOyebE9ceJO14St786DvGcOjAdia0r0dqZipVDieQceJ03vyc4yfISTnCigMrSM1I5ZFPT5ARWAHcBWrfxL9ylDSeu9n1j9DzU7PQqpUZOMf1JLB5I68kuTJsGNKGiOAI2n29myrRzbj8jicB1xAkVK9CxeatiAiJIDwth8qVaxJSwYpcZsYp0k4e5XRYIKezT5OWnETG/v007zqAkOBQtv60kF9WL+dwrzakZ6UTtnobFX/ey5XPTSEkMIQlbz/Nie+W8cWtzUjPSifu6300+fk4/RckICLMGzOQyvHbGTPW9c/q2M+zaZUIzX74GYBf/vsOYTsP8MK9rvkPLlcqpXo8fitHCZIA6kbUpWJwRbI71SAgpHLe7MhRdxIkmbzZOZbw4HDC2x4lMrJG3vwei+IJDAxiZG7D9fl//2te/Sh/Q0z+t217nbGCD7ACZcx5CgwIpGq1OlStVievrW3PIfkXOuMfgQGvzwHgZvf7rJsySE87kTe/7l+fpMKpozzfqDonM06ih1cQFlnl9w0EBXKa0+w8tpPUjFR6fv0rx5v+Au4ClfPsP4i/WPnP1a4C984/svilcwOu+89XACy6ogMb21dl45WNiQyJpNeMrVTq0ZNewx8FYPF/nkJaNKVCs2ZEBFek4sGTVKt7MZWqXIS3qCoiQnraCZL3beV05XBOByvphw+S/fNWmnQfQI2oBuzZtJKtn0/nl25NSQ0XQrftp+6SzbSd8DzR0TGs+mQSx959j49vaUBKhSxa/3SYAV8e4aJZ02ncsD3fvvYIDd77hpEPBZIWJgz8IYdbFudw+LtY6kQ1Ztf8mTScsYLxwXPIDhRuXJbN4B+UtIlphASGcOrQQcJ/OcKJjBOEBYUhVSqTWTOAbM0mSIKo2q0XR6KqMb5jT8KDwqla4zAB6b/fztnxuTfIysxgef1GhAeFE3x7/mdD5haQYbkN3fPvpy43jM3fUCv/28DAsvfPedn7jYzxI0HBIURW/v2v4NbdBuVfoOXwfG8HvLMAgNG5DTe5Tivlqvrv1+gSmEnrGuGkZqZy7MgSajdtkTc/vU41tFok6VnpHE49xA2r93Coluvz09NOUOu1j/mgZwCfXhZA2Gnlv69ms2j4JQx5aipHk/ez9ar+fNm/Blu71KF6VhhXfbSHKkOH0nXQaA4f2MmPbz7N/o71Sa4bTsCvh2n30Tqi7rqbzpePYOtPCznwyKPMurYam+tDvV2p/Pn9kxz52xh6DX6ADd/MJPLRV3nylkC21hdid+Qw4eMctr1RkRp9b+eXDT/QYOoi3pQl7KsdyGU7gmgXf4rjhw9AtPsvAVWqBEVSqXIVajSK4nDHAzQIcR091u/ej32q/PnSLoRVrEzFZic53vcY0RGu3/+S0U9xcuhBvm7QkArB4YTcEpLvGmL/J/4NT0De8JhnnOLqOnx8/oYW+d/Wim6FOTdWoIzxc549Cpt3ujL/zIeuzfd2wH+/yT//ut8nQ0LDiZj7P4YHZTMwXEhNPcpBWUGz9l3yljncsRERDaKoHBpK9vEUKiYeIe14MgCpRw8RPSeeL3M2sjYzknrHA7ks8Qhpx1zzwypWJr1mZaKjmhBVrw5VI7LYf/VOLm7YGoDodt34+aH93NupLaEX1ST00iwyLz9Cq/bdAIgbdA/pV9zE7ErVCQ4ORUTg2d/zXzJkNAwZ/Xvd6AXc9fv8VpcNoNVlA35vuDj/rqhWK5pqtaL/sH+Nc+xGXWNMicg9krMu+OZcne1GXTuCMsaUCCtMpqTZN8oYY4xPsgJljDHGJ1mBMsYY45OsQBljjPFJVqCMMcb4JCtQxhhjfJIVKGOMMT7JCpQxxhif5NdPkhCRZGDvBW6mBnC4BOKUNn/NDf6b3XKXLn/NDf6b3anc0aoadWajXxeokiAi8QU9YsPX+Wtu8N/slrt0+Wtu8N/svpbbTvEZY4zxSVagjDHG+CQrUDDZ6QDnyV9zg/9mt9yly19zg/9m96nc5f4alDHGGN9kR1DGGGN8khUoY4wxPqlcFygR6S8iW0Vkh4g87nSesxGR+iKyWEQ2i8gmERnnbn9aRH4RkbXu19VOZz2TiOwRkQ3ufPHutmoi8rWIbHf/rOp0Tk8i0txjn64VkRMi8qCv7m8RmSIih0Rko0fbWfexiExwf+e3iki/grfqfWfJ/ZKIbBGR9SLyiYhUcbc3FJF0j30/ycdyn/W74eP7e6ZH5j0istbd7hv7W1XL5QsIBHYCjYEQYB3QyulcZ8laG+jgno4EtgGtgKeBPzudr4jse4AaZ7S9CDzunn4c+LvTOYv4nvwKRPvq/gZ6AB2AjUXtY/f3Zh0QCjRy/z8Q6EO5rwSC3NN/98jd0HM5H9zfBX43fH1/nzH/FeApX9rf5fkIqjOwQ1V3qWoGMAMY5HCmAqlqkqqudk+fBDYDdZ1NdUEGAdPc09OAwc5FKdLlwE5VvdAnlniNqi4DjpzRfLZ9PAiYoaqnVXU3sAPX/wulrqDcqrpQVbPcb38A6pV6sCKcZX+fjU/v71wiIsBNwIelGqoI5blA1QX2e7xPxA/+0ReRhkAssMrddL/7dMgUXztV5qbAQhFJEJFR7raaqpoEruILXORYuqINI///tL6+v3OdbR/70/f+TmCBx/tGIrJGRJaKSHenQhWioO+Gv+zv7sBBVd3u0eb4/i7PBUoKaPPpPvciEgHMBh5U1RPAv4GLgfZAEq5DdF/TVVU7AFcBY0Wkh9OBiktEQoCBwMfuJn/Y30Xxi++9iDwBZAHT3U1JQANVjQXGAx+ISCWn8hXgbN8Nv9jfwM3k/0PMJ/Z3eS5QiUB9j/f1gAMOZSmSiATjKk7TVXUOgKoeVNVsVc0B3sahUweFUdUD7p+HgE9wZTwoIrUB3D8POZewUFcBq1X1IPjH/vZwtn3s8997EbkdGACMUPcFEfcpshT3dAKuaznNnEuZXyHfDX/Y30HAdcDM3DZf2d/luUD9BDQVkUbuv5SHAXMdzlQg9/nhd4HNqvqqR3ttj8WGABvPXNdJIlJRRCJzp3FdAN+Iaz/f7l7sduAzZxIWKd9flb6+v89wtn08FxgmIqEi0ghoCvzoQL4CiUh/4DFgoKqmebRHiUige7oxrty7nEn5R4V8N3x6f7tdAWxR1cTcBp/Z30730nDyBVyNq0fcTuAJp/MUkrMbrtMC64G17tfVwPvABnf7XKC201nPyN0YVw+mdcCm3H0MVAcWAdvdP6s5nbWA7OFAClDZo80n9zeuIpoEZOL6i/2uwvYx8IT7O78VuMrHcu/Adc0m93s+yb3s9e7v0DpgNXCtj+U+63fDl/e3u30qMPqMZX1if9ujjowxxvik8nyKzxhjjA+zAmWMMcYnWYEyxhjjk6xAGWOM8UlWoIwxxvgkK1DGlAARqe7x5OdfPZ5snSoib3npMx8UkdvOYfkQEVnmvjHTGJ9n3cyNKWEi8jSQqqove/EzgnDdn9JBf3+4anHWm4jrIcnTi1zYGIfZEZQxXiQivURknnv6aRGZJiIL3WPvXCciL4prvKwv3Y+zQkQ6uh/QmSAiX53xlIJcfXA9hinLvc4SEXnNfYS0WUQ6icgccY0H9ZzHep8CI7z8axtTIqxAGVO6LgauwTUMw/+AxaraFkgHrnEXqTeAG1S1IzAF+FsB2+kKJJzRlqGqPYBJuB5tNBZoA4wUkeruZTYCnUr2VzLGO+xctDGla4GqZorIBlyDIX7pbt+Aa5C45riKyteuRzASiOvxNGeqjWtcME+5z5LcAGxS93AbIrIL1wNLU1Q1W0QyRCRSXWOLGeOzrEAZU7pOA6hqjohk6u8XgXNw/f8ouIrLpUVsJx0IK2jb7m2d9mjP3XauUODUeWQ3plTZKT5jfMtWIEpELgXXMCsi0rqA5TYDTc514+5TfcmqmnlhMY3xPitQxvgQVc0AbgD+LiLrcD3R+7ICFl0AnM/gj72BL847oDGlyLqZG+OnROQT4FHNP0x3UevMASao6lbvJTOmZNgRlDH+63FcnSWKxT0w56dWnIy/sCMoY4wxPsmOoIwxxvgkK1DGGGN8khUoY4wxPskKlDHGGJ9kBcoYY4xP+v/2LzJCOODOTgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results2.G.plot(style='C2--', label='run_ode_solver (dt=2)')\n", - "results3.G.plot(style='C3:', label='run_ode_solver (dt=1)')\n", - "\n", - "decorate(xlabel='Time (m)', ylabel='mg/dL')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "aware-patrick", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "diff = (results2.G - results3.G).dropna()\n", - "percent_diff = diff / results2.G * 100" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "fiscal-baker", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "max(abs(percent_diff))" - ] - }, - { - "cell_type": "markdown", - "id": "turkish-principle", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "Here's the source code for `run_solve_ivp` if you'd like to know how it works.\n", - "\n", - "[RK45](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." - ] - }, - { - "cell_type": "markdown", - "id": "hispanic-summer", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "distinct-advance", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap20.ipynb b/jupyter/chap20.ipynb deleted file mode 100644 index a2cc521d..00000000 --- a/jupyter/chap20.ipynb +++ /dev/null @@ -1,1108 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "funded-utilization", - "metadata": {}, - "source": [ - "# Chapter 20" - ] - }, - { - "cell_type": "markdown", - "id": "furnished-portsmouth", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "pending-adams", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "embedded-gentleman", - "metadata": {}, - "source": [ - "So far the differential equations we've worked with have been **first\n", - "order**, which means they involve only first derivatives. In this\n", - "chapter, we turn our attention to second order ODEs, which can involve\n", - "both first and second derivatives.\n", - "\n", - "We'll revisit the falling penny example from\n", - "Chapter xxx, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." - ] - }, - { - "cell_type": "markdown", - "id": "isolated-louis", - "metadata": {}, - "source": [ - "## Newton's second law of motion\n", - "\n", - "First order ODEs can be written \n", - "\n", - "$$\\frac{dy}{dx} = G(x, y)$$ \n", - "\n", - "where $G$ is some function of $x$ and $y$ (see ). Second order ODEs can be written \n", - "\n", - "$$\\frac{d^2y}{dx^2} = H(x, y, \\frac{dy}{dt})$$\n", - "\n", - "where $H$ is a function of $x$, $y$, and $dy/dx$.\n", - "\n", - "In this chapter, we will work with one of the most famous and useful\n", - "second order ODEs, Newton's second law of motion: \n", - "\n", - "$$F = m a$$ \n", - "\n", - "where $F$ is a force or the total of a set of forces, $m$ is the mass of a moving object, and $a$ is its acceleration." - ] - }, - { - "cell_type": "markdown", - "id": "drawn-symphony", - "metadata": {}, - "source": [ - "Newton's law might not look like a differential equation, until we\n", - "realize that acceleration, $a$, is the second derivative of position,\n", - "$y$, with respect to time, $t$. With the substitution\n", - "\n", - "$$a = \\frac{d^2y}{dt^2}$$ \n", - "\n", - "Newton's law can be written\n", - "\n", - "$$\\frac{d^2y}{dt^2} = F / m$$ \n", - "\n", - "And that's definitely a second order ODE.\n", - "In general, $F$ can be a function of time, position, and velocity." - ] - }, - { - "cell_type": "markdown", - "id": "swiss-vietnam", - "metadata": {}, - "source": [ - "Of course, this \"law\" is really a model in the sense that it is a\n", - "simplification of the real world. Although it is often approximately\n", - "true:\n", - "\n", - "- It only applies if $m$ is constant. If mass depends on time,\n", - " position, or velocity, we have to use a more general form of\n", - " Newton's law (see ).\n", - "\n", - "- It is not a good model for very small things, which are better\n", - " described by another model, quantum mechanics.\n", - "\n", - "- And it is not a good model for things moving very fast, which are\n", - " better described by yet another model, relativistic mechanics.\n", - "\n", - "However, for medium-sized things with constant mass, moving at\n", - "medium-sized speeds, Newton's model is extremely useful. If we can\n", - "quantify the forces that act on such an object, we can predict how it\n", - "will move." - ] - }, - { - "cell_type": "markdown", - "id": "coordinate-three", - "metadata": {}, - "source": [ - "## Dropping pennies\n", - "\n", - "As a first example, let's get back to the penny falling from the Empire State Building, which we considered in\n", - "Chapter xxx. We will implement two models of this system: first without air resistance, then with.\n", - "\n", - "Given that the Empire State Building is 381 m high, and assuming that\n", - "the penny is dropped from a standstill, the initial conditions are:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "compatible-increase", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State\n", - "\n", - "init = State(y=381, v=0)" - ] - }, - { - "cell_type": "markdown", - "id": "intellectual-radiation", - "metadata": {}, - "source": [ - "where `y` is height above the sidewalk and `v` is velocity. \n", - "\n", - "The units `m` and `s` are from the `units` object provided by Pint:" - ] - }, - { - "cell_type": "markdown", - "id": "wicked-thomas", - "metadata": {}, - "source": [ - "The only system parameter is the acceleration of gravity:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "reverse-authorization", - "metadata": {}, - "outputs": [], - "source": [ - "g = 9.8" - ] - }, - { - "cell_type": "markdown", - "id": "developing-newfoundland", - "metadata": {}, - "source": [ - "In addition, we'll specify the duration of the simulation and the step\n", - "size:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "square-toolbox", - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10\n", - "dt = 0.1" - ] - }, - { - "cell_type": "markdown", - "id": "precise-tobago", - "metadata": {}, - "source": [ - "With these parameters, the number of time steps is 100, which is good\n", - "enough for many problems. Once we have a solution, we will increase the\n", - "number of steps and see what effect it has on the results.\n", - "\n", - "We need a `System` object to store the parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "built-piece", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import System\n", - "\n", - "system = System(init=init, g=g, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "id": "heavy-boards", - "metadata": {}, - "source": [ - "Now we need a slope function, and here's where things get tricky. As we have seen, `run_solve_ivp` can solve systems of first order ODEs, but Newton's law is a second order ODE. However, if we recognize that\n", - "\n", - "1. Velocity, $v$, is the derivative of position, $dy/dt$, and\n", - "\n", - "2. Acceleration, $a$, is the derivative of velocity, $dv/dt$,\n", - "\n", - "we can rewrite Newton's law as a system of first order ODEs:\n", - "\n", - "$$\\frac{dy}{dt} = v$$ \n", - "\n", - "$$\\frac{dv}{dt} = a$$ \n", - "\n", - "And we can translate those\n", - "equations into a slope function:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "occupied-mercury", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " y, v = state\n", - "\n", - " dydt = v\n", - " dvdt = -system.g\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "id": "opening-adolescent", - "metadata": {}, - "source": [ - "The first parameter, `state`, contains the position and velocity of the\n", - "penny. The last parameter, `system`, contains the system parameter `g`,\n", - "which is the magnitude of acceleration due to gravity.\n", - "\n", - "The second parameter, `t`, is time. It is not used in this slope\n", - "function because none of the factors of the model are time dependent. I include it anyway because this function will be called by `run_solve_ivp`, which always provides the same arguments,\n", - "whether they are needed or not.\n", - "\n", - "The rest of the function is a straightforward translation of the\n", - "differential equations, with the substitution $a = -g$, which indicates that acceleration due to gravity is in the direction of decreasing $y$. `slope_func` returns a sequence containing the two derivatives.\n", - "\n", - "Before calling `run_solve_ivp`, it is a good idea to test the slope\n", - "function with the initial conditions:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "positive-feeling", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0\n", - "-9.8\n" - ] - } - ], - "source": [ - "dydt, dvdt = slope_func(0, system.init, system)\n", - "print(dydt)\n", - "print(dvdt)" - ] - }, - { - "cell_type": "markdown", - "id": "false-charlotte", - "metadata": {}, - "source": [ - "The result is 0 m/s for velocity and 9.8 m/s$^2$ for acceleration. Now we call `run_solve_ivp` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "lovely-management", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " message: 'The solver successfully reached the end of the integration interval.'\n", - " nfev: 38\n", - " njev: 0\n", - " nlu: 0\n", - " sol: None\n", - " status: 0\n", - " success: True\n", - " t_events: None\n", - " y_events: None" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results, details = run_solve_ivp(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "assisted-swimming", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.0381.0000.00
    0.2380.804-1.96
    0.4380.216-3.92
    0.6379.236-5.88
    0.8377.864-7.84
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.0 381.000 0.00\n", - "0.2 380.804 -1.96\n", - "0.4 380.216 -3.92\n", - "0.6 379.236 -5.88\n", - "0.8 377.864 -7.84" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "markdown", - "id": "solved-chambers", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with two columns: `y` contains the height of\n", - "the penny; `v` contains its velocity.\n", - "\n", - "We can plot the results like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "authorized-barrier", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.y.plot()\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')" - ] - }, - { - "cell_type": "markdown", - "id": "differential-airfare", - "metadata": {}, - "source": [ - "Since acceleration is constant, velocity increases linearly and position decreases quadratically; as a result, the height curve is a parabola.\n", - "\n", - "The last value of `results.y` is negative, which means we ran the simulation too long. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "protected-fiber", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-108.99999999999869" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = results.index[-1]\n", - "results.y[t_end]" - ] - }, - { - "cell_type": "markdown", - "id": "metallic-tamil", - "metadata": {}, - "source": [ - "One way to solve this problem is to use the results to\n", - "estimate the time when the penny hits the sidewalk.\n", - "\n", - "The ModSim library provides `crossings`, which takes a `TimeSeries` and a value, and returns a sequence of times when the series passes through the value. We can find the time when the height of the penny is `0` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "japanese-clear", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([8.81788535])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import crossings\n", - "\n", - "t_crossings = crossings(results.y, 0)\n", - "t_crossings" - ] - }, - { - "cell_type": "markdown", - "id": "demonstrated-emission", - "metadata": {}, - "source": [ - "The result is an array with a single value, 8.818 s. Now, we could run\n", - "the simulation again with `t_end = 8.818`, but there's a better way." - ] - }, - { - "cell_type": "markdown", - "id": "blind-dominant", - "metadata": {}, - "source": [ - "## Events\n", - "\n", - "As an option, `run_solve_ivp` can take an **event function**, which\n", - "detects an \"event\", like the penny hitting the sidewalk, and ends the\n", - "simulation.\n", - "\n", - "Event functions take the same parameters as slope functions, `state`,\n", - "`t`, and `system`. They should return a value that passes through `0`\n", - "when the event occurs. Here's an event function that detects the penny\n", - "hitting the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "comfortable-simple", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(t, state, system):\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "id": "closing-vehicle", - "metadata": {}, - "source": [ - "The return value is the height of the penny, `y`, which passes through\n", - "`0` when the penny hits the sidewalk.\n", - "\n", - "We pass the event function to `run_solve_ivp` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "exotic-shareware", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " message: 'A termination event occurred.'\n", - " nfev: 38\n", - " njev: 0\n", - " nlu: 0\n", - " sol: None\n", - " status: 1\n", - " success: True\n", - " t_events: [array([8.81788535])]\n", - " y_events: [array([[ 5.68434189e-14, -8.64152764e+01]])]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "id": "recreational-blair", - "metadata": {}, - "source": [ - "Then we can get the flight time and final velocity like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "appropriate-roberts", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8.8" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = results.index[-1]\n", - "t_end" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "orange-retro", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.5440000000007217\n", - "-86.24000000000001\n" - ] - } - ], - "source": [ - "y, v = results.iloc[-1]\n", - "print(y)\n", - "print(v)" - ] - }, - { - "cell_type": "markdown", - "id": "cleared-jamaica", - "metadata": {}, - "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." - ] - }, - { - "cell_type": "markdown", - "id": "induced-albert", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "But air resistance...\n" - ] - }, - { - "cell_type": "markdown", - "id": "straight-johns", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", - "\n", - "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", - "\n", - "Use `run_solve_ivp` to answer this question.\n", - "\n", - "Here are some suggestions about how to proceed:\n", - "\n", - "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", - "\n", - "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", - "\n", - "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", - "\n", - "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", - "\n", - "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "forbidden-distributor", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "r_0 = 150e9 # 150 million km in m\n", - "v_0 = 0\n", - "init = State(r=r_0,\n", - " v=v_0)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "former-taxation", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "702370000.0" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "radius_earth = 6.37e6 # meters\n", - "radius_sun = 696e6 # meters\n", - "r_final = radius_sun + radius_earth\n", - "r_final" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "biological-creek", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "213.56265216338966" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_0 / r_final" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "oriental-riverside", - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 1e7 # seconds\n", - "\n", - "system = System(init=init,\n", - " G=6.674e-11, # N m^2 / kg^2\n", - " m1=1.989e30, # kg\n", - " m2=5.972e24, # kg\n", - " r_final=radius_sun + radius_earth,\n", - " t_end=t_end)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "radio-reproduction", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def universal_gravitation(state, system):\n", - " \"\"\"Computes gravitational force.\n", - " \n", - " state: State object with distance r\n", - " system: System object with m1, m2, and G\n", - " \"\"\"\n", - " r, v = state\n", - " G, m1, m2 = system.G, system.m1, system.m2\n", - " \n", - " force = G * m1 * m2 / r**2\n", - " return force" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "heavy-cologne", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.5233701151999997e+22" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "universal_gravitation(init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "little-electric", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(t, state, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `m2`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " m2 = system.m2 \n", - "\n", - " force = universal_gravitation(state, system)\n", - " dydt = v\n", - " dvdt = -force / m2\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "continental-details", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0, -0.005899815999999999)" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(0, system.init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "suitable-traveler", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def event_func(t, state, system):\n", - " r, v = state\n", - " return r - system.r_final" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "upper-victory", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "149297630000.0" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "event_func(0, init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "transparent-treat", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " message: 'A termination event occurred.'\n", - " nfev: 188\n", - " njev: 0\n", - " nlu: 0\n", - " sol: None\n", - " status: 1\n", - " success: True\n", - " t_events: [array([5599828.17941854])]\n", - " y_events: [array([[ 7.02370000e+08, -6.13362867e+05]])]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_solve_ivp(system, slope_func, \n", - " events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "brutal-woman", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5400000.0" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t_event = results.index[-1]\n", - "t_event" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "gentle-burst", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "from modsim import units\n", - "\n", - "seconds = t_event * units.second\n", - "days = seconds.to(units.day)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "comfortable-galaxy", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results.index /= 60 * 60 * 24" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "satisfactory-latitude", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results.r /= 1e9" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "significant-rebound", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.r.plot(label='r')\n", - "\n", - "decorate(xlabel='Time (day)',\n", - " ylabel='Distance from sun (million km)')" - ] - }, - { - "cell_type": "markdown", - "id": "right-colleague", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "`solve_ivp`\n", - "\n", - "Here is the source code for `crossings` so you can see what's happening under the hood:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "chief-error", - "metadata": {}, - "outputs": [], - "source": [ - "%psource crossings" - ] - }, - { - "cell_type": "markdown", - "id": "comparable-company", - "metadata": {}, - "source": [ - "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "listed-shelter", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap21.ipynb b/jupyter/chap21.ipynb deleted file mode 100644 index 35762a67..00000000 --- a/jupyter/chap21.ipynb +++ /dev/null @@ -1,1119 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "excited-advance", - "metadata": {}, - "source": [ - "# Chapter 21" - ] - }, - { - "cell_type": "markdown", - "id": "unauthorized-constitutional", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "medieval-cheese", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "superb-february", - "metadata": {}, - "source": [ - "In the previous chapter we simulated a penny falling in a vacuum, that\n", - "is, without air resistance. But the computational framework we used is\n", - "very general; it is easy to add additional forces, including drag.\n", - "\n", - "In this chapter, I present a model of drag force and add it to the\n", - "simulation." - ] - }, - { - "cell_type": "markdown", - "id": "interesting-freeware", - "metadata": {}, - "source": [ - "## Drag force\n", - "\n", - "As an object moves through a fluid, like air, the object applies force\n", - "to the air and, in accordance with Newton's third law of motion, the air applies an equal and opposite force to the object (see\n", - ").\n", - "\n", - "The direction of this **drag force** is opposite the direction of\n", - "travel, and its magnitude is given by the drag equation (see\n", - "): \n", - "\n", - "$$F_d = \\frac{1}{2}~\\rho~v^2~C_d~A$$\n", - "\n", - "where\n", - "\n", - "- $F_d$ is force due to drag, in newtons (N).\n", - "\n", - "- $\\rho$ is the density of the fluid in kg/m^3^.\n", - "\n", - "- $v$ is the magnitude of velocity in m/s.\n", - "\n", - "- $A$ is the **reference area** of the object, in m^2^. In this\n", - " context, the reference area is the projected frontal area, that is, the visible area of the object as seen from a point on its line of\n", - " travel (and far away).\n", - "\n", - "- $C_d$ is the **drag coefficient**, a dimensionless quantity that\n", - " depends on the shape of the object (including length but not frontal area), its surface properties, and how it interacts with the fluid." - ] - }, - { - "cell_type": "markdown", - "id": "unable-scheduling", - "metadata": {}, - "source": [ - "For objects moving at moderate speeds through air, typical drag\n", - "coefficients are between 0.1 and 1.0, with blunt objects at the high end of the range and streamlined objects at the low end (see\n", - ").\n", - "\n", - "For simple geometric objects we can sometimes guess the drag coefficient with reasonable accuracy; for more complex objects we usually have to take measurements and estimate $C_d$ from data.\n", - "\n", - "Of course, the drag equation is itself a model, based on the assumption that $C_d$ does not depend on the other terms in the equation: density, velocity, and area. For objects moving in air at moderate speeds (below 45 mph or 20 m/s), this model might be good enough, but we should remember to revisit this assumption.\n", - "\n", - "For the falling penny, we can use measurements to estimate $C_d$. In\n", - "particular, we can measure **terminal velocity**, $v_{term}$, which is\n", - "the speed where drag force equals force due to gravity:\n", - "\n", - "$$\\frac{1}{2}~\\rho~v_{term}^2~C_d~A = m g$$ \n", - "\n", - "where $m$ is the mass of the object and $g$ is acceleration due to gravity. Solving this equation for\n", - "$C_d$ yields: \n", - "\n", - "$$C_d = \\frac{2~m g}{\\rho~v_{term}^2~A}$$ \n", - "\n", - "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere.\n", - "\n", - "Now we are ready to add air resistance to the model." - ] - }, - { - "cell_type": "markdown", - "id": "human-cloud", - "metadata": {}, - "source": [ - "## The Params Object\n", - "\n", - "As the number of system parameters increases, and as we need to do more work to compute them, we will find it useful to define a `Params` object to contain the quantities we need to make a `System` object. `Params` objects are similar to `System` objects, and we initialize them the same way.\n", - "\n", - "Here's the `Params` object for the falling penny:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "established-knitting", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "\n", - "params = Params(\n", - " mass = 0.0025, # kg\n", - " diameter = 0.019, # m\n", - " rho = 1.2, # kg/m**3\n", - " g = 9.8, # m/s**2\n", - " v_init = 0, # m / s\n", - " v_term = 18, # m / s\n", - " height = 381, # m\n", - " t_end = 30, # s\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "instrumental-gross", - "metadata": {}, - "source": [ - "The mass and diameter are from . The density\n", - "of air depends on temperature, barometric pressure (which depends on\n", - "altitude), humidity, and composition (). I\n", - "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n", - "\n", - "\n", - "Here's a version of `make_system` that takes the `Params` object and computes the inital state, `init`, the area, and the coefficient of drag.\n", - "Then it returns a `System` object with the quantities we'll need for the simulation. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "published-jesus", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import pi\n", - "from modsim import State\n", - "from modsim import System\n", - "\n", - "def make_system(params):\n", - " init = State(y=params.height, v=params.v_init)\n", - "\n", - " area = pi * (params.diameter/2)**2\n", - "\n", - " C_d = (2 * params.mass * params.g / \n", - " (params.rho * area * params.v_term**2))\n", - "\n", - " return System(init=init,\n", - " area=area,\n", - " C_d=C_d,\n", - " mass=params.mass,\n", - " rho=params.rho,\n", - " g=params.g,\n", - " t_end=params.t_end\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "personalized-kruger", - "metadata": {}, - "source": [ - "And here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "executive-protection", - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "id": "portable-carbon", - "metadata": {}, - "source": [ - "Based on the mass and diameter of the penny, the density of air, and acceleration due to gravity, and the observed terminal velocity, we estimate that the coefficient of drag is about 0.44." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "quick-cedar", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.4445009981135434" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.C_d" - ] - }, - { - "cell_type": "markdown", - "id": "inner-telescope", - "metadata": {}, - "source": [ - "It might not be obvious why it is useful to create a `Params` object just to create a `System` object.\n", - "In fact, if we only run one simulation, it might not be useful. But it helps when we want to change or sweep the parameters.\n", - "\n", - "For example, suppose we learn that the terminal velocity of a penny is actually closer to 20 m/s.\n", - "We can make a `Params` object with the new value, and a corresponding `System` object, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "great-crime", - "metadata": {}, - "outputs": [], - "source": [ - "params2 = params.set(v_term=20)" - ] - }, - { - "cell_type": "markdown", - "id": "outstanding-truth", - "metadata": {}, - "source": [ - "The result from `set` is a new `Params` object that is identical to the original except for the given value of `v_term`. \n", - "\n", - "If we pass `params2` to `make_system`, we see that it computes a different value of `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "independent-trace", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.3600458084719701" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system2 = make_system(params2)\n", - "system2.C_d" - ] - }, - { - "cell_type": "markdown", - "id": "charged-explorer", - "metadata": {}, - "source": [ - "If the terminal velocity of the penny is 20 m/s, rather than 18 m/s, that implies that the coefficient of drag is 0.36, rather than 0.44.\n", - "And that makes sense, since lower drag implies faster terminal velocity.\n", - "\n", - "Using `Params` objects to make `System` objects helps make sure that relationships like this are consistent. And since we are always making new objects, rather than modifying existing objects, we are less likely to make a mistake." - ] - }, - { - "cell_type": "markdown", - "id": "primary-advocate", - "metadata": {}, - "source": [ - "## Simulation\n", - "\n", - "Now let's get to the simulation. Here's a version of the slope function that includes drag:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "noble-stick", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " y, v = state\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " mass, g = system.mass, system.g\n", - " \n", - " f_drag = rho * v**2 * C_d * area / 2\n", - " a_drag = f_drag / mass\n", - " \n", - " dydt = v\n", - " dvdt = -g + a_drag\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "id": "baking-class", - "metadata": {}, - "source": [ - "`f_drag` is force due to drag, based on the drag equation. `a_drag` is\n", - "acceleration due to drag, based on Newton's second law.\n", - "\n", - "To compute total acceleration, we add accelerations due to gravity and\n", - "drag. `g` is negated because it is in the direction of decreasing `y`,\n", - "and `a_drag` is positive because it is in the direction of increasing\n", - "`y`. In the next chapter we will use `Vector` objects to keep track of\n", - "the direction of forces and add them up in a less error-prone way." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "velvet-tunisia", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0, -9.8)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "psychological-style", - "metadata": {}, - "source": [ - "To stop the simulation when the penny hits the sidewalk, we'll use the\n", - "event function from Section xxx:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "practical-nowhere", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(t, state, system):\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "animated-clause", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "381" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "executive-there", - "metadata": {}, - "source": [ - "Now we can run the simulation like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "liberal-dictionary", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "id": "incident-paradise", - "metadata": {}, - "source": [ - "Here are the last few time steps:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "coastal-anthropology", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    20.6443083.229229e+01-17.988889
    21.0930972.421654e+01-17.991564
    21.5418861.614743e+01-18.001510
    21.9906768.076745e+00-18.009752
    22.4394657.105427e-15-18.011383
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "20.644308 3.229229e+01 -17.988889\n", - "21.093097 2.421654e+01 -17.991564\n", - "21.541886 1.614743e+01 -18.001510\n", - "21.990676 8.076745e+00 -18.009752\n", - "22.439465 7.105427e-15 -18.011383" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "suburban-martial", - "metadata": {}, - "source": [ - "The final height is close to 0, as expected.\n", - "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", - "\n", - "We can get the flight time from `results`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "interim-underground", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "22.43946505804431" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = results.index[-1]\n", - "t_sidewalk" - ] - }, - { - "cell_type": "markdown", - "id": "institutional-colors", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "small-franchise", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_position(results):\n", - " results.y.plot()\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)" - ] - }, - { - "cell_type": "markdown", - "id": "plain-phone", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "analyzed-criticism", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(results):\n", - "\n", - " results.v.plot(color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "id": "careful-causing", - "metadata": {}, - "source": [ - "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." - ] - }, - { - "cell_type": "markdown", - "id": "inside-confidence", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "planned-endorsement", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "respective-address", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with a downward initial velocity that exceeds the penny's terminal velocity.\n", - "\n", - "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction.\n", - "\n", - "Hint: Use `params.set` to make a new `Params` object with a different initial velocity." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "inclusive-twenty", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "params = params.set(v_init=-30)\n", - "system2 = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "vertical-judge", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results2, details2 = run_solve_ivp(system2, slope_func, \n", - " events=event_func)\n", - "details2.message" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "greenhouse-madagascar", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.635183673114202" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = results2.index[-1]\n", - "t_sidewalk" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "sudden-details", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results2)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "opening-jurisdiction", - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_velocity(results2)" - ] - }, - { - "cell_type": "markdown", - "id": "smaller-millennium", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate terminal velocity and coefficient of drag.\n", - "\n", - "You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", - "\n", - "1. Create a `Params` object with new values of `mass` and `diameter`. We don't know `v_term`, so we'll start with the initial guess 18 m/s.\n", - "\n", - "2. Use `make_system` to create a `System` object. \n", - "\n", - "3. Call `run_solve_ivp` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", - "\n", - "4. Try a few different values of `v_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", - "\n", - "5. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", - "\n", - "6. Use your best estimate of `v_term` to compute `C_d`.\n", - "\n", - "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "compact-bunny", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "params_quarter = params.set(\n", - " mass = 0.0057, # kg\n", - " diameter = 0.024, # m\n", - " flight_time = 19.1, # s\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "shared-contrary", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "system3 = make_system(params_quarter)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "portable-account", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Run the simulation\n", - "\n", - "results3, details3 = run_solve_ivp(system3, slope_func, \n", - " events=event_func)\n", - "details3.message" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "arabic-shareware", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.63518367311417" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# And get the flight time\n", - "\n", - "t_sidewalk = results3.index[-1]\n", - "t_sidewalk" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "valued-literature", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# The flight time is a little long, \n", - "# so we could increase `v_term` and try again.\n", - "\n", - "# Or we could write an error function\n", - "\n", - "def error_func(guess, params):\n", - " \"\"\"Final height as a function of C_d.\n", - " \n", - " guess: guess at v_term\n", - " params: Params object\n", - " \n", - " returns: height in m\n", - " \"\"\"\n", - " print(guess)\n", - " params = params.set(v_term=guess)\n", - " system = make_system(params)\n", - " results, details = run_solve_ivp(system, slope_func, \n", - " events=event_func)\n", - " t_sidewalk = results.index[-1]\n", - " error = t_sidewalk - params.flight_time\n", - " return error" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "sufficient-retail", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18\n" - ] - }, - { - "data": { - "text/plain": [ - "1.5351836731141688" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# We can test the error function like this\n", - "v_guess1 = 18\n", - "error_func(v_guess1, params_quarter)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "comparable-lounge", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "22\n" - ] - }, - { - "data": { - "text/plain": [ - "-2.1591256962719996" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_guess2 = 22\n", - "error_func(v_guess2, params_quarter)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "ready-people", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18.0\n", - "22.0\n", - "19.662214524680426\n", - "19.475274945870567\n", - "19.459673874997012\n", - "19.459697194820343\n", - "19.459697175160358\n", - "19.45969717515935\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "# Now we can use `root_scalar` to find the value of \n", - "# `v_term` that yields the measured flight time.\n", - "\n", - "from scipy.optimize import root_scalar\n", - "\n", - "res = root_scalar(error_func, params_quarter,\n", - " bracket=[v_guess1, v_guess2])" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "miniature-remark", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "19.459697175160358" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_term = res.root\n", - "v_term" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "frozen-termination", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.5434569672577239" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Plugging in the estimated value, \n", - "# we can use `make_system` to compute `C_d`\n", - "\n", - "system4 = make_system(params_quarter.set(v_term=res.root))\n", - "system4.C_d" - ] - }, - { - "cell_type": "markdown", - "id": "colored-oxygen", - "metadata": {}, - "source": [ - "## Under the Hood\n", - "\n", - "`Params` is a `SimpleNamespace`, like `System`.\n", - "\n", - "`Params` and `System` are actually the same; I have given them different names to document the different roles they play." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap22.ipynb b/jupyter/chap22.ipynb deleted file mode 100644 index ea1b146d..00000000 --- a/jupyter/chap22.ipynb +++ /dev/null @@ -1,1978 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "collaborative-people", - "metadata": {}, - "source": [ - "# Chapter 22" - ] - }, - { - "cell_type": "markdown", - "id": "connected-covering", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "blank-mapping", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "widespread-detective", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename)\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " urlretrieve(url+filename, filename)" - ] - }, - { - "cell_type": "markdown", - "id": "alert-banks", - "metadata": {}, - "source": [ - "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", - "\n", - "In this chapter we model the flight of a baseball including the effect\n", - "of air resistance. In the next chapter we use this model to solve an\n", - "optimization problem." - ] - }, - { - "cell_type": "markdown", - "id": "functional-abortion", - "metadata": {}, - "source": [ - "## Baseball\n", - "\n", - "To model the flight of a baseball, we have to make some\n", - "decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", - "\n", - "Air resistance has a substantial effect on most projectiles in air, so\n", - "we will include a drag force.\n", - "\n", - "To model air resistance, we'll need the mass, frontal area, and drag\n", - "coefficient of a baseball. Mass and diameter are easy to find (see\n", - "). Drag coefficient is only a little\n", - "harder; according to *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*, the drag coefficient of a baseball is approximately 0.33 (with no units).\n", - "\n", - "However, this value *does* depend on velocity. At low velocities it\n", - "might be as high as 0.5, and at high velocities as low as 0.28.\n", - "Furthermore, the transition between these regimes typically happens\n", - "exactly in the range of velocities we are interested in, between 20 m/s and 40 m/s.\n", - "\n", - "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you will have a chance to implement a more detailed model and see what effect is has on the results.\n", - "\n", - "But first we need a new computational tool, the `Vector` object." - ] - }, - { - "cell_type": "markdown", - "id": "worthy-wheel", - "metadata": {}, - "source": [ - "## Vectors\n", - "\n", - "Now that we are working in two dimensions, it will be useful to\n", - "work with **vector quantities**, that is, quantities that represent both a magnitude and a direction. We will use vectors to represent positions, velocities, accelerations, and forces in two and three dimensions.\n", - "\n", - "ModSim provides a function called `Vector` the creates a Pandas `Series` that contains the **components** of the vector.\n", - "In a `Vector` that represents a position in space, the components are the $x$ and $y$ coordinates in 2-D, plus a $z$ coordinate if the `Vector` is in 3-D.\n", - "\n", - "You can create a `Vector` by specifying its components. The following\n", - "`Vector` represents a point 3 units to the right (or east) and 4 units up (or north) from an implicit origin:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "incorrect-cigarette", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 3\n", - "y 4\n", - "dtype: int64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import Vector\n", - "\n", - "A = Vector(3, 4)\n", - "A" - ] - }, - { - "cell_type": "markdown", - "id": "digital-sunrise", - "metadata": {}, - "source": [ - "You can access the components of a `Vector` by name using the dot\n", - "operator, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "bridal-jamaica", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(3, 4)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.x, A.y" - ] - }, - { - "cell_type": "markdown", - "id": "under-attribute", - "metadata": {}, - "source": [ - "You can also access them by index using brackets, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "incorrect-postage", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(3, 4)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A[0], A[1]" - ] - }, - { - "cell_type": "markdown", - "id": "solved-bathroom", - "metadata": {}, - "source": [ - "`Vector` objects support most mathematical operations, including\n", - "addition and subtraction:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "upset-morning", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 1\n", - "y 2\n", - "dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "B = Vector(1, 2)\n", - "B" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "every-affiliation", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 4\n", - "y 6\n", - "dtype: int64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A + B" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "ideal-sperm", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 2\n", - "y 2\n", - "dtype: int64" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A - B" - ] - }, - { - "cell_type": "markdown", - "id": "tender-translator", - "metadata": {}, - "source": [ - "For the definition and graphical interpretation of these operations, see ." - ] - }, - { - "cell_type": "markdown", - "id": "fewer-adolescent", - "metadata": {}, - "source": [ - "We can specify a `Vector` with coordinates `x` and `y`, as in the previous examples.\n", - "Equivalently, we can specify a `Vector` with a magnitude and angle.\n", - "\n", - "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is the distance from the origin; if it represents a velocity, magnitude is speed, that is, how fast the object is moving, regardless of direction.\n", - "\n", - "The **angle** of a `Vector` is its direction, expressed as an angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", - "\n", - "ModSim provides functions to compute the magnitude and angle of a `Vector`. For example, here are the magnitude and angle of `A`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "chinese-assembly", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(5.0, 0.9272952180016122)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import vector_mag, vector_angle\n", - "\n", - "mag = vector_mag(A)\n", - "theta = vector_angle(A)\n", - "mag, theta" - ] - }, - { - "cell_type": "markdown", - "id": "great-advice", - "metadata": {}, - "source": [ - "The magnitude is 5 because the length of `A` is the hypotenuse of a 3-4-5 triangle.\n", - "\n", - "The result from `vector_angle` is in radians, and most Python functions, like `sin` and `cos`, work with radians. \n", - "But many people think more naturally in degrees. \n", - "Fortunately, NumPy provides a function to convert radians to degrees:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "awful-defense", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "53.13010235415598" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import rad2deg\n", - "\n", - "angle = rad2deg(theta)\n", - "angle" - ] - }, - { - "cell_type": "markdown", - "id": "excited-catch", - "metadata": {}, - "source": [ - "And a function to convert degrees to radians:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "cellular-community", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9272952180016122" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from numpy import deg2rad\n", - "\n", - "theta = deg2rad(angle)\n", - "theta" - ] - }, - { - "cell_type": "markdown", - "id": "responsible-gentleman", - "metadata": {}, - "source": [ - "Following convention, I'll use `angle` for a value in degrees and `theta` for a value in radians.\n", - "\n", - "If you are given an angle and velocity, you can make a `Vector` using\n", - "`pol2cart`, which converts from polar to Cartesian coordinates. For example, here's a new `Vector` with the same angle and magnitude of `A`:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "monetary-firmware", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 3.0\n", - "y 4.0\n", - "dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import pol2cart\n", - "\n", - "x, y = pol2cart(theta, mag)\n", - "Vector(x, y)" - ] - }, - { - "cell_type": "markdown", - "id": "lucky-plastic", - "metadata": {}, - "source": [ - "Another way to represent the direction of `A` is a **unit vector**,\n", - "which is a vector with magnitude 1 that points in the same direction as\n", - "`A`. You can compute a unit vector by dividing a vector by its\n", - "magnitude:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "explicit-piano", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 0.6\n", - "y 0.8\n", - "dtype: float64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A / vector_mag(A)" - ] - }, - { - "cell_type": "markdown", - "id": "respected-oliver", - "metadata": {}, - "source": [ - "We can do the same thing using the `vector_hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "relative-republic", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 0.6\n", - "y 0.8\n", - "dtype: float64" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import vector_hat\n", - "\n", - "vector_hat(A)" - ] - }, - { - "cell_type": "markdown", - "id": "boring-river", - "metadata": {}, - "source": [ - "Now let's get back to the game." - ] - }, - { - "cell_type": "markdown", - "id": "similar-local", - "metadata": {}, - "source": [ - "## Simulating baseball flight\n", - "\n", - "Let's simulate the flight of a baseball that is batted from home plate\n", - "at an angle of 45° and initial speed 40 m/s. We'll use the center of home plate as the origin, a horizontal x-axis (parallel to the ground), and vertical y-axis (perpendicular to the ground). The initial height is about 1 m." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "positive-current", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "\n", - "params = Params(\n", - " x = 0, # m\n", - " y = 1, # m\n", - " angle = 45, # degree\n", - " velocity = 40, # m / s\n", - "\n", - " mass = 145e-3, # kg \n", - " diameter = 73e-3, # m \n", - " C_d = 0.33, # dimensionless\n", - "\n", - " rho = 1.2, # kg/m**3\n", - " g = 9.8, # m/s**2\n", - " t_end = 10, # s\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "bacterial-favorite", - "metadata": {}, - "source": [ - "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag is from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:" - ] - }, - { - "cell_type": "markdown", - "id": "unknown-extreme", - "metadata": {}, - "source": [ - "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", - "And we'll need the acceleration of gravity, `g`." - ] - }, - { - "cell_type": "markdown", - "id": "detected-return", - "metadata": {}, - "source": [ - "The following function uses these quantities to make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "bored-billy", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System, pol2cart\n", - "from numpy import pi, deg2rad\n", - "\n", - "def make_system(params):\n", - " \n", - " # convert angle to degrees\n", - " theta = deg2rad(params.angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, params.velocity)\n", - " \n", - " # make the initial state\n", - " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", - " \n", - " # compute the frontal area\n", - " area = pi * (params.diameter/2)**2\n", - "\n", - " return System(params,\n", - " init = init,\n", - " area = area,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "considered-conservation", - "metadata": {}, - "source": [ - "`make_system` uses `deg2rad` to convert `angle` to radians and\n", - "`pol2cart` to compute the $x$ and $y$ components of the initial\n", - "velocity.\n", - "\n", - "`init` is a `State` object with four state variables:\n", - "\n", - "* `x` and `y` are the components of position.\n", - "\n", - "* `vx` and `vy` are the components of velocity.\n", - "\n", - "The `System` object also contains `t_end`, which is 10 seconds, long enough for the ball to land on the ground.\n", - "Here's the `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "greatest-soviet", - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "id": "metropolitan-mainstream", - "metadata": {}, - "source": [ - "And here's the initial `State`:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "studied-congo", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 0.000000\n", - "y 1.000000\n", - "vx 28.284271\n", - "vy 28.284271\n", - "dtype: float64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "id": "occasional-given", - "metadata": {}, - "source": [ - "Next we need a function to compute drag force:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "legal-terminal", - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * vector_mag(V)**2 * C_d * area / 2\n", - " direction = -vector_hat(V)\n", - " f_drag = mag * direction\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "id": "informational-intersection", - "metadata": {}, - "source": [ - "This function takes `V` as a `Vector` and returns `f_drag` as a\n", - "`Vector`. \n", - "\n", - "* It uses `vector_mag` to compute the magnitude of `V`, \n", - "and the drag equation to compute the magnitude of the drag force, `mag`.\n", - "\n", - "* Then it uses `vector_hat` to compute `direction`, which is a unit vector in the opposite direction of `V`.\n", - "\n", - "* Finally, it computes the drag force vector by multiplying `mag` and `direction`.\n", - "\n", - "We can test it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "detailed-league", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x -0.937574\n", - "y -0.937574\n", - "dtype: float64" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import Vector\n", - "\n", - "vx, vy = system.init.vx, system.init.vy\n", - "V_test = Vector(vx, vy)\n", - "drag_force(V_test, system)" - ] - }, - { - "cell_type": "markdown", - "id": "absent-vector", - "metadata": {}, - "source": [ - "The result is a `Vector` that represents the drag force on the baseball, in Newtons, under the initial conditions.\n", - "\n", - "Now we're ready for a slope function:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "suitable-salem", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " x, y, vx, vy = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " V = Vector(vx, vy)\n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = g * Vector(0, -1)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V.x, V.y, A.x, A.y" - ] - }, - { - "cell_type": "markdown", - "id": "alpha-tiger", - "metadata": {}, - "source": [ - "As usual, the parameters of the slope function are a time, a `State` object, and a `System` object. \n", - "In this example, we don't use `t`, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", - "\n", - "`slope_func` unpacks the `State` object into variables `x`, `y`, `vx`, and `vy`.\n", - "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force and acceleration due to drag, `a_drag`.\n", - "\n", - "To represent acceleration due to gravity, it makes a `Vector` with magnitude `g` in the negative $y$ direction.\n", - "\n", - "The total acceleration of the baseball, `A`, is the sum of accelerations due to gravity and drag." - ] - }, - { - "cell_type": "markdown", - "id": "wired-judgment", - "metadata": {}, - "source": [ - "The return value is a sequence that contains:\n", - "\n", - "* The components of velocity, `V.x` and `V.y`.\n", - "\n", - "* The components of acceleration, `A.x` and `A.y`.\n", - "\n", - "Together, these components represent the slope of the state variables, because `V` is the derivative of position and `A` is the derivative of velocity." - ] - }, - { - "cell_type": "markdown", - "id": "crude-parcel", - "metadata": {}, - "source": [ - "As always, we can test the slope function by running it with the initial conditions:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "closing-simon", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(28.284271247461902, 28.2842712474619, -6.466030881564545, -16.266030881564546)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "regulated-railway", - "metadata": {}, - "source": [ - "Using vectors to represent forces and accelerations makes the code\n", - "concise, readable, and less error-prone. In particular, when we add\n", - "`a_grav` and `a_drag`, the directions are likely to be correct, because they are encoded in the `Vector` objects.\n", - "\n", - "We're almost ready to run the simulation. The last thing we need is an event function that stops when the ball hits the ground." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "brief-level", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(t, state, system):\n", - " x, y, vx, vy = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "id": "martial-strengthening", - "metadata": {}, - "source": [ - "The event function takes the same parameters as the slope function, and returns the $y$ coordinate of position. When the $y$ coordinate passes through 0, the simulation stops.\n", - "\n", - "As we did with `slope_func`, we can test `event_func` with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "pointed-bathroom", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "unlikely-dressing", - "metadata": {}, - "source": [ - "Now we're ready to run the simulation:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "special-background", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "id": "golden-november", - "metadata": {}, - "source": [ - "`details` contains information about the simulation, including a message that indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", - "\n", - "`results` is a `TimeFrame` with one column for each of the state variables:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "opening-lecture", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    xyvxvy
    4.60449693.4739718.296642e+0015.013486-19.334826
    4.70459494.9667566.325368e+0014.802553-20.038175
    4.80469296.4385154.284486e+0014.590855-20.726780
    4.90478997.8890872.175515e+0014.378566-21.400392
    5.00488799.318296-7.105427e-1514.165894-22.058763
    \n", - "
    " - ], - "text/plain": [ - " x y vx vy\n", - "4.604496 93.473971 8.296642e+00 15.013486 -19.334826\n", - "4.704594 94.966756 6.325368e+00 14.802553 -20.038175\n", - "4.804692 96.438515 4.284486e+00 14.590855 -20.726780\n", - "4.904789 97.889087 2.175515e+00 14.378566 -21.400392\n", - "5.004887 99.318296 -7.105427e-15 14.165894 -22.058763" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "dominant-weekly", - "metadata": {}, - "source": [ - "We can get the flight time like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "medieval-calvin", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5.004887034868351" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "flight_time = results.index[-1]\n", - "flight_time" - ] - }, - { - "cell_type": "markdown", - "id": "convenient-heading", - "metadata": {}, - "source": [ - "And the final state like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "gorgeous-survey", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 9.931830e+01\n", - "y -7.105427e-15\n", - "vx 1.416589e+01\n", - "vy -2.205876e+01\n", - "Name: 5.004887034868351, dtype: float64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_state = results.iloc[-1]\n", - "final_state" - ] - }, - { - "cell_type": "markdown", - "id": "invalid-japan", - "metadata": {}, - "source": [ - "The final value of `y` is close to 0, as it should be. The final value of `x` tells us how far the ball flew, in meters." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "agreed-sugar", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "99.31829628352206" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x_dist = final_state.x\n", - "x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "recreational-template", - "metadata": {}, - "source": [ - "We can also get the final velocity, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "instrumental-nurse", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x 14.165894\n", - "y -22.058763\n", - "dtype: float64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_V = Vector(final_state.vx, final_state.vy)\n", - "final_V" - ] - }, - { - "cell_type": "markdown", - "id": "economic-chrome", - "metadata": {}, - "source": [ - "The speed of the ball on impact is about 26 m/s, which is substantially slower than the initial velocity, 40 m/s." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "noted-triumph", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "26.215674453237636" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vector_mag(final_V)" - ] - }, - { - "cell_type": "markdown", - "id": "continuous-quick", - "metadata": {}, - "source": [ - "## Trajectories\n", - "\n", - "To visualize the results, we can plot the $x$ and $y$ components of position like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "spare-burst", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "results.x.plot(color='C4')\n", - "results.y.plot(color='C2', style='--')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')" - ] - }, - { - "cell_type": "markdown", - "id": "horizontal-bench", - "metadata": {}, - "source": [ - "As expected, the $x$ component increases as the ball moves away from home plate. The $y$ position climbs initially and then descends, falling to 0 m near 5.0 s.\n", - "\n", - "Another way to view the results is to plot the $x$ component on the\n", - "x-axis and the $y$ component on the y-axis, so the plotted line follows the trajectory of the ball through the plane:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "dated-browse", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from matplotlib.pyplot import plot\n", - "\n", - "def plot_trajectory(results):\n", - " plot(results.x, results.y, label='trajectory')\n", - "\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - "\n", - "plot_trajectory(results)" - ] - }, - { - "cell_type": "markdown", - "id": "certified-synthetic", - "metadata": {}, - "source": [ - "This way of visualizing the results is called a **trajectory plot** (see ).\n", - "\n", - "A trajectory plot can be easier to interpret than a time series plot,\n", - "because it shows what the motion of the projectile would look like (at\n", - "least from one point of view). Both plots can be useful, but don't get\n", - "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused." - ] - }, - { - "cell_type": "markdown", - "id": "precise-theology", - "metadata": {}, - "source": [ - "## Animation\n", - "\n", - "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", - "\n", - "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function." - ] - }, - { - "cell_type": "markdown", - "id": "elegant-century", - "metadata": {}, - "source": [ - "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", - "\n", - "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "sensitive-debate", - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.x\n", - "ys = results.y\n", - "\n", - "def draw_func(t, state):\n", - " plot(state.x, state.y, 'bo')\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)',\n", - " xlim=(xs.min(), xs.max()),\n", - " ylim=(ys.min(), ys.max()),\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "civic-federation", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import animate\n", - "\n", - "# animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "id": "fatal-effort", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "id": "experimental-cooper", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "negative-dictionary", - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system2 = make_system(params.set(C_d=0))" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "green-folder", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results2, details2 = run_solve_ivp(system2, slope_func, \n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "lucky-degree", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_trajectory(results)\n", - "plot_trajectory(results2)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "floating-membrane", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "164.25925502413202" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist2 = results2.iloc[-1].x\n", - "x_dist2" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "sorted-century", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "64.94095874060996" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist2 - x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "about-martial", - "metadata": {}, - "source": [ - "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "fifty-burning", - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system3 = make_system(params.set(rho=1.0))" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "adjustable-capital", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "105.78838005859807" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results3, details3 = run_solve_ivp(system3, slope_func, \n", - " events=event_func)\n", - "\n", - "x_dist3 = results3.iloc[-1].x\n", - "x_dist3" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "golden-exhibition", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.470083775076006" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist3 - x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "christian-scotland", - "metadata": {}, - "source": [ - "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", - "\n", - "\n", - "\n", - "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "id": "guided-alarm", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'baseball_drag.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "id": "listed-austria", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Velocity in mphDrag coefficient
    Velocity in meters per second
    0.0261460.0584860.49965
    8.87150919.8450000.49878
    17.64735139.4760000.49704
    22.43291450.1810000.48225
    26.88230360.1340000.45004
    \n", - "
    " - ], - "text/plain": [ - " Velocity in mph Drag coefficient\n", - "Velocity in meters per second \n", - "0.026146 0.058486 0.49965\n", - "8.871509 19.845000 0.49878\n", - "17.647351 39.476000 0.49704\n", - "22.432914 50.181000 0.48225\n", - "26.882303 60.134000 0.45004" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pandas import read_csv\n", - "from modsim import Quantity, units\n", - "\n", - "baseball_drag = read_csv(filename)\n", - "mph = Quantity(baseball_drag['Velocity in mph'], units.mph)\n", - "mps = mph.to(units.meter / units.second)\n", - "baseball_drag.index = mps.magnitude\n", - "baseball_drag.index.name = 'Velocity in meters per second'\n", - "baseball_drag.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "id": "american-reverse", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import interpolate, linspace\n", - "\n", - "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n", - "vs = linspace(0, 60)\n", - "cds = drag_interp(vs)\n", - "plot(vs, cds)\n", - "decorate(xlabel='Velocity (m/s)', ylabel='C_d')" - ] - }, - { - "cell_type": "markdown", - "id": "legislative-jamaica", - "metadata": {}, - "source": [ - "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "id": "dominant-passing", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def drag_force2(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " v: velocity\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, area = system.rho, system.area\n", - " \n", - " C_d = drag_interp(vector_mag(V))\n", - " mag = -rho * vector_mag(V)**2 * C_d * area / 2\n", - " direction = vector_hat(V)\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "double-carol", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func2(t, state, system):\n", - " x, y, vx, vy = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " V = Vector(vx, vy)\n", - " a_drag = drag_force2(V, system) / mass\n", - " a_grav = g * Vector(0, -1)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V.x, V.y, A.x, A.y" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "antique-gathering", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "system4 = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "undefined-moral", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "x -1.054771\n", - "y -1.054771\n", - "dtype: float64" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "V = Vector(30, 30)\n", - "f_drag = drag_force(V, system4)\n", - "f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "atomic-socket", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(28.284271247461902, 28.2842712474619, -6.466030881564545, -16.266030881564546)" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(0, system4.init, system4)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "abandoned-amount", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results4, details4 = run_solve_ivp(system4, slope_func2, \n", - " events=event_func)\n", - "details4.message" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "adjusted-coating", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    xyvxvy
    4.52585485.4431827.746401e+0012.556069-18.457129
    4.62424386.6676395.898175e+0012.324797-19.075086
    4.72263187.8696953.989943e+0012.094833-19.677696
    4.82101989.0493632.023337e+0011.866567-20.265039
    4.91940790.2066471.065814e-1411.640440-20.837214
    \n", - "
    " - ], - "text/plain": [ - " x y vx vy\n", - "4.525854 85.443182 7.746401e+00 12.556069 -18.457129\n", - "4.624243 86.667639 5.898175e+00 12.324797 -19.075086\n", - "4.722631 87.869695 3.989943e+00 12.094833 -19.677696\n", - "4.821019 89.049363 2.023337e+00 11.866567 -20.265039\n", - "4.919407 90.206647 1.065814e-14 11.640440 -20.837214" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results4.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "excellent-dressing", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "90.20664656623306" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist4 = results4.iloc[-1].x\n", - "x_dist4" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "equal-component", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-9.111649717288998" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist4 - x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "italian-coordinate", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "`Vector` " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap23.ipynb b/jupyter/chap23.ipynb deleted file mode 100644 index e48d1c72..00000000 --- a/jupyter/chap23.ipynb +++ /dev/null @@ -1,877 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "foreign-pepper", - "metadata": {}, - "source": [ - "# Chapter 23" - ] - }, - { - "cell_type": "markdown", - "id": "competitive-backing", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "charming-location", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "seeing-contractor", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "quantitative-montana", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "\n", - "params = Params(\n", - " x = 0, # m\n", - " y = 1, # m\n", - " angle = 45, # degree\n", - " velocity = 40, # m / s\n", - "\n", - " mass = 145e-3, # kg \n", - " diameter = 73e-3, # m \n", - " C_d = 0.33, # dimensionless\n", - "\n", - " rho = 1.2, # kg/m**3\n", - " g = 9.8, # m/s**2\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "preliminary-industry", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System, pol2cart\n", - "from numpy import pi, deg2rad\n", - "\n", - "def make_system(params):\n", - " \n", - " # convert angle to degrees\n", - " theta = deg2rad(params.angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, params.velocity)\n", - " \n", - " # make the initial state\n", - " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", - " \n", - " # compute the frontal area\n", - " area = pi * (params.diameter/2)**2\n", - "\n", - " return System(init = init,\n", - " mass = params.mass,\n", - " area = area,\n", - " C_d = params.C_d,\n", - " rho = params.rho,\n", - " g = params.g,\n", - " t_end=10)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "absolute-percentage", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import vector_mag, vector_hat\n", - "\n", - "def drag_force(V, system):\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * vector_mag(V)**2 * C_d * area / 2\n", - " direction = -vector_hat(V)\n", - " f_drag = mag * direction\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "common-batman", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Vector\n", - "\n", - "def slope_func(t, state, system):\n", - " x, y, vx, vy = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " V = Vector(vx, vy)\n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V.x, V.y, A.x, A.y" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "italic-amino", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(t, state, system):\n", - " x, y, vx, vy = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "id": "angry-pledge", - "metadata": {}, - "source": [ - "In the previous chapter we developed a model of the flight of a\n", - "baseball, including gravity and a simple version of drag, but neglecting spin, Magnus force, and the dependence of the coefficient of drag on velocity.\n", - "\n", - "In this chapter we apply that model to an optimization problem." - ] - }, - { - "cell_type": "markdown", - "id": "decent-birth", - "metadata": {}, - "source": [ - "## The Manny Ramirez problem\n", - "\n", - "Manny Ramirez is a former member of the Boston Red Sox (an American\n", - "baseball team) who was notorious for his relaxed attitude and taste for practical jokes. Our objective in this chapter is to solve the following Manny-inspired problem:\n", - "\n", - "> What is the minimum effort required to hit a home run in Fenway Park?\n", - "\n", - "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its\n", - "most famous features is the \"Green Monster\", which is a wall in left\n", - "field that is unusually close to home plate, only 310 feet away. To\n", - "compensate for the short distance, the wall is unusually high, at 37\n", - "feet (see )." - ] - }, - { - "cell_type": "markdown", - "id": "exposed-diving", - "metadata": {}, - "source": [ - "We want to find the minimum velocity at which a ball can leave home\n", - "plate and still go over the Green Monster. We'll proceed in the\n", - "following steps:\n", - "\n", - "1. For a given velocity, we'll find the optimal **launch angle**, that is, the angle the ball should leave home plate to maximize its height when it reaches the wall.\n", - "\n", - "2. Then we'll find the minimal velocity that clears the wall, given\n", - " that it has the optimal launch angle." - ] - }, - { - "cell_type": "markdown", - "id": "received-diamond", - "metadata": {}, - "source": [ - "## Finding the range\n", - "\n", - "Suppose we want to find the launch angle that maximizes **range**, that is, the distance the ball travels in the air before landing. We'll use a function in the ModSim library, `maximize`, which takes a function and finds its maximum.\n", - "\n", - "The function we pass to `maximize` should take launch angle in degrees, simulate the flight of a ball launched at that angle, and return the distance the ball travels along the $x$ axis." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "forty-knitting", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "def range_func(angle, params):\n", - " params = params.set(angle=angle)\n", - " system = make_system(params)\n", - " results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - " x_dist = results.iloc[-1].x\n", - " print(angle, x_dist)\n", - " return x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "exact-cigarette", - "metadata": {}, - "source": [ - "`range_func` makes a new `System` object with the given value of\n", - "`angle`. Then it calls `run_solve_ivp` and\n", - "returns the final value of `x` from the results.\n", - "\n", - "We can call `range_func` directly like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "senior-counter", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "45 99.31829628352206\n" - ] - }, - { - "data": { - "text/plain": [ - "99.31829628352206" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "range_func(45, params)" - ] - }, - { - "cell_type": "markdown", - "id": "paperback-passing", - "metadata": {}, - "source": [ - "And we can sweep a sequence of angles like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "biological-evans", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20.0 78.09741067882733\n", - "23.0 84.11542610650983\n", - "26.0 89.1319241236397\n", - "29.0 93.17466724082831\n", - "32.0 96.27134737391347\n", - "35.0 98.44725560274013\n", - "38.0 99.72474586365286\n", - "41.0 100.12347299697637\n", - "44.0 99.66100302635327\n", - "47.0 98.35354763684836\n", - "50.0 96.21673516565127\n", - "53.0 93.26623796736264\n", - "56.0 89.51751617672979\n", - "59.0 84.98724481958084\n", - "62.0 79.69434524339994\n", - "65.0 73.66129770133254\n", - "68.0 66.91470886279747\n", - "71.0 59.48269492939761\n", - "74.0 51.40287109940439\n", - "77.0 42.72047925533449\n", - "80.0 33.48437980813933\n" - ] - } - ], - "source": [ - "from modsim import linspace, SweepSeries\n", - "\n", - "angles = linspace(20, 80, 21)\n", - "sweep = SweepSeries()\n", - "\n", - "for angle in angles:\n", - " x_dist = range_func(angle, params)\n", - " sweep[angle] = x_dist" - ] - }, - { - "cell_type": "markdown", - "id": "premium-contribution", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "experienced-providence", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "sweep.plot()\n", - "\n", - "decorate(xlabel='Launch angle (degree)',\n", - " ylabel='Range (meter)')" - ] - }, - { - "cell_type": "markdown", - "id": "conscious-blade", - "metadata": {}, - "source": [ - "It looks like the optimal angle is near 40°.\n", - "\n", - "We can find the optimal angle more precisely and more efficiently using `maximize_scalar`, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "vocal-nerve", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 17.468795355645703\n", - "34.37694101250946 98.06996498016372\n", - "55.62305898749054 90.03182421721925\n", - "21.246117974981075 80.72039493627989\n", - "41.173855871043976 100.1200188931698\n", - "40.980120907837964 100.12368377099199\n", - "40.88213731907024 100.12417004431842\n", - "40.879254201241096 100.12417043309691\n", - "40.87958814091176 100.12417042882092\n", - "40.878920261570435 100.12417042669497\n" - ] - }, - { - "data": { - "text/plain": [ - "'Solution found.'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import maximize_scalar\n", - "\n", - "res = maximize_scalar(range_func, [0, 90], params)\n", - "res.message" - ] - }, - { - "cell_type": "markdown", - "id": "violent-explanation", - "metadata": {}, - "source": [ - "The first parameter is the function we want to maximize. The second is\n", - "the range of values we want to search; in this case, it's the range of\n", - "angles from 0° to 90°. \n", - "\n", - "The return value from `maximize` is an object that contains the\n", - "results, including `x`, which is the angle that yielded the highest\n", - "range, and `fun`, which is the value of `range_func` when it's evaluated at `x`, that is, range when the baseball is launched at the optimal angle." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "figured-uniform", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(40.879254201241096, 100.12417043309691)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.x, res.fun" - ] - }, - { - "cell_type": "markdown", - "id": "shaped-southeast", - "metadata": {}, - "source": [ - "For these parameters, the optimal angle is about 41°, which yields a\n", - "range of 100 m.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "temporal-extension", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "\n", - "\n", - "If you enjoy this exercise, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at\n", - "." - ] - }, - { - "cell_type": "markdown", - "id": "processed-constitution", - "metadata": {}, - "source": [ - "## Exercise" - ] - }, - { - "cell_type": "markdown", - "id": "handmade-rhythm", - "metadata": {}, - "source": [ - "**Exercise:** Let's finish off the Manny Ramirez problem:\n", - "\n", - "> What is the minimum effort required to hit a home run in Fenway Park?\n", - "\n", - "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", - "\n", - "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", - "\n", - "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", - "\n", - "As a first step, write an `event_func` that stops the simulation when the ball reaches the wall at 310 feet (94.5 m).\n", - "Test your function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "studied-association", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def event_func(t, state, system):\n", - " x, y, vx, vy = state\n", - " return x - 94.5" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "developmental-alabama", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-94.5" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(params)\n", - "event_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "novel-appointment", - "metadata": {}, - "source": [ - "Next, write a function called `height_func` that takes a launch angle, simulates the flight of a baseball, and returns the height of the baseball when it reaches the wall.\n", - "Test your function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "ignored-decrease", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def height_func(angle, params):\n", - " params = params.set(angle=angle)\n", - " system = make_system(params)\n", - "\n", - " results, details = run_solve_ivp(system, slope_func, \n", - " events=event_func)\n", - " height = results.iloc[-1].y\n", - " return height" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "western-communist", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.647999317446708" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "height_func(40, params)" - ] - }, - { - "cell_type": "markdown", - "id": "located-lawsuit", - "metadata": {}, - "source": [ - "Now use `maximize_scalar` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "duplicate-madison", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Solution found.'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bounds = [0, 90]\n", - "res = maximize_scalar(height_func, bounds, params)\n", - "res.message" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "legislative-prospect", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(43.10025059565446, 7.202365708497986)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res.x, res.fun" - ] - }, - { - "cell_type": "markdown", - "id": "interpreted-telephone", - "metadata": {}, - "source": [ - "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 37 feet (11.3 m), given that it's launched at the optimal angle. And that's a job for `root_scalar`.\n", - "\n", - "Write an error function that takes a velocity and a `System` object as parameters. It should use `maximize_scalar` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11.3 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "egyptian-shadow", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func(velocity, params):\n", - " print(velocity)\n", - " params = params.set(velocity=velocity)\n", - " bounds = [0, 90]\n", - " res = maximize_scalar(height_func, bounds, params)\n", - " return res.fun - 11.3" - ] - }, - { - "cell_type": "markdown", - "id": "documentary-guidance", - "metadata": {}, - "source": [ - "Test your error function before you call `root_scalar`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "sustainable-supply", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "40\n" - ] - }, - { - "data": { - "text/plain": [ - "-4.097634291502015" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func(40, params)" - ] - }, - { - "cell_type": "markdown", - "id": "reserved-shelter", - "metadata": {}, - "source": [ - "Then use `root_scalar` to find the answer to the problem, the minimum velocity that gets the ball out of the park." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "certified-webster", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "30.0\n", - "50.0\n", - "42.96216812977292\n", - "41.04044041129342\n", - "41.04880372505707\n", - "41.048542232137436\n", - "41.04854219528224\n", - "41.048542195283254\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "from scipy.optimize import root_scalar\n", - "\n", - "bracket = [30, 50]\n", - "res = root_scalar(error_func, params, bracket=bracket)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "silver-bernard", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 8\n", - " iterations: 7\n", - " root: 41.04854219528224" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "absent-encoding", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "41.04854219528224" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "min_velocity = res.root\n", - "min_velocity" - ] - }, - { - "cell_type": "markdown", - "id": "approved-fiction", - "metadata": {}, - "source": [ - "And just to check, run `error_func` with the value you found." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "thick-jungle", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "41.04854219528224\n" - ] - }, - { - "data": { - "text/plain": [ - "-3.907985046680551e-14" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func(min_velocity, params)" - ] - }, - { - "cell_type": "markdown", - "id": "simple-steps", - "metadata": {}, - "source": [ - "## Under the Hood\n", - "\n", - "`maximize_scalar` uses a golden section search, which you can read about at )." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap24.ipynb b/jupyter/chap24.ipynb deleted file mode 100644 index b9fe4d9c..00000000 --- a/jupyter/chap24.ipynb +++ /dev/null @@ -1,1219 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "august-parks", - "metadata": {}, - "source": [ - "# Chapter 24" - ] - }, - { - "cell_type": "markdown", - "id": "suspended-puppy", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "cutting-ultimate", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "composed-carol", - "metadata": {}, - "source": [ - "In this chapter we model systems that involve rotating objects. " - ] - }, - { - "cell_type": "markdown", - "id": "documentary-network", - "metadata": {}, - "source": [ - "## Rotation\n", - "\n", - "Rotation is complicated: in three dimensions, objects can rotate around three axes; objects are often easier to spin around some\n", - "axes than others; and they may be stable when spinning around some axes but not others.\n", - "\n", - "If the configuration of an object changes over time, it might become\n", - "easier or harder to spin, which explains the surprising dynamics of\n", - "gymnasts, divers, ice skaters, etc.\n", - "\n", - "And when you apply a twisting force to a rotating object, the effect is often contrary to intuition. For an example, see this video on\n", - "gyroscopic precession .\n", - "\n", - "In this chapter, we will not take on the physics of rotation in all its glory. Rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. In that case, we can treat some vector quantities as if they were scalars (in the same way that we sometimes treat velocity as a scalar with an implicit direction).\n", - "\n", - "This approach makes it possible to simulate and analyze many interesting systems, but you will also encounter systems that would be better approached with the more general toolkit." - ] - }, - { - "cell_type": "markdown", - "id": "political-acrylic", - "metadata": {}, - "source": [ - "The fundamental ideas in this chapter and the next are **angular\n", - "velocity**, **angular acceleration**, **torque**, and **moment of\n", - "inertia**. If you are not already familiar with these concepts, I will\n", - "define them as we go along, and I will point to additional reading.\n", - "\n", - "As a case study, you can use these tools to simulate the behavior of a yo-yo (see ). But we'll work our way up to it gradually, starting with toilet paper." - ] - }, - { - "cell_type": "markdown", - "id": "integral-welsh", - "metadata": {}, - "source": [ - "## The physics of toilet paper\n", - "\n", - "As a simple example of a system with rotation, we'll simulate the\n", - "manufacture of a roll of toilet paper, as shown in this video . Starting with a cardboard tube at the center, we will roll up 47 m of paper, the typical length of a roll of toilet paper in the U.S. (see ).\n", - "\n", - "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](figs/paper_roll.pdf){height=\"2.5in\"}\n", - "\n", - "This figure shows a diagram of the system: $r$ represents\n", - "the radius of the roll at a point in time. Initially, $r$ is the radius of the cardboard core, $R_{min}$. When the roll is complete, $r$ is $R_{max}$.\n", - "\n", - "I'll use $\\theta$ to represent the total rotation of the roll in\n", - "radians. In the diagram, $d\\theta$ represents a small increase in\n", - "$\\theta$, which corresponds to a distance along the circumference of the roll of $r~d\\theta$." - ] - }, - { - "cell_type": "markdown", - "id": "political-prerequisite", - "metadata": {}, - "source": [ - "Finally, I'll use $y$ to represent the total length of paper that's been rolled. Initially, $\\theta=0$ and $y=0$. For each small increase in $\\theta$, there is a corresponding increase in $y$: \n", - "\n", - "$$dy = r~d\\theta$$\n", - "\n", - "If we divide both sides by a small increase in time, $dt$, we get a\n", - "differential equation for $y$ as a function of time.\n", - "\n", - "$$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$$ \n", - "\n", - "As we roll up the paper, $r$ increases, too. Assuming that $r$ increases by a fixed amount per revolution, we can write \n", - "\n", - "$$dr = k~d\\theta$$ \n", - "\n", - "Where $k$ is an unknown constant we'll have to figure out. Again, we can divide both sides by $dt$ to get a differential equation in time:\n", - "\n", - "$$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$$ \n", - "\n", - "Finally, let's assume that $\\theta$ increases at a constant rate of $\\omega = 300$ rad/s (about 2900 revolutions per minute): \n", - "\n", - "$$\\frac{d\\theta}{dt} = \\omega$$ \n", - "\n", - "This rate of change is called an **angular velocity**. Now we have a system of three differential equations we can use to simulate the system." - ] - }, - { - "cell_type": "markdown", - "id": "prostate-smell", - "metadata": {}, - "source": [ - "## Implementation\n", - "\n", - "At this point we have a pretty standard process for writing simulations like this.\n", - "\n", - "First we'll create a `Params` object with the parameters of the system:" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "id": "artificial-cotton", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import units\n", - "\n", - "m = units.meter\n", - "rad = units.radian\n", - "s = units.second" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "honey-translator", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "\n", - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " L = 47 * m,\n", - " theta_0 = 0 * rad,\n", - " y_0 = 0 * m,\n", - " omega = 300 * rad / s,\n", - " t_end = 130 * s\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "caring-unemployment", - "metadata": {}, - "source": [ - "`Rmin` and `Rmax` are the initial and final values for the radius, `r`.\n", - "`L` is the total length of the paper. `t_end` is the length of the\n", - "simulation in time, and `dt` is the time step for the ODE solver.\n", - "\n", - "We use the `Params` object to make a `System` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "id": "fresh-domestic", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(params):\n", - " init = State(theta = params.theta_0,\n", - " y = params.y_0,\n", - " r = params.Rmin\n", - " )\n", - " \n", - " k = estimate_k(params)\n", - "\n", - " return System(params,\n", - " init=init, \n", - " k=k,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "strong-harrison", - "metadata": {}, - "source": [ - "The initial state contains three variables, `theta`, `y`, and `r`.\n", - "\n", - "`estimate_k` computes the parameter, `k`, that relates `theta` and `r`.\n", - "Here's how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "id": "common-sender", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import pi\n", - "\n", - "def estimate_k(params):\n", - " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", - " \n", - " Ravg = (Rmax + Rmin) / 2\n", - " Cavg = 2 * pi * Ravg\n", - " revs = L / Cavg\n", - " rads = 2 * pi * revs\n", - " k = (Rmax - Rmin) / rads\n", - " return k" - ] - }, - { - "cell_type": "markdown", - "id": "seasonal-cherry", - "metadata": {}, - "source": [ - "`Ravg` is the average radius, half way between `Rmin` and `Rmax`, so\n", - "`Cavg` is the circumference of the roll when `r` is `Ravg`.\n", - "\n", - "`revs` is the total number of revolutions it would take to roll up\n", - "length `L` if `r` were constant at `Ravg`. And `rads` is just `revs`\n", - "converted to radians.\n", - "\n", - "Finally, `k` is the change in `r` for each radian of revolution. For\n", - "these parameters, `k` is about `2.8e-5` m/rad." - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "id": "fitting-might", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "theta 0 radian\n", - "y 0 meter\n", - "r 0.02 meter\n", - "dtype: object" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)\n", - "system.init" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "id": "backed-vehicle", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.7925531914893616×10-5 meter" - ], - "text/latex": [ - "$2.7925531914893616\\times 10^{-5}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "2.7925531914893616e-05 " - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.k" - ] - }, - { - "cell_type": "markdown", - "id": "beginning-artwork", - "metadata": {}, - "source": [ - "Now we can use the differential equations from the previous section to\n", - "write a slope function:" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "id": "signed-eight", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = r * omega\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "markdown", - "id": "maritime-funds", - "metadata": {}, - "source": [ - "As usual, the slope function takes a `State` object, a time, and a\n", - "`System` object. The `State` object contains hypothetical values of\n", - "`theta`, `y`, and `r` at time `t`. The job of the slope function is to\n", - "compute the time derivatives of these values. The derivative of `theta` is angular velocity, which is often denoted `omega`." - ] - }, - { - "cell_type": "markdown", - "id": "trained-witness", - "metadata": {}, - "source": [ - "And as usual, we'll test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "id": "exterior-water", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(300.0 ,\n", - " 6.0 ,\n", - " 0.008377659574468085 )" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "russian-rochester", - "metadata": {}, - "source": [ - "We'd like to stop the simulation when the length of paper on the roll is `L`. We can do that with an event function that passes through 0 when `y` equals `L`:" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "id": "strong-custody", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(t, state, system):\n", - " theta, y, r = state\n", - " return y - system.L" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "id": "moved-present", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-47 meter" - ], - "text/latex": [ - "$-47\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-47 " - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "id": "affecting-pathology", - "metadata": {}, - "source": [ - "Now we can run the simulation like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "stable-lying", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results, details = run_solve_ivp(system, slope_func,\n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "id": "experienced-pathology", - "metadata": {}, - "source": [ - "Here are the last few time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "careful-bahrain", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetayr
    3.8435561153.06666741.6257070.0522
    3.9271111178.13333342.9429600.0529
    4.0106671203.20000044.2777600.0536
    4.0942221228.26666745.6301070.0543
    4.1777781253.33333347.0000000.0550
    \n", - "
    " - ], - "text/plain": [ - " theta y r\n", - "3.843556 1153.066667 41.625707 0.0522\n", - "3.927111 1178.133333 42.942960 0.0529\n", - "4.010667 1203.200000 44.277760 0.0536\n", - "4.094222 1228.266667 45.630107 0.0543\n", - "4.177778 1253.333333 47.000000 0.0550" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "underlying-variance", - "metadata": {}, - "source": [ - "At $\\omega = 300$ rad/s, the time it takes to complete one roll is about 4.2 seconds, which is consistent with what we see in the video." - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "individual-patrick", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.177777777777778" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.index[-1]" - ] - }, - { - "cell_type": "markdown", - "id": "informative-porter", - "metadata": {}, - "source": [ - "The final value of `y` is 47 meters, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "indian-skirt", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "47.0 47 meter\n" - ] - } - ], - "source": [ - "final_state = results.iloc[-1] \n", - "print(final_state.y, params.L)" - ] - }, - { - "cell_type": "markdown", - "id": "running-tutorial", - "metadata": {}, - "source": [ - "The final value of radius is `Rmax`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "higher-conflict", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.05500000000000002 0.055 meter\n" - ] - } - ], - "source": [ - "print(final_state.r, params.Rmax)" - ] - }, - { - "cell_type": "markdown", - "id": "tamil-referral", - "metadata": {}, - "source": [ - "And the total number of rotations is close to 200, which seems plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "employed-ordinary", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "199.47419534184226" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radians = final_state.theta\n", - "rotations = radians / 2 / pi\n", - "rotations" - ] - }, - { - "cell_type": "markdown", - "id": "otherwise-mississippi", - "metadata": {}, - "source": [ - "As an exercise, we'll see how fast the paper is moving. But first, let's take a closer look at the results." - ] - }, - { - "cell_type": "markdown", - "id": "lesser-consumer", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "Here's what `theta` looks like over time." - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "included-schema", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_theta(results):\n", - " results.theta.plot(color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "id": "regulation-runner", - "metadata": {}, - "source": [ - "`theta` grows linearly, as we should expect with constant angular velocity.\n", - "\n", - "Here's what `r` looks like over time." - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "persistent-siemens", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_r(results):\n", - " results.r.plot(color='C2', label='r')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Radius (m)')\n", - " \n", - "plot_r(results)" - ] - }, - { - "cell_type": "markdown", - "id": "dedicated-tuning", - "metadata": {}, - "source": [ - "`r` also increases linearly.\n", - "\n", - "But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope." - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "contrary-typing", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_y(results):\n", - " results.y.plot(color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "markdown", - "id": "furnished-executive", - "metadata": {}, - "source": [ - "Because this system is so simple, it is almost silly to simulate it; as we'll see in the next section, it is easy enough to solve the\n", - "differential equations analytically. \n", - "\n", - "However, it is often useful to start with simulation as a way of exploring and checking assumptions." - ] - }, - { - "cell_type": "markdown", - "id": "better-asbestos", - "metadata": {}, - "source": [ - "## Analysis\n", - "\n", - "The differential equations in Section xx are simple enough that we can just solve them. Since angular velocity is constant: \n", - "\n", - "$$\\frac{d\\theta}{dt} = \\omega$$ \n", - "\n", - "We can find $\\theta$ as a function of time by integrating both sides:\n", - "\n", - "$$\\theta(t) = \\omega t$$ \n", - "\n", - "Similarly, we can solve this equation\n", - "\n", - "$$\\frac{dr}{dt} = k \\omega$$ \n", - "\n", - "to find\n", - "\n", - "$$r(t) = k \\omega t + R_{min}$$ \n", - "\n", - "Then we can plug the solution for $r$ into the equation for $y$: \n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dy}{dt} & = r \\omega \\\\\n", - " & = \\left[ k \\omega t + R_{min} \\right] \\omega \\nonumber\\end{aligned}$$\n", - " \n", - "Integrating both sides yields:\n", - "\n", - "$$y(t) = \\left[ k \\omega t^2 / 2 + R_{min} t \\right] \\omega$$ \n", - "\n", - "So $y$ is a parabola, as you might have guessed." - ] - }, - { - "cell_type": "markdown", - "id": "meaningful-kazakhstan", - "metadata": {}, - "source": [ - "We can also use these equations to find the relationship between $y$ and $r$, independent of time, which we can use to compute $k$. Using a move we saw in Section xxx, I'll divide Equations 1 and\n", - "2, yielding\n", - "\n", - "$$\\frac{dr}{dy} = \\frac{k}{r}$$ \n", - "\n", - "Separating variables yields\n", - "\n", - "$$r~dr = k~dy$$ \n", - "\n", - "Integrating both sides yields \n", - "\n", - "$$r^2 / 2 = k y + C$$ \n", - "\n", - "When $y=0$, $r=R_{min}$, so \n", - "\n", - "$$C = \\frac{1}{2} R_{min}^2$$ \n", - "\n", - "Solving for $y$, we have \n", - "\n", - "$$y = \\frac{1}{2k} (r^2 - R_{min}^2) \\label{eqn3}$$\n", - "\n", - "When $y=L$, $r=R_{max}$; substituting in those values yields\n", - "\n", - "$$L = \\frac{1}{2k} (R_{max}^2 - R_{min}^2)$$ \n", - "\n", - "Solving for $k$ yields\n", - "\n", - "$$k = \\frac{1}{2L} (R_{max}^2 - R_{min}^2) \\label{eqn4}$$\n", - "\n", - "Plugging in the values of the parameters yields `2.8e-5` m/rad, the same as the \"estimate\" we computed in Section xxx. " - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "acknowledged-register", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.7925531914893616e-05 meter 2.7925531914893616e-05 meter\n" - ] - } - ], - "source": [ - "k = (params.Rmax**2 - params.Rmin**2) / (2 * params.L)\n", - "print(k, system.k)" - ] - }, - { - "cell_type": "markdown", - "id": "retired-skill", - "metadata": {}, - "source": [ - "In this case the estimate turns out to be exact." - ] - }, - { - "cell_type": "markdown", - "id": "foreign-needle", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "thick-luther", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. We can use `gradient` to estimate the derivative of `results.y`." - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "cardiac-hospital", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "from modsim import gradient\n", - "\n", - "dydt = gradient(results.y);" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "id": "welsh-charleston", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAArzUlEQVR4nO3dd3xVhf3/8deHGfbeEPYMSwiIOHGBiiJS666b2uXXtlYBB4KjatXaYbVURVuto0IEHIgKKIqiIEoCYYUZ9iaQnXx+fyT2hzSEC+Tec2/yfj4ePJKce3POOxflnXPO555j7o6IiEi0qRR0ABERkZKooEREJCqpoEREJCqpoEREJCqpoEREJCpVCTpAKBo3buzt2rULOoaIiITBokWLdrp7k8OXx0RBtWvXjoULFwYdQ0REwsDM1pe0XIf4REQkKqmgREQkKqmgREQkKsXEOaiS5OXlkZ6eTnZ2dtBRwiYuLo7WrVtTtWrVoKOIiERczBZUeno6derUoV27dphZ0HHKnLuza9cu0tPTad++fdBxREQiLmYP8WVnZ9OoUaNyWU4AZkajRo3K9R6iiEhpYraggHJbTt8r7z+fiEhpYrqgRESk/FJBlZEHHniAJ554IqTnzp07l+HDh//38/nz54czmohImdp9MJc3F27klpe/ZkdGTti2E7NDEuXF3LlzqV27NoMHDw46iojIEW3Zl8WspduYmbKVr9btpqDQaVW/Bht2Z9KkTvWwbFMFdQIefvhh/vnPf9KmTRuaNGlC37596devH9988w0Aq1at4sorr2TRokXMnDmTO+64g8aNG9OvXz8A1q1bx3PPPUflypV55ZVX+Mtf/sLpp58e5I8kIvJf2XkFvPLlet5ZsoVvN+4FoFPT2vzszI4M69mchJZ1w3quvFwU1IQZS1m2eX+ZrrNHy7qMvzjhiI8vWrSI119/ncWLF5Ofn0+/fv3o378/9erV49tvv6Vv375MnjyZG264gezsbG699VZmz55Np06duOKKK4Ciawzedttt1K5dmzvvvLNM84uInIj5aTsZNzWZdbsy6d26Hr8b2pWhCc3p1LR2xDLoHNRxmjdvHiNHjqRmzZrUrVuXSy65BIBbbrmFyZMnU1BQwBtvvMHVV1/N8uXLad++PZ07d8bMuPbaawNOLyJSsr2Zudz11ndc/Y8FOPDqLScz/Zen8YshnSJaTlBO9qBK29MJp5J2bUeNGsWECRM4++yz6d+/P40aNWLjxo0aGReRqObuvJu8hQemL2VPZh63ndmRO87tTFzVyoFlCtselJm9aGbbzSzlsOW/MrMVZrbUzB4P1/bD7YwzziApKYmsrCwyMjKYMWMGUHR5oqFDh/Kzn/2MG2+8EYBu3bqxdu1a0tLSAHjttdf+u546deqQkZER+R9ARKTY5r1Z3PLyQn7578W0rF+D6b88lTEXdAu0nCC8h/heAoYdusDMhgAjgN7ungCENpcdhfr168cVV1xB3759GTVq1A+GG6655hrMjPPPPx8oKq1JkyZx0UUXcdppp9G2bdv/Pvfiiy8mKSmJvn37Mm/evIj/HCJScRUUOi/PX8d5T33C/LRd3HtRd6b+bDAJLesFHQ0Ac/fwrdysHfCOu/cs/vpNYJK7f3Qs60lMTPTDb1iYmppK9+7dyypqmXriiSfYt28fDz744AmvK5p/ThGJXSu2ZjBm6hIWb9jLGV2a8PClPWnTsGYgWcxskbsnHr480uegugCnm9nDQDZwp7t/XdITzWw0MBogPj4+cglP0MiRI0lLS2P27NlBRxER+R/ZeQU8M2c1z32SRp24qjx9RV9G9G0ZlefJI11QVYAGwCBgAPCmmXXwEnbj3H0SMAmK9qAimvIEJCUlBR1BRKREC9bsYmxSMmt2HOSyk1px7/AeNKxVLehYRxTpgkoHphYX0ldmVgg0BnYcz8rcPSpbv6yE8/CriFQc+7LyePT95bz21QbaNKzBP28ayBldmgQd66giXVBvA2cDc82sC1AN2Hk8K4qLi2PXrl3l9pYb398PKi4uLugoIhLDZqZs4f5pS9l5IIdbT2/Pr8/rQs1qsfEOo7ClNLPXgLOAxmaWDowHXgReLB49zwWuL+nwXihat25Neno6O3Yc185XTPj+jroiIsdq675s7p+Wwqxl2+jRoi4vXD+AXq2jYzovVGErKHe/6ggPlcllFKpWrao7zYqIHKaw0Hn1qw08/v5ycgsKGXNBN24+rT1VK8fehYNiYz9PRESOavX2DMZMSWbh+j2c2qkRj4zsRdtGtYKOddxUUCIiMS4nv4Bn56bxtzlp1KhWmT/8qDc/6t865s/Pq6BERGLYovW7uXtKMqu3H+CSPi25/+IeNK4dnvszRZoKSkQkBmVk5/H4zBW8smA9LevVYPINAxjSrWnQscqUCkpEJMbMWrqV+6ctZVtGNjcMbsed53elVvXy9895+fuJRETKqe37sxk/fSnvp2ylW/M6PHddf/q2qR90rLBRQYmIRLnCQueNhRt55L1UcvIL+d3Qrow+o0NMjo4fCxWUiEgUS9txgLFTk/lq7W4GdWjIIyN70aFJZO9sGxQVlIhIFMrNL2TSp2n8efZq4qpU4rFRvfhxYpuYHx0/FiooEZEos3jDHsZOTWb51gwu6tWC8Zf0oGmdinddThWUiEiUOJCTzxMfrODlL9bRrE4c//hJIuf1aBZ0rMCooEREosDs5du4NymFLfuzuW5QW343tCt14qoGHStQKigRkQDtyMhh4jvLmPHdZjo3rc1btw2mf9sGQceKCiooEZEAuDv/WZTOw++mkpVbwK/P7cLPzupItSrle3T8WKigREQibN3Og4xLSmZ+2i4GtGvA7y/rRaemdYKOFXVUUCIiEZJXUMjz89by9EcrqVa5Eg9d2pOrB8ZTqVLFGR0/FiooEZEIWJK+l7unJJO6ZT9DE5ox4ZKeNK9X8UbHj4UKSkQkjDJz83ly1komf76WxrWr89y1/RjWs0XQsWKCCkpEJEw+WbmDe5KSSd+TxdUnx3P3sG7Uq1GxR8ePhQpKRKSM7TqQw4PvLOPtbzfTsUkt3vzpKQxs3zDoWDFHBSUiUkbcnaTFm3jwnWUcyMnn9nM684shHalepXLQ0WKSCkpEpAxs2JXJPW8nM2/VTvrF1+fRUb3p0kyj4ydCBSUicgLyCwp58fO1PPXhSiqbMXFEAtee3Faj42VABSUicpxSNu1jzNQlpGzaz7ndmzJxRE9a1q8RdKxyQwUlInKMsnILePqjlTz/2Voa1KzGM1f348JezSvUvZoiQQUlInIMPlu1k3FJyWzYnckViW0Yd2F36tXU6Hg4qKBEREKw52AuD72bypRv0mnfuBav3TqIUzo2CjpWuaaCEhEphbsz/bvNTJyxjH1Zefz8rI7cfk5n4qpqdDzcVFAiIkeQvieTe99OYe6KHfRpXY9/3XwyPVrWDTpWhaGCEhE5TEGh89L8dTw5awUA9w/vwfWD21FZo+MRpYISETlE6pb9jJmyhO/S93FW1yY8dGlPWjeoGXSsCkkFJSICZOcV8OePVzHp0zXUq1GVP13Zl0v6tNToeIBUUCJS4c1P28m4qcms25XJqH6tufei7jSoVS3oWBVepXCt2MxeNLPtZpZSwmN3mpmbWeNwbV9E5Gj2ZeZx91tLuPofCyh0eOXmk3nyx31UTlEinHtQLwF/Bf556EIzawOcB2wI47ZFRI7I3Xk3eQsPTF/GnsxcfnpmB+44pws1qml0PJqEraDc/VMza1fCQ38E7gKmhWvbIiJHsnlvFvdPS+Gj1O30bFWXl24cQM9W9YKOJSWI6DkoM7sE2OTu3x3txKOZjQZGA8THx0cgnYiUZwWFzitfrufxmcspcOeeC7tz46ntqFI5bGc65ARFrKDMrCZwD3B+KM9390nAJIDExEQPYzQRKedWbsvg7ilLWLxhL6d3bszDl/YivpFGx6NdJPegOgLtge/3nloD35jZQHffGsEcIlJB5OQX8Mzs1Tz7SRq1q1fhqR/3YeRJrTQ6HiMiVlDungw0/f5rM1sHJLr7zkhlEJGK4+t1uxkzZQlpOw4y8qRW3HtRdxrVrh50LDkGYSsoM3sNOAtobGbpwHh3fyFc2xMRAdifncej7y/n3ws20LpBDV6+aSBndmkSdCw5DuGc4rvqKI+3C9e2RaRimpmylfunpbDzQA63nNae35zfhZrVdD2CWKW/ORGJedv2Z3P/tBQ+WLqNHi3q8vz1ifRuXT/oWHKCVFAiErMKC51/f7WBx95fTm5BIXcP68Ytp7enqkbHy4WjFpSZJQKnAy2BLCAF+Mjdd4c5m4jIEa3efoCxU5fw9bo9DO7YiEdG9qJd41pBx5IydMSCMrMbgNuBtcAiYAUQB5wG3F18jb373F2XLBKRiMnNL+TZuWk8M2c1NapV5g8/6s2P+rfW6Hg5VNoeVC3gVHfPKulBM+sLdEbX1BORCFm0fjdjpiSzavsBLu7TkvuH96BJHY2Ol1dHLCh3f6a0b3T3b8s8jYhICTKy83h85gpeWbCeFnXjmHzDAIZ0a3r0b5SYFso5qMeBhyg6/zQT6APc4e6vhDmbiAgfLtvGfW+nsC0jm+tPacedQ7tSu7rmuyqCUP6Wz3f3u8xsJJAOXA7MAVRQIhI22zOyeWD6Ut5L3kq35nV49tp+nBTfIOhYEkGhFFTV4o8XAq+5+26djBSRcHF33vh6I4+8l0p2fiF3nt+F0Wd0pFoVjY5XNKEU1AwzW07RIb6fm1kTIDu8sUSkIlqz4wBjpyazYO1uTm7fkN9f1osOTWoHHUsCUtqYeQt33+LuY8zsMWC/uxeYWSYwInIRRaS8y80vZNKnafx59mqqV6nEo5f14seJbahUSUdrKrLS9qBeNLMGwFyKhiM+A3D3g8DB8EcTkYpg8YY9jJ2azPKtGVzYqzkPXJxA07pxQceSKFDamPkFZhZH0RXJRwJPmNkGispqpt6gKyIn4mBOPk/MWsFL89fRrE4c//hJIuf1aBZ0LIkipZ6DcvdsigsJwMzaAxcAfzWz5u4+MPwRRaS8mbN8O/e+ncLmfVlcN6gtvxvalTpxVY/+jVKhhPxmAjOrC+wDXi/+cyBcoUSkfNp5IIcJM5Yx47vNdG5am7duO4X+bRsGHUuiVChv1P0pMJGiKT4vXuzu3iGcwUSk/HB33lqUzsPvpZKZU8Cvz+3CbWd1oHqVykFHkygWyh7UnUCCbs0uIsdj/a6DjEtK5vPVu0hs24BHR/WiU9M6QceSGBBKQaUBmeEOIiLlS35BIc9/tpY/friSapUr8dClPbl6YLxGxyVkoRTUWGC+mS0Acr5f6O63hy2ViMS05PR93D1lCcu27Of8Hs2YOKInzetpdFyOTSgF9XdgNpAMFIY3jojEsszcfP744Upe+GwtjWpX57lr+zGsZ4ugY0mMCqWg8t39N2FPIiIx7dOVOxiXlEz6niyuGhjPmAu6Ua+GRsfl+IVSUHPMbDQwgx8e4tMt30WE3QdzefCdZSQt3kSHxrV4Y/QgTu7QKOhYUg6EUlBXF38ce8gyBzRmLlKBuTtJizfx4DvLyMjO51dnd+IXQzoRV1Wj41I2jlpQ7t4+EkFEJHZs3J3JuKRk5q3ayUnx9Xn0st50ba7RcSlbpV3N/DR3/6yUx+sC8e6eEpZkIhJ18gsKeWn+Op6ctZJKBhMuSeDaQW2prNFxCYPS9qBGFd/ufSawCNgBxAGdgCFAW+C3YU8oIlFh6eZ9jJmSTPKmfZzTrSkPXtqTlvVrBB1LyrHSrmb+6+LbbfyIotu8t6DockepwN9L27sSkfIjK7eApz9eyfPz1tKgZjX+evVJXNSrBbqztoTb0a5mvgf4R/EfEalgPl+9k3FJyazflckViW0Yd2F36tXU6LhERshXMxeRimNvZi4Pv5vKfxal065RTf5968kM7tg46FhSwaigROS/3J0ZS7YwccZS9mTm8fOzOnL7OZ01Oi6BUEGJCACb9mZxb1Iyc1bsoE/revzr5pPp3qJu0LGkAgvlflALgcnAv4vPSYlIOVJQ6Pzzi3X84YMVANw3vAc3DG6n0XEJXCh7UFcCNwJfH1JWs9zdS/smM3sRGA5sd/eexcv+AFwM5FJ0G48b3X3v8ccXkROxfOt+xkxJ5tuNezmraxMeurQnrRvUDDqWCACVjvYEd1/t7vcAXYB/Ay8CG8xsgpmVdq/ml4Bhhy37EOjp7r2Blfzw8kkiEiHZeQU88cEKhv/5MzbszuRPV/Zl8g0DVE4SVUI6B2VmvSnai7oQmAK8CpxG0W04+pb0Pe7+qZm1O2zZrEO+/JKi91iJSAR9uWYX46Yms2bnQUb1a829F3WnQa1qQccS+R+hnINaBOwFXgDGuPv3VzRfYGannsC2bwLeOIHvF5FjsC8rj0ffT+W1rzbSpmEN/nXzQE7v3CToWCJHFMoe1OXuvubQBWbW3t3Xuvtlx7NRM7sHyKdoT+xIzxkNjAaIj48/ns2ICEWj4++nbGX89KXsOpDDT8/owB3ndqFGNY2OS3QLpaDeAvqVsKz/8WzQzK6naHjinNIGLdx9EjAJIDExsdSBDBEp2ZZ9Wdw/bSkfLttGQsu6TL5hAD1b1Qs6lkhISruaeTcgAahnZofuKdWl6KKxx8zMhgF3A2e6e+bxrENEjq6w0Hl1wXoem7mC/MJCxl7QjZtPa0+VykedixKJGqXtQXWlaE+nPkWj4d/LAG492orN7DXgLKCxmaUD4yma2qsOfFh8ockv3f224wkuIiVbtS2DMVOTWbR+D6d1aswjI3sR30jTeRJ7Srua+TRgmpmd4u5fHOuK3f2qEha/cKzrEZHQ5OQX8MycNJ6du5pa1avw5OV9uKxfK111XGJWaYf47nL3x4Grzex/ysbdbw9rMhEJ2dfrdjNmyhLSdhzk0r4tuW94DxrVrh50LJETUtohvtTijwsjEUREjt3+7Dwee385ry7YQKv6NZh84wCGdG0adCyRMlHaIb4ZxR9fjlwcEQnVzJStjJ+ewo6MHG46tT2/Pb8Ltarr+s9SfoTyRt0PKXov1N7irxsAr7v70DBnE5ESbNufzfhpS5m5dCvdmtdh0nWJ9GlTP+hYImUulF+3mhx6QVd332NmOoYgEmGFhc7rX2/k9++nkptfyF3DunLr6R2oqtFxKadCKagCM4t39w0AZtYW0BtnRSJo9fYDjJuazFfrdnNKh0Y8clkv2jeuFXQskbAKpaDuAT4zs0+Kvz6D4ksQiUh45eYX8twnafx19mpqVKvM46N6c3lia42OS4Vw1IJy95lm1g8YVLzo1+6+M7yxRGTR+j2MnbqEldsOMLx3C8ZfnECTOhodl4oj1JGfwRTtOX3vnTBkERHgQE4+f5i5nH9+uZ7mdeN44fpEzuneLOhYIhEXyhTfo8AA/v+Vx//PzE51d91sUKSMfbRsG/dNS2Hr/myuP6Uddw7tSm2NjksFFcp/+RcCfd29EMDMXgYWo7vhipSZ7RnZTJi+jHeTt9ClWW2euWYw/eIbBB1LJFCh/mpWH9hd/Lmu1S9SRtydNxdu5OF3U8nOK+S353Xhp2d2pFoVjY6LhFJQvwcWm9kcwCg6F6W9J5ETtHbnQcZOXcKXa3YzsH1Dfn9ZLzo2qR10LJGoEcoU32tmNpei81AG3O3uW8MdTKS8yisoZNKna/jTx6uoXqUSj4zsxZUD2lCpkkbHRQ5V2tXMD7+Lbnrxx5Zm1tLdvwlfLJHy6duNexkzZQnLt2YwLKE5E0Yk0Kzucd3/U6TcK20P6slSHnPg7DLOIlJuHczJ54lZK3h5/jqa1KnO36/rz9CE5kHHEolqpV3NfEgkg4iUV3NWbOfepBQ27c3i2kHx3DWsG3XjqgYdSyTqhfI+qJrAb4B4dx9tZp2Bru6uN+uKlGLngRwmzljG9O8206lpbd667RQS2zUMOpZIzAhlim8ysIiiq0lA0bmo/6CrSYiUyN2Z8s0mHnp3GQdz8rnj3M787KyOVK9SOehoIjEllILq6O5XfH/bd3fPMl2pUqRE63cd5J6kFD5bvZP+bRvw6GW96NysTtCxRGJSKAWVa2Y1KL7Fhpl1BHLCmkokxuQXFPL8Z2t5+qOVVKlUiQcv7ck1A+M1Oi5yAkIpqAeAmUAbM3sVOBW4IYyZRGJKyqZ93D1lCUs37+e8Hs2YOCKBFvVqBB1LJOaF8kbdWWa2iKLbbRjwf7rdhghk5Rbwx49W8vy8NTSqXZ1nr+nHsJ7Nda8mkTISyhTfdOA1YLq7Hwx/JJHoN2/VDsYlJbNxdxZXDWzDmAu6U6+GRsdFylIoh/ieBK4AHjWzr4A3gHfcPTusyUSi0O6DuTz0zjKmLt5Eh8a1eH30IAZ1aBR0LJFyKZRDfJ8An5hZZYquHnEr8CJQN8zZRKKGuzPt281MfGcZ+7Py+NXZnfjFkE7EVdXouEi4hHS7jeIpvosp2pPqB7wczlAi0WTj7kzueTuFT1fuoG+b+jw6qhfdmuv3M5FwC+Uc1BvAyRRN8j0DzP3+5oUi5Vl+QSEvzV/Hk7NWUsnggYt7cN0p7ais0XGRiAj1ShJXu3tBuMOIRItlm/czZuoSlqTv4+xuTXnw0p60qq/RcZFICuUc1MxIBBGJBtl5Bfzp41VM+nQNDWpW5S9XncTw3i00Oi4SgFBv+S5S7s1fvZNxScms25XJjxNbM+7C7tSvWS3oWCIVVqkFVXzNvdbuvjFCeUQibm9mLo+8l8qbC9Np26gm/77lZAZ3ahx0LJEKr9SCcnc3s7eB/pGJIxI57s47S7YwYcZS9mTmcduZHbnj3M4aHReJEqEc4vvSzAa4+9fHsmIzexEYDmx3957FyxpS9EbfdsA64MfuvueYEouUgU17s7jv7RRmL99O79b1ePmmgSS0rBd0LBE5RKUQnjME+MLM0sxsiZklm9mSEL7vJWDYYcvGAB+7e2fg4+KvRSKmoNB56fO1nP/UJ3yRtot7L+pO0s9PVTmJRKFQ9qAuOJ4Vu/unZtbusMUjgLOKP38ZmAvcfTzrFzlWK7ZmcPeUJXy7cS9ndmnCQ5f2pE3DmkHHEpEjCGXMfD2AmTUF4k5we83cfUvxercUr7NEZjYaGA0QHx9/gpuViiw7r4C/zl7Nc5+kUbdGVf50ZV8u6dNSo+MiUS6UK0lcQtEFY1sC24G2QCqQEM5g7j4JmASQmJjo4dyWlF9frtnFuKnJrNl5kMv6teLei3rQsJZGx0ViQSiH+B6k6F5QH7n7SWY2BLjqOLe3zcxaFO89taCo8ETK3L6sPB59P5XXvtpIm4Y1+NfNAzm9c5OgY4nIMQiloPLcfZeZVTKzSu4+x8weO87tTQeuBx4t/jjtONcjUiJ3Z2bKVu6fvpRdB3IYfUYH7ji3MzWr6T3pIrEmlP9r95pZbWAe8KqZbQfyj/ZNZvYaRQMRjc0sHRhPUTG9aWY3AxuAy483uMjhtu7L5r5pKXy4bBsJLevy4vUD6NVa03kisSqUghoBZAF3ANcA9YCJR/smdz/SYcBzQg0nEorCQufVBet5bOYK8gsLGXtBN24+rT1VKofyLgoRiVahTPEdNLO2QGd3f9nMagJ6q71EhVXbMhgzNZlF6/dwWqfGPDyyJ20b1Qo6loiUgVCm+G6laNy7IdARaAU8h/aEJEA5+QX8bU4af5u7mlrVq/DE5X0Y1a+VRsdFypFQDvH9AhgILABw91WlvX9JJNwWrtvNmKnJrN5+gBF9W3Lf8B40rl096FgiUsZCKagcd8/9/jdTM6sC6H1JEnH7s/N4fOZyXvlyA63q12DyjQMY0lW/K4mUV6EU1CdmNg6oYWbnAT8HZoQ3lsgPzVq6lfumpbAjI4ebTm3Pb8/vQq3qGh0XKc9C+T98DHAzkAz8FHgPeD6coUS+t31/NuOnL+X9lK10a16HSdcl0qdN/aBjiUgEhDLFVwj8o/iPSEQUFjpvLNzII++lkptfyF3DunLr6R2oqtFxkQojlCm+U4EHKLoGXxXAKLqXYYfwRpOKKm3HAcZOTeartbs5pUMjHrmsF+0ba3RcpKIJ5RDfC8CvgUVAQXjjSEWWm1/I3z9J4y+zV1OjWmUeH9WbyxNba3RcpIIKpaD2ufv7YU8iFdo3G/YwdkoyK7ZlMLx3C8ZfnECTOhodF6nIQimoOWb2B2AqkPP9Qnf/JmyppMI4kJPPEx+s4OUv1tG8bhwvXJ/IOd2bBR1LRKJAKAV1cvHHxEOWOXB22ceRiuTj1G3c93YKW/Zn85NBbfndsG7U1ui4iBQLZYpvSCSCSMWxIyOHCTOW8s6SLXRpVpu3rh5M/7YNgo4lIlHmiAVlZte6+ytm9puSHnf3p8IXS8ojd+c/C9N5+L1UsnIL+O15XfjpmR2pVkWj4yLyv0rbg/p+rrdOCY/pUkdyTNbtPMi4pGTmp+1iYLuGPHJZLzo1rR10LBGJYkcsKHf/e/HHCYc/ZmZ3hDGTlCN5BYX8Y94a/vTRKqpVrsTDI3ty1YB4KlXS6LiIlO54z0j/Bni6DHNIOfTdxr2MmZpM6pb9DEtozoQRCTSrGxd0LBGJEcdbUPr1V47oYE4+T324ksmfr6VJner8/br+DE1oHnQsEYkxx1tQOgclJZq7Yjv3JKWwaW8W1w6K565h3agbVzXoWCISg0qb4sug5CIyoEbYEklM2nUghwffWcbb326mY5Na/Oe2UxjQrmHQsUQkhpU2JFHS9J7ID7g7U7/ZxEPvLuNATj7/d05nfj6kI9WrVA46mojEOL1tX47bhl2Z3PN2MvNW7aRffH0eHdWbLs30e42IlA0VlByz/IJCXvx8LU99uJIqlSrx4IgErjm5rUbHRaRMqaDkmKRs2seYqUtI2bSfc7s348FLE2hRT6ckRaTsqaAkJFm5BTz90Uqe/2wtDWtV42/X9OOCns11ryYRCRsVlBzVZ6t2Mi4pmQ27M7lyQBvGXtCdejU1Oi4i4aWCkiPaczCXh95NZco36XRoXIvXRw9iUIdGQccSkQpCBSX/w92Z/t1mJs5Yxr6sPH45pBO/PLsTcVU1Oi4ikaOCkh9I35PJvW+nMHfFDvq2qc+ro3rRrXndoGOJSAWkghIACgqdl+av48lZKwAYf3EPfnJKOyprdFxEAqKCEpZt3s/YqUv4Ln0fZ3dryoOX9qRVfY2Oi0iwVFAVWHZeAX/6eBX/+HQN9WtW5S9XncTw3i00Oi4iUSGQgjKzXwO3UHQx2mTgRnfPDiJLRTU/bSfjpiazblcml/dvzT0Xdad+zWpBxxIR+a+IF5SZtQJuB3q4e5aZvQlcCbwU6SwV0d7MXB55L5U3F6bTtlFNXr3lZE7t1DjoWCIi/yOoQ3xVgBpmlgfUBDYHlKPCcHfeTd7CA9OXsiczj9vO7Mgd53bW6LiIRK2IF5S7bzKzJ4ANQBYwy91nRTpHRbJ5bxb3vZ3Cx8u306tVPV6+aSAJLesFHUtEpFRBHOJrAIwA2gN7gf+Y2bXu/sphzxsNjAaIj4+PdMxyoaDQ+dcX6/jDBysodLj3ou7cMLgdVSpXCjqaiMhRBXGI71xgrbvvADCzqcBg4AcF5e6TgEkAiYmJusX8MVqxNYMxU5eweMNeTu/cmEdG9qJNw5pBxxIRCVkQBbUBGGRmNSk6xHcOsDCAHOVSdl4Bz8xZzbNz06gTV4WnftyHkSe10ui4iMScIM5BLTCzt4BvgHxgMcV7SnJiFqzZxdikZNbsOMhlJ7Xi3uE9aFhLo+MiEpsCmeJz9/HA+CC2XR7ty8rj0feX89pXG2jdoAb/vGkgZ3RpEnQsEZEToitJxDB3Z2bKVsZPX8rOAzncenp7fn1eF2pW01+riMQ+/UsWo7buy+a+aSl8uGwbPVrU5YXrB9CrtUbHRaT8UEHFmMJC59WvNvD4+8vJLShk7AXduPm09hodF5FyRwUVQ1Zty2Ds1GQWrt/DqZ0a8cjIXrRtVCvoWCIiYaGCigE5+QU8OzeNZ+asplb1KjxxeR9G9dPouIiUbyqoKLdo/W7GTElm1fYDXNKnJfdf3IPGtasHHUtEJOxUUFEqIzuPx2eu4JUF62lZrwaTbxjAkG5Ng44lIhIxKqgoNGvpVu6ftpRtGdncOLg9vz2/C7Wq669KRCoW/asXRbbvz2b89KW8n7KVbs3r8Nx1/enbpn7QsUREAqGCigKFhc4bCzfyyHup5OQX8ruhXRl9RgeqanRcRCowFVTA0nYcYOzUZL5au5tBHRryyMhedGhSO+hYIiKBU0EFJDe/kEmfpvHn2auJq1KJx0b14seJbTQ6LiJSTAUVgMUb9jBmSjIrtmVwUa8WjL+kB03rxAUdS0QkqqigIuhgTj5/+GAFL3+xjuZ143j+J4mc26NZ0LFERKKSCipCZi/fxr1JKWzZn81PBrXlzqFdqRNXNehYIiJRSwUVZjsycpj4zjJmfLeZzk1r89Ztg+nftkHQsUREop4KKkzcnf8sSufhd1PJyi3gN+d14bYzO1KtikbHRURCoYIKg3U7DzIuKZn5absY0K4Bv7+sN52aanRcRORYqKDKUF5BIc/PW8vTH62kWuVKPDyyJ1cNiKdSJY2Oi4gcKxVUGVmSvpe7pySTumU/QxOaMeGSnjSvp9FxEZHjpYI6QZm5+Tw1ayUvfr6WxrWr89y1/RnWs3nQsUREYp4K6gR8snIH9yQlk74ni6tPjufuYd2oV0Oj4yIiZUEFdRx2HcjhoXdTSVq8iY5NavHmT09hYPuGQccSESlXVFDHwN1JWryJB99ZxoGcfG4/uxO/OLsT1atUDjqaiEi5o4IK0cbdmYxLSmbeqp30i6/Po6N606VZnaBjiYiUWyqoo8gvKGTy5+t46sOVVDKYOCKBa09uq9FxEZEwU0GVImXTPsZOTSZ50z7O7d6UiSN60rJ+jaBjiYhUCCqoEmTlFvD0xyt5ft5aGtSsxjNX9+PCXs11ryYRkQhSQR3ms1U7GZeUzIbdmVw5oA1jL+hOvZoaHRcRiTQVVLE9B3N56N1UpnyTTvvGtXjt1kGc0rFR0LFERCqsCl9Q7s707zYzccYy9mXl8YshHfnV2Z2Jq6rRcRGRIFXYgtqyL4tZS7cx47vNLFy/hz5t6vPKZb3o3qJu0NFERIQKVlBrdhzgg6XbmLl0K99t3AtAxya1mHBJAtcOaktljY6LiESNQArKzOoDzwM9AQducvcvwrW9Fz5byxtfb2DltgMA9G5dj98N7crQhOa6T5OISJQKag/qT8BMd/+RmVUDaoZzY+t2HqRBzWqMv7gH5yc0p5XeyyQiEvUiXlBmVhc4A7gBwN1zgdxwbnPiiAS9h0lEJMZUCmCbHYAdwGQzW2xmz5tZrcOfZGajzWyhmS3csWPHCW1Q5SQiEnuCKKgqQD/gWXc/CTgIjDn8Se4+yd0T3T2xSZMmkc4oIiIBC6Kg0oF0d19Q/PVbFBWWiIjIf0W8oNx9K7DRzLoWLzoHWBbpHCIiEt2CmuL7FfBq8QTfGuDGgHKIiEiUCqSg3P1bIDGIbYuISGwI4hyUiIjIUamgREQkKqmgREQkKpm7B53hqMxsB7D+BFfTGNhZBnEqOr2OZUOvY9nQ61g2gn4d27r7/7zhNSYKqiyY2UJ312DGCdLrWDb0OpYNvY5lI1pfRx3iExGRqKSCEhGRqFSRCmpS0AHKCb2OZUOvY9nQ61g2ovJ1rDDnoEREJLZUpD0oERGJISooERGJShWioMxsmJmtMLPVZvY/956SozOzF81su5mlBJ0llplZGzObY2apZrbUzP4v6EyxxszizOwrM/uu+DWcEHSmWGZmlYtvHvtO0FkOV+4LyswqA88AFwA9gKvMrEewqWLSS8CwoEOUA/nAb929OzAI+IX+ezxmOcDZ7t4H6AsMM7NBwUaKaf8HpAYdoiTlvqCAgcBqd1/j7rnA68CIgDPFHHf/FNgddI5Y5+5b3P2b4s8zKPqHoVWwqWKLFzlQ/GXV4j+a9joOZtYauAh4PugsJakIBdUK2HjI1+noHwSJAmbWDjgJWHCUp8phig9LfQtsBz485A7dcmyeBu4CCgPOUaKKUFBWwjL9tiWBMrPawBTgDnffH3SeWOPuBe7eF2gNDDSzngFHijlmNhzY7u6Lgs5yJBWhoNKBNod83RrYHFAWEcysKkXl9Kq7Tw06Tyxz973AXHR+9HicClxiZusoOvVxtpm9EmykH6oIBfU10NnM2hffYv5KYHrAmaSCMjMDXgBS3f2poPPEIjNrYmb1iz+vAZwLLA80VAxy97Hu3trd21H07+Jsd7824Fg/UO4Lyt3zgV8CH1B0QvpNd18abKrYY2avAV8AXc0s3cxuDjpTjDoVuI6i31a/Lf5zYdChYkwLYI6ZLaHoF9AP3T3qRqTlxOlSRyIiEpXK/R6UiIjEJhWUiIhEJRWUiIhEJRWUiIhEJRWUiIhEJRWUyAkys0aHjIxvNbNNxZ8fMLO/hWmbd5jZT0p5fLiu8i2xTmPmImXIzB4ADrj7E2HcRhXgG6Bf8fv8SnqOFT/nVHfPDFcWkXDSHpRImJjZWd/fY8fMHjCzl81slpmtM7PLzOxxM0s2s5nFlz/CzPqb2SdmtsjMPjCzFiWs+mzgm+/LycxuN7NlZrbEzF6Hoit+U3QJoOER+WFFwkAFJRI5HSm6tcEI4BVgjrv3ArKAi4pL6i/Aj9y9P/Ai8HAJ6zkVOPQCn2OAk9y9N3DbIcsXAqeX+U8hEiFVgg4gUoG87+55ZpYMVAZmFi9PBtoBXYGewIdFR+ioDGwpYT0t+OEN5pYAr5rZ28DbhyzfDrQsu/gikaWCEomcHAB3LzSzPP//J4ALKfp/0YCl7n7KUdaTBcQd8vVFwBnAJcB9ZpZQfPgvrvi5IjFJh/hEoscKoImZnQJFt+Uws4QSnpcKdCp+TiWgjbvPoejGc/WB2sXP6wKkhDu0SLiooESihLvnAj8CHjOz74BvgcElPPV9ivaYoOgw4CvFhw0XA38svkcSwBDg3XBmFgknjZmLxCAzSwLucvdVR3i8GfBvdz8nsslEyo4KSiQGmVlXoJm7f3qExwcAee7+bUSDiZQhFZSIiEQlnYMSEZGopIISEZGopIISEZGopIISEZGopIISEZGo9P8AxxDSz7qUsjwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "dydt.plot(label='dydt')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Linear velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "id": "becoming-birthday", - "metadata": {}, - "source": [ - "With constant angular velocity, linear velocity is increasing, reaching its maximum at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "id": "informational-washer", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "16.394999999999992" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_linear_velocity = dydt.iloc[-1]\n", - "max_linear_velocity" - ] - }, - { - "cell_type": "markdown", - "id": "bizarre-variation", - "metadata": {}, - "source": [ - "Now suppose this peak velocity is the limiting factor; that is, we can't move the paper any faster than that.\n", - "\n", - "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", - "\n", - "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "id": "excellent-japanese", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(t, state, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = system.linear_velocity\n", - " omega = dydt / r\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "id": "steady-member", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(819.7499999999997 ,\n", - " 16.394999999999992,\n", - " 0.02289195478723403 )" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system.linear_velocity = max_linear_velocity\n", - "slope_func(0, system.init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "id": "applied-sacramento", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_solve_ivp(system, slope_func, \n", - " events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "id": "adult-chuck", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.8667276608722188" - ] - }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t_final = results.index[-1]\n", - "t_final" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "id": "conditional-cliff", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_theta(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "id": "arranged-queensland", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_r(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "id": "similar-variance", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_y(results)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "lovely-orange", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/jupyter/chap25.ipynb b/jupyter/chap25.ipynb deleted file mode 100644 index 93578711..00000000 --- a/jupyter/chap25.ipynb +++ /dev/null @@ -1,1421 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "unauthorized-winter", - "metadata": {}, - "source": [ - "# Chapter 25" - ] - }, - { - "cell_type": "markdown", - "id": "complete-innocent", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "practical-roman", - "metadata": { - "tags": [ - "remove-cell" - ] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - " \n", - "try:\n", - " import modsim\n", - "except ImportError:\n", - " !pip install modsimpy" - ] - }, - { - "cell_type": "markdown", - "id": "desirable-jason", - "metadata": {}, - "source": [ - "Intro" - ] - }, - { - "cell_type": "markdown", - "id": "earned-motorcycle", - "metadata": {}, - "source": [ - "In the previous chapter we modeled a scenario with constant angular\n", - "velocity. In this chapter we make it more complex; we'll model a teapot, on a turntable, revolving with constant angular acceleration and deceleration." - ] - }, - { - "cell_type": "markdown", - "id": "together-tobacco", - "metadata": {}, - "source": [ - "## Angular acceleration\n", - "\n", - "Just as linear acceleration is the derivative of velocity, **angular\n", - "acceleration** is the derivative of angular velocity. And just as linear acceleration is caused by force, angular acceleration is caused by the rotational version of force, **torque**. If you are not familiar with torque, you can read about it at .\n", - "\n", - "In general, torque is a vector quantity, defined as the **cross\n", - "product** of $\\vec{r}$ and $\\vec{F}$, where $\\vec{r}$ is the **lever\n", - "arm**, a vector from the point of rotation to the point where the force is applied, and $\\vec{F}$ is the vector that represents the magnitude and direction of the force." - ] - }, - { - "cell_type": "markdown", - "id": "promotional-trigger", - "metadata": {}, - "source": [ - "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute \n", - "\n", - "$$\\tau = r F \\sin \\theta$$ \n", - "\n", - "where $\\tau$ is torque, $r$ is the length of the lever arm, $F$ is the magnitude of force, and $\\theta$ is the angle between $\\vec{r}$ and $\\vec{F}$.\n", - "\n", - "Since torque is the product of a length and a force, it is expressed in newton meters (Nm)." - ] - }, - { - "cell_type": "markdown", - "id": "infrared-summit", - "metadata": {}, - "source": [ - "## Moment of inertia\n", - "\n", - "In the same way that linear acceleration is related to force by Newton's second law of motion, $F=ma$, angular acceleration is related to torque by another form of Newton's law: \n", - "\n", - "$$\\tau = I \\alpha$$ \n", - "\n", - "where $\\alpha$ is angular acceleration and $I$ is **moment of inertia**. Just as mass is what makes it hard to accelerate an object, moment of inertia is what makes it hard to spin an object.\n", - "(That might sound like a dumb way to describe mass, but might actually be the most fundamental definition.)\n", - "\n", - "In the most general case, a 3-D object rotating around an arbitrary\n", - "axis, moment of inertia is a tensor, which is a function that takes a\n", - "vector as a parameter and returns a vector as a result.\n", - "\n", - "Fortunately, in a system where all rotation and torque happens around a single axis, we don't have to deal with the most general case. We can treat moment of inertia as a scalar quantity.\n", - "\n", - "For a small object with mass $m$, rotating around a point at distance\n", - "$r$, the moment of inertia is $I = m r^2$. For more complex objects, we can compute $I$ by dividing the object into small masses, computing\n", - "moments of inertia for each mass, and adding them up.\n", - "\n", - "However, for most simple shapes, people have already done the\n", - "calculations; you can just look up the answers. For example, see\n", - "." - ] - }, - { - "cell_type": "markdown", - "id": "julian-klein", - "metadata": {}, - "source": [ - "## Teapots and turntables\n", - "\n", - "Tables in Chinese restaurants often have a rotating tray or turntable\n", - "that makes it easy for customers to share dishes. These turntables are\n", - "supported by low-friction bearings that allow them to turn easily and\n", - "glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", - "\n", - "Suppose I am sitting at a table with a pot of tea on the turntable\n", - "directly in front of me, and the person sitting directly opposite asks\n", - "me to pass the tea. I push on the edge of the turntable with 1 N of\n", - "force until it has turned 0.5 rad, then let go. The turntable glides\n", - "until it comes to a stop 1.5 rad from the starting position. How much\n", - "force should I apply for a second push so the teapot glides to a stop\n", - "directly opposite me?\n", - "\n", - "We'll answer this question in these steps:\n", - "\n", - "1. I'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", - "\n", - "2. As an exercise, you'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", - "\n", - "Our simulation will use the following parameters:\n", - "\n", - "1. The radius of the turntable is 0.5 m, and its weight is 7 kg.\n", - "\n", - "2. The teapot weights 0.3 kg, and it sits 0.4 m from the center of the turntable.\n", - "\n", - "![Diagram of a turntable with a\n", - "teapot.](figs/teapot.pdf){height=\"2.5in\"}\n", - "\n", - "This figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", - "\n", - "Here's a `Params` object with the parameters of the scenario:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "cathedral-lithuania", - "metadata": {}, - "outputs": [], - "source": [ - "import pint\n", - "\n", - "units = pint.UnitRegistry()\n", - "rad = units.radian\n", - "m = units.meter\n", - "s = units.second\n", - "kg = units.kilogram\n", - "N = units.newton" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "enclosed-happiness", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "from numpy import pi\n", - "\n", - "params = Params(radius_disk=0.5, # m\n", - " mass_disk=7, # kg\n", - " radius_pot=0.4, # m\n", - " mass_pot=0.3, # kg\n", - " force=1, # N\n", - " torque_friction=0.2, # N*m\n", - " theta_0=0, # radian\n", - " theta_push=0.5, # radian\n", - " theta_test=1.5, # radian\n", - " theta_target=pi, # radian\n", - " t_end=20 # s\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "robust-adrian", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import Params\n", - "from numpy import pi\n", - "\n", - "params = Params(radius_disk = 0.5*m,\n", - " mass_disk = 7*kg,\n", - " radius_pot = 0.4*m,\n", - " mass_pot = 0.3*kg,\n", - " force = 1*N,\n", - " torque_friction = 0.2*N*m,\n", - " theta_0 = 0*rad,\n", - " omega_0 = 0*rad/s,\n", - " theta_push = 0.5*rad,\n", - " theta_test = 1.5*rad,\n", - " theta_target = pi*rad,\n", - " t_end = 20*s)" - ] - }, - { - "cell_type": "markdown", - "id": "second-leather", - "metadata": {}, - "source": [ - "`make_system` creates the initial state, `init`, and computes the total\n", - "moment of inertia for the turntable and the teapot." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "acoustic-furniture", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import State, System\n", - "\n", - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", - " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", - " \n", - " init = State(theta=params.theta_0, omega=params.omega_0)\n", - " \n", - " I_disk = mass_disk * radius_disk**2 / 2\n", - " I_pot = mass_pot * radius_pot**2\n", - " \n", - " return System(params, \n", - " init=init, \n", - " I=I_disk+I_pot,\n", - " )" - ] - }, - { - "cell_type": "markdown", - "id": "convenient-control", - "metadata": {}, - "source": [ - "In the initial state, `theta` represents the angle of the table in rad;\n", - "`omega` represents the angular velocity in rad/s.\n", - "\n", - "`I_disk` is the moment of inertia of the turntable, which is based on\n", - "the moment of inertia for a horizontal disk revolving around a vertical axis through its center: \n", - "\n", - "$$I_{disk} = m r^2 / 2$$ \n", - "\n", - "`I_pot` is the moment\n", - "of inertia of the teapot, which I treat as a point mass with:\n", - "\n", - "$$I_{point} = m r^2$$ \n", - "\n", - "In SI units, moment of inertia is expressed in kg m$^2$.\n", - "\n", - "Now we can make a `System` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "objective-station", - "metadata": {}, - "outputs": [], - "source": [ - "system1 = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "id": "crucial-recognition", - "metadata": {}, - "source": [ - "Here's a slope that takes the current state, which contains angle and\n", - "angular velocity, and returns the derivatives, angular velocity and\n", - "angular acceleration:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "ranking-local", - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega = state\n", - " radius_disk, force = system.radius_disk, system.force\n", - " torque_friction, I = system.torque_friction, system.I\n", - " \n", - " torque = radius_disk * force - torque_friction\n", - " alpha = torque / I\n", - " \n", - " return omega, alpha " - ] - }, - { - "cell_type": "markdown", - "id": "exposed-court", - "metadata": {}, - "source": [ - "In this scenario, the force I apply to the turntable is always\n", - "perpendicular to the lever arm, so $\\sin \\theta = 1$ and the torque due\n", - "to force is $\\tau = r F$.\n", - "\n", - "`torque_friction` represents the torque due to friction. Because the\n", - "turntable is rotating in the direction of positive `theta`, friction\n", - "acts in the direction of negative `theta`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "saved-purple", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 ,\n", - " 0.32502708559046584 )" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(0, system1.init, system1)" - ] - }, - { - "cell_type": "markdown", - "id": "decent-microwave", - "metadata": {}, - "source": [ - "We are almost ready to run the simulation, but first there's a problem we have to address.\n", - "\n", - "When I stop pushing on the turntable, the angular acceleration changes\n", - "abruptly. We could implement the slope function with an `if` statement\n", - "that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more\n", - "accurate results if we simulate the system in two phases:\n", - "\n", - "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", - "\n", - "2. During the second phase, force is 0, and we run until `omega` is 0.\n", - "\n", - "Then we can combine the results of the two phases into a single\n", - "`TimeFrame`.\n", - "\n", - "Here's the event function I'll use for Phase 1; it stops the simulation when `theta` reaches `theta_end`, which is when I stop pushing:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "black-wichita", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func1(t, state, system):\n", - " \"\"\"Stops when theta reaches theta_push.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: difference from target\n", - " \"\"\"\n", - " theta, omega = state\n", - " return theta - system.theta_push" - ] - }, - { - "cell_type": "markdown", - "id": "separate-college", - "metadata": {}, - "source": [ - "As usual, we'll test the event function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "ranking-google", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-0.5 radian" - ], - "text/latex": [ - "$-0.5\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.5 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func1(0, system1.init, system1)" - ] - }, - { - "cell_type": "markdown", - "id": "reduced-sharp", - "metadata": {}, - "source": [ - "Now we can run the first phase of the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "meaning-philosophy", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from modsim import run_solve_ivp\n", - "\n", - "results1, details1 = run_solve_ivp(system1, slope_func,\n", - " events=event_func1)\n", - "details1.message" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "focused-invention", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    1.6137200.42320.524503
    1.6488000.44180.535905
    1.6838810.46080.547307
    1.7189620.48020.558709
    1.7540430.50000.570111
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "1.613720 0.4232 0.524503\n", - "1.648800 0.4418 0.535905\n", - "1.683881 0.4608 0.547307\n", - "1.718962 0.4802 0.558709\n", - "1.754043 0.5000 0.570111" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "willing-receipt", - "metadata": {}, - "source": [ - "\n", - "\n", - "Before we run the second phase, we have to extract the final time and\n", - "state of the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "russian-experience", - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = results1.index[-1]\n", - "init2 = results1.iloc[-1]" - ] - }, - { - "cell_type": "markdown", - "id": "aware-generator", - "metadata": {}, - "source": [ - "Now we can make a `System` object for Phase 2, with the initial state\n", - "from Phase 1, and with `force=0`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "chinese-cover", - "metadata": {}, - "outputs": [], - "source": [ - "system2 = System(system1, t_0=t_0, init=init2, force=0)" - ] - }, - { - "cell_type": "markdown", - "id": "actual-monaco", - "metadata": {}, - "source": [ - "For the second phase, we need an event function that stops when the\n", - "turntable stops; that is, when angular velocity is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "recovered-section", - "metadata": {}, - "outputs": [], - "source": [ - "def event_func2(t, state, system):\n", - " \"\"\"Stops when omega is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: omega\n", - " \"\"\"\n", - " theta, omega = state\n", - " return omega" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "corporate-taste", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.5701114676889649" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func2(system2.t_0, system2.init, system2)" - ] - }, - { - "cell_type": "markdown", - "id": "administrative-major", - "metadata": {}, - "source": [ - "Now we can run the second phase." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "destroyed-adrian", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2, details2 = run_solve_ivp(system2, slope_func,\n", - " events=event_func2)\n", - "details2.message" - ] - }, - { - "cell_type": "markdown", - "id": "hindu-requirement", - "metadata": {}, - "source": [ - "Pandas provides `combine_first`, which combines `results1` and\n", - "`results2`." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "frank-scene", - "metadata": {}, - "outputs": [], - "source": [ - "results = results1.combine_first(results2)" - ] - }, - { - "cell_type": "markdown", - "id": "metropolitan-roommate", - "metadata": {}, - "source": [ - "Now we can plot `theta` for both phases." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "distributed-humanitarian", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import decorate\n", - "\n", - "def plot_theta(results):\n", - " results.theta.plot(label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "id": "excess-confidence", - "metadata": {}, - "source": [ - "And `omega`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "proved-surfing", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAzDklEQVR4nO3dd3xUZfbH8c9JSAi9g9IEEVE6GEAFFQWU3kSk213b2nXxZ1/LYl3sLruLUgREmkEpoiKKlWABAVEQlIgCgkgnAc7vj2d0I4ZkAnPzTDnv12teZGbuzHyTXXNy733uOaKqGGOMMdEmyXcAY4wxJi9WoIwxxkQlK1DGGGOikhUoY4wxUckKlDHGmKhUzHeAwqpcubLWqVPHdwxjjDERsnjx4p9VtcrBj8dcgapTpw6ZmZm+YxhjjIkQEfkur8ftEJ8xxpioZAXKGGNMVLICZYwxJirF3DkoY4yJdjk5OWRlZbFnzx7fUaJKWloaNWvWJCUlJaztrUAZY0yEZWVlUaZMGerUqYOI+I4TFVSVzZs3k5WVRd26dcN6jR3iM8aYCNuzZw+VKlWy4pSLiFCpUqVC7VVagTLGmABYcfqzwv5MrEAZY4yJSlagjMnt8wnw5TTfKYwx2CIJY/7nh8Xw6tWgByBnN7QY7DuRMQnN9qCMAdifAxnXQamqcGx7yLjG9qRMzHv88cdp3LgxjRs3ZuTIkaxdu5YTTjiBSy+9lMaNGzN48GDefPNN2rZtS/369fnkk08A2LlzJxdffDGtWrWiRYsWvPrqqwDs2rWL/v3707RpU84//3zatGnze+u5K6+8kvT0dBo1asTdd98dkfy2B2UMwIfPwIal0H8cHNcRxp8L0y6DlJLQoLPvdCaWzR4OPy2N7Hse1QS6jMh3k8WLF/PCCy/w8ccfo6q0adOGM844g1WrVvHKK68watQoWrVqxYQJE1i4cCEZGRk8+OCDzJgxgwceeICzzjqL0aNHs3XrVlq3bk3Hjh157rnnqFChAkuWLOHLL7+kefPmv3/eAw88QMWKFdm/fz8dOnRgyZIlNG3a9Ii+TduDMmbLGnhnBJzQHRr2hNSSMOhl90tg8jD4doHvhMYU2sKFC+nTpw+lSpWidOnS9O3bl/fee4+6devSpEkTkpKSaNSoER06dEBEaNKkCWvXrgXgjTfeYMSIETRv3pz27duzZ88evv/+exYuXMiAAQMAaNy48R8K0OTJk2nZsiUtWrRg2bJlLF++/Ii/B9uDMolNFV67HpKKQddH/vd4WlkYMg1e7AYTB8KwGVCrta+UJpYVsKcTFFXN8/HixYv//nVSUtLv95OSkti3b9/vr506dSoNGjQI6z3XrFnDo48+yqJFi6hQoQIXXnhhRLpo2B6USWxLXoZv34GOd0PZ6n98rmRFGDoDyhwF4/vBj1/4SGjMYTn99NOZMWMGu3btYufOnUyfPp3TTjstrNeec845PPXUU78XpM8++wyAdu3aMXnyZACWL1/O0qXu0OW2bdsoVaoU5cqVY8OGDcyePTsi34MVKJO4dv4Mc26Dmq0h/ZK8tylTDYa96vaoxvWBjV8VbUZjDlPLli258MILad26NW3atOHSSy+lQoUKYb32zjvvJCcnh6ZNm9K4cWPuvPNOAK666io2bdpE06ZNeeihh2jatCnlypWjWbNmtGjRgkaNGnHxxRfTtm3biHwPcqhdtmiVnp6uNrDQRMS0v8CXU+GK96Dqiflvu3k1vNAFELh4NlQ8tkgimti0YsUKTjyxgP9PxaD9+/eTk5NDWloaq1evpkOHDnz99dekpqaG/R55/WxEZLGqph+8rZ2DMolp9duwZBKcfkvBxQmgUj23J/VCVxjTyxWpcjWDz2lMFNm1axdnnnkmOTk5qCrPPfdcoYpTYVmBMoknexe8dgNUrAen3Rz+66qeCEOnw5geMLYXXDQbSlcNLqcxUaZMmTIU5REsOwdlEs+CEfDLWujxBKSkFe611ZvD4Fdg23oY2xt2bQkgoIkHsXb6pCgU9mdiBcoklh+XwAdPQ4uhUDe8FU1/UvtkGDABNn8DL/WDPdsim9HEvLS0NDZv3mxFKpff5kGlpYX/R6Ed4jOJ48B+mHktlKwEZ993ZO9V70zoPxZeHgITB8DgKe4CX2OAmjVrkpWVxaZNm3xHiSq/TdQNlxUokzg+/hes/wz6jYYS4S23zVeDLtB3FEy5BCYPdXtVxYoX/DoT91JSUsKeGmsOzQ7xmcSw9Xt4+36ofw406hu59218LvR8Cla9CVMuhv37IvfexiQ4K1Am/qnCaze6r7s9CpGedNpyKHR+CL56DWZcCQcORPb9jUlQdojPxL8vp8KqeXDOP6B87WA+4+QrIHsHvH2fOxfVfWTkC6ExCcYKlIlvu7bAnOFQvQW0+Uuwn3X6zZC9ExY+Dqml4ez7rUgZcwSsQJn4Nu9OV6SGToek5OA/r8Ndrkh9+LQrUmfeFvxnGhOnrECZ+LXmXfhsPLS93s12Kgoi0HmEK1ILRrjDfW2vK5rPNibOWIEy8SlnN8y8HirUgTP+VrSfnZQEPZ+EnF0w7y5ILQWtLi3aDMbEAStQJj69+yhsWe3mOfm4gDYp2V0jlbMbXr8JUkpB84FFn8OYGGbLzE382bAc3h8JzQa6jg++JKfAeS9C3TPg1atg+av+shgTgwItUCLSWURWisgqERmex/PtReRXEfk8dLsryDwmAfzWziitHJz9gO80rhntgAlQs5XrOPH1G74TGRMzAitQIpIMPAN0ARoCA0WkYR6bvqeqzUO3vweVxySIzNGQtchd81Sqku80TvHSMGgyVGvoWiKtec93ImNiQpB7UK2BVar6rapmA5OAXgF+nkl0v/4Ab94Lx54JTfv7TvNHJcrDkOlu0cbEAZBlU6GNKUiQBaoGsC7X/azQYwc7RUS+EJHZItIorzcSkctFJFNEMq07sMmTKsy6BQ7sg+7/jM4LZEtVcos2SlWB8X3hp6W+ExkT1YIsUHn9hjh4OMqnwDGq2gx4CpiR1xup6ihVTVfV9CpVqkQ2pYkPK2bCytfdhbEVo7iLdNmj4YIMdxHv2N6w6WvfiYyJWkEWqCygVq77NYH1uTdQ1W2quiP09SwgRUQqB5jJxKPdW93e01FN4OSrfacpWPnaMCwDJMmNjv9lre9ExkSlIAvUIqC+iNQVkVRgAJCRewMROUrEHYsRkdahPJsDzGTi0Vv3ws6NbuxFcoxc2lf5OBg2w13MO6anGyFvjPmDwAqUqu4DrgHmAiuAyaq6TESuEJErQpv1A74UkS+AJ4EBajOSTWF896FbudfmStcQNpZUawRDp7legWN7wQ47v2pMbhJr9SA9PV0zM20FlAH27YXnT3PdGq760C3njkVr34fx50Kl4+DCmZGZ9mtMDBGRxaqafvDj1knCxK6FI+HnldD98dgtTgB12sKA8e57eek82LvddyJjooIVKBObNn0N7z0KjftB/U6+0xy54zpCvxfgh09h4kC3V2hMgrMCZWLPgQMw8zpIKQmd/+E7TeSc2B36PA9rF8LLQ2Fftu9ExnhlBcrEnk/HwPcfuIm1pav6ThNZTftDj5FuRP20S2H/Pt+JjPHGCpSJLdt/gnl3Q53ToMUQ32mCcdKFcM6Drvt5xl/dHqMxCShGLhoxJmT2rbBvD3QfGZ3tjCLllKvdVN75D7h5Vl0fje/v15g8WIEysWPlbLdXcdYd7kLXeHf6LZC9A95/wp1v6/R3K1ImoViBMrFhzzY3mbZqQzj1Ot9pioYIdLzX7Ul98CQULwNn3Oo7lTFFxgqUiQ1v3+/aAZ03Boql+k5TdESgyyO5DveVcof/jEkAVqBM9MvKhE9GQevLoFYr32mKXlIS9HzaFam5/+cO96Vf5DuVMYGzVXwmuu3PgYxroWx16HCX7zT+JBeDc/8Lx3WC126AJZN9JzImcFagTHT74EnYuMytYitexncav4qlwvnjoE47mH6Fm4FlTByzAmWi1+bV8M5D0LAXnNDVd5rokFICBk50ndunXAyr3vSdyJjAWIEy0UnVtTMqlgZdHvadJroULwNDpkDlBjBpiOuGbkwcsgJlotPnL8Ha96DTvVDmKN9pok+JCjB0OpSvBRPOhx8W+05kTMRZgTLRZ8cmmHs71D4FWl7gO030Kl0Fhr0KJSvCuL6wYZnvRMZElBUoE33m3uZGofd4wi2xNodWtjpckOGWno/tDT+v8p3ImIix//pNdPlmHix9BU67Cao08J0mNlSo4/ak9ACM7Qm/fOc7kTERYQXKRI/snfDajVD5eGh3g+80saXK8TBshuvdN7aX6/puTIwrsECJSLqI3CAij4jI30Wkv4hULIpwJsHMfxB+/d4d2itW3Hea2HNUExg8FXZsdEVq52bfiYw5IocsUCJyoYh8CtwGlABWAhuBdsA8ERkjIrWLJqaJe+s/g4+ehZMugmNO9Z0mdtVqBYNehl/WwrjesHur50DGHL78evGVAtqq6u68nhSR5kB94PsAcplEsn+fa2dUqip0vMd3mthX9zToPw4mDYIJ/d1y9NRSvlMZU2iH3INS1WcOVZxCz3+uqm8FE8sklI+fg5+WQNeHoUR532niw/Fnw7n/gaxFMHEg5OzxnciYQgvnHNTDIlJWRFJE5C0R+VlE4nTWtilyv6x1554adIUTe/pOE18a9YZez8KaBfDKBa7xrjExJJxVfGer6jagO5AFHA/cEmgqkxhUXWduSYKuj9i02CA0HwjdHoOv58C0y+DAft+JjAlbOPOgUkL/dgUmquoWsV8kJhKWvgKr33YD+crV9J0mfrW61C3hn3cXpJSCnk/ZBdAmJoRToGaKyFfAbuAqEakC2AFtc2R2boY5w6FGOrS6xHea+Nf2OlekFjzkFkx0ecj2WE3UO2SBEpGjVfVHVR0uIg8B21R1v4jsAnoVXUQTl964Hfb8Cj2fhKRk32kSQ/vbXJH68GlXpDre7TuRMfnKbw9qtIhUAN4B5gALAVR1J7Az+Ggmbq2eD19MhHY3QrVGvtMkDhE4+35XpBY+7orU6Tf7TmXMIeW3zLwL0B5XoPoAH4nINBG5PNwLdEWks4isFJFVIjI8n+1aich+EelXuPgm5mTvgteuh4rHwhm3+k6TeESg2+PQ9Hx4+z746HnfiYw5pHzPQanqHtze0xwAEakLdAGeFpGjVLX1oV4rIsnAM0An3Oq/RSKSoarL89juIWDukXwjJkYseMgtLb9gppsOa4peUpJbfp69E+b8ze1JtRzqO5Uxf1KopTyqukZVn1XVnriWR/lpDaxS1W9VNRuYRN7nrv4KTMW1UTLx7Kel8MFT0GII1D3dd5rEllwM+o2Geh0g46+wdIrvRMb8SX69+LaLyLZD3H4NFZ381ADW5bqfFXos92fUwB0+zPc4Q+iwYqaIZG7atKmAjzVR6cB+186oZEXodJ/vNAZcQ97zx7veh9P/Al/N8p3ImD/I7xxUGVUtC4wEhuOKS03gb8ADYbx3XmtY9aD7I4G/qWq+Vw+q6ihVTVfV9CpVqoTx0SbqfDIK1n8KnUe4ImWiQ2pJGDgJjmrquk2snu87kTG/C+cQ3zmhw3rbVXWbqj4HnBvG67KAWrnu1wTWH7RNOjBJRNYC/YBnRaR3GO9tYsnWdfDWfXBcJ2gczv91TJFKKwtDpkKl+q7B7Hcf+k5kDBBegdovIoNFJFlEkkRkMBBOv5RFQH0RqSsiqcAAICP3BqpaV1XrqGodYApwlarOKNy3YKKaKrx+E6DQ/XG7ODRalazoBh6Wre46oK//zHciY8IqUIOA/sCG0O280GP5UtV9wDW41XkrgMmqukxErhCRKw4/sokpy6bDN3PhrDugvI0Pi2qlq7rR8WnlYVwf2LC8wJcYEyRRPfi0UHRLT0/XzMxM3zFMOHb/Ak+3hnI14NK3rGNErNjyLYzuAihcNBsq1fOdyMQ5EVmsqukHPx7OuI00EblaRJ4VkdG/3YKJaeLKvLtg12Y3wt2KU+yoeKzbkzqwz42O37qu4NcYE4BwDvGNA44CzgEW4BY7bA8ylIkDaxfCp2PhlKvh6Ga+05jCqnqCm8S7ZxuM7QnbN/hOZBJQOAXqOFW9E9ipqmOAbkCTYGOZmJazB2ZeD+WPcQ1KTWw6uhkMfsUVp3G9YdcW34lMggmnQP02hnOriDQGygF1AktkYt97j8Hmb6D7P911NiZ21W4DAyfC5tUwvq/bozKmiIRToEaFuprfgVsmvhzXO8+YP9u4Ahb+0zUjPa6D7zQmEo49A/qPda2qJvR3DX+NKQL5FigRScLNgfpFVd9V1WNVtaqq/quI8plYcuAAzLwOipeBcx70ncZEUoPO0PffsO5jeHkw7NvrO5FJAPkWKFU9gLuWyZiCLR7tfoGd8yCUquw7jYm0xn3duPjVb8MrF8H+nIJfY8wRCOcQ3zwRuVlEaolIxd9ugSczsWXbeph3D9Q9A5oN8J3GBKXFEOjyCKx8HWZc6ZoAGxOQfOdBhVwc+vfqXI8pcGzk45iYNesWOJADPUZaO6N41+ZyyN4Bb93rZnr1eNL+NzeBKLBAqWrdoghiYtiKmfDVa9DxHneRp4l/p93oBh6+9yiklnaHda1ImQg7ZIESkXaqujCf58sCtVX1y0CSmdiw51e391StCZxipysTyll3uCL10bNuKu9Zd/hOZOJMfntQ54rIw7hx74uBTUAacBxwJnAMcFPgCU10e/Ne2LEBBrwEySm+05iiJAKd/wE5O+HdR9yeVLvrfacyceSQBUpVbwhd/9QP18H8aGA3rjP5v/LbuzIJ4vuPIPO/cPJVUOMk32mMDyLQfaS7NurNu92eVOvLfKcycSLfc1Cq+gvw79DNmP/Zt9dd81SuFpx5u+80xqekZOjzPOTsglk3uyLVvMCJPMYUKJxl5sb82ftPwKavoNvjULy07zTGt+QU6PcCHHsmvHo1LJvhO5GJA1agTOFt+tqdc2jUF44/23caEy1S0ty5yFptYOol8PUbvhOZGGcFyhTOb+2MUkpAF2vJaA6SWgoGvQzVGsPkobDmXd+JTAwLZ2BhZmhgYYWiCGSi3Gfj4PsP4Oz73YhwYw6WVs7Nkqp4LEwYAOs+8Z3IxKhw9qAGANWBRSIySUTOEbEr8hLS9g0w706ocxq0GOo7jYlmJSvC0BlQphqM7wc/LvGdyMSgAguUqq5S1duB44EJwGjgexG513ryJZg5f3PDCLuPtK4BpmBlqsGwDEgr6wYeblrpO5GJMWGdgxKRpsBjwCPAVNy1UduAt4OLZqLKyjmwbDqcfgtUPs53GhMryteCYa9CUjEY2wu2rPGdyMSQcM5BLQb+CSwCmqrqtar6sao+BnwbdEATBfZuh9dvgionQtvrfKcxsaZSPXe4b98eGNsTfv3BdyITI8LZgzpPVTuo6gRV3QsgInUBVLVvoOlMdHj7Adj2A/R8Eoql+k5jYlG1hm7hxO6trkjt2Og7kYkB4RSoKWE+ZuLRD4vh4+eh1aVQq7XvNCaWVW8Bgya7PahxfWDXFt+JTJTLr5v5CUAjoJyI5N5TKotrGmvi3f4cyLgWyhwNHe7yncbEg2NOgYETYML58FI/d36qeBnfqUyUym8PqgHQHSgP9Mh1awlYN8hE8OHTsOFL6PaoW4llTCTUOwvOexHWf+4KVfYu34lMlMqvm/mrwKsicoqqfliEmUw02Lwa3hkBJ/aAE7r5TmPizQndoO8omHqp6zgxYAIUK+47lYky+R3iu1VVHwYGicjAg59X1WsDTWb8UYXXboDkVOjyiO80Jl416ec6oGf8FaZcDOeNgeQCh3ybBJLfIb4VoX8zcQMLD74VSEQ6i8hKEVklIsPzeL6XiCwRkc9DLZXaFTK/CcIXE2HNAuh4N5Q92ncaE89aDoPOI+Cr1+DVq1yvR2NC8jvENzP075jDeWMRSQaeAToBWbhWSRmqujzXZm8BGaqqoYuBJwMnHM7nmQjZ+TPM/T/Xkfqki32nMYng5Cshewe8fT+klITu/7ROJQYI70LdeSJSPtf9CiIyN4z3bg2sUtVvVTUbmAT0yr2Bqu5QVQ3dLQUoxq85t8HeHdDjSUiyZvemiJx2M7S7ARa/AG/c4Q4zm4QXzgHfKqq69bc7qvqLiITTxroGsC7X/SygzcEbiUgf4B9AVSDPs/EicjlwOUDt2rXD+GhzWFa9CUsnwxl/g6q2I2uKkAh0uBuyd7rVo6ml4czbfKcynoXzJ/J+Efm9KojIMYS3p5PXPvqfXqeq01X1BKA3cF9eb6Sqo1Q1XVXTq1SpEsZHm0LL3ukWRlSqD+1u9J3GJCIR6PwQNB8MC0bA+0/6TmQ8C2cP6nZgoYgsCN0/ndDeTAGygFq57tcE1h9qY1V9V0TqiUhlVf05jPc3kfTOP2Dr93DhLDcZ1RgfkpKg51Nudd+8O90AxFaX+E5lPCmwQKnqHBFpCZwceuiGMAvIIqB+qG/fD7i5UoNybyAixwGrQ4skWgKpwObCfAMmAtZ/Dh8+Ay0vgDptfacxiS4pGfqMchfwvn6TK1LNBvhOZTwI96KDU3F7Tr95raAXqOo+EbkGmAskA6NVdZmIXBF6/nngXGCYiOQAu4Hzcy2aMEVh/z6YeS2UqgKd/u47jTFOsVToPwYm9IcZV0JKCWjYq+DXmbgiBdUDERkBtAJeCj00EMhUVS9nMNPT0zUzM9PHR8enD56GN253rWca9fGdxpg/2rvDNZZd/xkMnAj1O/lOZAIgIotVNf3gx8NZJNEV6KSqo1V1NNCZQ6y2MzHml7Uw/wE4vgs07O07jTF/Vrw0DH4Fqp4ILw+BtQt9JzJFKNwLXcrn+rpcADlMUVN1x/clyTWDtQsjTbQqUd7Nkip/jGsum2VHUBJFOAXqH8BnIvKiiIzBtTl6MNhYJnBLp7jrnjrcBeVq+k5jTP5KVYZhM9y/4/vCT0t9JzJFoMACpaoTcSv4poVup6jqpKCDmQDt2gJzhkONk9wgQmNiQdnqMCzDXcQ7tjf8/I3vRCZghyxQItLytxtwNO66pnVA9dBjJla9cSfs2RpqZ5TsO40x4atwjBtyKAJjerrzqCZu5bfM/LF8nlPgrAhnMUXh2wXw+XjX9+yoxr7TGFN4levD0BnwYjcY2wsummNd9+NUgcvMo40tMz8CObvhuVPdAomrPnTXlhgTq7IWw9ieULYGXDTLnZ8yMemwl5mLSEkRuUNERoXu1xeR7kGENAFb8DBs+RZ6jLTiZGJfzZNg0GTXomtcb9i91XciE2HhrOJ7AcjGdZMAdy7q/sASmWD89CV88KRrxHlse99pjImMOm1hwHjY+BW8dJ67sNfEjXAKVL3Q6PccAFXdTd6dyk20OrAfZl4HaeXhbPvbwsSZ4zrCeS/AD4th4gB3KNvEhXAKVLaIlCA0KkNE6gF7A01lImvRf+CHTDdau2RF32mMibwTe0Dv51ynickXwL5s34lMBIRToO4B5gC1ROQl3Jj2W4MMZSLo1yx46+9QrwM06ec7jTHBaXa+Gxf/zVyYdplrhGxiWjjjNt4QkcW4i3UFuM7mNcUIVXj9ZtAD0P1xa2dk4l/6RW745hu3Q0pJ6PWMmzFlYlKBBUpEMoCJQIaq7gw+komY5a/C17PdeacKdXynMaZonHqNK1LvPOhmSXV9xP44i1Hh/GnxGHAasFxEXhGRfiJiI1ej3e6tMPtWOLoZtLnSdxpjitYZt8Kpf4VF/4Y373ZHE0zMCecQ3wJggYgk47pHXAaMBsoGnM0ciTfvhp2b3HUiyeHOpTQmTohAp/vcntT7T0BqGTjjFt+pTCGF9ZsrtIqvB3A+0BIYE2Qoc4TWvg+LX3R/QVZv7juNMX6IQNfH3Oj4+fe7w32nXOU7lSmEcM5BvQy0wa3kewZ4R1UPBB3MHKZ9e901T+VrQ3svQ4+NiR5JSW6hRM4umHubK1InXeA7lQlTOHtQLwCDVHV/0GFMBLz3OGz+BoZMdf8xGpPokovBuf+FSYPcH2+ppeySixgRzjyoOVacYsTGr+C9x6BJf3d1vTHGKZYK54+DY9rCtMvhq9d9JzJhsAsE4sWBAzDzWiheGs6xgcfG/ElKCRg0Caq3gFcuhFVv+U5kCpBvgRKnVlGFMUdg8Quw7mNXnEpX8Z3GmOhUvAwMmQKVG8CkwfDdB74TmXzkW6DUDYuaUTRRzGHb9iO8eQ/UPQOaDfSdxpjoVqICDJ0O5WrCS/3hh099JzKHEM4hvo9EpFXgSczhm30L7M92fcjsinljCla6ihsdX7ICjO8LG5b7TmTyEE6BOhP4UERWi8gSEVkqIkuCDmbCtOI1WDHTXTlfqZ7vNMbEjnI1YFgGFEtzo+M3r/adyBwknALVBaiH6yLRA+ge+tf4tmcbzLoFqjWGU6/1ncaY2FOxrtuT0v0wpqebzmuiRjjLzL9T1e+A3biZUL/djG9v/R22/wg9noTkFN9pjIlNVRrA0BmQvd3tSW3/yXciE1JggRKRniLyDbAGWACsBWYHnMsUZN0nbhBhm79AzZN8pzEmth3dFAZPhe0bYGxv2LnZdyJDeIf47sPNgvpaVesCHYD3A01l8rcvGzKuhbI14Kw7fKcxJj7UauWuk/plDYzvA3t+9Z0o4YVToHJUdTOQJCJJqjofaB7Om4tIZxFZKSKrRGR4Hs8PDi28WCIiH4hIs8LFT1AfPAGbVkC3x9x1HcaYyKh7OvQf51b1vdTfdUM33oRToLaKSGngXeAlEXkCKHCWcmg8xzO4RRYNgYEi0vCgzdYAZ6hqU9ye2qjChE9IP6+CBY9Aw97QoLPvNMbEn+PPhnP/A1mfuP59OXt8J0pY4RSoXrgFEjfgOpqvJrxVfK2BVar6rapmA5NC7/U7Vf1AVX8J3f0IqBlu8ISk6ppdFkuDLg/7TmNM/GrU23VB//YdmHIR7M/xnSghhTOwMPc+bmHmQNUA1uW6n4Ub23Eol3CIxRcicjlwOUDt2rULESHOfDYevlsIPZ6AMtV8pzEmvjUf5A7xzboZpv8F+v4bkpJ9p0oohyxQIrKdvJeTC64LUkETdfNqaZDn8nQRORNXoNrl9byqjiJ0+C89PT0xl7jv2Ahv3OG6MbcY5juNMYmh9WVultS8uyClpLukI8l6bBeVQxYoVT3Ss+9ZQO5GszWB9QdvJCJNgf8AXUKLMUxe5gx3/6F0H2n/gRhTlNpe5/akFjzkZkl1HmEtxYpIOBN18zympqoFXXK9CKgvInWBH4ABwKA83nsaMFRVvw4rcSL6+g34ciq0/z+ocrzvNMYknva3wd4d8NEzkFoaOtzpO1FCCGeibu7JXmlAXWAl0Ci/F6nqPhG5BpgLJAOjVXWZiFwRev554C6gEvCsuL9I9qlqeqG/i3i2dwe8fiNUOQHa3eA7jTGJSQTOeQBydsJ7j0JqSTjtJt+p4l44iySa5L4vIi2Bv4Tz5qo6C5h10GPP5/r6UuDSsJImqvkPwK/r4OK5biqoMcYPEej2OGTvcm3GUku7Ti4mMOHsQf2Bqn5q4zeKyA+fwsfPQ/rFUPtk32mMMUnJ0Ps5dz549q1u4UTLob5Txa1wzkHdmOtuEtAS2BRYIuPsz3HtjEpVhY73+E5jjPlNcjHoNxomDoCZ17rDfY3P9Z0qLoWzHKxMrltx3DmpXvm+why5D5+BDUuh6yOQVs53GmNMbsWKw/kvQa2TYdrlsNL6ZwchnHNQ9xZFEJPLlm/hnRFwQndo2NN3GmNMXlJLwqCXYWxPmHwBDJ4Mx7b3nSquhHOILyOPh38FMoF/qao1qookVXjtRjffqesjvtMYY/KTVhaGTIMXu8HEgTB0up0vjqBwDvGtAXYA/w7dtgEbgOND900kLXkZvp0PHe6CstV9pzHGFKRkRTfwsMzR8NJ5sP5z34niRjgFqoWqDlLVmaHbEKC1ql6NWzBhImXnzzDnNqjVBtIv8Z3GGBOuMtXc6Pi0cjCuD2z8yneiuBBOgaqSu5tE6OvKobvZgaRKVHNvh73bXTNYa2dkTGwpX8sVqeQUNzp+y7e+E8W8cH4L3gQsFJH5IvIO8B5wi4iUonDdzU1+Vr8NSya5bhFVT/SdxhhzOCrVc0VqfzaM6QW/ZvlOFNNEteDm4CJSHDgB16H8K58LI9LT0zUzM9PXxwcjexc8e7L7y+uK9yElzXciY8yRWP85jOkBpavCRbPdv+aQRGRxXm3uwj2OdBKu915ToL+I2LyHSFowArZ+5w7tWXEyJvZVbw6Dp8C29TC2N+za4jtRTCqwQInIOOBR3KymVqGbNXSNlB+/gA+ehpbDoE6e47CMMbGodhsYOBE2r4Lx58Kebb4TxZxwevGlAw01nGOBpnAO7HftjEpWgk5/953GGBNpx7aH/mPg5SEw4XwYMtVd4GvCEs4hvi+Bo4IOkpA+/hf8+Dl0eQhKVPCdxhgThAZdoO8oWPcRvDwY9u31nShmhLMHVRlYLiKfAL//ZFXVevAcia3fw9v3Q/1zoFEf32mMMUFqfK5bDJVxDUy5GM570S2KMvkKp0DdE3SIhPNbOyOAbo/Z+GhjEkHLof8b0zHjSujzLze+wxxSOM1iF+S+LyJtcaPbF+T9ClOgL6fCqnlwzj/cxX3GmMTQ5i+QvcMNPEwp6Vbu2h+ohxTWwEIRaY4rSv1xvfmmBpgpvu3aAnOGQ/WWNo3TmER02k2QvRPee8xN5T3nAStSh3DIAiUixwMDgIHAZuBl3IW9ZxZRtvg0705XpIZOt917YxLVWXfC3h3w0TNQvDSc+X++E0Wl/PagvsK1NeqhqqsAROSGIkkVr9a8C5+Nh7bXw1FNfKcxxvgiAp1HQM5OWPAQpJaCttf5ThV18itQ5+L2oOaLyBxgEq7VkTkcObth5vVQoQ60H+47jTHGt6Qk6PGkW9037y53Tqr1Zb5TRZVDFihVnQ5MDzWF7Q3cAFQTkeeA6ar6RtFEjBPvPgpbVru5MSklfKcxxkSDpGR3jVTObph1szsn1Xyg71RRo8ALdVV1p6q+pKrdgZrA54DtAhTGhmXw/khoNgjq2Sk8Y0wuySnuuqhj28OrV8HyV30nihqFGjqkqltU9V+qelZQgeLOgf0w8zo3yOzs+32nMcZEo5Q0GDABaraGKZfA13aACgpZoMxhyBwNWYvcNU+lKvlOY4yJVqmlYPBkqNYQJg91i6oSnBWoIP36A7x5Lxx7JjTt7zuNMSbapZWDIdPdYqoJA2DdJ74TeWUFKiiq7qTngX3Q/Z92IZ4xJjylKrmpvKWrwvh+8OMS34m8sQIVlBUzYeUsOPM2qFjXdxpjTCwpcxRckAHFy8C4PrBppe9EXgRaoESks4isFJFVIvKnlX8icoKIfCgie0Xk5iCzFKndW2HWLXBUUzj5at9pjDGxqHxttyclSTC2F2xZ4ztRkQusQIlIMvAM0AVoCAwUkYYHbbYFuBY3sTd+vHUv7NwIPZ+E5LDaHRpjzJ9VPg6GzXDXSY3t5UbIJ5Ag96BaA6tU9VtVzcZ1ouiVewNV3aiqi4CcAHMUre8+dCv3Tr4KqrfwncYYE+uqNYKh01wPzzE9Yccm34mKTJAFqgawLtf9rNBj8WvfXnfNU7na1vzRGBM5NU5yS9B/zXLnpHb/4jtRkQiyQOW1bE0P641ELheRTBHJ3LQpiv96WPhP+HkldH/cXdNgjDGRcsypMGC8+x0zvh/s3e47UeCCLFBZQO5pfDWBwzqAqqqjVDVdVdOrVKkSkXARt2mlm+/SuB/U7+Q7jTEmHh3XEfq9AOs/g4kD3bmpOBZkgVoE1BeRuiKSiuuMnhHg5/lz4IDrVJ5S0rXQN8aYoJzY3Y2LX7sQXh4K+7J9JwpMYEvMVHWfiFwDzAWSgdGqukxErgg9/7yIHAVkAmWBAyJyPdBQVbcFlSsQn46B7z+Ank9D6SjdwzPGxI+m57lZUjOvg6mXuL2qOFwxHOh3pKqzgFkHPfZ8rq9/wh36i13bf4J5d0Od06DFEN9pjDGJ4qQL3SypubdBxjXQ61k3YyqOxF/JLWqzb4V9e6DHE9bOyBhTtE65CrJ3wvz73SmGbo/F1e8hK1BHYuVsN7vlrDuhUj3faYwxiej0myF7O7z/BKSWhE73xU2RsgJ1uPZsg9dvgqoN4dRrfacxxiQqEeh4rzvc98FTkFoG2v/Nd6qIsAJ1uN6+37UdOW8MFEv1ncYYk8hEoMvD7nDfOw+66zBPvcZ3qiNmBepwrFsEn4yC1pdBrVa+0xhjjFsg0fMpt7rvjdtdkUq/yHeqI2IFqrD258DMa6Fsdehwl+80xhjzP8nFoO9/3AW8r93gFk40O993qsMWX2sSi8L7T8DG5dD1UTerxRhjokmxVOg/Fuq0gxlXutl0McoKVGFsXg0LHoaGveCErr7TGGNM3lJKwMBJUKMlvHIRfPOm70SHxQpUuFTdVdvF0tzJSGOMiWbFS8PgV6DqCfDyYFj7vu9EhWYFKlyfvwRr34NO97pxzMYYE+1KVIAh09103gnnQ9Zi34kKxQpUOHZshLm3Q+1ToeUFvtMYY0z4Sldxo+NLVoTxfeGnL30nCpsVqHDMuQ1ydkGPkXHX68oYkwDKVocLMtyqvnG94edVvhOFxX7bFuSbefDlFDjtJqjSwHcaY4w5PBXquD0pVRjbE375zneiAlmBys/eHfDajVC5AbS7wXcaY4w5MlWOh2EzIHsHjO3lpjFEMStQ+XnnH/Dr965TebHivtMYY8yRO6oJDJkGOze5IrVzs+9Eh2QF6lDWfwYfPQsnXQTHnOI7jTHGRE7NdBj0Mvyy1p2T2r3Vc6C8WYHKy/59kHEtlKoKHe/xncYYYyKvTjs4fzxsXAET+rtTGlHGClRePnoWfloCXR+GEuV9pzHGmGDU7wT9RkNWJkwaCDl7fCf6AytQB/tlLcx/EBp0gxN7+k5jjDHBatgTej8La96FVy6Afdm+E/3OClRuqq4DcFIx6PpI3EylNMaYfDUbAN0eh6/nwPTL4cB+34kAG7fxR0tfgdVvu07l5Wr4TmOMMUWn1SVu4OG8O90FvT2f9t6YwArUb3ZuhjnDoWYrSL/YdxpjjCl6ba91RWrBCDfwsMvDXo8kWYH6zRt3wJ5f3TVPScm+0xhjjB/th7sLeT98GlJLQ8e7vUWxAgWwej58McG1M6rWyHcaY4zxRwTOvt/tSS183O1JnX6zlyhWoLJ3wWvXQ8V6cPqtvtMYY4x/Im7RRM4uePs+tyd18hVFHsMK1IKH3NLyC2ZCSprvNMYYEx2SkqDXs25Pas7fILUktBxWtBGK9NOizY9L4IOnoMUQqHu67zTGGBNdkou5C3mP6+i66yydUqQfn7gF6sB+mHmtmzjZ6T7faYwxJjoVKw79x8ExbWH6X+CrWUX20YlboD4Z5RrCdnnITZo0xhiTt9SSMGgSHN3MdZtYPb9IPjbQAiUinUVkpYisEpHheTwvIvJk6PklItIyyDy/2/o9vHUfHNcJGp9bJB9pjDExrXgZGDwFKh8PkwbBdx8G/pGBFSgRSQaeAboADYGBItLwoM26APVDt8uB54LK8ztVeP1mQKHbY9bOyBhjwlWyIgyd7kbIT+jvjkIFKMg9qNbAKlX9VlWzgUlAr4O26QWMVecjoLyIHB1gJlg2Db6ZC2fdARWOCfSjjDEm7pSuCsMy3KSHcX1gw/LAPirIAlUDWJfrflboscJug4hcLiKZIpK5adOmI0v18yqocRK0Kfo1/cYYExfK1YBhr7rDfr+sDexjgrwOKq9jZ3oY26Cqo4BRAOnp6X96vlDa/w3a3WDtjIwx5khUPBauyXSr/AIS5B5UFlAr1/2awPrD2CbyiqUG/hHGGBP3AixOEGyBWgTUF5G6IpIKDAAyDtomAxgWWs13MvCrqv4YYCZjjDExIrBDfKq6T0SuAeYCycBoVV0mIleEnn8emAV0BVYBu4CLgspjjDEmtgTai09VZ+GKUO7Hns/1tQJXB5nBGGNMbErcThLGGGOimhUoY4wxUckKlDHGmKhkBcoYY0xUsgJljDEmKolbSBc7RGQT8N0Rvk1l4OcIxEk09nMrPPuZFZ79zA5PLP/cjlHVKgc/GHMFKhJEJFNV033niDX2cys8+5kVnv3MDk88/tzsEJ8xxpioZAXKGGNMVErUAjXKd4AYZT+3wrOfWeHZz+zwxN3PLSHPQRljjIl+iboHZYwxJspZgTLGGBOVEq5AiUhnEVkpIqtEZLjvPLFAREaLyEYR+dJ3llghIrVEZL6IrBCRZSJyne9M0U5E0kTkExH5IvQzu9d3plghIski8pmIvOY7SyQlVIESkWTgGaAL0BAYKCIN/aaKCS8CnX2HiDH7gJtU9UTgZOBq+/9agfYCZ6lqM6A50Dk0yNQU7Dpghe8QkZZQBQpoDaxS1W9VNRuYBPTynCnqqeq7wBbfOWKJqv6oqp+Gvt6O++VRw2+q6KbOjtDdlNDNVnEVQERqAt2A//jOEmmJVqBqAOty3c/CfmmYgIlIHaAF8LHnKFEvdKjqc2AjME9V7WdWsJHArcABzzkiLtEKlOTxmP2FZgIjIqWBqcD1qrrNd55op6r7VbU5UBNoLSKNPUeKaiLSHdioqot9ZwlCohWoLKBWrvs1gfWespg4JyIpuOL0kqpO850nlqjqVuAd7NxnQdoCPUVkLe6UxVkiMt5vpMhJtAK1CKgvInVFJBUYAGR4zmTikIgI8F9ghao+7jtPLBCRKiJSPvR1CaAj8JXXUFFOVW9T1ZqqWgf3++xtVR3iOVbEJFSBUtV9wDXAXNxJ68mqusxvqugnIhOBD4EGIpIlIpf4zhQD2gJDcX/Rfh66dfUdKsodDcwXkSW4PybnqWpcLZs2hWOtjowxxkSlhNqDMsYYEzusQBljjIlKVqCMMcZEJStQxhhjopIVKGOMMVHJCpQxESIilXItKf9JRH4Ifb1DRJ4N6DOvF5Fh+Tzf3bqCm1hly8yNCYCI3APsUNVHA/yMYsCnQMvQNX55bSOhbdqq6q6gshgTBNuDMiZgItL+tzk9InKPiIwRkTdEZK2I9BWRh0VkqYjMCbVHQkROEpEFIrJYROaKyNF5vPVZwKe/FScRuVZElovIEhGZBK5DOK5lUPci+WaNiSArUMYUvXq48Qi9gPHAfFVtAuwGuoWK1FNAP1U9CRgNPJDH+7QFcjcJHQ60UNWmwBW5Hs8ETov4d2FMwIr5DmBMApqtqjkishRIBuaEHl8K1AEaAI2Bee4IHcnAj3m8z9H8cUjdEuAlEZkBzMj1+EageuTiG1M0rEAZU/T2AqjqARHJ0f+dCD6A+29SgGWqekoB77MbSMt1vxtwOtATuFNEGoUO/6WFtjUmptghPmOiz0qgioicAm5sh4g0ymO7FcBxoW2SgFqqOh83vK48UDq03fHAl0GHNibSrEAZE2VUNRvoBzwkIl8AnwOn5rHpbNweE7jDgONDhw0/A/4ZmqkEcCbwepCZjQmCLTM3JoaJyHTgVlX95hDPVwMmqGqHok1mzJGzAmVMDBORBkA1VX33EM+3AnJU9fMiDWZMBFiBMsYYE5XsHJQxxpioZAXKGGNMVLICZYwxJipZgTLGGBOVrEAZY4yJSv8PHvvHokUj4pYAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_omega(results):\n", - " results.omega.plot(label='omega', color='C1')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')\n", - " \n", - "plot_omega(results)" - ] - }, - { - "cell_type": "markdown", - "id": "handy-frontier", - "metadata": {}, - "source": [ - "Angular velocity, `omega`, increases linearly while I am pushing, and decreases linearly after I let go. The angle, `theta`, is the integral of angular velocity, so it forms a parabola during each phase.\n", - "\n", - "In the next section, we'll use this simulation to estimate the torque\n", - "due to friction." - ] - }, - { - "cell_type": "markdown", - "id": "careful-minneapolis", - "metadata": {}, - "source": [ - "## Estimating friction\n", - "\n", - "Let's take the code from the previous section and wrap it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "constant-wallace", - "metadata": {}, - "outputs": [], - "source": [ - "def run_two_phases(force, torque_friction, params):\n", - " \"\"\"Run both phases.\n", - " \n", - " force: force applied to the turntable\n", - " torque_friction: friction due to torque\n", - " params: Params object\n", - " \n", - " returns: TimeFrame of simulation results\n", - " \"\"\"\n", - " # put the specified parameters into the Params object\n", - " params = Params(params, \n", - " force=force, \n", - " torque_friction=torque_friction)\n", - "\n", - " # run phase 1\n", - " system1 = make_system(params)\n", - " results1, details1 = run_solve_ivp(system1, slope_func, \n", - " events=event_func1)\n", - "\n", - " # get the final state from phase 1\n", - " t_0 = results1.index[-1]\n", - " init2 = results1.iloc[-1]\n", - " \n", - " # run phase 2\n", - " system2 = System(system1, t_0=t_0, init=init2, force=0)\n", - " results2, details2 = run_solve_ivp(system2, slope_func, \n", - " events=event_func2)\n", - " \n", - " # combine and return the results\n", - " results = results1.combine_first(results2)\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "id": "positive-possible", - "metadata": {}, - "source": [ - "Let's test it with the same parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "played-ranking", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    4.1746221.24524.560892e-02
    4.2272441.24733.420669e-02
    4.2798651.24882.280446e-02
    4.3324861.24971.140223e-02
    4.3851071.25002.775558e-16
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "4.174622 1.2452 4.560892e-02\n", - "4.227244 1.2473 3.420669e-02\n", - "4.279865 1.2488 2.280446e-02\n", - "4.332486 1.2497 1.140223e-02\n", - "4.385107 1.2500 2.775558e-16" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "force = 1\n", - "torque_friction = 0.2\n", - "results = run_two_phases(params.force, params.torque_friction, params)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "id": "damaged-concert", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "bulgarian-halloween", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.2499999999999993" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "theta_final = results.iloc[-1].theta\n", - "theta_final" - ] - }, - { - "cell_type": "markdown", - "id": "electronic-latin", - "metadata": {}, - "source": [ - "We can use `run_two_phases` to write an error function we can use, with\n", - "`root_bisect`, to find the torque due to friction that yields the\n", - "observed results from the first push, a total rotation of 1.5 rad." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "skilled-diving", - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(torque_friction, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " torque_friction: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " force = 1\n", - " results = run_two_phases(force, torque_friction, params)\n", - " theta_final = results.iloc[-1].theta\n", - " print(torque_friction, theta_final)\n", - " return theta_final - params.theta_test" - ] - }, - { - "cell_type": "markdown", - "id": "generous-parcel", - "metadata": {}, - "source": [ - "Testing the error function." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "united-ranch", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 2.5000000000000018\n" - ] - }, - { - "data": { - "text/html": [ - "1.0000000000000018 radian" - ], - "text/latex": [ - "$1.0000000000000018\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.0000000000000018 " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "guess1 = 0.1\n", - "error_func1(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "rotary-brazilian", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.2 1.2499999999999993\n" - ] - }, - { - "data": { - "text/html": [ - "-0.25000000000000067 radian" - ], - "text/latex": [ - "$-0.25000000000000067\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.25000000000000067 " - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "guess2 = 0.2\n", - "error_func1(guess2, params)" - ] - }, - { - "cell_type": "markdown", - "id": "comparable-physiology", - "metadata": {}, - "source": [ - "And running `root_scalar`." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "hungarian-cattle", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 2.5000000000000018\n", - "0.2 1.2499999999999993\n", - "0.18 1.388888888888888\n", - "0.16559999999999983 1.5096618357487925\n", - "0.16675199999999987 1.4992323930147764\n", - "0.16666721279999988 1.4999950848161059\n", - "0.16666666666487695 1.5000000000161076\n", - "0.16666666666666669 1.5000000000000002\n", - "0.16666666666766675 1.4999999999909974\n" - ] - } - ], - "source": [ - "from scipy.optimize import root_scalar\n", - "\n", - "res = root_scalar(error_func1, params, bracket=[guess1, guess2])" - ] - }, - { - "cell_type": "markdown", - "id": "abandoned-remedy", - "metadata": {}, - "source": [ - "The result is 0.166 Nm, a little less than the initial guess." - ] - }, - { - "cell_type": "markdown", - "id": "knowing-sleeve", - "metadata": {}, - "source": [ - "## Animation\n", - "\n", - "\n", - "Here's a draw function we can use to animate the results." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "funky-affect", - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle, Arrow\n", - "from matplotlib.pyplot import gca, axis\n", - "from modsim import pol2cart\n", - "\n", - "def draw_func(t, state, params):\n", - " theta, omega = state\n", - " \n", - " # draw a circle for the table\n", - " circle1 = Circle([0, 0], params.radius_disk)\n", - " gca().add_patch(circle1)\n", - " \n", - " # draw a circle for the teapot\n", - " center = pol2cart(theta, params.radius_pot)\n", - " circle2 = Circle(center, 0.05, color='C1')\n", - " gca().add_patch(circle2)\n", - "\n", - " axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "gentle-transmission", - "metadata": {}, - "outputs": [], - "source": [ - "from modsim import remove_units\n", - "\n", - "params_no_unit = remove_units(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "illegal-remainder", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "state = results.iloc[0]\n", - "draw_func(0, state, params_no_unit)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "toxic-shark", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "from modsim import animate\n", - "\n", - "animate(results, draw_func, params_no_unit)" - ] - }, - { - "cell_type": "markdown", - "id": "horizontal-shade", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "professional-modem", - "metadata": {}, - "source": [ - "Now that we know the torque due to friction, we can compute the force\n", - "needed to rotate the turntable through the remaining angle, that is,\n", - "from 1.5 rad to 3.14 rad.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "practical-cabinet", - "metadata": {}, - "source": [ - "\n", - "### Exercises\n", - "\n", - "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", - "\n", - "Write an error function that takes `force` and `params` and returns the offset from the desired angle." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "apparent-lancaster", - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func2(force, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " force: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " results = run_two_phases(force, params.torque_friction, params)\n", - " theta_final = results.iloc[-1].theta\n", - " print(force, theta_final)\n", - " remaining_angle = params.theta_target - params.theta_test\n", - " return theta_final - remaining_angle" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "persistent-rings", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0 1.2499999999999993\n" - ] - }, - { - "data": { - "text/html": [ - "-0.3915926535897938 radian" - ], - "text/latex": [ - "$-0.3915926535897938\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.3915926535897938 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess1 = 1.0\n", - "params2 = params.set(torque_friction=torque_friction)\n", - "error_func2(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "previous-pittsburgh", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.0 2.50000000000001\n" - ] - }, - { - "data": { - "text/html": [ - "0.8584073464102171 radian" - ], - "text/latex": [ - "$0.8584073464102171\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.8584073464102171 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess2 = 2.0\n", - "error_func2(guess2, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "governing-component", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0 1.2499999999999993\n", - "2.0 2.50000000000001\n", - "1.3132741228718323 1.64159265358979\n", - "1.3132741228728328 1.6415926535910412\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_scalar(error_func2, params, bracket=[guess1, guess2])" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "statistical-behalf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.14159265358979" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "force = res.root\n", - "results = run_two_phases(force, params.torque_friction, params)\n", - "theta_final = results.iloc[-1].theta\n", - "theta_final + 1.5" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "unauthorized-equity", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} From 1b7804da84381938d7bdbe5954053afa6c5213fd Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 12 Feb 2021 16:31:08 -0500 Subject: [PATCH 032/144] Updating chapters --- chapters/chap01.ipynb | 1254 +++++++++++++++++++++++++++++++++++++++++ chapters/chap02.ipynb | 1204 +++++++++++++++++++++++++++++++++++++++ chapters/chap03.ipynb | 834 +++++++++++++++++++++++++++ chapters/chap04.ipynb | 853 ++++++++++++++++++++++++++++ chapters/chap05.ipynb | 1000 ++++++++++++++++++++++++++++++++ chapters/chap06.ipynb | 698 +++++++++++++++++++++++ chapters/chap07.ipynb | 811 ++++++++++++++++++++++++++ chapters/chap08.ipynb | 740 ++++++++++++++++++++++++ chapters/chap09.ipynb | 1054 ++++++++++++++++++++++++++++++++++ chapters/chap10.ipynb | 420 ++++++++++++++ chapters/chap11.ipynb | 821 +++++++++++++++++++++++++++ chapters/chap12.ipynb | 852 ++++++++++++++++++++++++++++ chapters/chap13.ipynb | 566 +++++++++++++++++++ chapters/chap14.ipynb | 570 +++++++++++++++++++ chapters/chap15.ipynb | 830 +++++++++++++++++++++++++++ chapters/chap16.ipynb | 642 +++++++++++++++++++++ chapters/chap17.ipynb | 547 ++++++++++++++++++ chapters/chap18.ipynb | 783 +++++++++++++++++++++++++ chapters/chap19.ipynb | 288 ++++++++++ chapters/chap20.ipynb | 794 ++++++++++++++++++++++++++ chapters/chap21.ipynb | 759 +++++++++++++++++++++++++ chapters/chap22.ipynb | 1248 ++++++++++++++++++++++++++++++++++++++++ chapters/chap23.ipynb | 557 ++++++++++++++++++ chapters/chap24.ipynb | 901 +++++++++++++++++++++++++++++ chapters/chap25.ipynb | 1076 +++++++++++++++++++++++++++++++++++ chapters/chap26.ipynb | 389 +++++++++++++ 26 files changed, 20491 insertions(+) create mode 100644 chapters/chap01.ipynb create mode 100644 chapters/chap02.ipynb create mode 100644 chapters/chap03.ipynb create mode 100644 chapters/chap04.ipynb create mode 100644 chapters/chap05.ipynb create mode 100644 chapters/chap06.ipynb create mode 100644 chapters/chap07.ipynb create mode 100644 chapters/chap08.ipynb create mode 100644 chapters/chap09.ipynb create mode 100644 chapters/chap10.ipynb create mode 100644 chapters/chap11.ipynb create mode 100644 chapters/chap12.ipynb create mode 100644 chapters/chap13.ipynb create mode 100644 chapters/chap14.ipynb create mode 100644 chapters/chap15.ipynb create mode 100644 chapters/chap16.ipynb create mode 100644 chapters/chap17.ipynb create mode 100644 chapters/chap18.ipynb create mode 100644 chapters/chap19.ipynb create mode 100644 chapters/chap20.ipynb create mode 100644 chapters/chap21.ipynb create mode 100644 chapters/chap22.ipynb create mode 100644 chapters/chap23.ipynb create mode 100644 chapters/chap24.ipynb create mode 100644 chapters/chap25.ipynb create mode 100644 chapters/chap26.ipynb diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb new file mode 100644 index 00000000..d2b12fcd --- /dev/null +++ b/chapters/chap01.ipynb @@ -0,0 +1,1254 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "uniform-persian", + "metadata": {}, + "source": [ + "# Chapter 1" + ] + }, + { + "cell_type": "markdown", + "id": "biblical-enhancement", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "confirmed-budapest", + "metadata": {}, + "source": [ + "## Jupyter\n", + "\n", + "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", + "\n", + "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." + ] + }, + { + "cell_type": "markdown", + "id": "danish-scope", + "metadata": {}, + "source": [ + "To run a cell, hold down SHIFT and press ENTER. \n", + "\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", + "\n", + "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", + "\n", + "If you run the following cell, it checks whether the libraries you need are installed. If so, the cell produces no output. If not, you'll see updates from the installer." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "asian-america", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " \n", + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "markdown", + "id": "copyrighted-desperate", + "metadata": {}, + "source": [ + "If the previous cell runs without producing any error messages, you are all set.\n" + ] + }, + { + "cell_type": "markdown", + "id": "hourly-financing", + "metadata": {}, + "source": [ + "## Modeling\n", + "\n", + "This book is about modeling and simulation of physical systems. The\n", + "following diagram shows what I mean by \"modeling\":\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "structured-receiver", + "metadata": {}, + "source": [ + "Starting in the lower left, the **system** is something in the real\n", + "world we are interested in. \n", + "To model the system, we have to decide which elements of the real world to include and which we can leave out.\n", + "This process is called **abstraction**.\n", + "\n", + "The result of abstraction is a **model**, which is a description of the system that includes only the features we think are essential. A model\n", + "can be represented in the form of diagrams and equations, which can be\n", + "used for mathematical **analysis**. It can also be implemented in the\n", + "form of a computer program, which can run **simulations**.\n", + "\n", + "The result of analysis and simulation might be a **prediction** about\n", + "what the system will do, an **explanation** of why it behaves the way it\n", + "does, or a **design** intended to achieve a purpose.\n", + "\n", + "We can **validate** predictions and test designs by taking\n", + "**measurements** from the real world and comparing the **data** we get\n", + "with the results from analysis and simulation." + ] + }, + { + "cell_type": "markdown", + "id": "center-accommodation", + "metadata": {}, + "source": [ + "For any physical system, there are many possible models, each one\n", + "including and excluding different features, or including different\n", + "levels of detail. The goal of the modeling process is to find the model\n", + "best suited to its purpose (prediction, explanation, or design).\n", + "\n", + "Sometimes the best model is the most detailed. If we include more\n", + "features, the model is more realistic, and we expect its predictions to\n", + "be more accurate.\n", + "\n", + "But often a simpler model is better. If we include only the essential\n", + "features and leave out the rest, we get models that are easier to work\n", + "with, and the explanations they provide can be clearer and more\n", + "compelling." + ] + }, + { + "cell_type": "markdown", + "id": "confirmed-highlight", + "metadata": {}, + "source": [ + "As an example, suppose someone asks you why the orbit of the Earth is\n", + "elliptical. If you model the Earth and Sun as point masses (ignoring\n", + "their actual size), compute the gravitational force between them using\n", + "Newton's law of universal gravitation, and compute the resulting orbit\n", + "using Newton's laws of motion, you can show that the result is an\n", + "ellipse.\n", + "\n", + "Of course, the actual orbit of Earth is not a perfect ellipse, because\n", + "of the gravitational forces of the Moon, Jupiter, and other objects in\n", + "the solar system, and because Newton's laws of motion are only\n", + "approximately true (they don't take into account relativistic effects).\n", + "\n", + "But adding these features to the model would not improve the\n", + "explanation; more detail would only be a distraction from the\n", + "fundamental cause. However, if the goal is to predict the position of\n", + "the Earth with great precision, including more details might be\n", + "necessary." + ] + }, + { + "cell_type": "markdown", + "id": "stretch-geneva", + "metadata": {}, + "source": [ + "Choosing the best model depends on what the model is for. It is usually\n", + "a good idea to start with a simple model, even if it is likely to be too\n", + "simple, and test whether it is good enough for its purpose. Then you can\n", + "add features gradually, starting with the ones you expect to be most\n", + "essential. This process is called **iterative modeling**.\n", + "\n", + "Comparing results of successive models provides a form of **internal\n", + "validation**, so you can catch conceptual, mathematical, and software\n", + "errors. And by adding and removing features, you can tell which ones\n", + "have the biggest effect on the results, and which can be ignored.\n", + "\n", + "Comparing results to data from the real world provides **external\n", + "validation**, which is generally the strongest test." + ] + }, + { + "cell_type": "markdown", + "id": "criminal-lunch", + "metadata": {}, + "source": [ + "## The falling penny myth\n", + "\n", + "Let's see an example of how models are used. You might have heard that a\n", + "penny dropped from the top of the Empire State Building would be going\n", + "so fast when it hit the pavement that it would be embedded in the\n", + "concrete; or if it hit a person, it would break their skull.\n", + "\n", + "We can test this myth by making and analyzing a model. To get started,\n", + "we'll assume that the effect of air resistance is small. This will turn out to be a bad assumption, but bear with me.\n", + "If air resistance is negligible, the primary force acting on the penny\n", + "is gravity, which causes the penny to accelerate downward.\n", + "\n", + "If the initial velocity is 0, the velocity after $t$ seconds is \n", + "\n", + "$$v = a t$$\n", + "\n", + "and the distance the penny has dropped is \n", + "\n", + "$$x = a t^2 / 2$$ \n", + "\n", + "To find the time until the penny reaches the sidewalk, we can solve for $t$:\n", + "\n", + "$$t = \\sqrt{ 2 x / a}$$ \n", + "\n", + "Plugging in the acceleration of gravity, $a = 9.8$ m/s$^2$, and the height of the Empire State Building, $x = 381$ m, we get $t = 8.8$ s. \n", + "\n", + "Then computing $v = a t$ we get a velocity on impact of $86$ m/s, which is about 190 miles per hour. That sounds like it could hurt." + ] + }, + { + "cell_type": "markdown", + "id": "documentary-diagnosis", + "metadata": {}, + "source": [ + "Of course, these results are not exact because the model is based on\n", + "simplifications. For example, we assume that gravity is constant. In\n", + "fact, the force of gravity is different on different parts of the globe, and it gets weaker as you move away from the surface. But these differences are small, so ignoring them is probably a good choice for this scenario.\n", + "\n", + "On the other hand, ignoring air resistance is not a good choice. Once\n", + "the penny gets to about 29 m/s, the upward force of air resistance\n", + "equals the downward force of gravity, so the penny stops accelerating.\n", + "This is the **terminal velocity** of the penny in air.\n", + "\n", + "Once the penny reaches terminal velocity, it doesn't matter how much farther it falls; it hits the sidewalk at about 29 m/s.\n", + "That's much less than 86 m/s, as the simple model predicts." + ] + }, + { + "cell_type": "markdown", + "id": "recent-appliance", + "metadata": {}, + "source": [ + "The statistician George Box famously said \"All models are wrong, but\n", + "some are useful.\" He was talking about statistical models, but his wise words apply to all kinds of models. Our first model, which ignores air resistance, is very wrong, and probably not useful. The second model, which takes air resistance into account, is still wrong, but it's better, and it's good enough to refute the myth.\n", + "\n", + "The television show *Mythbusters* has tested the myth of the falling\n", + "penny more carefully; you can view the results at\n", + ". Their work is based on a mathematical model of motion, measurements to determine the force of air resistance on a penny, and a physical model of a human head." + ] + }, + { + "cell_type": "markdown", + "id": "brief-zoning", + "metadata": {}, + "source": [ + "## Computation\n", + "\n", + "Let me show you how I computed the results from the\n", + "previous section using Python.\n", + "First we'll create a variable to represent acceleration due to gravity in meters per second squared (m/s^2)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eleven-marine", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8" + ] + }, + { + "cell_type": "markdown", + "id": "upset-myanmar", + "metadata": {}, + "source": [ + "A **variable** is a name that corresponds to a value. In this example, the name is `a` and the value is the number `9.8`.\n", + "\n", + "Suppose we let the penny drop for $3.4$ seconds (s). I'll create a variable to represent this time:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "following-launch", + "metadata": {}, + "outputs": [], + "source": [ + "t = 3.4" + ] + }, + { + "cell_type": "markdown", + "id": "greek-heritage", + "metadata": {}, + "source": [ + "Now we can compute the velocity of the penny after `t` seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "mature-duration", + "metadata": {}, + "outputs": [], + "source": [ + "v = a * t" + ] + }, + { + "cell_type": "markdown", + "id": "qualified-diabetes", + "metadata": {}, + "source": [ + "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation.\n", + "\n", + "When you assign a value to a variable, Jupyter does not show the result automatically, but you can display the value of a variable like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "considered-inclusion", + "metadata": {}, + "outputs": [], + "source": [ + "v" + ] + }, + { + "cell_type": "markdown", + "id": "northern-saturday", + "metadata": {}, + "source": [ + "After $3.4$ s, the velocity of the penny is about $33$ m/s (ignoring air resistance). Now let's see how far it would travel during that time:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "valued-electricity", + "metadata": {}, + "outputs": [], + "source": [ + "x = a * t**2 / 2\n", + "x" + ] + }, + { + "cell_type": "markdown", + "id": "yellow-business", + "metadata": {}, + "source": [ + "It would travel about $56$ m. Now, going in the other direction, let's compute the time it takes to fall 381 m, the height of the Empire State Building." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "closed-month", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381" + ] + }, + { + "cell_type": "markdown", + "id": "fuzzy-lease", + "metadata": {}, + "source": [ + "For this computation, we need the square root function, which is provided by a library called NumPy.\n", + "Before we can use it, we have to import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "nuclear-clone", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sqrt" + ] + }, + { + "cell_type": "markdown", + "id": "unlimited-swiss", + "metadata": {}, + "source": [ + "Now we can use it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "quarterly-nightmare", + "metadata": {}, + "outputs": [], + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "velvet-oklahoma", + "metadata": {}, + "source": [ + "With no air resistance, it would take about $8.8$ s for the penny to reach the sidewalk." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "quality-external", + "metadata": {}, + "outputs": [], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "human-phase", + "metadata": {}, + "source": [ + "And its velocity on impact would be about $86$ m/s.\n", + "\n", + "Python displays results with about 16 digits, which gives the impression that they are very precise, but don't be fooled.\n", + "The numbers we get out are only as good as the numbers we put in.\n", + "\n", + "For example, the \"roof height\" of the Empire State Building is $380$ m [according to Wikipedia](https://en.wikipedia.org/wiki/Empire_State_Building).\n", + "I chose $h=381$ m for this example on the assumption that the observation deck is on the roof and you drop the penny from a 1 meter railing.\n", + "But that's probably not right, so we should treat this value as an approximation where only the first two digits are likely to be right.\n", + "\n", + "If the precision of the inputs is two digits, the precision of the outputs is two digits, *at most*.\n", + "That's why, if the output is `86.41527642726142`, I report it as \"about 86\"." + ] + }, + { + "cell_type": "markdown", + "id": "consecutive-sleeve", + "metadata": {}, + "source": [ + "## Computation with units\n", + "\n", + "The computation in the previous section uses numbers without units. \n", + "When we set `h=381`, we left out the meters, and when we set `a=9.8`, we left out the meters per second squared.\n", + "And, when we got the result `v=86`, we added back the meters per second.\n", + "\n", + "Leaving units of out computation is common practice, but it tends to cause errors, including the very expensive failure of the [Mars Climate Orbiter](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter) in 1999.\n", + "When possible, it is better to include units in the computation.\n", + "\n", + "To represent units, we'll use a Python library called [Pint](https://pint.readthedocs.io/en/latest/).\n", + "The ModSim library initializes Pint and provides an object called `units` that contains variables representing pretty much every unit you've ever heard of.\n", + "\n", + "We can import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "based-belief", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "unlike-opera", + "metadata": {}, + "source": [ + "Now we can create variables named `meter` and `second`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "russian-popularity", + "metadata": {}, + "outputs": [], + "source": [ + "meter = units.meter\n", + "meter" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "endless-paint", + "metadata": {}, + "outputs": [], + "source": [ + "second = units.second\n", + "second" + ] + }, + { + "cell_type": "markdown", + "id": "spiritual-scenario", + "metadata": {}, + "source": [ + "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." + ] + }, + { + "cell_type": "markdown", + "id": "everyday-location", + "metadata": {}, + "source": [ + "We can use `meter` and `second` to create a variable named `a` and give it the value of acceleration due to gravity. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "earlier-bandwidth", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "a" + ] + }, + { + "cell_type": "markdown", + "id": "generic-bowling", + "metadata": {}, + "source": [ + "The result is a **quantity** with two parts, called `magnitude` and `units`, which we can access like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "missing-privilege", + "metadata": {}, + "outputs": [], + "source": [ + "a.magnitude" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "fourth-swedish", + "metadata": {}, + "outputs": [], + "source": [ + "a.units" + ] + }, + { + "cell_type": "markdown", + "id": "realistic-techno", + "metadata": {}, + "source": [ + "Now we can create a quantity that represents $3.4$ s." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "apart-france", + "metadata": {}, + "outputs": [], + "source": [ + "t = 3.4 * second\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "severe-share", + "metadata": {}, + "source": [ + "And use it to compute the distance a penny would fall after `t` seconds with constant acceleration `a`. " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "alien-scout", + "metadata": {}, + "outputs": [], + "source": [ + "a * t**2 / 2" + ] + }, + { + "cell_type": "markdown", + "id": "wicked-indianapolis", + "metadata": {}, + "source": [ + "Notice that the units of the result are correct.\n", + "If we create a quantity to represent the height of the Empire State Building:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "confidential-costs", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381 * meter" + ] + }, + { + "cell_type": "markdown", + "id": "hollow-programmer", + "metadata": {}, + "source": [ + "We can use it to compute the time to reach the sidewalk." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "studied-opera", + "metadata": {}, + "outputs": [], + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ] + }, + { + "cell_type": "markdown", + "id": "seasonal-laser", + "metadata": {}, + "source": [ + "And the velocity of the penny on impact:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "exterior-greek", + "metadata": {}, + "outputs": [], + "source": [ + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "superior-biography", + "metadata": {}, + "source": [ + "As in the previous section, the result is about $86$, but now it has the correct units, m/s.\n", + "\n", + "With Pint quantities, we can convert from one set of units to another like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "antique-landing", + "metadata": {}, + "outputs": [], + "source": [ + "mile = units.mile\n", + "hour = units.hour" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "included-failure", + "metadata": {}, + "outputs": [], + "source": [ + "v.to(mile/hour)" + ] + }, + { + "cell_type": "markdown", + "id": "progressive-charleston", + "metadata": {}, + "source": [ + "If you are more familiar with miles per hour, this result might be easier to interpret.\n", + "And it might give you a sense that this model is not realistic." + ] + }, + { + "cell_type": "markdown", + "id": "continuing-democrat", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces a modeling framework that consists of three steps:\n", + "\n", + "* Abstraction is the process of defining a model, deciding which elements of the real world to include and which can be left out.\n", + "\n", + "* Analysis and simulation are ways to use a model to generate predictions, explain why things behave as they to, and design things that behave as we want.\n", + "\n", + "* Validation is how we test whether the model is right, often by comparing predictions with measurements from the real world.\n", + "\n", + "As a first example, we modeled a penny dropped from the Empire State building, including gravity but ignoring air resistance.\n", + "In the exercises, you'll have a chance to try a better model, including air resistance.\n", + "\n", + "This chapter also presents Pint, a library for doing computation with units, which is convenient for converting between different units and important for avoiding catastrophic errors." + ] + }, + { + "cell_type": "markdown", + "id": "thousand-equation", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "handmade-zoning", + "metadata": {}, + "source": [ + "**Exercise** In mathematical notation, we can write an equation like $v = a t$ and it's understood that we are multiplying $a$ and $t$.\n", + "But that doesn't work in Python. If you put two variables side-by-side, like this:\n", + "\n", + "```\n", + "v = a t\n", + "```\n", + "\n", + "you'll get a **syntax error**, which means that something is wrong with the punctuation of the program.\n", + "\n", + "Try it out in the next cell so you see what the error message looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "postal-marking", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "t = 3.4 * second\n", + "\n", + "v = a * t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "id": "pressing-sugar", + "metadata": {}, + "source": [ + "**Exercise:** In this chapter we used the `sqrt` function from the NumPy library. NumPy also provides a variable named `pi` that contains an approximation of the mathematical constant $\\pi$.\n", + "We can import it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "legal-observer", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "pi" + ] + }, + { + "cell_type": "markdown", + "id": "aggregate-mambo", + "metadata": {}, + "source": [ + "NumPy provides other functions we'll use, including `log`, `exp`, `sin`, and `cos`.\n", + "Import `sin` and `cos` from NumPy and compute\n", + "\n", + "$$sin^2 \\pi/4 + cos^2 \\pi/4$$\n", + "\n", + "Note: A mathematical identity tells us that the answer should be $1$." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "pressing-belgium", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "unlimited-delivery", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", + "\n", + "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", + "\n", + "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "inner-equivalent", + "metadata": {}, + "outputs": [], + "source": [ + "h = 381 * meter" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "nuclear-thirty", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "available-steering", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "aggressive-climate", + "metadata": {}, + "source": [ + "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "documentary-doctrine", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "t = 3.4 * second" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "primary-partner", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "steady-chancellor", + "metadata": {}, + "source": [ + "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", + "\n", + "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", + "\n", + "1. Start from the bottom and read up.\n", + "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", + "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", + "\n", + "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." + ] + }, + { + "cell_type": "markdown", + "id": "valid-empire", + "metadata": {}, + "source": [ + "**Exercise:** Suppose instead of dropping the penny, you throw it downward at its terminal velocity, $29$ m/s. How long would it take to fall $381$ m?" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "greenhouse-reason", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "asian-murray", + "metadata": {}, + "source": [ + "**Exercise:** So far we have considered two models of a falling penny:\n", + "\n", + "* If we ignore air resistance, the penny falls with constant acceleration, and we can compute the time to reach the sidewalk and the velocity of the penny when it gets there.\n", + "\n", + "* If we take air resistance into account, and drop the penny at its terminal velocity, it falls with constant velocity. \n", + "\n", + "Now let's consider a third model that includes elements of the first two: let's assume that the acceleration of the penny is `a` until the penny reaches $29$ m/s, and then $0$ m/s afterwards. What is the total time for the penny to fall $381$ m?" + ] + }, + { + "cell_type": "markdown", + "id": "detailed-minnesota", + "metadata": {}, + "source": [ + "You can break this question into three parts:\n", + "\n", + "1. How long would the penny take to reach $29$ m/s with constant acceleration `a`.\n", + "2. How far would it fall during that time?\n", + "3. How long would it take to fall the remaining distance with constant velocity $29$ m/s?\n", + "\n", + "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "secure-crowd", + "metadata": {}, + "outputs": [], + "source": [ + "a = 9.8 * meter / second**2\n", + "h = 381 * meter" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "thirty-minneapolis", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "premier-seeking", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "brave-laundry", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "adjusted-consultation", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "understanding-consortium", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "composed-tunnel", + "metadata": {}, + "source": [ + "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that, when he threw a fastball, he was throwing the ball down; that is, the ball was leaving his hand at a downward angle.\n", + "I was skeptical; watching from the side, I thought the ball was leaving his hand at an upward angle.\n", + "\n", + "Can you think of a simple model you could use to settle the argument? What factors would you include and what could you ignore? What quantities would you have to look up or estimate?\n", + "\n", + "I suggest you convert all quantities to [SI units](https://en.wikipedia.org/wiki/International_System_of_Units): meters and seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "about-complex", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "unique-owner", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "minus-batman", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "exact-vegetable", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "neutral-lightning", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "jewish-secret", + "metadata": {}, + "source": [ + "**Exercise:** Suppose I run a 10K race in 44:52. What is my average page in minutes per mile?" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "virgin-cambodia", + "metadata": {}, + "outputs": [], + "source": [ + "mile = units.mile\n", + "kilometer = units.kilometer\n", + "minute = units.minute" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "right-intention", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "mineral-sally", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "preceding-cricket", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "effective-rendering", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "printable-reply", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "environmental-wallet", + "metadata": {}, + "source": [ + "## More Jupyter" + ] + }, + { + "cell_type": "markdown", + "id": "quality-probe", + "metadata": {}, + "source": [ + "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", + "\n", + "Try the following exercises:\n", + "\n", + "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", + "\n", + "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", + "\n", + "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", + "\n", + "4. In the new cell, type some text, and then run it.\n", + "\n", + "5. Use the arrow buttons in the toolbar to move cells up and down.\n", + "\n", + "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", + "\n", + "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", + "\n", + "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "id": "successful-kentucky", + "metadata": {}, + "source": [ + "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", + "\n", + "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order." + ] + }, + { + "cell_type": "markdown", + "id": "suffering-intro", + "metadata": {}, + "source": [ + "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "weighted-quebec", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb new file mode 100644 index 00000000..f9bdf584 --- /dev/null +++ b/chapters/chap02.ipynb @@ -0,0 +1,1204 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "victorian-latitude", + "metadata": {}, + "source": [ + "# Chapter 2" + ] + }, + { + "cell_type": "markdown", + "id": "cathedral-glasgow", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "electronic-radius", + "metadata": {}, + "source": [ + "This chapter presents a simple model of a bike share system and\n", + "demonstrates the features of Python we'll use to develop simulations of real-world systems.\n", + "\n", + "Along the way, we'll make decisions about how to model the system. In\n", + "the next chapter we'll review these decisions and gradually improve the model." + ] + }, + { + "cell_type": "markdown", + "id": "above-denial", + "metadata": {}, + "source": [ + "## Modeling a Bike Share System\n", + "\n", + "Imagine a bike share system for students traveling between Olin College and Wellesley College, which are about 3 miles apart in eastern Massachusetts.\n", + "\n", + "Suppose the system contains 12 bikes and two bike racks, one at Olin and one at Wellesley, each with the capacity to hold 12 bikes.\n", + "\n", + "As students arrive, check out a bike, and ride to the other campus, the number of bikes in each location changes. In the simulation, we'll need to keep track of where the bikes are. To do that, we'll use a function called `State`, which is defined in the ModSim library." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "incorrect-comparison", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "id": "living-wayne", + "metadata": {}, + "source": [ + "The expressions in parentheses are **keyword arguments**.\n", + "They create two variables, `olin` and `wellesley`, and give them values.\n", + "\n", + "Then we call the `State` function.\n", + "The result is a `State` object, which is a collection of **state variables**.\n", + "\n", + "In this example, the state variables represent the number of\n", + "bikes at each location. The initial values are 10 and 2, indicating that there are 10 bikes at Olin and 2 at Wellesley. \n", + "\n", + "The `State` object is assigned to a new variable named `bikeshare`.\n", + "We can read the variables inside a `State` object using the **dot\n", + "operator**, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "brief-diversity", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "intermediate-midwest", + "metadata": {}, + "source": [ + "And this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "designed-brazilian", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "phantom-oklahoma", + "metadata": {}, + "source": [ + "Or, to display the state variables and their values, you can just type the name of the object:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "impaired-potter", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "fleet-beijing", + "metadata": {}, + "source": [ + "These values make up the **state** of the system.\n", + "\n", + "The ModSim library provides a function called `show` that displays a `State` object as a table." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "basic-fabric", + "metadata": {}, + "outputs": [], + "source": [ + "show(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "delayed-ocean", + "metadata": {}, + "source": [ + "You don't have to use `show`, but I think it looks better.\n", + "\n", + "We can update the state by assigning new values to the variables. \n", + "For example, if a student moves a bike from Olin to Wellesley, we can figure out the new values and assign them:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "floppy-trainer", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin = 9\n", + "bikeshare.wellesley = 3" + ] + }, + { + "cell_type": "markdown", + "id": "natural-gossip", + "metadata": {}, + "source": [ + "Or we can use **update operators**, `-=` and `+=`, to subtract 1 from\n", + "`olin` and add 1 to `wellesley`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "hungarian-bride", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin -= 1\n", + "bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "radical-mills", + "metadata": {}, + "source": [ + "The result is the same either way." + ] + }, + { + "cell_type": "markdown", + "id": "controversial-opportunity", + "metadata": {}, + "source": [ + "## Defining functions\n", + "\n", + "So far we have used functions defined in NumPy and ModSim. Now we're going to define our own function.\n", + "\n", + "When you are developing code in Jupyter, it is often efficient to write a few lines of code, test them to confirm they do what you intend, and then use them to define a new function. For example, these lines move a bike from Olin to Wellesley:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "vertical-drawing", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin -= 1\n", + "bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "approximate-rolling", + "metadata": {}, + "source": [ + "Rather than repeat them every time a bike moves, we can define a new\n", + "function:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "significant-nutrition", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "generous-tracker", + "metadata": {}, + "source": [ + "`def` is a special word in Python that indicates we are defining a new\n", + "function. The name of the function is `bike_to_wellesley`. The empty\n", + "parentheses indicate that this function requires no additional\n", + "information when it runs. The colon indicates the beginning of an\n", + "indented **code block**.\n", + "\n", + "The next two lines are the **body** of the function. They have to be\n", + "indented; by convention, the indentation is 4 spaces.\n", + "\n", + "When you define a function, it has no immediate effect. The body of the\n", + "function doesn't run until you **call** the function. Here's how to call\n", + "this function:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "moving-jurisdiction", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "meaningful-christmas", + "metadata": {}, + "source": [ + "When you call the function, it runs the statements in the body, which\n", + "update the variables of the `bikeshare` object; you can check by\n", + "displaying the new state." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "proper-symposium", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "eleven-brook", + "metadata": {}, + "source": [ + "When you call a function, you have to include the parentheses. If you\n", + "leave them out, you get this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "identical-yacht", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "premier-youth", + "metadata": {}, + "source": [ + "This result indicates that `bike_to_wellesley` is a function. You don't\n", + "have to know what `__main__` means, but if you see something like this,\n", + "it probably means that you looked up a function but you didn't actually\n", + "call it. So don't forget the parentheses." + ] + }, + { + "cell_type": "markdown", + "id": "brazilian-medicare", + "metadata": {}, + "source": [ + "## Print statements\n", + "\n", + "As you write more complicated programs, it is easy to lose track of what\n", + "is going on. One of the most useful tools for debugging is the **print\n", + "statement**, which displays text in the Jupyter notebook.\n", + "\n", + "Normally when Jupyter runs the code in a cell, it displays the value of\n", + "the last line of code. For example, if you run:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "heavy-patrol", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare.olin\n", + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "ancient-projection", + "metadata": {}, + "source": [ + "Jupyter runs both lines, but it only displays the value of the\n", + "second. If you want to display more than one value, you can use\n", + "print statements:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "french-preference", + "metadata": {}, + "outputs": [], + "source": [ + "print(bikeshare.olin)\n", + "print(bikeshare.wellesley)" + ] + }, + { + "cell_type": "markdown", + "id": "original-hollywood", + "metadata": {}, + "source": [ + "When you call the `print` function, you can put a variable name in\n", + "parentheses, as in the previous example, or you can provide a sequence\n", + "of variables separated by commas, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "alternative-keyboard", + "metadata": {}, + "outputs": [], + "source": [ + "print(bikeshare.olin, bikeshare.wellesley)" + ] + }, + { + "cell_type": "markdown", + "id": "described-produce", + "metadata": {}, + "source": [ + "Python looks up the values of the variables and displays them; in this\n", + "example, it displays two values on the same line, with a space between\n", + "them.\n", + "\n", + "Print statements are useful for debugging functions. For example, we can\n", + "add a print statement to `move_bike`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "robust-holly", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " print('Moving a bike to Wellesley')\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "vital-lender", + "metadata": {}, + "source": [ + "Each time we call this version of the function, it displays a message,\n", + "which can help us keep track of what the program is doing.\n", + "The message in this example is a **string**, which is a sequence of\n", + "letters and other symbols in quotes.\n", + "\n", + "Just like `bike_to_wellesley`, we can define a function that moves a\n", + "bike from Wellesley to Olin:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "fifteen-atmosphere", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin():\n", + " print('Moving a bike to Olin')\n", + " bikeshare.wellesley -= 1\n", + " bikeshare.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "requested-glasgow", + "metadata": {}, + "source": [ + "And call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "matched-narrow", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "sitting-semiconductor", + "metadata": {}, + "source": [ + "One benefit of defining functions is that you avoid repeating chunks of\n", + "code, which makes programs smaller. Another benefit is that the name you\n", + "give the function documents what it does, which makes programs more\n", + "readable." + ] + }, + { + "cell_type": "markdown", + "id": "enhanced-maintenance", + "metadata": {}, + "source": [ + "## If statements\n", + "\n", + "The ModSim library provides a function called `flip` that generates random \"coin tosses\".\n", + "When you call it, you provide a probability between 0 and 1, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "illegal-metropolitan", + "metadata": {}, + "outputs": [], + "source": [ + "flip(0.7)" + ] + }, + { + "cell_type": "markdown", + "id": "appropriate-funds", + "metadata": {}, + "source": [ + "The result is one of two values: `True` with probability 0.7 (in this example) or `False`\n", + "with probability 0.3. If you run `flip` like this 100 times, you should\n", + "get `True` about 70 times and `False` about 30 times. But the results\n", + "are random, so they might differ from these expectations.\n", + "\n", + "`True` and `False` are special values defined by Python. Note that they\n", + "are not strings. There is a difference between `True`, which is a\n", + "special value, and `'True'`, which is a string.\n", + "\n", + "`True` and `False` are called **boolean** values because they are\n", + "related to Boolean algebra ().\n", + "\n", + "We can use boolean values to control the behavior of the program, using\n", + "an **if statement**:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "excessive-murder", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " print('heads')" + ] + }, + { + "cell_type": "markdown", + "id": "seventh-profile", + "metadata": {}, + "source": [ + "If the result from `flip` is `True`, the program displays the string\n", + "`'heads'`. Otherwise it does nothing.\n", + "\n", + "The syntax for `if` statements is similar to the syntax for\n", + "function definitions: the first line has to end with a colon, and the\n", + "lines inside the `if` statement have to be indented.\n", + "\n", + "Optionally, you can add an **else clause** to indicate what should\n", + "happen if the result is `False`:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "fundamental-nursing", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " print('heads')\n", + "else:\n", + " print('tails') " + ] + }, + { + "cell_type": "markdown", + "id": "recovered-chemical", + "metadata": {}, + "source": [ + "Now we can use `flip` to simulate the arrival of students who want to\n", + "borrow a bike. Suppose students arrive at the Olin station every 2\n", + "minutes, on average. In that case, the chance of an arrival during any\n", + "one-minute period is 50%, and we can simulate it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "twenty-health", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.5):\n", + " bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "difficult-construction", + "metadata": {}, + "source": [ + "If students arrive at the Wellesley station every 3 minutes, on average,\n", + "the chance of an arrival during any one-minute period is 33%, and we can\n", + "simulate it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "played-character", + "metadata": {}, + "outputs": [], + "source": [ + "if flip(0.33):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "standard-party", + "metadata": {}, + "source": [ + "We can combine these snippets into a function that simulates a **time\n", + "step**, which is an interval of time, in this case one minute:" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "ecological-colon", + "metadata": {}, + "outputs": [], + "source": [ + "def step():\n", + " if flip(0.5):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(0.33):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "amateur-exposure", + "metadata": {}, + "source": [ + "Then we can simulate a time step like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "mediterranean-german", + "metadata": {}, + "outputs": [], + "source": [ + "step()" + ] + }, + { + "cell_type": "markdown", + "id": "sought-mobile", + "metadata": {}, + "source": [ + "Even though there are no values in parentheses, we have to include them." + ] + }, + { + "cell_type": "markdown", + "id": "organic-proportion", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "The previous version of `step` is fine if the arrival probabilities\n", + "never change, but in reality, these probabilities vary over time.\n", + "\n", + "So instead of putting the constant values 0.5 and 0.33 in `step` we can replace them with **parameters**. Parameters are variables whose values are set when a function is called.\n", + "\n", + "Here's a version of `step` that takes two parameters, `p1` and `p2`:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "hollywood-shopping", + "metadata": {}, + "outputs": [], + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "encouraging-arkansas", + "metadata": {}, + "source": [ + "The values of `p1` and `p2` are not set inside this function; instead,\n", + "they are provided when the function is called, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "buried-alert", + "metadata": {}, + "outputs": [], + "source": [ + "step(0.5, 0.33)" + ] + }, + { + "cell_type": "markdown", + "id": "aggregate-dynamics", + "metadata": {}, + "source": [ + "The values you provide when you call the function are called\n", + "**arguments**. The arguments, `0.5` and `0.33` in this example, get\n", + "assigned to the parameters, `p1` and `p2`, in order. So running this\n", + "function has the same effect as:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "recognized-denmark", + "metadata": {}, + "outputs": [], + "source": [ + "p1 = 0.5\n", + "p2 = 0.33\n", + "\n", + "if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + "if flip(p2):\n", + " bike_to_olin()" + ] + }, + { + "cell_type": "markdown", + "id": "raised-museum", + "metadata": {}, + "source": [ + "The advantage of using parameters is that you can call the same function many times, providing different arguments each time.\n", + "\n", + "Adding parameters to a function is called **generalization**, because it makes the function more general, that is, less specialized." + ] + }, + { + "cell_type": "markdown", + "id": "scenic-african", + "metadata": {}, + "source": [ + "## For loops\n", + "\n", + "At some point you will get sick of running cells over and over.\n", + "Fortunately, there is an easy way to repeat a chunk of code, the **for\n", + "loop**. Here's an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "polish-river", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(3):\n", + " print(i)\n", + " bike_to_wellesley()" + ] + }, + { + "cell_type": "markdown", + "id": "compatible-conspiracy", + "metadata": {}, + "source": [ + "The syntax here should look familiar; the first line ends with a\n", + "colon, and the lines inside the `for` loop are indented. The other\n", + "elements of the loop are:\n", + "\n", + "- The words `for` and `in` are special words we have to use in a for\n", + " loop.\n", + "\n", + "- `range` is a Python function we're using here to control the number of times the loop runs.\n", + "\n", + "- `i` is a **loop variable** that gets created when the for loop runs.\n", + "\n", + "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `0`; the second time, it is `1`; the third time, it is `2`.\n", + "\n", + "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley." + ] + }, + { + "cell_type": "markdown", + "id": "breeding-groove", + "metadata": {}, + "source": [ + "## TimeSeries" + ] + }, + { + "cell_type": "markdown", + "id": "flexible-projection", + "metadata": {}, + "source": [ + "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", + "corresponding sequence of quantities.\n", + "\n", + "In this example, the time stamps are integers representing minutes, and the quantities are the number of bikes at one location.\n", + "\n", + "Since we have moved a number of bikes around, let's start again with a new `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "every-consultation", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ] + }, + { + "cell_type": "markdown", + "id": "cross-sharp", + "metadata": {}, + "source": [ + "We can create a new, empty `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "changing-planet", + "metadata": {}, + "outputs": [], + "source": [ + "results = TimeSeries()" + ] + }, + { + "cell_type": "markdown", + "id": "attractive-revision", + "metadata": {}, + "source": [ + "And we can add a quantity like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "aquatic-richardson", + "metadata": {}, + "outputs": [], + "source": [ + "results[0] = bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "searching-funeral", + "metadata": {}, + "source": [ + "The number in brackets is the time stamp, also called a **label**.\n", + "\n", + "We can use a `TimeSeries` inside a for loop to store the results of the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "english-titanium", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(3):\n", + " print(i)\n", + " step(0.6, 0.6)\n", + " results[i+1] = bikeshare.olin" + ] + }, + { + "cell_type": "markdown", + "id": "prospective-joining", + "metadata": {}, + "source": [ + "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", + "Then we store the number of bikes at Olin in `results`. \n", + "We use the loop variable, `i`, to compute the time stamp, `i+1`.\n", + "\n", + "The first time through the loop, the value of `i` is `0`, so the time stamp is `1`.\n", + "The last time, the value of `i` is `2`, so the time stamp is `3`.\n", + "\n", + "When the loop exits, `results` contains 4 time stamps, from 0 through\n", + "3, and the number of bikes at Olin at the end of each time step.\n", + "\n", + "We can display the `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "indonesian-singing", + "metadata": {}, + "outputs": [], + "source": [ + "results" + ] + }, + { + "cell_type": "markdown", + "id": "small-encoding", + "metadata": {}, + "source": [ + "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", + "\n", + "At the bottom, `dtype` is the type of the data in the `TimeSeries`; you can ignore this for now.\n", + "\n", + "The `show` function displays a `TimeSeries` as a table:" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "verbal-bikini", + "metadata": {}, + "outputs": [], + "source": [ + "show(results)" + ] + }, + { + "cell_type": "markdown", + "id": "following-contrary", + "metadata": {}, + "source": [ + "## Plotting\n", + "\n", + "`results` provides a function called `plot` we can use to plot\n", + "the results, and the ModSim library provides `decorate`, which we can use to label the axes and give the figure a title:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "saved-hands", + "metadata": {}, + "outputs": [], + "source": [ + "results.plot()\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "markdown", + "id": "limited-interstate", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces the tools we need to run simulations, record the results, and plot them.\n", + "\n", + "We used a `State` object to represent the state of the system.\n", + "Then we used the `flip` function and an `if` statement to simulate a single time step.\n", + "We used `for` loop to simulate a series of steps, and a `TimeSeries` to record the results.\n", + "Finally, we used `plot` and `decorate` to plot the results.\n", + "\n", + "In the next chapter, we will extend this simulation to make it a little more realistic." + ] + }, + { + "cell_type": "markdown", + "id": "fallen-surprise", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "capital-internship", + "metadata": {}, + "source": [ + "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the following cell, change the spelling of `wellesley`, and run it.\n", + "\n", + "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "helpful-zambia", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "\n", + "bikeshare.wellesley" + ] + }, + { + "cell_type": "markdown", + "id": "dirty-multiple", + "metadata": {}, + "source": [ + "**Exercise:** Make a `State` object with a third state variable, called `babson`, with initial value 0, and display the state of the system." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "beneficial-mainland", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "christian-madrid", + "metadata": {}, + "source": [ + "**Exercise:** Wrap the code in the chapter in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", + "\n", + "It should:\n", + "\n", + "1. Create a `TimeSeries` object to hold the results.\n", + "\n", + "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", + "\n", + "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", + "\n", + "4. After the for loop, it should plot the results and\n", + "\n", + "5. Decorate the axes.\n", + "\n", + "To test your function:\n", + "\n", + "1. Create a `State` object with the initial state of the system.\n", + "\n", + "2. Call `run_simulation` with appropriate parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "former-frost", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "spare-honduras", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "instructional-finnish", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "This section contains additional information about the functions we've used and pointers to their documentation.\n", + "\n", + "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." + ] + }, + { + "cell_type": "markdown", + "id": "quick-citizen", + "metadata": {}, + "source": [ + "`State` and `TimeSeries` objects are based on the `Series` object defined by a the Pandas library.\n", + "The documentation is at .\n", + "\n", + "`show` works by creating another Pandas object, called a `DataFrame`, which can be displayed as a table.\n", + "We'll use `DataFrame` objects in future chapters.\n", + "\n", + "`Series` objects provide their own `plot` function which is why we call it like this:\n", + "\n", + "```\n", + "results.plot()\n", + "```\n", + "\n", + "Instead of like this:\n", + "\n", + "```\n", + "plot(results)\n", + "```\n", + "\n", + "You can read the documentation of `Series.plot` at ." + ] + }, + { + "cell_type": "markdown", + "id": "digital-stretch", + "metadata": {}, + "source": [ + "`decorate` is based on Matplotlib, which is a widely-used plotting library for Python. Matplotlib provides separate functions for `title`, `xlabel`, and `ylabel`.\n", + "`decorate` makes them a little easier to use.\n", + "For the list of keyword arguments you can pass to `decorate`, see .\n", + "\n", + "The `flip` function uses NumPy's `random` function to generate a random number between 0 and 1, then returns `True` or `False` with the given probability.\n", + "\n", + "You can get the source code for `flip` (or any other function) by running the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "agricultural-midwest", + "metadata": {}, + "outputs": [], + "source": [ + "source_code(flip)" + ] + }, + { + "cell_type": "markdown", + "id": "running-membership", + "metadata": {}, + "source": [ + "You might not understand everything in this function yet, but you will." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "junior-lindsay", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb new file mode 100644 index 00000000..f905d62f --- /dev/null +++ b/chapters/chap03.ipynb @@ -0,0 +1,834 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "signal-format", + "metadata": {}, + "source": [ + "# Chapter 3" + ] + }, + { + "cell_type": "markdown", + "id": "welcome-gentleman", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "coral-steering", + "metadata": {}, + "source": [ + "To paraphrase two Georges, \"All models are wrong, but some models are\n", + "more wrong than others.\" In this chapter, I demonstrate the process we\n", + "use to make models less wrong.\n", + "\n", + "As an example, we'll review the bikeshare model from the previous\n", + "chapter, consider its strengths and weaknesses, and gradually improve\n", + "it. We'll also see ways to use the model to understand the behavior of\n", + "the system and evaluate designs intended to make it work better." + ] + }, + { + "cell_type": "markdown", + "id": "twelve-length", + "metadata": {}, + "source": [ + "## Iterative modeling\n", + "\n", + "The model we have so far is simple, but it is based on unrealistic\n", + "assumptions. Before you go on, take a minute to review the model from\n", + "the previous chapter. What assumptions is it based on? Make a list of\n", + "ways this model might be unrealistic; that is, what are the differences between the model and the real world?\n", + "\n", + "Here are some of the differences on my list:\n", + "\n", + "- In the model, a student is equally likely to arrive during any\n", + " one-minute period. In reality, this probability varies depending on time of day, day of the week, etc.\n", + "\n", + "- The model does not account for travel time from one bike station to another.\n", + "\n", + "- The model does not check whether a bike is available, so it's\n", + " possible for the number of bikes to be negative (as you might have\n", + " noticed in some of your simulations)." + ] + }, + { + "cell_type": "markdown", + "id": "sweet-heater", + "metadata": {}, + "source": [ + "Some of these modeling decisions are better than others. For example,\n", + "the first assumption might be reasonable if we simulate the system for a short period of time, like one hour.\n", + "\n", + "The second assumption is not very realistic, but it might not affect the results very much, depending on what we use the model for.\n", + "\n", + "On the other hand, the third assumption seems problematic, and it is\n", + "relatively easy to fix. In this chapter, we will.\n", + "\n", + "This process, starting with a simple model, identifying the most\n", + "important problems, and making gradual improvements, is called\n", + "**iterative modeling**.\n", + "\n", + "For any physical system, there are many possible models, based on\n", + "different assumptions and simplifications. It often takes several\n", + "iterations to develop a model that is good enough for the intended\n", + "purpose, but no more complicated than necessary." + ] + }, + { + "cell_type": "markdown", + "id": "female-salem", + "metadata": {}, + "source": [ + "## More than one State object\n", + "\n", + "Before we go on, I want to make a few changes to the code from the\n", + "previous chapter. First I'll generalize the functions we wrote so they\n", + "take a `State` object as a parameter. Then, I'll make the code more\n", + "readable by adding documentation.\n", + "\n", + "Here is one of the functions from the previous chapter, `bike_to_wellesley`:" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "embedded-heavy", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "artificial-remains", + "metadata": {}, + "source": [ + "When this function is called, it modifies `bikeshare`. As long as there\n", + "is only one `State` object, that's fine, but what if there is more than\n", + "one bike share system in the world? Or what if we want to run more than\n", + "one simulation?\n", + "\n", + "This function would be more flexible if it took a `State` object as a\n", + "parameter. Here's what that looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "unusual-advancement", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "serial-mortality", + "metadata": {}, + "source": [ + "The name of the parameter is `state` rather than `bikeshare` as a\n", + "reminder that the value of `state` could be any `State` object, not just\n", + "`bikeshare`.\n", + "\n", + "This version of `bike_to_wellesley` requires a `State` object as a\n", + "parameter, so we have to provide one when we call it:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "packed-hungarian", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "bike_to_wellesley(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "fewer-rhythm", + "metadata": {}, + "source": [ + "Again, the argument we provide gets assigned to the parameter, so this\n", + "function call has the same effect as:\n", + "\n", + "```\n", + "state = bikeshare \n", + "state.olin -= 1 \n", + "state.wellesley += 1\n", + "```\n", + "\n", + "Now we can create as many `State` objects as we want:" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "right-assessment", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare1 = State(olin=10, wellesley=2)\n", + "bikeshare2 = State(olin=2, wellesley=10)" + ] + }, + { + "cell_type": "markdown", + "id": "occupied-navigator", + "metadata": {}, + "source": [ + "And update them independently:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "cleared-advocacy", + "metadata": {}, + "outputs": [], + "source": [ + "bike_to_wellesley(bikeshare1)\n", + "bike_to_wellesley(bikeshare2)" + ] + }, + { + "cell_type": "markdown", + "id": "brown-ferry", + "metadata": {}, + "source": [ + "Changes in `bikeshare1` do not affect `bikeshare2`, and vice versa. So\n", + "we can simulate different bike share systems, or run multiple\n", + "simulations of the same system." + ] + }, + { + "cell_type": "markdown", + "id": "magnetic-packing", + "metadata": {}, + "source": [ + "## Documentation\n", + "\n", + "Another problem with the code we have so far is that it contains no\n", + "**documentation**. Documentation is text we add to a program to help\n", + "other programmers read and understand it. It has no effect on the\n", + "program when it runs.\n", + "\n", + "There are two forms of documentation, **docstrings** and **comments**:\n", + "\n", + "* A docstring is a string in triple-quotes that appears at the beginning of a function.\n", + "\n", + "* A comment is a line of text that begins with a hash symbol, `#`.\n", + "\n", + "Here's a version of `bike_to_olin` with a docstring and a comment." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "moral-parallel", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " # We decrease one state variable and increase the\n", + " # other, so the total number of bikes is unchanged.\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-utility", + "metadata": {}, + "source": [ + "Docstrings follow a conventional format:\n", + "\n", + "- The first line is a single sentence that describes what the function does.\n", + "\n", + "- The following lines explain what the parameters are.\n", + "\n", + "A function's docstring should include the information someone needs to\n", + "know to *use* the function; it should not include details about how the function works.\n", + "\n", + "Comments provide details about how the function works, especially if there is something that would not be obvious to someone reading the program." + ] + }, + { + "cell_type": "markdown", + "id": "american-clear", + "metadata": {}, + "source": [ + "## Negative bikes\n", + "\n", + "The changes we've made so far improve the quality of the code, but we\n", + "haven't done anything to improve the quality of the model yet. Let's do that now.\n", + "\n", + "Currently the simulation does not check whether a bike is available when a customer arrives, so the number of bikes at a location can be\n", + "negative. That's not very realistic. Here's a version of\n", + "`bike_to_olin` that fixes the problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "divine-leisure", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " if state.wellesley == 0:\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "decimal-denver", + "metadata": {}, + "source": [ + "The first line checks whether the number of bikes at Wellesley is zero. If so, it uses a **return statement**, which causes the function to end immediately, without running the rest of the statements. So if there are no bikes at Wellesley, we \"return\" from `bike_to_olin` without changing the state.\n", + "\n", + "We can test it by initializing the state with no bikes at Wellesley And calling `bike_to_olin`." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "choice-cooking", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=12, wellesley=0)\n", + "bike_to_olin(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "persistent-denmark", + "metadata": {}, + "source": [ + "The state of the system should be unchanged." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "twelve-moderator", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "criminal-general", + "metadata": {}, + "source": [ + "No more negative bikes (at least at Wellesley)." + ] + }, + { + "cell_type": "markdown", + "id": "gorgeous-found", + "metadata": {}, + "source": [ + "## Comparison operators\n", + "\n", + "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True` if they are equal and `False` otherwise.\n", + "\n", + "It is easy to confuse the equals operators with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "level-burns", + "metadata": {}, + "outputs": [], + "source": [ + "x = 5" + ] + }, + { + "cell_type": "markdown", + "id": "weighted-monster", + "metadata": {}, + "source": [ + "On the other hand, the following statement checks whether `x` is `5` and\n", + "returns `True` or `False`. It does not create `x` or change its value." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "civic-remains", + "metadata": {}, + "outputs": [], + "source": [ + "x == 5" + ] + }, + { + "cell_type": "markdown", + "id": "forward-perth", + "metadata": {}, + "source": [ + "You can use the equals operator in an `if` statement, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "affecting-naples", + "metadata": {}, + "outputs": [], + "source": [ + "if x == 5:\n", + " print('yes, x is 5')" + ] + }, + { + "cell_type": "markdown", + "id": "consolidated-anatomy", + "metadata": {}, + "source": [ + "If you make a mistake and use `=` in an `if` statement, like this:\n", + "\n", + "```\n", + "if x = 5:\n", + " print('yes, x is 5')\n", + "```\n", + "\n", + "That's a **syntax error**, which means that the structure of the program is invalid. Python will print an error message and the program won't run." + ] + }, + { + "cell_type": "markdown", + "id": "twelve-defensive", + "metadata": {}, + "source": [ + "The equals operator is one of the **comparison operators**. The others\n", + "are:\n", + "\n", + "| Operation \t| Symbol \t|\n", + "|-----------------------\t|--------\t|\n", + "| Less than \t| `<` \t|\n", + "| Greater than \t| `>` \t|\n", + "| Less than or equal \t| `<=` \t|\n", + "| Greater than or equal \t| `>=` \t|\n", + "| Equal \t| `==` \t|\n", + "| Not equal \t| `!=` \t|" + ] + }, + { + "cell_type": "markdown", + "id": "center-sequence", + "metadata": {}, + "source": [ + "## Metrics\n", + "\n", + "Getting back to the bike share system, at this point we have the ability to simulate the behavior of the system. Since the arrival of customers is random, the state of the system is different each time we run a\n", + "simulation. Models like this are called random or **stochastic**; models\n", + "that do the same thing every time they run are **deterministic**.\n", + "\n", + "Suppose we want to use our model to predict how well the bike share\n", + "system will work, or to design a system that works better. First, we\n", + "have to decide what we mean by \"how well\" and \"better\".\n", + "\n", + "From the customer's point of view, we might like to know the probability of finding an available bike. From the system-owner's point of view, we\n", + "might want to minimize the number of customers who don't get a bike when\n", + "they want one, or maximize the number of bikes in use. Statistics like\n", + "these that quantify how well the system works are called **metrics**.\n", + "\n", + "As a simple example, let's measure the number of unhappy customers.\n", + "Here's a version of `bike_to_olin` that keeps track of the number of\n", + "customers who arrive at a station with no bikes:" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "arbitrary-ferry", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "markdown", + "id": "severe-contact", + "metadata": {}, + "source": [ + "If a customer arrives at the Wellesley station and finds no bike\n", + "available, `bike_to_olin` updates `wellesley_empty` which counts the\n", + "number of unhappy customers.\n", + "\n", + "This function only works if we initialize `wellesley_empty` when we\n", + "create the `State` object, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "cardiovascular-montgomery", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare = State(olin=12, wellesley=0, \n", + " wellesley_empty=0)" + ] + }, + { + "cell_type": "markdown", + "id": "computational-prior", + "metadata": {}, + "source": [ + "We can test it by calling `bike_to_olin`:" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "cosmetic-above", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "bike_to_olin(bikeshare)" + ] + }, + { + "cell_type": "markdown", + "id": "pleased-gasoline", + "metadata": {}, + "source": [ + "There should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "bulgarian-palestine", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "revised-associate", + "metadata": {}, + "source": [ + "Looks good!" + ] + }, + { + "cell_type": "markdown", + "id": "native-kidney", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter, we wrote several versions of `bike_to_olin`:\n", + "\n", + "* We added a parameter, `state`, so we can work with more than one `State` object.\n", + "\n", + "* We added a docstring that explains how to use the function and a comment that explains how it works.\n", + "\n", + "* We used a conditional operator, `==`, to check whether a bike is available, in order to avoid negative bikes.\n", + "\n", + "* We added a state variable, `wellesley_empty`, to count the number of unhappy customers, which is a metric we'll use to quantify how well the system works.\n", + "\n", + "In the exercises, you'll update `bike_to_wellesley` the same way and test it by running a simulation." + ] + }, + { + "cell_type": "markdown", + "id": "impaired-cyprus", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "careful-hacker", + "metadata": {}, + "source": [ + "Here's the code we have so far, with docstrings, all in one place." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "wrong-internet", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation(state, p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " state: State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[0] = state.olin\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " results[i+1] = state.olin\n", + " \n", + " results.plot(label='Olin')\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "instrumental-copyright", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def step(state, p1, p2):\n", + " \"\"\"Simulate one time step.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley ride\n", + " p2: probability of a Wellesley->Olin ride\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "improved-renaissance", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "unavailable-maker", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "bigger-rapid", + "metadata": {}, + "source": [ + "**Exercise:** Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add one to `olin_empty`.\n", + "\n", + "To test it, create a `State` that initializes `olin` and `olin_empty` to `0`, run `bike_to_wellesley`, and check the result." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "phantom-carter", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "adopted-contrary", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "comparable-natural", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "attractive-amendment", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "possible-initial", + "metadata": {}, + "source": [ + "**Exercise:** Now run the simulation a few times and confirm that the number of bikes is never negative. What's the final state of the system?" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "immune-shock", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "sporting-collectible", + "metadata": {}, + "outputs": [], + "source": [ + "bikeshare" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb new file mode 100644 index 00000000..03a177b0 --- /dev/null +++ b/chapters/chap04.ipynb @@ -0,0 +1,853 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "existing-guidance", + "metadata": {}, + "source": [ + "# Chapter 4" + ] + }, + { + "cell_type": "markdown", + "id": "hawaiian-detective", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "caring-gnome", + "metadata": {}, + "source": [ + "Here the code from previous chapters we'll reuse." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "stylish-raising", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def step(state, p1, p2):\n", + " \"\"\"Simulate one time step.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley ride\n", + " p2: probability of a Wellesley->Olin ride\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "wound-bottle", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "prescribed-affect", + "metadata": {}, + "outputs": [], + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1" + ] + }, + { + "cell_type": "markdown", + "id": "atlantic-collectible", + "metadata": {}, + "source": [ + "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the Customer rate of customers at bike stations.\n", + "\n", + "We also discuss a program development strategy, called incremental\n", + "development, that might help you write programs faster and spend less\n", + "time debugging." + ] + }, + { + "cell_type": "markdown", + "id": "strategic-newspaper", + "metadata": {}, + "source": [ + "## Functions that return values\n", + "\n", + "We have seen several functions that return values; for example, when you run `sqrt`, it returns a number you can assign to a variable." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "imposed-pregnancy", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sqrt\n", + "\n", + "root_2 = sqrt(2)\n", + "root_2" + ] + }, + { + "cell_type": "markdown", + "id": "unsigned-recipe", + "metadata": {}, + "source": [ + "When you run `State`, it returns a new `State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "accessible-wallace", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "bikeshare" + ] + }, + { + "cell_type": "markdown", + "id": "missing-pendant", + "metadata": {}, + "source": [ + "Not all functions have return values. For example, when you run `step`,\n", + "it updates a `State` object, but it doesn't return a value.\n", + "\n", + "To write functions that return values, we can use a `return` statement, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "minimal-supervisor", + "metadata": {}, + "outputs": [], + "source": [ + "def add_five(x):\n", + " return x + 5" + ] + }, + { + "cell_type": "markdown", + "id": "sized-intensity", + "metadata": {}, + "source": [ + "`add_five` takes a parameter, `x`, which could be any number. It\n", + "computes `x + 5` and returns the result. So if we run it like this, the\n", + "result is `8`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "warming-program", + "metadata": {}, + "outputs": [], + "source": [ + "add_five(3)" + ] + }, + { + "cell_type": "markdown", + "id": "rental-representation", + "metadata": {}, + "source": [ + "As a more useful example, here's a version of `run_simulation` that\n", + "creates a `State` object, runs a simulation, and then returns the\n", + "`State` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "sitting-cleveland", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation(p1, p2, num_steps):\n", + " state = State(olin=10, wellesley=2,\n", + " olin_empty=0, wellesley_empty=0)\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " \n", + " return state" + ] + }, + { + "cell_type": "markdown", + "id": "minimal-ability", + "metadata": {}, + "source": [ + "We can call `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "difficult-shepherd", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = run_simulation(0.3, 0.2, 60)" + ] + }, + { + "cell_type": "markdown", + "id": "charming-wheel", + "metadata": {}, + "source": [ + "The result is a `State` object that represents the final state of the system, including the metrics we'll use to evaluate the performance of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "tough-sweet", + "metadata": {}, + "outputs": [], + "source": [ + "print(final_state.olin_empty, \n", + " final_state.wellesley_empty)" + ] + }, + { + "cell_type": "markdown", + "id": "aggregate-lightweight", + "metadata": {}, + "source": [ + "The simulation we just ran starts with `olin=10` and `wellesley=2`, and uses the values `p1=0.3`, `p2=0.2`, and `num_steps=60`. \n", + "These five values are **parameters of the model**, which are quantities that determine the behavior of the system.\n", + "\n", + "It is easy to get the parameters of a model confused with the parameters of a function. \n", + "In fact, it is common for the parameters of the model to appear as parameters in functions. \n", + "\n", + "For example, the previous version of `run_simulation` takes `p1`, `p2`, and `num_steps` as parameters.\n", + "So we can call `run_simulation` with different parameters and see how\n", + "the metrics, like the number of unhappy customers, depend on the\n", + "parameters. But before we do that, we need a new version of a `for` loop." + ] + }, + { + "cell_type": "markdown", + "id": "valuable-aircraft", + "metadata": {}, + "source": [ + "## Loops and arrays\n", + "\n", + "In `run_simulation`, we use this `for` loop:\n", + "\n", + "```\n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + "```\n", + "\n", + "In this example, `range` creates a sequence of numbers from 0 to `num_steps` (including `0` but not `num_steps`). \n", + "Each time through the loop, the next number in the sequence gets assigned to the loop variable, `i`.\n", + "\n", + "But `range` only works with integers; to get a sequence of non-integer\n", + "values, we can use `linspace`, which is defined NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "bound-juice", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "p1_array = linspace(0, 1, 5)\n", + "p1_array" + ] + }, + { + "cell_type": "markdown", + "id": "ordered-colleague", + "metadata": {}, + "source": [ + "The arguments indicate where the sequence should start and stop, and how\n", + "many elements it should contain. In this example, the sequence contains\n", + "`5` equally-spaced numbers, starting at `0` and ending at `1`.\n", + "\n", + "The result is a NumPy **array**, which is a new kind of object we have\n", + "not seen before. An array is a container for a sequence of numbers.\n", + "\n", + "We can use an array in a `for` loop like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "commercial-methodology", + "metadata": {}, + "outputs": [], + "source": [ + "for p1 in p1_array:\n", + " print(p1)" + ] + }, + { + "cell_type": "markdown", + "id": "finnish-budapest", + "metadata": {}, + "source": [ + "When this loop runs, it\n", + "\n", + "1. Gets the first value from the array and assigns it to `p1`.\n", + "\n", + "2. Runs the body of the loop, which prints `p1`.\n", + "\n", + "3. Gets the next value from the array and assigns it to `p1`.\n", + "\n", + "4. Runs the body of the loop, which prints `p1`.\n", + "\n", + "And so on, until it gets to the end of the array. This will come in handy in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "crazy-belize", + "metadata": {}, + "source": [ + "## Sweeping parameters\n", + "\n", + "If we know the actual values of parameters like `p1` and `p2`, we can\n", + "use them to make specific predictions, like how many bikes will be at\n", + "Olin after one hour.\n", + "\n", + "But prediction is not the only goal; models like this are also used to\n", + "explain why systems behave as they do and to evaluate alternative\n", + "designs. For example, if we observe the system and notice that we often run out of bikes at a particular time, we could use the model to figure out why that happens. And if we are considering adding more bikes, or another station, we could evaluate the effect of various \"what if\" scenarios.\n", + "\n", + "As an example, suppose we have enough data to estimate that `p2` is\n", + "about `0.2`, but we don't have any information about `p1`. We could run simulations with a range of values for `p1` and see how the results vary. This process is called **sweeping** a parameter, in the sense that the value of the parameter \"sweeps\" through a range of possible values.\n", + "\n", + "Now that we know about loops and arrays, we can use them like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "working-chair", + "metadata": {}, + "outputs": [], + "source": [ + "p1_array = linspace(0, 0.6, 6)\n", + "p2 = 0.2\n", + "num_steps = 60\n", + "\n", + "for p1 in p1_array:\n", + " final_state = run_simulation(p1, p2, num_steps)\n", + " print(p1, final_state.olin_empty)" + ] + }, + { + "cell_type": "markdown", + "id": "chicken-mainstream", + "metadata": {}, + "source": [ + "Each time through the loop, we run a simulation with a different value\n", + "of `p1` and the same value of `p2`, `0.2`. Then we print `p1` and the\n", + "number of unhappy customers at Olin.\n", + "\n", + "To save and plot the results, we can use a `SweepSeries` object, which\n", + "is similar to a `TimeSeries`; the difference is that the labels in a\n", + "`SweepSeries` are parameter values rather than time values.\n", + "\n", + "We can create an empty `SweepSeries` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "instrumental-session", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "sweep = SweepSeries()" + ] + }, + { + "cell_type": "markdown", + "id": "listed-orleans", + "metadata": {}, + "source": [ + "And add values like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "hollywood-technical", + "metadata": {}, + "outputs": [], + "source": [ + "for p1 in p1_array:\n", + " final_state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1] = final_state.olin_empty" + ] + }, + { + "cell_type": "markdown", + "id": "instructional-showcase", + "metadata": {}, + "source": [ + "The result is a `SweepSeries` that maps from each value of `p1` to the\n", + "resulting number of unhappy customers. Then we can plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "hollywood-spirit", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "sweep.plot(label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Customer rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ] + }, + { + "cell_type": "markdown", + "id": "intense-start", + "metadata": {}, + "source": [ + "NumPy provides functions that compute a variety of summary statistics, like `mean`, `median`, and `std` (which computes standard deviation).\n", + "\n", + "We can use `mean` to compute the average of the values in a series, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "contemporary-enough", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import mean\n", + "\n", + "mean(sweep)" + ] + }, + { + "cell_type": "markdown", + "id": "owned-senior", + "metadata": {}, + "source": [ + "In this example, computing the mean might not be useful, but in the exercises below, it will be." + ] + }, + { + "cell_type": "markdown", + "id": "korean-christianity", + "metadata": {}, + "source": [ + "## Incremental development\n", + "\n", + "When you start writing programs that are more than a few lines, you\n", + "might find yourself spending more and more time debugging. The more code you write before you start debugging, the harder it is to find the problem.\n", + "\n", + "**Incremental development** is a way of programming that tries to\n", + "minimize the pain of debugging. The fundamental steps are:\n", + "\n", + "1. Always start with a working program. If you have an example from a\n", + " book, or a program you wrote that is similar to what you are working\n", + " on, start with that. Otherwise, start with something you *know* is\n", + " correct, like `x=5`. Run the program and confirm that it does what\n", + " you expect.\n", + "\n", + "2. Make one small, testable change at a time. A \"testable\" change is\n", + " one that displays something or has some other effect you can check.\n", + " Ideally, you should know what the correct answer is, or be able to\n", + " check it by performing another computation.\n", + "\n", + "3. Run the program and see if the change worked. If so, go back to\n", + " Step 2. If not, you will have to do some debugging, but if the\n", + " change you made was small, it shouldn't take long to find the\n", + " problem.\n", + "\n", + "When this process works, your changes usually work the first time, or if they don't, the problem is obvious. In practice, there are two problems with incremental development:\n", + "\n", + "- Sometimes you have to write extra code to generate visible output\n", + " that you can check. This extra code is called **scaffolding**\n", + " because you use it to build the program and then remove it when you\n", + " are done. That might seem like a waste, but time you spend on\n", + " scaffolding is almost always time you save on debugging.\n", + "\n", + "- When you are getting started, it might not be obvious how to choose\n", + " the steps that get from `x=5` to the program you are trying to\n", + " write. You will see more examples of this process as we go along,\n", + " and you will get better with experience.\n", + "\n", + "If you find yourself writing more than a few lines of code before you\n", + "start testing, and you are spending a lot of time debugging, try\n", + "incremental development." + ] + }, + { + "cell_type": "markdown", + "id": "nominated-assault", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "appreciated-preview", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "primary-quest", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", + "\n", + "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "reflected-freedom", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "north-formation", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "robust-blair", + "metadata": {}, + "source": [ + "**Exercise:** Read the documentation of `linspace` at <>.\n", + "Then use it to make an array of 101 equally spaced points between 0 and 1 (including both)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "collected-butter", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "fleet-debut", + "metadata": {}, + "source": [ + "**Exercise:** Wrap the code from this chapter in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", + "\n", + "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "authorized-sarah", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "romance-wisdom", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "developmental-broad", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "norman-banana", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "mexican-robert", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "separate-mention", + "metadata": {}, + "source": [ + "## Optional Exercises\n", + "\n", + "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now." + ] + }, + { + "cell_type": "markdown", + "id": "bearing-orbit", + "metadata": {}, + "source": [ + "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", + "\n", + "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", + "\n", + "`num_runs` specifies how many times it should call `run_simulation`.\n", + "\n", + "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`.\n", + "At the end, it should return the `TimeSeries`.\n", + "\n", + "Test your function with parameters\n", + "\n", + "```\n", + "p1 = 0.3\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 10\n", + "```\n", + "\n", + "Display the resulting `TimeSeries` and use the `mean` function from NumPy to compute the average number of unhappy customers." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "accredited-salmon", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "visible-allowance", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "spatial-fundamentals", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "structural-expense", + "metadata": {}, + "source": [ + "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", + "\n", + "```\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 20\n", + "```\n", + "\n", + "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", + "\n", + "What value of `p1` minimizes the average number of unhappy customers?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "reverse-emphasis", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "broad-latitude", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "powerful-planner", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb new file mode 100644 index 00000000..99dd47af --- /dev/null +++ b/chapters/chap05.ipynb @@ -0,0 +1,1000 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "wicked-mozambique", + "metadata": {}, + "source": [ + "# Chapter 5" + ] + }, + { + "cell_type": "markdown", + "id": "inclusive-theater", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-genealogy", + "metadata": {}, + "source": [ + "In this chapter..." + ] + }, + { + "cell_type": "markdown", + "id": "informal-contractor", + "metadata": {}, + "source": [ + "# World population\n", + "\n", + "In 1968 Paul Erlich published *The Population Bomb*, in which he\n", + "predicted that world population would grow quickly during the 1970s,\n", + "that agricultural production could not keep up, and that mass starvation\n", + "in the next two decades was inevitable (see\n", + "). As someone who grew up during those\n", + "decades, I am happy to report that those predictions were wrong.\n", + "\n", + "But world population growth is still a topic of concern, and it is an\n", + "open question how many people the earth can sustain while maintaining\n", + "and improving our quality of life.\n", + "\n", + "In this chapter and the next, we use tools from the previous chapters to\n", + "explain world population growth since 1950 and generate predictions for\n", + "the next 50-100 years.\n", + "\n", + "For background on world population growth, watch this video from the\n", + "American Museum of Natural History ." + ] + }, + { + "cell_type": "markdown", + "id": "dying-browse", + "metadata": {}, + "source": [ + "## World Population Data\n", + "\n", + "The Wikipedia article on world population contains tables with estimates of world population from prehistory to the present, and projections for the future ()." + ] + }, + { + "cell_type": "markdown", + "id": "continuing-cancellation", + "metadata": {}, + "source": [ + "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "convenient-stroke", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "markdown", + "id": "acknowledged-bracelet", + "metadata": {}, + "source": [ + "To read this data, we will use Pandas, which provides functions for\n", + "working with data. The function we'll use is `read_html`, which can read a web page and extract data from any tables it contains. Before we can use it, we have to import it. You have already seen this import\n", + "statement:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "israeli-finding", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html" + ] + }, + { + "cell_type": "markdown", + "id": "regulation-parade", + "metadata": {}, + "source": [ + "Now we can use it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "instant-beverage", + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'World_population_estimates.html'\n", + "tables = read_html(filename,\n", + " header=0, \n", + " index_col=0,\n", + " decimal='M')" + ] + }, + { + "cell_type": "markdown", + "id": "dried-immunology", + "metadata": {}, + "source": [ + "The arguments are:\n", + "\n", + "- `filename`: The name of the file (including the directory it's in)\n", + " as a string. This argument can also be a URL starting with `http`.\n", + "\n", + "- `header`: Indicates which row of each table should be considered the\n", + " header, that is, the set of labels that identify the columns. In\n", + " this case it is the first row (numbered 0).\n", + "\n", + "- `index_col`: Indicates which column of each table should be\n", + " considered the **index**, that is, the set of labels that identify\n", + " the rows. In this case it is the first column, which contains the\n", + " years.\n", + "\n", + "- `decimal`: Normally this argument is used to indicate which\n", + " character should be considered a decimal point, because some\n", + " conventions use a period and some use a comma. In this case I am\n", + " abusing the feature by treating `M` as a decimal point, which allows\n", + " some of the estimates, which are expressed in millions, to be read\n", + " as numbers.\n", + "\n", + "The result, which is assigned to `tables`, is a sequence that contains\n", + "one `DataFrame` for each table. A `DataFrame` is an object, defined by\n", + "Pandas, that represents tabular data.\n", + "\n", + "To select a `DataFrame` from `tables`, we can use the bracket operator\n", + "like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "driving-wrapping", + "metadata": {}, + "outputs": [], + "source": [ + "table2 = tables[2]" + ] + }, + { + "cell_type": "markdown", + "id": "simplified-convert", + "metadata": {}, + "source": [ + "This line selects the third table (numbered 2), which contains\n", + "population estimates from 1950 to 2016.\n", + "\n", + "We can use `head` to display the first few lines of the table." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "running-alcohol", + "metadata": {}, + "outputs": [], + "source": [ + "table2.head()" + ] + }, + { + "cell_type": "markdown", + "id": "valid-editing", + "metadata": {}, + "source": [ + "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", + "\n", + "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", + "\n", + "`NaN` is a special value that indicates missing data." + ] + }, + { + "cell_type": "markdown", + "id": "plastic-senate", + "metadata": {}, + "source": [ + "The column labels are long strings, which makes them hard to work with.\n", + "We can replace them with shorter strings like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "engaging-regular", + "metadata": {}, + "outputs": [], + "source": [ + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "communist-crowd", + "metadata": {}, + "source": [ + "Now we can select a column from the `DataFrame` using the dot operator,\n", + "like selecting a state variable from a `State` object.\n", + "\n", + "Here are the estimates from the United States Census Bureau:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "amended-negative", + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9" + ] + }, + { + "cell_type": "markdown", + "id": "absent-heart", + "metadata": {}, + "source": [ + "The result is a Pandas `Series`, which is similar to the `TimeSeries` and `SweepSeries` objects we've been using.\n", + "\n", + "The number `1e9` is a shorter way to write `1000000000` or one billion.\n", + "When we divide a `Series` by a number, it divides all of the elements of the `Series`.\n", + "From here on, we'll express population estimates in terms of billions.\n", + "\n", + "We can use `tail` to see the last few elements of the `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "graduate-specialist", + "metadata": {}, + "outputs": [], + "source": [ + "census.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "brilliant-brook", + "metadata": {}, + "source": [ + "The left column is the **index** of the `Series`; in this example it contains the dates.\n", + "The right column contains the **values**, which are population estimates.\n", + "In 2016 the world population was about 7.3 billion.\n", + "\n", + "Here are the estimates from the United Nations\n", + "Department of Economic and Social Affairs (U.N. DESA):" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "linear-admission", + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "un.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "mental-sussex", + "metadata": {}, + "source": [ + "The most recent estimate we have from the U.N. is for 2015, so the value for 2016 is `NaN`.\n", + "\n", + "Now we can plot the estimates like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ordered-garage", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)') " + ] + }, + { + "cell_type": "markdown", + "id": "invisible-mouse", + "metadata": {}, + "source": [ + "The keyword argument `style=':'` specifies a dotted line; `style='--'` specifies a dashed line.\n", + "The `label` argument provides the string that appears in the legend.\n", + "\n", + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "periodic-weekend", + "metadata": {}, + "outputs": [], + "source": [ + "plot_estimates()\n", + "decorate(title='World Population Estimates')" + ] + }, + { + "cell_type": "markdown", + "id": "labeled-magic", + "metadata": {}, + "source": [ + "The lines overlap almost completely, but the most recent estimates diverge slightly.\n", + "In the next section, we'll quantify these differences." + ] + }, + { + "cell_type": "markdown", + "id": "tender-summer", + "metadata": {}, + "source": [ + "## Absolute and relative errors\n", + "\n", + "Estimates of world population from the U.S. Census and the U.N. DESA differ slightly.\n", + "One way to characterize this difference is **absolute error**, which is the absolute value of the difference between the two.\n", + "\n", + "To compute absolute value, we can import `abs` from NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "secondary-player", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import abs" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "caring-garlic", + "metadata": {}, + "outputs": [], + "source": [ + "abs_error = abs(un - census)\n", + "abs_error.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "bridal-extraction", + "metadata": {}, + "source": [ + "When you subtract two `Series` objects, the result is a new `Series`.\n", + "Because one of the estimates from 2016 is `NaN`, the result is `NaN`.\n", + "\n", + "To summarize the results, we can compute the **mean absolute error**." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "corresponding-emerald", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import mean\n", + "\n", + "mean(abs_error)" + ] + }, + { + "cell_type": "markdown", + "id": "identical-archive", + "metadata": {}, + "source": [ + "On average, the estimates differ by about 0.029 billion.\n", + "But we can also use `max` to compute the maximum absolute error." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "headed-witch", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from numpy import max\n", + "\n", + "max(abs_error)" + ] + }, + { + "cell_type": "markdown", + "id": "composite-partnership", + "metadata": {}, + "source": [ + "In the worst case, they differ by about 0.1 billion.\n", + "\n", + "Now 0.1 billion is a lot of people, so that might sound like a serious discrepancy.\n", + "But counting everyone is the world is hard, and we should not expect the estimates to be exact.\n", + "\n", + "Another way to quantify the magnitude of the difference is **relative error**, which is the size of the error divided by the estimates themselves." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "advisory-complex", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "rel_error = abs_error / census * 100\n", + "rel_error.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "greater-register", + "metadata": {}, + "source": [ + "I multiplied by 100 so we can interpret the results as a percentage. In 2015, the difference between the estimates is about 1.4%, and that happens to be the maximum.\n", + "\n", + "Again, we can summarize the results by computing the mean." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "frank-owner", + "metadata": {}, + "outputs": [], + "source": [ + "mean(rel_error)" + ] + }, + { + "cell_type": "markdown", + "id": "peaceful-fleece", + "metadata": {}, + "source": [ + "The mean relative error is about 0.6%.\n", + "So that's not bad.\n", + "\n", + "You might wonder why I divided by `census` rather than `un`.\n", + "In general, if you think one estimate is better than the other, you put the better one in the denominator.\n", + "In this case, I don't know which is better, so I put the smaller one in the denominator, which makes the computed errors a little bigger." + ] + }, + { + "cell_type": "markdown", + "id": "vietnamese-excuse", + "metadata": {}, + "source": [ + "## Modeling Population Growth\n", + "\n", + "Suppose we want to predict world population growth over the next 50 or\n", + "100 years. We can do that by developing a model that describes how\n", + "populations grow, fitting the model to the data we have so far, and then using the model to generate predictions.\n", + "\n", + "In the next few sections I demonstrate this process starting with simple models and gradually improving them.\n", + "\n", + "Although there is some curvature in the plotted estimates, it looks like world population growth has been close to linear since 1960 or so. So we'll start with a model that has constant growth.\n", + "\n", + "To fit the model to the data, we'll compute the average annual growth\n", + "from 1950 to 2016. Since the UN and Census data are so close, we'll use the Census data.\n", + "\n", + "We can select a value from a `Series` using the bracket operator:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "undefined-sauce", + "metadata": {}, + "outputs": [], + "source": [ + "census[1950]" + ] + }, + { + "cell_type": "markdown", + "id": "precise-correlation", + "metadata": {}, + "source": [ + "So we can get the total growth during the interval like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "postal-debate", + "metadata": {}, + "outputs": [], + "source": [ + "total_growth = census[2016] - census[1950]" + ] + }, + { + "cell_type": "markdown", + "id": "dutch-sample", + "metadata": {}, + "source": [ + "The numbers in brackets are called **labels**, because they label the\n", + "rows of the `Series`.\n", + "\n", + "In this example, the labels 2016 and 1950 are part of the data, so it\n", + "would be better not to make them part of the program. \n", + "Putting values like these in the program is called **hard coding**; it is considered bad practice because if the data change in the future, we have to change the program (see ).\n", + "\n", + "It would be better to get the labels from the `Series`.\n", + "We can do that by selecting the index from `census` and then selecting the first element." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "functional-trick", + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = census.index[0]\n", + "t_0" + ] + }, + { + "cell_type": "markdown", + "id": "empty-siemens", + "metadata": {}, + "source": [ + "So `t_0` is the label of the first element, which is 1950.\n", + "We can get the label of the last element like this." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "acoustic-south", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = census.index[-1]\n", + "t_end" + ] + }, + { + "cell_type": "markdown", + "id": "express-metallic", + "metadata": {}, + "source": [ + "The value `-1` indicates the last element; `-2` indicates the second to last element, and so on.\n", + "\n", + "The difference between `t_0` and `t_end` is the elapsed time between them." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "planned-remains", + "metadata": {}, + "outputs": [], + "source": [ + "elapsed_time = t_end - t_0\n", + "elapsed_time" + ] + }, + { + "cell_type": "markdown", + "id": "bridal-royal", + "metadata": {}, + "source": [ + "Now we can use `t_0` and `t_end` to select the population at the beginning and end of the interval." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "quarterly-aggregate", + "metadata": {}, + "outputs": [], + "source": [ + "p_0 = census[t_0]\n", + "p_end = census[t_end]" + ] + }, + { + "cell_type": "markdown", + "id": "driven-castle", + "metadata": {}, + "source": [ + "And compute the total growth during the interval." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "prescription-optics", + "metadata": {}, + "outputs": [], + "source": [ + "total_growth = p_end - p_0\n", + "total_growth" + ] + }, + { + "cell_type": "markdown", + "id": "accepted-auditor", + "metadata": {}, + "source": [ + "Finally, we can compute average annual growth." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "convertible-patch", + "metadata": {}, + "outputs": [], + "source": [ + "annual_growth = total_growth / elapsed_time\n", + "annual_growth" + ] + }, + { + "cell_type": "markdown", + "id": "japanese-merit", + "metadata": {}, + "source": [ + "From 1950 to 2016, world population grew by about 0.07 billion people per year, on average.\n", + "The next step is to use this estimate to simulate population growth." + ] + }, + { + "cell_type": "markdown", + "id": "public-verification", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "Our simulation will start with the observed population in 1950, `p_0`,\n", + "and add `annual_growth` each year. To store the results, we'll use a\n", + "`TimeSeries` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "duplicate-leave", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results = TimeSeries(time='Year', quantity='Population')" + ] + }, + { + "cell_type": "markdown", + "id": "expired-salmon", + "metadata": {}, + "source": [ + "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", + "These names don't affect the computation, but they appear when we display or plot the `TimeSeries`.\n", + "\n", + "We can set the first value in the new `TimeSeries` like this." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "convenient-thong", + "metadata": {}, + "outputs": [], + "source": [ + "results[t_0] = p_0" + ] + }, + { + "cell_type": "markdown", + "id": "constant-casino", + "metadata": {}, + "source": [ + "Here's what it looks like so far." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "israeli-surveillance", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "show(results)" + ] + }, + { + "cell_type": "markdown", + "id": "stretch-snapshot", + "metadata": {}, + "source": [ + "Now we set the rest of the values by simulating annual growth:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "attended-morris", + "metadata": {}, + "outputs": [], + "source": [ + "for t in range(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "markdown", + "id": "signed-colleague", + "metadata": {}, + "source": [ + "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", + "\n", + "Inside the loop, we compute the population for the next year by adding the population for the current year and `annual_growth`. \n", + "\n", + "The last time through the loop, the value of `t` is 2015, so the last label in `results` is 2016.\n", + "\n", + "Here's what the results look like, compared to the estimates." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "wrong-brooks", + "metadata": {}, + "outputs": [], + "source": [ + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" + ] + }, + { + "cell_type": "markdown", + "id": "automated-albany", + "metadata": {}, + "source": [ + "The keyword argument `color='gray'` specifies the color of the line. For details on color specification see .\n", + "\n", + "From 1950 to 1990, the model does not fit the data particularly well, but after that, it's pretty good." + ] + }, + { + "cell_type": "markdown", + "id": "unnecessary-million", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter is a first step toward modeling changes in world population growth during the last 70 years.\n", + "\n", + "We used Pandas to read data from a web page and store the results in a `DataFrame`.\n", + "From the `DataFrame` we selected two `Series` objects and used them to compute absolute and relative errors.\n", + "\n", + "Then we computed average population growth and used it to build a simple model with constant annual growth.\n", + "The model fits recent data pretty well; nevertheless, there are two reasons we should be skeptical:\n", + "\n", + "* There is no obvious mechanism that could cause population growth to be constant from year to year. Changes in population are determined by the fraction of people who die and the fraction of people who give birth, so we expect them to depend on the current population.\n", + "\n", + "* According to this model, world population would keep growing at the same rate forever, and that does not seem reasonable.\n", + "\n", + "In the next chapter we'll consider other models that might fit the data better and make more credible predictions." + ] + }, + { + "cell_type": "markdown", + "id": "advanced-ivory", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "hearing-today", + "metadata": {}, + "source": [ + "Here's the code from this chapter all in one place." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "terminal-reynolds", + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = census.index[0]\n", + "t_end = census.index[-1]\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = census[t_0]\n", + "p_end = census[t_end]\n", + "\n", + "total_growth = p_end - p_0\n", + "annual_growth = total_growth / elapsed_time\n", + "\n", + "results = TimeSeries(time='Year', quantity='Population')\n", + "results[t_0] = p_0\n", + "\n", + "for t in range(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "organizational-memphis", + "metadata": {}, + "outputs": [], + "source": [ + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" + ] + }, + { + "cell_type": "markdown", + "id": "ecological-welsh", + "metadata": {}, + "source": [ + "**Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", + "\n", + "Suggestions: \n", + "\n", + "1. Define `t_1` to be 1970 and `p_1` to be the population in 1970. Use `t_1` and `p_1` to compute annual growth, but use `t_0` and `p_0` to run the simulation. \n", + "\n", + "2. You might want to add a constant to the starting value to match the data better." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "rising-anger", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "false-handbook", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "political-loading", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "improved-sigma", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb new file mode 100644 index 00000000..d64d790c --- /dev/null +++ b/chapters/chap06.ipynb @@ -0,0 +1,698 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "creative-motel", + "metadata": {}, + "source": [ + "# Chapter 6" + ] + }, + { + "cell_type": "markdown", + "id": "parental-symposium", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "quality-spectrum", + "metadata": {}, + "source": [ + "In the previous chapter we simulated a model of world population with\n", + "constant growth. In this chapter we see if we can make a better model\n", + "with growth proportional to the population.\n", + "\n", + "But first, we'll improve the code from the previous chapter by\n", + "encapsulating it in a function and using `System` objects." + ] + }, + { + "cell_type": "markdown", + "id": "ranking-tamil", + "metadata": {}, + "source": [ + "Here's the code that reads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "annoying-herald", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "shared-offense", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-merchant", + "metadata": {}, + "source": [ + "## System objects\n", + "\n", + "Like a `State` object, a `System` object contains variables and their\n", + "values. The difference is:\n", + "\n", + "- `State` objects contain state variables that get updated in the course of a simulation.\n", + "\n", + "- `System` objects contain **system parameters**, which usually don't get updated over the course of a simulation.\n", + "\n", + "For example, in the bike share model, state variables include the number of bikes at each location, which get updated whenever a customer moves a bike. System parameters include the number of locations, total number of bikes, and arrival rates at each location.\n", + "\n", + "In the population model, the only state variable is the population.\n", + "System parameters include the annual growth rate, the initial time and\n", + "population, and the end time.\n", + "\n", + "Suppose we have the following variables, as computed in the previous\n", + "chapter (assuming `table2` is the `DataFrame` we read from the file):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "numerous-university", + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9\n", + "\n", + "t_0 = census.index[0]\n", + "t_end = census.index[-1]\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = census[t_0]\n", + "p_end = census[t_end]\n", + "\n", + "total_growth = p_end - p_0\n", + "annual_growth = total_growth / elapsed_time" + ] + }, + { + "cell_type": "markdown", + "id": "starting-cooling", + "metadata": {}, + "source": [ + "Some of these are parameters we need to simulate the system; others are temporary values we can discard. \n", + "To distinguish between them, we'll put the parameters we need into a `System` object like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "colonial-domestic", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " annual_growth=annual_growth)" + ] + }, + { + "cell_type": "markdown", + "id": "fleet-beaver", + "metadata": {}, + "source": [ + "`t0` and `t_end` are the first and last years; `p_0` is the initial\n", + "population, and `annual_growth` is the estimated annual growth.\n", + "\n", + "Here's what `system` looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "floral-routine", + "metadata": {}, + "outputs": [], + "source": [ + "system" + ] + }, + { + "cell_type": "markdown", + "id": "combined-banking", + "metadata": {}, + "source": [ + "Next we'll wrap the code from the previous chapter in a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "pacific-challenge", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation1(system):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " results[t+1] = results[t] + system.annual_growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "technological-medicine", + "metadata": {}, + "source": [ + "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", + "\n", + "Inside the loop, it stores the results in a `TimeSeries` which it returns at the end.\n", + "\n", + "The following function plots the results along with the estimates\n", + "`census` and `un`:" + ] + }, + { + "cell_type": "markdown", + "id": "grateful-terror", + "metadata": {}, + "source": [ + "\n", + "\n", + "Here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "electoral-breach", + "metadata": {}, + "outputs": [], + "source": [ + "results1 = run_simulation1(system)" + ] + }, + { + "cell_type": "markdown", + "id": "ordinary-sound", + "metadata": {}, + "source": [ + "Here's the function we used in the previous chapter to plot the estimates." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "peripheral-cassette", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)') " + ] + }, + { + "cell_type": "markdown", + "id": "warming-audience", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "capable-diana", + "metadata": {}, + "outputs": [], + "source": [ + "results1.plot(label='model', color='gray')\n", + "plot_estimates()\n", + "decorate(title='Constant Growth Model')" + ] + }, + { + "cell_type": "markdown", + "id": "exposed-witness", + "metadata": {}, + "source": [ + "It might not be obvious that using functions and `System` objects is a\n", + "big improvement, and for a simple model that we run only once, maybe\n", + "it's not. But as we work with more complex models, and when we run many simulations with different parameters, we'll see that the organization of the code makes a big difference.\n", + "\n", + "Now let's see if we can improve the model." + ] + }, + { + "cell_type": "markdown", + "id": "geographic-hormone", + "metadata": {}, + "source": [ + "## Proportional growth model\n", + "\n", + "The biggest problem with the constant growth model is that it doesn't\n", + "make any sense. It is hard to imagine how people all over the world\n", + "could conspire to keep population growth constant from year to year.\n", + "\n", + "On the other hand, if some fraction of the population dies each year,\n", + "and some fraction gives birth, we can compute the net change in the\n", + "population like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "laughing-wesley", + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation2(system):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " births = system.birth_rate * results[t]\n", + " deaths = system.death_rate * results[t]\n", + " results[t+1] = results[t] + births - deaths\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "educated-portugal", + "metadata": {}, + "source": [ + "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", + "\n", + "For the death rate, I'll use 7.7 deaths per 1000 people, which was roughly the global death rate in 2020 (see ).\n", + "I chose the birth rate by hand to fit the data." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "wired-brief", + "metadata": {}, + "outputs": [], + "source": [ + "system.death_rate = 7.7 / 1000\n", + "system.birth_rate = 25 / 1000" + ] + }, + { + "cell_type": "markdown", + "id": "sufficient-contest", + "metadata": {}, + "source": [ + "Then I ran the simulation and plotted the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "looking-trace", + "metadata": {}, + "outputs": [], + "source": [ + "results2 = run_simulation2(system)\n", + "results2.plot(label='model', color='gray')\n", + "plot_estimates()\n", + "decorate(title='Proportional Growth Model')" + ] + }, + { + "cell_type": "markdown", + "id": "suited-costs", + "metadata": {}, + "source": [ + "The proportional model fits\n", + "the data well from 1950 to 1965, but not so well after that. Overall,\n", + "the **quality of fit** is not as good as the constant growth model,\n", + "which is surprising, because it seems like the proportional model is\n", + "more realistic.\n", + "\n", + "In the next chapter we'll try one more time to find a model that makes\n", + "sense and fits the data. But first, I want to make a few more\n", + "improvements to the code." + ] + }, + { + "cell_type": "markdown", + "id": "appropriate-checkout", + "metadata": {}, + "source": [ + "## Factoring out the update function\n", + "\n", + "`run_simulation1` and `run_simulation2` are nearly identical except for the body of the `for` loop, where we compute the population for the next year.\n", + "\n", + "Rather than repeat identical code, we can separate the things that\n", + "change from the things that don't. First, I'll pull out the update code from `run_simulation2` and make it a function:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "handmade-permit", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func1(pop, t, system):\n", + " births = system.birth_rate * pop\n", + " deaths = system.death_rate * pop\n", + " return births - deaths" + ] + }, + { + "cell_type": "markdown", + "id": "fabulous-bankruptcy", + "metadata": {}, + "source": [ + "This function takes as arguments the current population, current year,\n", + "and a `System` object; it returns the net population growth during the current year.\n", + "\n", + "This update function does not use `t`, so we could leave it out. But we will see other functions that need it, and it is convenient if they all take the same parameters, used or not.\n", + "\n", + "Now we can write a function that runs any model:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "civilian-accused", + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, growth_func):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "failing-assist", + "metadata": {}, + "source": [ + "This function demonstrates a feature we have not seen before: it takes a\n", + "function as a parameter! When we call `run_simulation`, the second\n", + "parameter is a function, like `growth_func1`, that computes the\n", + "population for the next year.\n", + "\n", + "Here's how we call it:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "wicked-seeking", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func1)" + ] + }, + { + "cell_type": "markdown", + "id": "simple-camel", + "metadata": {}, + "source": [ + "Passing a function as an argument is the same as passing any other\n", + "value. The argument, which is `growth_func1` in this example, gets\n", + "assigned to the parameter, which is called `growth_func`. Inside\n", + "`run_simulation`, we can run `growth_func` just like any other function.\n", + "\n", + "Each time through the loop, `run_simulation` calls `growth_func1` to compute net growth, and uses it to compute the population during the next year." + ] + }, + { + "cell_type": "markdown", + "id": "spectacular-paradise", + "metadata": {}, + "source": [ + "## Combining birth and death\n", + "\n", + "We can simplify the code slightly by combining births and deaths to compute the net growth rate. \n", + "Instead of two parameters, `birth_rate` and `death_rate`, we can write the update function in terms of a single parameter that represents the difference:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "impressive-model", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = system.birth_rate - system.death_rate" + ] + }, + { + "cell_type": "markdown", + "id": "modern-uncertainty", + "metadata": {}, + "source": [ + "The name of this parameter, `alpha`, is the conventional name for a\n", + "proportional growth rate.\n", + "\n", + "Here's the modified version of `growth_func1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "familiar-helena", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func2(pop, t, system):\n", + " return system.alpha * pop" + ] + }, + { + "cell_type": "markdown", + "id": "understanding-typing", + "metadata": {}, + "source": [ + "And here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "independent-effectiveness", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func2)" + ] + }, + { + "cell_type": "markdown", + "id": "everyday-delicious", + "metadata": {}, + "source": [ + "The results are the same as the previous versions, but now the code is organized in a way that makes it easy to explore other models." + ] + }, + { + "cell_type": "markdown", + "id": "attractive-steps", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter, we wrapped the code from the previous chapter in functions and used a `System` object to store the parameters of the system.\n", + "\n", + "We explored a new model of population growth, where the number of births and deaths is proportional to the current population. This model seems more realistic, but it turns out not to fit the data particularly well.\n", + "\n", + "In the next chapter, we'll try one more model, which is based on the assumption that the population can't keep growing forever.\n", + "But first, you might want to work on some exercises." + ] + }, + { + "cell_type": "markdown", + "id": "looking-douglas", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "compliant-preserve", + "metadata": {}, + "source": [ + "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", + "\n", + "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use.\n", + "\n", + "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "minus-recommendation", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "headed-amsterdam", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "preliminary-carnival", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "adaptive-tiger", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "The `System` object defined in the ModSim library, is based on the `SimpleNamespace` object defined in a standard Python library called `types`; the documentation is at ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "injured-mailman", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb new file mode 100644 index 00000000..7bd8ec6e --- /dev/null +++ b/chapters/chap07.ipynb @@ -0,0 +1,811 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "regular-director", + "metadata": {}, + "source": [ + "# Chapter 7" + ] + }, + { + "cell_type": "markdown", + "id": "disciplinary-occasion", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "indie-scoop", + "metadata": {}, + "source": [ + "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", + "\n", + "There are a few things we could try to improve the model:\n", + "\n", + "- Maybe net growth depends on the current population, but the\n", + " relationship is quadratic, not linear.\n", + "\n", + "- Maybe the net growth rate varies over time.\n", + "\n", + "In this chapter, we'll explore the first option.\n", + "In the exercises, you will have a chance to try the second. " + ] + }, + { + "cell_type": "markdown", + "id": "qualified-houston", + "metadata": {}, + "source": [ + "Here's the code that reads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "major-arkansas", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "intense-columbus", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "wound-necklace", + "metadata": {}, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9" + ] + }, + { + "cell_type": "markdown", + "id": "intended-matrix", + "metadata": {}, + "source": [ + "And here are the functions from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "former-accuracy", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation(system, growth_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " growth_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "duplicate-insert", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)')" + ] + }, + { + "cell_type": "markdown", + "id": "champion-retreat", + "metadata": {}, + "source": [ + "## Quadratic growth\n", + "\n", + "It makes sense that net growth should depend on the current population, but maybe it's not a linear relationship, like this:\n", + "\n", + "```\n", + "net_growth = system.alpha * pop\n", + "```\n", + "\n", + "Maybe it's a quadratic relationship, like this:\n", + "\n", + "```\n", + "net_growth = system.alpha * pop + system.beta * pop**2\n", + "```\n", + "\n", + "We can test that conjecture with a new update function:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "sized-hawaiian", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func_quad(pop, t, system):\n", + " return system.alpha * pop + system.beta * pop**2" + ] + }, + { + "cell_type": "markdown", + "id": "amateur-strand", + "metadata": {}, + "source": [ + "Here's the `System` object we'll use, initialized with `t_0`, `p_0`, and `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "interstate-canal", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "t_0 = census.index[0]\n", + "p_0 = census[t_0]\n", + "t_end = census.index[-1]\n", + "\n", + "system = System(t_0=t_0,\n", + " p_0=p_0,\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "id": "acting-transportation", + "metadata": {}, + "source": [ + "Now we have to add the parameters `alpha` and `beta` .\n", + "I chose the following values by trial and error; we'll see better ways to do it later." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "banned-dallas", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = 25 / 1000\n", + "system.beta = -1.8 / 1000" + ] + }, + { + "cell_type": "markdown", + "id": "supreme-wellington", + "metadata": {}, + "source": [ + "And here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "positive-scheme", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func_quad)" + ] + }, + { + "cell_type": "markdown", + "id": "satisfied-density", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "flush-fellowship", + "metadata": {}, + "outputs": [], + "source": [ + "results.plot(color='gray', label='model')\n", + "plot_estimates()\n", + "decorate(title='Quadratic Growth Model')" + ] + }, + { + "cell_type": "markdown", + "id": "organized-combining", + "metadata": {}, + "source": [ + "The model fits the data well over the whole range, with just a bit of space between them in the 1960s.\n", + "\n", + "Of course, we should expect the quadratic model to fit better than the\n", + "constant and proportional models because it has two parameters we can\n", + "choose, where the other models have only one. In general, the more\n", + "parameters you have to play with, the better you should expect the model\n", + "to fit.\n", + "\n", + "But fitting the data is not the only reason to think the quadratic model\n", + "might be a good choice. It also makes sense; that is, there is a\n", + "legitimate reason to expect the relationship between growth and\n", + "population to have this form.\n", + "\n", + "To understand it, let's look at net growth as a function of population." + ] + }, + { + "cell_type": "markdown", + "id": "powerful-century", + "metadata": {}, + "source": [ + "## Net growth\n", + "\n", + "Let's plot the relationship between growth and population in the quadratic model.\n", + "\n", + "I'll use `linspace` to make an array of 101 populations from 0 to 15 billion." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "excited-catch", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "pop_array = linspace(0, 15, 101)" + ] + }, + { + "cell_type": "markdown", + "id": "tracked-guide", + "metadata": {}, + "source": [ + "Now I'll use the quadratic model to compute net growth for each population." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "classical-badge", + "metadata": {}, + "outputs": [], + "source": [ + "growth_array = (system.alpha * pop_array + \n", + " system.beta * pop_array**2)" + ] + }, + { + "cell_type": "markdown", + "id": "quantitative-differential", + "metadata": {}, + "source": [ + "To plot the growth rate versus population, we can import the `plot` function from Matplotlib:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "interim-consent", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot" + ] + }, + { + "cell_type": "markdown", + "id": "published-average", + "metadata": {}, + "source": [ + "And use it like this." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "received-crossing", + "metadata": {}, + "outputs": [], + "source": [ + "plot(pop_array, growth_array, label='growth')\n", + "\n", + "decorate(xlabel='Population (billions)',\n", + " ylabel='Net growth (billions)',\n", + " title='Growth vs. Population')" + ] + }, + { + "cell_type": "markdown", + "id": "plastic-wisdom", + "metadata": {}, + "source": [ + "Note that the x-axis is not time, as in the previous figures, but population. We can divide this curve into four regimes of behavior:\n", + "\n", + "- When the population is less than 3-4 billion, net growth is\n", + " proportional to population, as in the proportional model. In this\n", + " regime, the population grows slowly because the population is small.\n", + "\n", + "- Between 4 billion and 10 billion, the population grows quickly\n", + " because there are a lot of people.\n", + "\n", + "- Above 10 billion, population grows more slowly; this behavior models\n", + " the effect of resource limitations that decrease birth rates or\n", + " increase death rates.\n", + "\n", + "- Above 14 billion, resources are so limited that the death rate\n", + " exceeds the birth rate and net growth becomes negative.\n", + "\n", + "Just below 14 billion, there is a point where net growth is 0, which\n", + "means that the population does not change. At this point, the birth and death rates are equal, so the population is in **equilibrium**." + ] + }, + { + "cell_type": "markdown", + "id": "relevant-detection", + "metadata": {}, + "source": [ + "## Equilibrium\n", + "\n", + "To find the equilibrium point, we can find the roots, or zeros, of this equation: \n", + "\n", + "$$\\Delta p = \\alpha p + \\beta p^2$$ \n", + "\n", + "where $\\Delta p$ is net\n", + "population growth, $p$ is current population, and $\\alpha$ and $\\beta$\n", + "are the parameters of the model. We can rewrite the right hand side like\n", + "this: \n", + "\n", + "$$\\Delta p = p (\\alpha + \\beta p)$$ \n", + "\n", + "which is $0$ when $p=0$ or $p=-\\alpha/\\beta$.\n", + "We can use the parameters of the system to compute the second equilibrium point:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "lightweight-entrepreneur", + "metadata": {}, + "outputs": [], + "source": [ + "-system.alpha / system.beta" + ] + }, + { + "cell_type": "markdown", + "id": "stuck-flood", + "metadata": {}, + "source": [ + "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", + "\n", + "In the context of population modeling, the quadratic model is more\n", + "conventionally written like this: \n", + "\n", + "$$\\Delta p = r p (1 - p / K)$$ \n", + "\n", + "This is the same model; it's just a different way to **parameterize** it. Given $\\alpha$ and $\\beta$, we can compute $r=\\alpha$ and $K=-\\alpha/\\beta$.\n", + "\n", + "In this version, it is easier to interpret the parameters: $r$ is the\n", + "maximum growth rate, observed when $p$ is small, and $K$ is the\n", + "equilibrium point. $K$ is also called the **carrying capacity**, since\n", + "it indicates the maximum population the environment can sustain." + ] + }, + { + "cell_type": "markdown", + "id": "derived-oliver", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter we implemented a quadratic growth model where net growth depends on the current population and the population squared.\n", + "\n", + "This model fits the data well, and we saw one reason why: it is based on the assumption that there is a limit to the number of people the Earth can support.\n", + "\n", + "In the next chapter we'll use the models we have developed to generate\n", + "predictions.\n", + "But first, I want to warn you about a few things that can go wrong when you write functions." + ] + }, + { + "cell_type": "markdown", + "id": "bibliographic-handy", + "metadata": {}, + "source": [ + "## Dysfunctions\n", + "\n", + "When people learn about functions, there are a few things they often\n", + "find confusing. In this section I present and explain some common\n", + "problems.\n", + "\n", + "As an example, suppose you want a function that takes a\n", + "`System` object, with variables `alpha` and `beta`, and computes the\n", + "carrying capacity, `-alpha/beta`. \n", + "Here's a good solution:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "lucky-insurance", + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "accredited-fitting", + "metadata": {}, + "source": [ + "Now let's see all the ways that can go wrong." + ] + }, + { + "cell_type": "markdown", + "id": "transparent-cotton", + "metadata": {}, + "source": [ + "Dysfunction \\#1: Not using parameters. In the following version, the\n", + "function doesn't take any parameters; when `sys1` appears inside the\n", + "function, it refers to the object we create outside the function." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "aggregate-baker", + "metadata": {}, + "outputs": [], + "source": [ + "def carrying_capacity():\n", + " K = -sys1.alpha / sys1.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity()\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "otherwise-belarus", + "metadata": {}, + "source": [ + "This version actually works, but it is not as versatile as it could be.\n", + "If there are several `System` objects, this function can only work with one of them, and only if it is named `sys1`." + ] + }, + { + "cell_type": "markdown", + "id": "naughty-crazy", + "metadata": {}, + "source": [ + "Dysfunction \\#2: Clobbering the parameters. When people first learn\n", + "about parameters, they often write functions like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "outdoor-petroleum", + "metadata": {}, + "outputs": [], + "source": [ + "# WRONG\n", + "def carrying_capacity(system):\n", + " system = System(alpha=0.025, beta=-0.0018)\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.03, beta=-0.002)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "afraid-street", + "metadata": {}, + "source": [ + "In this example, we have a `System` object named `sys1` that gets passed\n", + "as an argument to `carrying_capacity`. But when the function runs, it\n", + "ignores the argument and immediately replaces it with a new `System`\n", + "object. As a result, this function always returns the same value, no\n", + "matter what argument is passed.\n", + "\n", + "When you write a function, you generally don't know what the values of\n", + "the parameters will be. Your job is to write a function that works for\n", + "any valid values. If you assign your own values to the parameters, you\n", + "defeat the whole purpose of functions." + ] + }, + { + "cell_type": "markdown", + "id": "expired-detail", + "metadata": {}, + "source": [ + "Dysfunction \\#3: No return value. Here's a version that computes the\n", + "value of `K` but doesn't return it." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "increasing-database", + "metadata": {}, + "outputs": [], + "source": [ + "# WRONG\n", + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ] + }, + { + "cell_type": "markdown", + "id": "brutal-chile", + "metadata": {}, + "source": [ + "A function that doesn't have a return statement actually returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause." + ] + }, + { + "cell_type": "markdown", + "id": "meaning-thriller", + "metadata": {}, + "source": [ + "Dysfunction \\#4: Ignoring the return value. Finally, here's a version\n", + "where the function is correct, but the way it's used is not.\n", + "\n", + "```\n", + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "carrying_capacity(sys1)\n", + "print(K)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "opposed-vessel", + "metadata": {}, + "source": [ + "In this example, `carrying_capacity` runs and returns `K`, but the\n", + "return value doesn't get displayed or assigned to a variable.\n", + "If we try to print `K`, we get a `NameError`, because `K` only exists inside the function.\n", + "\n", + "When you call a function that returns a value, you should do something\n", + "with the result." + ] + }, + { + "cell_type": "markdown", + "id": "quarterly-ethiopia", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "painted-samuel", + "metadata": {}, + "source": [ + "**Exercise:** In a previous section, we saw a different way to parameterize the quadratic model:\n", + "\n", + "$$ \\Delta p = r p (1 - p / K) $$\n", + "\n", + "where $r=\\alpha$ and $K=-\\alpha/\\beta$. \n", + "\n", + "Write a version of `growth_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "unauthorized-settle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "primary-roman", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "ordinary-solid", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "ignored-architect", + "metadata": {}, + "source": [ + "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes.\n", + "\n", + "Hint: If there are too many labels in the legend, you can plot results like this:\n", + "\n", + "```\n", + " results.plot(label='_nolegend')\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "intermediate-kazakhstan", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "positive-enforcement", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "Explain the difference between the Pandas and Matplotlib `plot` functions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "described-funds", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb new file mode 100644 index 00000000..7d794270 --- /dev/null +++ b/chapters/chap08.ipynb @@ -0,0 +1,740 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "external-reward", + "metadata": {}, + "source": [ + "# Chapter 8" + ] + }, + { + "cell_type": "markdown", + "id": "compound-announcement", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "chicken-emphasis", + "metadata": {}, + "source": [ + "In the previous chapter we developed a quadratic model of world\n", + "population growth from 1950 to 2016. It is a simple model, but it fits\n", + "the data well and the mechanisms it's based on are plausible.\n", + "\n", + "In this chapter we'll use the quadratic model to generate projections of future growth, and compare our results to projections from actual\n", + "demographers." + ] + }, + { + "cell_type": "markdown", + "id": "global-international", + "metadata": {}, + "source": [ + "Here's the code that downloads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "necessary-factor", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "markdown", + "id": "designed-entrance", + "metadata": {}, + "source": [ + "And here's the code that reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "changed-desktop", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "metallic-inventory", + "metadata": {}, + "outputs": [], + "source": [ + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "markdown", + "id": "further-armstrong", + "metadata": {}, + "source": [ + "## Generating Projections" + ] + }, + { + "cell_type": "markdown", + "id": "concrete-lightning", + "metadata": {}, + "source": [ + "Now let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", + "\n", + "Here's the code we'll need from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "extraordinary-shade", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation(system, growth_func):\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in range(system.t_0, system.t_end):\n", + " growth = growth_func(results[t], t, system)\n", + " results[t+1] = results[t] + growth\n", + " \n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "indirect-russia", + "metadata": {}, + "outputs": [], + "source": [ + "def growth_func_quad(pop, t, system):\n", + " return system.alpha * pop + system.beta * pop**2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "collaborative-schedule", + "metadata": {}, + "outputs": [], + "source": [ + "census = table2.census / 1e9\n", + "un = table2.un / 1e9" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "comfortable-compression", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "t_0 = census.index[0]\n", + "p_0 = census[t_0]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "working-cleveland", + "metadata": {}, + "outputs": [], + "source": [ + "system = System(t_0=t_0,\n", + " p_0=p_0,\n", + " t_end=2100)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "sophisticated-adult", + "metadata": {}, + "outputs": [], + "source": [ + "system.alpha = 25 / 1000\n", + "system.beta = -1.8 / 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "broken-windsor", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, growth_func_quad)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "latest-function", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "show(results.tail())" + ] + }, + { + "cell_type": "markdown", + "id": "outer-ensemble", + "metadata": {}, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "portable-pottery", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results.plot(color='gray', label='model')\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Quadratic Model Projection')" + ] + }, + { + "cell_type": "markdown", + "id": "macro-carroll", + "metadata": {}, + "source": [ + "According to the model, population growth will slow gradually after 2020, approaching 12.5 billion by 2100.\n", + "\n", + "I am using the word \"projection\" deliberately, rather than\n", + "\"prediction\", with the following distinction: \"prediction\" implies\n", + "something like \"this is what we should reasonably expect to happen, at\n", + "least approximately\"; \"projection\" implies something like \"if this\n", + "model is actually a good description of what is happening in this\n", + "system, and if nothing in the future causes the parameters of the model to change, this is what would happen.\"\n", + "\n", + "Using \"projection\" leaves open the possibility that there are important things in the real world that are not captured in the model. It also suggests that, even if the model is good, the parameters we estimate based on the past might be different in the future.\n", + "\n", + "The quadratic model we've been working with is based on the assumption\n", + "that population growth is limited by the availability of resources; in\n", + "that scenario, as the population approaches carrying capacity, birth\n", + "rates fall and death rates rise because resources become scarce.\n", + "\n", + "If that assumption is valid, we might be able to use actual population\n", + "growth to estimate carrying capacity, especially if we observe the\n", + "transition into the regime where the growth rate starts to fall.\n", + "\n", + "But in the case of world population growth, those conditions don't\n", + "apply. Over the last 50 years, the net growth rate has leveled off, but not yet started to fall, so we don't have enough data to make a credible estimate of carrying capacity. And resource limitations are probably *not* the primary reason growth has slowed. As evidence, consider:\n", + "\n", + "- First, the death rate is not increasing; rather, it has declined\n", + " from 1.9% in 1950 to 0.8% now (see ).\n", + " So the decrease in net growth is due entirely to declining birth\n", + " rates.\n", + "\n", + "- Second, the relationship between resources and birth rate is the\n", + " opposite of what the model assumes; as nations develop and people\n", + " become more wealthy, birth rates tend to fall.\n", + "\n", + "We should not take too seriously the idea that this model can estimate\n", + "carrying capacity. But the predictions of a model can be credible even\n", + "if the assumptions of the model are not strictly true. For example,\n", + "population growth might behave *as if* it is resource limited, even if\n", + "the actual mechanism is something else.\n", + "\n", + "In fact, demographers who study population growth often use models\n", + "similar to ours. In the next section, we'll compare our projections to\n", + "theirs." + ] + }, + { + "cell_type": "markdown", + "id": "small-seminar", + "metadata": {}, + "source": [ + "## Projections" + ] + }, + { + "cell_type": "markdown", + "id": "greater-illness", + "metadata": {}, + "source": [ + "From the same page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "precious-contribution", + "metadata": {}, + "outputs": [], + "source": [ + "table3 = tables[3]\n", + "table3.head()" + ] + }, + { + "cell_type": "markdown", + "id": "coated-smoke", + "metadata": {}, + "source": [ + "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", + "\n", + "The column names are long strings; for convenience, I'll replace them with abbreviations." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "headed-tuner", + "metadata": {}, + "outputs": [], + "source": [ + "table3.columns = ['census', 'prb', 'un']" + ] + }, + { + "cell_type": "markdown", + "id": "ceramic-scroll", + "metadata": {}, + "source": [ + "The following function plots projections from the U.N. DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "paperback-delay", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_projections(table):\n", + " \"\"\"Plot world population projections.\n", + " \n", + " table: DataFrame with columns 'un' and 'census'\n", + " \"\"\"\n", + " census_proj = table.census.dropna() / 1e9\n", + " un_proj = table.un.dropna() / 1e9\n", + " \n", + " census_proj.plot(style=':', label='US Census')\n", + " un_proj.plot(style='--', label='UN DESA')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)')" + ] + }, + { + "cell_type": "markdown", + "id": "prostate-matrix", + "metadata": {}, + "source": [ + "Here are their projections compared to the results of the quadratic model." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "billion-dynamics", + "metadata": {}, + "outputs": [], + "source": [ + "plot_projections(table3)\n", + "results.plot(color='gray', label='model')\n", + "decorate(title='Quadratic Model Projection')" + ] + }, + { + "cell_type": "markdown", + "id": "integrated-there", + "metadata": {}, + "source": [ + "The U.N. DESA expects the world population to reach 11 billion around 2100, and then level off.\n", + "Projections by U.S. Census are a little lower, and they only go until 2050.\n", + "\n", + "Real demographers expect world population to grow more slowly than our model projects, probably because their models are broken down by region and country, where conditions are different, and they take into account expected economic development.\n", + "\n", + "Nevertheless, their projections are qualitatively similar to ours, and\n", + "theirs differ from each other almost as much as they differ from ours.\n", + "So the results from this model, simple as it is, are not entirely unreasonable.\n" + ] + }, + { + "cell_type": "markdown", + "id": "serial-binary", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "\n", + "You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." + ] + }, + { + "cell_type": "markdown", + "id": "authorized-suggestion", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate more realistic projections, by extrapolating observed changes in growth rate.\n", + "\n", + "To compute past growth rates, we'll use a function called `diff`, which computes the difference between successive elements in a `Series`. For example, here are the changes from one year to the next in `census`:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "handmade-funeral", + "metadata": {}, + "outputs": [], + "source": [ + "diff = census.diff()\n", + "diff.head()" + ] + }, + { + "cell_type": "markdown", + "id": "discrete-scanner", + "metadata": {}, + "source": [ + "The first element is `NaN` because we don't have the data for 1945, so we can't compute the first difference.\n", + "\n", + "If we divide these differences by the populations, the result is an estimate of the growth rate during each year: " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "objective-accused", + "metadata": {}, + "outputs": [], + "source": [ + "alpha = census.diff() / census\n", + "alpha.head()" + ] + }, + { + "cell_type": "markdown", + "id": "weighted-trouble", + "metadata": {}, + "source": [ + "The following function computes and plots the growth rates for the `census` and `un` estimates:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "unique-matrix", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_alpha():\n", + " alpha_census = census.diff() / census\n", + " alpha_census.plot(style='.', label='US Census')\n", + "\n", + " alpha_un = un.diff() / un\n", + " alpha_un.plot(style='.', label='UN DESA')\n", + "\n", + " decorate(xlabel='Year', label='Net growth rate')" + ] + }, + { + "cell_type": "markdown", + "id": "flexible-amateur", + "metadata": {}, + "source": [ + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "pressing-proceeding", + "metadata": {}, + "outputs": [], + "source": [ + "plot_alpha()" + ] + }, + { + "cell_type": "markdown", + "id": "cross-reducing", + "metadata": {}, + "source": [ + "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", + "\n", + "We can model the decline by fitting a line to this data and extrapolating into the future.\n", + "\n", + "Here's a function that takes a time stamp and computes a line that roughly fits the growth rates since 1970." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "mexican-denver", + "metadata": {}, + "outputs": [], + "source": [ + "def alpha_func(t):\n", + " intercept = 0.02\n", + " slope = -0.00021\n", + " return intercept + slope * (t - 1970)" + ] + }, + { + "cell_type": "markdown", + "id": "handy-dubai", + "metadata": {}, + "source": [ + "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "addressed-worker", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "t_array = linspace(1960, 2020, 5)\n", + "alpha_array = alpha_func(t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "jewish-operations", + "metadata": {}, + "source": [ + "Here's what it looks like, compared to the data." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "cathedral-shakespeare", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "plot_alpha()\n", + "plot(t_array, alpha_array, color='gray')" + ] + }, + { + "cell_type": "markdown", + "id": "expensive-viewer", + "metadata": {}, + "source": [ + "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", + "\n", + "Now, as an exercise, you can use this function to make a projection of world population until 2100.\n", + "\n", + "1. Create a `System` object that includes `alpha_func` as a system variable.\n", + "\n", + "2. Define a growth function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", + "\n", + "3. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", + "\n", + "4. Compare your projections with those from the US Census and UN." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "common-april", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "ignored-chain", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "color-accountability", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "numeric-raise", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "included-vehicle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "brown-rating", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "laughing-cylinder", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "personalized-parking", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "simple-version", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb new file mode 100644 index 00000000..9aa9f8e7 --- /dev/null +++ b/chapters/chap09.ipynb @@ -0,0 +1,1054 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "asian-customer", + "metadata": {}, + "source": [ + "# Chapter 9" + ] + }, + { + "cell_type": "markdown", + "id": "gentle-purchase", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "biblical-murder", + "metadata": {}, + "source": [ + "In this chapter we express the models from previous chapters as\n", + "difference equations and differential equations, solve the equations,\n", + "and derive the functional forms of the solutions. We also discuss the\n", + "complementary roles of mathematical analysis and simulation." + ] + }, + { + "cell_type": "markdown", + "id": "hybrid-retrieval", + "metadata": {}, + "source": [ + "## Recurrence relations\n", + "\n", + "The population models in the previous chapter and this one are simple\n", + "enough that we didn't really need to run simulations. We could have\n", + "solved them mathematically. For example, we wrote the constant growth\n", + "model like this:\n", + "\n", + "```\n", + "results[t+1] = results[t] + annual_growth\n", + "```\n", + "\n", + "In mathematical notation, we would write the same model like this:\n", + "\n", + "$$x_{n+1} = x_n + c$$ \n", + "\n", + "where $x_n$ is the population during year $n$,\n", + "$x_0$ is a given initial population, and $c$ is constant annual growth.\n", + "This way of representing the model is a **recurrence relation**; see\n", + ".\n", + "\n", + "Sometimes it is possible to solve a recurrence relation by writing an\n", + "equation that computes $x_n$, for a given value of $n$, directly; that\n", + "is, without computing the intervening values from $x_1$ through\n", + "$x_{n-1}$." + ] + }, + { + "cell_type": "markdown", + "id": "specified-mexican", + "metadata": {}, + "source": [ + "In the case of constant growth we can see that $x_1 = x_0 + c$, and\n", + "$x_2 = x_1 + c$. Combining these, we get $x_2 = x_0 + 2c$, then\n", + "$x_3 = x_0 + 3c$, and it is not hard to conclude that in general\n", + "\n", + "$$x_n = x_0 + nc$$ \n", + "\n", + "So if we want to know $x_{100}$ and we don't care\n", + "about the other values, we can compute it with one multiplication and\n", + "one addition." + ] + }, + { + "cell_type": "markdown", + "id": "motivated-consumer", + "metadata": {}, + "source": [ + "We can also write the proportional model as a recurrence relation:\n", + "\n", + "$$x_{n+1} = x_n + \\alpha x_n$$ \n", + "\n", + "Or more conventionally as:\n", + "\n", + "$$x_{n+1} = x_n (1 + \\alpha)$$ \n", + "\n", + "Now we can see that\n", + "\n", + "$x_1 = x_0 (1 + \\alpha)$, and $x_2 = x_0 (1 + \\alpha)^2$, and in general\n", + "\n", + "$$x_n = x_0 (1 + \\alpha)^n$$ \n", + "\n", + "This result is a **geometric progression**;\n", + "see . When $\\alpha$ is positive, the factor\n", + "$1+\\alpha$ is greater than 1, so the elements of the sequence grow\n", + "without bound.\n", + "\n", + "Finally, we can write the quadratic model like this:\n", + "\n", + "$$x_{n+1} = x_n + \\alpha x_n + \\beta x_n^2$$ \n", + "\n", + "or with the more\n", + "conventional parameterization like this:\n", + "\n", + "$$x_{n+1} = x_n + r x_n (1 - x_n / K)$$ \n", + "\n", + "There is no analytic solution to\n", + "this equation, but we can approximate it with a differential equation\n", + "and solve that, which is what we'll do in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "decreased-location", + "metadata": {}, + "source": [ + "## Differential equations\n", + "\n", + "Starting again with the constant growth model \n", + "\n", + "$$x_{n+1} = x_n + c$$ \n", + "\n", + "If we define $\\Delta x$ to be the change in $x$ from one time step to the next, we can write: \n", + "\n", + "$$\\Delta x = x_{n+1} - x_n = c$$ \n", + "\n", + "If we define\n", + "$\\Delta t$ to be the time step, which is one year in the example, we can\n", + "write the rate of change per unit of time like this:\n", + "\n", + "$$\\frac{\\Delta x}{\\Delta t} = c$$ \n", + "\n", + "This model is **discrete**, which\n", + "means it is only defined at integer values of $n$ and not in between.\n", + "But in reality, people are born and die all the time, not once a year,\n", + "so a **continuous** model might be more realistic." + ] + }, + { + "cell_type": "markdown", + "id": "covered-defense", + "metadata": {}, + "source": [ + "We can make this model continuous by writing the rate of change in the\n", + "form of a derivative: \n", + "\n", + "$$\\frac{dx}{dt} = c$$ \n", + "\n", + "This way of representing the model is a **differential equation**; see .\n", + "\n", + "We can solve this differential equation if we multiply both sides by\n", + "$dt$: \n", + "\n", + "$$dx = c dt$$ \n", + "\n", + "And then integrate both sides: \n", + "\n", + "$$x(t) = c t + x_0$$\n", + "\n", + "Similarly, we can write the proportional growth model like this:\n", + "\n", + "$$\\frac{\\Delta x}{\\Delta t} = \\alpha x$$ \n", + "\n", + "And as a differential equation\n", + "like this: \n", + "\n", + "$$\\frac{dx}{dt} = \\alpha x$$ \n", + "\n", + "If we multiply both sides by\n", + "$dt$ and divide by $x$, we get \n", + "\n", + "$$\\frac{1}{x}~dx = \\alpha~dt$$ \n", + "\n", + "Now we\n", + "integrate both sides, yielding: \n", + "\n", + "$$\\ln x = \\alpha t + K$$ \n", + "\n", + "where $\\ln$ is the natural logarithm and $K$ is the constant of integration." + ] + }, + { + "cell_type": "markdown", + "id": "underlying-visitor", + "metadata": {}, + "source": [ + "Exponentiating both sides, we have\n", + "\n", + "$$\\exp(\\ln(x)) = \\exp(\\alpha t + K)$$ \n", + "\n", + "The exponential function can be written $\\exp(x)$ or $e^x$. In this book I use the first form because it resembles the Python code.\n", + "\n", + "We can rewrite the previous equation as\n", + "\n", + "$$x = \\exp(\\alpha t) \\exp(K)$$ \n", + "\n", + "Since $K$ is an arbitrary constant,\n", + "$\\exp(K)$ is also an arbitrary constant, so we can write\n", + "\n", + "$$x = C \\exp(\\alpha t)$$ \n", + "\n", + "where $C = \\exp(K)$. There are many solutions\n", + "to this differential equation, with different values of $C$. The\n", + "particular solution we want is the one that has the value $x_0$ when\n", + "$t=0$.\n", + "\n", + "When $t=0$, $x(t) = C$, so $C = x_0$ and the solution we want is\n", + "$$x(t) = x_0 \\exp(\\alpha t)$$ If you would like to see this derivation\n", + "done more carefully, you might like this video:\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "czech-scratch", + "metadata": {}, + "source": [ + "## Analysis and simulation\n", + "\n", + "Once you have designed a model, there are generally two ways to proceed: simulation and analysis. Simulation often comes in the form of a computer program that models changes in a system over time, like births and deaths, or bikes moving from place to place. Analysis often comes in the form of algebra; that is, symbolic manipulation using mathematical notation.\n", + "\n", + "Analysis and simulation have different capabilities and limitations.\n", + "Simulation is generally more versatile; it is easy to add and remove\n", + "parts of a program and test many versions of a model, as we have done in the previous examples.\n", + "\n", + "But there are several things we can do with analysis that are harder or impossible with simulations:" + ] + }, + { + "cell_type": "markdown", + "id": "embedded-miniature", + "metadata": {}, + "source": [ + "- With analysis we can sometimes compute, exactly and efficiently, a\n", + " value that we could only approximate, less efficiently, with\n", + " simulation. For example, in the quadratic model we plotted growth rate versus population and saw net crossed through zero when the population is\n", + " near 14 billion. We could estimate the crossing point using a\n", + " numerical search algorithm (more about that later). But with the\n", + " analysis in Section xxx, we get the general result that\n", + " $K=-\\alpha/\\beta$.\n", + "\n", + "- Analysis often provides \"computational shortcuts\", that is, the\n", + " ability to jump forward in time to compute the state of a system\n", + " many time steps in the future without computing the intervening\n", + " states.\n", + "\n", + "- We can use analysis to state and prove generalizations about models;\n", + " for example, we might prove that certain results will always or\n", + " never occur. With simulations, we can show examples and sometimes\n", + " find counterexamples, but it is hard to write proofs.\n", + "\n", + "- Analysis can provide insight into models and the systems they\n", + " describe; for example, sometimes we can identify regimes of\n", + " qualitatively different behavior and key parameters that control\n", + " those behaviors." + ] + }, + { + "cell_type": "markdown", + "id": "impressive-planning", + "metadata": {}, + "source": [ + "When people see what analysis can do, they sometimes get drunk with\n", + "power, and imagine that it gives them a special ability to see past the veil of the material world and discern the laws of mathematics that govern the universe. When they analyze a model of a physical system, they talk about \"the math behind it\" as if our world is the mere shadow of a world of ideal mathematical entities (I am not making this up; see .).\n", + "\n", + "This is, of course, nonsense. Mathematical notation is a language\n", + "designed by humans for a purpose, specifically to facilitate symbolic\n", + "manipulations like algebra. Similarly, programming languages are\n", + "designed for a purpose, specifically to represent computational ideas\n", + "and run programs.\n", + "\n", + "Each of these languages is good for the purposes it was designed for and less good for other purposes. But they are often complementary, and one of the goals of this book is to show how they can be used together." + ] + }, + { + "cell_type": "markdown", + "id": "graduate-conducting", + "metadata": {}, + "source": [ + "## Analysis with WolframAlpha\n", + "\n", + "Until recently, most analysis was done by rubbing graphite on wood\n", + "pulp, a process that is laborious and error-prone. A useful\n", + "alternative is symbolic computation. If you have used services like\n", + "WolframAlpha, you have used symbolic computation.\n", + "\n", + "For example, if you go to and type\n", + "\n", + "```\n", + "df(t) / dt = alpha f(t)\n", + "```\n", + "\n", + "WolframAlpha infers that `f(t)` is a function of `t` and `alpha` is a\n", + "parameter; it classifies the query as a \"first-order linear ordinary\n", + "differential equation\\\", and reports the general solution:\n", + "\n", + "$$f(t) = c_1 \\exp(\\alpha t)$$ \n", + "\n", + "If you add a second equation to specify\n", + "the initial condition:\n", + "\n", + "```\n", + "df(t) / dt = alpha f(t), f(0) = p_0\n", + "```\n", + "\n", + "WolframAlpha reports the particular solution:\n", + "\n", + "$$f(t) = p_0 \\exp(\\alpha t)$$\n", + "\n", + "WolframAlpha is based on Mathematica, a powerful programming language\n", + "designed specifically for symbolic computation." + ] + }, + { + "cell_type": "markdown", + "id": "beginning-tamil", + "metadata": {}, + "source": [ + "## Analysis with SymPy\n", + "\n", + "Python has a library called SymPy that provides symbolic computation\n", + "tools similar to Mathematica. They are not as easy to use as\n", + "WolframAlpha, but they have some other advantages.\n", + "\n", + "Before we can use SymPy, we have to import it:" + ] + }, + { + "cell_type": "markdown", + "id": "civic-payday", + "metadata": {}, + "source": [ + "SymPy defines a `Symbol` object that represents symbolic variable names,\n", + "functions, and other mathematical entities.\n", + "\n", + "The `symbols` function takes a string and returns `Symbol` objects. So\n", + "if we run this assignment:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "flush-balance", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import symbols\n", + "\n", + "t = symbols('t')" + ] + }, + { + "cell_type": "markdown", + "id": "faced-praise", + "metadata": {}, + "source": [ + "Python understands that `t` is a symbol, not a numerical value. If we\n", + "now run" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "ancient-anderson", + "metadata": {}, + "outputs": [], + "source": [ + "expr = t + 1\n", + "expr" + ] + }, + { + "cell_type": "markdown", + "id": "industrial-confidence", + "metadata": {}, + "source": [ + "Python doesn't try to perform numerical addition; rather, it creates a\n", + "new `Symbol` that represents the sum of `t` and `1`. We can evaluate the\n", + "sum using `subs`, which substitutes a value for a symbol. This example\n", + "substitutes 2 for `t`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "familiar-oakland", + "metadata": {}, + "outputs": [], + "source": [ + "expr.subs(t, 2)" + ] + }, + { + "cell_type": "markdown", + "id": "progressive-celebration", + "metadata": {}, + "source": [ + "Functions in SymPy are represented by a special kind of `Symbol`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "incomplete-sleep", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Function\n", + "\n", + "f = Function('f')\n", + "f" + ] + }, + { + "cell_type": "markdown", + "id": "legislative-dispatch", + "metadata": {}, + "source": [ + "Now if we write `f(t)`, we get an object that represents the evaluation of a function, $f$, at a value, $t$. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "inside-sally", + "metadata": {}, + "outputs": [], + "source": [ + "f(t)" + ] + }, + { + "cell_type": "markdown", + "id": "interior-index", + "metadata": {}, + "source": [ + "But again SymPy doesn't actually\n", + "try to evaluate it." + ] + }, + { + "cell_type": "markdown", + "id": "indian-trout", + "metadata": {}, + "source": [ + "## Differential equations in SymPy\n", + "\n", + "SymPy provides a function, `diff`, that can differentiate a function. We can apply it to `f(t)` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "requested-program", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import diff\n", + "\n", + "dfdt = diff(f(t), t)\n", + "dfdt" + ] + }, + { + "cell_type": "markdown", + "id": "treated-commissioner", + "metadata": {}, + "source": [ + "The result is a `Symbol` that represents the derivative of `f` with\n", + "respect to `t`. But again, SymPy doesn't try to compute the derivative\n", + "yet.\n", + "\n", + "To represent a differential equation, we use `Eq`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "incomplete-parker", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Eq\n", + "\n", + "alpha = symbols('alpha')\n", + "eq1 = Eq(dfdt, alpha*f(t))\n", + "eq1" + ] + }, + { + "cell_type": "markdown", + "id": "concerned-asthma", + "metadata": {}, + "source": [ + "The result is an object that represents an equation. Now\n", + "we can use `dsolve` to solve this differential equation:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "described-overhead", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import dsolve\n", + "\n", + "solution_eq = dsolve(eq1)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "id": "inside-medicine", + "metadata": {}, + "source": [ + "The result is the **general\n", + "solution**, which still contains an unspecified constant, $C_1$. To get the **particular solution** where $f(0) = p_0$, we substitute `p_0` for `C1`. First, we have to create two more symbols:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "material-voice", + "metadata": {}, + "outputs": [], + "source": [ + "C1, p_0 = symbols('C1 p_0')" + ] + }, + { + "cell_type": "markdown", + "id": "serious-license", + "metadata": {}, + "source": [ + "Now we can perform the substitution:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "supposed-domestic", + "metadata": {}, + "outputs": [], + "source": [ + "particular = solution_eq.subs(C1, p_0)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "id": "modern-raleigh", + "metadata": {}, + "source": [ + "The result is called the **exponential growth curve**; see\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "negative-chance", + "metadata": {}, + "source": [ + "## Solving the quadratic growth model" + ] + }, + { + "cell_type": "markdown", + "id": "arabic-victorian", + "metadata": {}, + "source": [ + "We'll use the (r, K) parameterization, so we'll need two more symbols:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "political-chinese", + "metadata": {}, + "outputs": [], + "source": [ + "r, K = symbols('r K')" + ] + }, + { + "cell_type": "markdown", + "id": "virtual-temperature", + "metadata": {}, + "source": [ + "Now we can write the differential equation." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "lined-queen", + "metadata": {}, + "outputs": [], + "source": [ + "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2" + ] + }, + { + "cell_type": "markdown", + "id": "relative-zoning", + "metadata": {}, + "source": [ + "And solve it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "printable-typing", + "metadata": {}, + "outputs": [], + "source": [ + "solution_eq = dsolve(eq2)\n", + "solution_eq" + ] + }, + { + "cell_type": "markdown", + "id": "convertible-simple", + "metadata": {}, + "source": [ + "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "final-treatment", + "metadata": {}, + "outputs": [], + "source": [ + "general = solution_eq.rhs\n", + "general" + ] + }, + { + "cell_type": "markdown", + "id": "phantom-melbourne", + "metadata": {}, + "source": [ + "We can evaluate the right-hand side at $t=0$" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "freelance-admission", + "metadata": {}, + "outputs": [], + "source": [ + "at_0 = general.subs(t, 0)\n", + "at_0" + ] + }, + { + "cell_type": "markdown", + "id": "precise-radar", + "metadata": {}, + "source": [ + "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", + "\n", + "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "orange-glasgow", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import solve\n", + "\n", + "solutions = solve(Eq(at_0, p_0), C1)" + ] + }, + { + "cell_type": "markdown", + "id": "periodic-bikini", + "metadata": {}, + "source": [ + "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "expensive-palace", + "metadata": {}, + "outputs": [], + "source": [ + "type(solutions), len(solutions)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "worthy-sleeve", + "metadata": {}, + "outputs": [], + "source": [ + "value_of_C1 = solutions[0]\n", + "value_of_C1" + ] + }, + { + "cell_type": "markdown", + "id": "lightweight-pickup", + "metadata": {}, + "source": [ + "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "aggressive-queue", + "metadata": {}, + "outputs": [], + "source": [ + "particular = general.subs(C1, value_of_C1)\n", + "particular" + ] + }, + { + "cell_type": "markdown", + "id": "electric-albania", + "metadata": {}, + "source": [ + "The result is complicated, but SymPy provides a function that tries to simplify it." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "funded-tolerance", + "metadata": {}, + "outputs": [], + "source": [ + "particular.simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "scenic-preparation", + "metadata": {}, + "source": [ + "This function is called the **logistic growth curve**; see\n", + ". In the context of growth models, the\n", + "logistic function is often written like this:\n", + "\n", + "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", + "\n", + "where $A = (K - p_0) / p_0$." + ] + }, + { + "cell_type": "markdown", + "id": "burning-sherman", + "metadata": {}, + "source": [ + "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "institutional-finish", + "metadata": {}, + "outputs": [], + "source": [ + "A = (K - p_0) / p_0\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "noble-auditor", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import exp\n", + "\n", + "logistic = K / (1 + A * exp(-r*t))\n", + "logistic" + ] + }, + { + "cell_type": "markdown", + "id": "brave-conditions", + "metadata": {}, + "source": [ + "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "industrial-administrator", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "(particular - logistic).simplify()" + ] + }, + { + "cell_type": "markdown", + "id": "therapeutic-topic", + "metadata": {}, + "source": [ + "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", + "\n", + "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." + ] + }, + { + "cell_type": "markdown", + "id": "cutting-access", + "metadata": {}, + "source": [ + "If you would like to see this differential equation solved by hand, you might like this video: " + ] + }, + { + "cell_type": "markdown", + "id": "outstanding-launch", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter we wrote the growth models from the previous chapters in terms of difference and differential equations.\n", + "\n", + "What I called the constant growth model is more commonly called **linear growth** because the solution is a line. If we model time as continuous, the solution is\n", + "\n", + "$$f(t) = p_0 + \\alpha t$$\n", + "\n", + "where $\\alpha$ is the growth rate.\n", + "\n", + "Similarly, the proportional growth model is usually called **exponential growth** because the solution is exponential:\n", + "\n", + "$$f(t) = p_0 \\exp{\\alpha t}$$\n", + "\n", + "Finally, the quadratic growth model is called **logistic growth** because the solution is the logistic function:\n", + "\n", + "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", + "\n", + "where $A = (K - p_0) / p_0$." + ] + }, + { + "cell_type": "markdown", + "id": "adjacent-tracy", + "metadata": {}, + "source": [ + "I avoided these terms until now because they are based on results we had not derived yet." + ] + }, + { + "cell_type": "markdown", + "id": "offshore-passage", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "ideal-ecology", + "metadata": {}, + "source": [ + "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", + "\n", + "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "internal-knock", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "smooth-sunglasses", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "fundamental-arlington", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "desirable-alpha", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "coupled-grounds", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "looking-ground", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "anticipated-paragraph", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "residential-spanking", + "metadata": {}, + "source": [ + "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", + "\n", + " df(t) / dt = alpha f(t) + beta f(t)^2\n", + "\n", + "or\n", + "\n", + " df(t) / dt = r f(t) (1 - f(t)/K)\n", + "\n", + "Find the general solution and also the particular solution where `f(0) = p_0`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb new file mode 100644 index 00000000..5ef4f184 --- /dev/null +++ b/chapters/chap10.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "dense-storm", + "metadata": {}, + "source": [ + "# Chapter 10" + ] + }, + { + "cell_type": "markdown", + "id": "confused-bargain", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "thirty-medication", + "metadata": {}, + "source": [ + "# Case studies\n", + "\n", + "This chapter presents case studies where you can practice the tools we have learned so far." + ] + }, + { + "cell_type": "markdown", + "id": "industrial-mercy", + "metadata": {}, + "source": [ + "## Prehistoric World Population\n", + "\n", + "On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "usual-penguin", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "thick-lincoln", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_html\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ] + }, + { + "cell_type": "markdown", + "id": "disciplinary-chosen", + "metadata": {}, + "source": [ + "Select `tables[1]`, which is the second table on the page." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "conscious-orange", + "metadata": {}, + "outputs": [], + "source": [ + "table1 = tables[1]\n", + "table1.head()" + ] + }, + { + "cell_type": "markdown", + "id": "hungry-monster", + "metadata": {}, + "source": [ + "Not all researchers provide estimates for the same dates.\n", + "\n", + "Again, we'll replace the long column names with more convenient abbreviations." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "thick-blanket", + "metadata": {}, + "outputs": [], + "source": [ + "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", + " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" + ] + }, + { + "cell_type": "markdown", + "id": "substantial-implement", + "metadata": {}, + "source": [ + "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ranking-prescription", + "metadata": {}, + "outputs": [], + "source": [ + "for col in table1.columns:\n", + " table1[col] = pd.to_numeric(table1[col], errors='coerce')" + ] + }, + { + "cell_type": "markdown", + "id": "amazing-difference", + "metadata": {}, + "source": [ + "Here are the results. Notice that we are working in millions now, not billions." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "metallic-offense", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "table1.plot()\n", + "decorate(xlim=[-10000, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='Prehistoric population estimates')\n", + "plt.legend(fontsize='small');" + ] + }, + { + "cell_type": "markdown", + "id": "human-conservation", + "metadata": {}, + "source": [ + "We can use `xlim` to zoom in on everything after Year 0." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "solar-action", + "metadata": {}, + "outputs": [], + "source": [ + "table1.plot()\n", + "decorate(xlim=[0, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')" + ] + }, + { + "cell_type": "markdown", + "id": "wanted-fantasy", + "metadata": {}, + "source": [ + "See if you can find a model that fits these data well from Year 0 to 1950.\n", + "\n", + "How well does your best model predict actual population growth from 1950 to the present?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "together-jackson", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "simple-verse", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "ruled-spain", + "metadata": {}, + "source": [ + "## One queue or two?\n", + "\n", + "This case study is related to **queueing theory**, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", + "\n", + "Suppose you are designing the checkout area for a new store. There is\n", + "enough room in the store for two checkout counters and a waiting area\n", + "for customers. You can make two lines, one for each counter, or one line that feeds both counters.\n", + "\n", + "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you might have to install barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", + "\n", + "So you'd like to check whether the single line is really better and by\n", + "how much. Simulation can help answer this question.\n", + "\n", + "This figure shows the three scenarios we'll consider:\n", + "\n", + "![One queue, one server (left), one queue, two servers (middle), two\n", + "queues, two servers (right).](figs/queue.pdf){width=\"4.5in\"}\n", + "\n", + "As we did in the bike share model, we'll assume that a customer is equally likely to arrive during any time step. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "\n", + "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they always have the same probability of finishing during the next time step, regardless of how long they have been checking out. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", + "\n", + "If we choose $\\mu=1/5$ per minute, the average time for each checkout\n", + "will be 5 minutes, which is consistent with the data. Most people takes less than 5 minutes, but a few take substantially longer, which is probably not a bad model of the distribution in real stores.\n", + "\n", + "Now we're ready to get started. In the repository for this book, you'll find a notebook called `queue.ipynb` that contains some code to get you started and instructions.\n", + "\n", + "As always, you should practice incremental development: write no more\n", + "than one or two lines of code a time, and test as you go!" + ] + }, + { + "cell_type": "markdown", + "id": "forward-point", + "metadata": {}, + "source": [ + "## Predicting salmon populations\n", + "\n", + "Each year the U.S. Atlantic Salmon Assessment Committee reports\n", + "estimates of salmon populations in oceans and rivers in the northeastern United States. The reports are useful for monitoring changes in these populations, but they generally do not include predictions.\n", + "\n", + "The goal of this case study is to model year-to-year changes in\n", + "population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", + "\n", + "As an example, I use data from page 18 of the 2017 report, which\n", + "provides population estimates for the Narraguagus and Sheepscot Rivers\n", + "in Maine.\n", + "\n", + "In the repository for this book, you'll find a notebook called\n", + "`salmon.ipynb` that contains some code to get you started and\n", + "instructions.\n", + "\n", + "You should take my instructions as suggestions; if you want to try\n", + "something different, please do!" + ] + }, + { + "cell_type": "markdown", + "id": "limiting-moore", + "metadata": {}, + "source": [ + "## Tree growth\n", + "\n", + "This case study is based on \"Height-Age Curves for Planted Stands of\n", + "Douglas Fir, with Adjustments for Density\", a working paper by\n", + "Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", + "\n", + "It provides \"site index curves\", which are curves that show the\n", + "expected height of the tallest tree in a stand of Douglas firs as a\n", + "function of age, for a stand where the trees are the same age.\n", + "\n", + "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\\\" that indicates the quality of the site.\n", + "\n", + "The following figure shows site curves for three different site\n", + "indices. \n", + "\n", + "![Site index curves for tree\n", + "growth.](figs/trees-fig01.pdf){height=\"3in\"}\n", + "\n", + "The goal of this case study is to explain the shape of these\n", + "curves, that is, why trees grow the way they do.\n", + "\n", + "As a starting place, let's assume that the ability of the tree to gain\n", + "mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A$$\n", + "\n", + "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", + "\n", + "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power: $m = \\beta h^D$ where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. I start by assuming $D=3$, but then revisit that assumption.\n", + "\n", + "Finally, we'll assume that area is proportional to height squared:\n", + "\n", + "$$A = \\gamma h^2$$\n", + "\n", + "I specify height in feet, and choose units for mass and area so that\n", + "$\\beta=1$ and $\\gamma=1$. Putting all that together, we can write a\n", + "difference equation for height:\n", + "\n", + "$$h_{n+1}^D = h_n^D + \\alpha h_n^2$$\n", + "\n", + "With $D=3$, the solution to this equation is close to a straight line,\n", + "which is not a bad model for the growth curves. But the model implies\n", + "that trees can grow forever, and we know that's not true. As trees get\n", + "taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", + "\n", + "We can model this effect by adding a factor to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A$$\n", + "\n", + "Let's assume\n", + "\n", + "$$m_{n+1} = m_n + \\alpha A (1 - h / K)$$\n", + "\n", + "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", + "\n", + "In the repository for this book, you'll find a notebook called\n", + "`trees.ipynb` that implements both models and uses them to fit the data.\n", + "\n", + "There are no exercises in this case study; it is mostly meant as an\n", + "example of what you can do with the tools we have so far, and a preview of what we will be able to do with the tools in the next few chapters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "australian-gregory", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb new file mode 100644 index 00000000..6cd6a696 --- /dev/null +++ b/chapters/chap11.ipynb @@ -0,0 +1,821 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "pressing-munich", + "metadata": {}, + "source": [ + "# Chapter 11" + ] + }, + { + "cell_type": "markdown", + "id": "detected-creation", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "persistent-carbon", + "metadata": {}, + "source": [ + "In this chapter, we develop a model of an epidemic as it spreads in a\n", + "susceptible population, and use it to evaluate the effectiveness of\n", + "possible interventions.\n", + "\n", + "My presentation of the model in the next few chapters is based on an excellent article by David Smith and Lang Moore, [^1]: Smith and Moore, \"The SIR Model for Spread of Disease,\" Journal of Online Mathematics and its Applications, December 2001, available at ." + ] + }, + { + "cell_type": "markdown", + "id": "working-patent", + "metadata": {}, + "source": [ + "## The Freshman Plague\n", + "\n", + "Every year at Olin College, about 90 new students come to campus from\n", + "around the country and the world. Most of them arrive healthy and happy, but usually at least one brings with them some kind of infectious disease. A few weeks later, predictably, some fraction of the incoming class comes down with what we call \"The Freshman Plague\".\n", + "\n", + "In this chapter we introduce a well-known model of infectious disease,\n", + "the Kermack-McKendrick model, and use it to explain the progression of\n", + "the disease over the course of the semester, predict the effect of\n", + "possible interventions (like immunization) and design the most effective intervention campaign.\n", + "\n", + "So far we have done our own modeling; that is, we've chosen physical\n", + "systems, identified factors that seem important, and made decisions\n", + "about how to represent them. In this chapter we start with an existing\n", + "model and reverse-engineer it. Along the way, we consider the modeling\n", + "decisions that went into it and identify its capabilities and\n", + "limitations." + ] + }, + { + "cell_type": "markdown", + "id": "distant-expense", + "metadata": {}, + "source": [ + "## The SIR model\n", + "\n", + "The Kermack-McKendrick model is a simple version of an **SIR model**,\n", + "so-named because it considers three categories of people:\n", + "\n", + "- **S**: People who are \"susceptible\\\", that is, capable of\n", + " contracting the disease if they come into contact with someone who\n", + " is infected.\n", + "\n", + "- **I**: People who are \"infectious\\\", that is, capable of passing\n", + " along the disease if they come into contact with someone\n", + " susceptible.\n", + "\n", + "- **R**: People who are \"recovered\\\". In the basic version of the\n", + " model, people who have recovered are considered to be immune to\n", + " reinfection. That is a reasonable model for some diseases, but not\n", + " for others, so it should be on the list of assumptions to reconsider\n", + " later." + ] + }, + { + "cell_type": "markdown", + "id": "reasonable-kitchen", + "metadata": {}, + "source": [ + "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average. If 100 people are infectious at a\n", + "particular point in time, and we ignore the particular time each one\n", + "became infected, we expect about 1 out of 4 to recover on any particular day.\n", + "\n", + "Putting that a different way, if the time between recoveries is 4 days, the recovery rate is about 0.25 recoveries per day, which we'll denote with the Greek letter gamma, $\\gamma$, or the variable name `gamma`.\n", + "\n", + "If the total number of people in the population is $N$, and the fraction currently infectious is $i$, the total number of recoveries we expect per day is $\\gamma i N$." + ] + }, + { + "cell_type": "markdown", + "id": "important-yugoslavia", + "metadata": {}, + "source": [ + "Now let's think about the number of new infections. Suppose we know that each susceptible person comes into contact with 1 person every 3 days, on average, in a way that would cause them to become infected if the other person is infected. We'll denote this contact rate with the Greek letter beta, $\\beta$.\n", + "\n", + "It's probably not reasonable to assume that we know $\\beta$ ahead of\n", + "time, but later we'll see how to estimate it based on data from previous outbreaks.\n", + "\n", + "If $s$ is the fraction of the population that's susceptible, $s N$ is\n", + "the number of susceptible people, $\\beta s N$ is the number of contacts per day, and $\\beta s i N$ is the number of those contacts where the other person is infectious." + ] + }, + { + "cell_type": "markdown", + "id": "virgin-cambodia", + "metadata": {}, + "source": [ + "In summary:\n", + "\n", + "- The number of recoveries we expect per day is $\\gamma i N$; dividing by $N$ yields the fraction of the population that recovers in a day, which is $\\gamma i$.\n", + "\n", + "- The number of new infections we expect per day is $\\beta s i N$;\n", + " dividing by $N$ yields the fraction of the population that gets\n", + " infected in a day, which is $\\beta s i$.\n", + "\n", + "This model assumes that the population is closed; that is, no one\n", + "arrives or departs, so the size of the population, $N$, is constant." + ] + }, + { + "cell_type": "markdown", + "id": "fourth-celtic", + "metadata": {}, + "source": [ + "## The SIR equations\n", + "\n", + "If we treat time as a continuous quantity, we can write differential\n", + "equations that describe the rates of change for $s$, $i$, and $r$ (where $r$ is the fraction of the population that has recovered):\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{ds}{dt} &= -\\beta s i \\\\\n", + "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", + "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", + "\n", + "To avoid cluttering the equations, I leave it implied that $s$ is a function of time, $s(t)$, and likewise for $i$ and $r$.\n", + "\n", + "SIR models are examples of **compartment models**, so-called because\n", + "they divide the world into discrete categories, or compartments, and\n", + "describe transitions from one compartment to another. Compartments are\n", + "also called **stocks** and transitions between them are called\n", + "**flows**.\n", + "\n", + "In this example, there are three stocks---susceptible, infectious, and\n", + "recovered---and two flows---new infections and recoveries. Compartment\n", + "models are often represented visually using stock and flow diagrams (see ).\n", + "\n", + "The following figure shows the stock and flow diagram for an SIR\n", + "model.\n", + "\n", + "![Stock and flow diagram for an SIR\n", + "model.](figs/stock_flow1.pdf){width=\"4in\"}\n", + "\n", + "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." + ] + }, + { + "cell_type": "markdown", + "id": "martial-details", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "For a given physical system, there are many possible models, and for a\n", + "given model, there are many ways to represent it. For example, we can\n", + "represent an SIR model as a stock-and-flow diagram, as a set of\n", + "differential equations, or as a Python program. The process of\n", + "representing a model in these forms is called **implementation**. In\n", + "this section, we implement the SIR model in Python.\n", + "\n", + "I'll represent the initial state of the system using a `State` object\n", + "with state variables `S`, `I`, and `R`; they represent the fraction of\n", + "the population in each compartment.\n", + "\n", + "We can initialize the `State` object with the *number* of people in each compartment, assuming there is one infected student in a class of 90:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "criminal-change", + "metadata": {}, + "outputs": [], + "source": [ + "init = State(S=89, I=1, R=0)\n", + "init" + ] + }, + { + "cell_type": "markdown", + "id": "chronic-jonathan", + "metadata": {}, + "source": [ + "And then convert the numbers to fractions by dividing by the total:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "pediatric-ratio", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sum\n", + "\n", + "init /= sum(init)\n", + "init" + ] + }, + { + "cell_type": "markdown", + "id": "ordinary-scottish", + "metadata": {}, + "source": [ + "For now, let's assume we know the time between contacts and time between\n", + "recoveries:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "little-stylus", + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days" + ] + }, + { + "cell_type": "markdown", + "id": "covered-avenue", + "metadata": {}, + "source": [ + "We can use them to compute the parameters of the model:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "veterinary-aerospace", + "metadata": {}, + "outputs": [], + "source": [ + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day" + ] + }, + { + "cell_type": "markdown", + "id": "lightweight-delta", + "metadata": {}, + "source": [ + "Now we need a `System` object to store the parameters and initial\n", + "conditions. The following function takes the system parameters and returns a new `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "nasty-sherman", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def make_system(beta, gamma):\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ] + }, + { + "cell_type": "markdown", + "id": "victorian-blogger", + "metadata": {}, + "source": [ + "The default value for `t_end` is 14 weeks, about the length of a\n", + "semester.\n", + "\n", + "Here's what the `System` object looks like. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "supported-shadow", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "system = make_system(beta, gamma)\n", + "system" + ] + }, + { + "cell_type": "markdown", + "id": "alone-desire", + "metadata": {}, + "source": [ + "## The update function\n", + "\n", + "At any point in time, the state of the system is represented by a\n", + "`State` object with three variables, `S`, `I` and `R`. So I'll define an\n", + "update function that takes as parameters a `State` object, the current\n", + "time, and a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "wound-wayne", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ] + }, + { + "cell_type": "markdown", + "id": "aboriginal-malpractice", + "metadata": {}, + "source": [ + "The first line uses a feature we have not seen before, **multiple\n", + "assignment**. The value on the right side is a `State` object that\n", + "contains three values. The left side is a sequence of three variable\n", + "names. The assignment does just what we want: it assigns the three\n", + "values from the `State` object to the three variables, in order.\n", + "\n", + "The variables `s`, `i` and `r`, are lowercase to distinguish them\n", + "from the state variables, `S`, `I` and `R`.\n", + "\n", + "The update function computes `infected` and `recovered` as a fraction of the population, then updates `s`, `i` and `r`. The return value is a `State` that contains the updated values.\n", + "\n", + "When we call `update_func` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "assigned-feelings", + "metadata": {}, + "outputs": [], + "source": [ + "state = update_func(init, 0, system)\n", + "state" + ] + }, + { + "cell_type": "markdown", + "id": "standard-search", + "metadata": {}, + "source": [ + "You might notice that this version of `update_func` does not use one of its parameters, `t`. I include it anyway because update functions\n", + "sometimes depend on time, and it is convenient if they all take the same parameters, whether they need them or not." + ] + }, + { + "cell_type": "markdown", + "id": "informational-cisco", + "metadata": {}, + "source": [ + "## Running the simulation\n", + "\n", + "Now we can simulate the model over a sequence of time steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "occasional-pottery", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numpy import arange\n", + "\n", + "def run_simulation(system, update_func):\n", + " state = system.init\n", + "\n", + " for t in arange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + "\n", + " return state" + ] + }, + { + "cell_type": "markdown", + "id": "fifteen-metallic", + "metadata": {}, + "source": [ + "The parameters of `run_simulation` are the `System` object and the\n", + "update function. The `System` object contains the parameters, initial\n", + "conditions, and values of `t0` and `t_end`.\n", + "\n", + "We can call `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "differential-difference", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(beta, gamma)\n", + "final_state = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "incredible-marsh", + "metadata": {}, + "source": [ + "The result is the final state of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "weekly-acrobat", + "metadata": {}, + "outputs": [], + "source": [ + "final_state" + ] + }, + { + "cell_type": "markdown", + "id": "behind-removal", + "metadata": {}, + "source": [ + "This result indicates that after 14 weeks (98 days), about 52% of the\n", + "population is still susceptible, which means they were never infected,\n", + "less than 1% are actively infected, and 48% have recovered, which means they were infected at some point." + ] + }, + { + "cell_type": "markdown", + "id": "serial-genius", + "metadata": {}, + "source": [ + "## Collecting the results\n", + "\n", + "The previous version of `run_simulation` only returns the final state,\n", + "but we might want to see how the state changes over time. We'll consider two ways to do that: first, using three `TimeSeries` objects, then using a new object called a `TimeFrame`.\n", + "\n", + "Here's the first version:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "advanced-recommendation", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "def run_simulation(system, update_func):\n", + " S = TimeSeries()\n", + " I = TimeSeries()\n", + " R = TimeSeries()\n", + "\n", + " state = system.init\n", + " t0 = system.t0\n", + " S[t0], I[t0], R[t0] = state\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " S[t+1], I[t+1], R[t+1] = state\n", + " \n", + " return S, I, R" + ] + }, + { + "cell_type": "markdown", + "id": "behind-breathing", + "metadata": {}, + "source": [ + "First, we create `TimeSeries` objects to store the results. Notice that\n", + "the variables `S`, `I`, and `R` are `TimeSeries` objects now.\n", + "\n", + "Next we initialize `state`, `t0`, and the first elements of `S`, `I` and\n", + "`R`.\n", + "\n", + "Inside the loop, we use `update_func` to compute the state of the system\n", + "at the next time step, then use multiple assignment to unpack the\n", + "elements of `state`, assigning each to the corresponding `TimeSeries`.\n", + "\n", + "At the end of the function, we return the values `S`, `I`, and `R`. This\n", + "is the first example we have seen where a function returns more than one\n", + "value.\n", + "\n", + "Now we can run the function like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "subtle-zambia", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(beta, gamma)\n", + "S, I, R = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "smoking-toddler", + "metadata": {}, + "source": [ + "We'll use the following function to plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "welcome-tractor", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def plot_results(S, I, R):\n", + " S.plot(style='--', label='Susceptible')\n", + " I.plot(style='-', label='Infected')\n", + " R.plot(style=':', label='Resistant')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "markdown", + "id": "important-command", + "metadata": {}, + "source": [ + "And run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "agricultural-joining", + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(S, I, R)" + ] + }, + { + "cell_type": "markdown", + "id": "civic-pharmacy", + "metadata": {}, + "source": [ + "Notice that it takes about three weeks (21 days) for the outbreak to get going, and about six weeks (42 days) before it peaks. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." + ] + }, + { + "cell_type": "markdown", + "id": "unexpected-empire", + "metadata": {}, + "source": [ + "## Now with a TimeFrame\n", + "\n", + "If the number of state variables is small, storing them as separate\n", + "`TimeSeries` objects might not be so bad. But a better alternative is to use a `TimeFrame`, which is another object defined in the ModSim\n", + "library.\n", + "\n", + "A `TimeFrame` is a kind of a `DataFrame`, which we used in.\n", + "\n", + "Here's a more concise version of `run_simulation` using a `TimeFrame`:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "native-central", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.loc[system.t0] = system.init\n", + " \n", + " for t in arange(system.t0, system.t_end):\n", + " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "beginning-secret", + "metadata": {}, + "source": [ + "The first line creates an empty `TimeFrame` with one column for each\n", + "state variable. Then, before the loop starts, we store the initial\n", + "conditions in the `TimeFrame` at `t0`. Based on the way we've been using\n", + "`TimeSeries` objects, it is tempting to write:\n", + "\n", + "```\n", + "frame[system.t0] = system.init\n", + "```\n", + "\n", + "But when you use the bracket operator with a `TimeFrame` or `DataFrame`, it selects a column, not a row. \n", + "\n", + "To select a row, we have to use `loc`, like this:\n", + "\n", + "```\n", + "frame.loc[system.t0] = system.init\n", + "```\n", + "\n", + "Since the value on the right side is a `State`, the assignment matches\n", + "up the index of the `State` with the columns of the `TimeFrame`; that\n", + "is, it assigns the `S` value from `system.init` to the `S` column of\n", + "`frame`, and likewise with `I` and `R`.\n", + "\n", + "We use the same feature to write the loop more concisely, assigning the `State` we get from `update_func` directly to the next row of\n", + "`frame`.\n", + "\n", + "Finally, we return `frame`. We can call this version of `run_simulation` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "quick-fifty", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "global-complement", + "metadata": {}, + "source": [ + "And plot the results like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "listed-enough", + "metadata": {}, + "outputs": [], + "source": [ + "plot_results(results.S, results.I, results.R)" + ] + }, + { + "cell_type": "markdown", + "id": "welsh-distinction", + "metadata": {}, + "source": [ + "As with a `DataFrame`, we can use the dot operator to select columns\n", + "from a `TimeFrame`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "neutral-replacement", + "metadata": {}, + "source": [ + "## Summary\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "induced-tunnel", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "floral-remove", + "metadata": {}, + "source": [ + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", + "\n", + "Hint: what is the change in `S` between the beginning and the end of the simulation?" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "recovered-freeze", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "interpreted-colony", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "given-canberra", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb new file mode 100644 index 00000000..a693d9d7 --- /dev/null +++ b/chapters/chap12.ipynb @@ -0,0 +1,852 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "combined-semiconductor", + "metadata": {}, + "source": [ + "# Chapter 12" + ] + }, + { + "cell_type": "markdown", + "id": "excellent-orchestra", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "growing-sperm", + "metadata": {}, + "outputs": [], + "source": [ + "# import code from previous notebooks\n", + "\n", + "from chap11 import make_system\n", + "from chap11 import update_func\n", + "from chap11 import run_simulation" + ] + }, + { + "cell_type": "markdown", + "id": "identical-steam", + "metadata": {}, + "source": [ + "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects." + ] + }, + { + "cell_type": "markdown", + "id": "complex-renewal", + "metadata": {}, + "source": [ + "## Immunization\n", + "\n", + "Models like this are useful for testing \"what if?\" scenarios. As an\n", + "example, we'll consider the effect of immunization.\n", + "\n", + "Suppose there is a vaccine that causes a student to become immune to the Freshman Plague without being infected. How might you modify the model to capture this effect?\n", + "\n", + "One option is to treat immunization as a shortcut from susceptible to\n", + "recovered without going through infectious. We can implement this\n", + "feature like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "recent-cooper", + "metadata": {}, + "outputs": [], + "source": [ + "def add_immunization(system, fraction):\n", + " system.init.S -= fraction\n", + " system.init.R += fraction" + ] + }, + { + "cell_type": "markdown", + "id": "arranged-screening", + "metadata": {}, + "source": [ + "`add_immunization` moves the given fraction of the population from `S`\n", + "to `R`. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "found-learning", + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "results = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "unsigned-joseph", + "metadata": {}, + "source": [ + "If we assume that 10% of students are vaccinated at the\n", + "beginning of the semester, and the vaccine is 100% effective, we can\n", + "simulate the effect like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "funny-copper", + "metadata": {}, + "outputs": [], + "source": [ + "system2 = make_system(beta, gamma)\n", + "add_immunization(system2, 0.1)\n", + "results2 = run_simulation(system2, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "bronze-techno", + "metadata": {}, + "source": [ + "The following figure shows `S` as a function of time, with and\n", + "without immunization." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "divided-biotechnology", + "metadata": {}, + "outputs": [], + "source": [ + "results.S.plot(label='No immunization')\n", + "results2.S.plot(label='10% immunization')\n", + "\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ] + }, + { + "cell_type": "markdown", + "id": "postal-cemetery", + "metadata": {}, + "source": [ + "## Metrics\n", + "\n", + "When we plot a time series, we get a view of everything that happened\n", + "when the model ran, but often we want to boil it down to a few numbers\n", + "that summarize the outcome. These summary statistics are called\n", + "**metrics**, as we saw in Section xxx.\n", + "\n", + "In the SIR model, we might want to know the time until the peak of the\n", + "outbreak, the number of people who are sick at the peak, the number of\n", + "students who will still be sick at the end of the semester, or the total number of students who get sick at any point.\n", + "\n", + "As an example, I will focus on the last one --- the total number of sick students --- and we will consider interventions intended to minimize it.\n", + "\n", + "When a person gets infected, they move from `S` to `I`, so we can get\n", + "the total number of infections by computing the difference in `S` at the beginning and the end:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "synthetic-element", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def calc_total_infected(results, system):\n", + " s_0 = results.S[system.t0]\n", + " s_end = results.S[system.t_end]\n", + " return s_0 - s_end" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "recovered-picnic", + "metadata": {}, + "outputs": [], + "source": [ + "calc_total_infected(results, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "american-transfer", + "metadata": {}, + "outputs": [], + "source": [ + "calc_total_infected(results2, system2)" + ] + }, + { + "cell_type": "markdown", + "id": "adverse-trance", + "metadata": {}, + "source": [ + "Without immunization, almost 47% of the population gets infected at some point. With 10% immunization, only 31% get infected. That's pretty good." + ] + }, + { + "cell_type": "markdown", + "id": "eight-maximum", + "metadata": {}, + "source": [ + "## Sweeping Immunization\n", + "\n", + "Now let's see what happens if we administer more vaccines. This\n", + "following function sweeps a range of immunization rates:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "progressive-architect", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_immunity(immunize_array):\n", + " sweep = SweepSeries()\n", + "\n", + " for fraction in immunize_array:\n", + " sir = make_system(beta, gamma)\n", + " add_immunization(sir, fraction)\n", + " results = run_simulation(sir, update_func)\n", + " sweep[fraction] = calc_total_infected(results, sir)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "indie-seeker", + "metadata": {}, + "source": [ + "The parameter of `sweep_immunity` is an array of immunization rates. The\n", + "result is a `SweepSeries` object that maps from each immunization rate\n", + "to the resulting fraction of students ever infected.\n", + "\n", + "The following figure shows a plot of the `SweepSeries`. Notice that\n", + "the x-axis is the immunization rate, not time." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "measured-pavilion", + "metadata": {}, + "outputs": [], + "source": [ + "immunize_array = linspace(0, 1, 21)\n", + "infected_sweep = sweep_immunity(immunize_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "interior-humanitarian", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep.plot()\n", + "\n", + "decorate(xlabel='Fraction immunized',\n", + " ylabel='Total fraction infected',\n", + " title='Fraction infected vs. immunization rate')" + ] + }, + { + "cell_type": "markdown", + "id": "turkish-mumbai", + "metadata": {}, + "source": [ + "As the immunization rate increases, the number of infections drops\n", + "steeply. If 40% of the students are immunized, fewer than 4% get sick.\n", + "That's because immunization has two effects: it protects the people who get immunized (of course) but it also protects the rest of the\n", + "population.\n", + "\n", + "Reducing the number of \"susceptibles\" and increasing the number of\n", + "\"resistants\" makes it harder for the disease to spread, because some\n", + "fraction of contacts are wasted on people who cannot be infected. This\n", + "phenomenon is called **herd immunity**, and it is an important element\n", + "of public health (see )." + ] + }, + { + "cell_type": "markdown", + "id": "french-spouse", + "metadata": {}, + "source": [ + "The steepness of the curve is a blessing and a curse. It's a blessing\n", + "because it means we don't have to immunize everyone, and vaccines can\n", + "protect the \"herd\" even if they are not 100% effective.\n", + "\n", + "But it's a curse because a small decrease in immunization can cause a\n", + "big increase in infections. In this example, if we drop from 80%\n", + "immunization to 60%, that might not be too bad. But if we drop from 40% to 20%, that would trigger a major outbreak, affecting more than 15% of the population. For a serious disease like measles, just to name one, that would be a public health catastrophe.\n", + "\n", + "One use of models like this is to demonstrate phenomena like herd\n", + "immunity and to predict the effect of interventions like vaccination.\n", + "Another use is to evaluate alternatives and guide decision making. We'll see an example in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "changed-capability", + "metadata": {}, + "source": [ + "## Hand washing\n", + "\n", + "Suppose you are the Dean of Student Life, and you have a budget of just \\$1200 to combat the Freshman Plague. You have two options for spending this money:\n", + "\n", + "1. You can pay for vaccinations, at a rate of \\$100 per dose.\n", + "\n", + "2. You can spend money on a campaign to remind students to wash hands\n", + " frequently.\n", + "\n", + "We have already seen how we can model the effect of vaccination. Now\n", + "let's think about the hand-washing campaign. We'll have to answer two\n", + "questions:\n", + "\n", + "1. How should we incorporate the effect of hand washing in the model?\n", + "\n", + "2. How should we quantify the effect of the money we spend on a\n", + " hand-washing campaign?\n", + "\n", + "For the sake of simplicity, let's assume that we have data from a\n", + "similar campaign at another school showing that a well-funded campaign\n", + "can change student behavior enough to reduce the infection rate by 20%.\n", + "\n", + "In terms of the model, hand washing has the effect of reducing `beta`.\n", + "That's not the only way we could incorporate the effect, but it seems\n", + "reasonable and it's easy to implement." + ] + }, + { + "cell_type": "markdown", + "id": "alpine-guest", + "metadata": {}, + "source": [ + "Now we have to model the relationship between the money we spend and the\n", + "effectiveness of the campaign. Again, let's suppose we have data from\n", + "another school that suggests:\n", + "\n", + "- If we spend \\$500 on posters, materials, and staff time, we can\n", + " change student behavior in a way that decreases the effective value of `beta` by 10%.\n", + "\n", + "- If we spend \\$1000, the total decrease in `beta` is almost 20%.\n", + "\n", + "- Above \\$1000, additional spending has little additional benefit." + ] + }, + { + "cell_type": "markdown", + "id": "agricultural-trinidad", + "metadata": {}, + "source": [ + "## Logistic function" + ] + }, + { + "cell_type": "markdown", + "id": "cheap-structure", + "metadata": {}, + "source": [ + "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "blond-armstrong", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import exp\n", + "\n", + "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", + " \"\"\"Computes the generalize logistic function.\n", + " \n", + " A: controls the lower bound\n", + " B: controls the steepness of the transition \n", + " C: not all that useful, AFAIK\n", + " M: controls the location of the transition\n", + " K: controls the upper bound\n", + " Q: shift the transition left or right\n", + " nu: affects the symmetry of the transition\n", + " \n", + " returns: float or array\n", + " \"\"\"\n", + " exponent = -B * (x - M)\n", + " denom = C + Q * exp(exponent)\n", + " return A + (K-A) / denom ** (1/nu)" + ] + }, + { + "cell_type": "markdown", + "id": "seven-budget", + "metadata": {}, + "source": [ + "The following array represents the range of possible spending." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "disturbed-amount", + "metadata": {}, + "outputs": [], + "source": [ + "spending = linspace(0, 1200, 21)" + ] + }, + { + "cell_type": "markdown", + "id": "supreme-nutrition", + "metadata": {}, + "source": [ + "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "\n", + "`M` is chosen so the transition happens around \\$500.\n", + "\n", + "`K` is the maximum reduction in `beta`, 20%.\n", + "\n", + "`B` is chosen by trial and error to yield a curve that seems feasible." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "otherwise-answer", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " \"\"\"Reduction factor as a function of spending.\n", + " \n", + " spending: dollars from 0 to 1200\n", + " \n", + " returns: fractional reduction in beta\n", + " \"\"\"\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "expected-venture", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "seventh-strike", + "metadata": {}, + "outputs": [], + "source": [ + "percent_reduction = compute_factor(spending) * 100\n", + "\n", + "make_series(spending, percent_reduction).plot()\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Percent reduction in infection rate',\n", + " title='Effect of hand washing on infection rate')" + ] + }, + { + "cell_type": "markdown", + "id": "legal-michigan", + "metadata": {}, + "source": [ + "The result is the following function, which\n", + "takes spending as a parameter and returns `factor`, which is the factor\n", + "by which `beta` is reduced:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "obvious-congress", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "sunset-investing", + "metadata": {}, + "source": [ + "I use `compute_factor` to write `add_hand_washing`, which takes a\n", + "`System` object and a budget, and modifies `system.beta` to model the\n", + "effect of hand washing:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "polish-multiple", + "metadata": {}, + "outputs": [], + "source": [ + "def add_hand_washing(system, spending):\n", + " factor = compute_factor(spending)\n", + " system.beta *= (1 - factor)" + ] + }, + { + "cell_type": "markdown", + "id": "worthy-fellowship", + "metadata": {}, + "source": [ + "Now we can sweep a range of values for `spending` and use the simulation\n", + "to compute the effect:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "statistical-garden", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_hand_washing(spending_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " sweep[spending] = calc_total_infected(results, system)\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "clinical-surge", + "metadata": {}, + "source": [ + "Here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "joined-graduation", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "spending_array = linspace(0, 1200, 20)\n", + "infected_sweep2 = sweep_hand_washing(spending_array)" + ] + }, + { + "cell_type": "markdown", + "id": "designing-smile", + "metadata": {}, + "source": [ + "The following figure shows the result. " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "cheap-decision", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep2.plot()\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Total fraction infected',\n", + " title='Effect of hand washing on total infections')" + ] + }, + { + "cell_type": "markdown", + "id": "selective-right", + "metadata": {}, + "source": [ + "Below \\$200, the campaign has little effect. \n", + "\n", + "At \\$800 it has a substantial effect, reducing total infections from more than 45% to about 20%. \n", + "\n", + "Above \\$800, the additional benefit is small." + ] + }, + { + "cell_type": "markdown", + "id": "lucky-boulder", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "Let's put it all together. With a fixed budget of \\$1200, we have to\n", + "decide how many doses of vaccine to buy and how much to spend on the\n", + "hand-washing campaign.\n", + "\n", + "Here are the parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "surrounded-copying", + "metadata": {}, + "outputs": [], + "source": [ + "num_students = 90\n", + "budget = 1200\n", + "price_per_dose = 100\n", + "max_doses = int(budget / price_per_dose)\n", + "max_doses" + ] + }, + { + "cell_type": "markdown", + "id": "expired-conditioning", + "metadata": {}, + "source": [ + "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", + "built-in function that converts numbers to integers, rounding down.\n", + "\n", + "We'll sweep the range of possible doses:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "shaped-utility", + "metadata": {}, + "outputs": [], + "source": [ + "dose_array = linrange(max_doses)" + ] + }, + { + "cell_type": "markdown", + "id": "occupational-reply", + "metadata": {}, + "source": [ + "In this example we call `linrange` with only one argument; it returns a NumPy array with the integers from 0 to `max_doses`, including both.\n", + "\n", + "Then we run the simulation for each element of `dose_array`:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "recognized-release", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_doses(dose_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " sweep[doses] = calc_total_infected(results, system)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "cardiac-mitchell", + "metadata": {}, + "source": [ + "For each number of doses, we compute the fraction of students we can\n", + "immunize, `fraction` and the remaining budget we can spend on the\n", + "campaign, `spending`. Then we run the simulation with those quantities\n", + "and store the number of infections.\n", + "\n", + "The following figure shows the result." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "worth-mounting", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep3 = sweep_doses(dose_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "adjusted-highlight", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep3.plot()\n", + "\n", + "decorate(xlabel='Doses of vaccine',\n", + " ylabel='Total fraction infected',\n", + " title='Total infections vs. doses')" + ] + }, + { + "cell_type": "markdown", + "id": "dynamic-easter", + "metadata": {}, + "source": [ + "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", + "\n", + "As we increase the number of doses, we have to cut campaign spending,\n", + "which turns out to make things worse. But interestingly, when we get\n", + "above 10 doses, the effect of herd immunity starts to kick in, and the\n", + "number of sick students goes down again." + ] + }, + { + "cell_type": "markdown", + "id": "amino-excess", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "timely-bottom", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" + ] + }, + { + "cell_type": "markdown", + "id": "drawn-hindu", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", + "\n", + "How might you incorporate the effect of quarantine in the SIR model?" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "impressive-librarian", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb new file mode 100644 index 00000000..f2ef27f3 --- /dev/null +++ b/chapters/chap13.ipynb @@ -0,0 +1,566 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "artistic-wells", + "metadata": {}, + "source": [ + "# Chapter 13" + ] + }, + { + "cell_type": "markdown", + "id": "ceramic-rendering", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "apparent-horizon", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import code from previous notebooks\n", + "\n", + "from chap11 import make_system\n", + "from chap11 import update_func\n", + "from chap11 import run_simulation\n", + "from chap12 import calc_total_infected" + ] + }, + { + "cell_type": "markdown", + "id": "electoral-montgomery", + "metadata": {}, + "source": [ + "In the previous chapters I presented an SIR model of infectious disease, specifically the Kermack-McKendrick model. We extended the model to include vaccination and the effect of a hand-washing campaign, and used the extended model to allocate a limited budget optimally, that is, to minimize the number of infections.\n", + "\n", + "But we assumed that the parameters of the model, contact rate and\n", + "recovery rate, were known. In this chapter, we explore the behavior of\n", + "the model as we vary these parameters, use analysis to understand these relationships better, and propose a method for using data to estimate parameters." + ] + }, + { + "cell_type": "markdown", + "id": "nervous-spread", + "metadata": {}, + "source": [ + "## Sweeping beta\n", + "\n", + "Recall that $\\beta$ is the contact rate, which captures both the\n", + "frequency of interaction between people and the fraction of those\n", + "interactions that result in a new infection. If $N$ is the size of the\n", + "population and $s$ is the fraction that's susceptible, $s N$ is the\n", + "number of susceptibles, $\\beta s N$ is the number of contacts per day\n", + "between susceptibles and other people, and $\\beta s i N$ is the number\n", + "of those contacts where the other person is infectious.\n", + "\n", + "As $\\beta$ increases, we expect the total number of infections to\n", + "increase. To quantify that relationship, I'll create a range of values\n", + "for $\\beta$:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "amazing-operations", + "metadata": {}, + "outputs": [], + "source": [ + "beta_array = linspace(0.1, 1.1, 11)\n", + "gamma = 0.25" + ] + }, + { + "cell_type": "markdown", + "id": "adopted-selling", + "metadata": {}, + "source": [ + "Then run the simulation for each value and print the results." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "brief-minutes", + "metadata": {}, + "outputs": [], + "source": [ + "for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " print(beta, calc_total_infected(results, system))" + ] + }, + { + "cell_type": "markdown", + "id": "understanding-teach", + "metadata": {}, + "source": [ + "We can wrap that code in a function and store the results in a\n", + "`SweepSeries` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "single-burke", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[beta] = calc_total_infected(results, system)\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "wired-wrist", + "metadata": {}, + "source": [ + "Now we can run `sweep_beta` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "collected-practice", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep = sweep_beta(beta_array, gamma)" + ] + }, + { + "cell_type": "markdown", + "id": "exempt-binary", + "metadata": {}, + "source": [ + "And plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "competitive-amount", + "metadata": {}, + "outputs": [], + "source": [ + "label = f'gamma = {gamma}'\n", + "label" + ] + }, + { + "cell_type": "markdown", + "id": "imported-huntington", + "metadata": {}, + "source": [ + "The first line uses a formatted string literal, also called an **f-string** to assemble a label for the plotted line:\n", + "\n", + "- An f-string starts with the letter \"f\" followed by a string in single or double quote. \n", + "\n", + "- The string can contain any number of format specifiers in squiggly brackets, `{}`.\n", + "\n", + "- When a variable name appears in a format specifier, it is replaced with the value of the variable.\n", + "\n", + "In this example, if the value of `gamma` is `0.25`, the value of `label` is `'gamma = 0.25'`.\n", + "\n", + "You can read more about f-strings at .\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "certain-second", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep.plot(label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "affiliated-honduras", + "metadata": {}, + "source": [ + "Remember that this figure\n", + "is a parameter sweep, not a time series, so the x-axis is the parameter\n", + "`beta`, not time.\n", + "\n", + "When `beta` is small, the contact rate is low and the outbreak never\n", + "really takes off; the total number of infected students is near zero. As\n", + "`beta` increases, it reaches a threshold near 0.3 where the fraction of\n", + "infected students increases quickly. When `beta` exceeds 0.5, more than\n", + "80% of the population gets sick." + ] + }, + { + "cell_type": "markdown", + "id": "worst-alexandria", + "metadata": {}, + "source": [ + "## Sweeping gamma\n", + "\n", + "Let's see what that looks like for a few different values of `gamma`.\n", + "Again, we'll use `linspace` to make an array of values:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "advised-venice", + "metadata": {}, + "outputs": [], + "source": [ + "gamma_array = linspace(0.1, 0.7, 4)" + ] + }, + { + "cell_type": "markdown", + "id": "sensitive-folder", + "metadata": {}, + "source": [ + "And run `sweep_beta` for each value of `gamma`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "determined-consent", + "metadata": {}, + "outputs": [], + "source": [ + "for gamma in gamma_array:\n", + " infected_sweep = sweep_beta(beta_array, gamma)\n", + " label = 'gamma = ' + str(gamma)\n", + " infected_sweep.plot(label=label)\n", + " \n", + "decorate()" + ] + }, + { + "cell_type": "markdown", + "id": "tutorial-venture", + "metadata": {}, + "source": [ + "When `gamma` is low, the recovery rate is low, which means people are infectious longer.\n", + "In that case, even a low contact rate (`beta`) results in an epidemic.\n", + "\n", + "When `gamma` is high, `beta` has to be even higher to get things going." + ] + }, + { + "cell_type": "markdown", + "id": "rising-flour", + "metadata": {}, + "source": [ + "## SweepFrame\n", + "\n", + "In the previous section, we swept a range of values for `gamma`, and for\n", + "each value, we swept a range of values for `beta`. This process is a\n", + "**two-dimensional sweep**.\n", + "\n", + "If we want to store the results, rather than plot them, we can use a\n", + "`SweepFrame`, which is a kind of `DataFrame` where the rows sweep one\n", + "parameter, the columns sweep another parameter, and the values contain\n", + "metrics from a simulation.\n", + "\n", + "This function shows how it works:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "aquatic-federal", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "level-distinction", + "metadata": {}, + "source": [ + "`sweep_parameters` takes as parameters an array of values for `beta` and\n", + "an array of values for `gamma`.\n", + "\n", + "It creates a `SweepFrame` to store the results, with one column for each\n", + "value of `gamma` and one row for each value of `beta`.\n", + "\n", + "Each time through the loop, we run `sweep_beta`. The result is a\n", + "`SweepSeries` object with one element for each value of `beta`. The\n", + "assignment inside the loop stores the `SweepSeries` as a new column in\n", + "the `SweepFrame`, corresponding to the current value of `gamma`.\n", + "\n", + "At the end, the `SweepFrame` stores the fraction of students infected\n", + "for each pair of parameters, `beta` and `gamma`.\n", + "\n", + "We can run `sweep_parameters` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "julian-liberia", + "metadata": {}, + "outputs": [], + "source": [ + "frame = sweep_parameters(beta_array, gamma_array)" + ] + }, + { + "cell_type": "markdown", + "id": "sharing-contemporary", + "metadata": {}, + "source": [ + "With the results in a `SweepFrame`, we can plot each column like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "superior-redhead", + "metadata": {}, + "outputs": [], + "source": [ + "for gamma in gamma_array:\n", + " label = f'gamma = {gamma}'\n", + " frame[gamma].plot(label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "english-photographer", + "metadata": {}, + "source": [ + "Alternatively, we can plot each row like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "regular-drama", + "metadata": {}, + "outputs": [], + "source": [ + "for beta in [0.2, 0.5, 0.8, 1.1]:\n", + " label = f'beta = {beta}'\n", + " frame.loc[beta].plot(label=label)\n", + " \n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "selective-evaluation", + "metadata": {}, + "source": [ + "This example demonstrates one use of a `SweepFrame`: we can run the analysis once, save the results, and then generate different visualizations.\n", + "\n", + "Another way to visualize the results of a two-dimensional sweep is a\n", + "**contour plot**, which shows the parameters on the axes and contour\n", + "lines, that is, lines of constant value. In this example, the value is\n", + "the fraction of students infected.\n", + "\n", + "The ModSim library provides `contour`, which takes a `SweepFrame` as a\n", + "parameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "logical-method", + "metadata": {}, + "outputs": [], + "source": [ + "contour(frame)\n", + "\n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Contact rate (beta)',\n", + " title='Fraction infected, contour plot')" + ] + }, + { + "cell_type": "markdown", + "id": "corresponding-headline", + "metadata": {}, + "source": [ + "Infection rates are lowest in the lower right, where the contact rate is and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", + "\n", + "This figure suggests that there might be a relationship between `beta`\n", + "and `gamma` that determines the outcome of the model. In fact, there is.\n", + "In the next chapter we'll explore it by running simulations, then derive it by analysis.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "located-double", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "flying-tracker", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "stopped-breathing", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "talented-crack", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "pressed-isaac", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "equal-crazy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "desirable-crystal", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb new file mode 100644 index 00000000..5a8f9484 --- /dev/null +++ b/chapters/chap14.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "happy-minutes", + "metadata": {}, + "source": [ + "# Chapter 14" + ] + }, + { + "cell_type": "markdown", + "id": "impressed-headline", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "level-struggle", + "metadata": {}, + "outputs": [], + "source": [ + "# import code from previous notebooks\n", + "\n", + "from chap11 import make_system\n", + "from chap11 import update_func\n", + "from chap11 import run_simulation\n", + "\n", + "from chap12 import calc_total_infected\n", + "\n", + "from chap13 import sweep_beta\n", + "from chap13 import sweep_parameters" + ] + }, + { + "cell_type": "markdown", + "id": "disturbed-joshua", + "metadata": {}, + "source": [ + "In the previous chapters we used simulation to predict the effect of an infectious disease in a susceptible population and to design\n", + "interventions that would minimize the effect.\n", + "\n", + "In this chapter we use analysis to investigate the relationship between the parameters, `beta` and `gamma`, and the outcome of the simulation." + ] + }, + { + "cell_type": "markdown", + "id": "respiratory-twelve", + "metadata": {}, + "source": [ + "## Nondimensionalization\n", + "\n", + "The figures in\n", + "Section [\\[sweepframe\\]](#sweepframe){reference-type=\"ref\"\n", + "reference=\"sweepframe\"} suggest that there is a relationship between the parameters of the SIR model, `beta` and `gamma`, that determines the outcome of the simulation, the fraction of students infected. Let's think what that relationship might be.\n", + "\n", + "- When `beta` exceeds `gamma`, that means there are more contacts\n", + " (that is, potential infections) than recoveries during each day (or other unit of time). The difference between `beta` and `gamma` might be called the \"excess contact rate\\\", in units of contacts per day.\n", + "\n", + "- As an alternative, we might consider the ratio `beta/gamma`, which\n", + " is the number of contacts per recovery. Because the numerator and\n", + " denominator are in the same units, this ratio is **dimensionless**, which means it has no units.\n", + "\n", + "Describing physical systems using dimensionless parameters is often a\n", + "useful move in the modeling and simulation game. It is so useful, in\n", + "fact, that it has a name: **nondimensionalization** (see\n", + ").\n", + "\n", + "So we'll try the second option first." + ] + }, + { + "cell_type": "markdown", + "id": "caroline-compiler", + "metadata": {}, + "source": [ + "## Exploring the results\n", + "\n", + "Suppose we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`. Each element in the `SweepFrame` is the fraction of students infected in a simulation with a given pair of parameters.\n", + "\n", + "We can print the values in the `SweepFrame` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "flying-chosen", + "metadata": {}, + "outputs": [], + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "satisfied-japan", + "metadata": {}, + "outputs": [], + "source": [ + "for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " print(beta, gamma, frac_infected)" + ] + }, + { + "cell_type": "markdown", + "id": "automotive-solution", + "metadata": {}, + "source": [ + "This is the first example we've seen with one `for` loop inside another:\n", + "\n", + "- Each time the outer loop runs, it selects a value of `gamma` from\n", + " the columns of the `DataFrame` and extracts the corresponding\n", + " column.\n", + "\n", + "- Each time the inner loop runs, it selects a value of `beta` from the\n", + " column and selects the corresponding element, which is the fraction\n", + " of students infected.\n", + "\n", + "In the example from the previous chapter, `frame` has 4 columns, one for\n", + "each value of `gamma`, and 11 rows, one for each value of `beta`. So\n", + "these loops print 44 lines, one for each pair of parameters.\n", + "\n", + "The following function encapulates the previous loop and plots the\n", + "fraction infected as a function of the ratio `beta/gamma`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "baking-tactics", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "def plot_sweep_frame(frame):\n", + " for gamma in frame.columns:\n", + " series = frame[gamma]\n", + " for beta in series.index:\n", + " frac_infected = series[beta]\n", + " plot(beta/gamma, frac_infected, 'o', \n", + " color='C1', alpha=0.4)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "dental-outreach", + "metadata": {}, + "outputs": [], + "source": [ + "plot_sweep_frame(frame)\n", + "\n", + "decorate(xlabel='Contact number (beta/gamma)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "systematic-gossip", + "metadata": {}, + "source": [ + "The results fall on a single curve, at least approximately. That means that we can predict the fraction of students who will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." + ] + }, + { + "cell_type": "markdown", + "id": "theoretical-arrow", + "metadata": {}, + "source": [ + "## Contact number\n", + "\n", + "From Section xxx, recall that the number of new infections in a\n", + "given day is $\\beta s i N$, and the number of recoveries is\n", + "$\\gamma i N$. If we divide these quantities, the result is\n", + "$\\beta s / \\gamma$, which is the number of new infections per recovery\n", + "(as a fraction of the population).\n", + "\n", + "When a new disease is introduced to a susceptible population, $s$ is\n", + "approximately 1, so the number of people infected by each sick person is $\\beta / \\gamma$. This ratio is called the \"contact number\\\" or \"basic reproduction number\\\" (see ). By convention it is usually denoted $R_0$, but in the context of an SIR model, this notation is confusing, so we'll use $c$ instead." + ] + }, + { + "cell_type": "markdown", + "id": "intimate-romance", + "metadata": {}, + "source": [ + "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", + "Section xxx:\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{ds}{dt} &= -\\beta s i \\\\\n", + "\\frac{di}{dt} &= \\beta s i - \\gamma i\\\\\n", + "\\frac{dr}{dt} &= \\gamma i\\end{aligned}$$ \n", + "\n", + "In the same way we divided the\n", + "contact rate by the infection rate to get the dimensionless quantity\n", + "$c$, now we'll divide $di/dt$ by $ds/dt$ to get a ratio of rates:\n", + "\n", + "$$\\frac{di}{ds} = -1 + \\frac{1}{cs}$$ \n", + "\n", + "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." + ] + }, + { + "cell_type": "markdown", + "id": "revolutionary-motorcycle", + "metadata": {}, + "source": [ + "Here's how the derivation goes. We multiply both sides of the previous\n", + "equation by $ds$: \n", + "\n", + "$$di = \\left( -1 + \\frac{1}{cs} \\right) ds$$ \n", + "\n", + "And then integrate both sides: \n", + "\n", + "$$i = -s + \\frac{1}{c} \\log s + q$$ \n", + "\n", + "where $q$ is a constant of integration. Rearranging terms yields:\n", + "\n", + "$$q = i + s - \\frac{1}{c} \\log s$$ \n", + "\n", + "Now let's see if we can figure out what $q$ is. At the beginning of an epidemic, if the fraction infected is small and nearly everyone is susceptible, we can use the approximations $i(0) = 0$ and $s(0) = 1$ to compute $q$:\n", + "\n", + "$$q = 0 + 1 + \\frac{1}{c} \\log 1$$ \n", + "\n", + "Since $\\log 1 = 0$, we get $q = 1$." + ] + }, + { + "cell_type": "markdown", + "id": "spread-convert", + "metadata": {}, + "source": [ + "Now, at the end of the epidemic, let's assume that $i(\\infty) = 0$, and $s(\\infty)$ is an unknown quantity, $s_{\\infty}$. Now we have:\n", + "\n", + "$$q = 1 = 0 + s_{\\infty}- \\frac{1}{c} \\log s_{\\infty}$$ \n", + "\n", + "Solving for $c$, we get $$c = \\frac{\\log s_{\\infty}}{s_{\\infty}- 1}$$ By relating $c$ and $s_{\\infty}$, this equation makes it possible to estimate $c$ based on data, and possibly predict the behavior of future epidemics." + ] + }, + { + "cell_type": "markdown", + "id": "intended-worker", + "metadata": {}, + "source": [ + "## Analysis and simulation\n", + "\n", + "Let's compare this analytic result to the results from simulation. I'll create an array of values for $s_{\\infty}$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "previous-schedule", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "s_inf_array = linspace(0.0001, 0.999, 31)" + ] + }, + { + "cell_type": "markdown", + "id": "positive-float", + "metadata": {}, + "source": [ + "And compute the corresponding values of $c$:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "valuable-landscape", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import log\n", + "\n", + "c_array = log(s_inf_array) / (s_inf_array - 1)" + ] + }, + { + "cell_type": "markdown", + "id": "premium-carry", + "metadata": {}, + "source": [ + "To get the total infected, we compute the difference between $s(0)$ and\n", + "$s(\\infty)$, then store the results in a `Series`:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "composite-cabinet", + "metadata": {}, + "outputs": [], + "source": [ + "frac_infected = 1 - s_inf_array" + ] + }, + { + "cell_type": "markdown", + "id": "satisfactory-blink", + "metadata": {}, + "source": [ + "We can use `make_series` to put `c_array`\n", + "and `frac_infected` in a Pandas `Series`." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "appropriate-geology", + "metadata": {}, + "outputs": [], + "source": [ + "frac_infected_series = make_series(c_array, frac_infected)" + ] + }, + { + "cell_type": "markdown", + "id": "bottom-print", + "metadata": {}, + "source": [ + "Now we can plot the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "integral-reading", + "metadata": {}, + "outputs": [], + "source": [ + "plot_sweep_frame(frame)\n", + "frac_infected_series.plot(label='analysis')\n", + "\n", + "decorate(xlabel='Contact number (c)',\n", + " ylabel='Fraction infected')" + ] + }, + { + "cell_type": "markdown", + "id": "peaceful-interest", + "metadata": {}, + "source": [ + "When the contact number exceeds 1, analysis and simulation agree. When\n", + "the contact number is less than 1, they do not: analysis indicates there should be no infections; in the simulations there are a small number of infections.\n", + "\n", + "The reason for the discrepancy is that the simulation divides time into a discrete series of days, whereas the analysis treats time as a\n", + "continuous quantity. In other words, the two methods are actually based on different models. So which model is better?\n", + "\n", + "Probably neither. When the contact number is small, the early progress\n", + "of the epidemic depends on details of the scenario. If we are lucky, the original infected person, \"patient zero\", infects no one and there is no epidemic. If we are unlucky, patient zero might have a large number of close friends, or might work in the dining hall (and fail to observe safe food handling procedures).\n", + "\n", + "For contact numbers near or less than 1, we might need a more detailed\n", + "model. But for higher contact numbers the SIR model might be good\n", + "enough." + ] + }, + { + "cell_type": "markdown", + "id": "beginning-capital", + "metadata": {}, + "source": [ + "## Estimating contact number\n", + "\n", + "Figure xxx shows that if we know the contact number, we can compute the fraction infected. But we can also read the figure the other way; that is, at the end of an epidemic, if we can estimate the fraction of the population that was ever infected, we can use it to estimate the contact number.\n", + "\n", + "Well, in theory we can. In practice, it might not work very well,\n", + "because of the shape of the curve. When the contact number is near 2,\n", + "the curve is quite steep, which means that small changes in $c$ yield\n", + "big changes in the number of infections. If we observe that the total\n", + "fraction infected is anywhere from 20% to 80%, we would conclude that\n", + "$c$ is near 2.\n", + "\n", + "On the other hand, for larger contact numbers, nearly the entire\n", + "population is infected, so the curve is nearly flat. In that case we\n", + "would not be able to estimate $c$ precisely, because any value greater\n", + "than 3 would yield effectively the same results. Fortunately, this is\n", + "unlikely to happen in the real world; very few epidemics affect anything close to 90% of the population.\n", + "\n", + "So the SIR model has limitations; nevertheless, it provides insight into the behavior of infectious disease, especially the phenomenon of herd immunity. As we saw in Chapter xxx, if we know the parameters of the model, we can use it to evaluate possible interventions. And as we saw in this chapter, we might be able to use data from earlier outbreaks to estimate the parameters.\n" + ] + }, + { + "cell_type": "markdown", + "id": "olive-niger", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "upper-interim", + "metadata": {}, + "source": [ + "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", + "\n", + "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", + "\n", + "What do the results look like, and what does that imply? " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "talented-discovery", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "bright-label", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "suspended-louisiana", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "understanding-fault", + "metadata": {}, + "source": [ + "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", + "\n", + "What is your best estimate of `c`?\n", + "\n", + "Hint: if you print `frac_infected_series`, you can read off the answer. " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "another-timing", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "gross-terry", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "found-surgery", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb new file mode 100644 index 00000000..29ba9961 --- /dev/null +++ b/chapters/chap15.ipynb @@ -0,0 +1,830 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "located-subscription", + "metadata": {}, + "source": [ + "# Chapter 15" + ] + }, + { + "cell_type": "markdown", + "id": "american-article", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "italic-murder", + "metadata": {}, + "source": [ + "So far the systems we have studied have been physical in the sense that they exist in the world, but they have not been physics, in the sense of what physics classes are usually about. In the next few chapters, we'll do some physics, starting with **thermal systems**, that is, systems where the temperature of objects changes as heat transfers from one to another." + ] + }, + { + "cell_type": "markdown", + "id": "adolescent-phone", + "metadata": {}, + "source": [ + "## The coffee cooling problem\n", + "\n", + "The coffee cooling problem was discussed by Jearl Walker in \n", + "\"The Amateur Scientist\", *Scientific American*, Volume 237, Issue 5, November 1977. Since then it has become a standard example of modeling and simulation.\n", + "\n", + "Here is my version of the problem:\n", + "\n", + "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?" + ] + }, + { + "cell_type": "markdown", + "id": "appreciated-ukraine", + "metadata": {}, + "source": [ + "To help answer this question, I made a trial run with the milk and\n", + "coffee in separate containers and took some measurements (not really):\n", + "\n", + "- When served, the temperature of the coffee is 90 °C. The volume is\n", + " 300 mL.\n", + "\n", + "- The milk is at an initial temperature of 5 °C, and I take about\n", + " 50 mL.\n", + "\n", + "- The ambient temperature in my car is 22 °C.\n", + "\n", + "- The coffee is served in a well insulated cup. When I arrive at work after 30 minutes, the temperature of the coffee has fallen to 70 °C.\n", + "\n", + "- The milk container is not as well insulated. After 15 minutes, it\n", + " warms up to 20 °C, nearly the ambient temperature.\n", + "\n", + "To use this data and answer the question, we have to know something\n", + "about temperature and heat, and we have to make some modeling decisions." + ] + }, + { + "cell_type": "markdown", + "id": "arranged-ridge", + "metadata": {}, + "source": [ + "## Temperature and heat\n", + "\n", + "To understand how coffee cools (and milk warms), we need a model of\n", + "temperature and heat. **Temperature** is a property of an object or a\n", + "system; in SI units it is measured in degrees Celsius (°C). Temperature quantifies how hot or cold the object is, which is related to the average velocity of the particles that make up the object.\n", + "\n", + "When particles in a hot object contact particles in a cold object, the\n", + "hot object gets cooler and the cold object gets warmer as energy is\n", + "transferred from one to the other. The transferred energy is called\n", + "**heat**; in SI units it is measured in joules (J).\n", + "\n", + "Heat is related to temperature by the following equation (see\n", + "): \n", + "\n", + "$$Q = C~\\Delta T$$ \n", + "\n", + "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the **thermal mass** of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." + ] + }, + { + "cell_type": "markdown", + "id": "purple-edward", + "metadata": {}, + "source": [ + "For objects made primarily from one material, thermal mass can be\n", + "computed like this: \n", + "\n", + "$$C = m c_p$$ \n", + "\n", + "where $m$ is the mass of the object and $c_p$ is the **specific heat capacity** of the material (see ).\n", + "\n", + "We can use these equations to estimate the thermal mass of a cup of\n", + "coffee. The specific heat capacity of coffee is probably close to that\n", + "of water, which is 4.2 J/g/°C. Assuming that the density of coffee is\n", + "close to that of water, which is 1 g/mL, the mass of 300 mL of coffee is 300 g, and the thermal mass is 1260 J/°C.\n", + "\n", + "So when a cup of coffee cools from 90 °C to 70 °C, the change in\n", + "temperature, $\\Delta T$ is 20 °C, which means that 25 200 J of heat\n", + "energy was transferred from the coffee to the surrounding environment\n", + "(the cup holder and air in my car).\n", + "\n", + "To give you a sense of how much energy that is, if you were able to\n", + "harness all of that heat to do work (which you cannot), you could\n", + "use it to lift a cup of coffee from sea level to 8571 m, just shy of the height of Mount Everest, 8848 m.\n", + "\n", + "Assuming that the cup has less mass than the coffee, and is made from a material with lower specific heat, we can ignore the thermal mass of the cup. For a cup with substantial thermal mass, like a ceramic mug, we might consider a model that computes the temperature of coffee and cup separately." + ] + }, + { + "cell_type": "markdown", + "id": "other-finnish", + "metadata": {}, + "source": [ + "## Heat transfer\n", + "\n", + "In a situation like the coffee cooling problem, there are three ways\n", + "heat transfers from one object to another (see ):\n", + "\n", + "- Conduction: When objects at different temperatures come into\n", + " contact, the faster-moving particles of the higher-temperature\n", + " object transfer kinetic energy to the slower-moving particles of the lower-temperature object.\n", + "\n", + "- Convection: When particles in a gas or liquid flow from place to\n", + " place, they carry heat energy with them. Fluid flows can be caused\n", + " by external action, like stirring, or by internal differences in\n", + " temperature. For example, you might have heard that hot air rises,\n", + " which is a form of \"natural convection\\\".\n", + "\n", + "- Radiation: As the particles in an object move due to thermal energy,\n", + " they emit electromagnetic radiation. The energy carried by this\n", + " radiation depends on the object's temperature and surface properties\n", + " (see )." + ] + }, + { + "cell_type": "markdown", + "id": "friendly-nurse", + "metadata": {}, + "source": [ + "For objects like coffee in a car, the effect of radiation is much\n", + "smaller than the effects of conduction and convection, so we will ignore it.\n", + "\n", + "Convection can be a complex topic, since it often depends on details of fluid flow in three dimensions. But for this problem we will be able to get away with a simple model called \"Newton's law of cooling\"." + ] + }, + { + "cell_type": "markdown", + "id": "heavy-forward", + "metadata": {}, + "source": [ + "## Newton's law of cooling\n", + "\n", + "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the\n", + "object and the surrounding environment:\n", + "\n", + "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", + "\n", + "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." + ] + }, + { + "cell_type": "markdown", + "id": "educated-accommodation", + "metadata": {}, + "source": [ + "Newton's so-called \"law \" is really a model: it is a good approximation in some conditions and less good in others.\n", + "\n", + "For example, if the primary mechanism of heat transfer is conduction,\n", + "Newton's law is \"true\", which is to say that $r$ is constant over a\n", + "wide range of temperatures. And sometimes we can estimate $r$ based on\n", + "the material properties and shape of the object.\n", + "\n", + "When convection contributes a non-negligible fraction of heat transfer, $r$ depends on temperature, but Newton's law is often accurate enough, at least over a narrow range of temperatures. In this case $r$ usually has to be estimated experimentally, since it depends on details of surface shape, air flow, evaporation, etc.\n", + "\n", + "When radiation makes up a substantial part of heat transfer, Newton's\n", + "law is not a good model at all. This is the case for objects in space or in a vacuum, and for objects at high temperatures (more than a few\n", + "hundred degrees Celsius, say).\n", + "\n", + "However, for a situation like the coffee cooling problem, we expect\n", + "Newton's model to be quite good." + ] + }, + { + "cell_type": "markdown", + "id": "determined-seventh", + "metadata": {}, + "source": [ + "## Implementation\n", + "\n", + "To get started, let's forget about the milk temporarily and focus on the coffee. \n", + "\n", + "Here's a function that takes the parameters of the system and makes a `System` object:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "geological-graph", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def make_system(T_init, volume, r, t_end):\n", + " return System(T_init=T_init,\n", + " T_final=T_init,\n", + " volume=volume,\n", + " r=r,\n", + " t_end=t_end,\n", + " T_env=22,\n", + " t_0=0,\n", + " dt=1)" + ] + }, + { + "cell_type": "markdown", + "id": "cardiac-lesson", + "metadata": {}, + "source": [ + "The values of `T_init`, `volume`, and `t_end` come from the statement of the problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eastern-alignment", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-background", + "metadata": {}, + "source": [ + "I chose the value of `r` arbitrarily for now; we will figure out how to estimate it soon.\n", + "\n", + "In addition, `make_system` sets the temperature of the environment, `T_env`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", + "\n", + "Strictly speaking, Newton's law is a differential equation, but over a short period of time we can approximate it with a difference equation:\n", + "\n", + "$$\\Delta T = -r (T - T_{env}) dt$$ \n", + "\n", + "where $dt$ is the time step and $\\Delta T$ is the change in temperature during that time step.\n", + "\n", + "Note: I use $\\Delta T$ to denote a change in temperature over time, but in the context of heat transfer, you might also see $\\Delta T$ used to denote the difference in temperature between an object and its\n", + "environment, $T - T_{env}$. To minimize confusion, I avoid this second\n", + "use.\n", + "\n", + "The following function takes the current temperature, `T`, the current time `t`, and a `System` object, and computes the change in temperature during a time step:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "vulnerable-sarah", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def change_func(T, t, system):\n", + " r, T_env, dt = system.r, system.T_env, system.dt \n", + " return -r * (T - T_env) * dt" + ] + }, + { + "cell_type": "markdown", + "id": "unknown-programming", + "metadata": {}, + "source": [ + "We can test it with the initial temperature of the coffee, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "killing-tragedy", + "metadata": {}, + "outputs": [], + "source": [ + "change_func(coffee.T_init, 0, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "geographic-female", + "metadata": {}, + "source": [ + "With `dt=1` minute, the temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", + "\n", + "Now here's a version of `run_simulation` that simulates a series of time steps from `t_0` to `t_end`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "wireless-handy", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def run_simulation(system, change_func):\n", + " t_array = linrange(system.t_0, system.t_end, system.dt)\n", + " n = len(t_array)\n", + " \n", + " series = TimeSeries(index=t_array)\n", + " series.iloc[0] = system.T_init\n", + " \n", + " for i in range(n-1):\n", + " t = t_array[i]\n", + " T = series.iloc[i]\n", + " series.iloc[i+1] = T + change_func(T, t, system)\n", + " \n", + " system.t_end = t_array[-1]\n", + " system.T_final = series.iloc[-1]\n", + " return series" + ] + }, + { + "cell_type": "markdown", + "id": "voluntary-velvet", + "metadata": {}, + "source": [ + "This function is similar to previous versions of `run_simulation`.\n", + "\n", + "One difference is that it uses `linrange` to make an array of values\n", + "from `t_0` to `t_end` with time step `dt`.\n", + "\n", + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "after-championship", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(coffee, change_func)" + ] + }, + { + "cell_type": "markdown", + "id": "consecutive-party", + "metadata": {}, + "source": [ + "The result is a `TimeSeries` with one row per time step. " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "proof-guard", + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "limiting-legislation", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "expected-company", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results.plot(label='coffee')\n", + "\n", + "decorate(xlabel='Time (minute)',\n", + " ylabel='Temperature (C)',\n", + " title='Coffee Cooling')" + ] + }, + { + "cell_type": "markdown", + "id": "incomplete-demonstration", + "metadata": {}, + "source": [ + "The temperature after 30 minutes is 72.3 °C, which is a little higher than what's stated in the problem, 70 °C. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "protecting-picture", + "metadata": {}, + "outputs": [], + "source": [ + "coffee.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "tight-operation", + "metadata": {}, + "source": [ + "By trial and error, we could find the value of `r` where the final temperature is precisely 70 °C.\n", + "But it is more efficient to use a root-finding algorithm." + ] + }, + { + "cell_type": "markdown", + "id": "equipped-blackberry", + "metadata": {}, + "source": [ + "## Finding roots\n", + "\n", + "ModSim provides a function called `root_scalar` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", + "\n", + "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", + "\n", + "A **root** is a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", + "\n", + "I'll use this example to demonstrate `root_scalar`. First, we have to\n", + "write a function that evaluates $f$:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "round-budapest", + "metadata": {}, + "outputs": [], + "source": [ + "def func(x):\n", + " return (x-1) * (x-2) * (x-3)" + ] + }, + { + "cell_type": "markdown", + "id": "injured-limitation", + "metadata": {}, + "source": [ + "Now we call `root_scalar` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "regulated-cloud", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(func, bracket=[1.5, 2.5])\n", + "res" + ] + }, + { + "cell_type": "markdown", + "id": "regulated-weekend", + "metadata": {}, + "source": [ + "The first argument is the function whose roots we want. The second\n", + "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which stores the root that was found." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "graphic-preliminary", + "metadata": {}, + "outputs": [], + "source": [ + "res.root" + ] + }, + { + "cell_type": "markdown", + "id": "changing-winter", + "metadata": {}, + "source": [ + "If we provide a different interval, we find a different root." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "authentic-hunter", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(func, bracket=[2.5, 3.5])\n", + "res.root" + ] + }, + { + "cell_type": "markdown", + "id": "bound-freight", + "metadata": {}, + "source": [ + "If the interval doesn't contain a root, you'll get a `ValueError` and a message like \"f(a) and f(b) must have different signs\".\n", + "\n", + "```\n", + "res = root_scalar(func, bracket=[4, 5])\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "impossible-spanish", + "metadata": {}, + "source": [ + "Now we can use `root_scalar` to estimate `r`." + ] + }, + { + "cell_type": "markdown", + "id": "imperial-engineering", + "metadata": {}, + "source": [ + "## Estimating `r`\n", + "\n", + "What we want is the value of `r` that yields a final temperature of\n", + "70 °C. To use `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "quality-colors", + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(r, system):\n", + " system.r = r\n", + " results = run_simulation(system, change_func)\n", + " return system.T_final - 70" + ] + }, + { + "cell_type": "markdown", + "id": "random-loading", + "metadata": {}, + "source": [ + "This is called an \"error function\" because it returns the\n", + "difference between what we got and what we wanted, that is, the error.\n", + "With the right value of `r`, the error is 0.\n", + "\n", + "We can test `error_func` like this, using the initial guess `r=0.01`:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "unknown-pharmacy", + "metadata": {}, + "outputs": [], + "source": [ + "coffee = make_system(T_init=90, volume=300, r=0.01, t_end=30)\n", + "error_func(0.01, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "moderate-monkey", + "metadata": {}, + "source": [ + "The result is an error of 2.3 °C, because the final temperature with\n", + "this value of `r` is too high." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "fossil-israel", + "metadata": {}, + "outputs": [], + "source": [ + "error_func(0.02, coffee)" + ] + }, + { + "cell_type": "markdown", + "id": "south-fabric", + "metadata": {}, + "source": [ + "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", + "\n", + "So we can call `root_scalar` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "backed-while", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])\n", + "res.flag" + ] + }, + { + "cell_type": "markdown", + "id": "exotic-development", + "metadata": {}, + "source": [ + "The first argument is the error function.\n", + "The second argument is the `System` object, which `root_scalar` passes as an argument to `error_func`.\n", + "The third argument is an interval that brackets the root.\n", + "\n", + "Here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "early-twelve", + "metadata": {}, + "outputs": [], + "source": [ + "r_coffee = res.root\n", + "r_coffee" + ] + }, + { + "cell_type": "markdown", + "id": "greenhouse-designer", + "metadata": {}, + "source": [ + "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", + "\n", + "We can confirm that this value is correct by setting `r` to the root we found and running the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "foster-lodging", + "metadata": {}, + "outputs": [], + "source": [ + "coffee.r = res.root\n", + "run_simulation(coffee, change_func)\n", + "coffee.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "sweet-horizontal", + "metadata": {}, + "source": [ + "The final temperature is very close to 70 °C." + ] + }, + { + "cell_type": "markdown", + "id": "imposed-complement", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 °C, in a vessel with `r=0.1`, for 15 minutes, and plot the results.\n", + "\n", + "By trial and error, find a value for `r` that makes the final temperature close to 20 °C." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "radical-accident", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "extraordinary-andrew", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "initial-parallel", + "metadata": {}, + "source": [ + "**Exercise:** Write an error function that simulates the temperature of the milk and returns the difference between the final temperature and 20 °C. Use it to estimate the value of `r` for the milk." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "yellow-single", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "cognitive-italian", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "placed-concentrate", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "announced-continent", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb new file mode 100644 index 00000000..1105131b --- /dev/null +++ b/chapters/chap16.ipynb @@ -0,0 +1,642 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "involved-hampshire", + "metadata": {}, + "source": [ + "# Chapter 16" + ] + }, + { + "cell_type": "markdown", + "id": "senior-paintball", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "straight-milan", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import code from previous notebooks\n", + "\n", + "from chap15 import change_func\n", + "from chap15 import run_simulation\n", + "from chap15 import make_system" + ] + }, + { + "cell_type": "markdown", + "id": "global-shooting", + "metadata": {}, + "source": [ + "In the previous chapter we wrote a simulation of a cooling cup of\n", + "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", + "temperature of the coffee will change over time.\n", + "\n", + "..." + ] + }, + { + "cell_type": "markdown", + "id": "ceramic-calibration", + "metadata": {}, + "source": [ + "## Mixing liquids\n", + "\n", + "When we mix two liquids, the temperature of the mixture depends on the\n", + "temperatures of the ingredients, but it might not be obvious how to\n", + "compute it.\n", + "\n", + "Assuming there are no chemical reactions that either produce or consume heat, the total thermal energy of the system is the same before and after mixing; in other words, thermal energy is **conserved**.\n", + "\n", + "If the temperature of the first liquid is $T_1$, the temperature of the second liquid is $T_2$, and the final temperature of the mixture is $T$, the heat transfer into the first liquid is $C_1 (T - T_1)$ and the heat transfer into the second liquid is $C_2 (T - T_2)$, where $C_1$ and $C_2$ are the thermal masses of the liquids.\n", + "\n", + "In order to conserve energy, these heat transfers must add up to 0:\n", + "\n", + "$$C_1 (T - T_1) + C_2 (T - T_2) = 0$$ \n", + "\n", + "We can solve this equation for T:\n", + "\n", + "$$T = \\frac{C_1 T_1 + C_2 T_2}{C_1 + C_2}$$ \n", + "\n", + "For the coffee cooling problem, we have the volume of each liquid; if we also know the density, $\\rho$, and the specific heat capacity, $c_p$, we can compute thermal mass: \n", + "\n", + "$$C = \\rho V c_p$$ \n", + "\n", + "If the liquids have the same density and heat capacity, they drop out of the equation, and we can write:\n", + "\n", + "$$T = \\frac{V_1 T_1 + V_2 T_2}{V_1 + V_2}$$ \n", + "\n", + "where $V_1$ and $V_2$ are the volumes of the liquids.\n", + "\n", + "As an approximation, I'll assume that milk and coffee have the same\n", + "density and specific heat. As an exercise, you can look up these\n", + "quantities and see how good this assumption is.\n", + "\n", + "The following function takes two `System` objects that represent the\n", + "coffee and milk, and creates a new `System` to represent the mixture:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "orange-beaver", + "metadata": {}, + "outputs": [], + "source": [ + "def mix(system1, system2):\n", + " \n", + " V1, V2 = system1.volume, system2.volume\n", + " T1, T2 = system1.T_final, system2.T_final\n", + " \n", + " V_mix = V1 + V2\n", + " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", + " \n", + " return make_system(T_init=T_mix,\n", + " volume=V_mix,\n", + " r=system1.r,\n", + " t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "quiet-payroll", + "metadata": {}, + "source": [ + "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", + "\n", + "This function uses the value of `r` from `system1` as the value of `r`\n", + "for the mixture. If `system1` represents the coffee, and we are adding\n", + "the milk to the coffee, this is probably a reasonable choice. On the\n", + "other hand, when we increase the amount of liquid in the coffee cup,\n", + "that might change `r`. So this is an assumption we might want to\n", + "revisit.\n", + "\n", + "Now we have everything we need to solve the problem." + ] + }, + { + "cell_type": "markdown", + "id": "talented-appendix", + "metadata": {}, + "source": [ + "## Mix first or last?\n", + "\n", + "First I'll create objects to represent the coffee and milk.\n", + "For `r_coffee` and `r_milk`, I'll use the values we computed in the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "breathing-pizza", + "metadata": {}, + "outputs": [], + "source": [ + "r_coffee = 0.0115\n", + "coffee = make_system(T_init=90, volume=300, r=r_coffee, t_end=30)" + ] + }, + { + "cell_type": "markdown", + "id": "miniature-doctrine", + "metadata": {}, + "source": [ + "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "faced-start", + "metadata": {}, + "outputs": [], + "source": [ + "r_milk = 0.133\n", + "milk = make_system(T_init=5, volume=50, r=r_milk, t_end=15)" + ] + }, + { + "cell_type": "markdown", + "id": "interior-alpha", + "metadata": {}, + "source": [ + "Now we can mix them and simulate 30 minutes:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "stock-release", + "metadata": {}, + "outputs": [], + "source": [ + "mix_first = mix(coffee, milk)\n", + "run_simulation(mix_first, change_func)\n", + "\n", + "mix_first.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "committed-preference", + "metadata": {}, + "source": [ + "The final temperature is 61.5 °C which is still warm enough to be\n", + "enjoyable. Would we do any better if we added the milk last?\n", + "\n", + "I'll simulate the coffee and milk separately, and then mix them:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "integral-character", + "metadata": {}, + "outputs": [], + "source": [ + "run_simulation(coffee, change_func)\n", + "run_simulation(milk, change_func)\n", + "mix_last = mix(coffee, milk)\n", + "mix_last.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "trying-jacob", + "metadata": {}, + "source": [ + "After mixing, the temperature is 62.9 °C, so it looks like adding the\n", + "milk at the end is better. \n", + "But is that the best we can do?" + ] + }, + { + "cell_type": "markdown", + "id": "enclosed-shore", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "Adding the milk after 30 minutes is better than adding it immediately, but maybe there's something in between that's even better. To find out, I'll use the following function, which takes the time to add the milk, `t_add`, as a parameter:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "accepting-consumer", + "metadata": {}, + "outputs": [], + "source": [ + "def run_and_mix(t_add, t_total):\n", + " coffee.t_end = t_add\n", + " coffee_results = run_simulation(coffee, change_func)\n", + " \n", + " milk.t_end = t_add\n", + " milk_results = run_simulation(milk, change_func)\n", + " \n", + " mixture = mix(coffee, milk)\n", + " mixture.t_end = t_total - t_add\n", + " results = run_simulation(mixture, change_func)\n", + "\n", + " return mixture.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "critical-pound", + "metadata": {}, + "source": [ + "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "isolated-georgia", + "metadata": {}, + "outputs": [], + "source": [ + "sweep = SweepSeries()\n", + "for t_add in linspace(0, 30, 11):\n", + " sweep[t_add] = run_and_mix(t_add, 30)" + ] + }, + { + "cell_type": "markdown", + "id": "latin-fireplace", + "metadata": {}, + "source": [ + "Here's what the results look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "possible-prevention", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "sweep.plot(label='mixture', color='C2')\n", + "\n", + "decorate(xlabel='Time until mixing (minutes)',\n", + " ylabel='Final emperature (C)')" + ] + }, + { + "cell_type": "markdown", + "id": "light-poland", + "metadata": {}, + "source": [ + "Note that this is a parameter sweep, not a time series.\n", + "\n", + "The final temperature is maximized when `t_add=30`, so adding the milk\n", + "at the end is optimal.\n", + "\n", + "As an exercise you will have a chance to explore a variation of the coffee cooling problem:\n", + "\n", + "> Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", + "\n", + "But first, let's do some analysis." + ] + }, + { + "cell_type": "markdown", + "id": "industrial-circle", + "metadata": {}, + "source": [ + "## Analysis\n", + "\n", + "Simulating Newton's law of cooling is almost silly, because we can solve the differential equation analytically. If\n", + "\n", + "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", + "\n", + "the general solution is\n", + "\n", + "$$T{\\left (t \\right )} = C \\exp(-r t) + T_{env}$$ \n", + "\n", + "and the particular solution where $T(0) = T_{init}$ is\n", + "\n", + "$$T_{env} + \\left(- T_{env} + T_{init}\\right) \\exp(-r t)$$ \n", + "\n", + "If you would like to see this solution done by hand, you can watch this video: ." + ] + }, + { + "cell_type": "markdown", + "id": "molecular-happiness", + "metadata": {}, + "source": [ + "Now we can use the observed data to estimate the parameter $r$. If we\n", + "observe the that temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", + "\n", + "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$\n", + "\n", + "The following function takes a `System` object and computes `r`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "dressed-supply", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import log\n", + "\n", + "def compute_r(system):\n", + " t_end = system.t_end\n", + " T_init = system.T_init\n", + " T_final = system.T_final\n", + " T_env = system.T_env\n", + " \n", + " r = log((T_init - T_env) / (T_final - T_env)) / t_end\n", + " return r" + ] + }, + { + "cell_type": "markdown", + "id": "young-shift", + "metadata": {}, + "source": [ + "We can use this function to compute `r` for the coffee, given the parameters of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "bacterial-tonight", + "metadata": {}, + "outputs": [], + "source": [ + "coffee2 = make_system(T_init=90, volume=300, r=0, t_end=30)\n", + "coffee2.T_final = 70\n", + "r_coffee2 = compute_r(coffee2)\n", + "r_coffee2" + ] + }, + { + "cell_type": "markdown", + "id": "removable-authority", + "metadata": {}, + "source": [ + "This value is close to the value of `r` we computed in the previous chapter, `0.115`, but not exactly the same.\n", + "That's because the simulations use discrete time steps, and the analysis uses continuous time.\n", + "\n", + "Nevertheless, the results of any analysis are consistent with the simulation.\n", + "To check, we'll use the following function, which takes a `System` object and uses the analytic result to compute a time series:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "civic-trail", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import exp\n", + "from pandas import Series\n", + "\n", + "def run_analysis(system):\n", + " T_env, T_init, r = system.T_env, system.T_init, system.r\n", + " \n", + " t_array = linrange(system.t_0, system.t_end, system.dt) \n", + " T_array = T_env + (T_init - T_env) * exp(-r * t_array)\n", + " \n", + " system.T_final = T_array[-1]\n", + " return make_series(t_array, T_array)" + ] + }, + { + "cell_type": "markdown", + "id": "eleven-faculty", + "metadata": {}, + "source": [ + "The first line unpacks the system variables.\n", + "The next two lines compute `t_array`, which is a NumPy array of time stamps, and `T_array`, which is an array of the corresponding temperatures.\n", + "\n", + "The last two lines store the final temperature in the `System` object and return the results in a Pandas `Series`.\n", + "\n", + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "terminal-carry", + "metadata": {}, + "outputs": [], + "source": [ + "coffee2.r = r_coffee2\n", + "results2 = run_analysis(coffee2)\n", + "coffee2.T_final" + ] + }, + { + "cell_type": "markdown", + "id": "approved-subject", + "metadata": {}, + "source": [ + "The final temperature is 70 °C, as it should be. In fact, the results\n", + "are identical to what we got by simulation, with a small difference due to rounding." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "grand-silence", + "metadata": {}, + "outputs": [], + "source": [ + "coffee.r = 0.011543\n", + "results = run_simulation(coffee, change_func)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "monetary-sensitivity", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import allclose\n", + "\n", + "allclose(results, results2)" + ] + }, + { + "cell_type": "markdown", + "id": "polish-focus", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "respected-inclusion", + "metadata": {}, + "source": [ + "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "headed-circle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "enormous-consolidation", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "social-stamp", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "exclusive-puzzle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "chinese-explanation", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", + "\n", + "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "terminal-billy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "nuclear-going", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb new file mode 100644 index 00000000..b4521f95 --- /dev/null +++ b/chapters/chap17.ipynb @@ -0,0 +1,547 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "interracial-guitar", + "metadata": {}, + "source": [ + "# Chapter 17" + ] + }, + { + "cell_type": "markdown", + "id": "restricted-thumb", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "european-movement", + "metadata": {}, + "source": [ + "In this chapter we start a new example, a model of how glucose and insulin interact to control blood sugar. We will implement a widely used model called the \"Minimal Model\" because it is intended to include only the elements essential to explain the observed behavior of the system.\n", + "\n", + "This chapter presents the model itself and some background information we need to understand it.\n", + "In the next chapter we'll implement the model and compare the results to real data.\n", + "\n", + "My presentation in this chapter follows Bergman (2005) \"Minimal Model\"\n", + "(abstract at , PDF at\n", + ")." + ] + }, + { + "cell_type": "markdown", + "id": "tamil-helping", + "metadata": {}, + "source": [ + "## The Minimal Model\n", + "\n", + "**Pharmacokinetics** is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, we\n", + "implement one of the most widely used pharmacokinetic models: the\n", + "so-called \"minimal model\" of glucose and insulin in the blood stream.\n", + "\n", + "**Glucose** is a form of sugar that circulates in the blood of animals; it is used as fuel for muscles, the brain, and other organs. The concentration of blood sugar is controlled by the hormone system, and especially by **insulin**, which is produced by the pancreas and has the effect of reducing blood sugar.\n", + "\n", + "In people with normal pancreatic function, the hormone system maintains **homeostasis**; that is, it keeps the concentration of blood sugar in a range that is neither too high or too low.\n", + "\n", + "But if the pancreas does not produce enough insulin, or if the cells\n", + "that should respond to insulin become insensitive, blood sugar can\n", + "become elevated, a condition called **hyperglycemia**. Long term, severe hyperglycemia is the defining symptom of **diabetes mellitus**, a serious disease that affects almost 10% of the population in the U.S. (see )." + ] + }, + { + "cell_type": "markdown", + "id": "sharp-yukon", + "metadata": {}, + "source": [ + "One of the most-used tests for hyperglycemia and diabetes is the\n", + "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to\n", + "measure the concentrations of glucose and insulin.\n", + "\n", + "Using these measurements, we can estimate several parameters of\n", + "the subject's response; the most important is a parameter denoted $S_I$, which quantifies the effect of insulin on the rate of reduction in blood sugar." + ] + }, + { + "cell_type": "markdown", + "id": "round-roommate", + "metadata": {}, + "source": [ + "## The glucose minimal model\n", + "\n", + "The \"minimal model\", as proposed by Bergman, Ider, Bowden, and\n", + "Cobelli, consists of two parts: the glucose model and the insulin model. I will present an implementation of the glucose model; as a case study, you will have the chance to implement the insulin model.\n", + "\n", + "The original model was developed in the 1970s; since then, many\n", + "variations and extensions have been proposed. Bergman's comments on the development of the model provide insight into their process:\n", + "\n", + "> We applied the principle of Occam's Razor, i.e. by asking what was the simplest model based upon known physiology that could account for the insulin-glucose relationship revealed in the data. Such a model must be simple enough to account totally for the measured glucose (given the insulin input), yet it must be possible, using mathematical techniques, to estimate all the characteristic parameters of the model from a single data set (thus avoiding unverifiable assumptions)." + ] + }, + { + "cell_type": "markdown", + "id": "accompanied-battery", + "metadata": {}, + "source": [ + "The most useful models are the ones that achieve this balance: including enough realism to capture the essential features of the system without so much complexity that they are impractical. In this example, the practical limit is the ability to estimate the parameters of the model using data, and to interpret the parameters meaningfully.\n", + "\n", + "Bergman discusses the features he and his colleagues thought were\n", + "essential:\n", + "\n", + "> (1) Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize (2) Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", + "\n", + "To paraphrase the second point, the effect of insulin on glucose\n", + "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a \"remote compartment\" where it has its effect." + ] + }, + { + "cell_type": "markdown", + "id": "bottom-extent", + "metadata": {}, + "source": [ + "At the time, the remote compartment was a modeling abstraction that\n", + "might, or might not, represent something physical. Later, according to\n", + "Bergman, it was \"shown to be interstitial fluid\", that is, the fluid\n", + "that surrounds tissue cells. In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve\n", + "particular effects, to be found later to correspond to physical\n", + "entities. The most notable example, historically, might be [genes](https://en.wikipedia.org/wiki/Gene#Discovery_of_discrete_inherited_units).\n", + "\n", + "The glucose model consists of two differential equations:\n", + "\n", + "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", + "\n", + "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", + "\n", + "where\n", + "\n", + "- $G$ is the concentration of blood glucose as a function of time and $dG/dt$ is its rate of change.\n", + "\n", + "- $X$ is the concentration of insulin in the tissue fluid as a\n", + " function of time, and $dX/dt$ is its rate of change.\n", + "\n", + "- $I$ is the concentration of insulin in the blood as a function of\n", + " time, which is taken as an input into the model, based on\n", + " measurements.\n", + "\n", + "- $G_b$ is the basal concentration of blood glucose and $I_b$ is the\n", + " basal concentration of blood insulin, that is, the concentrations at equilibrium. Both are constants estimated from measurements at the\n", + " beginning or end of the test.\n", + "\n", + "- $k_1$, $k_2$, and $k_3$ are positive-valued parameters that control the rates of appearance and disappearance for glucose and insulin." + ] + }, + { + "cell_type": "markdown", + "id": "dutch-retailer", + "metadata": {}, + "source": [ + "We can interpret the terms in the equations one by one:\n", + "\n", + "- $-k_1 \\left[ G(t) - G_b \\right]$ is the rate of glucose\n", + " disappearance due to the effect of glucose itself. When $G(t)$ is\n", + " above basal level, $G_b$, this term is negative; when $G(t)$ is\n", + " below basal level this term is positive. So in the absence of\n", + " insulin, this term tends to restore blood glucose to basal level.\n", + "\n", + "- $-X(t) G(t)$ models the interaction of glucose and insulin in tissue\n", + " fluid, so the rate increases as either $X$ or $G$ increases. This\n", + " term does not require a rate parameter because the units of $X$ are\n", + " unspecified; we can consider $X$ to be in whatever units make the\n", + " parameter of this term 1.\n", + "\n", + "- $k_3 \\left[ I(t) - I_b \\right]$ is the rate at which insulin\n", + " diffuses between blood and tissue fluid. When $I(t)$ is above basal\n", + " level, insulin diffuses from the blood into the tissue fluid. When\n", + " $I(t)$ is below basal level, insulin diffuses from tissue to the\n", + " blood.\n", + "\n", + "- $-k_2 X(t)$ is the rate of insulin disappearance in tissue fluid as\n", + " it is consumed or broken down." + ] + }, + { + "cell_type": "markdown", + "id": "regional-receptor", + "metadata": {}, + "source": [ + "The initial state of the model is $X(0) = I_b$ and $G(0) = G_0$, where\n", + "$G_0$ is a constant that represents the concentration of blood sugar\n", + "immediately after the injection. In theory we could estimate $G_0$ based on measurements, but in practice it takes time for the injected glucose to spread through the blood volume. Since $G_0$ is not measurable, it is treated as a **free parameter** of the model, which means that we are free to choose it to fit the data." + ] + }, + { + "cell_type": "markdown", + "id": "exact-heating", + "metadata": {}, + "source": [ + "## Data\n", + "\n", + "To develop and test the model, we'll use data from [Pacini and Bergman](https://www.researchgate.net/publication/13707725_Insulin_sensitivity_and_glucose_effectiveness_Minimal_model_analysis_of_regular_and_insulin-modified_FSIGT), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122, (1986)." + ] + }, + { + "cell_type": "markdown", + "id": "separated-strip", + "metadata": {}, + "source": [ + "The following cell downloads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "looking-needle", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "markdown", + "id": "dressed-regard", + "metadata": {}, + "source": [ + "We can use Pandas to read the data file." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "naval-geology", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_csv\n", + "\n", + "data = read_csv('glucose_insulin.csv', index_col='time')\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "id": "close-payday", + "metadata": {}, + "source": [ + "`data` has two columns: `glucose` is the concentration of blood glucose in mg/dL; `insulin` is concentration of insulin in the blood in μU/mL (a medical \"unit\", denoted U, is an amount defined by convention in context). The index is time in minutes.\n", + "\n", + "This dataset represents glucose and insulin concentrations over\n", + "182 min for a subject with normal insulin production and sensitivity." + ] + }, + { + "cell_type": "markdown", + "id": "burning-valuable", + "metadata": {}, + "source": [ + "## Interpolation\n", + "\n", + "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. This is a job for interpolation!\n", + "\n", + "The ModSim library provides an `interpolate`, function that takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", + "\n", + "So we can call `interpolate` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "terminal-teaching", + "metadata": {}, + "outputs": [], + "source": [ + "I = interpolate(data.insulin)" + ] + }, + { + "cell_type": "markdown", + "id": "banner-shakespeare", + "metadata": {}, + "source": [ + "Then we can call the new function, `I`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "intense-thursday", + "metadata": {}, + "outputs": [], + "source": [ + "I(18)" + ] + }, + { + "cell_type": "markdown", + "id": "severe-desire", + "metadata": {}, + "source": [ + "The result is about 31.7, which is a linear interpolation between the actual measurements at `t=16` and `t=19`. \n", + "\n", + "We can also pass an array as an argument to `I`. Here's an array of equally-spaced values from `t_0` to `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "least-pattern", + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = data.index[0]\n", + "t_end = data.index[-1]\n", + "t_array = linrange(t_0, t_end)" + ] + }, + { + "cell_type": "markdown", + "id": "empirical-tackle", + "metadata": {}, + "source": [ + "And here are the corresponding values of `I`." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "mounted-venice", + "metadata": {}, + "outputs": [], + "source": [ + "I_array = I(t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "searching-respect", + "metadata": {}, + "source": [ + "We can use `make_series` to put the results in a Pandas `Series`." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "affecting-response", + "metadata": {}, + "outputs": [], + "source": [ + "I_series = make_series(t_array, I_array)" + ] + }, + { + "cell_type": "markdown", + "id": "insured-textbook", + "metadata": {}, + "source": [ + "Here's what the interpolated values look like along with the data." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "engaging-watershed", + "metadata": {}, + "outputs": [], + "source": [ + "data.insulin.plot(style='o', color='C2', label='insulin data')\n", + "I_series.plot(color='C2', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')" + ] + }, + { + "cell_type": "markdown", + "id": "adopted-locking", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces a model of the interaction between glucose and insulin in the blood stream.\n", + "And it introduces a new tool, interpolation, which we'll need to implement the model\n", + "\n", + "In the next chapter, we will use measured concentrations of insulin to simulate the glucose-insulin system, and compare the results to measured concentrations of glucose.\n", + "\n", + "Then, you'll have a chance to implement the second part of the model, which uses measured concentrations of glucose to simulate the insulin response, and compare the results to the data.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "floppy-store", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "hungarian-newman", + "metadata": {}, + "source": [ + "**Exercise:** `interpolate` is a wrapper for the SciPy function `interp1d`.\n", + "Read the documentation of `interp1d` at .\n", + "\n", + "In particular, notice the `kind` argument, which specifies a kind of interpolation.\n", + "The default is linear interpolation, which connects the data points with straight lines.\n", + "\n", + "Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "endless-network", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "entire-concern", + "metadata": {}, + "outputs": [], + "source": [ + "data.insulin.plot(style='o', color='C2', label='insulin data')\n", + "I_series.plot(color='C2', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration ($\\mu$U/mL)')" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-recognition", + "metadata": {}, + "source": [ + "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `t_array`." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "representative-acquisition", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "rocky-sydney", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "data.glucose.plot(style='o', alpha=0.5, label='glucose data')\n", + "G_series.plot(color='C0', label='interpolated')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "essential-fishing", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb new file mode 100644 index 00000000..0e0d245d --- /dev/null +++ b/chapters/chap18.ipynb @@ -0,0 +1,783 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "electric-netherlands", + "metadata": {}, + "source": [ + "# Chapter 18" + ] + }, + { + "cell_type": "markdown", + "id": "tribal-blame", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "detected-welsh", + "metadata": {}, + "source": [ + "The previous chapter present the minimal model of the glucose-insulin system, and introduces a tool we will need to implement it: interpolation.\n", + "\n", + "In this chapter, we'll implement the model two ways:\n", + "\n", + "* We'll start by rewriting the differential equations as difference equations; then we'll solve the difference equations using a version of `run_simulation`, similar to what we have used in previous chapters.\n", + "\n", + "* Then we'll use a new SciPy function, called `solve_ivp`, to solve the differential equation.\n", + "\n", + "We'll see that `solve_ivp` is faster and more accurate than `run_simulation`.\n", + "As a result, we will us it for every model in the rest of the book." + ] + }, + { + "cell_type": "markdown", + "id": "original-photographer", + "metadata": {}, + "source": [ + "The following cell downloads the data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fewer-weather", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'glucose_insulin.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + ] + }, + { + "cell_type": "markdown", + "id": "postal-procedure", + "metadata": {}, + "source": [ + "We can use Pandas to read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "computational-border", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_csv\n", + "\n", + "data = read_csv(filename, index_col='time');" + ] + }, + { + "cell_type": "markdown", + "id": "collective-orleans", + "metadata": {}, + "source": [ + "## Implementing the Model\n", + "\n", + "To get started, let's assume that the parameters of the model are known.\n", + "We'll implement the model and use it to generate time series for `G` and `X`. \n", + "Then we'll see how we can choose parameters that generate a series that fits the data.\n", + "\n", + "Here are the parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "delayed-trance", + "metadata": {}, + "outputs": [], + "source": [ + "G0 = 270\n", + "k1 = 0.02\n", + "k2 = 0.02\n", + "k3 = 1.5e-05" + ] + }, + { + "cell_type": "markdown", + "id": "sapphire-examination", + "metadata": {}, + "source": [ + "I'll put these values in a sequence which we'll pass to `make_system`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "following-alarm", + "metadata": {}, + "outputs": [], + "source": [ + "params = G0, k1, k2, k3" + ] + }, + { + "cell_type": "markdown", + "id": "polished-burner", + "metadata": {}, + "source": [ + "Here's a version of `make_system` that takes `params` and `data` as parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "substantial-literacy", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " G0, k1, k2, k3 = params\n", + " \n", + " t_0 = data.index[0]\n", + " t_end = data.index[-1]\n", + " \n", + " Gb = data.glucose[t_0]\n", + " Ib = data.insulin[t_0]\n", + " I = interpolate(data.insulin)\n", + " \n", + " init = State(G=G0, X=0)\n", + " \n", + " return System(init=init, params=params,\n", + " Gb=Gb, Ib=Ib, I=I,\n", + " t_0=t_0, t_end=t_end, dt=2)" + ] + }, + { + "cell_type": "markdown", + "id": "afraid-friendly", + "metadata": {}, + "source": [ + "`make_system` gets `t_0` and `t_end` from the data. \n", + "It uses the measurements at `t=0` as the basal levels, `Gb` and `Ib`. \n", + "And it uses the parameter `G0` as the initial value for `G`. Then it \n", + "packs everything into a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "legislative-richards", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "id": "stupid-retro", + "metadata": {}, + "source": [ + "## The Update Function\n", + "\n", + "The minimal model is expressed in terms of differential equations:\n", + "\n", + "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", + "\n", + "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", + "\n", + "To simulate this system, we will rewriting them as difference equations. \n", + "If we multiply both sides by $dt$, we have:\n", + "\n", + "$$dG = \\left[ -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t) \\right] dt$$\n", + "\n", + "$$dX = \\left[ k_3 \\left[I(t) - I_b \\right] - k_2 X(t) \\right] dt$$ \n", + "\n", + "If we think of $dt$ as a small step in time, these equations tell us how to compute the corresponding changes in $G$ and $X$.\n", + "\n", + "Here's an update function that computes these changes:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "roman-archive", + "metadata": {}, + "outputs": [], + "source": [ + "def update_func(state, t, system):\n", + " G, X = state\n", + " G0, k1, k2, k3 = system.params \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " dt = system.dt\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " G += dGdt * dt\n", + " X += dXdt * dt\n", + "\n", + " return State(G=G, X=X)" + ] + }, + { + "cell_type": "markdown", + "id": "basic-subdivision", + "metadata": {}, + "source": [ + "As usual, the update function takes a `State` object, a time, and a\n", + "`System` object as parameters. The first line uses multiple assignment\n", + "to extract the current values of `G` and `X`.\n", + "\n", + "The following lines unpack the parameters we need from the `System`\n", + "object.\n", + "\n", + "Computing the derivatives `dGdt` and `dXdt` is straightforward; we just translate the equations from math notation to Python.\n", + "Then, to perform the update, we multiply each derivative by the discrete time step `dt`, which is 2 min in this example. \n", + "\n", + "The return value is a `State` object with the new values of `G` and `X`.\n", + "\n", + "Before running the simulation, it is a good idea to run the update\n", + "function with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "sapphire-shannon", + "metadata": {}, + "outputs": [], + "source": [ + "update_func(system.init, system.t_0, system)" + ] + }, + { + "cell_type": "markdown", + "id": "growing-hormone", + "metadata": {}, + "source": [ + "If it runs without errors and there is nothing obviously wrong with the results, we are ready to run the simulation. " + ] + }, + { + "cell_type": "markdown", + "id": "strange-citation", + "metadata": {}, + "source": [ + "## The Simulation\n", + "\n", + "We'll use the following version of `run_simulation`:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "willing-masters", + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func): \n", + " t_array = linrange(system.t_0, system.t_end, system.dt)\n", + " n = len(t_array)\n", + " \n", + " frame = TimeFrame(index=t_array, \n", + " columns=system.init.index)\n", + " frame.iloc[0] = system.init\n", + " \n", + " for i in range(n-1):\n", + " t = t_array[i]\n", + " state = frame.iloc[i]\n", + " frame.iloc[i+1] = update_func(state, t, system)\n", + " \n", + " return frame" + ] + }, + { + "cell_type": "markdown", + "id": "musical-loading", + "metadata": {}, + "source": [ + "We can run it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "optional-burden", + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update_func)" + ] + }, + { + "cell_type": "markdown", + "id": "ambient-video", + "metadata": {}, + "source": [ + "The result is a `TimeFrame` with a row for each time step and a column for each of the state variables, `G` and `X`.\n", + "Here are the first few time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "international-germany", + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "least-steal", + "metadata": {}, + "source": [ + "The following plot shows the simulated glucose levels from the model along with the measured data. " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "liked-asset", + "metadata": {}, + "outputs": [], + "source": [ + "data.glucose.plot(style='o', alpha=0.5, label='glucose data')\n", + "results.G.plot(style='-', color='C0', label='simulation')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "id": "stopped-excuse", + "metadata": {}, + "source": [ + "With the parameters I chose, the model fits the data well, except during the first few minutes after the injection.\n", + "But we don't expect the model to do well in this regime.\n", + "\n", + "The problem is that the model is **non-spatial**; that is, it does not\n", + "take into account different concentrations in different parts of the\n", + "body. Instead, it assumes that the concentrations of glucose and insulin in blood, and insulin in tissue fluid, are the same throughout the body. This way of representing the body is known among experts as the \"bag of blood\" model.\n", + "\n", + "Immediately after injection, it takes time for the injected glucose to\n", + "circulate. During that time, we don't expect a non-spatial model to be\n", + "accurate. For this reason, we should not take the estimated value of `G0` too seriously; it is useful for fitting the model, but not meant to correspond to a physical, measurable quantity." + ] + }, + { + "cell_type": "markdown", + "id": "internal-positive", + "metadata": {}, + "source": [ + "The following plot shows simulated insulin levels in the hypothetical \"remote compartment\", which is in unspecified units." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "damaged-protection", + "metadata": {}, + "outputs": [], + "source": [ + "results.X.plot(color='C1', label='remote insulin')\n", + "\n", + "decorate(xlabel='Time (min)', \n", + " ylabel='Concentration (arbitrary units)')" + ] + }, + { + "cell_type": "markdown", + "id": "economic-spare", + "metadata": {}, + "source": [ + "Remember that `X` represents the concentration of insulin in the \"remote compartment\", which is believed to be tissue fluid, so we can't compare it to the measured concentration of insulin in the blood.\n", + "\n", + "`X` rises quickly after the initial injection and then declines as the concentration of glucose declines. Qualitatively, this behavior is as expected, but because `X` is not an observable quantity, we can't validate this part of the model quantitatively." + ] + }, + { + "cell_type": "markdown", + "id": "spatial-scholar", + "metadata": {}, + "source": [ + "## Solving differential equations\n", + "\n", + "To implement the minimal model, we rewrote the differential equations as difference equations with a finite time step, `dt`.\n", + "\n", + "When $dt$ is very small, or more precisely **infinitesimal**, the difference equations are the same as the differential equations.\n", + "But in our simulations, $dt$ is 2 min, which is not very small, and definitely not infinitesimal. \n", + "\n", + "In effect, the simulations assume that the derivatives $dG/dt$ and $dX/dt$ are constant during each 2 min time step.\n", + "This method, evaluating derivatives at discrete time steps and assuming that they are constant in between, is called **Euler's method** (see ).\n", + "\n", + "Euler's method is good enough for many simple problems, but sometimes it is not very accurate.\n", + "In that case, sometimes we can make it more accurate by decreasing the size of `dt`.\n", + "But then it is not very efficient.\n", + "\n", + "There are other methods that are more accurate and more efficient than Euler's method.\n", + "SciPy provides several of them as a function called `solve_ivp` \n", + "The \"ivp\" in `solve_ivp` stands for \"initial value problem\", which is the term for problems like the ones we've been solving, where we are given the initial conditions and try to predict what will happen.\n", + "\n", + "ModSim provides a function called `run_solve_ivp` that makes `solve_ivp` a little easier to use.\n", + "\n", + "To use it, we have to provide a \"slope function\", which is similar to an update function; in fact, it takes the same parameters: a time stamp, a `State` object, and a `System` object.\n", + "\n", + "Here's a slope function that evaluates the differential equations of the minimal model." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "expected-collapse", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " G, X = state\n", + " G0, k1, k2, k3 = system.params \n", + " I, Ib, Gb = system.I, system.Ib, system.Gb\n", + " \n", + " dGdt = -k1 * (G - Gb) - X*G\n", + " dXdt = k3 * (I(t) - Ib) - k2 * X\n", + " \n", + " return dGdt, dXdt" + ] + }, + { + "cell_type": "markdown", + "id": "modified-surname", + "metadata": {}, + "source": [ + "`slope_func` is a little simpler than `update_func` because it only compute the derivatives, that is, the slopes. It doesn't do the updates; the solver does them for us.\n", + "\n", + "Now we can call `run_solve_ivp` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "intelligent-visitor", + "metadata": {}, + "outputs": [], + "source": [ + "results2, details = run_solve_ivp(system, slope_func,\n", + " t_eval=results.index)" + ] + }, + { + "cell_type": "markdown", + "id": "promotional-result", + "metadata": {}, + "source": [ + "`run_solve_ivp` is similar to `run_simulation`: it takes a `System`\n", + "object and a slope function as parameters.\n", + "\n", + "The third argument, `t_eval`, is optional; it specifies where the solution should be evaluated.\n", + "\n", + "It returns two values: a `TimeFrame`, which we assign to `results2`, and an `OdeResult` object, which we assign to `details`.\n", + "\n", + "The `OdeResult` object contains information about how the solver ran, including a success code and a diagnostic message." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "industrial-focus", + "metadata": {}, + "outputs": [], + "source": [ + "details.success" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "frequent-exhibit", + "metadata": {}, + "outputs": [], + "source": [ + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "fatal-parliament", + "metadata": {}, + "source": [ + "It's important to check these messages after running the solver, in case anything went wrong.\n", + "\n", + "The `TimeFrame` has one row for each time step and one column for each state variable. In this example, the rows are time from 0 to 182 minutes; the columns are the state variables, `G` and `X`.\n", + "Here are the first few time steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "immediate-legislature", + "metadata": {}, + "outputs": [], + "source": [ + "results2.head()" + ] + }, + { + "cell_type": "markdown", + "id": "noticed-material", + "metadata": {}, + "source": [ + "Because we used `t_eval=results.index`, the time stamps in `results2` are the same as in `results`, which makes them easier to compare.\n", + "\n", + "Here are the results from `run_solve_ivp` along with the results from `run_simulation`:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "peripheral-commission", + "metadata": {}, + "outputs": [], + "source": [ + "results.G.plot(style='--', label='simulation')\n", + "results2.G.plot(style='-', label='solve ivp')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "id": "advanced-provider", + "metadata": {}, + "source": [ + "The differences are barely visible.\n", + "We can compute the relative differences like this:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "clear-neighbor", + "metadata": {}, + "outputs": [], + "source": [ + "diff = results.G - results2.G\n", + "percent_diff = diff / results2.G * 100\n", + "percent_diff.abs().describe()" + ] + }, + { + "cell_type": "markdown", + "id": "temporal-threat", + "metadata": {}, + "source": [ + "The biggest differences are a little more than 1%.\n", + "So in this example, the results from Euler's method are probably good enough for practical purposes." + ] + }, + { + "cell_type": "markdown", + "id": "corrected-indonesia", + "metadata": {}, + "source": [ + "Here are the results for `X`." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "happy-guess", + "metadata": {}, + "outputs": [], + "source": [ + "results.X.plot(style='--', label='simulation')\n", + "results2.X.plot(style='-', label='solve ivp')\n", + "\n", + "decorate(xlabel='Time (min)', \n", + " ylabel='Concentration (arbitrary units)')" + ] + }, + { + "cell_type": "markdown", + "id": "electronic-navigation", + "metadata": {}, + "source": [ + "These differences are little bigger, especially at the beginning.\n", + "As an exercise, you can experiment with `dt` and see what effect it has on these results." + ] + }, + { + "cell_type": "markdown", + "id": "prostate-psychology", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this chapter, we implemented the glucose minimal model two ways, using `run_simulation` and `run_solve_ivp`, and compared the results.\n", + "We found that in this example, `run_simulation`, which uses Euler's method, is probably good enough.\n", + "But soon we will see examples where it is not.\n", + "\n", + "So far, we have assumed that the parameters of the system are known, but in practice that's not true.\n", + "As one of the case studies in the next chapter, you'll have a chance to see where those parameters came from." + ] + }, + { + "cell_type": "markdown", + "id": "unusual-springer", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "substantial-grain", + "metadata": {}, + "source": [ + "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", + "\n", + "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "thermal-trance", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "prompt-activity", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "developed-collaboration", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "alpha-configuration", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "The documentation for `solve_ivp` is at .\n", + "\n", + "It uses a Runge-Kutta method...\n", + "[RK45](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "russian-qualification", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb new file mode 100644 index 00000000..f2f3c588 --- /dev/null +++ b/chapters/chap19.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "mighty-israeli", + "metadata": {}, + "source": [ + "# Chapter 19" + ] + }, + { + "cell_type": "markdown", + "id": "passing-solid", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "structured-satellite", + "metadata": {}, + "source": [ + "## The glucose minimal model\n", + "\n", + "In the previous chapter we implemented the glucose minimal model using given parameters, but I didn't say where those parameters came from.\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`glucose.ipynb`, that shows how we can find the parameters that best fit the data.\n", + "\n", + "It uses a SciPy function called `leastsq`, which stands for \"least squares\"; that is, it finds the parameters that minimize the sum of squared differences between the results of the model and the data.\n", + "\n", + "You can think of `leastsq` as an optional tool for this book. We won't use it in the text itself, but it appears in a few of the case studies.\n" + ] + }, + { + "cell_type": "markdown", + "id": "laden-gathering", + "metadata": {}, + "source": [ + "## The insulin minimal model\n", + "\n", + "Along with the glucose minimal model, Berman et al. developed an insulin minimal model, in which the concentration of insulin, $I$, is governed by this differential equation:\n", + "\n", + "$$\\frac{dI}{dt} = -k I(t) + \\gamma \\left[ G(t) - G_T \\right] t$$ \n", + "\n", + "where\n", + "\n", + "- $k$ is a parameter that controls the rate of insulin disappearance\n", + " independent of blood glucose.\n", + "\n", + "- $G(t)$ is the measured concentration of blood glucose at time $t$.\n", + "\n", + "- $G_T$ is the glucose threshold; when blood glucose is above this\n", + " level, it triggers an increase in blood insulin.\n", + "\n", + "- $\\gamma$ is a parameter that controls the rate of increase (or\n", + " decrease) in blood insulin when glucose is above (or below) $G_T$.\n", + "\n", + "The initial condition is $I(0) = I_0$. As in the glucose minimal model, we treat the initial condition as a parameter which we'll choose to fit the data." + ] + }, + { + "cell_type": "markdown", + "id": "interstate-gibson", + "metadata": {}, + "source": [ + "The parameters of this model can be used to estimate $\\phi_1$ and\n", + "$\\phi_2$, which are quantities that \"describe the sensitivity to glucose of the first and second phase pancreatic responsivity\". These quantities are related to the parameters as follows:\n", + "\n", + "$$\\phi_1 = \\frac{I_{max} - I_b}{k (G_0 - G_b)}$$\n", + "\n", + "$$\\phi_2 = \\gamma \\times 10^4$$ \n", + "\n", + "where $I_{max}$ is the maximum measured insulin level, and $I_b$ and $G_b$ are the basal levels of insulin and glucose.\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`insulin.ipynb`, that contains starter code for this case study. Use it to implement the insulin model, find the parameters that best fit the data, and estimate $\\phi_1$ and $\\phi_2$." + ] + }, + { + "cell_type": "markdown", + "id": "parallel-radical", + "metadata": {}, + "source": [ + "## Low-Pass Filter\n", + "\n", + "The following circuit diagram (from ) shows a low-pass filter built with one resistor and one capacitor.\n", + "\n", + "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/RC_Divider.svg)\n", + "\n", + "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", + "\n", + "A filter is \"low-pass\" if it allows low-frequency signals to pass from\n", + "$V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of\n", + "high-frequency signals.\n", + "\n", + "By applying the laws of circuit analysis, we can derive a differential\n", + "equation that describes the behavior of this system. By solving the\n", + "differential equation, we can predict the effect of this circuit on any input signal.\n", + "\n", + "Suppose we are given $V_{in}$ and $V_{out}$ at a particular instant in\n", + "time. By Ohm's law, which is a simple model of the behavior of\n", + "resistors, the instantaneous current through the resistor is:\n", + "\n", + "$$I_R = (V_{in} - V_{out}) / R$$ \n", + "\n", + "where $R$ is resistance in ohms (Ω).\n", + "\n", + "Assuming that no current flows through the output of the circuit,\n", + "Kirchhoff's current law implies that the current through the capacitor\n", + "is: \n", + "\n", + "$$I_C = I_R$$ \n", + "\n", + "According to a simple model of the behavior of\n", + "capacitors, current through the capacitor causes a change in the voltage across the capacitor: \n", + "\n", + "$$I_C = C \\frac{d V_{out}}{dt}$$ \n", + "\n", + "where $C$ is capacitance in farads (F). Combining these equations yields a differential equation for $V_{out}$:\n", + "\n", + "$$\\frac{d V_{out}}{dt} = \\frac{V_{in} - V_{out}}{R C}$$ \n", + "\n", + "In the repository for this book, you will find a notebook, `filter.ipynb`, which contains starter code for this case study. Follow the instructions to simulate the low-pass filter for input signals like this:\n", + "\n", + "$$V_{in}(t) = A \\cos (2 \\pi f t)$$ \n", + "\n", + "where $A$ is the amplitude of the input signal, say 5 V, and $f$ is the frequency of the signal in Hz.\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`filter.ipynb`, which contains starter code for this case study. Read\n", + "the notebook, run the code, and work on the exercises." + ] + }, + { + "cell_type": "markdown", + "id": "violent-directive", + "metadata": {}, + "source": [ + "## Thermal behavior of a wall\n", + "\n", + "This case study is based on a paper by Gori, et al[^2] that models the\n", + "thermal behavior of a brick wall, with the goal of understanding the\n", + "\"performance gap between the expected energy use of buildings and their measured energy use\".\n", + "\n", + "The following figure shows the scenario and their model of the wall:\n", + "\n", + "![Model of a wall as a series of thermal insulators](https://github.com/AllenDowney/ModSim/raw/main/figs/wall_model.png)\n", + "\n", + "On the interior and exterior surfaces of the wall, they measure\n", + "temperature and heat flux over a period of three days. They model the\n", + "wall using two thermal masses connected to the surfaces, and to each\n", + "other, by thermal resistors." + ] + }, + { + "cell_type": "markdown", + "id": "entire-stations", + "metadata": {}, + "source": [ + "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", + "\n", + "The primary result is a comparison of two models: the one shown here\n", + "with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better.\n", + "\n", + "For this case study we will implement their model and run it with the\n", + "estimated parameters from the paper, and then use `leastsq` to see\n", + "if we can find parameters that yield lower errors.\n", + "\n", + "In the repository for this book, you will find a notebook, `wall.ipynb` with the code and results for this case study.\n", + "\n", + "The authors put their paper under a Creative Commons license, and\n", + "make their data available at . I thank them\n", + "for their commitment to open, reproducible science, which made this\n", + "case study possible.\n", + "\n", + "Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, pages 398-409, ." + ] + }, + { + "cell_type": "markdown", + "id": "narrow-voice", + "metadata": {}, + "source": [ + "## HIV\n", + "\n", + "During the initial phase of HIV infection, the concentration of the virus in the bloodstream typically increases quickly and then decreases.\n", + "The most obvious explanation for the decline is an immune response that destroys the virus or controls its replication.\n", + "However, at least in some patients, the decline occurs even without any detectable immune response.\n", + "\n", + "In 1996 Andrew Phillips proposed another explanation for the decline (\"Reduction of HIV Concentration During Acute Infection: Independence from a Specific Immune Response\", available from ).\n", + "\n", + "Phillips presents a system of differential equations that models the concentrations of the HIV virus and the CD4 cells it infects.\n", + "The model does not include an immune response; nevertheless, it demonstrates behavior that is qualitatively similar to what is seen in patients during the first few weeks after infection.\n", + "\n", + "His conclusion is that the observed decline in the concentration of HIV might not be caused by an immune response; it could be due to the dynamic interaction between HIV and the cells it infects.\n", + "\n", + "In the repository for this book, you will find a notebook, `hiv_model.ipynb`, which you can use to implement Phillips's model and consider whether it does the work it is meant to do." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "international-button", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb new file mode 100644 index 00000000..fb46d858 --- /dev/null +++ b/chapters/chap20.ipynb @@ -0,0 +1,794 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "funded-utilization", + "metadata": {}, + "source": [ + "# Chapter 20" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-portsmouth", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "embedded-gentleman", + "metadata": {}, + "source": [ + "So far the differential equations we've worked with have been **first\n", + "order**, which means they involve only first derivatives. In this\n", + "chapter, we turn our attention to second order ODEs, which can involve\n", + "both first and second derivatives.\n", + "\n", + "We'll revisit the falling penny example from\n", + "Chapter xxx, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." + ] + }, + { + "cell_type": "markdown", + "id": "isolated-louis", + "metadata": {}, + "source": [ + "## Newton's second law of motion\n", + "\n", + "First order ODEs can be written \n", + "\n", + "$$\\frac{dy}{dx} = G(x, y)$$ \n", + "\n", + "where $G$ is some function of $x$ and $y$ (see ). Second order ODEs can be written \n", + "\n", + "$$\\frac{d^2y}{dx^2} = H(x, y, \\frac{dy}{dt})$$\n", + "\n", + "where $H$ is a function of $x$, $y$, and $dy/dx$.\n", + "\n", + "In this chapter, we will work with one of the most famous and useful\n", + "second order ODEs, Newton's second law of motion: \n", + "\n", + "$$F = m a$$ \n", + "\n", + "where $F$ is a force or the total of a set of forces, $m$ is the mass of a moving object, and $a$ is its acceleration." + ] + }, + { + "cell_type": "markdown", + "id": "drawn-symphony", + "metadata": {}, + "source": [ + "Newton's law might not look like a differential equation, until we\n", + "realize that acceleration, $a$, is the second derivative of position,\n", + "$y$, with respect to time, $t$. With the substitution\n", + "\n", + "$$a = \\frac{d^2y}{dt^2}$$ \n", + "\n", + "Newton's law can be written\n", + "\n", + "$$\\frac{d^2y}{dt^2} = F / m$$ \n", + "\n", + "And that's definitely a second order ODE.\n", + "In general, $F$ can be a function of time, position, and velocity." + ] + }, + { + "cell_type": "markdown", + "id": "swiss-vietnam", + "metadata": {}, + "source": [ + "Of course, this \"law\" is really a model in the sense that it is a\n", + "simplification of the real world. Although it is often approximately\n", + "true:\n", + "\n", + "- It only applies if $m$ is constant. If mass depends on time,\n", + " position, or velocity, we have to use a more general form of\n", + " Newton's law (see ).\n", + "\n", + "- It is not a good model for very small things, which are better\n", + " described by another model, quantum mechanics.\n", + "\n", + "- And it is not a good model for things moving very fast, which are\n", + " better described by yet another model, relativistic mechanics.\n", + "\n", + "However, for medium-sized things with constant mass, moving at\n", + "medium-sized speeds, Newton's model is extremely useful. If we can\n", + "quantify the forces that act on such an object, we can predict how it\n", + "will move." + ] + }, + { + "cell_type": "markdown", + "id": "coordinate-three", + "metadata": {}, + "source": [ + "## Dropping pennies\n", + "\n", + "As a first example, let's get back to the penny falling from the Empire State Building, which we considered in\n", + "Chapter xxx. We will implement two models of this system: first without air resistance, then with.\n", + "\n", + "Given that the Empire State Building is 381 m high, and assuming that\n", + "the penny is dropped from a standstill, the initial conditions are:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "compatible-increase", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "init = State(y=381, v=0)" + ] + }, + { + "cell_type": "markdown", + "id": "intellectual-radiation", + "metadata": {}, + "source": [ + "where `y` is height above the sidewalk and `v` is velocity. \n", + "\n", + "The units `m` and `s` are from the `units` object provided by Pint:" + ] + }, + { + "cell_type": "markdown", + "id": "wicked-thomas", + "metadata": {}, + "source": [ + "The only system parameter is the acceleration of gravity:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "reverse-authorization", + "metadata": {}, + "outputs": [], + "source": [ + "g = 9.8" + ] + }, + { + "cell_type": "markdown", + "id": "developing-newfoundland", + "metadata": {}, + "source": [ + "In addition, we'll specify the duration of the simulation and the step\n", + "size:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "square-toolbox", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 10\n", + "dt = 0.1" + ] + }, + { + "cell_type": "markdown", + "id": "precise-tobago", + "metadata": {}, + "source": [ + "With these parameters, the number of time steps is 100, which is good\n", + "enough for many problems. Once we have a solution, we will increase the\n", + "number of steps and see what effect it has on the results.\n", + "\n", + "We need a `System` object to store the parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "built-piece", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "system = System(init=init, g=g, t_end=t_end, dt=dt)" + ] + }, + { + "cell_type": "markdown", + "id": "heavy-boards", + "metadata": {}, + "source": [ + "Now we need a slope function, and here's where things get tricky. As we have seen, `run_solve_ivp` can solve systems of first order ODEs, but Newton's law is a second order ODE. However, if we recognize that\n", + "\n", + "1. Velocity, $v$, is the derivative of position, $dy/dt$, and\n", + "\n", + "2. Acceleration, $a$, is the derivative of velocity, $dv/dt$,\n", + "\n", + "we can rewrite Newton's law as a system of first order ODEs:\n", + "\n", + "$$\\frac{dy}{dt} = v$$ \n", + "\n", + "$$\\frac{dv}{dt} = a$$ \n", + "\n", + "And we can translate those\n", + "equations into a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "occupied-mercury", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " y, v = state\n", + "\n", + " dydt = v\n", + " dvdt = -system.g\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "id": "opening-adolescent", + "metadata": {}, + "source": [ + "The first parameter, `state`, contains the position and velocity of the\n", + "penny. The last parameter, `system`, contains the system parameter `g`,\n", + "which is the magnitude of acceleration due to gravity.\n", + "\n", + "The second parameter, `t`, is time. It is not used in this slope\n", + "function because none of the factors of the model are time dependent. I include it anyway because this function will be called by `run_solve_ivp`, which always provides the same arguments,\n", + "whether they are needed or not.\n", + "\n", + "The rest of the function is a straightforward translation of the\n", + "differential equations, with the substitution $a = -g$, which indicates that acceleration due to gravity is in the direction of decreasing $y$. `slope_func` returns a sequence containing the two derivatives.\n", + "\n", + "Before calling `run_solve_ivp`, it is a good idea to test the slope\n", + "function with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "positive-feeling", + "metadata": {}, + "outputs": [], + "source": [ + "dydt, dvdt = slope_func(0, system.init, system)\n", + "print(dydt)\n", + "print(dvdt)" + ] + }, + { + "cell_type": "markdown", + "id": "false-charlotte", + "metadata": {}, + "source": [ + "The result is 0 m/s for velocity and 9.8 m/s$^2$ for acceleration. Now we call `run_solve_ivp` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "lovely-management", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results, details = run_solve_ivp(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "assisted-swimming", + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "solved-chambers", + "metadata": {}, + "source": [ + "`results` is a `TimeFrame` with two columns: `y` contains the height of\n", + "the penny; `v` contains its velocity.\n", + "\n", + "We can plot the results like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "authorized-barrier", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results.y.plot()\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')" + ] + }, + { + "cell_type": "markdown", + "id": "differential-airfare", + "metadata": {}, + "source": [ + "Since acceleration is constant, velocity increases linearly and position decreases quadratically; as a result, the height curve is a parabola.\n", + "\n", + "The last value of `results.y` is negative, which means we ran the simulation too long. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "protected-fiber", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = results.index[-1]\n", + "results.y[t_end]" + ] + }, + { + "cell_type": "markdown", + "id": "metallic-tamil", + "metadata": {}, + "source": [ + "One way to solve this problem is to use the results to\n", + "estimate the time when the penny hits the sidewalk.\n", + "\n", + "The ModSim library provides `crossings`, which takes a `TimeSeries` and a value, and returns a sequence of times when the series passes through the value. We can find the time when the height of the penny is `0` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "japanese-clear", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "t_crossings = crossings(results.y, 0)\n", + "t_crossings" + ] + }, + { + "cell_type": "markdown", + "id": "demonstrated-emission", + "metadata": {}, + "source": [ + "The result is an array with a single value, 8.818 s. Now, we could run\n", + "the simulation again with `t_end = 8.818`, but there's a better way." + ] + }, + { + "cell_type": "markdown", + "id": "blind-dominant", + "metadata": {}, + "source": [ + "## Events\n", + "\n", + "As an option, `run_solve_ivp` can take an **event function**, which\n", + "detects an \"event\", like the penny hitting the sidewalk, and ends the\n", + "simulation.\n", + "\n", + "Event functions take the same parameters as slope functions, `state`,\n", + "`t`, and `system`. They should return a value that passes through `0`\n", + "when the event occurs. Here's an event function that detects the penny\n", + "hitting the sidewalk:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "comfortable-simple", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "closing-vehicle", + "metadata": {}, + "source": [ + "The return value is the height of the penny, `y`, which passes through\n", + "`0` when the penny hits the sidewalk.\n", + "\n", + "We pass the event function to `run_solve_ivp` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "exotic-shareware", + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "id": "recreational-blair", + "metadata": {}, + "source": [ + "Then we can get the flight time and final velocity like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "appropriate-roberts", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = results.index[-1]\n", + "t_end" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "orange-retro", + "metadata": {}, + "outputs": [], + "source": [ + "y, v = results.iloc[-1]\n", + "print(y)\n", + "print(v)" + ] + }, + { + "cell_type": "markdown", + "id": "cleared-jamaica", + "metadata": {}, + "source": [ + "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", + "\n", + "So it's a good thing there is air resistance." + ] + }, + { + "cell_type": "markdown", + "id": "induced-albert", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "But air resistance...\n" + ] + }, + { + "cell_type": "markdown", + "id": "straight-johns", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", + "\n", + "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", + "\n", + "Use `run_solve_ivp` to answer this question.\n", + "\n", + "Here are some suggestions about how to proceed:\n", + "\n", + "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", + "\n", + "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", + "\n", + "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", + "\n", + "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", + "\n", + "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "forbidden-distributor", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "former-taxation", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "biological-creek", + "metadata": {}, + "outputs": [], + "source": [ + "r_0 / r_final" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "oriental-riverside", + "metadata": {}, + "outputs": [], + "source": [ + "t_end = 1e7 # seconds\n", + "\n", + "system = System(init=init,\n", + " G=6.674e-11, # N m^2 / kg^2\n", + " m1=1.989e30, # kg\n", + " m2=5.972e24, # kg\n", + " r_final=radius_sun + radius_earth,\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "radio-reproduction", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "heavy-cologne", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "little-electric", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "continental-details", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "suitable-traveler", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "upper-victory", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "transparent-treat", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "brutal-woman", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "gentle-burst", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "comfortable-galaxy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "satisfactory-latitude", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "significant-rebound", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "right-colleague", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "`solve_ivp`\n", + "\n", + "Here is the source code for `crossings` so you can see what's happening under the hood:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "chief-error", + "metadata": {}, + "outputs": [], + "source": [ + "%psource crossings" + ] + }, + { + "cell_type": "markdown", + "id": "comparable-company", + "metadata": {}, + "source": [ + "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "listed-shelter", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb new file mode 100644 index 00000000..3cd917bd --- /dev/null +++ b/chapters/chap21.ipynb @@ -0,0 +1,759 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "excited-advance", + "metadata": {}, + "source": [ + "# Chapter 21" + ] + }, + { + "cell_type": "markdown", + "id": "unauthorized-constitutional", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "superb-february", + "metadata": {}, + "source": [ + "In the previous chapter we simulated a penny falling in a vacuum, that\n", + "is, without air resistance. But the computational framework we used is\n", + "very general; it is easy to add additional forces, including drag.\n", + "\n", + "In this chapter, I present a model of drag force and add it to the\n", + "simulation." + ] + }, + { + "cell_type": "markdown", + "id": "interesting-freeware", + "metadata": {}, + "source": [ + "## Drag force\n", + "\n", + "As an object moves through a fluid, like air, the object applies force\n", + "to the air and, in accordance with Newton's third law of motion, the air applies an equal and opposite force to the object (see\n", + ").\n", + "\n", + "The direction of this **drag force** is opposite the direction of\n", + "travel, and its magnitude is given by the drag equation (see\n", + "): \n", + "\n", + "$$F_d = \\frac{1}{2}~\\rho~v^2~C_d~A$$\n", + "\n", + "where\n", + "\n", + "- $F_d$ is force due to drag, in newtons (N).\n", + "\n", + "- $\\rho$ is the density of the fluid in kg/m^3^.\n", + "\n", + "- $v$ is the magnitude of velocity in m/s.\n", + "\n", + "- $A$ is the **reference area** of the object, in m^2^. In this\n", + " context, the reference area is the projected frontal area, that is, the visible area of the object as seen from a point on its line of\n", + " travel (and far away).\n", + "\n", + "- $C_d$ is the **drag coefficient**, a dimensionless quantity that\n", + " depends on the shape of the object (including length but not frontal area), its surface properties, and how it interacts with the fluid." + ] + }, + { + "cell_type": "markdown", + "id": "unable-scheduling", + "metadata": {}, + "source": [ + "For objects moving at moderate speeds through air, typical drag\n", + "coefficients are between 0.1 and 1.0, with blunt objects at the high end of the range and streamlined objects at the low end (see\n", + ").\n", + "\n", + "For simple geometric objects we can sometimes guess the drag coefficient with reasonable accuracy; for more complex objects we usually have to take measurements and estimate $C_d$ from data.\n", + "\n", + "Of course, the drag equation is itself a model, based on the assumption that $C_d$ does not depend on the other terms in the equation: density, velocity, and area. For objects moving in air at moderate speeds (below 45 mph or 20 m/s), this model might be good enough, but we should remember to revisit this assumption.\n", + "\n", + "For the falling penny, we can use measurements to estimate $C_d$. In\n", + "particular, we can measure **terminal velocity**, $v_{term}$, which is\n", + "the speed where drag force equals force due to gravity:\n", + "\n", + "$$\\frac{1}{2}~\\rho~v_{term}^2~C_d~A = m g$$ \n", + "\n", + "where $m$ is the mass of the object and $g$ is acceleration due to gravity. Solving this equation for\n", + "$C_d$ yields: \n", + "\n", + "$$C_d = \\frac{2~m g}{\\rho~v_{term}^2~A}$$ \n", + "\n", + "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere.\n", + "\n", + "Now we are ready to add air resistance to the model." + ] + }, + { + "cell_type": "markdown", + "id": "human-cloud", + "metadata": {}, + "source": [ + "## The Params Object\n", + "\n", + "As the number of system parameters increases, and as we need to do more work to compute them, we will find it useful to define a `Params` object to contain the quantities we need to make a `System` object. `Params` objects are similar to `System` objects, and we initialize them the same way.\n", + "\n", + "Here's the `Params` object for the falling penny:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "established-knitting", + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(\n", + " mass = 0.0025, # kg\n", + " diameter = 0.019, # m\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + " v_init = 0, # m / s\n", + " v_term = 18, # m / s\n", + " height = 381, # m\n", + " t_end = 30, # s\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "instrumental-gross", + "metadata": {}, + "source": [ + "The mass and diameter are from . The density\n", + "of air depends on temperature, barometric pressure (which depends on\n", + "altitude), humidity, and composition (). I\n", + "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n", + "\n", + "\n", + "Here's a version of `make_system` that takes the `Params` object and computes the inital state, `init`, the area, and the coefficient of drag.\n", + "Then it returns a `System` object with the quantities we'll need for the simulation. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "published-jesus", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "\n", + "def make_system(params):\n", + " init = State(y=params.height, v=params.v_init)\n", + "\n", + " area = pi * (params.diameter/2)**2\n", + "\n", + " C_d = (2 * params.mass * params.g / \n", + " (params.rho * area * params.v_term**2))\n", + "\n", + " return System(init=init,\n", + " area=area,\n", + " C_d=C_d,\n", + " mass=params.mass,\n", + " rho=params.rho,\n", + " g=params.g,\n", + " t_end=params.t_end\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "personalized-kruger", + "metadata": {}, + "source": [ + "And here's how we call it." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "executive-protection", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "id": "portable-carbon", + "metadata": {}, + "source": [ + "Based on the mass and diameter of the penny, the density of air, and acceleration due to gravity, and the observed terminal velocity, we estimate that the coefficient of drag is about 0.44." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "quick-cedar", + "metadata": {}, + "outputs": [], + "source": [ + "system.C_d" + ] + }, + { + "cell_type": "markdown", + "id": "inner-telescope", + "metadata": {}, + "source": [ + "It might not be obvious why it is useful to create a `Params` object just to create a `System` object.\n", + "In fact, if we only run one simulation, it might not be useful. But it helps when we want to change or sweep the parameters.\n", + "\n", + "For example, suppose we learn that the terminal velocity of a penny is actually closer to 20 m/s.\n", + "We can make a `Params` object with the new value, and a corresponding `System` object, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "great-crime", + "metadata": {}, + "outputs": [], + "source": [ + "params2 = params.set(v_term=20)" + ] + }, + { + "cell_type": "markdown", + "id": "outstanding-truth", + "metadata": {}, + "source": [ + "The result from `set` is a new `Params` object that is identical to the original except for the given value of `v_term`. \n", + "\n", + "If we pass `params2` to `make_system`, we see that it computes a different value of `C_d`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "independent-trace", + "metadata": {}, + "outputs": [], + "source": [ + "system2 = make_system(params2)\n", + "system2.C_d" + ] + }, + { + "cell_type": "markdown", + "id": "charged-explorer", + "metadata": {}, + "source": [ + "If the terminal velocity of the penny is 20 m/s, rather than 18 m/s, that implies that the coefficient of drag is 0.36, rather than 0.44.\n", + "And that makes sense, since lower drag implies faster terminal velocity.\n", + "\n", + "Using `Params` objects to make `System` objects helps make sure that relationships like this are consistent. And since we are always making new objects, rather than modifying existing objects, we are less likely to make a mistake." + ] + }, + { + "cell_type": "markdown", + "id": "primary-advocate", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "Now let's get to the simulation. Here's a version of the slope function that includes drag:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "noble-stick", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " y, v = state\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " mass, g = system.mass, system.g\n", + " \n", + " f_drag = rho * v**2 * C_d * area / 2\n", + " a_drag = f_drag / mass\n", + " \n", + " dydt = v\n", + " dvdt = -g + a_drag\n", + " \n", + " return dydt, dvdt" + ] + }, + { + "cell_type": "markdown", + "id": "baking-class", + "metadata": {}, + "source": [ + "`f_drag` is force due to drag, based on the drag equation. `a_drag` is\n", + "acceleration due to drag, based on Newton's second law.\n", + "\n", + "To compute total acceleration, we add accelerations due to gravity and\n", + "drag. `g` is negated because it is in the direction of decreasing `y`,\n", + "and `a_drag` is positive because it is in the direction of increasing\n", + "`y`. In the next chapter we will use `Vector` objects to keep track of\n", + "the direction of forces and add them up in a less error-prone way." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "velvet-tunisia", + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "psychological-style", + "metadata": {}, + "source": [ + "To stop the simulation when the penny hits the sidewalk, we'll use the\n", + "event function from Section xxx:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "practical-nowhere", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " y, v = state\n", + " return y" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "animated-clause", + "metadata": {}, + "outputs": [], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "executive-there", + "metadata": {}, + "source": [ + "Now we can run the simulation like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "liberal-dictionary", + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "incident-paradise", + "metadata": {}, + "source": [ + "Here are the last few time steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "coastal-anthropology", + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "suburban-martial", + "metadata": {}, + "source": [ + "The final height is close to 0, as expected.\n", + "\n", + "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", + "\n", + "We can get the flight time from `results`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "interim-underground", + "metadata": {}, + "outputs": [], + "source": [ + "t_sidewalk = results.index[-1]\n", + "t_sidewalk" + ] + }, + { + "cell_type": "markdown", + "id": "institutional-colors", + "metadata": {}, + "source": [ + "Here's the plot of position as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "small-franchise", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " results.y.plot()\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "id": "plain-phone", + "metadata": {}, + "source": [ + "And velocity as a function of time:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "analyzed-criticism", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + "\n", + " results.v.plot(color='C1', label='v')\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "id": "careful-causing", + "metadata": {}, + "source": [ + "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." + ] + }, + { + "cell_type": "markdown", + "id": "inside-confidence", + "metadata": {}, + "source": [ + "## Summary" + ] + }, + { + "cell_type": "markdown", + "id": "planned-endorsement", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "respective-address", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with a downward initial velocity that exceeds the penny's terminal velocity.\n", + "\n", + "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction.\n", + "\n", + "Hint: Use `params.set` to make a new `Params` object with a different initial velocity." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "inclusive-twenty", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "vertical-judge", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "greenhouse-madagascar", + "metadata": {}, + "outputs": [], + "source": [ + "t_sidewalk = results2.index[-1]\n", + "t_sidewalk" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "sudden-details", + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results2)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "opening-jurisdiction", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "smaller-millennium", + "metadata": {}, + "source": [ + "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate terminal velocity and coefficient of drag.\n", + "\n", + "You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", + "\n", + "1. Create a `Params` object with new values of `mass` and `diameter`. We don't know `v_term`, so we'll start with the initial guess 18 m/s.\n", + "\n", + "2. Use `make_system` to create a `System` object. \n", + "\n", + "3. Call `run_solve_ivp` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", + "\n", + "4. Try a few different values of `v_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", + "\n", + "5. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", + "\n", + "6. Use your best estimate of `v_term` to compute `C_d`.\n", + "\n", + "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "compact-bunny", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "shared-contrary", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "portable-account", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "arabic-shareware", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "valued-literature", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "sufficient-retail", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "comparable-lounge", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "ready-people", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "miniature-remark", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "frozen-termination", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "colored-oxygen", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "`Params` is a `SimpleNamespace`, like `System`.\n", + "\n", + "`Params` and `System` are actually the same; I have given them different names to document the different roles they play." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb new file mode 100644 index 00000000..5dae8f6f --- /dev/null +++ b/chapters/chap22.ipynb @@ -0,0 +1,1248 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "collaborative-people", + "metadata": {}, + "source": [ + "# Chapter 22" + ] + }, + { + "cell_type": "markdown", + "id": "connected-covering", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "advanced-guidance", + "metadata": {}, + "source": [ + "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", + "\n", + "In this chapter we model the flight of a baseball including the effect\n", + "of air resistance. In the next chapter we use this model to solve an\n", + "optimization problem." + ] + }, + { + "cell_type": "markdown", + "id": "offensive-chinese", + "metadata": {}, + "source": [ + "## Baseball\n", + "\n", + "To model the flight of a baseball, we have to make some\n", + "decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", + "\n", + "Air resistance has a substantial effect on most projectiles in air, so\n", + "we will include a drag force.\n", + "\n", + "To model air resistance, we'll need the mass, frontal area, and drag\n", + "coefficient of a baseball. Mass and diameter are easy to find (see\n", + "). Drag coefficient is only a little\n", + "harder; according to *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*, the drag coefficient of a baseball is approximately 0.33 (with no units).\n", + "\n", + "However, this value *does* depend on velocity. At low velocities it\n", + "might be as high as 0.5, and at high velocities as low as 0.28.\n", + "Furthermore, the transition between these regimes typically happens\n", + "exactly in the range of velocities we are interested in, between 20 m/s and 40 m/s.\n", + "\n", + "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you will have a chance to implement a more detailed model and see what effect is has on the results.\n", + "\n", + "But first we need a new computational tool, the `Vector` object." + ] + }, + { + "cell_type": "markdown", + "id": "worthy-wheel", + "metadata": {}, + "source": [ + "## Vectors\n", + "\n", + "Now that we are working in two dimensions, it will be useful to\n", + "work with **vector quantities**, that is, quantities that represent both a magnitude and a direction. We will use vectors to represent positions, velocities, accelerations, and forces in two and three dimensions.\n", + "\n", + "ModSim provides a function called `Vector` the creates a Pandas `Series` that contains the **components** of the vector.\n", + "In a `Vector` that represents a position in space, the components are the $x$ and $y$ coordinates in 2-D, plus a $z$ coordinate if the `Vector` is in 3-D.\n", + "\n", + "You can create a `Vector` by specifying its components. The following\n", + "`Vector` represents a point 3 units to the right (or east) and 4 units up (or north) from an implicit origin:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "handy-terrain", + "metadata": {}, + "outputs": [], + "source": [ + "A = Vector(3, 4)\n", + "A" + ] + }, + { + "cell_type": "markdown", + "id": "settled-roommate", + "metadata": {}, + "source": [ + "You can access the components of a `Vector` by name using the dot\n", + "operator, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "controversial-shower", + "metadata": {}, + "outputs": [], + "source": [ + "A.x, A.y" + ] + }, + { + "cell_type": "markdown", + "id": "earlier-contemporary", + "metadata": {}, + "source": [ + "You can also access them by index using brackets, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "automated-drove", + "metadata": {}, + "outputs": [], + "source": [ + "A[0], A[1]" + ] + }, + { + "cell_type": "markdown", + "id": "grave-burst", + "metadata": {}, + "source": [ + "`Vector` objects support most mathematical operations, including\n", + "addition and subtraction:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "conditional-latitude", + "metadata": {}, + "outputs": [], + "source": [ + "B = Vector(1, 2)\n", + "B" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "crucial-opening", + "metadata": {}, + "outputs": [], + "source": [ + "A + B" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "encouraging-cabinet", + "metadata": {}, + "outputs": [], + "source": [ + "A - B" + ] + }, + { + "cell_type": "markdown", + "id": "combined-command", + "metadata": {}, + "source": [ + "For the definition and graphical interpretation of these operations, see ." + ] + }, + { + "cell_type": "markdown", + "id": "later-adelaide", + "metadata": {}, + "source": [ + "We can specify a `Vector` with coordinates `x` and `y`, as in the previous examples.\n", + "Equivalently, we can specify a `Vector` with a magnitude and angle.\n", + "\n", + "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is the distance from the origin; if it represents a velocity, magnitude is speed, that is, how fast the object is moving, regardless of direction.\n", + "\n", + "The **angle** of a `Vector` is its direction, expressed as an angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", + "\n", + "ModSim provides functions to compute the magnitude and angle of a `Vector`. For example, here are the magnitude and angle of `A`:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "peripheral-tattoo", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "mag = vector_mag(A)\n", + "theta = vector_angle(A)\n", + "mag, theta" + ] + }, + { + "cell_type": "markdown", + "id": "great-advice", + "metadata": {}, + "source": [ + "The magnitude is 5 because the length of `A` is the hypotenuse of a 3-4-5 triangle.\n", + "\n", + "The result from `vector_angle` is in radians, and most Python functions, like `sin` and `cos`, work with radians. \n", + "But many people think more naturally in degrees. \n", + "Fortunately, NumPy provides a function to convert radians to degrees:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "strange-cleaning", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import rad2deg\n", + "\n", + "angle = rad2deg(theta)\n", + "angle" + ] + }, + { + "cell_type": "markdown", + "id": "assured-cutting", + "metadata": {}, + "source": [ + "And a function to convert degrees to radians:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "cellular-community", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import deg2rad\n", + "\n", + "theta = deg2rad(angle)\n", + "theta" + ] + }, + { + "cell_type": "markdown", + "id": "responsible-gentleman", + "metadata": {}, + "source": [ + "Following convention, I'll use `angle` for a value in degrees and `theta` for a value in radians.\n", + "\n", + "If you are given an angle and velocity, you can make a `Vector` using\n", + "`pol2cart`, which converts from polar to Cartesian coordinates. For example, here's a new `Vector` with the same angle and magnitude of `A`:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "monetary-firmware", + "metadata": {}, + "outputs": [], + "source": [ + "x, y = pol2cart(theta, mag)\n", + "Vector(x, y)" + ] + }, + { + "cell_type": "markdown", + "id": "lucky-plastic", + "metadata": {}, + "source": [ + "Another way to represent the direction of `A` is a **unit vector**,\n", + "which is a vector with magnitude 1 that points in the same direction as\n", + "`A`. You can compute a unit vector by dividing a vector by its\n", + "magnitude:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "explicit-piano", + "metadata": {}, + "outputs": [], + "source": [ + "A / vector_mag(A)" + ] + }, + { + "cell_type": "markdown", + "id": "respected-oliver", + "metadata": {}, + "source": [ + "We can do the same thing using the `vector_hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "relative-republic", + "metadata": {}, + "outputs": [], + "source": [ + "vector_hat(A)" + ] + }, + { + "cell_type": "markdown", + "id": "reduced-celebration", + "metadata": {}, + "source": [ + "Now let's get back to the game." + ] + }, + { + "cell_type": "markdown", + "id": "similar-local", + "metadata": {}, + "source": [ + "## Simulating baseball flight\n", + "\n", + "Let's simulate the flight of a baseball that is batted from home plate\n", + "at an angle of 45° and initial speed 40 m/s. We'll use the center of home plate as the origin, a horizontal x-axis (parallel to the ground), and vertical y-axis (perpendicular to the ground). The initial height is about 1 m." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "narrative-latest", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "params = Params(\n", + " x = 0, # m\n", + " y = 1, # m\n", + " angle = 45, # degree\n", + " velocity = 40, # m / s\n", + "\n", + " mass = 145e-3, # kg \n", + " diameter = 73e-3, # m \n", + " C_d = 0.33, # dimensionless\n", + "\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + " t_end = 10, # s\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "metric-collins", + "metadata": {}, + "source": [ + "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag is from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:" + ] + }, + { + "cell_type": "markdown", + "id": "increasing-combination", + "metadata": {}, + "source": [ + "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", + "And we'll need the acceleration of gravity, `g`." + ] + }, + { + "cell_type": "markdown", + "id": "detected-return", + "metadata": {}, + "source": [ + "The following function uses these quantities to make a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "bored-billy", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numpy import pi, deg2rad\n", + "\n", + "def make_system(params):\n", + " \n", + " # convert angle to degrees\n", + " theta = deg2rad(params.angle)\n", + " \n", + " # compute x and y components of velocity\n", + " vx, vy = pol2cart(theta, params.velocity)\n", + " \n", + " # make the initial state\n", + " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", + " \n", + " # compute the frontal area\n", + " area = pi * (params.diameter/2)**2\n", + "\n", + " return System(params,\n", + " init = init,\n", + " area = area,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-template", + "metadata": {}, + "source": [ + "`make_system` uses `deg2rad` to convert `angle` to radians and\n", + "`pol2cart` to compute the $x$ and $y$ components of the initial\n", + "velocity.\n", + "\n", + "`init` is a `State` object with four state variables:\n", + "\n", + "* `x` and `y` are the components of position.\n", + "\n", + "* `vx` and `vy` are the components of velocity.\n", + "\n", + "The `System` object also contains `t_end`, which is 10 seconds, long enough for the ball to land on the ground.\n", + "Here's the `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "ethical-donna", + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "id": "convinced-fellow", + "metadata": {}, + "source": [ + "And here's the initial `State`:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "legitimate-gossip", + "metadata": {}, + "outputs": [], + "source": [ + "system.init" + ] + }, + { + "cell_type": "markdown", + "id": "occasional-given", + "metadata": {}, + "source": [ + "Next we need a function to compute drag force:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "legal-terminal", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def drag_force(V, system):\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = rho * vector_mag(V)**2 * C_d * area / 2\n", + " direction = -vector_hat(V)\n", + " f_drag = mag * direction\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "id": "false-confusion", + "metadata": {}, + "source": [ + "This function takes `V` as a `Vector` and returns `f_drag` as a\n", + "`Vector`. \n", + "\n", + "* It uses `vector_mag` to compute the magnitude of `V`, \n", + "and the drag equation to compute the magnitude of the drag force, `mag`.\n", + "\n", + "* Then it uses `vector_hat` to compute `direction`, which is a unit vector in the opposite direction of `V`.\n", + "\n", + "* Finally, it computes the drag force vector by multiplying `mag` and `direction`.\n", + "\n", + "We can test it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "frank-chick", + "metadata": {}, + "outputs": [], + "source": [ + "vx, vy = system.init.vx, system.init.vy\n", + "V_test = Vector(vx, vy)\n", + "drag_force(V_test, system)" + ] + }, + { + "cell_type": "markdown", + "id": "absent-vector", + "metadata": {}, + "source": [ + "The result is a `Vector` that represents the drag force on the baseball, in Newtons, under the initial conditions.\n", + "\n", + "Now we're ready for a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "suitable-salem", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " V = Vector(vx, vy)\n", + " a_drag = drag_force(V, system) / mass\n", + " a_grav = g * Vector(0, -1)\n", + " \n", + " A = a_grav + a_drag\n", + " \n", + " return V.x, V.y, A.x, A.y" + ] + }, + { + "cell_type": "markdown", + "id": "scheduled-courage", + "metadata": {}, + "source": [ + "As usual, the parameters of the slope function are a time, a `State` object, and a `System` object. \n", + "In this example, we don't use `t`, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", + "\n", + "`slope_func` unpacks the `State` object into variables `x`, `y`, `vx`, and `vy`.\n", + "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force and acceleration due to drag, `a_drag`.\n", + "\n", + "To represent acceleration due to gravity, it makes a `Vector` with magnitude `g` in the negative $y$ direction.\n", + "\n", + "The total acceleration of the baseball, `A`, is the sum of accelerations due to gravity and drag." + ] + }, + { + "cell_type": "markdown", + "id": "enclosed-favorite", + "metadata": {}, + "source": [ + "The return value is a sequence that contains:\n", + "\n", + "* The components of velocity, `V.x` and `V.y`.\n", + "\n", + "* The components of acceleration, `A.x` and `A.y`.\n", + "\n", + "Together, these components represent the slope of the state variables, because `V` is the derivative of position and `A` is the derivative of velocity." + ] + }, + { + "cell_type": "markdown", + "id": "crude-parcel", + "metadata": {}, + "source": [ + "As always, we can test the slope function by running it with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "closing-simon", + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "regulated-railway", + "metadata": {}, + "source": [ + "Using vectors to represent forces and accelerations makes the code\n", + "concise, readable, and less error-prone. In particular, when we add\n", + "`a_grav` and `a_drag`, the directions are likely to be correct, because they are encoded in the `Vector` objects.\n", + "\n", + "We're almost ready to run the simulation. The last thing we need is an event function that stops when the ball hits the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "brief-level", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " x, y, vx, vy = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "novel-farmer", + "metadata": {}, + "source": [ + "The event function takes the same parameters as the slope function, and returns the $y$ coordinate of position. When the $y$ coordinate passes through 0, the simulation stops.\n", + "\n", + "As we did with `slope_func`, we can test `event_func` with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "threatened-alberta", + "metadata": {}, + "outputs": [], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "unlikely-dressing", + "metadata": {}, + "source": [ + "Now we're ready to run the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "special-background", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "iraqi-appeal", + "metadata": {}, + "source": [ + "`details` contains information about the simulation, including a message that indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", + "\n", + "`results` is a `TimeFrame` with one column for each of the state variables:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "prospective-external", + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "dominant-weekly", + "metadata": {}, + "source": [ + "We can get the flight time like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "medieval-calvin", + "metadata": {}, + "outputs": [], + "source": [ + "flight_time = results.index[-1]\n", + "flight_time" + ] + }, + { + "cell_type": "markdown", + "id": "convenient-heading", + "metadata": {}, + "source": [ + "And the final state like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "gorgeous-survey", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = results.iloc[-1]\n", + "final_state" + ] + }, + { + "cell_type": "markdown", + "id": "needed-aruba", + "metadata": {}, + "source": [ + "The final value of `y` is close to 0, as it should be. The final value of `x` tells us how far the ball flew, in meters." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "failing-bangkok", + "metadata": {}, + "outputs": [], + "source": [ + "x_dist = final_state.x\n", + "x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "growing-england", + "metadata": {}, + "source": [ + "We can also get the final velocity, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "copyrighted-highway", + "metadata": {}, + "outputs": [], + "source": [ + "final_V = Vector(final_state.vx, final_state.vy)\n", + "final_V" + ] + }, + { + "cell_type": "markdown", + "id": "vietnamese-diagram", + "metadata": {}, + "source": [ + "The speed of the ball on impact is about 26 m/s, which is substantially slower than the initial velocity, 40 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "structured-adams", + "metadata": {}, + "outputs": [], + "source": [ + "vector_mag(final_V)" + ] + }, + { + "cell_type": "markdown", + "id": "continuous-quick", + "metadata": {}, + "source": [ + "## Trajectories\n", + "\n", + "To visualize the results, we can plot the $x$ and $y$ components of position like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "spare-burst", + "metadata": {}, + "outputs": [], + "source": [ + "results.x.plot(color='C4')\n", + "results.y.plot(color='C2', style='--')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-bench", + "metadata": {}, + "source": [ + "As expected, the $x$ component increases as the ball moves away from home plate. The $y$ position climbs initially and then descends, falling to 0 m near 5.0 s.\n", + "\n", + "Another way to view the results is to plot the $x$ component on the\n", + "x-axis and the $y$ component on the y-axis, so the plotted line follows the trajectory of the ball through the plane:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "dated-browse", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_trajectory(results):\n", + " x = results.x\n", + " y = results.y\n", + " make_series(x, y).plot(label='trajectory')\n", + "\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + "\n", + "plot_trajectory(results)" + ] + }, + { + "cell_type": "markdown", + "id": "certified-synthetic", + "metadata": {}, + "source": [ + "This way of visualizing the results is called a **trajectory plot** (see ).\n", + "\n", + "A trajectory plot can be easier to interpret than a time series plot,\n", + "because it shows what the motion of the projectile would look like (at\n", + "least from one point of view). Both plots can be useful, but don't get\n", + "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused." + ] + }, + { + "cell_type": "markdown", + "id": "cosmetic-aircraft", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", + "\n", + "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function." + ] + }, + { + "cell_type": "markdown", + "id": "neither-craps", + "metadata": {}, + "source": [ + "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", + "\n", + "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "starting-fabric", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "xlim = results.x.min(), results.x.max()\n", + "ylim = results.y.min(), results.y.max()\n", + "\n", + "def draw_func(t, state):\n", + " plot(state.x, state.y, 'bo')\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)',\n", + " xlim=xlim,\n", + " ylim=ylim)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "prescription-boutique", + "metadata": {}, + "outputs": [], + "source": [ + "# animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "id": "lyric-harassment", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "pressing-retrieval", + "metadata": {}, + "source": [ + "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "optical-weather", + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system2 = make_system(params.set(C_d=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "acknowledged-belgium", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "spatial-ensemble", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "domestic-apparatus", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "correct-pittsburgh", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "generic-shelter", + "metadata": {}, + "source": [ + "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "global-referral", + "metadata": {}, + "outputs": [], + "source": [ + "# Hint\n", + "\n", + "system3 = make_system(params.set(rho=1.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "appointed-sugar", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "specialized-mediterranean", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "shaped-paragraph", + "metadata": {}, + "source": [ + "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", + "\n", + "\n", + "\n", + "\n", + "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "therapeutic-onion", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "filename = 'baseball_drag.csv'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "returning-fellowship", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import read_csv\n", + "\n", + "\n", + "baseball_drag = read_csv(filename)\n", + "mph = Quantity(baseball_drag['Velocity in mph'], units.mph)\n", + "mps = mph.to(units.meter / units.second)\n", + "baseball_drag.index = mps.magnitude\n", + "baseball_drag.index.name = 'Velocity in meters per second'\n", + "baseball_drag.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "heated-belfast", + "metadata": {}, + "outputs": [], + "source": [ + "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n", + "vs = linspace(0, 60)\n", + "cds = drag_interp(vs)\n", + "make_series(vs, cds).plot()\n", + "decorate(xlabel='Velocity (m/s)', ylabel='C_d')" + ] + }, + { + "cell_type": "markdown", + "id": "reverse-shock", + "metadata": {}, + "source": [ + "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "engaged-provision", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "directed-fiber", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "framed-dealer", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "accomplished-elizabeth", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "going-techno", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "brief-saying", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "spare-pregnancy", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "catholic-staff", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "broad-sequence", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "contained-diversity", + "metadata": {}, + "source": [ + "### Under the hood\n", + "\n", + "`Vector` " + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb new file mode 100644 index 00000000..b5333cf2 --- /dev/null +++ b/chapters/chap23.ipynb @@ -0,0 +1,557 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "foreign-pepper", + "metadata": {}, + "source": [ + "# Chapter 23" + ] + }, + { + "cell_type": "markdown", + "id": "competitive-backing", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "quantitative-montana", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from previous notebook\n", + "\n", + "from chap22 import params\n", + "from chap22 import make_system\n", + "from chap22 import slope_func\n", + "from chap22 import event_func" + ] + }, + { + "cell_type": "markdown", + "id": "angry-pledge", + "metadata": {}, + "source": [ + "In the previous chapter we developed a model of the flight of a\n", + "baseball, including gravity and a simple version of drag, but neglecting spin, Magnus force, and the dependence of the coefficient of drag on velocity.\n", + "\n", + "In this chapter we apply that model to an optimization problem." + ] + }, + { + "cell_type": "markdown", + "id": "decent-birth", + "metadata": {}, + "source": [ + "## The Manny Ramirez problem\n", + "\n", + "Manny Ramirez is a former member of the Boston Red Sox (an American\n", + "baseball team) who was notorious for his relaxed attitude and taste for practical jokes. Our objective in this chapter is to solve the following Manny-inspired problem:\n", + "\n", + "> What is the minimum effort required to hit a home run in Fenway Park?\n", + "\n", + "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its\n", + "most famous features is the \"Green Monster\", which is a wall in left\n", + "field that is unusually close to home plate, only 310 feet away. To\n", + "compensate for the short distance, the wall is unusually high, at 37\n", + "feet (see )." + ] + }, + { + "cell_type": "markdown", + "id": "exposed-diving", + "metadata": {}, + "source": [ + "We want to find the minimum velocity at which a ball can leave home\n", + "plate and still go over the Green Monster. We'll proceed in the\n", + "following steps:\n", + "\n", + "1. For a given velocity, we'll find the optimal **launch angle**, that is, the angle the ball should leave home plate to maximize its height when it reaches the wall.\n", + "\n", + "2. Then we'll find the minimal velocity that clears the wall, given\n", + " that it has the optimal launch angle." + ] + }, + { + "cell_type": "markdown", + "id": "received-diamond", + "metadata": {}, + "source": [ + "## Finding the range\n", + "\n", + "Suppose we want to find the launch angle that maximizes **range**, that is, the distance the ball travels in the air before landing. We'll use a function in the ModSim library, `maximize_scalar`, which takes a function and finds its maximum.\n", + "\n", + "The function we pass to `maximize_scalar` should take launch angle in degrees, simulate the flight of a ball launched at that angle, and return the distance the ball travels along the $x$ axis." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "forty-knitting", + "metadata": {}, + "outputs": [], + "source": [ + "def range_func(angle, params):\n", + " params = params.set(angle=angle)\n", + " system = make_system(params)\n", + " results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + " x_dist = results.iloc[-1].x\n", + " print(angle, x_dist)\n", + " return x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "exact-cigarette", + "metadata": {}, + "source": [ + "`range_func` makes a new `System` object with the given value of\n", + "`angle`. Then it calls `run_solve_ivp` and\n", + "returns the final value of `x` from the results.\n", + "\n", + "We can call `range_func` directly like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "senior-counter", + "metadata": {}, + "outputs": [], + "source": [ + "range_func(45, params)" + ] + }, + { + "cell_type": "markdown", + "id": "paperback-passing", + "metadata": {}, + "source": [ + "And we can sweep a sequence of angles like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "biological-evans", + "metadata": {}, + "outputs": [], + "source": [ + "angles = linspace(20, 80, 21)\n", + "sweep = SweepSeries()\n", + "\n", + "for angle in angles:\n", + " x_dist = range_func(angle, params)\n", + " sweep[angle] = x_dist" + ] + }, + { + "cell_type": "markdown", + "id": "premium-contribution", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "experienced-providence", + "metadata": {}, + "outputs": [], + "source": [ + "sweep.plot()\n", + "\n", + "decorate(xlabel='Launch angle (degree)',\n", + " ylabel='Range (meter)')" + ] + }, + { + "cell_type": "markdown", + "id": "conscious-blade", + "metadata": {}, + "source": [ + "It looks like the optimal angle is near 40°.\n", + "\n", + "We can find the optimal angle more precisely and more efficiently using `maximize_scalar`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "invisible-jaguar", + "metadata": {}, + "outputs": [], + "source": [ + "res = maximize_scalar(range_func, params, bounds=[0, 90])" + ] + }, + { + "cell_type": "markdown", + "id": "czech-command", + "metadata": {}, + "source": [ + "The first parameter is the function we want to maximize. The second is\n", + "the range of values we want to search; in this case, it's the range of\n", + "angles from 0° to 90°. " + ] + }, + { + "cell_type": "markdown", + "id": "violent-explanation", + "metadata": {}, + "source": [ + "The return value from `maximize_scalar` is an object that contains the\n", + "results, including `x`, which is the angle that yielded the highest\n", + "range, and `fun`, which is the value of `range_func` when it's evaluated at `x`, that is, range when the baseball is launched at the optimal angle." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "vocal-nerve", + "metadata": {}, + "outputs": [], + "source": [ + "res" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "figured-uniform", + "metadata": {}, + "outputs": [], + "source": [ + "res.x, res.fun" + ] + }, + { + "cell_type": "markdown", + "id": "shaped-southeast", + "metadata": {}, + "source": [ + "For these parameters, the optimal angle is about 41°, which yields a\n", + "range of 100 m.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "temporal-extension", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "\n", + "\n", + "If you enjoy this exercise, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "processed-constitution", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "handmade-rhythm", + "metadata": {}, + "source": [ + "**Exercise:** Let's finish off the Manny Ramirez problem:\n", + "\n", + "> What is the minimum effort required to hit a home run in Fenway Park?\n", + "\n", + "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", + "\n", + "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", + "\n", + "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", + "\n", + "As a first step, write an `event_func` that stops the simulation when the ball reaches the wall at 310 feet (94.5 m).\n", + "Test your function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "studied-association", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "developmental-alabama", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "novel-appointment", + "metadata": {}, + "source": [ + "Next, write a function called `height_func` that takes a launch angle, simulates the flight of a baseball, and returns the height of the baseball when it reaches the wall.\n", + "Test your function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ignored-decrease", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "western-communist", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "located-lawsuit", + "metadata": {}, + "source": [ + "Now use `maximize_scalar` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "duplicate-madison", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "legislative-prospect", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "interpreted-telephone", + "metadata": {}, + "source": [ + "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 37 feet (11.3 m), given that it's launched at the optimal angle. And that's a job for `root_scalar`.\n", + "\n", + "Write an error function that takes a velocity and a `System` object as parameters. It should use `maximize_scalar` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11.3 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "egyptian-shadow", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "documentary-guidance", + "metadata": {}, + "source": [ + "Test your error function before you call `root_scalar`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "sustainable-supply", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "reserved-shelter", + "metadata": {}, + "source": [ + "Then use `root_scalar` to find the answer to the problem, the minimum velocity that gets the ball out of the park." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "certified-webster", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "silver-bernard", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "absent-encoding", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "approved-fiction", + "metadata": {}, + "source": [ + "And just to check, run `error_func` with the value you found." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "thick-jungle", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "simple-steps", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "`maximize_scalar` uses a SciPy function called `minimize_scalar`, which provides several optimization methods. By default, it uses `bounded`, a version of Brent's algorithm that is safe in the sense that it always uses values within the bounds you provide (including both ends).\n", + "You can read more about it at )." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dense-study", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb new file mode 100644 index 00000000..b6fa9422 --- /dev/null +++ b/chapters/chap24.ipynb @@ -0,0 +1,901 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "august-parks", + "metadata": {}, + "source": [ + "# Chapter 24" + ] + }, + { + "cell_type": "markdown", + "id": "suspended-puppy", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "confirmed-california", + "metadata": {}, + "source": [ + "In this chapter and the next we'll model systems that involve rotating objects.\n", + "\n", + "In general, rotation is complicated.\n", + "In three dimensions, objects can rotate around three axes and many objects are easier to spin around some axes than others.\n", + "\n", + "If the configuration of an object changes over time, it might become\n", + "easier or harder to spin, which explains the surprising dynamics of\n", + "gymnasts, divers, ice skaters, etc.\n", + "\n", + "And when you apply a twisting force to a rotating object, the effect is often contrary to intuition. \n", + "For an example, see this video on gyroscopic precession ." + ] + }, + { + "cell_type": "markdown", + "id": "composed-carol", + "metadata": {}, + "source": [ + "In this book, we will not take on the physics of rotation in all its glory. \n", + "Rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. \n", + "In that case, we can treat some vector quantities as if they were scalars, in the same way that we sometimes treat velocity as a scalar with an implicit direction.\n", + "\n", + "The fundamental ideas in these examples are angular velocity, angular acceleration, torque, and moment of inertia.\n", + "If you are not already familiar with these concepts, I will define them as we go along, and I will point to additional reading." + ] + }, + { + "cell_type": "markdown", + "id": "integral-welsh", + "metadata": {}, + "source": [ + "## The physics of toilet paper\n", + "\n", + "As an example of a system with rotation, we'll simulate the manufacture of a roll of toilet paper, as shown in this video . \n", + "Starting with a cardboard tube at the center, we will roll up 47 m of paper, a typical length for a roll of toilet paper in the U.S. (see ).\n", + "\n", + "The following figure shows a diagram of the system: $r$ represents\n", + "the radius of the roll at a point in time. Initially, $r$ is the radius of the cardboard core, $R_{min}$. When the roll is complete, $r$ is $R_{max}$.\n", + "\n", + "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/main/figs/paper_roll.png)\n", + "\n", + "I'll use $\\theta$ to represent the total rotation of the roll in\n", + "radians. In the diagram, $d\\theta$ represents a small increase in\n", + "$\\theta$, which corresponds to a distance along the circumference of $r~d\\theta$." + ] + }, + { + "cell_type": "markdown", + "id": "political-prerequisite", + "metadata": {}, + "source": [ + "I'll use $y$ to represent the total length of paper that's been rolled. \n", + "Initially, $\\theta=0$ and $y=0$. \n", + "For each small increase in $\\theta$, there is a corresponding increase in $y$: \n", + "\n", + "$$dy = r~d\\theta$$\n", + "\n", + "If we divide both sides by a small increase in time, $dt$, we get a\n", + "differential equation for $y$ as a function of time.\n", + "\n", + "$$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$$ \n", + "\n", + "As we roll up the paper, $r$ increases. Assuming it increases by a fixed amount per revolution, we can write \n", + "\n", + "$$dr = k~d\\theta$$ \n", + "\n", + "Where $k$ is an unknown constant we'll have to figure out. \n", + "Again, we can divide both sides by $dt$ to get a differential equation in time:\n", + "\n", + "$$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$$ \n", + "\n", + "Finally, let's assume that $\\theta$ increases at a constant rate of $\\omega = 300$ rad/s (about 2900 revolutions per minute): \n", + "\n", + "$$\\frac{d\\theta}{dt} = \\omega$$ \n", + "\n", + "This rate of change is called an **angular velocity**. Now we have a system of differential equations we can use to simulate the system." + ] + }, + { + "cell_type": "markdown", + "id": "prostate-smell", + "metadata": {}, + "source": [ + "## Parameters\n", + "\n", + "Here are the parameters of the system:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "honey-translator", + "metadata": {}, + "outputs": [], + "source": [ + "Rmin = 0.02 # m\n", + "Rmax = 0.055 # m\n", + "L = 47 # m\n", + "omega = 300 # rad / s" + ] + }, + { + "cell_type": "markdown", + "id": "provincial-logistics", + "metadata": {}, + "source": [ + "`Rmin` and `Rmax` are the initial and final values for the radius, `r`.\n", + "`L` is the total length of the paper.\n", + "`omega` is the angular velocity in radians per second.\n", + "\n", + "Figuring out `k` is not easy, but we can estimate it by pretending that `r` is constant and equal to the average of `Rmin` and `Rmax`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "floppy-plane", + "metadata": {}, + "outputs": [], + "source": [ + "Ravg = (Rmax + Rmin) / 2" + ] + }, + { + "cell_type": "markdown", + "id": "ordinary-leader", + "metadata": {}, + "source": [ + "In that case, the circumference of the roll is also be constant:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "funky-bandwidth", + "metadata": {}, + "outputs": [], + "source": [ + "Cavg = 2 * np.pi * Ravg" + ] + }, + { + "cell_type": "markdown", + "id": "square-radius", + "metadata": {}, + "source": [ + "And we can compute the number of revolutions to roll up length `L`, like this." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "front-conservation", + "metadata": {}, + "outputs": [], + "source": [ + "revs = L / Cavg" + ] + }, + { + "cell_type": "markdown", + "id": "headed-gibson", + "metadata": {}, + "source": [ + "Converting rotations to radians, we can estimate the final value of `theta`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "defined-plymouth", + "metadata": {}, + "outputs": [], + "source": [ + "theta = 2 * np.pi * revs\n", + "theta" + ] + }, + { + "cell_type": "markdown", + "id": "naughty-narrative", + "metadata": {}, + "source": [ + "Finally, `k` is the total change in `r` divided by the total change in `theta`." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "subject-brief", + "metadata": {}, + "outputs": [], + "source": [ + "k_est = (Rmax - Rmin) / theta\n", + "k_est" + ] + }, + { + "cell_type": "markdown", + "id": "experienced-sharing", + "metadata": {}, + "source": [ + "At the end of the chapter, we'll derive `k` analytically, but this estimate is enough to get started." + ] + }, + { + "cell_type": "markdown", + "id": "phantom-yacht", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "The state variables we'll use are, `theta`, `y`, and `r`.\n", + "Here are the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ranging-graham", + "metadata": {}, + "outputs": [], + "source": [ + "init = State(theta=0, y=0, r=Rmin)" + ] + }, + { + "cell_type": "markdown", + "id": "caring-unemployment", + "metadata": {}, + "source": [ + "And here's a `System` object with `init` and `t_end`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "fresh-domestic", + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, t_end=10)" + ] + }, + { + "cell_type": "markdown", + "id": "beginning-artwork", + "metadata": {}, + "source": [ + "Now we can use the differential equations from the previous section to\n", + "write a slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "signed-eight", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " theta, y, r = state\n", + " \n", + " dydt = r * omega\n", + " drdt = k_est * omega\n", + " \n", + " return omega, dydt, drdt" + ] + }, + { + "cell_type": "markdown", + "id": "maritime-funds", + "metadata": {}, + "source": [ + "As usual, the slope function takes a time stamp, a `State` object, and a `System` object. \n", + "\n", + "The job of the slope function is to compute the time derivatives of the state variables.\n", + "\n", + "The derivative of `theta` is angular velocity, `omega`.\n", + "The derivatives of `y` and `r` are given by the differential equations we derived." + ] + }, + { + "cell_type": "markdown", + "id": "trained-witness", + "metadata": {}, + "source": [ + "And as usual, we'll test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "exterior-water", + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "russian-rochester", + "metadata": {}, + "source": [ + "We'd like to stop the simulation when the length of paper on the roll is `L`. We can do that with an event function that passes through 0 when `y` equals `L`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "strong-custody", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " theta, y, r = state\n", + " return L - y" + ] + }, + { + "cell_type": "markdown", + "id": "catholic-workshop", + "metadata": {}, + "source": [ + "We can test it with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "moved-present", + "metadata": {}, + "outputs": [], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "affecting-pathology", + "metadata": {}, + "source": [ + "Now let's run the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "stable-lying", + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "experienced-pathology", + "metadata": {}, + "source": [ + "Here are the last few time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "careful-bahrain", + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "underlying-variance", + "metadata": {}, + "source": [ + "The time it takes to complete one roll is about 4.2 seconds, which is consistent with what we see in the video." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "individual-patrick", + "metadata": {}, + "outputs": [], + "source": [ + "results.index[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "informative-porter", + "metadata": {}, + "source": [ + "The final value of `y` is 47 meters, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "indian-skirt", + "metadata": {}, + "outputs": [], + "source": [ + "final_state = results.iloc[-1] \n", + "final_state.y" + ] + }, + { + "cell_type": "markdown", + "id": "running-tutorial", + "metadata": {}, + "source": [ + "The final value of radius is 0.55 m, which is `Rmax`." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "higher-conflict", + "metadata": {}, + "outputs": [], + "source": [ + "final_state.r" + ] + }, + { + "cell_type": "markdown", + "id": "tamil-referral", + "metadata": {}, + "source": [ + "The total number of rotations is close to 200, which seems plausible." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "employed-ordinary", + "metadata": {}, + "outputs": [], + "source": [ + "radians = final_state.theta\n", + "rotations = radians / 2 / np.pi\n", + "rotations" + ] + }, + { + "cell_type": "markdown", + "id": "otherwise-mississippi", + "metadata": {}, + "source": [ + "As an exercise, we'll see how fast the paper is moving. But first, let's take a closer look at the results." + ] + }, + { + "cell_type": "markdown", + "id": "lesser-consumer", + "metadata": {}, + "source": [ + "## Plotting\n", + "\n", + "Here's what `theta` looks like over time." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "included-schema", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_theta(results):\n", + " results.theta.plot(color='C0', label='theta')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')\n", + " \n", + "plot_theta(results)" + ] + }, + { + "cell_type": "markdown", + "id": "regulation-runner", + "metadata": {}, + "source": [ + "`theta` grows linearly, as we should expect with constant angular velocity.\n", + "\n", + "Here's what `r` looks like over time." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "persistent-siemens", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_r(results):\n", + " results.r.plot(color='C2', label='r')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Radius (m)')\n", + " \n", + "plot_r(results)" + ] + }, + { + "cell_type": "markdown", + "id": "dedicated-tuning", + "metadata": {}, + "source": [ + "`r` also increases linearly.\n", + "\n", + "But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "contrary-typing", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_y(results):\n", + " results.y.plot(color='C1', label='y')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')\n", + " \n", + "plot_y(results)" + ] + }, + { + "cell_type": "markdown", + "id": "furnished-executive", + "metadata": {}, + "source": [ + "In the next section, we'll see that we could have solved the\n", + "differential equations analytically.\n", + "However, it is often useful to start with simulation as a way of exploring and checking assumptions." + ] + }, + { + "cell_type": "markdown", + "id": "better-asbestos", + "metadata": {}, + "source": [ + "## Analysis\n", + "\n", + "Since angular velocity is constant: \n", + "\n", + "$$\\frac{d\\theta}{dt} = \\omega \\quad\\quad (1)$$ \n", + "\n", + "We can find $\\theta$ as a function of time by integrating both sides:\n", + "\n", + "$$\\theta(t) = \\omega t$$ \n", + "\n", + "Similarly, we can solve this equation\n", + "\n", + "$$\\frac{dr}{dt} = k \\omega$$\n", + "\n", + "to find\n", + "\n", + "$$r(t) = k \\omega t + R_{min}$$ \n", + "\n", + "Then we can plug the solution for $r$ into the equation for $y$: \n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dy}{dt} & = r \\omega \\quad\\quad (2) \\\\\n", + " & = \\left[ k \\omega t + R_{min} \\right] \\omega \\nonumber\\end{aligned}$$\n", + " \n", + "Integrating both sides yields:\n", + "\n", + "$$y(t) = \\left[ k \\omega t^2 / 2 + R_{min} t \\right] \\omega$$ \n", + "\n", + "So $y$ is a parabola, as you might have guessed." + ] + }, + { + "cell_type": "markdown", + "id": "meaningful-kazakhstan", + "metadata": {}, + "source": [ + "We can also use these equations to find the relationship between $y$ and $r$, independent of time, which we can use to compute $k$.\n", + "Dividing Equations 1 and 2, yields\n", + "\n", + "$$\\frac{dr}{dy} = \\frac{k}{r}$$ \n", + "\n", + "Separating variables yields\n", + "\n", + "$$r~dr = k~dy$$ \n", + "\n", + "Integrating both sides yields \n", + "\n", + "$$r^2 / 2 = k y + C$$ \n", + "\n", + "Solving for $y$, we have \n", + "\n", + "$$y = \\frac{1}{2k} (r^2 - C) \\label{eqn3}$$\n", + "\n", + "When $y=0$, $r=R_{min}$, so \n", + "\n", + "$$R_{min}^2 / 2 = C$$ \n", + "\n", + "When $y=L$, $r=R_{max}$, so\n", + "\n", + "$$L = \\frac{1}{2k} (R_{max}^2 - R_{min}^2)$$ \n", + "\n", + "Solving for $k$ yields\n", + "\n", + "$$k = \\frac{1}{2L} (R_{max}^2 - R_{min}^2) \\label{eqn4}$$\n", + "\n", + "Plugging in the values of the parameters yields `2.8e-5` m/rad, the same as the \"estimate\" we computed in Section xxx. " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "acknowledged-register", + "metadata": {}, + "outputs": [], + "source": [ + "k = (Rmax**2 - Rmin**2) / (2 * L)\n", + "k" + ] + }, + { + "cell_type": "markdown", + "id": "retired-skill", + "metadata": {}, + "source": [ + "In this case the estimate turns out to be exact." + ] + }, + { + "cell_type": "markdown", + "id": "foreign-needle", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces rotation, starting with an example where angular velocity is constant.\n", + "\n", + "We simulated the manufacture of a roll of toilet paper, then we solved the same problem analytically.\n", + "\n", + "In the next chapter, we'll see a more interesting example where angular velocity is not constant. And we'll introduce three new concepts: torque, angular acceleration, and moment of inertia.\n", + "\n", + "But first, you might want to work on the following exercises." + ] + }, + { + "cell_type": "markdown", + "id": "thick-luther", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. We can use `gradient` to estimate the derivative of `results.y`." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cardiac-hospital", + "metadata": {}, + "outputs": [], + "source": [ + "dydt = gradient(results.y)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "welsh-charleston", + "metadata": {}, + "outputs": [], + "source": [ + "dydt.plot(label='dydt')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Linear velocity (m/s)')" + ] + }, + { + "cell_type": "markdown", + "id": "becoming-birthday", + "metadata": {}, + "source": [ + "With constant angular velocity, linear velocity is increasing, reaching its maximum at the end." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "informational-washer", + "metadata": {}, + "outputs": [], + "source": [ + "max_linear_velocity = dydt.iloc[-1]\n", + "max_linear_velocity" + ] + }, + { + "cell_type": "markdown", + "id": "bizarre-variation", + "metadata": {}, + "source": [ + "Now suppose this peak velocity is the limiting factor; that is, we can't move the paper any faster than that.\n", + "\n", + "In that case, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", + "\n", + "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", + "\n", + "Run the simulation and see how much faster we could finish rolling the paper." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "excellent-japanese", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "steady-member", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "applied-sacramento", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "adult-chuck", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "conditional-cliff", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "arranged-queensland", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "similar-variance", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "lovely-orange", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb new file mode 100644 index 00000000..eaaa432f --- /dev/null +++ b/chapters/chap25.ipynb @@ -0,0 +1,1076 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "unauthorized-winter", + "metadata": {}, + "source": [ + "# Chapter 25" + ] + }, + { + "cell_type": "markdown", + "id": "complete-innocent", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "chief-delight", + "metadata": {}, + "source": [ + "In the previous chapter we modeled a system with constant angular\n", + "velocity.\n", + "In this chapter we take the next step, modeling a system with constant angular acceleration and deceleration." + ] + }, + { + "cell_type": "markdown", + "id": "earned-motorcycle", + "metadata": {}, + "source": [ + "## Angular acceleration\n", + "\n", + "Just as linear acceleration is the derivative of velocity, **angular\n", + "acceleration** is the derivative of angular velocity. And just as linear acceleration is caused by force, angular acceleration is caused by the rotational version of force, **torque**. If you are not familiar with torque, you can read about it at .\n", + "\n", + "In general, torque is a vector quantity, defined as the **cross\n", + "product** of $\\vec{r}$ and $\\vec{F}$, where $\\vec{r}$ is the **lever\n", + "arm**, a vector from the center of rotation to the point where the force is applied, and $\\vec{F}$ is the vector that represents the magnitude and direction of the force." + ] + }, + { + "cell_type": "markdown", + "id": "promotional-trigger", + "metadata": {}, + "source": [ + "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute \n", + "\n", + "$$\\tau = r F \\sin \\theta$$ \n", + "\n", + "where $\\tau$ is torque, $r$ is the length of the lever arm, $F$ is the magnitude of force, and $\\theta$ is the angle between $\\vec{r}$ and $\\vec{F}$.\n", + "\n", + "Since torque is the product of a length and a force, it is expressed in newton meters (Nm)." + ] + }, + { + "cell_type": "markdown", + "id": "infrared-summit", + "metadata": {}, + "source": [ + "## Moment of inertia\n", + "\n", + "In the same way that linear acceleration is related to force by Newton's second law of motion, $F=ma$, angular acceleration is related to torque by another form of Newton's law: \n", + "\n", + "$$\\tau = I \\alpha$$ \n", + "\n", + "where $\\alpha$ is angular acceleration and $I$ is **moment of inertia**. Just as mass is what makes it hard to accelerate an object, moment of inertia is what makes it hard to spin an object.\n", + "\n", + "In the most general case, a 3-D object rotating around an arbitrary\n", + "axis, moment of inertia is a tensor, which is a function that takes a\n", + "vector as a parameter and returns a vector as a result.\n", + "\n", + "Fortunately, in a system where all rotation and torque happens around a single axis, we don't have to deal with the most general case. We can treat moment of inertia as a scalar quantity.\n", + "\n", + "For a small object with mass $m$, rotating around a point at distance\n", + "$r$, the moment of inertia is $I = m r^2$. For more complex objects, we can compute $I$ by dividing the object into small masses, computing\n", + "moments of inertia for each mass, and adding them up.\n", + "\n", + "However, for most simple shapes, people have already done the\n", + "calculations; you can just look up the answers. For example, see\n", + "." + ] + }, + { + "cell_type": "markdown", + "id": "julian-klein", + "metadata": {}, + "source": [ + "## Teapots and turntables\n", + "\n", + "Tables in Chinese restaurants often have a rotating tray or turntable\n", + "that makes it easy for customers to share dishes. These turntables are\n", + "supported by low-friction bearings that allow them to turn easily and\n", + "glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", + "\n", + "Suppose I am sitting at a table with a pot of tea on the turntable\n", + "directly in front of me, and the person sitting directly opposite asks\n", + "me to pass the tea. I push on the edge of the turntable with 2 N of\n", + "force until it has turned 0.5 rad, then let go. The turntable glides\n", + "until it comes to a stop 1.5 rad from the starting position. How much\n", + "force should I apply for a second push so the teapot glides to a stop\n", + "directly opposite me?\n", + "\n", + "We'll answer this question in these steps:\n", + "\n", + "1. I'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", + "\n", + "2. As an exercise, you'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", + "\n", + "Our simulation will use the following parameters:\n", + "\n", + "1. The radius of the turntable is 0.5 m, and its weight is 7 kg.\n", + "\n", + "2. The teapot weights 0.3 kg, and it sits 0.4 m from the center of the turntable.\n", + "\n", + "The following figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the lever arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", + "\n", + "![Diagram of a turntable with a\n", + "teapot.](https://github.com/AllenDowney/ModSim/raw/main/figs/teapot.png)\n", + "\n", + "Here are the parameters from the statement of the problem:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "spiritual-disorder", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "\n", + "radius_disk = 0.5 # m\n", + "mass_disk = 7 # kg\n", + "radius_pot = 0.4 # m\n", + "mass_pot = 0.3 # kg\n", + "force = 2 # N\n", + "\n", + "theta_push = 0.5 # radian\n", + "theta_test = 1.5 # radian\n", + "theta_target = pi # radian" + ] + }, + { + "cell_type": "markdown", + "id": "bound-algorithm", + "metadata": {}, + "source": [ + "`theta_push` is the angle where I stop pushing on the turntable.\n", + "`theta_test` is how far the table turns during my test push.\n", + "`theta_target` is where we want the table to be after the second push.\n", + "\n", + "We can use these parameters to compute the moment of inertia of the turntable, using the formula for a horizontal disk revolving around a vertical axis through its center: " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "recorded-administration", + "metadata": {}, + "outputs": [], + "source": [ + "I_disk = mass_disk * radius_disk**2 / 2" + ] + }, + { + "cell_type": "markdown", + "id": "economic-concord", + "metadata": {}, + "source": [ + "We can also compute the moment of inertia of the teapot, treating it as a point mass:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "present-termination", + "metadata": {}, + "outputs": [], + "source": [ + "I_pot = mass_pot * radius_pot**2" + ] + }, + { + "cell_type": "markdown", + "id": "dominican-joseph", + "metadata": {}, + "source": [ + "The total moment of inertia is the sum of these parts:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "former-driver", + "metadata": {}, + "outputs": [], + "source": [ + "I_total = I_disk + I_pot" + ] + }, + { + "cell_type": "markdown", + "id": "effective-danger", + "metadata": {}, + "source": [ + "Friction in the bearings probably depends on the weight of the turntable and its contents, but probably does not depend on angular velocity.\n", + "So we'll assume that it is a constant.\n", + "We don't know what it is, so I will start with a guess, and we will use `root_scalar` to improve it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "enclosed-happiness", + "metadata": {}, + "outputs": [], + "source": [ + "torque_friction = 0.3 # N*m" + ] + }, + { + "cell_type": "markdown", + "id": "balanced-method", + "metadata": {}, + "source": [ + "For this problem we'll treat friction as a torque.\n", + "\n", + "The state variables we'll use are `theta`, which is the angle of the table in rad, and `omega`, which is angular velocity in rad/s." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "passing-sullivan", + "metadata": {}, + "outputs": [], + "source": [ + "init = State(theta=0, omega=0)" + ] + }, + { + "cell_type": "markdown", + "id": "second-leather", + "metadata": {}, + "source": [ + "Now we can make a `System` with the initial state, `init`, the maximum duration of the simulation, `t_end`, and the parameters we are going to vary, `force` and `torque_friction`." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "acoustic-furniture", + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, \n", + " force=force,\n", + " torque_friction=torque_friction,\n", + " t_end=20)" + ] + }, + { + "cell_type": "markdown", + "id": "crucial-recognition", + "metadata": {}, + "source": [ + "Here's a slope function that takes the current state, which contains angle and angular velocity, and returns the derivatives, angular velocity and angular acceleration:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ranking-local", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " theta, omega = state\n", + " force = system.force\n", + " torque_friction = system.torque_friction\n", + " \n", + " torque = radius_disk * force - torque_friction\n", + " alpha = torque / I_total\n", + " \n", + " return omega, alpha " + ] + }, + { + "cell_type": "markdown", + "id": "exposed-court", + "metadata": {}, + "source": [ + "In this scenario, the force I apply to the turntable is always\n", + "perpendicular to the lever arm, so $\\sin \\theta = 1$ and the torque due\n", + "to force is $\\tau = r F$.\n", + "\n", + "`torque_friction` represents the torque due to friction. Because the\n", + "turntable is rotating in the direction of positive `theta`, friction\n", + "acts in the direction of negative `theta`.\n", + "\n", + "We can test the slope function with the initial conditions:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "saved-purple", + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "forbidden-legislature", + "metadata": {}, + "source": [ + "We are almost ready to run the simulation, but first there's a problem we have to address." + ] + }, + { + "cell_type": "markdown", + "id": "decent-microwave", + "metadata": {}, + "source": [ + "## Two Phase Simulation\n", + "\n", + "When I stop pushing on the turntable, the angular acceleration changes\n", + "abruptly. We could implement the slope function with an `if` statement\n", + "that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But a more robust approach is to simulate the system in two phases:\n", + "\n", + "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", + "\n", + "2. During the second phase, force is 0, and we run until `omega` is 0.\n", + "\n", + "Then we can combine the results of the two phases into a single\n", + "`TimeFrame`.\n", + "\n", + "Here's the event function I'll use for Phase 1; it stops the simulation when `theta` reaches `theta_push`, which is when I stop pushing:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "black-wichita", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func1(t, state, system):\n", + " theta, omega = state\n", + " return theta - theta_push" + ] + }, + { + "cell_type": "markdown", + "id": "separate-college", + "metadata": {}, + "source": [ + "We can test it with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ranking-google", + "metadata": {}, + "outputs": [], + "source": [ + "event_func1(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "id": "reduced-sharp", + "metadata": {}, + "source": [ + "And run the first phase of the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "meaning-philosophy", + "metadata": {}, + "outputs": [], + "source": [ + "results1, details1 = run_solve_ivp(system, slope_func,\n", + " events=event_func1)\n", + "details1.message" + ] + }, + { + "cell_type": "markdown", + "id": "spread-application", + "metadata": {}, + "source": [ + "Here are the last few time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "focused-invention", + "metadata": {}, + "outputs": [], + "source": [ + "results1.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "willing-receipt", + "metadata": {}, + "source": [ + "It takes a little more than a second for me to rotate the table 0.5 rad.\n", + "When I release the table, the angular velocity is about 0.87 rad / s.\n", + "\n", + "Before we run the second phase, we have to extract the final time and\n", + "state of the first phase." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "russian-experience", + "metadata": {}, + "outputs": [], + "source": [ + "t_2 = results1.index[-1]\n", + "init2 = results1.iloc[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "aware-generator", + "metadata": {}, + "source": [ + "Now we can make a `System` object for Phase 2 with the initial state\n", + "from Phase 1 and with `force=0`." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "chinese-cover", + "metadata": {}, + "outputs": [], + "source": [ + "system2 = system.set(t_0=t_2, init=init2, force=0)" + ] + }, + { + "cell_type": "markdown", + "id": "actual-monaco", + "metadata": {}, + "source": [ + "For the second phase, we need an event function that stops when the\n", + "turntable stops; that is, when angular velocity is 0." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "recovered-section", + "metadata": {}, + "outputs": [], + "source": [ + "def event_func2(t, state, system):\n", + " theta, omega = state\n", + " return omega" + ] + }, + { + "cell_type": "markdown", + "id": "ordinary-miniature", + "metadata": {}, + "source": [ + "We'll test it with the initial conditions for Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "corporate-taste", + "metadata": {}, + "outputs": [], + "source": [ + "event_func2(system2.t_0, system2.init, system2)" + ] + }, + { + "cell_type": "markdown", + "id": "administrative-major", + "metadata": {}, + "source": [ + "Now we can run the second phase." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "destroyed-adrian", + "metadata": {}, + "outputs": [], + "source": [ + "results2, details2 = run_solve_ivp(system2, slope_func,\n", + " events=event_func2)\n", + "details2.message" + ] + }, + { + "cell_type": "markdown", + "id": "hindu-requirement", + "metadata": {}, + "source": [ + "`DataFrame` provides `append`, which appends `results2` to the end of\n", + "`results1`." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "frank-scene", + "metadata": {}, + "outputs": [], + "source": [ + "results = results1.append(results2)" + ] + }, + { + "cell_type": "markdown", + "id": "wooden-butterfly", + "metadata": {}, + "source": [ + "Here are the last few time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "short-singer", + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "metropolitan-roommate", + "metadata": {}, + "source": [ + "At the end, angular velocity is close to 0, and the total rotation is about 1.7 rad, a little farther than we were aiming for.\n", + "\n", + "We can plot `theta` for both phases." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "distributed-humanitarian", + "metadata": {}, + "outputs": [], + "source": [ + "results.theta.plot(label='theta')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')" + ] + }, + { + "cell_type": "markdown", + "id": "excess-confidence", + "metadata": {}, + "source": [ + "And `omega`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "proved-surfing", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "results.omega.plot(label='omega', color='C1')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')" + ] + }, + { + "cell_type": "markdown", + "id": "handy-frontier", + "metadata": {}, + "source": [ + "Angular velocity, `omega`, increases linearly while I am pushing, and decreases linearly after I let go. The angle, `theta`, is the integral of angular velocity, so it forms a parabola during each phase.\n", + "\n", + "In the next section, we'll use this simulation to estimate the torque\n", + "due to friction." + ] + }, + { + "cell_type": "markdown", + "id": "careful-minneapolis", + "metadata": {}, + "source": [ + "## Estimating Friction\n", + "\n", + "Let's take the code from the previous section and wrap it in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "constant-wallace", + "metadata": {}, + "outputs": [], + "source": [ + "def run_two_phases(force, torque_friction, system):\n", + " \n", + " # put the specified parameters into the System object\n", + " system1 = system.set(force=force, \n", + " torque_friction=torque_friction)\n", + "\n", + " # run phase 1\n", + " results1, details1 = run_solve_ivp(system1, slope_func, \n", + " events=event_func1)\n", + "\n", + " # get the final state from phase 1\n", + " t_2 = results1.index[-1]\n", + " init2 = results1.iloc[-1]\n", + " \n", + " # run phase 2\n", + " system2 = system1.set(t_0=t_2, init=init2, force=0)\n", + " results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func2)\n", + " \n", + " # combine and return the results\n", + " results = results1.append(results2)\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "id": "positive-possible", + "metadata": {}, + "source": [ + "I'll test it with the same parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "played-ranking", + "metadata": {}, + "outputs": [], + "source": [ + "force = 2\n", + "torque_friction = 0.3\n", + "results = run_two_phases(force, torque_friction, system)\n", + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "id": "damaged-concert", + "metadata": {}, + "source": [ + "These results are the same as in the previous section.\n", + "\n", + "We can use `run_two_phases` to write an error function we can use, with `root_scalar`, to find the torque due to friction that yields the\n", + "observed results from the first push, a total rotation of 1.5 rad." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "skilled-diving", + "metadata": {}, + "outputs": [], + "source": [ + "def error_func1(torque_friction, system):\n", + " force = system.force\n", + " results = run_two_phases(force, torque_friction, system)\n", + " theta_final = results.iloc[-1].theta\n", + " print(torque_friction, theta_final)\n", + " return theta_final - theta_test" + ] + }, + { + "cell_type": "markdown", + "id": "generous-parcel", + "metadata": {}, + "source": [ + "With `torque_friction=0.3`, the table rotates a bit too far:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "united-ranch", + "metadata": {}, + "outputs": [], + "source": [ + "guess1 = 0.3\n", + "error_func1(guess1, system)" + ] + }, + { + "cell_type": "markdown", + "id": "heard-serial", + "metadata": {}, + "source": [ + "With `torque_friction=0.4`, it doesn't go far enough." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "rotary-brazilian", + "metadata": {}, + "outputs": [], + "source": [ + "guess2 = 0.4\n", + "error_func1(guess2, system)" + ] + }, + { + "cell_type": "markdown", + "id": "comparable-physiology", + "metadata": {}, + "source": [ + "So we can use those two values as a bracket for `root_scalar`." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "hungarian-cattle", + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(error_func1, system, bracket=[guess1, guess2])" + ] + }, + { + "cell_type": "markdown", + "id": "abandoned-remedy", + "metadata": {}, + "source": [ + "The result is 0.333 N m, a little less than the initial guess." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "sorted-struggle", + "metadata": {}, + "outputs": [], + "source": [ + "actual_friction = res.root\n", + "actual_friction" + ] + }, + { + "cell_type": "markdown", + "id": "democratic-praise", + "metadata": {}, + "source": [ + "Now that we know the torque due to friction, we can compute the force\n", + "needed to rotate the turntable through the remaining angle, that is,\n", + "from 1.5 rad to 3.14 rad.\n", + "\n", + "But first, let's animate the results." + ] + }, + { + "cell_type": "markdown", + "id": "knowing-sleeve", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "\n", + "Here's a function that takes the state of the system and draws it." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "funky-affect", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Circle\n", + "from matplotlib.pyplot import gca, axis\n", + "\n", + "def draw_func(t, state):\n", + " theta, omega = state\n", + " \n", + " # draw a circle for the table\n", + " circle1 = Circle([0, 0], radius_disk)\n", + " gca().add_patch(circle1)\n", + " \n", + " # draw a circle for the teapot\n", + " center = pol2cart(theta, radius_pot)\n", + " circle2 = Circle(center, 0.05, color='C1')\n", + " gca().add_patch(circle2)\n", + "\n", + " axis('equal')" + ] + }, + { + "cell_type": "markdown", + "id": "dangerous-envelope", + "metadata": {}, + "source": [ + "This function uses a few features we have not seen before, but you can read about them in the Matplotlib documentation.\n", + "\n", + "Here's what the initial condition looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "illegal-remainder", + "metadata": {}, + "outputs": [], + "source": [ + "state = results.iloc[0]\n", + "draw_func(0, state)" + ] + }, + { + "cell_type": "markdown", + "id": "efficient-summary", + "metadata": {}, + "source": [ + "And here's an animation of the first push." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "toxic-shark", + "metadata": {}, + "outputs": [], + "source": [ + "# animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "id": "horizontal-shade", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "The example in this chapter demonstrates the concepts of torque, angular acceleration, and moment of inertia.\n", + "\n", + "We used these concepts to simulate a turntable, using a hypothetical observation to estimating torque due to friction.\n", + "\n", + "As an exercise, you can finish off the example, estimating the force needed to rotate the table to a given target angle.\n", + "\n", + "The next chapter describes several case studies you can work on to practice the tools from the last few chapters, including projectiles, rotating objects, `root_scalar`, and `maximize_scalar`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "pediatric-precipitation", + "metadata": {}, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "id": "sixth-breach", + "metadata": {}, + "source": [ + "**Exercise:** Continuing the example from this chapter, estimate the force that delivers the teapot to the desired position.\n", + "Use this `System` object, with the friction we computed in the previous section." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "dental-density", + "metadata": {}, + "outputs": [], + "source": [ + "system3 = system.set(torque_friction=actual_friction)" + ] + }, + { + "cell_type": "markdown", + "id": "practical-cabinet", + "metadata": {}, + "source": [ + "Write an error function that takes `force` and `system`, simulates the system, and returns the difference between `theta_final` and the remaining angle after the first push." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "grave-consent", + "metadata": {}, + "outputs": [], + "source": [ + "remaining_angle = theta_target - theta_test\n", + "remaining_angle" + ] + }, + { + "cell_type": "markdown", + "id": "hundred-judgment", + "metadata": {}, + "source": [ + "Use your error function and `root_scalar` to find the force needed for the second push.\n", + "Run the simulation with the force you computed and confirm that the table stops at the target angle after both pushes." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "apparent-lancaster", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "persistent-rings", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "previous-pittsburgh", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "governing-component", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "statistical-behalf", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "unauthorized-equity", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eight-prototype", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb new file mode 100644 index 00000000..6abd4e82 --- /dev/null +++ b/chapters/chap26.ipynb @@ -0,0 +1,389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "early-drove", + "metadata": {}, + "source": [ + "# Chapter 26" + ] + }, + { + "cell_type": "markdown", + "id": "comic-convert", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "broken-procedure", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "massive-thong", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "experienced-junction", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "acoustic-small", + "metadata": {}, + "source": [ + "You made it to the end of the book. Congratulations!\n", + "\n", + "This last chapter is a collection of case studies you might want to read and work on.\n", + "They are based on the methods in the last few chapters, including Newtonian mechanics in 1-D and 2-D, and rotation around a single axis." + ] + }, + { + "cell_type": "markdown", + "id": "capital-vatican", + "metadata": {}, + "source": [ + "## Bungee jumping\n", + "\n", + "Suppose you want to set the world record for the highest \"bungee dunk\", which is a stunt in which a bungee jumper dunks a cookie in a cup of tea at the lowest point of a jump. An example is shown in this video: .\n", + "\n", + "Since the record is 70 m, let's design a jump for 80 m. We'll start with the following modeling assumptions:\n", + "\n", + "- Initially the bungee cord hangs from a crane with the attachment\n", + " point 80 m above a cup of tea.\n", + "\n", + "- Until the cord is fully extended, it applies no force to the jumper. It turns out this might not be a good assumption; we'll revisit it in the next case study.\n", + "\n", + "- After the cord is fully extended, it obeys Hooke's Law; that is, it applies a force to the jumper proportional to the extension of the cord beyond its resting length. See .\n", + "\n", + "- The mass of the jumper is 75 kg.\n", + "\n", + "- The jumper is subject to drag force so that their terminal velocity is 60 m/s.\n", + "\n", + "Our objective is to choose the length of the cord, `L`, and its spring\n", + "constant, `k`, so that the jumper falls all the way to the tea cup, but no farther!\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`bungee1.ipynb`, which contains starter code and exercises for this case study." + ] + }, + { + "cell_type": "markdown", + "id": "recognized-bidding", + "metadata": {}, + "source": [ + "## Bungee dunk revisited\n", + "\n", + "In the previous case study, we assume that the cord applies no force to\n", + "the jumper until it is stretched. It is tempting to say that the cord\n", + "has no effect because it falls along with the jumper, but that intuition\n", + "is incorrect. As the cord falls, it transfers energy to the jumper.\n", + "\n", + "At you'll find a paper (Heck, Uylings, and Kędzierska, \"Understanding the physics of bungee jumping\", Physics Education, Volume 45, Number 1, 2010.) that explains\n", + "this phenomenon and derives the acceleration of the jumper, $a$, as a\n", + "function of position, $y$, and velocity, $v$:\n", + "\n", + "$$a = g + \\frac{\\mu v^2/2}{\\mu(L+y) + 2L}$$ \n", + "\n", + "where $g$ is acceleration due to gravity, $L$ is the length of the cord, and $\\mu$ is the ratio of the mass of the cord, $m$, and the mass of the jumper, $M$.\n", + "\n", + "If you don't believe that their model is correct, this video might\n", + "convince you: .\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`bungee2.ipynb`, which contains starter code and exercises for this case study. How does the behavior of the system change as we vary the mass of the cord? When the mass of the cord equals the mass of the jumper, what is the net effect on the lowest point in the jump?" + ] + }, + { + "cell_type": "markdown", + "id": "german-penetration", + "metadata": {}, + "source": [ + "## Orbiting the Sun\n", + "\n", + "In a previous example, we modeled the interaction between the Earth and the Sun, simulating what would happen if the Earth stopped in its orbit and fell straight into the Sun.\n", + "\n", + "Now let's extend the model to two dimensions and simulate one revolution of the Earth around the Sun, that is, one year.\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`orbit.ipynb`, which contains starter code and exercises for this case study.\n", + "\n", + "Among other things, you will have a chance to experiment with different algorithms and see what effect they have on the accuracy of the results." + ] + }, + { + "cell_type": "markdown", + "id": "victorian-colonial", + "metadata": {}, + "source": [ + "## Spider-Man\n", + "\n", + "In this case study we'll develop a model of Spider-Man swinging from a\n", + "springy cable of webbing attached to the top of the Empire State\n", + "Building. Initially, Spider-Man is at the top of a nearby building, as\n", + "shown in this figure:\n", + "\n", + "![Diagram of the initial state for the Spider-Man case\n", + "study.](https://github.com/AllenDowney/ModSim/raw/main/figs/spiderman.png)\n", + "\n", + "The origin, `O`, is at the base of the Empire State Building. The vector `H` represents the position where the webbing is attached to the building, relative to `O`. The vector `P` is the position of Spider-Man relative to `O`. And `L` is the vector from the attachment point to Spider-Man.\n", + "\n", + "By following the arrows from `O`, along `H`, and along `L`, we can see\n", + "that\n", + "\n", + "```\n", + "H + L = P\n", + "```\n", + "\n", + "So we can compute `L` like this:\n", + "\n", + "```\n", + "L = P - H\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "bizarre-strand", + "metadata": {}, + "source": [ + "The goals of this case study are:\n", + "\n", + "1. Implement a model of this scenario to predict Spider-Man's\n", + " trajectory.\n", + "\n", + "2. Choose the right time for Spider-Man to let go of the webbing in\n", + " order to maximize the distance he travels before landing.\n", + "\n", + "3. Choose the best angle for Spider-Man to jump off the building, and\n", + " let go of the webbing, to maximize range.\n", + "\n", + "We'll use the following parameters:\n", + "\n", + "1. According to the Spider-Man Wiki (), Spider-Man weighs 76 kg.\n", + "\n", + "2. Let's assume his terminal velocity is 60 m/s.\n", + "\n", + "3. The length of the web is 100 m.\n", + "\n", + "4. The initial angle of the web is 45° to the left of straight down.\n", + "\n", + "5. The spring constant of the web is 40 N/m when the cord is stretched, and 0 when it's compressed.\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`spiderman.ipynb`, which contains starter code. Read through the\n", + "notebook and run the code. It uses `minimize`, which is a SciPy function that can search for an optimal set of parameters (as contrasted with `minimize_scalar`, which can only search along a single axis)." + ] + }, + { + "cell_type": "markdown", + "id": "african-relative", + "metadata": {}, + "source": [ + "## Kittens\n", + "\n", + "If you have used the Internet, you have probably seen videos of kittens unrolling toilet paper.\n", + "And you might have wondered how long it would take a standard kitten to unroll 47 m of paper, the length of a standard roll.\n", + "\n", + "The interactions of the kitten and the paper rolls are complex. To keep things simple, let's assume that the kitten pulls down on the free end of the roll with constant force. And let's neglect the friction between the roll and the axle.\n", + "\n", + "This diagram shows the paper roll with the force applied by the kitten, $F$, the lever arm of the force around the axis of rotation, $r$, and the resulting torque, $\\tau$.\n", + "\n", + "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/kitten.png)\n", + "\n", + "Assuming that the force applied by the kitten is 0.002 N, how long would it take to unroll a standard roll of toilet paper?\n", + "\n", + "In the repository for this book, you will find a notebook,\n", + "`kitten.ipynb`, which contains starter code for this case study. Use it to implement this model and check whether the results seem plausible." + ] + }, + { + "cell_type": "markdown", + "id": "future-burlington", + "metadata": {}, + "source": [ + "## Simulating a yo-yo\n", + "\n", + "Suppose you are holding a yo-yo with a length of string wound around its axle, and you drop it while holding the end of the string stationary. As gravity accelerates the yo-yo downward, tension in the string exerts a force upward. Since this force acts on a point offset from the center of mass, it exerts a torque that causes the yo-yo to spin.\n", + "\n", + "The following diagram shows the forces on the yo-yo and the resulting torque. The outer shaded area shows the body of the yo-yo. The inner shaded area shows the rolled up string, the radius of which changes as the yo-yo unrolls.\n", + "\n", + "![Diagram of a yo-yo showing forces due to gravity and tension in the\n", + "string, the lever arm of tension, and the resulting\n", + "torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/yoyo.png)" + ] + }, + { + "cell_type": "markdown", + "id": "turkish-result", + "metadata": {}, + "source": [ + "In this system, we can't figure out the linear and angular acceleration independently; we have to solve a system of equations: \n", + "\n", + "$$\\begin{aligned}\n", + "\\sum F &= m a \\\\\n", + "\\sum \\tau &= I \\alpha\\end{aligned}$$ \n", + "\n", + "where the summations indicate that we are adding up forces and torques.\n", + "\n", + "As in the previous examples, linear and angular velocity are related\n", + "because of the way the string unrolls:\n", + "\n", + "$$\\frac{dy}{dt} = -r \\frac{d \\theta}{dt}$$ \n", + "\n", + "In this example, the linear and angular accelerations have opposite sign. As the yo-yo rotates counter-clockwise, $\\theta$ increases and $y$, which is the length of the rolled part of the string, decreases." + ] + }, + { + "cell_type": "markdown", + "id": "surrounded-quilt", + "metadata": {}, + "source": [ + "Taking the derivative of both sides yields a similar relationship\n", + "between linear and angular acceleration:\n", + "\n", + "$$\\frac{d^2 y}{dt^2} = -r \\frac{d^2 \\theta}{dt^2}$$ \n", + "\n", + "Which we can write more concisely: $$a = -r \\alpha$$ This relationship is not a general law of nature; it is specific to scenarios like this where one object rolls along another without stretching or slipping.\n", + "\n", + "Because of the way we've set up the problem, $y$ actually has two\n", + "meanings: it represents the length of the rolled string and the height\n", + "of the yo-yo, which decreases as the yo-yo falls. Similarly, $a$\n", + "represents acceleration in the length of the rolled string and the\n", + "height of the yo-yo.\n", + "\n", + "We can compute the acceleration of the yo-yo by adding up the linear\n", + "forces: \n", + "\n", + "$$\\sum F = T - mg = ma$$ \n", + "\n", + "Where $T$ is positive because the tension force points up, and $mg$ is negative because gravity points down." + ] + }, + { + "cell_type": "markdown", + "id": "finnish-disaster", + "metadata": {}, + "source": [ + "Because gravity acts on the center of mass, it creates no torque, so the only torque is due to tension: \n", + "\n", + "$$\\sum \\tau = T r = I \\alpha$$ \n", + "\n", + "Positive (upward) tension yields positive (counter-clockwise) angular\n", + "acceleration.\n", + "\n", + "Now we have three equations in three unknowns, $T$, $a$, and $\\alpha$,\n", + "with $I$, $m$, $g$, and $r$ as known parameters. We could solve these equations by hand, but we can also get SymPy to do it for us:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "crude-tribune", + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import symbols, Eq, solve\n", + "\n", + "T, a, alpha, I, m, g, r = symbols('T a alpha I m g r')\n", + "eq1 = Eq(a, -r * alpha)\n", + "eq2 = Eq(T - m*g, m * a)\n", + "eq3 = Eq(T * r, I * alpha)\n", + "soln = solve([eq1, eq2, eq3], [T, a, alpha])\n", + "soln" + ] + }, + { + "cell_type": "markdown", + "id": "insured-indie", + "metadata": {}, + "source": [ + "The results are \n", + "\n", + "$$\\begin{aligned}\n", + "T &= m g I / I^* \\\\\n", + "a &= -m g r^2 / I^* \\\\\n", + "\\alpha &= m g r / I^* \\\\\\end{aligned}$$ \n", + "\n", + "where $I^*$ is the augmented moment of inertia, $I + m r^2$. \n", + "We can use these equations for $a$ and $\\alpha$ to write a slope function and simulate this system.\n", + "\n", + "In the repository for this book, you will find a notebook, `yoyo.ipynb`, which contains starter code for this case study. Use it to implement and test this model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "accompanied-southwest", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9bd0df4f685719bb46c381c0546232a6e3d8519d Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 13 Feb 2021 14:30:28 -0500 Subject: [PATCH 033/144] Updating chapters --- chapters/chap10.ipynb | 54 +++++++------------------------------------ chapters/chap11.ipynb | 2 +- 2 files changed, 9 insertions(+), 47 deletions(-) diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 5ef4f184..3c12f900 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -280,7 +280,9 @@ "This figure shows the three scenarios we'll consider:\n", "\n", "![One queue, one server (left), one queue, two servers (middle), two\n", - "queues, two servers (right).](figs/queue.pdf){width=\"4.5in\"}\n", + "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", + "*One queue, one server (left), one queue, two servers (middle), two\n", + "queues, two servers (right).*\n", "\n", "As we did in the bike share model, we'll assume that a customer is equally likely to arrive during any time step. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", "\n", @@ -335,56 +337,16 @@ "expected height of the tallest tree in a stand of Douglas firs as a\n", "function of age, for a stand where the trees are the same age.\n", "\n", - "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\\\" that indicates the quality of the site.\n", - "\n", - "The following figure shows site curves for three different site\n", - "indices. \n", - "\n", - "![Site index curves for tree\n", - "growth.](figs/trees-fig01.pdf){height=\"3in\"}\n", + "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\" that indicates the quality of the site.\n", "\n", "The goal of this case study is to explain the shape of these\n", "curves, that is, why trees grow the way they do.\n", - "\n", - "As a starting place, let's assume that the ability of the tree to gain\n", - "mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A$$\n", - "\n", - "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", - "\n", - "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power: $m = \\beta h^D$ where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. I start by assuming $D=3$, but then revisit that assumption.\n", - "\n", - "Finally, we'll assume that area is proportional to height squared:\n", - "\n", - "$$A = \\gamma h^2$$\n", - "\n", - "I specify height in feet, and choose units for mass and area so that\n", - "$\\beta=1$ and $\\gamma=1$. Putting all that together, we can write a\n", - "difference equation for height:\n", - "\n", - "$$h_{n+1}^D = h_n^D + \\alpha h_n^2$$\n", - "\n", - "With $D=3$, the solution to this equation is close to a straight line,\n", - "which is not a bad model for the growth curves. But the model implies\n", - "that trees can grow forever, and we know that's not true. As trees get\n", - "taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", - "\n", - "We can model this effect by adding a factor to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A$$\n", - "\n", - "Let's assume\n", - "\n", - "$$m_{n+1} = m_n + \\alpha A (1 - h / K)$$\n", - "\n", - "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", + "The answer I propose involved fractal dimensions, so you might find it interesting.\n", "\n", "In the repository for this book, you'll find a notebook called\n", - "`trees.ipynb` that implements both models and uses them to fit the data.\n", + "`trees.ipynb` that incrementally develops a model of tree growth and uses it to fit the data.\n", "\n", - "There are no exercises in this case study; it is mostly meant as an\n", - "example of what you can do with the tools we have so far, and a preview of what we will be able to do with the tools in the next few chapters." + "There are no exercises in this case study, but it is an example of what you can do with the tools we have so far and a preview of what you will be able to do with the tools in the next few chapters." ] }, { @@ -412,7 +374,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index 6cd6a696..32f797bc 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -210,7 +210,7 @@ "model.\n", "\n", "![Stock and flow diagram for an SIR\n", - "model.](figs/stock_flow1.pdf){width=\"4in\"}\n", + "model.](https://github.com/AllenDowney/ModSim/raw/main/figs/stock_flow1.png)\n", "\n", "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." ] From a667229b146753fb9b1380804980f7570f30d662 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 13 Feb 2021 19:36:29 -0500 Subject: [PATCH 034/144] Updating modsim.py --- modsim.py | 873 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 873 insertions(+) create mode 100644 modsim.py diff --git a/modsim.py b/modsim.py new file mode 100644 index 00000000..cd389049 --- /dev/null +++ b/modsim.py @@ -0,0 +1,873 @@ +""" +Code from Modeling and Simulation in Python. + +Copyright 2020 Allen Downey + +MIT License: https://opensource.org/licenses/MIT +""" + +import logging + +logger = logging.getLogger(name="modsim.py") + +# make sure we have Python 3.6 or better +import sys + +if sys.version_info < (3, 6): + logger.warning("modsim.py depends on Python 3.6 features.") + +import inspect + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import scipy + +import scipy.optimize as spo + +from scipy.interpolate import interp1d +from scipy.interpolate import InterpolatedUnivariateSpline + +from scipy.integrate import solve_ivp + +from types import SimpleNamespace +from copy import copy + +import pint + +units = pint.UnitRegistry() +#Quantity = units.Quantity + + +def flip(p=0.5): + """Flips a coin with the given probability. + + p: float 0-1 + + returns: boolean (True or False) + """ + return np.random.random() < p + + +def cart2pol(x, y, z=None): + """Convert Cartesian coordinates to polar. + + x: number or sequence + y: number or sequence + z: number or sequence (optional) + + returns: theta, rho OR theta, rho, z + """ + x = np.asarray(x) + y = np.asarray(y) + + rho = np.hypot(x, y) + theta = np.arctan2(y, x) + + if z is None: + return theta, rho + else: + return theta, rho, z + + +def pol2cart(theta, rho, z=None): + """Convert polar coordinates to Cartesian. + + theta: number or sequence in radians + rho: number or sequence + z: number or sequence (optional) + + returns: x, y OR x, y, z + """ + x = rho * np.cos(theta) + y = rho * np.sin(theta) + + if z is None: + return x, y + else: + return x, y, z + +from numpy import linspace + +def linrange(start, stop=None, step=1, **options): + """Make an array of equally spaced values. + + start: first value + stop: last value (might be approximate) + step: difference between elements (should be consistent) + + returns: NumPy array + """ + if stop is None: + stop = start + start = 0 + n = int(round((stop-start) / step)) + return linspace(start, stop, n+1, **options) + + +def root_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `min_func`. + + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html + + func: computes the function to be minimized + bracket: sequence of two values, lower and upper bounds of the range to be searched + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to root_scalar + + returns: RootResults object + """ + bracket = kwargs.get('bracket', None) + if bracket is None or len(bracket) != 2: + msg = ("To run root_scalar, you have to provide a " + "`bracket` keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) + + try: + func(bracket[0], *args) + except Exception as e: + msg = ("Before running scipy.integrate.root_scalar " + "I tried running the function you provided " + "with `bracket[0]`, " + "and I got the following error:") + logger.error(msg) + raise (e) + + underride(kwargs, rtol=1e-4) + + res = spo.root_scalar(func, *args, **kwargs) + + if not res.converged: + msg = ("scipy.optimize.root_scalar did not converge. " + "The message it returned is:\n" + res.flag) + raise ValueError(msg) + + return res + + +def minimize_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `func`. + + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + func: computes the function to be minimized + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to minimize_scalar + + returns: OptimizeResult object + """ + bounds = kwargs.get('bounds', None) + + if bounds is None or len(bounds) != 2: + msg = ("To run maximize_scalar or minimize_scalar, " + "you have to provide a `bounds` " + "keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) + + try: + func(bounds[0], *args) + except Exception as e: + msg = ("Before running scipy.integrate.minimize_scalar, " + "I tried running the function you provided " + "with the lower bound, " + "and I got the following error:") + logger.error(msg) + raise (e) + + underride(kwargs, method='bounded') + + res = spo.minimize_scalar(func, args=args, **kwargs) + + if not res.success: + msg = ("minimize_scalar did not succeed." + "The message it returned is: \n" + + res.message) + raise Exception(msg) + + return res + + +def maximize_scalar(max_func, *args, **kwargs): + """Finds the input value that maximizes `max_func`. + + Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + min_func: computes the function to be maximized + args: any additional positional arguments are passed to max_func + options: any keyword arguments are passed as options to minimize_scalar + + returns: ModSimSeries object + """ + def min_func(*args): + return -max_func(*args) + + res = minimize_scalar(min_func, *args, **kwargs) + + # we have to negate the function value before returning res + res.fun = -res.fun + return res + + +def run_solve_ivp(system, slope_func, **options): + """Computes a numerical solution to a differential equation. + + `system` must contain `init` with initial conditions, + `t_end` with the end time. Optionally, it can contain + `t_0` with the start time. + + It should contain any other parameters required by the + slope function. + + `options` can be any legal options of `scipy.integrate.solve_ivp` + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + system = remove_units(system) + + # make sure `system` contains `init` + if not hasattr(system, "init"): + msg = """It looks like `system` does not contain `init` + as a system variable. `init` should be a State + object that specifies the initial condition:""" + raise ValueError(msg) + + # make sure `system` contains `t_end` + if not hasattr(system, "t_end"): + msg = """It looks like `system` does not contain `t_end` + as a system variable. `t_end` should be the + final time:""" + raise ValueError(msg) + + # the default value for t_0 is 0 + t_0 = getattr(system, "t_0", 0) + + # try running the slope function with the initial conditions + try: + slope_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the slope function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get the list of event functions + events = options.get('events', []) + + # if there's only one event function, put it in a list + try: + iter(events) + except TypeError: + events = [events] + + for event_func in events: + # make events terminal unless otherwise specified + if not hasattr(event_func, 'terminal'): + event_func.terminal = True + + # test the event function with the initial conditions + try: + event_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the event function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get dense output unless otherwise specified + if not 't_eval' in options: + underride(options, dense_output=True) + + # run the solver + bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, + args=[system], **options) + + # separate the results from the details + y = bunch.pop("y") + t = bunch.pop("t") + + # get the column names from `init`, if possible + if hasattr(system.init, 'index'): + columns = system.init.index + else: + columns = range(len(system.init)) + + # evaluate the results at equally-spaced points + if options.get('dense_output', False): + try: + num = system.num + except AttributeError: + num = 101 + t_final = t[-1] + t_array = linspace(t_0, t_final, num) + y_array = bunch.sol(t_array) + + # pack the results into a TimeFrame + results = TimeFrame(y_array.T, index=t_array, + columns=columns) + else: + results = TimeFrame(y.T, index=t, + columns=columns) + + return results, bunch + + +def leastsq(error_func, x0, *args, **options): + """Find the parameters that yield the best fit for the data. + + `x0` can be a sequence, array, Series, or Params + + Positional arguments are passed along to `error_func`. + + Keyword arguments are passed to `scipy.optimize.leastsq` + + error_func: function that computes a sequence of errors + x0: initial guess for the best parameters + args: passed to error_func + options: passed to leastsq + + :returns: Params object with best_params and ModSimSeries with details + """ + # override `full_output` so we get a message if something goes wrong + options["full_output"] = True + + # run leastsq + t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) + best_params, cov_x, infodict, mesg, ier = t + + # pack the results into a ModSimSeries object + details = SimpleNamespace(cov_x=cov_x, + mesg=mesg, + ier=ier, + **infodict) + details.success = details.ier in [1,2,3,4] + + # if we got a Params object, we should return a Params object + if isinstance(x0, Params): + best_params = Params(pd.Series(best_params, x0.index)) + + # return the best parameters and details + return best_params, details + + +def crossings(series, value): + """Find the labels where the series passes through value. + + The labels in series must be increasing numerical values. + + series: Series + value: number + + returns: sequence of labels + """ + values = series.values - value + interp = InterpolatedUnivariateSpline(series.index, values) + return interp.roots() + + +def has_nan(a): + """Checks whether the an array contains any NaNs. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.any(np.isnan(a)) + + +def is_strictly_increasing(a): + """Checks whether the elements of an array are strictly increasing. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.all(np.diff(a) > 0) + + +def interpolate(series, **options): + """Creates an interpolation function. + + series: Series object + options: any legal options to scipy.interpolate.interp1d + + returns: function that maps from the index to the values + """ + if has_nan(series.index): + msg = """The Series you passed to interpolate contains + NaN values in the index, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + if not is_strictly_increasing(series.index): + msg = """The Series you passed to interpolate has an index + that is not strictly increasing, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + # make the interpolate function extrapolate past the ends of + # the range, unless `options` already specifies a value for `fill_value` + underride(options, fill_value="extrapolate") + + # call interp1d, which returns a new function object + x = series.index + y = series.values + interp_func = interp1d(x, y, **options) + return interp_func + + +def interpolate_inverse(series, **options): + """Interpolate the inverse function of a Series. + + series: Series object, represents a mapping from `a` to `b` + options: any legal options to scipy.interpolate.interp1d + + returns: interpolation object, can be used as a function + from `b` to `a` + """ + inverse = pd.Series(series.index, index=series.values) + interp_func = interpolate(inverse, **options) + return interp_func + + +def gradient(series, **options): + """Computes the numerical derivative of a series. + + If the elements of series have units, they are dropped. + + series: Series object + options: any legal options to np.gradient + + returns: Series, same subclass as series + """ + x = series.index + y = series.values + + a = np.gradient(y, x, **options) + return series.__class__(a, series.index) + + +def source_code(obj): + """Prints the source code for a given object. + + obj: function or method object + """ + print(inspect.getsource(obj)) + + +def underride(d, **options): + """Add key-value pairs to d only if key is not in d. + + If d is None, create a new dictionary. + + d: dictionary + options: keyword args to add to d + """ + if d is None: + d = {} + + for key, val in options.items(): + d.setdefault(key, val) + + return d + + +def contour(df, **options): + """Makes a contour plot from a DataFrame. + + Wrapper for plt.contour + https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contour.html + + Note: columns and index must be numerical + + df: DataFrame + options: passed to plt.contour + """ + fontsize = options.pop("fontsize", 12) + underride(options, cmap="viridis") + x = df.columns + y = df.index + X, Y = np.meshgrid(x, y) + cs = plt.contour(X, Y, df, **options) + plt.clabel(cs, inline=1, fontsize=fontsize) + + +def savefig(filename, **options): + """Save the current figure. + + Keyword arguments are passed along to plt.savefig + + https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html + + filename: string + """ + print("Saving figure to file", filename) + plt.savefig(filename, **options) + + +def decorate(**options): + """Decorate the current axes. + + Call decorate with keyword arguments like + decorate(title='Title', + xlabel='x', + ylabel='y') + + The keyword arguments can be any of the axis properties + https://matplotlib.org/api/axes_api.html + """ + ax = plt.gca() + ax.set(**options) + + handles, labels = ax.get_legend_handles_labels() + if handles: + ax.legend(handles, labels) + + plt.tight_layout() + + +def remove_from_legend(bad_labels): + """Removes some labels from the legend. + + bad_labels: sequence of strings + """ + ax = plt.gca() + handles, labels = ax.get_legend_handles_labels() + handle_list, label_list = [], [] + for handle, label in zip(handles, labels): + if label not in bad_labels: + handle_list.append(handle) + label_list.append(label) + ax.legend(handle_list, label_list) + + +class SettableNamespace(SimpleNamespace): + """Contains a collection of parameters. + + Used to make a System object. + + Takes keyword arguments and stores them as attributes. + """ + def __init__(self, namespace=None, **kwargs): + super().__init__() + if namespace: + self.__dict__.update(namespace.__dict__) + self.__dict__.update(kwargs) + + def get(self, name, default=None): + """Look up a variable. + + name: string varname + default: value returned if `name` is not present + """ + try: + return self.__getattribute__(name, default) + except AttributeError: + return default + + def set(self, **variables): + """Make a copy and update the given variables. + + returns: Params + """ + new = copy(self) + new.__dict__.update(variables) + return new + + +def magnitude(x): + """Returns the magnitude of a Quantity or number. + + x: Quantity or number + + returns: number + """ + return x.magnitude if hasattr(x, 'magnitude') else x + + +def remove_units(namespace): + """Removes units from the values in a Namespace. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Namespace object + """ + res = copy(namespace) + for label, value in res.__dict__.items(): + if isinstance(value, pd.Series): + value = remove_units_series(value) + res.__dict__[label] = magnitude(value) + return res + + +def remove_units_series(series): + """Removes units from the values in a Series. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Series object + """ + res = copy(series) + for label, value in res.iteritems(): + res[label] = magnitude(value) + return res + + +class System(SettableNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +class Params(SettableNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables, name='state') + + +def make_series(x, y, **options): + """Make a Pandas Series. + + x: sequence used as the index + y: sequence used as the values + + returns: Pandas Series + """ + if isinstance(y, pd.Series): + y = y.values + return pd.Series(y, index=x, **options) + + +def TimeSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series + + +def SweepSeries(*args, **kwargs): + """ + """ + if args or kwargs: + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Parameter' + if 'name' not in kwargs: + series.name = 'Metric' + return series + + +def show(obj): + """Display a Series or Namespace as a DataFrame.""" + if isinstance(obj, pd.Series): + return pd.DataFrame(obj) + elif isinstance(obj, SimpleNamespace): + return pd.DataFrame(pd.Series(obj.__dict__), + columns=['value']) + else: + return obj + + +def TimeFrame(*args, **kwargs): + """DataFrame that maps from time to State. + """ + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) + + +def SweepFrame(*args, **kwargs): + """DataFrame that maps from parameter value to SweepSeries. + """ + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) + + +def Vector(x, y, z=None, **options): + """ + """ + if z is None: + return pd.Series(dict(x=x, y=y), **options) + else: + return pd.Series(dict(x=x, y=y, z=z), **options) + + +## Vector functions (should work with any sequence) + +def vector_mag(v): + """Vector magnitude.""" + return np.sqrt(np.dot(v, v)) + + +def vector_mag2(v): + """Vector magnitude squared.""" + return np.dot(v, v) + + +def vector_angle(v): + """Angle between v and the positive x axis. + + Only works with 2-D vectors. + + returns: angle in radians + """ + assert len(v) == 2 + x, y = v + return np.arctan2(y, x) + + +def vector_polar(v): + """Vector magnitude and angle. + + returns: (number, angle in radians) + """ + return vector_mag(v), vector_angle(v) + + +def vector_hat(v): + """Unit vector in the direction of v. + + returns: Vector or array + """ + # check if the magnitude of the Quantity is 0 + mag = vector_mag(v) + if mag == 0: + return v + else: + return v / mag + + +def vector_perp(v): + """Perpendicular Vector (rotated left). + + Only works with 2-D Vectors. + + returns: Vector + """ + assert len(v) == 2 + x, y = v + return Vector(-y, x) + + +def vector_dot(v, w): + """Dot product of v and w. + + returns: number or Quantity + """ + return np.dot(v, w) + + +def vector_cross(v, w): + """Cross product of v and w. + + returns: number or Quantity for 2-D, Vector for 3-D + """ + res = np.cross(v, w) + + if len(v) == 3: + return Vector(*res) + else: + return res + + +def vector_proj(v, w): + """Projection of v onto w. + + returns: array or Vector with direction of w and units of v. + """ + w_hat = vector_hat(w) + return vector_dot(v, w_hat) * w_hat + + +def scalar_proj(v, w): + """Returns the scalar projection of v onto w. + + Which is the magnitude of the projection of v onto w. + + returns: scalar with units of v. + """ + return vector_dot(v, vector_hat(w)) + + +def vector_dist(v, w): + """Euclidean distance from v to w, with units.""" + if isinstance(v, list): + v = np.asarray(v) + return vector_mag(v - w) + + +def vector_diff_angle(v, w): + """Angular difference between two vectors, in radians. + """ + if len(v) == 2: + return vector_angle(v) - vector_angle(w) + else: + # TODO: see http://www.euclideanspace.com/maths/algebra/ + # vectors/angleBetween/ + raise NotImplementedError() + + +def plot_segment(A, B, **options): + """Plots a line segment between two Vectors. + + For 3-D vectors, the z axis is ignored. + + Additional options are passed along to plot(). + + A: Vector + B: Vector + """ + xs = A.x, B.x + ys = A.y, B.y + plt.plot(xs, ys, **options) + + +from time import sleep +from IPython.display import clear_output + +def animate(results, draw_func, *args, interval=None): + """Animate results from a simulation. + + results: TimeFrame + draw_func: function that draws state + interval: time between frames in seconds + """ + plt.figure() + try: + for t, state in results.iterrows(): + draw_func(t, state, *args) + plt.show() + if interval: + sleep(interval) + clear_output(wait=True) + draw_func(t, state, *args) + plt.show() + except KeyboardInterrupt: + pass From 6b397714aed91949d86753b7fd7b0e961262f2e5 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 13 Feb 2021 19:37:26 -0500 Subject: [PATCH 035/144] Updating chapters --- chapters/chap01.ipynb | 80 ++++++++++++++----------------------------- chapters/chap02.ipynb | 31 +++++++++-------- chapters/chap03.ipynb | 31 +++++++++-------- chapters/chap04.ipynb | 31 +++++++++-------- chapters/chap05.ipynb | 31 +++++++++-------- chapters/chap06.ipynb | 31 +++++++++-------- chapters/chap07.ipynb | 31 +++++++++-------- chapters/chap08.ipynb | 31 +++++++++-------- chapters/chap09.ipynb | 31 +++++++++-------- chapters/chap10.ipynb | 33 ++++++++++-------- chapters/chap11.ipynb | 31 +++++++++-------- chapters/chap12.ipynb | 31 +++++++++-------- chapters/chap13.ipynb | 31 +++++++++-------- chapters/chap14.ipynb | 31 +++++++++-------- chapters/chap15.ipynb | 31 +++++++++-------- chapters/chap16.ipynb | 31 +++++++++-------- chapters/chap17.ipynb | 31 +++++++++-------- chapters/chap18.ipynb | 31 +++++++++-------- chapters/chap19.ipynb | 37 +++++++++++--------- chapters/chap20.ipynb | 31 +++++++++-------- chapters/chap21.ipynb | 31 +++++++++-------- chapters/chap22.ipynb | 31 +++++++++-------- chapters/chap23.ipynb | 31 +++++++++-------- chapters/chap24.ipynb | 31 +++++++++-------- chapters/chap25.ipynb | 31 +++++++++-------- chapters/chap26.ipynb | 37 +++++++++++--------- 26 files changed, 460 insertions(+), 409 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index d2b12fcd..4d031bd7 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "biblical-enhancement", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, @@ -77,7 +80,9 @@ { "cell_type": "markdown", "id": "confirmed-budapest", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "## Jupyter\n", "\n", @@ -89,51 +94,17 @@ { "cell_type": "markdown", "id": "danish-scope", - "metadata": {}, - "source": [ - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "If you run the following cell, it checks whether the libraries you need are installed. If so, the cell produces no output. If not, you'll see updates from the installer." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "asian-america", "metadata": { "tags": [] }, - "outputs": [], "source": [ - "# check if the libraries we need are installed\n", + "To run a cell, hold down SHIFT and press ENTER. \n", "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " \n", - "# download modsim.py if necessary\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", "\n", - "from os.path import exists\n", + "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" - ] - }, - { - "cell_type": "markdown", - "id": "copyrighted-desperate", - "metadata": {}, - "source": [ - "If the previous cell runs without producing any error messages, you are all set.\n" + "The cells at the beginning of this notebook check whether the libraries we'll need are installed. If so, the cells produce no output. If not, you'll see updates from the installer." ] }, { @@ -141,7 +112,7 @@ "id": "hourly-financing", "metadata": {}, "source": [ - "## Modeling\n", + "## Modeling and Simulation\n", "\n", "This book is about modeling and simulation of physical systems. The\n", "following diagram shows what I mean by \"modeling\":\n", @@ -1231,6 +1202,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index f9bdf584..dc5e9f80 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "cathedral-glasgow", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index f905d62f..794b0d43 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "welcome-gentleman", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index 03a177b0..da973561 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "hawaiian-detective", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index 99dd47af..b3266246 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "inclusive-theater", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index d64d790c..0c18a0ac 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "parental-symposium", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index 7bd8ec6e..40678cf7 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "disciplinary-occasion", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index 7d794270..2aaa36bb 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "compound-announcement", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 9aa9f8e7..8e3c66ac 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "gentle-purchase", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 3c12f900..aa249823 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "confused-bargain", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index 32f797bc..c1c16741 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "detected-creation", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index a693d9d7..752291a4 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "excellent-orchestra", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index f2ef27f3..07f38c02 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "ceramic-rendering", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 5a8f9484..139bbcc6 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "impressed-headline", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index 29ba9961..a13abf5a 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "american-article", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index 1105131b..52b085f7 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "senior-paintball", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index b4521f95..7db3f45e 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "restricted-thumb", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 3, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 0e0d245d..4fc84f93 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "tribal-blame", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index f2f3c588..7b2c625e 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -10,8 +10,10 @@ }, { "cell_type": "markdown", - "id": "passing-solid", - "metadata": {}, + "id": "imported-table", + "metadata": { + "tags": [] + }, "source": [ "*Modeling and Simulation in Python*\n", "\n", @@ -22,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -39,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -48,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index fb46d858..e22a5571 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "furnished-portsmouth", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index 3cd917bd..b827e286 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "unauthorized-constitutional", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 5dae8f6f..031a2fdd 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "connected-covering", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index b5333cf2..6763b952 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "competitive-backing", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index b6fa9422..7334a31b 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "suspended-puppy", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index eaaa432f..ed62cb68 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "complete-innocent", + "id": "imported-table", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -50,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index 6abd4e82..08252908 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -10,8 +10,10 @@ }, { "cell_type": "markdown", - "id": "comic-convert", - "metadata": {}, + "id": "imported-table", + "metadata": { + "tags": [] + }, "source": [ "*Modeling and Simulation in Python*\n", "\n", @@ -22,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "broken-procedure", + "execution_count": null, + "id": "electoral-turkey", "metadata": { "tags": [] }, @@ -39,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "massive-thong", + "execution_count": 1, + "id": "meaning-public", "metadata": { "tags": [] }, @@ -48,20 +50,23 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "experienced-junction", + "execution_count": null, + "id": "alike-thompson", "metadata": { "tags": [] }, From 9e176ff314eda083c8be1d5634e4c01c239d5000 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 13 Feb 2021 19:51:01 -0500 Subject: [PATCH 036/144] Updating chapters --- chapters/chap05.ipynb | 113 +++++++++++++++++------------------------- chapters/chap10.ipynb | 95 +++++++++++++++++++++-------------- 2 files changed, 104 insertions(+), 104 deletions(-) diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index b3266246..f1facb0b 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -77,25 +77,14 @@ "from modsim import *" ] }, - { - "cell_type": "markdown", - "id": "therapeutic-genealogy", - "metadata": {}, - "source": [ - "In this chapter..." - ] - }, { "cell_type": "markdown", "id": "informal-contractor", "metadata": {}, "source": [ - "# World population\n", - "\n", "In 1968 Paul Erlich published *The Population Bomb*, in which he\n", "predicted that world population would grow quickly during the 1970s,\n", - "that agricultural production could not keep up, and that mass starvation\n", - "in the next two decades was inevitable (see\n", + "that agricultural production could not keep up, and that mass starvation in the next two decades was inevitable (see\n", "). As someone who grew up during those\n", "decades, I am happy to report that those predictions were wrong.\n", "\n", @@ -103,9 +92,7 @@ "open question how many people the earth can sustain while maintaining\n", "and improving our quality of life.\n", "\n", - "In this chapter and the next, we use tools from the previous chapters to\n", - "explain world population growth since 1950 and generate predictions for\n", - "the next 50-100 years.\n", + "In this chapter and the next, we use tools from the previous chapters to model world population growth since 1950 and generate predictions for the next 50-100 years.\n", "\n", "For background on world population growth, watch this video from the\n", "American Museum of Natural History ." @@ -116,7 +103,7 @@ "id": "dying-browse", "metadata": {}, "source": [ - "## World Population Data\n", + "## World Population Growth\n", "\n", "The Wikipedia article on world population contains tables with estimates of world population from prehistory to the present, and projections for the future ()." ] @@ -131,17 +118,13 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "convenient-stroke", "metadata": {}, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { @@ -156,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "israeli-finding", "metadata": {}, "outputs": [], @@ -174,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "instant-beverage", "metadata": {}, "outputs": [], @@ -222,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "driving-wrapping", "metadata": {}, "outputs": [], @@ -243,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "running-alcohol", "metadata": {}, "outputs": [], @@ -274,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "engaging-regular", "metadata": {}, "outputs": [], @@ -297,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "amended-negative", "metadata": {}, "outputs": [], @@ -321,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "graduate-specialist", "metadata": {}, "outputs": [], @@ -344,7 +327,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "id": "linear-admission", "metadata": {}, "outputs": [], @@ -365,13 +348,11 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "id": "ordered-garage", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "def plot_estimates():\n", " census.plot(style=':', label='US Census')\n", " un.plot(style='--', label='UN DESA')\n", @@ -392,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 15, "id": "periodic-weekend", "metadata": {}, "outputs": [], @@ -425,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "secondary-player", "metadata": {}, "outputs": [], @@ -435,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "caring-garlic", "metadata": {}, "outputs": [], @@ -457,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "id": "corresponding-emerald", "metadata": {}, "outputs": [], @@ -478,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "id": "headed-witch", "metadata": { "scrolled": true @@ -505,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "id": "advisory-complex", "metadata": { "scrolled": true @@ -528,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "id": "frank-owner", "metadata": {}, "outputs": [], @@ -572,7 +553,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "id": "undefined-sauce", "metadata": {}, "outputs": [], @@ -590,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "id": "postal-debate", "metadata": {}, "outputs": [], @@ -616,7 +597,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "id": "functional-trick", "metadata": {}, "outputs": [], @@ -636,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "id": "acoustic-south", "metadata": {}, "outputs": [], @@ -657,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "id": "planned-remains", "metadata": {}, "outputs": [], @@ -676,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "id": "quarterly-aggregate", "metadata": {}, "outputs": [], @@ -695,7 +676,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "id": "prescription-optics", "metadata": {}, "outputs": [], @@ -714,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "id": "convertible-patch", "metadata": {}, "outputs": [], @@ -746,14 +727,12 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 31, "id": "duplicate-leave", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", - "results = TimeSeries(time='Year', quantity='Population')" + "results = TimeSeries()" ] }, { @@ -769,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 32, "id": "convenient-thong", "metadata": {}, "outputs": [], @@ -787,13 +766,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 33, "id": "israeli-surveillance", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "show(results)" ] }, @@ -807,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 34, "id": "attended-morris", "metadata": {}, "outputs": [], @@ -832,7 +809,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 35, "id": "wrong-brooks", "metadata": {}, "outputs": [], @@ -892,7 +869,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 36, "id": "terminal-reynolds", "metadata": {}, "outputs": [], @@ -916,7 +893,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 37, "id": "organizational-memphis", "metadata": {}, "outputs": [], @@ -942,7 +919,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 38, "id": "rising-anger", "metadata": {}, "outputs": [], @@ -952,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 41, "id": "false-handbook", "metadata": {}, "outputs": [], @@ -962,7 +939,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 42, "id": "political-loading", "metadata": {}, "outputs": [], @@ -995,7 +972,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index aa249823..b642f49f 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "alike-thompson", "metadata": { "tags": [] @@ -82,9 +82,7 @@ "id": "thirty-medication", "metadata": {}, "source": [ - "# Case studies\n", - "\n", - "This chapter presents case studies where you can practice the tools we have learned so far." + "This chapter presents case studies where you can apply the tools we have learned so far to problems involving the growth of human and salmon populations, queueing systems, and a model of tree growth. " ] }, { @@ -94,29 +92,29 @@ "source": [ "## Prehistoric World Population\n", "\n", - "On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." + "On the Wikipedia page about world population estimates, the second table contains estimates for prehistoric populations." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "id": "usual-penguin", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "id": "thick-lincoln", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from pandas import read_html\n", @@ -129,16 +127,20 @@ { "cell_type": "markdown", "id": "disciplinary-chosen", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "Select `tables[1]`, which is the second table on the page." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 9, "id": "conscious-orange", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "table1 = tables[1]\n", @@ -148,7 +150,9 @@ { "cell_type": "markdown", "id": "hungry-monster", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "Not all researchers provide estimates for the same dates.\n", "\n", @@ -157,9 +161,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 10, "id": "thick-blanket", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", @@ -169,16 +175,20 @@ { "cell_type": "markdown", "id": "substantial-implement", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 11, "id": "ranking-prescription", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "for col in table1.columns:\n", @@ -188,17 +198,20 @@ { "cell_type": "markdown", "id": "amazing-difference", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "Here are the results. Notice that we are working in millions now, not billions." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 12, "id": "metallic-offense", "metadata": { - "scrolled": false + "scrolled": false, + "tags": [] }, "outputs": [], "source": [ @@ -212,14 +225,24 @@ { "cell_type": "markdown", "id": "human-conservation", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "We can use `xlim` to zoom in on everything after Year 0." ] }, + { + "cell_type": "markdown", + "id": "tired-tongue", + "metadata": {}, + "source": [ + "The following figure shows the estimates of several research groups from 1 CE to the near present." + ] + }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "solar-action", "metadata": {}, "outputs": [], @@ -235,14 +258,13 @@ "id": "wanted-fantasy", "metadata": {}, "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" + "See if you can find a model that fits these estimates.\n", + "How well does your best model predict actual population growth from 1940 to the present?" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "id": "together-jackson", "metadata": {}, "outputs": [], @@ -252,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 17, "id": "simple-verse", "metadata": { "scrolled": true @@ -362,6 +384,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", From 38089265c29c1c6a9429dda102e9ff6b78ed55f7 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 13 Feb 2021 19:52:54 -0500 Subject: [PATCH 037/144] Updating chapters --- chapters/chap05.ipynb | 54 +++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index f1facb0b..b028809e 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -348,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "ordered-garage", "metadata": {}, "outputs": [], @@ -373,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "periodic-weekend", "metadata": {}, "outputs": [], @@ -406,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "secondary-player", "metadata": {}, "outputs": [], @@ -416,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "caring-garlic", "metadata": {}, "outputs": [], @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "corresponding-emerald", "metadata": {}, "outputs": [], @@ -459,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "headed-witch", "metadata": { "scrolled": true @@ -486,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "advisory-complex", "metadata": { "scrolled": true @@ -509,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "frank-owner", "metadata": {}, "outputs": [], @@ -553,7 +553,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "undefined-sauce", "metadata": {}, "outputs": [], @@ -571,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "postal-debate", "metadata": {}, "outputs": [], @@ -597,7 +597,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "functional-trick", "metadata": {}, "outputs": [], @@ -617,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "acoustic-south", "metadata": {}, "outputs": [], @@ -638,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "planned-remains", "metadata": {}, "outputs": [], @@ -657,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "quarterly-aggregate", "metadata": {}, "outputs": [], @@ -676,7 +676,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "prescription-optics", "metadata": {}, "outputs": [], @@ -695,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "convertible-patch", "metadata": {}, "outputs": [], @@ -727,7 +727,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 29, "id": "duplicate-leave", "metadata": {}, "outputs": [], @@ -748,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 30, "id": "convenient-thong", "metadata": {}, "outputs": [], @@ -766,7 +766,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "id": "israeli-surveillance", "metadata": {}, "outputs": [], @@ -784,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 32, "id": "attended-morris", "metadata": {}, "outputs": [], @@ -809,7 +809,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 33, "id": "wrong-brooks", "metadata": {}, "outputs": [], @@ -869,7 +869,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "id": "terminal-reynolds", "metadata": {}, "outputs": [], @@ -884,7 +884,7 @@ "total_growth = p_end - p_0\n", "annual_growth = total_growth / elapsed_time\n", "\n", - "results = TimeSeries(time='Year', quantity='Population')\n", + "results = TimeSeries()\n", "results[t_0] = p_0\n", "\n", "for t in range(t_0, t_end):\n", @@ -893,7 +893,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "id": "organizational-memphis", "metadata": {}, "outputs": [], @@ -919,7 +919,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "id": "rising-anger", "metadata": {}, "outputs": [], @@ -929,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 38, "id": "false-handbook", "metadata": {}, "outputs": [], @@ -939,7 +939,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 39, "id": "political-loading", "metadata": {}, "outputs": [], From 3d391db9371f09b65feb4dea355ffbb7871900cb Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 14 Feb 2021 15:03:39 -0500 Subject: [PATCH 038/144] Updating chapters --- chapters/chap01.ipynb | 192 +++++++++++++++++--------------- chapters/chap02.ipynb | 175 ++++++++++++++--------------- chapters/chap03.ipynb | 128 +++++++++++----------- chapters/chap04.ipynb | 248 ++++++++++++++++++++++-------------------- 4 files changed, 381 insertions(+), 362 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 4d031bd7..426c9db5 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -287,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "eleven-marine", "metadata": {}, "outputs": [], @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "following-launch", "metadata": {}, "outputs": [], @@ -325,7 +325,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "mature-duration", "metadata": {}, "outputs": [], @@ -345,7 +345,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "considered-inclusion", "metadata": {}, "outputs": [], @@ -363,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "valued-electricity", "metadata": {}, "outputs": [], @@ -382,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "closed-month", "metadata": {}, "outputs": [], @@ -401,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "nuclear-clone", "metadata": {}, "outputs": [], @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "quarterly-nightmare", "metadata": {}, "outputs": [], @@ -438,7 +438,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "id": "quality-external", "metadata": {}, "outputs": [], @@ -472,7 +472,7 @@ "source": [ "## Computation with units\n", "\n", - "The computation in the previous section uses numbers without units. \n", + "The computation in the previous section uses numbers without units.\n", "When we set `h=381`, we left out the meters, and when we set `a=9.8`, we left out the meters per second squared.\n", "And, when we got the result `v=86`, we added back the meters per second.\n", "\n", @@ -481,29 +481,41 @@ "\n", "To represent units, we'll use a Python library called [Pint](https://pint.readthedocs.io/en/latest/).\n", "The ModSim library initializes Pint and provides an object called `units` that contains variables representing pretty much every unit you've ever heard of.\n", - "\n", - "We can import it like this:" + "For example:" ] }, { "cell_type": "code", - "execution_count": 11, - "id": "based-belief", + "execution_count": 54, + "id": "promotional-lover", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "units.league" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "practical-throat", + "metadata": {}, + "outputs": [], + "source": [ + "units.fortnight" + ] }, { "cell_type": "markdown", "id": "unlike-opera", "metadata": {}, "source": [ - "Now we can create variables named `meter` and `second`." + "But leagues and fortnights are not SI units.\n", + "Instead, we will use `meter` and `second`." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "russian-popularity", "metadata": {}, "outputs": [], @@ -514,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "endless-paint", "metadata": {}, "outputs": [], @@ -531,6 +543,14 @@ "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "developmental-majority", + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "id": "everyday-location", @@ -541,7 +561,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "earlier-bandwidth", "metadata": {}, "outputs": [], @@ -560,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "missing-privilege", "metadata": {}, "outputs": [], @@ -570,7 +590,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "fourth-swedish", "metadata": {}, "outputs": [], @@ -583,12 +603,12 @@ "id": "realistic-techno", "metadata": {}, "source": [ - "Now we can create a quantity that represents $3.4$ s." + "We can also create a quantity that represents $3.4$ s." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 56, "id": "apart-france", "metadata": {}, "outputs": [], @@ -607,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 57, "id": "alien-scout", "metadata": {}, "outputs": [], @@ -626,7 +646,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 58, "id": "confidential-costs", "metadata": {}, "outputs": [], @@ -639,12 +659,12 @@ "id": "hollow-programmer", "metadata": {}, "source": [ - "We can use it to compute the time to reach the sidewalk." + "We can use it to compute the time the penny would take to reach the sidewalk." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "studied-opera", "metadata": {}, "outputs": [], @@ -663,7 +683,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "exterior-greek", "metadata": {}, "outputs": [], @@ -684,7 +704,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "antique-landing", "metadata": {}, "outputs": [], @@ -695,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "included-failure", "metadata": {}, "outputs": [], @@ -721,16 +741,16 @@ "\n", "This chapter introduces a modeling framework that consists of three steps:\n", "\n", - "* Abstraction is the process of defining a model, deciding which elements of the real world to include and which can be left out.\n", + "* Abstraction is the process of defining a model by deciding which elements of the real world to include and which can be left out.\n", "\n", - "* Analysis and simulation are ways to use a model to generate predictions, explain why things behave as they to, and design things that behave as we want.\n", + "* Analysis and simulation are ways to use a model to generate predictions, explain why things behave as they do, and design things that behave as we want.\n", "\n", "* Validation is how we test whether the model is right, often by comparing predictions with measurements from the real world.\n", "\n", "As a first example, we modeled a penny dropped from the Empire State building, including gravity but ignoring air resistance.\n", "In the exercises, you'll have a chance to try a better model, including air resistance.\n", "\n", - "This chapter also presents Pint, a library for doing computation with units, which is convenient for converting between different units and important for avoiding catastrophic errors." + "This chapter also presents Pint, a library for doing computation with units, which is convenient for converting between different units and helpful for avoiding catastrophic errors." ] }, { @@ -753,14 +773,13 @@ "v = a t\n", "```\n", "\n", - "you'll get a **syntax error**, which means that something is wrong with the punctuation of the program.\n", - "\n", + "you'll get a **syntax error**, which means that something is wrong with the structure of the program.\n", "Try it out in the next cell so you see what the error message looks like." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 59, "id": "postal-marking", "metadata": {}, "outputs": [], @@ -783,7 +802,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 60, "id": "legal-observer", "metadata": {}, "outputs": [], @@ -807,7 +826,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 61, "id": "pressing-belgium", "metadata": {}, "outputs": [], @@ -829,7 +848,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 62, "id": "inner-equivalent", "metadata": {}, "outputs": [], @@ -839,7 +858,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 63, "id": "nuclear-thirty", "metadata": {}, "outputs": [], @@ -849,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 64, "id": "available-steering", "metadata": {}, "outputs": [], @@ -867,7 +886,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 65, "id": "documentary-doctrine", "metadata": {}, "outputs": [], @@ -889,13 +908,13 @@ "id": "steady-chancellor", "metadata": {}, "source": [ - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", + "In this example, you should get a `DimensionalityError`, which indicates that you have violated a rule of dimensional analysis: you cannot add quantities with different dimensions.\n", "\n", "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", + "The last line usually tells you what type of error happened, and sometimes additional information, so you might want to start from the bottom and read up.\n", + "\n", + "The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", "\n", "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." ] @@ -910,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 66, "id": "greenhouse-reason", "metadata": {}, "outputs": [], @@ -948,7 +967,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 67, "id": "secure-crowd", "metadata": {}, "outputs": [], @@ -959,7 +978,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 68, "id": "thirty-minneapolis", "metadata": {}, "outputs": [], @@ -969,7 +988,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 69, "id": "premier-seeking", "metadata": {}, "outputs": [], @@ -979,7 +998,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 70, "id": "brave-laundry", "metadata": {}, "outputs": [], @@ -989,7 +1008,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 71, "id": "adjusted-consultation", "metadata": {}, "outputs": [], @@ -999,7 +1018,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 72, "id": "understanding-consortium", "metadata": {}, "outputs": [], @@ -1012,8 +1031,8 @@ "id": "composed-tunnel", "metadata": {}, "source": [ - "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that, when he threw a fastball, he was throwing the ball down; that is, the ball was leaving his hand at a downward angle.\n", - "I was skeptical; watching from the side, I thought the ball was leaving his hand at an upward angle.\n", + "**Exercise:** When I was in high school, the pitcher on the baseball team claimed that when he threw a fastball he was throwing the ball down; that is, the ball left his hand at a downward angle.\n", + "I was skeptical; watching from the side, I thought the ball left his hand at an upward angle.\n", "\n", "Can you think of a simple model you could use to settle the argument? What factors would you include and what could you ignore? What quantities would you have to look up or estimate?\n", "\n", @@ -1022,7 +1041,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "id": "about-complex", "metadata": {}, "outputs": [], @@ -1032,7 +1051,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "id": "unique-owner", "metadata": {}, "outputs": [], @@ -1042,7 +1061,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "id": "minus-batman", "metadata": {}, "outputs": [], @@ -1052,7 +1071,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "id": "exact-vegetable", "metadata": {}, "outputs": [], @@ -1062,7 +1081,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "id": "neutral-lightning", "metadata": {}, "outputs": [], @@ -1075,12 +1094,12 @@ "id": "jewish-secret", "metadata": {}, "source": [ - "**Exercise:** Suppose I run a 10K race in 44:52. What is my average page in minutes per mile?" + "**Exercise:** Suppose I run a 10K race in 44:52 (44 minutes and 52 seconds). What is my average page in minutes per mile?" ] }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 73, "id": "virgin-cambodia", "metadata": {}, "outputs": [], @@ -1092,7 +1111,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 74, "id": "right-intention", "metadata": {}, "outputs": [], @@ -1102,7 +1121,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 75, "id": "mineral-sally", "metadata": {}, "outputs": [], @@ -1112,8 +1131,8 @@ }, { "cell_type": "code", - "execution_count": 46, - "id": "preceding-cricket", + "execution_count": 81, + "id": "front-logistics", "metadata": {}, "outputs": [], "source": [ @@ -1122,18 +1141,19 @@ }, { "cell_type": "code", - "execution_count": 47, - "id": "effective-rendering", + "execution_count": 82, + "id": "preceding-cricket", "metadata": {}, "outputs": [], "source": [ - "# Solution goes here" + "pace_per_mile = pace_per_km.to(minute / mile)\n", + "pace_per_mile" ] }, { "cell_type": "code", - "execution_count": 48, - "id": "printable-reply", + "execution_count": 83, + "id": "effective-rendering", "metadata": {}, "outputs": [], "source": [ @@ -1141,18 +1161,22 @@ ] }, { - "cell_type": "markdown", - "id": "environmental-wallet", + "cell_type": "code", + "execution_count": 84, + "id": "printable-reply", "metadata": {}, + "outputs": [], "source": [ - "## More Jupyter" + "# Solution goes here" ] }, { "cell_type": "markdown", - "id": "quality-probe", + "id": "environmental-wallet", "metadata": {}, "source": [ + "## More Jupyter\n", + "\n", "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", "\n", "Try the following exercises:\n", @@ -1181,15 +1205,9 @@ "source": [ "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order." - ] - }, - { - "cell_type": "markdown", - "id": "suffering-intro", - "metadata": {}, - "source": [ - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." + "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", + "\n", + "Select \"Restart & Run All\" now and confirm that it runs all of the cells." ] }, { diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index dc5e9f80..d441523c 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "incorrect-comparison", "metadata": {}, "outputs": [], @@ -134,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "brief-diversity", "metadata": {}, "outputs": [], @@ -152,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "designed-brazilian", "metadata": {}, "outputs": [], @@ -170,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "impaired-potter", "metadata": {}, "outputs": [], @@ -190,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 8, "id": "basic-fabric", "metadata": {}, "outputs": [], @@ -203,7 +203,7 @@ "id": "delayed-ocean", "metadata": {}, "source": [ - "You don't have to use `show`, but I think it looks better.\n", + "You don't have to use `show`, but I think the results look better.\n", "\n", "We can update the state by assigning new values to the variables. \n", "For example, if a student moves a bike from Olin to Wellesley, we can figure out the new values and assign them:" @@ -211,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "floppy-trainer", "metadata": {}, "outputs": [], @@ -231,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "hungarian-bride", "metadata": {}, "outputs": [], @@ -255,14 +255,14 @@ "source": [ "## Defining functions\n", "\n", - "So far we have used functions defined in NumPy and ModSim. Now we're going to define our own function.\n", + "So far we have used functions defined in NumPy and the ModSim library. Now we're going to define our own functions.\n", "\n", "When you are developing code in Jupyter, it is often efficient to write a few lines of code, test them to confirm they do what you intend, and then use them to define a new function. For example, these lines move a bike from Olin to Wellesley:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "vertical-drawing", "metadata": {}, "outputs": [], @@ -282,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "significant-nutrition", "metadata": {}, "outputs": [], @@ -313,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "moving-jurisdiction", "metadata": {}, "outputs": [], @@ -333,12 +333,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "proper-symposium", "metadata": {}, "outputs": [], "source": [ - "bikeshare" + "show(bikeshare)" ] }, { @@ -352,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "identical-yacht", "metadata": {}, "outputs": [], @@ -365,10 +365,8 @@ "id": "premier-youth", "metadata": {}, "source": [ - "This result indicates that `bike_to_wellesley` is a function. You don't\n", - "have to know what `__main__` means, but if you see something like this,\n", - "it probably means that you looked up a function but you didn't actually\n", - "call it. So don't forget the parentheses." + "This result indicates that `bike_to_wellesley` is a function. You don't have to know what `__main__` means, but if you see something like this, it probably means that you named a function but didn't actually call it.\n", + "So don't forget the parentheses." ] }, { @@ -388,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "heavy-patrol", "metadata": {}, "outputs": [], @@ -409,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "french-preference", "metadata": {}, "outputs": [], @@ -423,14 +421,14 @@ "id": "original-hollywood", "metadata": {}, "source": [ - "When you call the `print` function, you can put a variable name in\n", + "When you call the `print` function, you can put a variable in\n", "parentheses, as in the previous example, or you can provide a sequence\n", "of variables separated by commas, like this:" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "alternative-keyboard", "metadata": {}, "outputs": [], @@ -453,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "robust-holly", "metadata": {}, "outputs": [], @@ -480,7 +478,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "fifteen-atmosphere", "metadata": {}, "outputs": [], @@ -501,7 +499,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "matched-narrow", "metadata": {}, "outputs": [], @@ -533,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 22, "id": "illegal-metropolitan", "metadata": {}, "outputs": [], @@ -551,20 +549,18 @@ "get `True` about 70 times and `False` about 30 times. But the results\n", "are random, so they might differ from these expectations.\n", "\n", - "`True` and `False` are special values defined by Python. Note that they\n", - "are not strings. There is a difference between `True`, which is a\n", - "special value, and `'True'`, which is a string.\n", - "\n", - "`True` and `False` are called **boolean** values because they are\n", + "`True` and `False` are special values defined by Python. \n", + "They are called **boolean** values because they are\n", "related to Boolean algebra ().\n", "\n", - "We can use boolean values to control the behavior of the program, using\n", - "an **if statement**:" + "Note that they are not strings. There is a difference between `True`, which is a boolean value, and `'True'`, which is a string.\n", + "\n", + "We can use boolean values to control the behavior of the program, using an **if statement**:" ] }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 23, "id": "excessive-murder", "metadata": {}, "outputs": [], @@ -591,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 24, "id": "fundamental-nursing", "metadata": {}, "outputs": [], @@ -607,15 +603,17 @@ "id": "recovered-chemical", "metadata": {}, "source": [ + "If you run the previous cell a few times, it should print `heads` about half the time, and `tails` about half the time.\n", + "\n", "Now we can use `flip` to simulate the arrival of students who want to\n", "borrow a bike. Suppose students arrive at the Olin station every 2\n", - "minutes, on average. In that case, the chance of an arrival during any\n", - "one-minute period is 50%, and we can simulate it like this:" + "minutes on average.\n", + "In that case, the chance of an arrival during any one-minute period is 50%, and we can simulate it like this:" ] }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 25, "id": "twenty-health", "metadata": {}, "outputs": [], @@ -636,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 26, "id": "played-character", "metadata": {}, "outputs": [], @@ -656,7 +654,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 27, "id": "ecological-colon", "metadata": {}, "outputs": [], @@ -679,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 28, "id": "mediterranean-german", "metadata": {}, "outputs": [], @@ -692,7 +690,7 @@ "id": "sought-mobile", "metadata": {}, "source": [ - "Even though there are no values in parentheses, we have to include them." + "Depending on the results from `flip`, this function might move a bike to Olin, or to Wellesley, or neither, or both." ] }, { @@ -703,16 +701,17 @@ "## Parameters\n", "\n", "The previous version of `step` is fine if the arrival probabilities\n", - "never change, but in reality, these probabilities vary over time.\n", + "never change, but in reality they vary over time.\n", "\n", - "So instead of putting the constant values 0.5 and 0.33 in `step` we can replace them with **parameters**. Parameters are variables whose values are set when a function is called.\n", + "So instead of putting the constant values 0.5 and 0.33 in `step`, we can replace them with **parameters**.\n", + "Parameters are variables whose values are set when a function is called.\n", "\n", "Here's a version of `step` that takes two parameters, `p1` and `p2`:" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 29, "id": "hollywood-shopping", "metadata": {}, "outputs": [], @@ -736,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 30, "id": "buried-alert", "metadata": {}, "outputs": [], @@ -757,7 +756,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "id": "recognized-denmark", "metadata": {}, "outputs": [], @@ -796,7 +795,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 32, "id": "polish-river", "metadata": {}, "outputs": [], @@ -818,13 +817,13 @@ "- The words `for` and `in` are special words we have to use in a for\n", " loop.\n", "\n", - "- `range` is a Python function we're using here to control the number of times the loop runs.\n", + "- `range` is a Python function we use to control the number of times the loop runs.\n", "\n", "- `i` is a **loop variable** that gets created when the for loop runs.\n", "\n", "When this loop runs, it runs the statements inside the loop three times. The first time, the value of `i` is `0`; the second time, it is `1`; the third time, it is `2`.\n", "\n", - "Each time through the loop, it prints the value of `i` and moves one bike Olin to Wellesley." + "Each time through the loop, it prints the value of `i` and moves one bike to Wellesley." ] }, { @@ -832,25 +831,19 @@ "id": "breeding-groove", "metadata": {}, "source": [ - "## TimeSeries" - ] - }, - { - "cell_type": "markdown", - "id": "flexible-projection", - "metadata": {}, - "source": [ + "## TimeSeries\n", + "\n", "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", "corresponding sequence of quantities.\n", "\n", - "In this example, the time stamps are integers representing minutes, and the quantities are the number of bikes at one location.\n", + "In this example, the time stamps are integers representing minutes and the quantities are the number of bikes at one location.\n", "\n", "Since we have moved a number of bikes around, let's start again with a new `State` object." ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 33, "id": "every-consultation", "metadata": {}, "outputs": [], @@ -868,7 +861,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 34, "id": "changing-planet", "metadata": {}, "outputs": [], @@ -886,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 35, "id": "aquatic-richardson", "metadata": {}, "outputs": [], @@ -906,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 36, "id": "english-titanium", "metadata": {}, "outputs": [], @@ -937,12 +930,12 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 37, "id": "indonesian-singing", "metadata": {}, "outputs": [], "source": [ - "results" + "show(results)" ] }, { @@ -950,21 +943,7 @@ "id": "small-encoding", "metadata": {}, "source": [ - "The left column is the time stamps; the right column is the quantities (which might be negative, depending on the state of the system).\n", - "\n", - "At the bottom, `dtype` is the type of the data in the `TimeSeries`; you can ignore this for now.\n", - "\n", - "The `show` function displays a `TimeSeries` as a table:" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "id": "verbal-bikini", - "metadata": {}, - "outputs": [], - "source": [ - "show(results)" + "The left column is the time stamps; the right column is the quantities." ] }, { @@ -980,7 +959,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 38, "id": "saved-hands", "metadata": {}, "outputs": [], @@ -992,6 +971,15 @@ " ylabel='Number of bikes')" ] }, + { + "cell_type": "markdown", + "id": "egyptian-korea", + "metadata": {}, + "source": [ + "The result should be a plot with time on the $x$-axis and the number of bikes on the $y$-axis.\n", + "Since we only ran three time steps, it might not be very interesting." + ] + }, { "cell_type": "markdown", "id": "limited-interstate", @@ -1003,7 +991,7 @@ "\n", "We used a `State` object to represent the state of the system.\n", "Then we used the `flip` function and an `if` statement to simulate a single time step.\n", - "We used `for` loop to simulate a series of steps, and a `TimeSeries` to record the results.\n", + "We used a `for` loop to simulate a series of steps, and a `TimeSeries` to record the results.\n", "Finally, we used `plot` and `decorate` to plot the results.\n", "\n", "In the next chapter, we will extend this simulation to make it a little more realistic." @@ -1029,7 +1017,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 39, "id": "helpful-zambia", "metadata": {}, "outputs": [], @@ -1049,7 +1037,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 40, "id": "beneficial-mainland", "metadata": {}, "outputs": [], @@ -1080,12 +1068,12 @@ "\n", "1. Create a `State` object with the initial state of the system.\n", "\n", - "2. Call `run_simulation` with appropriate parameters." + "2. Call `run_simulation` with parameters `p1=0.3`, `p2=0.2`, and `num_steps=60`." ] }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 41, "id": "former-frost", "metadata": {}, "outputs": [], @@ -1095,7 +1083,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 42, "id": "spare-honduras", "metadata": {}, "outputs": [], @@ -1112,7 +1100,8 @@ "\n", "This section contains additional information about the functions we've used and pointers to their documentation.\n", "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." + "You don't need to know anything in this section, so if you are already feeling overwhelmed, you might want to skip it.\n", + "But if you are curious, read on." ] }, { @@ -1157,7 +1146,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 43, "id": "agricultural-midwest", "metadata": {}, "outputs": [], diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 794b0d43..1132a70d 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -156,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 4, "id": "embedded-heavy", "metadata": {}, "outputs": [], @@ -182,7 +182,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 5, "id": "unusual-advancement", "metadata": {}, "outputs": [], @@ -197,9 +197,8 @@ "id": "serial-mortality", "metadata": {}, "source": [ - "The name of the parameter is `state` rather than `bikeshare` as a\n", - "reminder that the value of `state` could be any `State` object, not just\n", - "`bikeshare`.\n", + "The name of the parameter is `state`, rather than `bikeshare`, as a\n", + "reminder that the value of `state` could be any `State` object, not just the one we called `bikeshare`.\n", "\n", "This version of `bike_to_wellesley` requires a `State` object as a\n", "parameter, so we have to provide one when we call it:" @@ -207,13 +206,11 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 6, "id": "packed-hungarian", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "bikeshare = State(olin=10, wellesley=2)\n", "bike_to_wellesley(bikeshare)" ] @@ -237,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 7, "id": "right-assessment", "metadata": {}, "outputs": [], @@ -256,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 8, "id": "cleared-advocacy", "metadata": {}, "outputs": [], @@ -283,13 +280,14 @@ "## Documentation\n", "\n", "Another problem with the code we have so far is that it contains no\n", - "**documentation**. Documentation is text we add to a program to help\n", + "**documentation**.\n", + "Documentation is text we add to a program to help\n", "other programmers read and understand it. It has no effect on the\n", "program when it runs.\n", "\n", - "There are two forms of documentation, **docstrings** and **comments**:\n", + "There are two kinds of documentation, **docstrings** and **comments**:\n", "\n", - "* A docstring is a string in triple-quotes that appears at the beginning of a function.\n", + "* A docstring is a string in triple quotes that appears at the beginning of a function.\n", "\n", "* A comment is a line of text that begins with a hash symbol, `#`.\n", "\n", @@ -298,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 9, "id": "moral-parallel", "metadata": {}, "outputs": [], @@ -309,7 +307,7 @@ " state: bikeshare State object\n", " \"\"\"\n", " # We decrease one state variable and increase the\n", - " # other, so the total number of bikes is unchanged.\n", + " # other so the total number of bikes is unchanged.\n", " state.wellesley -= 1\n", " state.olin += 1" ] @@ -339,16 +337,17 @@ "## Negative bikes\n", "\n", "The changes we've made so far improve the quality of the code, but we\n", - "haven't done anything to improve the quality of the model yet. Let's do that now.\n", + "haven't done anything to improve the quality of the model. Let's do that now.\n", "\n", "Currently the simulation does not check whether a bike is available when a customer arrives, so the number of bikes at a location can be\n", - "negative. That's not very realistic. Here's a version of\n", - "`bike_to_olin` that fixes the problem:" + "negative. That's not very realistic.\n", + "\n", + "Here's a version of `bike_to_olin` that fixes the problem:" ] }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 10, "id": "divine-leisure", "metadata": {}, "outputs": [], @@ -372,7 +371,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 11, "id": "choice-cooking", "metadata": {}, "outputs": [], @@ -391,12 +390,12 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 12, "id": "twelve-moderator", "metadata": {}, "outputs": [], "source": [ - "bikeshare" + "show(bikeshare)" ] }, { @@ -414,14 +413,14 @@ "source": [ "## Comparison operators\n", "\n", - "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True` if they are equal and `False` otherwise.\n", + "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True`, if they are equal, and `False` otherwise.\n", "\n", - "It is easy to confuse the equals operators with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." + "It is easy to confuse the equals operator with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 13, "id": "level-burns", "metadata": {}, "outputs": [], @@ -440,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 14, "id": "civic-remains", "metadata": {}, "outputs": [], @@ -458,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 15, "id": "affecting-naples", "metadata": {}, "outputs": [], @@ -515,19 +514,16 @@ "system will work, or to design a system that works better. First, we\n", "have to decide what we mean by \"how well\" and \"better\".\n", "\n", - "From the customer's point of view, we might like to know the probability of finding an available bike. From the system-owner's point of view, we\n", - "might want to minimize the number of customers who don't get a bike when\n", - "they want one, or maximize the number of bikes in use. Statistics like\n", - "these that quantify how well the system works are called **metrics**.\n", + "From the customer's point of view, we might like to know the probability of finding an available bike. From the system-owner's point of view, we might want to minimize the number of customers who don't get a bike when they want one, or maximize the number of bikes in use. Statistics like these that quantify how well the system works are called **metrics**.\n", "\n", - "As a simple example, let's measure the number of unhappy customers.\n", + "As an example, let's measure the number of unhappy customers.\n", "Here's a version of `bike_to_olin` that keeps track of the number of\n", "customers who arrive at a station with no bikes:" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 16, "id": "arbitrary-ferry", "metadata": {}, "outputs": [], @@ -555,7 +551,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 17, "id": "cardiovascular-montgomery", "metadata": {}, "outputs": [], @@ -574,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 18, "id": "cosmetic-above", "metadata": { "scrolled": true @@ -589,17 +585,17 @@ "id": "pleased-gasoline", "metadata": {}, "source": [ - "There should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." + "After this update, there should be 12 bikes at Olin, no bikes at Wellesley, and one unhappy customer." ] }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 19, "id": "bulgarian-palestine", "metadata": {}, "outputs": [], "source": [ - "bikeshare" + "show(bikeshare)" ] }, { @@ -648,13 +644,11 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 20, "id": "wrong-internet", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "def run_simulation(state, p1, p2, num_steps):\n", " \"\"\"Simulate the given number of time steps.\n", " \n", @@ -678,13 +672,13 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 21, "id": "instrumental-copyright", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "\n", - "\n", "def step(state, p1, p2):\n", " \"\"\"Simulate one time step.\n", " \n", @@ -701,9 +695,11 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 22, "id": "improved-renaissance", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "def bike_to_olin(state):\n", @@ -720,7 +716,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 23, "id": "unavailable-maker", "metadata": {}, "outputs": [], @@ -746,9 +742,11 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 24, "id": "phantom-carter", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# Solution goes here" @@ -756,7 +754,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 25, "id": "adopted-contrary", "metadata": {}, "outputs": [], @@ -766,7 +764,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 26, "id": "comparable-natural", "metadata": {}, "outputs": [], @@ -776,7 +774,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 27, "id": "attractive-amendment", "metadata": {}, "outputs": [], @@ -789,31 +787,35 @@ "id": "possible-initial", "metadata": {}, "source": [ - "**Exercise:** Now run the simulation a few times and confirm that the number of bikes is never negative. What's the final state of the system?" + "**Exercise:** Now run the simulation with parameters `p1=0.3`, `p2=0.2`, and `num_steps=60`, and confirm that the number of bikes is never negative.\n", + "\n", + "Start with this initial state:" ] }, { "cell_type": "code", - "execution_count": 87, - "id": "immune-shock", + "execution_count": 28, + "id": "eleven-constraint", "metadata": {}, "outputs": [], "source": [ - "# Solution goes here" + "bikeshare = State(olin=10, wellesley=2,\n", + " olin_empty=0, wellesley_empty=0)" ] }, { "cell_type": "code", - "execution_count": 88, - "id": "sporting-collectible", + "execution_count": 29, + "id": "immune-shock", "metadata": {}, "outputs": [], "source": [ - "bikeshare" + "# Solution goes here" ] } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index da973561..f32e2a55 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -80,70 +80,36 @@ { "cell_type": "markdown", "id": "caring-gnome", - "metadata": {}, - "source": [ - "Here the code from previous chapters we'll reuse." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "stylish-raising", - "metadata": {}, - "outputs": [], + "metadata": { + "tags": [] + }, "source": [ - "\n", - "\n", - "def step(state, p1, p2):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley ride\n", - " p2: probability of a Wellesley->Olin ride\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)" + "The following cells download the code from Chapter 3 and import the `step` function we defined." ] }, { "cell_type": "code", - "execution_count": 3, - "id": "wound-bottle", - "metadata": {}, + "execution_count": 4, + "id": "ranking-today", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/chap03.py')" ] }, { "cell_type": "code", - "execution_count": 4, - "id": "prescribed-affect", - "metadata": {}, + "execution_count": 5, + "id": "stylish-raising", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1" + "from chap03 import step" ] }, { @@ -151,7 +117,8 @@ "id": "atlantic-collectible", "metadata": {}, "source": [ - "In the previous chapter we defined metrics that quantify the performance of bike sharing this system. In this chapter we see how those metrics depend on the parameters of the system, like the Customer rate of customers at bike stations.\n", + "In the previous chapter we defined metrics that quantify the performance of a bike sharing system.\n", + "In this chapter we'll see how those metrics depend on the parameters of the system, like the arrival rate of customers at the stations.\n", "\n", "We also discuss a program development strategy, called incremental\n", "development, that might help you write programs faster and spend less\n", @@ -165,12 +132,13 @@ "source": [ "## Functions that return values\n", "\n", - "We have seen several functions that return values; for example, when you run `sqrt`, it returns a number you can assign to a variable." + "We have used several functions that return values.\n", + "For example, when you run `sqrt`, it returns a number you can assign to a variable." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "imposed-pregnancy", "metadata": {}, "outputs": [], @@ -186,18 +154,16 @@ "id": "unsigned-recipe", "metadata": {}, "source": [ - "When you run `State`, it returns a new `State` object:" + "And when you run `State`, it returns a new `State` object:" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "accessible-wallace", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "bikeshare = State(olin=10, wellesley=2)\n", "bikeshare" ] @@ -215,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "minimal-supervisor", "metadata": {}, "outputs": [], @@ -236,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "warming-program", "metadata": {}, "outputs": [], @@ -256,13 +222,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "sitting-cleveland", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "def run_simulation(p1, p2, num_steps):\n", " state = State(olin=10, wellesley=2,\n", " olin_empty=0, wellesley_empty=0)\n", @@ -283,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "difficult-shepherd", "metadata": {}, "outputs": [], @@ -301,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "tough-sweet", "metadata": {}, "outputs": [], @@ -319,7 +283,7 @@ "These five values are **parameters of the model**, which are quantities that determine the behavior of the system.\n", "\n", "It is easy to get the parameters of a model confused with the parameters of a function. \n", - "In fact, it is common for the parameters of the model to appear as parameters in functions. \n", + "It is especially easy because the parameters of a model often appear as parameters of a function.\n", "\n", "For example, the previous version of `run_simulation` takes `p1`, `p2`, and `num_steps` as parameters.\n", "So we can call `run_simulation` with different parameters and see how\n", @@ -341,7 +305,7 @@ " step(state, p1, p2)\n", "```\n", "\n", - "In this example, `range` creates a sequence of numbers from 0 to `num_steps` (including `0` but not `num_steps`). \n", + "In this example, `range` creates a sequence of numbers from `0` to `num_steps` (including `0` but not `num_steps`). \n", "Each time through the loop, the next number in the sequence gets assigned to the loop variable, `i`.\n", "\n", "But `range` only works with integers; to get a sequence of non-integer\n", @@ -350,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "bound-juice", "metadata": {}, "outputs": [], @@ -378,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "commercial-methodology", "metadata": {}, "outputs": [], @@ -402,6 +366,8 @@ "\n", "4. Runs the body of the loop, which prints `p1`.\n", "\n", + "5. ...\n", + "\n", "And so on, until it gets to the end of the array. This will come in handy in the next section." ] }, @@ -428,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "working-chair", "metadata": {}, "outputs": [], @@ -460,13 +426,11 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "instrumental-session", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "sweep = SweepSeries()" ] }, @@ -480,11 +444,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "hollywood-technical", "metadata": {}, "outputs": [], "source": [ + "p1_array = linspace(0, 0.6, 31)\n", + "\n", "for p1 in p1_array:\n", " final_state = run_simulation(p1, p2, num_steps)\n", " sweep[p1] = final_state.olin_empty" @@ -492,57 +458,68 @@ }, { "cell_type": "markdown", - "id": "instructional-showcase", + "id": "healthy-prime", "metadata": {}, "source": [ "The result is a `SweepSeries` that maps from each value of `p1` to the\n", - "resulting number of unhappy customers. Then we can plot the results:" + "resulting number of unhappy customers." + ] + }, + { + "cell_type": "markdown", + "id": "driven-theme", + "metadata": { + "tags": [] + }, + "source": [ + "We can display the results like this:" ] }, { "cell_type": "code", - "execution_count": 49, - "id": "hollywood-spirit", - "metadata": {}, + "execution_count": 18, + "id": "recovered-buffalo", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "\n", - "\n", - "sweep.plot(label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Customer rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" + "show(sweep)" ] }, { "cell_type": "markdown", - "id": "intense-start", + "id": "instructional-showcase", "metadata": {}, "source": [ - "NumPy provides functions that compute a variety of summary statistics, like `mean`, `median`, and `std` (which computes standard deviation).\n", - "\n", - "We can use `mean` to compute the average of the values in a series, like this:" + "We can plot the results like this:" ] }, { "cell_type": "code", - "execution_count": 18, - "id": "contemporary-enough", + "execution_count": 19, + "id": "hollywood-spirit", "metadata": {}, "outputs": [], "source": [ - "from numpy import mean\n", + "sweep.plot(label='Olin', color='C1')\n", "\n", - "mean(sweep)" + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Customer rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers at Olin')" ] }, { "cell_type": "markdown", - "id": "owned-senior", + "id": "educated-bloom", "metadata": {}, "source": [ - "In this example, computing the mean might not be useful, but in the exercises below, it will be." + "I use the keyword argument `color='C1'` to specify the color of the line.\n", + "The `TimeSeries` we have plotted so far use the default color, `C0`, which is blue.\n", + "I want a different color for `SweepSeries` to remind us that it is not a `TimeSeries`.\n", + "\n", + "When the arrival rate at Olin is low, there are plenty of bikes and no unhappy customers.\n", + "As the arrival rate increases, we are more likely to run out of bikes and the number of unhappy customers increases." ] }, { @@ -553,7 +530,7 @@ "## Incremental development\n", "\n", "When you start writing programs that are more than a few lines, you\n", - "might find yourself spending more and more time debugging. The more code you write before you start debugging, the harder it is to find the problem.\n", + "might find yourself spending more time debugging. The more code you write before you start debugging, the harder it is to find the problem.\n", "\n", "**Incremental development** is a way of programming that tries to\n", "minimize the pain of debugging. The fundamental steps are:\n", @@ -570,7 +547,7 @@ " check it by performing another computation.\n", "\n", "3. Run the program and see if the change worked. If so, go back to\n", - " Step 2. If not, you will have to do some debugging, but if the\n", + " Step 2. If not, you have to do some debugging, but if the\n", " change you made was small, it shouldn't take long to find the\n", " problem.\n", "\n", @@ -597,7 +574,17 @@ "id": "nominated-assault", "metadata": {}, "source": [ - "## Summary" + "## Summary\n", + "\n", + "This chapter introduces functions that return values, which we use to write a version of `run_simulation` that returns a `State` object with the final state of the system.\n", + "\n", + "It also introduces `linspace`, which we use to create a NumPy array, and `SweepSeries`, which we use to store the results of a parameter sweep.\n", + "\n", + "We used a parameter sweep to explore the relationship between one of the parameters, `p1`, and the number of unhappy customers, which is a metric that quantifies how well (or badly) the system works.\n", + "\n", + "In the exercises, you'll have a chance to sweep other parameters and compute other metrics.\n", + "\n", + "In the next chapter, we'll move on to a new problem, modeling and predicting world population growth." ] }, { @@ -620,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "reflected-freedom", "metadata": {}, "outputs": [], @@ -630,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "north-formation", "metadata": {}, "outputs": [], @@ -643,13 +630,12 @@ "id": "robust-blair", "metadata": {}, "source": [ - "**Exercise:** Read the documentation of `linspace` at <>.\n", - "Then use it to make an array of 101 equally spaced points between 0 and 1 (including both)." + "**Exercise:** Read the documentation of `linspace` at . Then use it to make an array of 101 equally spaced points between 0 and 1 (including both)." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "collected-butter", "metadata": {}, "outputs": [], @@ -669,7 +655,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "authorized-sarah", "metadata": {}, "outputs": [], @@ -679,7 +665,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "romance-wisdom", "metadata": {}, "outputs": [], @@ -697,7 +683,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "norman-banana", "metadata": {}, "outputs": [], @@ -707,7 +693,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "mexican-robert", "metadata": {}, "outputs": [], @@ -733,7 +719,6 @@ "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", "\n", "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", "`num_runs` specifies how many times it should call `run_simulation`.\n", "\n", "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`.\n", @@ -753,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 27, "id": "accredited-salmon", "metadata": {}, "outputs": [], @@ -763,7 +748,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 28, "id": "visible-allowance", "metadata": {}, "outputs": [], @@ -773,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 29, "id": "spatial-fundamentals", "metadata": {}, "outputs": [], @@ -801,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 30, "id": "reverse-emphasis", "metadata": { "scrolled": true @@ -813,7 +798,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 32, "id": "broad-latitude", "metadata": { "scrolled": true @@ -823,16 +808,41 @@ "# Solution goes here" ] }, + { + "cell_type": "markdown", + "id": "biblical-federal", + "metadata": {}, + "source": [ + "## Under the Hood\n", + "\n", + "The object you get when you call `SweepSeries` is actually a Pandas `Series`, the same as the object you get from `TimeSeries`.\n", + "I give them different names to help us remember that they play different roles.\n", + "\n", + "`Series` provides a number of functions, which you can read about at .\n", + "\n", + "They include `mean`, which computes the average of the values in the `Series`, so if you have a `Series` named `totals`, for example, you can compute the mean like this:\n", + "\n", + "```\n", + " totals.mean()\n", + "```\n", + "\n", + "`Series` provides other statistical functions, like `std`, which computes the standard deviation of the values in the series.\n", + "\n", + "In this chapter I use the keyword argument `color` to specify the color of a line plot.\n", + "You can read about the other available colors at ." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "powerful-planner", + "id": "federal-cemetery", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -848,7 +858,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, From 3e2d30840ae5c6a2a5381fdc7da8f9122ed5de59 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 15 Feb 2021 13:29:54 -0500 Subject: [PATCH 039/144] Updating chapters --- chapters/chap05.ipynb | 10 -- chapters/chap06.ipynb | 157 +++++++++++------------ chapters/chap07.ipynb | 241 +++++++++++++++++++---------------- chapters/chap08.ipynb | 288 +++++++++++++++++++++--------------------- chapters/chap09.ipynb | 248 ++++++++++++++++++++++-------------- chapters/chap10.ipynb | 8 +- 6 files changed, 500 insertions(+), 452 deletions(-) diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index b028809e..b9ceafd6 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -824,8 +824,6 @@ "id": "automated-albany", "metadata": {}, "source": [ - "The keyword argument `color='gray'` specifies the color of the line. For details on color specification see .\n", - "\n", "From 1950 to 1990, the model does not fit the data particularly well, but after that, it's pretty good." ] }, @@ -946,14 +944,6 @@ "source": [ "# Solution goes here" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "improved-sigma", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index 0c18a0ac..08e9df6a 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -79,49 +79,39 @@ }, { "cell_type": "markdown", - "id": "quality-spectrum", - "metadata": {}, - "source": [ - "In the previous chapter we simulated a model of world population with\n", - "constant growth. In this chapter we see if we can make a better model\n", - "with growth proportional to the population.\n", - "\n", - "But first, we'll improve the code from the previous chapter by\n", - "encapsulating it in a function and using `System` objects." - ] - }, - { - "cell_type": "markdown", - "id": "ranking-tamil", - "metadata": {}, + "id": "amber-contrary", + "metadata": { + "tags": [] + }, "source": [ - "Here's the code that reads the data." + "Here's the data from the previous chapter again." ] }, { "cell_type": "code", - "execution_count": 2, - "id": "annoying-herald", - "metadata": {}, + "execution_count": 7, + "id": "critical-addition", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "shared-offense", - "metadata": {}, + "execution_count": 8, + "id": "naughty-swing", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from pandas import read_html\n", "\n", + "filename = 'World_population_estimates.html'\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "table2 = tables[2]\n", "table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -129,6 +119,19 @@ " 'thomlinson', 'durand', 'clark']" ] }, + { + "cell_type": "markdown", + "id": "quality-spectrum", + "metadata": {}, + "source": [ + "In the previous chapter we simulated a model of world population with\n", + "constant growth. In this chapter we see if we can make a better model\n", + "with growth proportional to the population.\n", + "\n", + "But first, we'll improve the code from the previous chapter by\n", + "encapsulating it in a function and adding a new feature, a `System` object." + ] + }, { "cell_type": "markdown", "id": "therapeutic-merchant", @@ -146,8 +149,7 @@ "For example, in the bike share model, state variables include the number of bikes at each location, which get updated whenever a customer moves a bike. System parameters include the number of locations, total number of bikes, and arrival rates at each location.\n", "\n", "In the population model, the only state variable is the population.\n", - "System parameters include the annual growth rate, the initial time and\n", - "population, and the end time.\n", + "System parameters include the annual growth rate, the initial population, and the start and end times.\n", "\n", "Suppose we have the following variables, as computed in the previous\n", "chapter (assuming `table2` is the `DataFrame` we read from the file):" @@ -155,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 10, "id": "numerous-university", "metadata": {}, "outputs": [], @@ -180,18 +182,16 @@ "metadata": {}, "source": [ "Some of these are parameters we need to simulate the system; others are temporary values we can discard. \n", - "To distinguish between them, we'll put the parameters we need into a `System` object like this:" + "To distinguish between them, we'll put the parameters we need in a `System` object like this:" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "id": "colonial-domestic", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "system = System(t_0=t_0, \n", " t_end=t_end,\n", " p_0=p_0,\n", @@ -211,12 +211,12 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "id": "floral-routine", "metadata": {}, "outputs": [], "source": [ - "system" + "show(system)" ] }, { @@ -229,13 +229,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 14, "id": "pacific-challenge", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "def run_simulation1(system):\n", " results = TimeSeries()\n", " results[system.t_0] = system.p_0\n", @@ -248,30 +246,19 @@ }, { "cell_type": "markdown", - "id": "technological-medicine", + "id": "rough-strain", "metadata": {}, "source": [ "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", "\n", - "Inside the loop, it stores the results in a `TimeSeries` which it returns at the end.\n", - "\n", - "The following function plots the results along with the estimates\n", - "`census` and `un`:" - ] - }, - { - "cell_type": "markdown", - "id": "grateful-terror", - "metadata": {}, - "source": [ - "\n", + "It simulates population growth over time and returns the results in a `TimeSeries`.\n", "\n", "Here's how we call it." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 17, "id": "electoral-breach", "metadata": {}, "outputs": [], @@ -289,13 +276,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "id": "peripheral-cassette", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "def plot_estimates():\n", " census.plot(style=':', label='US Census')\n", " un.plot(style='--', label='UN DESA')\n", @@ -313,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 19, "id": "capable-diana", "metadata": {}, "outputs": [], @@ -353,7 +338,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 20, "id": "laughing-wesley", "metadata": {}, "outputs": [], @@ -375,15 +360,17 @@ "id": "educated-portugal", "metadata": {}, "source": [ - "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", + "Each time through the loop, we use the parameter `birth_rate` to compute the number of births, and `death_rate` to compute the number of deaths.\n", + "The rest of the function is the same as `run_simulation1`.\n", "\n", + "Now we can choose the values of `birth_rate` and `death_rate` that best fit the data. \n", "For the death rate, I'll use 7.7 deaths per 1000 people, which was roughly the global death rate in 2020 (see ).\n", "I chose the birth rate by hand to fit the data." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 21, "id": "wired-brief", "metadata": {}, "outputs": [], @@ -402,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 22, "id": "looking-trace", "metadata": {}, "outputs": [], @@ -439,17 +426,17 @@ "`run_simulation1` and `run_simulation2` are nearly identical except for the body of the `for` loop, where we compute the population for the next year.\n", "\n", "Rather than repeat identical code, we can separate the things that\n", - "change from the things that don't. First, I'll pull out the update code from `run_simulation2` and make it a function:" + "change from the things that don't. First, I'll pull out the births and deaths from `run_simulation2` and make a function:" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 23, "id": "handmade-permit", "metadata": {}, "outputs": [], "source": [ - "def growth_func1(pop, t, system):\n", + "def growth_func1(t, pop, system):\n", " births = system.birth_rate * pop\n", " deaths = system.death_rate * pop\n", " return births - deaths" @@ -460,19 +447,20 @@ "id": "fabulous-bankruptcy", "metadata": {}, "source": [ - "This function takes as arguments the current population, current year,\n", - "and a `System` object; it returns the net population growth during the current year.\n", + "`growth_func1` takes as arguments the current year, current population, and a `System` object; it returns the net population growth during the current year.\n", "\n", - "This update function does not use `t`, so we could leave it out. But we will see other functions that need it, and it is convenient if they all take the same parameters, used or not.\n", + "This function does not use `t`, so we could leave it out. But we will see other growth functions that need it, and it is convenient if they all take the same parameters, used or not.\n", "\n", "Now we can write a function that runs any model:" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 24, "id": "civilian-accused", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "def run_simulation(system, growth_func):\n", @@ -480,7 +468,7 @@ " results[system.t_0] = system.p_0\n", " \n", " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", + " growth = growth_func(t, results[t], system)\n", " results[t+1] = results[t] + growth\n", " \n", " return results" @@ -501,7 +489,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 25, "id": "wicked-seeking", "metadata": {}, "outputs": [], @@ -517,7 +505,7 @@ "Passing a function as an argument is the same as passing any other\n", "value. The argument, which is `growth_func1` in this example, gets\n", "assigned to the parameter, which is called `growth_func`. Inside\n", - "`run_simulation`, we can run `growth_func` just like any other function.\n", + "`run_simulation`, we can call `growth_func` just like any other function.\n", "\n", "Each time through the loop, `run_simulation` calls `growth_func1` to compute net growth, and uses it to compute the population during the next year." ] @@ -535,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 26, "id": "impressive-model", "metadata": {}, "outputs": [], @@ -556,12 +544,12 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 27, "id": "familiar-helena", "metadata": {}, "outputs": [], "source": [ - "def growth_func2(pop, t, system):\n", + "def growth_func2(t, pop, system):\n", " return system.alpha * pop" ] }, @@ -575,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 28, "id": "independent-effectiveness", "metadata": {}, "outputs": [], @@ -621,14 +609,14 @@ "source": [ "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use.\n", + "Write an update function that takes `t`, `pop`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use.\n", "\n", "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 29, "id": "minus-recommendation", "metadata": { "scrolled": false @@ -640,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 30, "id": "headed-amsterdam", "metadata": {}, "outputs": [], @@ -650,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 31, "id": "preliminary-carnival", "metadata": {}, "outputs": [], @@ -678,6 +666,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index 40678cf7..f5859ad3 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -79,54 +79,39 @@ }, { "cell_type": "markdown", - "id": "indie-scoop", - "metadata": {}, - "source": [ - "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", - "\n", - "There are a few things we could try to improve the model:\n", - "\n", - "- Maybe net growth depends on the current population, but the\n", - " relationship is quadratic, not linear.\n", - "\n", - "- Maybe the net growth rate varies over time.\n", - "\n", - "In this chapter, we'll explore the first option.\n", - "In the exercises, you will have a chance to try the second. " - ] - }, - { - "cell_type": "markdown", - "id": "qualified-houston", - "metadata": {}, + "id": "straight-algeria", + "metadata": { + "tags": [] + }, "source": [ - "Here's the code that reads the data." + "Here's the data from the previous chapter again." ] }, { "cell_type": "code", - "execution_count": 2, - "id": "major-arkansas", - "metadata": {}, + "execution_count": 4, + "id": "square-trademark", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "intense-columbus", - "metadata": {}, + "execution_count": 5, + "id": "arctic-toilet", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from pandas import read_html\n", "\n", + "filename = 'World_population_estimates.html'\n", "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", "table2 = tables[2]\n", "table2.columns = ['census', 'prb', 'un', 'maddison', \n", @@ -136,9 +121,11 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "wound-necklace", - "metadata": {}, + "execution_count": 6, + "id": "protective-pipeline", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "un = table2.un / 1e9\n", @@ -147,53 +134,48 @@ }, { "cell_type": "markdown", - "id": "intended-matrix", - "metadata": {}, + "id": "informational-hungary", + "metadata": { + "tags": [] + }, "source": [ "And here are the functions from the previous chapter." ] }, { "cell_type": "code", - "execution_count": 5, - "id": "former-accuracy", - "metadata": {}, + "execution_count": 7, + "id": "associate-novel", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ + "from chap06 import run_simulation\n", "\n", - "\n", - "def run_simulation(system, growth_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " growth_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", - " results[t+1] = results[t] + growth\n", - " \n", - " return results" + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)') " ] }, { - "cell_type": "code", - "execution_count": 6, - "id": "duplicate-insert", + "cell_type": "markdown", + "id": "indie-scoop", "metadata": {}, - "outputs": [], "source": [ + "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", "\n", + "There are a few things we could try to improve the model:\n", "\n", - "def plot_estimates():\n", - " census.plot(style=':', label='US Census')\n", - " un.plot(style='--', label='UN DESA')\n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)')" + "- Maybe net growth depends on the current population, but the\n", + " relationship is quadratic, not linear.\n", + "\n", + "- Maybe the net growth rate varies over time.\n", + "\n", + "In this chapter, we'll explore the first option.\n", + "In the exercises, you will have a chance to try the second. " ] }, { @@ -220,12 +202,12 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "sized-hawaiian", "metadata": {}, "outputs": [], "source": [ - "def growth_func_quad(pop, t, system):\n", + "def growth_func_quad(t, pop, system):\n", " return system.alpha * pop + system.beta * pop**2" ] }, @@ -239,13 +221,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "interstate-canal", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "t_0 = census.index[0]\n", "p_0 = census[t_0]\n", "t_end = census.index[-1]\n", @@ -266,7 +246,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "banned-dallas", "metadata": {}, "outputs": [], @@ -285,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "positive-scheme", "metadata": {}, "outputs": [], @@ -303,7 +283,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "flush-fellowship", "metadata": {}, "outputs": [], @@ -348,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "excited-catch", "metadata": {}, "outputs": [], @@ -368,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "classical-badge", "metadata": {}, "outputs": [], @@ -382,17 +362,17 @@ "id": "quantitative-differential", "metadata": {}, "source": [ - "To plot the growth rate versus population, we can import the `plot` function from Matplotlib:" + "In order to plot growth rate versus population, we'll use `make_series` to make a Pandas `Series`." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "interim-consent", "metadata": {}, "outputs": [], "source": [ - "from matplotlib.pyplot import plot" + "growth_series = make_series(pop_array, growth_array)" ] }, { @@ -400,17 +380,18 @@ "id": "published-average", "metadata": {}, "source": [ - "And use it like this." + "Which we can plot like this:" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "received-crossing", "metadata": {}, "outputs": [], "source": [ - "plot(pop_array, growth_array, label='growth')\n", + "growth_series.plot(label='growth')\n", + "\n", "\n", "decorate(xlabel='Population (billions)',\n", " ylabel='Net growth (billions)',\n", @@ -466,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "lightweight-entrepreneur", "metadata": {}, "outputs": [], @@ -489,9 +470,9 @@ "This is the same model; it's just a different way to **parameterize** it. Given $\\alpha$ and $\\beta$, we can compute $r=\\alpha$ and $K=-\\alpha/\\beta$.\n", "\n", "In this version, it is easier to interpret the parameters: $r$ is the\n", - "maximum growth rate, observed when $p$ is small, and $K$ is the\n", - "equilibrium point. $K$ is also called the **carrying capacity**, since\n", - "it indicates the maximum population the environment can sustain." + "unconstrained growth rate, observed when $p$ is small, and $K$ is the\n", + "equilibrium point. \n", + "$K$ is also called the **carrying capacity**, since it indicates the maximum population the environment can sustain." ] }, { @@ -529,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "lucky-insurance", "metadata": {}, "outputs": [], @@ -556,14 +537,12 @@ "id": "transparent-cotton", "metadata": {}, "source": [ - "Dysfunction \\#1: Not using parameters. In the following version, the\n", - "function doesn't take any parameters; when `sys1` appears inside the\n", - "function, it refers to the object we create outside the function." + "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we create outside the function." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "aggregate-baker", "metadata": {}, "outputs": [], @@ -582,7 +561,7 @@ "id": "otherwise-belarus", "metadata": {}, "source": [ - "This version actually works, but it is not as versatile as it could be.\n", + "This version works, but it is not as versatile as it could be.\n", "If there are several `System` objects, this function can only work with one of them, and only if it is named `sys1`." ] }, @@ -591,13 +570,13 @@ "id": "naughty-crazy", "metadata": {}, "source": [ - "Dysfunction \\#2: Clobbering the parameters. When people first learn\n", + "**Dysfunction #2:** Clobbering the parameters. When people first learn\n", "about parameters, they often write functions like this:" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "outdoor-petroleum", "metadata": {}, "outputs": [], @@ -635,13 +614,12 @@ "id": "expired-detail", "metadata": {}, "source": [ - "Dysfunction \\#3: No return value. Here's a version that computes the\n", - "value of `K` but doesn't return it." + "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "increasing-database", "metadata": {}, "outputs": [], @@ -668,8 +646,7 @@ "id": "meaning-thriller", "metadata": {}, "source": [ - "Dysfunction \\#4: Ignoring the return value. Finally, here's a version\n", - "where the function is correct, but the way it's used is not.\n", + "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not.\n", "\n", "```\n", "def carrying_capacity(system):\n", @@ -714,12 +691,12 @@ "\n", "where $r=\\alpha$ and $K=-\\alpha/\\beta$. \n", "\n", - "Write a version of `growth_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " + "Write a version of `growth_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025` and `beta=-0.0018`, and confirm that you get the same results. " ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "unauthorized-settle", "metadata": {}, "outputs": [], @@ -729,7 +706,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "primary-roman", "metadata": {}, "outputs": [], @@ -739,7 +716,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "ordinary-solid", "metadata": {}, "outputs": [], @@ -763,7 +740,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "intermediate-kazakhstan", "metadata": {}, "outputs": [], @@ -778,19 +755,61 @@ "source": [ "## Under the hood\n", "\n", - "Explain the difference between the Pandas and Matplotlib `plot` functions." + "ModSim provides `make_series` to make it easier to create a Pandas Series. In this chapter, we used it like this: " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "described-funds", "metadata": {}, "outputs": [], + "source": [ + "growth_series = make_series(pop_array, growth_array)" + ] + }, + { + "cell_type": "markdown", + "id": "least-password", + "metadata": {}, + "source": [ + "If you import `Series` from Pandas, you can make a `Series` yourself, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "sitting-quarterly", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import Series\n", + "\n", + "growth_series = Series(growth_array, pop_array)" + ] + }, + { + "cell_type": "markdown", + "id": "german-kennedy", + "metadata": {}, + "source": [ + "The difference is that the arguments are in reverse order: the first argument is stored as the values in the `Series`; the second argument is stored as the `index`.\n", + "\n", + "I find that order counterintuitive, which is why I use `make_series`.\n", + "`make_series` takes the same optional keyword arguments as `Series`, which you can read about at ." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "mental-october", + "metadata": {}, + "outputs": [], "source": [] } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -806,7 +825,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index 2aaa36bb..50891a0d 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -79,71 +79,98 @@ }, { "cell_type": "markdown", - "id": "chicken-emphasis", - "metadata": {}, + "id": "global-international", + "metadata": { + "tags": [] + }, "source": [ - "In the previous chapter we developed a quadratic model of world\n", - "population growth from 1950 to 2016. It is a simple model, but it fits\n", - "the data well and the mechanisms it's based on are plausible.\n", - "\n", - "In this chapter we'll use the quadratic model to generate projections of future growth, and compare our results to projections from actual\n", - "demographers." + "Here's the data from the previous chapters, one last time." ] }, { - "cell_type": "markdown", - "id": "global-international", - "metadata": {}, + "cell_type": "code", + "execution_count": 4, + "id": "necessary-factor", + "metadata": { + "tags": [] + }, + "outputs": [], "source": [ - "Here's the code that downloads the data." + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { "cell_type": "code", - "execution_count": 2, - "id": "necessary-factor", - "metadata": {}, + "execution_count": 5, + "id": "changed-desktop", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", + "from pandas import read_html\n", "\n", "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "metallic-inventory", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9" ] }, { "cell_type": "markdown", - "id": "designed-entrance", - "metadata": {}, + "id": "current-canberra", + "metadata": { + "tags": [] + }, "source": [ - "And here's the code that reads `table2`, which contains world populations estimates from the U.S. Census and U.N. DESA, among other organizations." + "And here are the functions from the previous chapter." ] }, { "cell_type": "code", - "execution_count": 3, - "id": "changed-desktop", - "metadata": {}, + "execution_count": 7, + "id": "cutting-financing", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "from pandas import read_html\n", + "from chap06 import run_simulation\n", "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')" + "def plot_estimates():\n", + " census.plot(style=':', label='US Census')\n", + " un.plot(style='--', label='UN DESA')\n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)') " ] }, { - "cell_type": "code", - "execution_count": 4, - "id": "metallic-inventory", + "cell_type": "markdown", + "id": "chicken-emphasis", "metadata": {}, - "outputs": [], "source": [ - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" + "In the previous chapter we developed a quadratic model of world\n", + "population growth from 1950 to 2016. It is a simple model, but it fits\n", + "the data well and the mechanisms it's based on are plausible.\n", + "\n", + "In this chapter we'll use the quadratic model to generate projections of future growth, and compare our results to projections from actual\n", + "demographers." ] }, { @@ -159,108 +186,80 @@ "id": "concrete-lightning", "metadata": {}, "source": [ - "Now let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", + "Let's run the quadratic model, extending the results until 2100, and see how our projections compare to the professionals'.\n", "\n", - "Here's the code we'll need from the previous chapter." + "Here's the quadratic growth function again." ] }, { "cell_type": "code", - "execution_count": 5, - "id": "extraordinary-shade", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "def run_simulation(system, growth_func):\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in range(system.t_0, system.t_end):\n", - " growth = growth_func(results[t], t, system)\n", - " results[t+1] = results[t] + growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "indirect-russia", "metadata": {}, "outputs": [], "source": [ - "def growth_func_quad(pop, t, system):\n", + "def growth_func_quad(t, pop, system):\n", " return system.alpha * pop + system.beta * pop**2" ] }, { - "cell_type": "code", - "execution_count": 7, - "id": "collaborative-schedule", + "cell_type": "markdown", + "id": "little-struggle", "metadata": {}, - "outputs": [], "source": [ - "census = table2.census / 1e9\n", - "un = table2.un / 1e9" + "And here are the system parameters." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "comfortable-compression", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "t_0 = census.index[0]\n", - "p_0 = census[t_0]" + "p_0 = census[t_0]\n", + "\n", + "system = System(t_0 = t_0,\n", + " p_0 = p_0,\n", + " alpha = 25 / 1000,\n", + " beta = -1.8 / 1000,\n", + " t_end = 2100)" ] }, { - "cell_type": "code", - "execution_count": 9, - "id": "working-cleveland", + "cell_type": "markdown", + "id": "legitimate-guess", "metadata": {}, - "outputs": [], "source": [ - "system = System(t_0=t_0,\n", - " p_0=p_0,\n", - " t_end=2100)" + "With `t_end=2100`, we can generate the projection by calling `run_simulation` the usual way." ] }, { "cell_type": "code", "execution_count": 10, - "id": "sophisticated-adult", + "id": "broken-windsor", "metadata": {}, "outputs": [], "source": [ - "system.alpha = 25 / 1000\n", - "system.beta = -1.8 / 1000" + "results = run_simulation(system, growth_func_quad)" ] }, { - "cell_type": "code", - "execution_count": 11, - "id": "broken-windsor", + "cell_type": "markdown", + "id": "provincial-competition", "metadata": {}, - "outputs": [], "source": [ - "results = run_simulation(system, growth_func_quad)" + "Here are the last few values in the results." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "latest-function", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "show(results.tail())" ] }, @@ -269,18 +268,16 @@ "id": "outer-ensemble", "metadata": {}, "source": [ - "And here are the results." + "Here's what the results look like." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "portable-pottery", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "results.plot(color='gray', label='model')\n", "decorate(xlabel='Year', \n", " ylabel='World population (billion)',\n", @@ -292,14 +289,14 @@ "id": "macro-carroll", "metadata": {}, "source": [ - "According to the model, population growth will slow gradually after 2020, approaching 12.5 billion by 2100.\n", + "According to the model, population growth will slow gradually after 2020, approaching 12.6 billion by 2100.\n", "\n", "I am using the word \"projection\" deliberately, rather than\n", "\"prediction\", with the following distinction: \"prediction\" implies\n", "something like \"this is what we should reasonably expect to happen, at\n", "least approximately\"; \"projection\" implies something like \"if this\n", - "model is actually a good description of what is happening in this\n", - "system, and if nothing in the future causes the parameters of the model to change, this is what would happen.\"\n", + "model is a good description of what is happening in this\n", + "system, and if nothing in the future causes the system parameters to change, this is what would happen.\"\n", "\n", "Using \"projection\" leaves open the possibility that there are important things in the real world that are not captured in the model. It also suggests that, even if the model is good, the parameters we estimate based on the past might be different in the future.\n", "\n", @@ -309,7 +306,7 @@ "rates fall and death rates rise because resources become scarce.\n", "\n", "If that assumption is valid, we might be able to use actual population\n", - "growth to estimate carrying capacity, especially if we observe the\n", + "growth to estimate carrying capacity, provided we observe the\n", "transition into the regime where the growth rate starts to fall.\n", "\n", "But in the case of world population growth, those conditions don't\n", @@ -340,20 +337,14 @@ "id": "small-seminar", "metadata": {}, "source": [ - "## Projections" - ] - }, - { - "cell_type": "markdown", - "id": "greater-illness", - "metadata": {}, - "source": [ - "From the same page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." + "## Projections\n", + "\n", + "From the same Wikipedia page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "precious-contribution", "metadata": {}, "outputs": [], @@ -374,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "headed-tuner", "metadata": {}, "outputs": [], @@ -392,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "paperback-delay", "metadata": {}, "outputs": [], @@ -417,12 +408,12 @@ "id": "prostate-matrix", "metadata": {}, "source": [ - "Here are their projections compared to the results of the quadratic model." + "Here are the professional projections compared to the results of the quadratic model." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "billion-dynamics", "metadata": {}, "outputs": [], @@ -439,12 +430,7 @@ "source": [ "The U.N. DESA expects the world population to reach 11 billion around 2100, and then level off.\n", "Projections by U.S. Census are a little lower, and they only go until 2050.\n", - "\n", - "Real demographers expect world population to grow more slowly than our model projects, probably because their models are broken down by region and country, where conditions are different, and they take into account expected economic development.\n", - "\n", - "Nevertheless, their projections are qualitatively similar to ours, and\n", - "theirs differ from each other almost as much as they differ from ours.\n", - "So the results from this model, simple as it is, are not entirely unreasonable.\n" + "\n" ] }, { @@ -454,8 +440,15 @@ "source": [ "## Summary\n", "\n", + "In this chapter we use the quadratic growth model to project world population growth between now and 2100.\n", + "\n", + "Real demographers expect world population to grow more slowly than our model, probably because their models are broken down by region and country, where conditions are different, and they take into account expected economic development.\n", + "\n", + "Nevertheless, their projections are qualitatively similar to ours, and\n", + "theirs differ from each other almost as much as they differ from ours.\n", + "So the results from the model, simple as it is, are not entirely unreasonable.\n", "\n", - "You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." + "If you are interested in some of the factors that go into the professional predictions, you might like this [video by Hans Rosling about the demographic changes we expect this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." ] }, { @@ -472,13 +465,13 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "handmade-funeral", "metadata": {}, "outputs": [], "source": [ "diff = census.diff()\n", - "diff.head()" + "show(diff.head())" ] }, { @@ -486,20 +479,20 @@ "id": "discrete-scanner", "metadata": {}, "source": [ - "The first element is `NaN` because we don't have the data for 1945, so we can't compute the first difference.\n", + "The first element is `NaN` because we don't have the data for 1949, so we can't compute the first difference.\n", "\n", "If we divide these differences by the populations, the result is an estimate of the growth rate during each year: " ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "objective-accused", "metadata": {}, "outputs": [], "source": [ "alpha = census.diff() / census\n", - "alpha.head()" + "show(alpha.head())" ] }, { @@ -512,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "unique-matrix", "metadata": {}, "outputs": [], @@ -532,12 +525,13 @@ "id": "flexible-amateur", "metadata": {}, "source": [ + "It uses `style='.'` to plot each data point with a small circle.\n", "And here's what it looks like." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "pressing-proceeding", "metadata": {}, "outputs": [], @@ -553,13 +547,12 @@ "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", "\n", "We can model the decline by fitting a line to this data and extrapolating into the future.\n", - "\n", "Here's a function that takes a time stamp and computes a line that roughly fits the growth rates since 1970." ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "mexican-denver", "metadata": {}, "outputs": [], @@ -575,12 +568,12 @@ "id": "handy-dubai", "metadata": {}, "source": [ - "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." + "To see what it looks like, I'll create an array of time stamps from 1960 to 2020, use `alpha_func` to compute the corresponding growth rates, and put the results into a `Series`." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "addressed-worker", "metadata": {}, "outputs": [], @@ -588,7 +581,8 @@ "from numpy import linspace\n", "\n", "t_array = linspace(1960, 2020, 5)\n", - "alpha_array = alpha_func(t_array)" + "alpha_array = alpha_func(t_array)\n", + "alpha_series = make_series(t_array, alpha_array)" ] }, { @@ -601,7 +595,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "cathedral-shakespeare", "metadata": {}, "outputs": [], @@ -609,7 +603,10 @@ "from matplotlib.pyplot import plot\n", "\n", "plot_alpha()\n", - "plot(t_array, alpha_array, color='gray')" + "alpha_series.plot(label='model', color='gray')\n", + "\n", + "decorate(ylabel='Net growth rate',\n", + " title='Linear model of net growth rate')" ] }, { @@ -619,20 +616,20 @@ "source": [ "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", "\n", - "Now, as an exercise, you can use this function to make a projection of world population until 2100.\n", + "Now, as an exercise, you can use this function project world population until 2100.\n", "\n", - "1. Create a `System` object that includes `alpha_func` as a system variable.\n", + "1. Create a `System` object that includes `alpha_func` as a system parameter.\n", "\n", "2. Define a growth function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", "\n", - "3. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", + "3. Run a simulation from 1960 to 2100 with your growth function, and plot the results.\n", "\n", "4. Compare your projections with those from the US Census and UN." ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "common-april", "metadata": {}, "outputs": [], @@ -642,7 +639,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "ignored-chain", "metadata": {}, "outputs": [], @@ -652,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "color-accountability", "metadata": {}, "outputs": [], @@ -662,7 +659,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "numeric-raise", "metadata": {}, "outputs": [], @@ -672,7 +669,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "included-vehicle", "metadata": {}, "outputs": [], @@ -682,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "brown-rating", "metadata": {}, "outputs": [], @@ -692,7 +689,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "laughing-cylinder", "metadata": {}, "outputs": [], @@ -702,7 +699,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "personalized-parking", "metadata": {}, "outputs": [], @@ -720,6 +717,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -735,7 +733,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 8e3c66ac..a8579efe 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "alike-thompson", "metadata": { "tags": [] @@ -84,8 +84,7 @@ "source": [ "In this chapter we express the models from previous chapters as\n", "difference equations and differential equations, solve the equations,\n", - "and derive the functional forms of the solutions. We also discuss the\n", - "complementary roles of mathematical analysis and simulation." + "and derive the functional forms of the solutions. And I present some thoughts about the complementary roles of mathematical analysis and simulation." ] }, { @@ -108,8 +107,9 @@ "\n", "$$x_{n+1} = x_n + c$$ \n", "\n", - "where $x_n$ is the population during year $n$,\n", - "$x_0$ is a given initial population, and $c$ is constant annual growth.\n", + "where $x_n$ is the population during year $n$, \n", + "$x_{n+1}$ is the population during year $n+1$,\n", + "and $c$ is constant annual growth.\n", "This way of representing the model is a **recurrence relation**; see\n", ".\n", "\n", @@ -126,7 +126,7 @@ "source": [ "In the case of constant growth we can see that $x_1 = x_0 + c$, and\n", "$x_2 = x_1 + c$. Combining these, we get $x_2 = x_0 + 2c$, then\n", - "$x_3 = x_0 + 3c$, and it is not hard to conclude that in general\n", + "$x_3 = x_0 + 3c$, and we can see that in general\n", "\n", "$$x_n = x_0 + nc$$ \n", "\n", @@ -137,7 +137,7 @@ }, { "cell_type": "markdown", - "id": "motivated-consumer", + "id": "sufficient-tampa", "metadata": {}, "source": [ "We can also write the proportional model as a recurrence relation:\n", @@ -148,29 +148,30 @@ "\n", "$$x_{n+1} = x_n (1 + \\alpha)$$ \n", "\n", - "Now we can see that\n", - "\n", - "$x_1 = x_0 (1 + \\alpha)$, and $x_2 = x_0 (1 + \\alpha)^2$, and in general\n", + "Now we can see that $x_1 = x_0 (1 + \\alpha)$, and $x_2 = x_0 (1 + \\alpha)^2$, and in general\n", "\n", "$$x_n = x_0 (1 + \\alpha)^n$$ \n", "\n", "This result is a **geometric progression**;\n", "see . When $\\alpha$ is positive, the factor\n", "$1+\\alpha$ is greater than 1, so the elements of the sequence grow\n", - "without bound.\n", - "\n", + "without bound." + ] + }, + { + "cell_type": "markdown", + "id": "motivated-consumer", + "metadata": {}, + "source": [ "Finally, we can write the quadratic model like this:\n", "\n", "$$x_{n+1} = x_n + \\alpha x_n + \\beta x_n^2$$ \n", "\n", - "or with the more\n", - "conventional parameterization like this:\n", + "or with the more conventional parameterization like this:\n", "\n", "$$x_{n+1} = x_n + r x_n (1 - x_n / K)$$ \n", "\n", - "There is no analytic solution to\n", - "this equation, but we can approximate it with a differential equation\n", - "and solve that, which is what we'll do in the next section." + "There is no analytic solution to this equation, but we can approximate it with a differential equation and solve that, which is what we'll do in the next section." ] }, { @@ -202,7 +203,7 @@ }, { "cell_type": "markdown", - "id": "covered-defense", + "id": "latest-impression", "metadata": {}, "source": [ "We can make this model continuous by writing the rate of change in the\n", @@ -219,8 +220,14 @@ "\n", "And then integrate both sides: \n", "\n", - "$$x(t) = c t + x_0$$\n", - "\n", + "$$x(t) = c t + x_0$$" + ] + }, + { + "cell_type": "markdown", + "id": "covered-defense", + "metadata": {}, + "source": [ "Similarly, we can write the proportional growth model like this:\n", "\n", "$$\\frac{\\Delta x}{\\Delta t} = \\alpha x$$ \n", @@ -263,14 +270,13 @@ "\n", "$$x = C \\exp(\\alpha t)$$ \n", "\n", - "where $C = \\exp(K)$. There are many solutions\n", - "to this differential equation, with different values of $C$. The\n", - "particular solution we want is the one that has the value $x_0$ when\n", - "$t=0$.\n", + "where $C = \\exp(K)$. There are many solutions to this differential equation, with different values of $C$. The particular solution we want is the one that has the value $x_0$ when $t=0$.\n", "\n", "When $t=0$, $x(t) = C$, so $C = x_0$ and the solution we want is\n", - "$$x(t) = x_0 \\exp(\\alpha t)$$ If you would like to see this derivation\n", - "done more carefully, you might like this video:\n", + "\n", + "$$x(t) = x_0 \\exp(\\alpha t)$$ \n", + "\n", + "If you would like to see this derivation done more carefully, you might like this video:\n", "." ] }, @@ -297,10 +303,10 @@ "source": [ "- With analysis we can sometimes compute, exactly and efficiently, a\n", " value that we could only approximate, less efficiently, with\n", - " simulation. For example, in the quadratic model we plotted growth rate versus population and saw net crossed through zero when the population is\n", + " simulation. For example, in the quadratic model we plotted net growth versus population and saw it crosses through zero when the population is\n", " near 14 billion. We could estimate the crossing point using a\n", " numerical search algorithm (more about that later). But with the\n", - " analysis in Section xxx, we get the general result that\n", + " analysis in Section xxx, we derived the general result that\n", " $K=-\\alpha/\\beta$.\n", "\n", "- Analysis often provides \"computational shortcuts\", that is, the\n", @@ -325,7 +331,7 @@ "metadata": {}, "source": [ "When people see what analysis can do, they sometimes get drunk with\n", - "power, and imagine that it gives them a special ability to see past the veil of the material world and discern the laws of mathematics that govern the universe. When they analyze a model of a physical system, they talk about \"the math behind it\" as if our world is the mere shadow of a world of ideal mathematical entities (I am not making this up; see .).\n", + "power and imagine that it gives them a special ability to see past the veil of the material world and discern the laws of mathematics that govern the universe. When they analyze a model of a physical system, they talk about \"the math behind it\" as if our world is the mere shadow of a world of ideal mathematical entities (I am not making this up; see .).\n", "\n", "This is, of course, nonsense. Mathematical notation is a language\n", "designed by humans for a purpose, specifically to facilitate symbolic\n", @@ -356,12 +362,11 @@ "\n", "WolframAlpha infers that `f(t)` is a function of `t` and `alpha` is a\n", "parameter; it classifies the query as a \"first-order linear ordinary\n", - "differential equation\\\", and reports the general solution:\n", + "differential equation\", and reports the general solution:\n", "\n", "$$f(t) = c_1 \\exp(\\alpha t)$$ \n", "\n", - "If you add a second equation to specify\n", - "the initial condition:\n", + "If you add a second equation to specify the initial condition:\n", "\n", "```\n", "df(t) / dt = alpha f(t), f(0) = p_0\n", @@ -386,16 +391,7 @@ "tools similar to Mathematica. They are not as easy to use as\n", "WolframAlpha, but they have some other advantages.\n", "\n", - "Before we can use SymPy, we have to import it:" - ] - }, - { - "cell_type": "markdown", - "id": "civic-payday", - "metadata": {}, - "source": [ - "SymPy defines a `Symbol` object that represents symbolic variable names,\n", - "functions, and other mathematical entities.\n", + "SymPy defines a `Symbol` object that represents symbolic variable names, functions, and other mathematical entities.\n", "\n", "The `symbols` function takes a string and returns `Symbol` objects. So\n", "if we run this assignment:" @@ -403,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "flush-balance", "metadata": {}, "outputs": [], @@ -424,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "ancient-anderson", "metadata": {}, "outputs": [], @@ -446,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "familiar-oakland", "metadata": {}, "outputs": [], @@ -464,7 +460,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "incomplete-sleep", "metadata": {}, "outputs": [], @@ -485,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "id": "inside-sally", "metadata": {}, "outputs": [], @@ -514,7 +510,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "id": "requested-program", "metadata": {}, "outputs": [], @@ -539,7 +535,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "id": "incomplete-parker", "metadata": {}, "outputs": [], @@ -562,7 +558,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "id": "described-overhead", "metadata": {}, "outputs": [], @@ -584,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "id": "material-voice", "metadata": {}, "outputs": [], @@ -602,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "id": "supposed-domestic", "metadata": {}, "outputs": [], @@ -633,12 +629,12 @@ "id": "arabic-victorian", "metadata": {}, "source": [ - "We'll use the (r, K) parameterization, so we'll need two more symbols:" + "To solve the quadratic growth curve, we'll use the `r, K` parameterization, so we'll need two more symbols:" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "id": "political-chinese", "metadata": {}, "outputs": [], @@ -656,7 +652,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "id": "lined-queen", "metadata": {}, "outputs": [], @@ -675,7 +671,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "id": "printable-typing", "metadata": {}, "outputs": [], @@ -694,7 +690,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "id": "final-treatment", "metadata": {}, "outputs": [], @@ -713,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "id": "freelance-admission", "metadata": {}, "outputs": [], @@ -734,7 +730,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "id": "orange-glasgow", "metadata": {}, "outputs": [], @@ -746,15 +742,15 @@ }, { "cell_type": "markdown", - "id": "periodic-bikini", + "id": "aggressive-annual", "metadata": {}, "source": [ - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + "The result from `solve` is a list of solutions. " ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "id": "expensive-palace", "metadata": {}, "outputs": [], @@ -762,9 +758,17 @@ "type(solutions), len(solutions)" ] }, + { + "cell_type": "markdown", + "id": "periodic-bikini", + "metadata": {}, + "source": [ + "In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + ] + }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "id": "worthy-sleeve", "metadata": {}, "outputs": [], @@ -783,7 +787,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "id": "aggressive-queue", "metadata": {}, "outputs": [], @@ -802,12 +806,13 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 36, "id": "funded-tolerance", "metadata": {}, "outputs": [], "source": [ - "particular.simplify()" + "simpler = particular.simplify()\n", + "simpler" ] }, { @@ -827,16 +832,20 @@ { "cell_type": "markdown", "id": "burning-sherman", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "id": "institutional-finish", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "A = (K - p_0) / p_0\n", @@ -845,9 +854,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "noble-auditor", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from sympy import exp\n", @@ -859,17 +870,20 @@ { "cell_type": "markdown", "id": "brave-conditions", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "industrial-administrator", "metadata": { - "scrolled": true + "scrolled": true, + "tags": [] }, "outputs": [], "source": [ @@ -879,13 +893,39 @@ { "cell_type": "markdown", "id": "therapeutic-topic", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", "\n", "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." ] }, + { + "cell_type": "markdown", + "id": "flying-bermuda", + "metadata": { + "tags": [] + }, + "source": [ + "If you use SymPy to compute and expression, and then want to evaluate that expression in Python, SumPy provides a function called `pycode` that generates Python code:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "bibliographic-sarah", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from sympy.printing.pycode import pycode\n", + "\n", + "pycode(simpler)" + ] + }, { "cell_type": "markdown", "id": "cutting-access", @@ -896,7 +936,7 @@ }, { "cell_type": "markdown", - "id": "outstanding-launch", + "id": "selective-calvin", "metadata": {}, "source": [ "## Summary\n", @@ -905,27 +945,30 @@ "\n", "What I called the constant growth model is more commonly called **linear growth** because the solution is a line. If we model time as continuous, the solution is\n", "\n", - "$$f(t) = p_0 + \\alpha t$$\n", + "$$f(t) = p_0 + c t$$\n", "\n", - "where $\\alpha$ is the growth rate.\n", + "where $c$ is net annual growth.\n", "\n", "Similarly, the proportional growth model is usually called **exponential growth** because the solution is exponential:\n", "\n", - "$$f(t) = p_0 \\exp{\\alpha t}$$\n", - "\n", - "Finally, the quadratic growth model is called **logistic growth** because the solution is the logistic function:\n", - "\n", - "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", - "\n", - "where $A = (K - p_0) / p_0$." + "$$f(t) = p_0 \\exp{\\alpha t}$$" ] }, { "cell_type": "markdown", - "id": "adjacent-tracy", + "id": "outstanding-launch", "metadata": {}, "source": [ - "I avoided these terms until now because they are based on results we had not derived yet." + "Finally, the quadratic growth model is called **logistic growth** because the solution is the logistic function:\n", + "\n", + "$$f(t) = \\frac{K}{1 + A \\exp(-rt)}$$ \n", + "\n", + "where $A = (K - p_0) / p_0$.\n", + "\n", + "I avoided these terms until now because they are based on results we had not derived yet.\n", + "\n", + "With that, we are done with modeling world population growth.\n", + "The next chapter presents case studies where you can apply the tools we have learned so far." ] }, { @@ -941,14 +984,14 @@ "id": "ideal-ecology", "metadata": {}, "source": [ - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", + "**Exercise:** Use SymPy to solve the quadratic growth equation using the alternative parameterization\n", "\n", "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "id": "internal-knock", "metadata": {}, "outputs": [], @@ -958,7 +1001,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "id": "smooth-sunglasses", "metadata": {}, "outputs": [], @@ -968,7 +1011,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "id": "fundamental-arlington", "metadata": {}, "outputs": [], @@ -978,7 +1021,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "id": "desirable-alpha", "metadata": {}, "outputs": [], @@ -988,7 +1031,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "id": "coupled-grounds", "metadata": {}, "outputs": [], @@ -998,7 +1041,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "id": "looking-ground", "metadata": {}, "outputs": [], @@ -1008,7 +1051,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "id": "anticipated-paragraph", "metadata": {}, "outputs": [], @@ -1031,9 +1074,18 @@ "\n", "Find the general solution and also the particular solution where `f(0) = p_0`." ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "purple-traffic", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -1049,7 +1101,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index b642f49f..b8ac84f3 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 18, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 19, "id": "meaning-public", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 20, "id": "alike-thompson", "metadata": { "tags": [] @@ -234,7 +234,7 @@ }, { "cell_type": "markdown", - "id": "tired-tongue", + "id": "conventional-nudist", "metadata": {}, "source": [ "The following figure shows the estimates of several research groups from 1 CE to the near present." From 38d81481e89be807d32769d9c96ace00c4c685d0 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 15 Feb 2021 15:34:11 -0500 Subject: [PATCH 040/144] Updating chapters --- chapters/chap01.ipynb | 26 +++++++++++++++++--------- chapters/chap02.ipynb | 18 +++++++++++++----- chapters/chap03.ipynb | 18 +++++++++++++----- chapters/chap04.ipynb | 20 ++++++++++++++------ chapters/chap05.ipynb | 18 +++++++++++++----- chapters/chap06.ipynb | 18 +++++++++++++----- chapters/chap07.ipynb | 18 +++++++++++++----- chapters/chap08.ipynb | 18 +++++++++++++----- chapters/chap09.ipynb | 18 +++++++++++++----- chapters/chap10.ipynb | 20 ++++++++++++++------ chapters/chap11.ipynb | 16 ++++++++++++---- chapters/chap12.ipynb | 14 +++++++++++--- chapters/chap13.ipynb | 14 +++++++++++--- chapters/chap14.ipynb | 14 +++++++++++--- chapters/chap15.ipynb | 14 +++++++++++--- chapters/chap16.ipynb | 14 +++++++++++--- chapters/chap17.ipynb | 14 +++++++++++--- chapters/chap18.ipynb | 14 +++++++++++--- chapters/chap19.ipynb | 18 +++++++++++++----- chapters/chap20.ipynb | 14 +++++++++++--- chapters/chap21.ipynb | 14 +++++++++++--- chapters/chap22.ipynb | 14 +++++++++++--- chapters/chap23.ipynb | 14 +++++++++++--- chapters/chap24.ipynb | 16 ++++++++++++---- chapters/chap25.ipynb | 16 ++++++++++++---- chapters/chap26.ipynb | 20 ++++++++++++++------ 26 files changed, 320 insertions(+), 112 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 426c9db5..93b0181a 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap01.ipynb)" + ] + }, { "cell_type": "markdown", "id": "confirmed-budapest", @@ -487,7 +495,7 @@ { "cell_type": "code", "execution_count": 54, - "id": "promotional-lover", + "id": "cardiac-class", "metadata": {}, "outputs": [], "source": [ @@ -497,7 +505,7 @@ { "cell_type": "code", "execution_count": 55, - "id": "practical-throat", + "id": "phantom-copper", "metadata": {}, "outputs": [], "source": [ @@ -546,7 +554,7 @@ { "cell_type": "code", "execution_count": null, - "id": "developmental-majority", + "id": "saving-suggestion", "metadata": {}, "outputs": [], "source": [] @@ -1132,7 +1140,7 @@ { "cell_type": "code", "execution_count": 81, - "id": "front-logistics", + "id": "coral-camel", "metadata": {}, "outputs": [], "source": [ diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index d441523c..451e3519 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap02.ipynb)" + ] + }, { "cell_type": "markdown", "id": "electronic-radius", diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 1132a70d..82185a21 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap03.ipynb)" + ] + }, { "cell_type": "markdown", "id": "coral-steering", diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index f32e2a55..2d0bdf40 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap04.ipynb)" + ] + }, { "cell_type": "markdown", "id": "caring-gnome", @@ -97,7 +105,7 @@ "outputs": [], "source": [ "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/chap03.py')" + " 'ModSimPy/master/chap03.py')" ] }, { diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index b9ceafd6..770d78ba 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap05.ipynb)" + ] + }, { "cell_type": "markdown", "id": "informal-contractor", diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index 08e9df6a..9d4935e4 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap06.ipynb)" + ] + }, { "cell_type": "markdown", "id": "amber-contrary", diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index f5859ad3..0c965728 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap07.ipynb)" + ] + }, { "cell_type": "markdown", "id": "straight-algeria", diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index 50891a0d..b8c4c5a7 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap08.ipynb)" + ] + }, { "cell_type": "markdown", "id": "global-international", diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index a8579efe..02d66d3c 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 2, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap09.ipynb)" + ] + }, { "cell_type": "markdown", "id": "biblical-murder", diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index b8ac84f3..5cccdbf6 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "meaning-public", + "execution_count": 1, + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 20, - "id": "alike-thompson", + "execution_count": null, + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap10.ipynb)" + ] + }, { "cell_type": "markdown", "id": "thirty-medication", @@ -305,7 +313,7 @@ "This figure shows the three scenarios we'll consider:\n", "\n", "![One queue, one server (left), one queue, two servers (middle), two\n", - "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", + "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/master/figs/queue.png)\n", "*One queue, one server (left), one queue, two servers (middle), two\n", "queues, two servers (right).*\n", "\n", diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index c1c16741..001c40d5 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap11.ipynb)" + ] + }, { "cell_type": "markdown", "id": "persistent-carbon", @@ -213,7 +221,7 @@ "model.\n", "\n", "![Stock and flow diagram for an SIR\n", - "model.](https://github.com/AllenDowney/ModSim/raw/main/figs/stock_flow1.png)\n", + "model.](https://github.com/AllenDowney/ModSim/raw/master/figs/stock_flow1.png)\n", "\n", "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." ] diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index 752291a4..a71639ac 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap12.ipynb)" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index 07f38c02..ab1d4886 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap13.ipynb)" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 139bbcc6..09fad940 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap14.ipynb)" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index a13abf5a..e859829b 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap15.ipynb)" + ] + }, { "cell_type": "markdown", "id": "italic-murder", diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index 52b085f7..0e8361da 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap16.ipynb)" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 7db3f45e..7db8d0a4 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap17.ipynb)" + ] + }, { "cell_type": "markdown", "id": "european-movement", diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 4fc84f93..6a450990 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap18.ipynb)" + ] + }, { "cell_type": "markdown", "id": "detected-welsh", diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index 7b2c625e..734b0ee9 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap19.ipynb)" + ] + }, { "cell_type": "markdown", "id": "structured-satellite", @@ -148,7 +156,7 @@ "\n", "The following circuit diagram (from ) shows a low-pass filter built with one resistor and one capacitor.\n", "\n", - "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/RC_Divider.svg)\n", + "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/master/figs/RC_Divider.svg)\n", "\n", "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", "\n", @@ -207,7 +215,7 @@ "\n", "The following figure shows the scenario and their model of the wall:\n", "\n", - "![Model of a wall as a series of thermal insulators](https://github.com/AllenDowney/ModSim/raw/main/figs/wall_model.png)\n", + "![Model of a wall as a series of thermal insulators](https://github.com/AllenDowney/ModSim/raw/master/figs/wall_model.png)\n", "\n", "On the interior and exterior surfaces of the wall, they measure\n", "temperature and heat flux over a period of three days. They model the\n", diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index e22a5571..aa7fee08 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap20.ipynb)" + ] + }, { "cell_type": "markdown", "id": "embedded-gentleman", diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index b827e286..803a25b4 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap21.ipynb)" + ] + }, { "cell_type": "markdown", "id": "superb-february", diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 031a2fdd..96420aed 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap22.ipynb)" + ] + }, { "cell_type": "markdown", "id": "advanced-guidance", diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 6763b952..b8d7de76 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap23.ipynb)" + ] + }, { "cell_type": "code", "execution_count": 4, diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 7334a31b..28cc37c4 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap24.ipynb)" + ] + }, { "cell_type": "markdown", "id": "confirmed-california", @@ -121,7 +129,7 @@ "The following figure shows a diagram of the system: $r$ represents\n", "the radius of the roll at a point in time. Initially, $r$ is the radius of the cardboard core, $R_{min}$. When the roll is complete, $r$ is $R_{max}$.\n", "\n", - "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/main/figs/paper_roll.png)\n", + "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/master/figs/paper_roll.png)\n", "\n", "I'll use $\\theta$ to represent the total rotation of the roll in\n", "radians. In the diagram, $d\\theta$ represents a small increase in\n", diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index ed62cb68..68d2d92e 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap25.ipynb)" + ] + }, { "cell_type": "markdown", "id": "chief-delight", @@ -179,7 +187,7 @@ "The following figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the lever arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", "\n", "![Diagram of a turntable with a\n", - "teapot.](https://github.com/AllenDowney/ModSim/raw/main/figs/teapot.png)\n", + "teapot.](https://github.com/AllenDowney/ModSim/raw/master/figs/teapot.png)\n", "\n", "Here are the parameters from the statement of the problem:" ] diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index 08252908..bf0d7cee 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "meaning-public", + "id": "formal-context", "metadata": { "tags": [] }, @@ -60,13 +60,13 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { "cell_type": "code", "execution_count": null, - "id": "alike-thompson", + "id": "progressive-typing", "metadata": { "tags": [] }, @@ -77,6 +77,14 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap26.ipynb)" + ] + }, { "cell_type": "markdown", "id": "acoustic-small", @@ -174,7 +182,7 @@ "shown in this figure:\n", "\n", "![Diagram of the initial state for the Spider-Man case\n", - "study.](https://github.com/AllenDowney/ModSim/raw/main/figs/spiderman.png)\n", + "study.](https://github.com/AllenDowney/ModSim/raw/master/figs/spiderman.png)\n", "\n", "The origin, `O`, is at the base of the Empire State Building. The vector `H` represents the position where the webbing is attached to the building, relative to `O`. The vector `P` is the position of Spider-Man relative to `O`. And `L` is the vector from the attachment point to Spider-Man.\n", "\n", @@ -239,7 +247,7 @@ "\n", "This diagram shows the paper roll with the force applied by the kitten, $F$, the lever arm of the force around the axis of rotation, $r$, and the resulting torque, $\\tau$.\n", "\n", - "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/kitten.png)\n", + "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/master/figs/kitten.png)\n", "\n", "Assuming that the force applied by the kitten is 0.002 N, how long would it take to unroll a standard roll of toilet paper?\n", "\n", @@ -260,7 +268,7 @@ "\n", "![Diagram of a yo-yo showing forces due to gravity and tension in the\n", "string, the lever arm of tension, and the resulting\n", - "torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/yoyo.png)" + "torque.](https://github.com/AllenDowney/ModSim/raw/master/figs/yoyo.png)" ] }, { From fa7d2dc4b4d5cec9fe5d871df8dfbacb27e80c2f Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 15 Feb 2021 15:42:11 -0500 Subject: [PATCH 041/144] Adding build files --- jb/_config.yml | 18 ++++ jb/_toc.yml | 29 ++++++ jb/build.sh | 16 ++++ jb/index.md | 65 ++++++++++++++ jb/preface.md | 206 +++++++++++++++++++++++++++++++++++++++++++ jb/prep_notebooks.py | 26 ++++++ 6 files changed, 360 insertions(+) create mode 100644 jb/_config.yml create mode 100644 jb/_toc.yml create mode 100644 jb/build.sh create mode 100644 jb/index.md create mode 100644 jb/preface.md create mode 100644 jb/prep_notebooks.py diff --git a/jb/_config.yml b/jb/_config.yml new file mode 100644 index 00000000..15b91be1 --- /dev/null +++ b/jb/_config.yml @@ -0,0 +1,18 @@ +# Book settings +title: Modeling and Simulation in Python +author: Allen B. Downey + +latex: + latex_documents: + targetname: book.tex + +execute: + execute_notebooks: 'off' + +repository: + url: https://github.com/AllenDowney/ModSimPy +html: + use_repository_button: true + +parse: + myst_extended_syntax: true diff --git a/jb/_toc.yml b/jb/_toc.yml new file mode 100644 index 00000000..50015db5 --- /dev/null +++ b/jb/_toc.yml @@ -0,0 +1,29 @@ +file: index +sections: +- file: preface +- file: chap01 +- file: chap02 +- file: chap03 +- file: chap04 +- file: chap05 +- file: chap06 +- file: chap07 +- file: chap08 +- file: chap09 +- file: chap10 +- file: chap11 +- file: chap12 +- file: chap13 +- file: chap14 +- file: chap15 +- file: chap16 +- file: chap17 +- file: chap18 +- file: chap19 +- file: chap20 +- file: chap21 +- file: chap22 +- file: chap23 +- file: chap24 +- file: chap25 +- file: chap26 diff --git a/jb/build.sh b/jb/build.sh new file mode 100644 index 00000000..131c2418 --- /dev/null +++ b/jb/build.sh @@ -0,0 +1,16 @@ +# pip install jupyter-book +# pip install ghp-import + +# Build the Jupyter book version + +# copy the chapter notebooks +cp ../ModSimPySolutions/chapters/chap*.ipynb . + +# add tags to hide the solutions +python prep_notebooks.py + +# build the HTML version +jb build . + +# push it to GitHub +ghp-import -n -p -f _build/html diff --git a/jb/index.md b/jb/index.md new file mode 100644 index 00000000..4804509e --- /dev/null +++ b/jb/index.md @@ -0,0 +1,65 @@ +# Modeling and Simulation in Python + +by Allen B. Downey + +*Modeling and Simulation in Python* is a Free Book. It is available under the [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)](https://creativecommons.org/licenses/by-nc-sa/4.0/), which means that you are free to copy and modify it, as long as you attribute the work and don’t use it for commercial purposes. + +Other Free Books by Allen Downey are available from [Green Tea Press](https://greenteapress.com/wp/). + +**Run the notebooks** + +[Download the notebooks as a Zip file](https://github.com/AllenDowney/ModSimPy/raw/master/ModSimPyNotebooks.zip) + +Or use these links to run the notebooks on Colab: + +* [Chapter 1](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap01.ipynb) + +* [Chapter 2](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap02.ipynb) + +* [Chapter 3](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap03.ipynb) + +* [Chapter 4](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap04.ipynb) + +* [Chapter 5](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap05.ipynb) + +* [Chapter 6](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap06.ipynb) + +* [Chapter 7](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap07.ipynb) + +* [Chapter 8](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap08.ipynb) + +* [Chapter 9](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap09.ipynb) + +* [Chapter 10](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap10.ipynb) + +* [Chapter 11](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap11.ipynb) + +* [Chapter 12](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap12.ipynb) + +* [Chapter 13](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap13.ipynb) + +* [Chapter 14](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap14.ipynb) + +* [Chapter 15](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap15.ipynb) + +* [Chapter 16](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap16.ipynb) + +* [Chapter 17](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap17.ipynb) + +* [Chapter 18](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap18.ipynb) + +* [Chapter 19](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap19.ipynb) + +* [Chapter 20](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap20.ipynb) + +* [Chapter 21](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap21.ipynb) + +* [Chapter 22](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap22.ipynb) + +* [Chapter 23](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap23.ipynb) + +* [Chapter 24](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap24.ipynb) + +* [Chapter 25](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap25.ipynb) + +* [Chapter 26](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/chapters/chap26.ipynb) diff --git a/jb/preface.md b/jb/preface.md new file mode 100644 index 00000000..cca775c2 --- /dev/null +++ b/jb/preface.md @@ -0,0 +1,206 @@ +# Preface + +The essential skills of modeling — abstraction, analysis, simulation, +and validation — are central in engineering, natural sciences, social +sciences, medicine, and many other fields. Some students learn these +skills implicitly, but in most schools they are not taught explicitly, +and students get little practice. That's the problem this book is meant to address. + +At Olin College, we teach these skills in a class called "Modeling and +Simulation", which all students take in their first semester. My +colleagues, John Geddes and Mark Somerville, and I developed this class and taught it for the first time in 2009. + +It is based on our belief that modeling should be taught explicitly, +early, and throughout the curriculum. It is also based on our conviction that computation is an essential part of this process. + +If students are limited to the mathematical analysis they can do by +hand, they are restricted to a small number of simple physical systems, like a projectile moving in a vacuum or a block on a frictionless plane. + +And they only see bad models; that is, models that are too +simple for their intended purpose. In nearly every mechanical system, +air resistance and friction are essential features; if we ignore them, +our predictions will be wrong and our designs won’t work. + +In most introductory physics classes, students don't make modeling +decisions; sometimes they are not even aware of the decisions that have been made for them. Our goal is to teach the entire modeling process and give students a chance to practice it. + +**How much programming do I need?** + +If you have never programmed before, you should be able to read this +book, understand it, and do the exercises. I will do my best to explain everything you need to know; in particular, I have chosen carefully the vocabulary I introduce, and I try to define each term the first time it is used. If you find that I have used a term without defining it, let me know. + +If you have programmed before, you will have an easier time getting +started, but you might be uncomfortable in some places. I take an +approach to programming you have probably not seen before. + +Most programming classes have two big problems: + +1. They go "bottom up", starting with basic language features and + gradually adding more powerful tools. As a result, it takes a long + time before students can do anything more interesting than convert + Fahrenheit to Celsius. + +2. They have no context. Students learn to program with no particular + goal in mind, so the exercises span an incoherent collection of + topics, and the exercises tend to be unmotivated. + +In this book, you learn to program with an immediate goal in mind: +writing simulations of physical systems. And we proceed "top down", by +which I mean we use professional-strength data structures and language +features right away. In particular, we use the following Python libraries: + +- NumPy for basic numerical computation (see + ). + +- SciPy for scientific computation (see ). + +- Matplotlib for visualization (see ). + +- Pandas for working with data (see ). + +- SymPy for symbolic computation, (see ). + +- Pint for units like kilograms and meters (see + ). + +- Jupyter for reading, running, and developing code (see + ). + +These tools let you work on more interesting programs sooner, but there are some drawbacks: they can be hard to use, and it can be challenging to keep track of which library does what and how they interact. + +I have tried to mitigate these problems by providing a library that makes it easier to get started with these tools, and provides some +additional capabilities. + +Some features in the ModSim library are like training wheels; at some +point you will probably stop using them and start working with the +underlying libraries directly. Other features you might find useful the whole time you are working through the book, and later. + +I encourage you to read the the ModSim library code. Most of it is not +complicated, and I tried to make it readable. Particularly if you have +some programming experience, you might learn something by reverse +engineering my design decisions. + +**How much math and science do I need?** + +I assume that you know what derivatives and integrals are, but that's +about all. In particular, you don’t need to know (or remember) much +about finding derivatives or integrals of functions analytically. If you know the derivative of $x^2$ and you can integrate $2x~dx$, that will do it. More importantly, you should understand what those concepts *mean*; but if you don’t, this book might help you figure it out. + +You don't have to know anything about differential equations. + +As for science, we will cover topics from a variety of fields, including demography, epidemiology, medicine, thermodynamics, and mechanics. For the most part, I don’t assume you know anything about these topics. In fact, one of the skills you need to do modeling is the ability to learn enough about new fields to develop models and simulations. + +When we get to mechanics, I assume you understand the relationship +between position, velocity, and acceleration, and that you are familiar with Newton’s laws of motion, especially the second law, which is often expressed as $F = ma$ (force equals mass times acceleration). + +I think that's everything you need, but if you find that I left +something out, please let me know. + +**Getting started** + +To run the examples and work on the exercises in this book, you will need an environment where you can run Jupyter notebooks. + +Jupyter is a software development environment where you can run Python code, including the examples in this book, and write your own code. + +A Jupyter notebook is a document that contains text, code, and results from running the code. +Each chapter of this book is a Jupyter notebook where you can run the examples and work on exercises. + +To run the notebooks, you have two options: + +1. You can install Python and Jupyter on your computer and download my notebooks. + +2. You can run the notebooks on Colab. + +To run the notebooks on Colab, go to [the landing page for this book](https://allendowney.github.io/ModSimPy/index.html) and follow the links to the chapters. + +To run the notebooks on your computer, there are three steps: + +1. Download the notebooks and copy them to your computer. + +2. Install Python, Jupyter, and some additional libraries. + +3. Run Jupyter and open the notebooks. + +To get the notebooks, download [this Zip archive](http://modsimpy.com/zip). You will need a program like +WinZip or gzip to unpack the Zip file. Make a note of the location of +the files you download. + +The next two sections provide details for the other steps. +Installing and running software can be challenging, especially if you are not familiar with the command line. +If you run into problems, you might want to work on Colab, at least to get started. + + +**Installing Python** + +You might already have Python installed on your computer, but you might not have the latest version. To use the code in this book, you need Python 3.6 or later. Even if you have the latest version, you probably don't have all of the libraries we need. + +You could update Python and install these libraries, but I strongly +recommend that you don’t go down that road. I think you will find it +easier to use **Anaconda**, which is a free Python distribution that includes all the libraries you need for this book (and more). + +Anaconda is available for Linux, macOS, and Windows. By default, it puts all files in your home directory, so you don’t need administrator (root) permission to install it, and if you have a version of Python already, Anaconda will not remove or modify it. + +Start at . Download the installer for your system and run it. I recommend you run the installer as a normal user, not as administrator or root. + +I suggest you accept the recommended options. On Windows you have the +option to install Visual Studio Code, which is an interactive +environment for writing programs. You won't need it for this book, but +you might want it for other projects. + +By default, Anaconda installs most of the packages you need, but there +are a few more you have to add. Once the installation is complete, open a command window. On macOS or Linux, you can use Terminal. On Windows, open the Anaconda Prompt that should be in your Start menu. + +Run the following command (copy and paste it if you can, to avoid +typos): + +``` +conda install jupyter pandas sympy +conda install beautifulsoup4 lxml html5lib +conda install -c unidata pint +``` + +That should be everything you need. + + +**Running Jupyter** + + If you have not used Jupyter before, you can read about it at . + +To start Jupyter on macOS or Linux, open a Terminal; on Windows, open +Git Bash. Use `cd` to “change directory" into the directory that contains the notebooks. + +``` +cd ModSimPy +``` + +Then launch the Jupyter notebook server: + +``` +jupyter notebook +``` + +Jupyter should open a window in a browser, and you should see the list +of notebooks in my repository. Click on the first notebook, and follow +the instructions to run the first few "cells". The first time you run a notebook, it might take several seconds to start, while some Python +files get initialized. After that, it should run faster. + +You can also launch Jupyter from the Start menu on Windows, the Dock on macOS, or the Anaconda Navigator on any system. If you do that, Jupyter might start in your home directory or somewhere else in your file system, so you might have to navigate to find the directory with the notebooks. + + +**Contributor List** + +If you have a suggestion or correction, send it to +. Or if you are a Git user, open an issue, or send me a pull request on [this repository](https://github.com/AllenDowney/ModSimPy). + +If I make a change based on your feedback, I will add you to the +contributor list, unless you ask to be omitted. + +If you include at least part of the sentence the error appears in, that makes it easy for me to search. Page and section numbers are fine, too, but not as easy to work with. Thanks! + +- My early work on this book benefited from conversations with my + colleagues at Olin College, including John Geddes, Mark Somerville, Alison Wood, Chris Lee, and Jason Woodard. + +- I am grateful to Lisa Downey and Jason Woodard for their thoughtful and careful copy editing. + +- Thanks to Alessandra Ferzoco, Erhardt Graeff, Emily Tow, Kelsey + Houston-Edwards, Linda Vanasupa, Matt Neal, Joanne Pratt, and Steve Matsumoto for their helpful suggestions. diff --git a/jb/prep_notebooks.py b/jb/prep_notebooks.py new file mode 100644 index 00000000..95067d96 --- /dev/null +++ b/jb/prep_notebooks.py @@ -0,0 +1,26 @@ +import nbformat as nbf +from glob import glob + +# Collect a list of all notebooks in the content folder +notebooks = glob("*.ipynb") + +# Text to look for in adding tags +text_search_dict = { + "# Solution": "hide-cell", # Hide the cell with a button to show +} + +# Search through each notebook and look for the text, add a tag if necessary +for ipath in notebooks: + ntbk = nbf.read(ipath, nbf.NO_CONVERT) + + for cell in ntbk.cells: + cell_tags = cell.get('metadata', {}).get('tags', []) + cell_tags = [] + for key, val in text_search_dict.items(): + if key in cell['source']: + if val not in cell_tags: + cell_tags.append(val) + if len(cell_tags) > 0: + cell['metadata']['tags'] = cell_tags + + nbf.write(ntbk, ipath) From 71248abc526a4b9ebe62de54de812708f7210c52 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 15 Feb 2021 15:46:08 -0500 Subject: [PATCH 042/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 0 -> 165534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ModSimPyNotebooks.zip diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip new file mode 100644 index 0000000000000000000000000000000000000000..e0d387e9ff6fb88c38e596b9638bd4c83dbf0369 GIT binary patch literal 165534 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 Date: Tue, 16 Feb 2021 11:22:59 -0500 Subject: [PATCH 043/144] Updating modsim.py --- chap03.py | 43 ++++++++++++++++++++++++++++++++++ chap06.py | 12 ++++++++++ chap11.py | 43 ++++++++++++++++++++++++++++++++++ chap12.py | 7 ++++++ chap13.py | 27 +++++++++++++++++++++ chap15.py | 36 ++++++++++++++++++++++++++++ chap18.py | 30 ++++++++++++++++++++++++ chap22.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 268 insertions(+) create mode 100644 chap03.py create mode 100644 chap06.py create mode 100644 chap11.py create mode 100644 chap12.py create mode 100644 chap13.py create mode 100644 chap15.py create mode 100644 chap18.py create mode 100644 chap22.py diff --git a/chap03.py b/chap03.py new file mode 100644 index 00000000..5b6f1626 --- /dev/null +++ b/chap03.py @@ -0,0 +1,43 @@ +from modsim import * + +def step(state, p1, p2): + """Simulate one time step. + + state: bikeshare State object + p1: probability of an Olin->Wellesley ride + p2: probability of a Wellesley->Olin ride + """ + if flip(p1): + bike_to_wellesley(state) + + if flip(p2): + bike_to_olin(state) + +from modsim import * + +def bike_to_olin(state): + """Move one bike from Wellesley to Olin. + + state: bikeshare State object + """ + if state.wellesley == 0: + state.wellesley_empty += 1 + return + state.wellesley -= 1 + state.olin += 1 + +from modsim import * + +# Solution + +def bike_to_wellesley(state): + """Move one bike from Olin to Wellesley. + + state: bikeshare State object + """ + if state.olin == 0: + state.olin_empty += 1 + return + state.olin -= 1 + state.wellesley += 1 + diff --git a/chap06.py b/chap06.py new file mode 100644 index 00000000..f18bcbe4 --- /dev/null +++ b/chap06.py @@ -0,0 +1,12 @@ +from modsim import * + +def run_simulation(system, growth_func): + results = TimeSeries() + results[system.t_0] = system.p_0 + + for t in range(system.t_0, system.t_end): + growth = growth_func(t, results[t], system) + results[t+1] = results[t] + growth + + return results + diff --git a/chap11.py b/chap11.py new file mode 100644 index 00000000..23d40dbb --- /dev/null +++ b/chap11.py @@ -0,0 +1,43 @@ +from modsim import * + +def make_system(beta, gamma): + init = State(S=89, I=1, R=0) + init /= init.sum() + + return System(init=init, t_end=7*14, + beta=beta, gamma=gamma) + +from modsim import * + +def update_func(t, state, system): + s, i, r = state + + infected = system.beta * i * s + recovered = system.gamma * i + + s -= infected + i += infected - recovered + r += recovered + + return State(S=s, I=i, R=r) + +from modsim import * + +def plot_results(S, I, R): + S.plot(style='--', label='Susceptible') + I.plot(style='-', label='Infected') + R.plot(style=':', label='Resistant') + decorate(xlabel='Time (days)', + ylabel='Fraction of population') + +from modsim import * + +def run_simulation(system, update_func): + frame = TimeFrame(columns=system.init.index) + frame.loc[0] = system.init + + for t in range(0, system.t_end): + frame.loc[t+1] = update_func(t, frame.loc[t], system) + + return frame + diff --git a/chap12.py b/chap12.py new file mode 100644 index 00000000..c389b767 --- /dev/null +++ b/chap12.py @@ -0,0 +1,7 @@ +from modsim import * + +def calc_total_infected(results, system): + s_0 = results.S[system.t0] + s_end = results.S[system.t_end] + return s_0 - s_end + diff --git a/chap13.py b/chap13.py new file mode 100644 index 00000000..ca40c10b --- /dev/null +++ b/chap13.py @@ -0,0 +1,27 @@ +from modsim import * + +# import code from previous notebooks + +from chap11 import make_system +from chap11 import update_func +from chap11 import run_simulation +from chap12 import calc_total_infected + +from modsim import * + +def sweep_beta(beta_array, gamma): + sweep = SweepSeries() + for beta in beta_array: + system = make_system(beta, gamma) + results = run_simulation(system, update_func) + sweep[beta] = calc_total_infected(results, system) + return sweep + +from modsim import * + +def sweep_parameters(beta_array, gamma_array): + frame = SweepFrame(columns=gamma_array) + for gamma in gamma_array: + frame[gamma] = sweep_beta(beta_array, gamma) + return frame + diff --git a/chap15.py b/chap15.py new file mode 100644 index 00000000..f9c28e9b --- /dev/null +++ b/chap15.py @@ -0,0 +1,36 @@ +from modsim import * + +def make_system(T_init, volume, r, t_end): + return System(T_init=T_init, + T_final=T_init, + volume=volume, + r=r, + t_end=t_end, + T_env=22, + t_0=0, + dt=1) + +from modsim import * + +def change_func(T, t, system): + r, T_env, dt = system.r, system.T_env, system.dt + return -r * (T - T_env) * dt + +from modsim import * + +def run_simulation(system, change_func): + t_array = linrange(system.t_0, system.t_end, system.dt) + n = len(t_array) + + series = TimeSeries(index=t_array) + series.iloc[0] = system.T_init + + for i in range(n-1): + t = t_array[i] + T = series.iloc[i] + series.iloc[i+1] = T + change_func(T, t, system) + + system.t_end = t_array[-1] + system.T_final = series.iloc[-1] + return series + diff --git a/chap18.py b/chap18.py new file mode 100644 index 00000000..7e3db625 --- /dev/null +++ b/chap18.py @@ -0,0 +1,30 @@ +from modsim import * + +def make_system(params, data): + G0, k1, k2, k3 = params + + t_0 = data.index[0] + t_end = data.index[-1] + + Gb = data.glucose[t_0] + Ib = data.insulin[t_0] + I = interpolate(data.insulin) + + init = State(G=G0, X=0) + + return System(init=init, params=params, + Gb=Gb, Ib=Ib, I=I, + t_0=t_0, t_end=t_end, dt=2) + +from modsim import * + +def slope_func(t, state, system): + G, X = state + G0, k1, k2, k3 = system.params + I, Ib, Gb = system.I, system.Ib, system.Gb + + dGdt = -k1 * (G - Gb) - X*G + dXdt = k3 * (I(t) - Ib) - k2 * X + + return dGdt, dXdt + diff --git a/chap22.py b/chap22.py new file mode 100644 index 00000000..040c12e3 --- /dev/null +++ b/chap22.py @@ -0,0 +1,70 @@ +from modsim import * + +params = Params( + x = 0, # m + y = 1, # m + angle = 45, # degree + velocity = 40, # m / s + + mass = 145e-3, # kg + diameter = 73e-3, # m + C_d = 0.33, # dimensionless + + rho = 1.2, # kg/m**3 + g = 9.8, # m/s**2 + t_end = 10, # s +) + +from modsim import * + +from numpy import pi, deg2rad + +def make_system(params): + + # convert angle to degrees + theta = deg2rad(params.angle) + + # compute x and y components of velocity + vx, vy = pol2cart(theta, params.velocity) + + # make the initial state + init = State(x=params.x, y=params.y, vx=vx, vy=vy) + + # compute the frontal area + area = pi * (params.diameter/2)**2 + + return System(params, + init = init, + area = area, + ) + +from modsim import * + +def drag_force(V, system): + rho, C_d, area = system.rho, system.C_d, system.area + + mag = rho * vector_mag(V)**2 * C_d * area / 2 + direction = -vector_hat(V) + f_drag = mag * direction + return f_drag + +from modsim import * + +def slope_func(t, state, system): + x, y, vx, vy = state + mass, g = system.mass, system.g + + V = Vector(vx, vy) + a_drag = drag_force(V, system) / mass + a_grav = g * Vector(0, -1) + + A = a_grav + a_drag + + return V.x, V.y, A.x, A.y + +from modsim import * + +def event_func(t, state, system): + x, y, vx, vy = state + return y + From 27447686264ca061049def4872caaa3a5641c228 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 12:14:31 -0500 Subject: [PATCH 044/144] Updating modsim.py --- chap12.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chap12.py b/chap12.py index c389b767..f72e7997 100644 --- a/chap12.py +++ b/chap12.py @@ -1,7 +1,7 @@ from modsim import * def calc_total_infected(results, system): - s_0 = results.S[system.t0] + s_0 = results.S[0] s_end = results.S[system.t_end] return s_0 - s_end From c1c7858d85be6b769a1ff172b7f101ea7d063178 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 12:14:40 -0500 Subject: [PATCH 045/144] Updating chapters --- chapters/chap10.ipynb | 79 ++++-- chapters/chap11.ipynb | 212 +++++++--------- chapters/chap12.ipynb | 569 +++++++++--------------------------------- chapters/chap13.ipynb | 160 +++++++----- 4 files changed, 352 insertions(+), 668 deletions(-) diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 5cccdbf6..b6a1d3c6 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -100,12 +100,12 @@ "source": [ "## Prehistoric World Population\n", "\n", - "On the Wikipedia page about world population estimates, the second table contains estimates for prehistoric populations." + "On the Wikipedia page about world population growth, the second table contains estimates for prehistoric populations." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "usual-penguin", "metadata": { "tags": [] @@ -118,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "thick-lincoln", "metadata": { "tags": [] @@ -144,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "conscious-orange", "metadata": { "tags": [] @@ -162,14 +162,14 @@ "tags": [] }, "source": [ - "Not all researchers provide estimates for the same dates.\n", + "Some of the values are null because not all researchers provide estimates for the same dates.\n", "\n", "Again, we'll replace the long column names with more convenient abbreviations." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "thick-blanket", "metadata": { "tags": [] @@ -192,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "ranking-prescription", "metadata": { "tags": [] @@ -215,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "metallic-offense", "metadata": { "scrolled": false, @@ -250,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "id": "solar-action", "metadata": {}, "outputs": [], @@ -272,7 +272,36 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, + "id": "rural-express", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "preceding-sheep", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "id": "together-jackson", "metadata": {}, "outputs": [], @@ -282,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "simple-verse", "metadata": { "scrolled": true @@ -313,18 +342,20 @@ "This figure shows the three scenarios we'll consider:\n", "\n", "![One queue, one server (left), one queue, two servers (middle), two\n", - "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/master/figs/queue.png)\n", + "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", "*One queue, one server (left), one queue, two servers (middle), two\n", "queues, two servers (right).*\n", "\n", - "As we did in the bike share model, we'll assume that a customer is equally likely to arrive during any time step. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "As we did in the bike share model, we'll divide time into discrete time steps of one minute.\n", + "And we'll assume that a customer is equally likely to arrive during any time step. \n", + "I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", "\n", "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they always have the same probability of finishing during the next time step, regardless of how long they have been checking out. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", "\n", "If we choose $\\mu=1/5$ per minute, the average time for each checkout\n", "will be 5 minutes, which is consistent with the data. Most people takes less than 5 minutes, but a few take substantially longer, which is probably not a bad model of the distribution in real stores.\n", "\n", - "Now we're ready to get started. In the repository for this book, you'll find a notebook called `queue.ipynb` that contains some code to get you started and instructions.\n", + "Now we're ready to implement the model. In the repository for this book, you'll find a notebook called `queue.ipynb` that contains some code to get you started and instructions.\n", "\n", "As always, you should practice incremental development: write no more\n", "than one or two lines of code a time, and test as you go!" @@ -343,13 +374,11 @@ "The goal of this case study is to model year-to-year changes in\n", "population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", "\n", - "As an example, I use data from page 18 of the 2017 report, which\n", - "provides population estimates for the Narraguagus and Sheepscot Rivers\n", + "As an example, I use data from the 2017 report, which provides population estimates for the Narraguagus and Sheepscot Rivers\n", "in Maine.\n", "\n", "In the repository for this book, you'll find a notebook called\n", - "`salmon.ipynb` that contains some code to get you started and\n", - "instructions.\n", + "`salmon.ipynb` that contains this data and some code to get you started.\n", "\n", "You should take my instructions as suggestions; if you want to try\n", "something different, please do!" @@ -364,17 +393,17 @@ "\n", "This case study is based on \"Height-Age Curves for Planted Stands of\n", "Douglas Fir, with Adjustments for Density\", a working paper by\n", - "Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", + "Flewelling et al.\n", "\n", "It provides \"site index curves\", which are curves that show the\n", - "expected height of the tallest tree in a stand of Douglas firs as a\n", + "expected height of the tallest tree in a stand of Douglas fir as a\n", "function of age, for a stand where the trees are the same age.\n", "\n", - "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\" that indicates the quality of the site.\n", + "Depending on the quality of the site, the trees might grow more quickly or slowly. So each curve is identified by a \"site index\" that indicates the quality of the site.\n", "\n", "The goal of this case study is to explain the shape of these\n", "curves, that is, why trees grow the way they do.\n", - "The answer I propose involved fractal dimensions, so you might find it interesting.\n", + "The answer I propose involves fractal dimensions, so you might find it interesting.\n", "\n", "In the repository for this book, you'll find a notebook called\n", "`trees.ipynb` that incrementally develops a model of tree growth and uses it to fit the data.\n", diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index 001c40d5..4865ec5d 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -94,7 +94,7 @@ "susceptible population, and use it to evaluate the effectiveness of\n", "possible interventions.\n", "\n", - "My presentation of the model in the next few chapters is based on an excellent article by David Smith and Lang Moore, [^1]: Smith and Moore, \"The SIR Model for Spread of Disease,\" Journal of Online Mathematics and its Applications, December 2001, available at ." + "My presentation of the model in the next few chapters is based on an excellent article by David Smith and Lang Moore, \"The SIR Model for Spread of Disease,\" *Journal of Online Mathematics and its Applications*, December 2001, available at ." ] }, { @@ -127,22 +127,21 @@ "source": [ "## The SIR model\n", "\n", - "The Kermack-McKendrick model is a simple version of an **SIR model**,\n", - "so-named because it considers three categories of people:\n", + "The Kermack-McKendrick model is an example of an **SIR model**,\n", + "so-named because it represents three categories of people:\n", "\n", - "- **S**: People who are \"susceptible\\\", that is, capable of\n", + "- **S**: People who are \"susceptible\", that is, capable of\n", " contracting the disease if they come into contact with someone who\n", " is infected.\n", "\n", - "- **I**: People who are \"infectious\\\", that is, capable of passing\n", + "- **I**: People who are \"infectious\", that is, capable of passing\n", " along the disease if they come into contact with someone\n", " susceptible.\n", "\n", - "- **R**: People who are \"recovered\\\". In the basic version of the\n", + "- **R**: People who are \"recovered\". In the basic version of the\n", " model, people who have recovered are considered to be immune to\n", " reinfection. That is a reasonable model for some diseases, but not\n", - " for others, so it should be on the list of assumptions to reconsider\n", - " later." + " for others, so it should be on the list of assumptions to reconsider later." ] }, { @@ -192,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "fourth-celtic", + "id": "accomplished-franklin", "metadata": {}, "source": [ "## The SIR equations\n", @@ -215,13 +214,19 @@ "\n", "In this example, there are three stocks---susceptible, infectious, and\n", "recovered---and two flows---new infections and recoveries. Compartment\n", - "models are often represented visually using stock and flow diagrams (see ).\n", - "\n", + "models are often represented visually using stock and flow diagrams (see )." + ] + }, + { + "cell_type": "markdown", + "id": "fourth-celtic", + "metadata": {}, + "source": [ "The following figure shows the stock and flow diagram for an SIR\n", "model.\n", "\n", "![Stock and flow diagram for an SIR\n", - "model.](https://github.com/AllenDowney/ModSim/raw/master/figs/stock_flow1.png)\n", + "model.](https://github.com/AllenDowney/ModSim/raw/main/figs/stock_flow1.png)\n", "\n", "Stocks are represented by rectangles, flows by arrows. The widget in the middle of the arrows represents a valve that controls the rate of flow; the diagram shows the parameters that control the valves." ] @@ -249,13 +254,13 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 4, "id": "criminal-change", "metadata": {}, "outputs": [], "source": [ "init = State(S=89, I=1, R=0)\n", - "init" + "show(init)" ] }, { @@ -268,15 +273,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 5, "id": "pediatric-ratio", "metadata": {}, "outputs": [], "source": [ - "from numpy import sum\n", - "\n", - "init /= sum(init)\n", - "init" + "init /= init.sum()\n", + "show(init)" ] }, { @@ -290,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 6, "id": "little-stylus", "metadata": {}, "outputs": [], @@ -309,7 +312,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 7, "id": "veterinary-aerospace", "metadata": {}, "outputs": [], @@ -323,7 +326,7 @@ "id": "lightweight-delta", "metadata": {}, "source": [ - "Now we need a `System` object to store the parameters and initial\n", + "I'll use a `System` object to store the parameters and initial\n", "conditions. The following function takes the system parameters and returns a new `System` object:" ] }, @@ -338,12 +341,9 @@ "source": [ "def make_system(beta, gamma):\n", " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", + " init /= init.sum()\n", "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", + " return System(init=init, t_end=7*14,\n", " beta=beta, gamma=gamma)" ] }, @@ -368,7 +368,7 @@ "outputs": [], "source": [ "system = make_system(beta, gamma)\n", - "system" + "show(system)" ] }, { @@ -379,21 +379,20 @@ "## The update function\n", "\n", "At any point in time, the state of the system is represented by a\n", - "`State` object with three variables, `S`, `I` and `R`. So I'll define an\n", - "update function that takes as parameters a `State` object, the current\n", - "time, and a `System` object:" + "`State` object with three variables, `S`, `I` and `R`. So I'll define an update function that takes as parameters the current\n", + "time, a `State` object, and a `System` object:" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 10, "id": "wound-wayne", "metadata": { "tags": [] }, "outputs": [], "source": [ - "def update_func(state, t, system):\n", + "def update_func(t, state, system):\n", " s, i, r = state\n", "\n", " infected = system.beta * i * s \n", @@ -422,7 +421,7 @@ "\n", "The update function computes `infected` and `recovered` as a fraction of the population, then updates `s`, `i` and `r`. The return value is a `State` that contains the updated values.\n", "\n", - "When we call `update_func` like this:" + "We can call `update_func` like this:" ] }, { @@ -432,8 +431,8 @@ "metadata": {}, "outputs": [], "source": [ - "state = update_func(init, 0, system)\n", - "state" + "state = update_func(0, init, system)\n", + "show(state)" ] }, { @@ -441,6 +440,8 @@ "id": "standard-search", "metadata": {}, "source": [ + "The result is the new `State` object.\n", + "\n", "You might notice that this version of `update_func` does not use one of its parameters, `t`. I include it anyway because update functions\n", "sometimes depend on time, and it is convenient if they all take the same parameters, whether they need them or not." ] @@ -457,20 +458,16 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 12, "id": "occasional-pottery", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "from numpy import arange\n", - "\n", - "def run_simulation(system, update_func):\n", + "def run_simulation1(system, update_func):\n", " state = system.init\n", "\n", - " for t in arange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", + " for t in range(0, system.t_end):\n", + " state = update_func(t, state, system)\n", "\n", " return state" ] @@ -482,38 +479,20 @@ "source": [ "The parameters of `run_simulation` are the `System` object and the\n", "update function. The `System` object contains the parameters, initial\n", - "conditions, and values of `t0` and `t_end`.\n", + "conditions, and values of `0` and `t_end`.\n", "\n", "We can call `run_simulation` like this:" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 13, "id": "differential-difference", "metadata": {}, "outputs": [], "source": [ - "system = make_system(beta, gamma)\n", - "final_state = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "id": "incredible-marsh", - "metadata": {}, - "source": [ - "The result is the final state of the system:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "weekly-acrobat", - "metadata": {}, - "outputs": [], - "source": [ - "final_state" + "final_state = run_simulation1(system, update_func)\n", + "show(final_state)" ] }, { @@ -521,9 +500,9 @@ "id": "behind-removal", "metadata": {}, "source": [ - "This result indicates that after 14 weeks (98 days), about 52% of the\n", + "The result indicates that after 14 weeks (98 days), about 52% of the\n", "population is still susceptible, which means they were never infected,\n", - "less than 1% are actively infected, and 48% have recovered, which means they were infected at some point." + "almost 48% have recovered, which means they were infected at some point, and less than 1% are actively infected." ] }, { @@ -541,24 +520,21 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 14, "id": "advanced-recommendation", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", - "def run_simulation(system, update_func):\n", + "def run_simulation2(system, update_func):\n", " S = TimeSeries()\n", " I = TimeSeries()\n", " R = TimeSeries()\n", "\n", " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", + " S[0], I[0], R[0] = state\n", " \n", - " for t in arange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", + " for t in range(0, system.t_end):\n", + " state = update_func(t, state, system)\n", " S[t+1], I[t+1], R[t+1] = state\n", " \n", " return S, I, R" @@ -569,32 +545,25 @@ "id": "behind-breathing", "metadata": {}, "source": [ - "First, we create `TimeSeries` objects to store the results. Notice that\n", - "the variables `S`, `I`, and `R` are `TimeSeries` objects now.\n", - "\n", - "Next we initialize `state`, `t0`, and the first elements of `S`, `I` and\n", + "First, we create `TimeSeries` objects to store the results.\n", + "Next we initialize `state` and the first elements of `S`, `I` and\n", "`R`.\n", "\n", - "Inside the loop, we use `update_func` to compute the state of the system\n", - "at the next time step, then use multiple assignment to unpack the\n", - "elements of `state`, assigning each to the corresponding `TimeSeries`.\n", + "Inside the loop, we use `update_func` to compute the state of the system at the next time step, then use multiple assignment to unpack the elements of `state`, assigning each to the corresponding `TimeSeries`.\n", "\n", - "At the end of the function, we return the values `S`, `I`, and `R`. This\n", - "is the first example we have seen where a function returns more than one\n", - "value.\n", + "At the end of the function, we return the values `S`, `I`, and `R`. This is the first example we have seen where a function returns more than one value.\n", "\n", - "Now we can run the function like this:" + "We can run the function like this:" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 15, "id": "subtle-zambia", "metadata": {}, "outputs": [], "source": [ - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" + "S, I, R = run_simulation2(system, update_func)" ] }, { @@ -607,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 16, "id": "welcome-tractor", "metadata": { "tags": [] @@ -632,7 +601,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 17, "id": "agricultural-joining", "metadata": {}, "outputs": [], @@ -645,7 +614,7 @@ "id": "civic-pharmacy", "metadata": {}, "source": [ - "Notice that it takes about three weeks (21 days) for the outbreak to get going, and about six weeks (42 days) before it peaks. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." + "It takes about three weeks (21 days) for the outbreak to get going, and about five weeks (35 days) to peak. The fraction of the population that's infected is never very high, but it adds up. In total, almost half the population gets sick." ] }, { @@ -658,15 +627,14 @@ "If the number of state variables is small, storing them as separate\n", "`TimeSeries` objects might not be so bad. But a better alternative is to use a `TimeFrame`, which is another object defined in the ModSim\n", "library.\n", - "\n", - "A `TimeFrame` is a kind of a `DataFrame`, which we used in.\n", + "A `TimeFrame` is a kind of a `DataFrame`, which we used earlier to store world population estimates.\n", "\n", "Here's a more concise version of `run_simulation` using a `TimeFrame`:" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 18, "id": "native-central", "metadata": { "tags": [] @@ -675,10 +643,10 @@ "source": [ "def run_simulation(system, update_func):\n", " frame = TimeFrame(columns=system.init.index)\n", - " frame.loc[system.t0] = system.init\n", + " frame.loc[0] = system.init\n", " \n", - " for t in arange(system.t0, system.t_end):\n", - " frame.loc[t+1] = update_func(frame.loc[t], t, system)\n", + " for t in range(0, system.t_end):\n", + " frame.loc[t+1] = update_func(t, frame.loc[t], system)\n", " \n", " return frame" ] @@ -690,19 +658,18 @@ "source": [ "The first line creates an empty `TimeFrame` with one column for each\n", "state variable. Then, before the loop starts, we store the initial\n", - "conditions in the `TimeFrame` at `t0`. Based on the way we've been using\n", + "conditions in the `TimeFrame` at `0`. Based on the way we've been using\n", "`TimeSeries` objects, it is tempting to write:\n", "\n", "```\n", - "frame[system.t0] = system.init\n", + "frame[0] = system.init\n", "```\n", "\n", "But when you use the bracket operator with a `TimeFrame` or `DataFrame`, it selects a column, not a row. \n", - "\n", "To select a row, we have to use `loc`, like this:\n", "\n", "```\n", - "frame.loc[system.t0] = system.init\n", + "frame.loc[0] = system.init\n", "```\n", "\n", "Since the value on the right side is a `State`, the assignment matches\n", @@ -718,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 19, "id": "quick-fifty", "metadata": {}, "outputs": [], @@ -736,7 +703,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 20, "id": "listed-enough", "metadata": {}, "outputs": [], @@ -759,7 +726,12 @@ "metadata": {}, "source": [ "## Summary\n", - "\n" + "\n", + "This chapter presents an SIR model of infectious disease and two ways to collect the results, using several `TimeSeries` objects or a single `TimeFrame`.\n", + "\n", + "In the next chapter we'll use the model to explore the effect of immunization and other interventions.\n", + "\n", + "But first you might want to work on these exercises." ] }, { @@ -782,8 +754,8 @@ }, { "cell_type": "code", - "execution_count": 45, - "id": "recovered-freeze", + "execution_count": 21, + "id": "parental-thunder", "metadata": {}, "outputs": [], "source": [ @@ -792,19 +764,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "interpreted-colony", + "execution_count": 22, + "id": "recovered-freeze", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# Solution goes here" + ] }, { "cell_type": "code", - "execution_count": null, - "id": "given-canberra", + "execution_count": 23, + "id": "suited-spanking", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# Solution goes here" + ] } ], "metadata": { diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index a71639ac..fc23c876 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -85,11 +85,26 @@ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap12.ipynb)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "breathing-hamilton", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap11.py')" + ] + }, { "cell_type": "code", "execution_count": 4, "id": "growing-sperm", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# import code from previous notebooks\n", @@ -104,7 +119,9 @@ "id": "identical-steam", "metadata": {}, "source": [ - "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects." + "In the previous chapter I presented the SIR model of infectious disease and used it to model the Freshman Plague at Olin. In this chapter we'll consider metrics intended to quantify the effects of the disease and interventions intended to reduce those effects.\n", + "\n", + "We'll use some of the functions from the previous chapter: `make_system`, `update_func`, and the last version of `run_simulation`, which returns the results in a `DataFrame` object." ] }, { @@ -126,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 11, "id": "recent-cooper", "metadata": {}, "outputs": [], @@ -142,12 +159,14 @@ "metadata": {}, "source": [ "`add_immunization` moves the given fraction of the population from `S`\n", - "to `R`. " + "to `R`.\n", + "\n", + "As a basis for comparison, I'll run the model with the same parameters as in the previous chapter, with no immunization." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 12, "id": "found-learning", "metadata": {}, "outputs": [], @@ -167,20 +186,36 @@ "id": "unsigned-joseph", "metadata": {}, "source": [ - "If we assume that 10% of students are vaccinated at the\n", - "beginning of the semester, and the vaccine is 100% effective, we can\n", - "simulate the effect like this:" + "Now let's see what happens if 10% of students are immune.\n", + "I'll make another `System` object with the same parameters, then run `add_immunization` to modify the initial conditions." ] }, { "cell_type": "code", - "execution_count": 7, - "id": "funny-copper", + "execution_count": 13, + "id": "enormous-abortion", "metadata": {}, "outputs": [], "source": [ "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", + "add_immunization(system2, 0.1)" + ] + }, + { + "cell_type": "markdown", + "id": "subject-ideal", + "metadata": {}, + "source": [ + "Now we can run the simulation like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "funny-copper", + "metadata": {}, + "outputs": [], + "source": [ "results2 = run_simulation(system2, update_func)" ] }, @@ -195,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 15, "id": "divided-biotechnology", "metadata": {}, "outputs": [], @@ -207,6 +242,15 @@ " ylabel='Fraction of population')" ] }, + { + "cell_type": "markdown", + "id": "passive-dance", + "metadata": {}, + "source": [ + "With immunization, there is a smaller change in `S`; that is, fewer people are infected.\n", + "In the next section we'll compute this change and use it to quantify the effect of immunization." + ] + }, { "cell_type": "markdown", "id": "postal-cemetery", @@ -217,7 +261,7 @@ "When we plot a time series, we get a view of everything that happened\n", "when the model ran, but often we want to boil it down to a few numbers\n", "that summarize the outcome. These summary statistics are called\n", - "**metrics**, as we saw in Section xxx.\n", + "**metrics**.\n", "\n", "In the SIR model, we might want to know the time until the peak of the\n", "outbreak, the number of people who are sick at the peak, the number of\n", @@ -225,13 +269,12 @@ "\n", "As an example, I will focus on the last one --- the total number of sick students --- and we will consider interventions intended to minimize it.\n", "\n", - "When a person gets infected, they move from `S` to `I`, so we can get\n", - "the total number of infections by computing the difference in `S` at the beginning and the end:" + "We can get the total number of infections by computing the difference in `S` at the beginning and the end of the simulation." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 18, "id": "synthetic-element", "metadata": { "tags": [] @@ -239,14 +282,14 @@ "outputs": [], "source": [ "def calc_total_infected(results, system):\n", - " s_0 = results.S[system.t0]\n", + " s_0 = results.S[0]\n", " s_end = results.S[system.t_end]\n", " return s_0 - s_end" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 19, "id": "recovered-picnic", "metadata": {}, "outputs": [], @@ -256,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 20, "id": "american-transfer", "metadata": {}, "outputs": [], @@ -285,55 +328,60 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 27, "id": "progressive-architect", "metadata": {}, "outputs": [], "source": [ - "def sweep_immunity(immunize_array):\n", + "def sweep_immunity(fraction_array):\n", " sweep = SweepSeries()\n", "\n", - " for fraction in immunize_array:\n", - " sir = make_system(beta, gamma)\n", - " add_immunization(sir, fraction)\n", - " results = run_simulation(sir, update_func)\n", - " sweep[fraction] = calc_total_infected(results, sir)\n", + " for fraction in fraction_array:\n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " results = run_simulation(system, update_func)\n", + " sweep[fraction] = calc_total_infected(results, system)\n", "\n", " return sweep" ] }, { "cell_type": "markdown", - "id": "indie-seeker", + "id": "timely-industry", "metadata": {}, "source": [ - "The parameter of `sweep_immunity` is an array of immunization rates. The\n", - "result is a `SweepSeries` object that maps from each immunization rate\n", - "to the resulting fraction of students ever infected.\n", + "The parameter of `sweep_immunity` is an array of immunization rates. The result is a `SweepSeries` object that maps from each immunization rate to the resulting fraction of students ever infected.\n", "\n", - "The following figure shows a plot of the `SweepSeries`. Notice that\n", - "the x-axis is the immunization rate, not time." + "We can call it like this:" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 28, "id": "measured-pavilion", "metadata": {}, "outputs": [], "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" + "fraction_array = linspace(0, 1, 21)\n", + "infected_sweep = sweep_immunity(fraction_array)" + ] + }, + { + "cell_type": "markdown", + "id": "indie-seeker", + "metadata": {}, + "source": [ + "The following figure plots the `SweepSeries`. Notice that the $x$-axis is the immunization rate, not time." ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 29, "id": "interior-humanitarian", "metadata": {}, "outputs": [], "source": [ - "infected_sweep.plot()\n", + "infected_sweep.plot(color='C2')\n", "\n", "decorate(xlabel='Fraction immunized',\n", " ylabel='Total fraction infected',\n", @@ -368,474 +416,83 @@ "\n", "But it's a curse because a small decrease in immunization can cause a\n", "big increase in infections. In this example, if we drop from 80%\n", - "immunization to 60%, that might not be too bad. But if we drop from 40% to 20%, that would trigger a major outbreak, affecting more than 15% of the population. For a serious disease like measles, just to name one, that would be a public health catastrophe.\n", - "\n", - "One use of models like this is to demonstrate phenomena like herd\n", - "immunity and to predict the effect of interventions like vaccination.\n", - "Another use is to evaluate alternatives and guide decision making. We'll see an example in the next section." + "immunization to 60%, that might not be too bad. But if we drop from 40% to 20%, that would trigger a major outbreak, affecting more than 15% of the population. For a serious disease like measles, just to name one, that would be a public health catastrophe." ] }, { "cell_type": "markdown", - "id": "changed-capability", - "metadata": {}, - "source": [ - "## Hand washing\n", - "\n", - "Suppose you are the Dean of Student Life, and you have a budget of just \\$1200 to combat the Freshman Plague. You have two options for spending this money:\n", - "\n", - "1. You can pay for vaccinations, at a rate of \\$100 per dose.\n", - "\n", - "2. You can spend money on a campaign to remind students to wash hands\n", - " frequently.\n", - "\n", - "We have already seen how we can model the effect of vaccination. Now\n", - "let's think about the hand-washing campaign. We'll have to answer two\n", - "questions:\n", - "\n", - "1. How should we incorporate the effect of hand washing in the model?\n", - "\n", - "2. How should we quantify the effect of the money we spend on a\n", - " hand-washing campaign?\n", - "\n", - "For the sake of simplicity, let's assume that we have data from a\n", - "similar campaign at another school showing that a well-funded campaign\n", - "can change student behavior enough to reduce the infection rate by 20%.\n", - "\n", - "In terms of the model, hand washing has the effect of reducing `beta`.\n", - "That's not the only way we could incorporate the effect, but it seems\n", - "reasonable and it's easy to implement." - ] - }, - { - "cell_type": "markdown", - "id": "alpine-guest", - "metadata": {}, - "source": [ - "Now we have to model the relationship between the money we spend and the\n", - "effectiveness of the campaign. Again, let's suppose we have data from\n", - "another school that suggests:\n", - "\n", - "- If we spend \\$500 on posters, materials, and staff time, we can\n", - " change student behavior in a way that decreases the effective value of `beta` by 10%.\n", - "\n", - "- If we spend \\$1000, the total decrease in `beta` is almost 20%.\n", - "\n", - "- Above \\$1000, additional spending has little additional benefit." - ] - }, - { - "cell_type": "markdown", - "id": "agricultural-trinidad", - "metadata": {}, - "source": [ - "## Logistic function" - ] - }, - { - "cell_type": "markdown", - "id": "cheap-structure", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "blond-armstrong", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import exp\n", - "\n", - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "id": "seven-budget", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "disturbed-amount", - "metadata": {}, - "outputs": [], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "id": "supreme-nutrition", + "id": "amino-excess", "metadata": {}, "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "## Summary\n", "\n", - "`M` is chosen so the transition happens around \\$500.\n", + "In general, models are used to predict, explain, and design.\n", + "In this chapter, we use an SIR predict the effect of immunization and to explain the phenomenon of herd immunity.\n", "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", + "In the repository for this book, you will find a file called `plague.ipynb` that uses this model for design, that is, for making public health decisions intended to achieve a goal.\n", "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "otherwise-answer", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "expected-venture", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "seventh-strike", - "metadata": {}, - "outputs": [], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "make_series(spending, percent_reduction).plot()\n", + "In the next chapter, we'll explore the SIR model further by sweeping the parameters.\n", "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate')" - ] - }, - { - "cell_type": "markdown", - "id": "legal-michigan", - "metadata": {}, - "source": [ - "The result is the following function, which\n", - "takes spending as a parameter and returns `factor`, which is the factor\n", - "by which `beta` is reduced:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "obvious-congress", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "sunset-investing", - "metadata": {}, - "source": [ - "I use `compute_factor` to write `add_hand_washing`, which takes a\n", - "`System` object and a budget, and modifies `system.beta` to model the\n", - "effect of hand washing:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "polish-multiple", - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "id": "worthy-fellowship", - "metadata": {}, - "source": [ - "Now we can sweep a range of values for `spending` and use the simulation\n", - "to compute the effect:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "statistical-garden", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results, system)\n", - " \n", - " return sweep" + "But first you might want to work on this exercise." ] }, { "cell_type": "markdown", - "id": "clinical-surge", - "metadata": {}, - "source": [ - "Here's how we run it:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "joined-graduation", + "id": "drawn-hindu", "metadata": {}, - "outputs": [], "source": [ - "from numpy import linspace\n", + "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary or a private dorm room until they are no longer infectious.\n", "\n", - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep2 = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "id": "designing-smile", - "metadata": {}, - "source": [ - "The following figure shows the result. " + "How might you incorporate the effect of quarantine in the SIR model?" ] }, { "cell_type": "code", - "execution_count": 23, - "id": "cheap-decision", + "execution_count": 30, + "id": "impressive-librarian", "metadata": {}, "outputs": [], "source": [ - "infected_sweep2.plot()\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections')" - ] - }, - { - "cell_type": "markdown", - "id": "selective-right", - "metadata": {}, - "source": [ - "Below \\$200, the campaign has little effect. \n", - "\n", - "At \\$800 it has a substantial effect, reducing total infections from more than 45% to about 20%. \n", - "\n", - "Above \\$800, the additional benefit is small." - ] - }, - { - "cell_type": "markdown", - "id": "lucky-boulder", - "metadata": {}, - "source": [ - "## Optimization\n", - "\n", - "Let's put it all together. With a fixed budget of \\$1200, we have to\n", - "decide how many doses of vaccine to buy and how much to spend on the\n", - "hand-washing campaign.\n", - "\n", - "Here are the parameters:" + "# Solution goes here" ] }, { "cell_type": "code", "execution_count": 31, - "id": "surrounded-copying", + "id": "assumed-license", "metadata": {}, "outputs": [], "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)\n", - "max_doses" - ] - }, - { - "cell_type": "markdown", - "id": "expired-conditioning", - "metadata": {}, - "source": [ - "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", - "built-in function that converts numbers to integers, rounding down.\n", - "\n", - "We'll sweep the range of possible doses:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "shaped-utility", - "metadata": {}, - "outputs": [], - "source": [ - "dose_array = linrange(max_doses)" - ] - }, - { - "cell_type": "markdown", - "id": "occupational-reply", - "metadata": {}, - "source": [ - "In this example we call `linrange` with only one argument; it returns a NumPy array with the integers from 0 to `max_doses`, including both.\n", - "\n", - "Then we run the simulation for each element of `dose_array`:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "recognized-release", - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results, system)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "id": "cardiac-mitchell", - "metadata": {}, - "source": [ - "For each number of doses, we compute the fraction of students we can\n", - "immunize, `fraction` and the remaining budget we can spend on the\n", - "campaign, `spending`. Then we run the simulation with those quantities\n", - "and store the number of infections.\n", - "\n", - "The following figure shows the result." + "# Solution goes here" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "worth-mounting", + "execution_count": 32, + "id": "intended-premium", "metadata": {}, "outputs": [], "source": [ - "infected_sweep3 = sweep_doses(dose_array)" + "# Solution goes here" ] }, { "cell_type": "code", - "execution_count": 28, - "id": "adjusted-highlight", + "execution_count": 34, + "id": "limiting-interest", "metadata": {}, "outputs": [], "source": [ - "infected_sweep3.plot()\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses')" - ] - }, - { - "cell_type": "markdown", - "id": "dynamic-easter", - "metadata": {}, - "source": [ - "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", - "\n", - "As we increase the number of doses, we have to cut campaign spending,\n", - "which turns out to make things worse. But interestingly, when we get\n", - "above 10 doses, the effect of herd immunity starts to kick in, and the\n", - "number of sick students goes down again." - ] - }, - { - "cell_type": "markdown", - "id": "amino-excess", - "metadata": {}, - "source": [ - "## Summary" - ] - }, - { - "cell_type": "markdown", - "id": "timely-bottom", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "id": "drawn-hindu", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" + "# Solution goes here" ] }, { "cell_type": "code", - "execution_count": 29, - "id": "impressive-librarian", + "execution_count": null, + "id": "undefined-treasury", "metadata": {}, "outputs": [], - "source": [ - "# Solution goes here" - ] + "source": [] } ], "metadata": { diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index ab1d4886..46d86119 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -88,6 +88,32 @@ { "cell_type": "code", "execution_count": 4, + "id": "fantastic-recovery", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap11.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "excellent-harris", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap12.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, "id": "apparent-horizon", "metadata": { "tags": [] @@ -107,11 +133,13 @@ "id": "electoral-montgomery", "metadata": {}, "source": [ - "In the previous chapters I presented an SIR model of infectious disease, specifically the Kermack-McKendrick model. We extended the model to include vaccination and the effect of a hand-washing campaign, and used the extended model to allocate a limited budget optimally, that is, to minimize the number of infections.\n", + "In the previous chapter we extended the SIR model to include immunization and used it to demonstrate herd immunity.\n", "\n", "But we assumed that the parameters of the model, contact rate and\n", "recovery rate, were known. In this chapter, we explore the behavior of\n", - "the model as we vary these parameters, use analysis to understand these relationships better, and propose a method for using data to estimate parameters." + "the model as we vary these parameters.\n", + "\n", + "In the next chapter, we use analysis to understand these relationships better, and propose a method for using data to estimate parameters." ] }, { @@ -136,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "id": "amazing-operations", "metadata": {}, "outputs": [], @@ -150,34 +178,16 @@ "id": "adopted-selling", "metadata": {}, "source": [ - "Then run the simulation for each value and print the results." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "brief-minutes", - "metadata": {}, - "outputs": [], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(beta, calc_total_infected(results, system))" - ] - }, - { - "cell_type": "markdown", - "id": "understanding-teach", - "metadata": {}, - "source": [ - "We can wrap that code in a function and store the results in a\n", - "`SweepSeries` object:" + "The following function takes this array as a parameter and a single value for `gamma`.\n", + "\n", + "It runs the simulation for each value of `beta` and computes the same metric we used in the previous chapter, the fraction of the population that gets infected.\n", + "\n", + "The result is a `SweepSeries` that contains the values of `beta` and the corresponding metrics." ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "single-burke", "metadata": { "tags": [] @@ -198,12 +208,12 @@ "id": "wired-wrist", "metadata": {}, "source": [ - "Now we can run `sweep_beta` like this:" + "We can run `sweep_beta` like this:" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "collected-practice", "metadata": {}, "outputs": [], @@ -216,12 +226,12 @@ "id": "exempt-binary", "metadata": {}, "source": [ - "And plot the results:" + "Before we plot the results, I will use a formatted string literal, also called an **f-string** to assemble a label that includes the value of `gamma`:" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "competitive-amount", "metadata": {}, "outputs": [], @@ -235,28 +245,25 @@ "id": "imported-huntington", "metadata": {}, "source": [ - "The first line uses a formatted string literal, also called an **f-string** to assemble a label for the plotted line:\n", - "\n", - "- An f-string starts with the letter \"f\" followed by a string in single or double quote. \n", - "\n", - "- The string can contain any number of format specifiers in squiggly brackets, `{}`.\n", + "An f-string starts with the letter \"f\" followed by a string in single or double quotes. \n", + "The string can contain any number of format specifiers in squiggly brackets, `{}`.\n", + "When a variable name appears in a format specifier, it is replaced with the value of the variable.\n", "\n", - "- When a variable name appears in a format specifier, it is replaced with the value of the variable.\n", - "\n", - "In this example, if the value of `gamma` is `0.25`, the value of `label` is `'gamma = 0.25'`.\n", + "In this example, the value of `gamma` is `0.25`, so the value of `label` is `'gamma = 0.25'`.\n", "\n", "You can read more about f-strings at .\n", - "\n" + "\n", + "Now let's see the results." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "certain-second", "metadata": {}, "outputs": [], "source": [ - "infected_sweep.plot(label=label)\n", + "infected_sweep.plot(label=label, color='C1')\n", "\n", "decorate(xlabel='Contact rate (beta)',\n", " ylabel='Fraction infected')" @@ -286,17 +293,18 @@ "## Sweeping gamma\n", "\n", "Let's see what that looks like for a few different values of `gamma`.\n", - "Again, we'll use `linspace` to make an array of values:" + "We'll use `linspace` to make an array of values:" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "advised-venice", "metadata": {}, "outputs": [], "source": [ - "gamma_array = linspace(0.1, 0.7, 4)" + "gamma_array = linspace(0.1, 0.7, 4)\n", + "gamma_array" ] }, { @@ -309,17 +317,18 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "determined-consent", "metadata": {}, "outputs": [], "source": [ "for gamma in gamma_array:\n", " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", + " label = f'gamma = {gamma}'\n", " infected_sweep.plot(label=label)\n", " \n", - "decorate()" + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')" ] }, { @@ -354,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "aquatic-federal", "metadata": { "tags": [] @@ -392,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "julian-liberia", "metadata": {}, "outputs": [], @@ -410,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "id": "superior-redhead", "metadata": {}, "outputs": [], @@ -433,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 17, "id": "regular-drama", "metadata": {}, "outputs": [], @@ -455,16 +464,14 @@ "\n", "Another way to visualize the results of a two-dimensional sweep is a\n", "**contour plot**, which shows the parameters on the axes and contour\n", - "lines, that is, lines of constant value. In this example, the value is\n", - "the fraction of students infected.\n", + "lines where the value of the metric is constant.\n", "\n", - "The ModSim library provides `contour`, which takes a `SweepFrame` as a\n", - "parameter:" + "The ModSim library provides `contour`, which takes a `SweepFrame` and uses Matplotlib to generate a contour plot." ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 18, "id": "logical-method", "metadata": {}, "outputs": [], @@ -481,11 +488,10 @@ "id": "corresponding-headline", "metadata": {}, "source": [ - "Infection rates are lowest in the lower right, where the contact rate is and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", + "The values of `gamma` are on the $x$-axis, corresponding to the columns of the `SweepFrame`.\n", + "The values of `beta` are on the $y$-axis, corresponding to the rows of the `SweepFrame`.\n", "\n", - "This figure suggests that there might be a relationship between `beta`\n", - "and `gamma` that determines the outcome of the model. In fact, there is.\n", - "In the next chapter we'll explore it by running simulations, then derive it by analysis.\n", + "Infection rates are lowest in the lower right, where the contact rate is low and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", "\n" ] }, @@ -494,7 +500,21 @@ "id": "located-double", "metadata": {}, "source": [ - "## Summary" + "## Summary\n", + "\n", + "This chapter demonstrates a two-dimensional parameter sweep using a `SweepFrame` to store the results.\n", + "\n", + "We plotted the results three ways: \n", + "\n", + "* First we plotted total infections versus `beta`, with one line for each value of `gamma`.\n", + "\n", + "* Then we plotted total infections versus `gamma`, with one line for each value of `beta`.\n", + "\n", + "* Finally, we made a contour plot with `beta` on the $y$-axis, `gamma` on the $x$-axis and contour lines where the metric is constant.\n", + "\n", + "These visualizations suggest that there is a relationship between `beta` and `gamma` that determines the outcome of the model. \n", + "In fact, there is.\n", + "In the next chapter we'll explore it by running simulations, then derive it by analysis." ] }, { @@ -510,12 +530,14 @@ "id": "stopped-breathing", "metadata": {}, "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." + "**Exercise:** If we know `beta` and `gamma`, we can compute the fraction of the population that gets infected. In general, we don't know these parameters, but sometimes we can estimate them based on the behavior of an outbreak.\n", + "\n", + "Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts, `1/beta`." ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 19, "id": "talented-crack", "metadata": {}, "outputs": [], @@ -525,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 20, "id": "pressed-isaac", "metadata": {}, "outputs": [], @@ -535,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 21, "id": "equal-crazy", "metadata": {}, "outputs": [], From 041ab45c30482439ebfcb6c6ad501592277c0484 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 12:14:40 -0500 Subject: [PATCH 046/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 165534 -> 163285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index e0d387e9ff6fb88c38e596b9638bd4c83dbf0369..54410d0d620febdb0b81138697ce9f68f7edf706 100644 GIT binary patch delta 21513 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 delta 23760 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

    rG!IBGy5(e~LV&`qOTrR^GAFJDG>BK%Dp@48# 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 From a90bad047cf0bccb9b74c26273fbf4267eaf03d1 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 19:53:43 -0500 Subject: [PATCH 047/144] Updating chapters --- chapters/chap07.ipynb | 187 +++++++----------- chapters/chap08.ipynb | 13 +- chapters/chap13.ipynb | 100 +++++----- chapters/chap14.ipynb | 427 ++++++++++++++++++++++++++++++------------ chapters/chap16.ipynb | 147 ++++++++++----- 5 files changed, 525 insertions(+), 349 deletions(-) diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index 0c965728..e3f69fc6 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "regular-director", + "id": "progressive-travel", "metadata": {}, "source": [ "# Chapter 7" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "imported-table", + "id": "black-toolbox", "metadata": { "tags": [] }, @@ -25,7 +25,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "electoral-turkey", + "id": "incorrect-probability", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "formal-context", + "execution_count": 2, + "id": "earlier-pride", "metadata": { "tags": [] }, @@ -65,8 +65,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "progressive-typing", + "execution_count": 3, + "id": "bound-nature", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "found-pledge", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap07.ipynb)" @@ -87,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "straight-algeria", + "id": "general-noise", "metadata": { "tags": [] }, @@ -98,7 +98,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "square-trademark", + "id": "affiliated-eleven", "metadata": { "tags": [] }, @@ -111,7 +111,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "arctic-toilet", + "id": "recent-trouble", "metadata": { "tags": [] }, @@ -130,7 +130,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "protective-pipeline", + "id": "western-blowing", "metadata": { "tags": [] }, @@ -142,7 +142,7 @@ }, { "cell_type": "markdown", - "id": "informational-hungary", + "id": "occasional-kitchen", "metadata": { "tags": [] }, @@ -153,7 +153,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "associate-novel", + "id": "monetary-profile", "metadata": { "tags": [] }, @@ -170,7 +170,7 @@ }, { "cell_type": "markdown", - "id": "indie-scoop", + "id": "damaged-reservation", "metadata": {}, "source": [ "In the previous chapter we developed a population model where net growth during each time step is proportional to the current population. This model seems more realistic than the constant growth model, but it does not fit the data as well.\n", @@ -188,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "champion-retreat", + "id": "assigned-slovakia", "metadata": {}, "source": [ "## Quadratic growth\n", @@ -211,7 +211,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "sized-hawaiian", + "id": "beginning-belly", "metadata": {}, "outputs": [], "source": [ @@ -221,7 +221,7 @@ }, { "cell_type": "markdown", - "id": "amateur-strand", + "id": "initial-factory", "metadata": {}, "source": [ "Here's the `System` object we'll use, initialized with `t_0`, `p_0`, and `t_end`." @@ -230,7 +230,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "interstate-canal", + "id": "listed-florence", "metadata": {}, "outputs": [], "source": [ @@ -245,7 +245,7 @@ }, { "cell_type": "markdown", - "id": "acting-transportation", + "id": "amber-context", "metadata": {}, "source": [ "Now we have to add the parameters `alpha` and `beta` .\n", @@ -255,7 +255,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "banned-dallas", + "id": "signed-impossible", "metadata": {}, "outputs": [], "source": [ @@ -265,7 +265,7 @@ }, { "cell_type": "markdown", - "id": "supreme-wellington", + "id": "confidential-retreat", "metadata": {}, "source": [ "And here's how we run it:" @@ -274,7 +274,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "positive-scheme", + "id": "italian-converter", "metadata": {}, "outputs": [], "source": [ @@ -283,7 +283,7 @@ }, { "cell_type": "markdown", - "id": "satisfied-density", + "id": "forbidden-brisbane", "metadata": {}, "source": [ "And here are the results." @@ -292,7 +292,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "flush-fellowship", + "id": "simplified-sight", "metadata": {}, "outputs": [], "source": [ @@ -303,7 +303,7 @@ }, { "cell_type": "markdown", - "id": "organized-combining", + "id": "primary-ending", "metadata": {}, "source": [ "The model fits the data well over the whole range, with just a bit of space between them in the 1960s.\n", @@ -324,7 +324,7 @@ }, { "cell_type": "markdown", - "id": "powerful-century", + "id": "sunset-underground", "metadata": {}, "source": [ "## Net growth\n", @@ -337,7 +337,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "excited-catch", + "id": "neural-guinea", "metadata": {}, "outputs": [], "source": [ @@ -348,7 +348,7 @@ }, { "cell_type": "markdown", - "id": "tracked-guide", + "id": "heated-selling", "metadata": {}, "source": [ "Now I'll use the quadratic model to compute net growth for each population." @@ -357,7 +357,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "classical-badge", + "id": "animal-spoke", "metadata": {}, "outputs": [], "source": [ @@ -367,48 +367,48 @@ }, { "cell_type": "markdown", - "id": "quantitative-differential", + "id": "engaging-parade", "metadata": {}, "source": [ - "In order to plot growth rate versus population, we'll use `make_series` to make a Pandas `Series`." + "To plot growth rate versus population, we'll use the `plot` function from Matplotlib.\n", + "First we have to import it:" ] }, { "cell_type": "code", "execution_count": 15, - "id": "interim-consent", + "id": "informed-three", "metadata": {}, "outputs": [], "source": [ - "growth_series = make_series(pop_array, growth_array)" + "from matplotlib.pyplot import plot" ] }, { "cell_type": "markdown", - "id": "published-average", + "id": "retained-deployment", "metadata": {}, "source": [ - "Which we can plot like this:" + "Now we can use it like this:" ] }, { "cell_type": "code", "execution_count": 16, - "id": "received-crossing", + "id": "unexpected-nigeria", "metadata": {}, "outputs": [], "source": [ - "growth_series.plot(label='growth')\n", - "\n", + "plot(pop_array, growth_array, label='net growth')\n", "\n", "decorate(xlabel='Population (billions)',\n", " ylabel='Net growth (billions)',\n", - " title='Growth vs. Population')" + " title='Net Growth vs. Population')" ] }, { "cell_type": "markdown", - "id": "plastic-wisdom", + "id": "precise-finish", "metadata": {}, "source": [ "Note that the x-axis is not time, as in the previous figures, but population. We can divide this curve into four regimes of behavior:\n", @@ -433,7 +433,7 @@ }, { "cell_type": "markdown", - "id": "relevant-detection", + "id": "angry-voice", "metadata": {}, "source": [ "## Equilibrium\n", @@ -456,7 +456,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "lightweight-entrepreneur", + "id": "ordinary-honolulu", "metadata": {}, "outputs": [], "source": [ @@ -465,7 +465,7 @@ }, { "cell_type": "markdown", - "id": "stuck-flood", + "id": "adaptive-pharmacy", "metadata": {}, "source": [ "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", @@ -485,7 +485,7 @@ }, { "cell_type": "markdown", - "id": "derived-oliver", + "id": "continental-image", "metadata": {}, "source": [ "## Summary\n", @@ -501,7 +501,7 @@ }, { "cell_type": "markdown", - "id": "bibliographic-handy", + "id": "eligible-pride", "metadata": {}, "source": [ "## Dysfunctions\n", @@ -519,7 +519,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "lucky-insurance", + "id": "realistic-opinion", "metadata": {}, "outputs": [], "source": [ @@ -534,7 +534,7 @@ }, { "cell_type": "markdown", - "id": "accredited-fitting", + "id": "olive-information", "metadata": {}, "source": [ "Now let's see all the ways that can go wrong." @@ -542,7 +542,7 @@ }, { "cell_type": "markdown", - "id": "transparent-cotton", + "id": "prostate-motorcycle", "metadata": {}, "source": [ "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we create outside the function." @@ -551,7 +551,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "aggregate-baker", + "id": "marine-entry", "metadata": {}, "outputs": [], "source": [ @@ -566,7 +566,7 @@ }, { "cell_type": "markdown", - "id": "otherwise-belarus", + "id": "dated-invalid", "metadata": {}, "source": [ "This version works, but it is not as versatile as it could be.\n", @@ -575,7 +575,7 @@ }, { "cell_type": "markdown", - "id": "naughty-crazy", + "id": "meaningful-louisiana", "metadata": {}, "source": [ "**Dysfunction #2:** Clobbering the parameters. When people first learn\n", @@ -585,7 +585,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "outdoor-petroleum", + "id": "moving-brazil", "metadata": {}, "outputs": [], "source": [ @@ -602,7 +602,7 @@ }, { "cell_type": "markdown", - "id": "afraid-street", + "id": "dietary-spectacular", "metadata": {}, "source": [ "In this example, we have a `System` object named `sys1` that gets passed\n", @@ -619,7 +619,7 @@ }, { "cell_type": "markdown", - "id": "expired-detail", + "id": "present-estonia", "metadata": {}, "source": [ "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." @@ -628,7 +628,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "increasing-database", + "id": "sacred-physiology", "metadata": {}, "outputs": [], "source": [ @@ -643,7 +643,7 @@ }, { "cell_type": "markdown", - "id": "brutal-chile", + "id": "technological-incentive", "metadata": {}, "source": [ "A function that doesn't have a return statement actually returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause." @@ -651,7 +651,7 @@ }, { "cell_type": "markdown", - "id": "meaning-thriller", + "id": "received-firewall", "metadata": {}, "source": [ "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not.\n", @@ -669,7 +669,7 @@ }, { "cell_type": "markdown", - "id": "opposed-vessel", + "id": "approximate-straight", "metadata": {}, "source": [ "In this example, `carrying_capacity` runs and returns `K`, but the\n", @@ -682,7 +682,7 @@ }, { "cell_type": "markdown", - "id": "quarterly-ethiopia", + "id": "liable-mixture", "metadata": {}, "source": [ "## Exercises" @@ -690,7 +690,7 @@ }, { "cell_type": "markdown", - "id": "painted-samuel", + "id": "worst-builder", "metadata": {}, "source": [ "**Exercise:** In a previous section, we saw a different way to parameterize the quadratic model:\n", @@ -705,7 +705,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "unauthorized-settle", + "id": "stretch-check", "metadata": {}, "outputs": [], "source": [ @@ -715,7 +715,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "primary-roman", + "id": "tender-treat", "metadata": {}, "outputs": [], "source": [ @@ -725,7 +725,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "ordinary-solid", + "id": "passive-certificate", "metadata": {}, "outputs": [], "source": [ @@ -734,7 +734,7 @@ }, { "cell_type": "markdown", - "id": "ignored-architect", + "id": "understood-cancer", "metadata": {}, "source": [ "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes.\n", @@ -749,68 +749,17 @@ { "cell_type": "code", "execution_count": 25, - "id": "intermediate-kazakhstan", + "id": "agricultural-burke", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] }, - { - "cell_type": "markdown", - "id": "positive-enforcement", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "ModSim provides `make_series` to make it easier to create a Pandas Series. In this chapter, we used it like this: " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "described-funds", - "metadata": {}, - "outputs": [], - "source": [ - "growth_series = make_series(pop_array, growth_array)" - ] - }, - { - "cell_type": "markdown", - "id": "least-password", - "metadata": {}, - "source": [ - "If you import `Series` from Pandas, you can make a `Series` yourself, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "sitting-quarterly", - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import Series\n", - "\n", - "growth_series = Series(growth_array, pop_array)" - ] - }, - { - "cell_type": "markdown", - "id": "german-kennedy", - "metadata": {}, - "source": [ - "The difference is that the arguments are in reverse order: the first argument is stored as the values in the `Series`; the second argument is stored as the `index`.\n", - "\n", - "I find that order counterintuitive, which is why I use `make_series`.\n", - "`make_series` takes the same optional keyword arguments as `Series`, which you can read about at ." - ] - }, { "cell_type": "code", "execution_count": null, - "id": "mental-october", + "id": "colored-globe", "metadata": {}, "outputs": [], "source": [] @@ -833,7 +782,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index b8c4c5a7..228360d3 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -576,7 +576,7 @@ "id": "handy-dubai", "metadata": {}, "source": [ - "To see what it looks like, I'll create an array of time stamps from 1960 to 2020, use `alpha_func` to compute the corresponding growth rates, and put the results into a `Series`." + "To see what it looks like, I'll create an array of time stamps from 1960 to 2020 and use `alpha_func` to compute the corresponding growth rates." ] }, { @@ -586,11 +586,8 @@ "metadata": {}, "outputs": [], "source": [ - "from numpy import linspace\n", - "\n", "t_array = linspace(1960, 2020, 5)\n", - "alpha_array = alpha_func(t_array)\n", - "alpha_series = make_series(t_array, alpha_array)" + "alpha_array = alpha_func(t_array)" ] }, { @@ -611,7 +608,7 @@ "from matplotlib.pyplot import plot\n", "\n", "plot_alpha()\n", - "alpha_series.plot(label='model', color='gray')\n", + "plot(t_array, alpha_array, label='model', color='gray')\n", "\n", "decorate(ylabel='Net growth rate',\n", " title='Linear model of net growth rate')" diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index 46d86119..ed73cd5f 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "artistic-wells", + "id": "colonial-jacob", "metadata": {}, "source": [ "# Chapter 13" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "imported-table", + "id": "modified-discretion", "metadata": { "tags": [] }, @@ -25,7 +25,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "electoral-turkey", + "id": "complicated-retreat", "metadata": { "tags": [] }, @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "formal-context", + "id": "selected-there", "metadata": { "tags": [] }, @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "progressive-typing", + "id": "prepared-apparatus", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "consolidated-cherry", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap13.ipynb)" @@ -88,7 +88,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "fantastic-recovery", + "id": "awful-martial", "metadata": { "tags": [] }, @@ -101,7 +101,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "excellent-harris", + "id": "changing-burner", "metadata": { "tags": [] }, @@ -114,7 +114,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "apparent-horizon", + "id": "defensive-automation", "metadata": { "tags": [] }, @@ -125,12 +125,14 @@ "from chap11 import make_system\n", "from chap11 import update_func\n", "from chap11 import run_simulation\n", + "from chap11 import plot_results\n", + "\n", "from chap12 import calc_total_infected" ] }, { "cell_type": "markdown", - "id": "electoral-montgomery", + "id": "structural-application", "metadata": {}, "source": [ "In the previous chapter we extended the SIR model to include immunization and used it to demonstrate herd immunity.\n", @@ -144,7 +146,7 @@ }, { "cell_type": "markdown", - "id": "nervous-spread", + "id": "tracked-outreach", "metadata": {}, "source": [ "## Sweeping beta\n", @@ -165,7 +167,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "amazing-operations", + "id": "forward-responsibility", "metadata": {}, "outputs": [], "source": [ @@ -175,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "adopted-selling", + "id": "eligible-shareware", "metadata": {}, "source": [ "The following function takes this array as a parameter and a single value for `gamma`.\n", @@ -188,7 +190,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "single-burke", + "id": "dutch-chemistry", "metadata": { "tags": [] }, @@ -205,7 +207,7 @@ }, { "cell_type": "markdown", - "id": "wired-wrist", + "id": "mathematical-process", "metadata": {}, "source": [ "We can run `sweep_beta` like this:" @@ -214,7 +216,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "collected-practice", + "id": "christian-singer", "metadata": {}, "outputs": [], "source": [ @@ -223,7 +225,7 @@ }, { "cell_type": "markdown", - "id": "exempt-binary", + "id": "collectible-positive", "metadata": {}, "source": [ "Before we plot the results, I will use a formatted string literal, also called an **f-string** to assemble a label that includes the value of `gamma`:" @@ -232,7 +234,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "competitive-amount", + "id": "proprietary-credit", "metadata": {}, "outputs": [], "source": [ @@ -242,7 +244,7 @@ }, { "cell_type": "markdown", - "id": "imported-huntington", + "id": "invisible-bible", "metadata": {}, "source": [ "An f-string starts with the letter \"f\" followed by a string in single or double quotes. \n", @@ -259,7 +261,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "certain-second", + "id": "developmental-video", "metadata": {}, "outputs": [], "source": [ @@ -271,7 +273,7 @@ }, { "cell_type": "markdown", - "id": "affiliated-honduras", + "id": "durable-isaac", "metadata": {}, "source": [ "Remember that this figure\n", @@ -287,7 +289,7 @@ }, { "cell_type": "markdown", - "id": "worst-alexandria", + "id": "described-jacksonville", "metadata": {}, "source": [ "## Sweeping gamma\n", @@ -299,7 +301,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "advised-venice", + "id": "chief-greece", "metadata": {}, "outputs": [], "source": [ @@ -309,7 +311,7 @@ }, { "cell_type": "markdown", - "id": "sensitive-folder", + "id": "medium-greek", "metadata": {}, "source": [ "And run `sweep_beta` for each value of `gamma`:" @@ -318,7 +320,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "determined-consent", + "id": "thermal-pulse", "metadata": {}, "outputs": [], "source": [ @@ -333,7 +335,7 @@ }, { "cell_type": "markdown", - "id": "tutorial-venture", + "id": "artistic-charge", "metadata": {}, "source": [ "When `gamma` is low, the recovery rate is low, which means people are infectious longer.\n", @@ -344,7 +346,7 @@ }, { "cell_type": "markdown", - "id": "rising-flour", + "id": "metropolitan-collect", "metadata": {}, "source": [ "## SweepFrame\n", @@ -364,7 +366,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "aquatic-federal", + "id": "scientific-dealer", "metadata": { "tags": [] }, @@ -379,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "level-distinction", + "id": "educated-congress", "metadata": {}, "source": [ "`sweep_parameters` takes as parameters an array of values for `beta` and\n", @@ -402,7 +404,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "julian-liberia", + "id": "engaging-philosophy", "metadata": {}, "outputs": [], "source": [ @@ -411,7 +413,7 @@ }, { "cell_type": "markdown", - "id": "sharing-contemporary", + "id": "realistic-hughes", "metadata": {}, "source": [ "With the results in a `SweepFrame`, we can plot each column like this:" @@ -420,7 +422,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "superior-redhead", + "id": "false-forestry", "metadata": {}, "outputs": [], "source": [ @@ -429,12 +431,13 @@ " frame[gamma].plot(label=label)\n", "\n", "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')" + " ylabel='Fraction infected',\n", + " title='Sweep beta, multiple values of gamma')" ] }, { "cell_type": "markdown", - "id": "english-photographer", + "id": "armed-spending", "metadata": {}, "source": [ "Alternatively, we can plot each row like this:" @@ -443,7 +446,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "regular-drama", + "id": "silent-advantage", "metadata": {}, "outputs": [], "source": [ @@ -452,12 +455,13 @@ " frame.loc[beta].plot(label=label)\n", " \n", "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')" + " ylabel='Fraction infected',\n", + " title='Sweep gamma, multiple values of beta')" ] }, { "cell_type": "markdown", - "id": "selective-evaluation", + "id": "diverse-works", "metadata": {}, "source": [ "This example demonstrates one use of a `SweepFrame`: we can run the analysis once, save the results, and then generate different visualizations.\n", @@ -472,7 +476,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "logical-method", + "id": "veterinary-cheese", "metadata": {}, "outputs": [], "source": [ @@ -480,12 +484,12 @@ "\n", "decorate(xlabel='Recovery rate (gamma)',\n", " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')" + " title='Contour plot, fraction infected')" ] }, { "cell_type": "markdown", - "id": "corresponding-headline", + "id": "operational-daughter", "metadata": {}, "source": [ "The values of `gamma` are on the $x$-axis, corresponding to the columns of the `SweepFrame`.\n", @@ -497,7 +501,7 @@ }, { "cell_type": "markdown", - "id": "located-double", + "id": "personal-formula", "metadata": {}, "source": [ "## Summary\n", @@ -519,7 +523,7 @@ }, { "cell_type": "markdown", - "id": "flying-tracker", + "id": "variable-capture", "metadata": {}, "source": [ "## Exercises" @@ -527,7 +531,7 @@ }, { "cell_type": "markdown", - "id": "stopped-breathing", + "id": "conscious-blues", "metadata": {}, "source": [ "**Exercise:** If we know `beta` and `gamma`, we can compute the fraction of the population that gets infected. In general, we don't know these parameters, but sometimes we can estimate them based on the behavior of an outbreak.\n", @@ -538,7 +542,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "talented-crack", + "id": "democratic-driving", "metadata": {}, "outputs": [], "source": [ @@ -548,7 +552,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "pressed-isaac", + "id": "stretch-israel", "metadata": {}, "outputs": [], "source": [ @@ -558,7 +562,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "equal-crazy", + "id": "controlling-strand", "metadata": {}, "outputs": [], "source": [ @@ -568,7 +572,7 @@ { "cell_type": "code", "execution_count": null, - "id": "desirable-crystal", + "id": "instructional-hayes", "metadata": {}, "outputs": [], "source": [] @@ -591,7 +595,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 09fad940..f91da633 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "happy-minutes", + "id": "narrow-announcement", "metadata": {}, "source": [ "# Chapter 14" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "imported-table", + "id": "still-fellow", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "electoral-turkey", + "execution_count": 1, + "id": "complicated-nickname", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "formal-context", + "execution_count": 2, + "id": "pretty-ethics", "metadata": { "tags": [] }, @@ -65,8 +65,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "progressive-typing", + "execution_count": 3, + "id": "approved-terminal", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "legal-attack", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap14.ipynb)" @@ -88,8 +88,49 @@ { "cell_type": "code", "execution_count": 4, - "id": "level-struggle", - "metadata": {}, + "id": "lucky-enforcement", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap11.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "hairy-fifth", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap12.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "laden-thousand", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap13.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "future-baseball", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# import code from previous notebooks\n", @@ -106,36 +147,33 @@ }, { "cell_type": "markdown", - "id": "disturbed-joshua", + "id": "apparent-country", "metadata": {}, "source": [ - "In the previous chapters we used simulation to predict the effect of an infectious disease in a susceptible population and to design\n", - "interventions that would minimize the effect.\n", + "In the previous chapter we swept the parameters of the SIR model: the contact rate, `beta`, and the recovery rate, `gamma`.\n", + "For each pair of parameters, we ran a simulation and computed the total fraction of the population infected.\n", "\n", - "In this chapter we use analysis to investigate the relationship between the parameters, `beta` and `gamma`, and the outcome of the simulation." + "In this chapter we investigate the relationship between the parameters and this metric, using both simulation and analysis." ] }, { "cell_type": "markdown", - "id": "respiratory-twelve", + "id": "sharp-ladder", "metadata": {}, "source": [ "## Nondimensionalization\n", "\n", - "The figures in\n", - "Section [\\[sweepframe\\]](#sweepframe){reference-type=\"ref\"\n", - "reference=\"sweepframe\"} suggest that there is a relationship between the parameters of the SIR model, `beta` and `gamma`, that determines the outcome of the simulation, the fraction of students infected. Let's think what that relationship might be.\n", + "The figures in the previous chapter suggest that there is a relationship between the parameters of the SIR model, `beta` and `gamma`, and the fraction of the population that is infected. Let's think what that relationship might be.\n", "\n", - "- When `beta` exceeds `gamma`, that means there are more contacts\n", - " (that is, potential infections) than recoveries during each day (or other unit of time). The difference between `beta` and `gamma` might be called the \"excess contact rate\\\", in units of contacts per day.\n", + "- When `beta` exceeds `gamma`, there are more contacts\n", + " than recoveries during each day. The difference between `beta` and `gamma` might be called the \"excess contact rate\", in units of contacts per day.\n", "\n", "- As an alternative, we might consider the ratio `beta/gamma`, which\n", " is the number of contacts per recovery. Because the numerator and\n", " denominator are in the same units, this ratio is **dimensionless**, which means it has no units.\n", "\n", "Describing physical systems using dimensionless parameters is often a\n", - "useful move in the modeling and simulation game. It is so useful, in\n", - "fact, that it has a name: **nondimensionalization** (see\n", + "useful move in the modeling and simulation game. In fact, it is so useful that it has a name: **nondimensionalization** (see\n", ").\n", "\n", "So we'll try the second option first." @@ -143,70 +181,95 @@ }, { "cell_type": "markdown", - "id": "caroline-compiler", + "id": "reasonable-letter", "metadata": {}, "source": [ "## Exploring the results\n", "\n", - "Suppose we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`. Each element in the `SweepFrame` is the fraction of students infected in a simulation with a given pair of parameters.\n", + "In the previous chapter, we wrote a function, `sweep_parameters`,\n", + "that takes an array of values for `beta` and an array of values for `gamma`.\n", + "It runs a simulation for each pair of parameters and returns a `SweepFrame` with the results.\n", "\n", - "We can print the values in the `SweepFrame` like this:" + "I'll run it again with the following arrays of parameters." ] }, { "cell_type": "code", - "execution_count": 5, - "id": "flying-chosen", + "execution_count": 8, + "id": "compliant-butler", "metadata": {}, "outputs": [], "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, \n", + " 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame = sweep_parameters(beta_array, gamma_array)" + ] + }, + { + "cell_type": "markdown", + "id": "temporal-danish", + "metadata": {}, + "source": [ + "Here's what the first few rows look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "diagnostic-creation", + "metadata": {}, + "outputs": [], + "source": [ "frame.head()" ] }, + { + "cell_type": "markdown", + "id": "senior-hazard", + "metadata": {}, + "source": [ + "The `SweepFrame` has one row for each value of `beta` and one column for each value of `gamma`. \n", + "\n", + "We can print the values in the `SweepFrame` like this:" + ] + }, { "cell_type": "code", - "execution_count": 6, - "id": "satisfied-japan", + "execution_count": 10, + "id": "tested-nation", "metadata": {}, "outputs": [], "source": [ "for gamma in frame.columns:\n", " column = frame[gamma]\n", " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" + " metric = column[beta]\n", + " print(beta, gamma, metric)" ] }, { "cell_type": "markdown", - "id": "automotive-solution", + "id": "cloudy-volunteer", "metadata": {}, "source": [ "This is the first example we've seen with one `for` loop inside another:\n", "\n", "- Each time the outer loop runs, it selects a value of `gamma` from\n", - " the columns of the `DataFrame` and extracts the corresponding\n", + " the columns of the `SweepFrame` and extracts the corresponding\n", " column.\n", "\n", - "- Each time the inner loop runs, it selects a value of `beta` from the\n", - " column and selects the corresponding element, which is the fraction\n", - " of students infected.\n", + "- Each time the inner loop runs, it selects a value of `beta` from the index of the column and selects the corresponding element, which is the fraction of the population that got infected.\n", "\n", - "In the example from the previous chapter, `frame` has 4 columns, one for\n", - "each value of `gamma`, and 11 rows, one for each value of `beta`. So\n", - "these loops print 44 lines, one for each pair of parameters.\n", + "Since there are 11 rows and 4 columns, the total number of lines in the output is 44.\n", "\n", - "The following function encapulates the previous loop and plots the\n", - "fraction infected as a function of the ratio `beta/gamma`:" + "The following function uses the same loop to enumerate the elements of the `SweepFrame`, but instead of printing a line for each element, it plots a point." ] }, { "cell_type": "code", - "execution_count": 7, - "id": "baking-tactics", + "execution_count": 11, + "id": "elder-retirement", "metadata": {}, "outputs": [], "source": [ @@ -214,17 +277,27 @@ "\n", "def plot_sweep_frame(frame):\n", " for gamma in frame.columns:\n", - " series = frame[gamma]\n", - " for beta in series.index:\n", - " frac_infected = series[beta]\n", - " plot(beta/gamma, frac_infected, 'o', \n", - " color='C1', alpha=0.4)" + " column = frame[gamma]\n", + " for beta in column.index:\n", + " metric = column[beta]\n", + " plot(beta/gamma, metric, '.', color='C1')" + ] + }, + { + "cell_type": "markdown", + "id": "marine-stadium", + "metadata": {}, + "source": [ + "On the $x$-axis, it plots the ratio `beta/gamma`.\n", + "On the $y$-axis, it plots the fraction of the population that's infected.\n", + "\n", + "Here's what it looks like:" ] }, { "cell_type": "code", - "execution_count": 8, - "id": "dental-outreach", + "execution_count": 12, + "id": "legal-onion", "metadata": {}, "outputs": [], "source": [ @@ -236,15 +309,15 @@ }, { "cell_type": "markdown", - "id": "systematic-gossip", + "id": "purple-jersey", "metadata": {}, "source": [ - "The results fall on a single curve, at least approximately. That means that we can predict the fraction of students who will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." + "The results fall on a single curve, at least approximately. That means that we can predict the fraction of the population that will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." ] }, { "cell_type": "markdown", - "id": "theoretical-arrow", + "id": "sublime-cargo", "metadata": {}, "source": [ "## Contact number\n", @@ -256,12 +329,12 @@ "(as a fraction of the population).\n", "\n", "When a new disease is introduced to a susceptible population, $s$ is\n", - "approximately 1, so the number of people infected by each sick person is $\\beta / \\gamma$. This ratio is called the \"contact number\\\" or \"basic reproduction number\\\" (see ). By convention it is usually denoted $R_0$, but in the context of an SIR model, this notation is confusing, so we'll use $c$ instead." + "approximately 1, so the number of people infected by each sick person is $\\beta / \\gamma$. This ratio is called the \"contact number\\\" or \"basic reproduction number\\\" (see ). By convention it is usually denoted $R_0$, but in the context of an SIR model, that notation is confusing, so we'll use $c$ instead." ] }, { "cell_type": "markdown", - "id": "intimate-romance", + "id": "potential-curve", "metadata": {}, "source": [ "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", @@ -276,14 +349,28 @@ "contact rate by the infection rate to get the dimensionless quantity\n", "$c$, now we'll divide $di/dt$ by $ds/dt$ to get a ratio of rates:\n", "\n", - "$$\\frac{di}{ds} = -1 + \\frac{1}{cs}$$ \n", + "$$\\frac{di}{ds} = \\frac{\\beta s i - \\gamma i}{-\\beta s i}$$ \n", + "\n", + "Which we can simplify as\n", "\n", + "$$\\frac{di}{ds} = -1 + \\frac{\\gamma}{\\beta s}$$ \n", + "\n", + "Replacing $\\beta/\\gamma$ with $c$, we can write\n", + "\n", + "$$\\frac{di}{ds} = -1 + \\frac{1}{c s}$$ " + ] + }, + { + "cell_type": "markdown", + "id": "reverse-prize", + "metadata": {}, + "source": [ "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." ] }, { "cell_type": "markdown", - "id": "revolutionary-motorcycle", + "id": "lightweight-upgrade", "metadata": {}, "source": [ "Here's how the derivation goes. We multiply both sides of the previous\n", @@ -308,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "spread-convert", + "id": "blessed-charger", "metadata": {}, "source": [ "Now, at the end of the epidemic, let's assume that $i(\\infty) = 0$, and $s(\\infty)$ is an unknown quantity, $s_{\\infty}$. Now we have:\n", @@ -320,29 +407,27 @@ }, { "cell_type": "markdown", - "id": "intended-worker", + "id": "killing-flavor", "metadata": {}, "source": [ "## Analysis and simulation\n", "\n", - "Let's compare this analytic result to the results from simulation. I'll create an array of values for $s_{\\infty}$" + "Let's compare this analytic result to the results from simulation. I'll create an array of values for $s_{\\infty}$." ] }, { "cell_type": "code", - "execution_count": 9, - "id": "previous-schedule", + "execution_count": 13, + "id": "temporal-murray", "metadata": {}, "outputs": [], "source": [ - "from numpy import linspace\n", - "\n", - "s_inf_array = linspace(0.0001, 0.999, 31)" + "s_inf_array = linspace(0.003, 0.99, 50)" ] }, { "cell_type": "markdown", - "id": "positive-float", + "id": "engaged-activity", "metadata": {}, "source": [ "And compute the corresponding values of $c$:" @@ -350,8 +435,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "valuable-landscape", + "execution_count": 14, + "id": "coordinated-sheffield", "metadata": {}, "outputs": [], "source": [ @@ -362,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "premium-carry", + "id": "cleared-gregory", "metadata": {}, "source": [ "To get the total infected, we compute the difference between $s(0)$ and\n", @@ -371,8 +456,8 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "composite-cabinet", + "execution_count": 15, + "id": "level-citizenship", "metadata": {}, "outputs": [], "source": [ @@ -381,17 +466,16 @@ }, { "cell_type": "markdown", - "id": "satisfactory-blink", + "id": "divine-polls", "metadata": {}, "source": [ - "We can use `make_series` to put `c_array`\n", - "and `frac_infected` in a Pandas `Series`." + "The ModSim library provides a function called `make_series` we can use to put `c_array` and `frac_infected` in a Pandas `Series`." ] }, { "cell_type": "code", - "execution_count": 21, - "id": "appropriate-geology", + "execution_count": 16, + "id": "mounted-patient", "metadata": {}, "outputs": [], "source": [ @@ -400,7 +484,7 @@ }, { "cell_type": "markdown", - "id": "bottom-print", + "id": "emerging-insert", "metadata": {}, "source": [ "Now we can plot the results:" @@ -408,8 +492,8 @@ }, { "cell_type": "code", - "execution_count": 22, - "id": "integral-reading", + "execution_count": 17, + "id": "adjusted-spread", "metadata": {}, "outputs": [], "source": [ @@ -422,51 +506,57 @@ }, { "cell_type": "markdown", - "id": "peaceful-interest", + "id": "adjustable-calculator", "metadata": {}, "source": [ "When the contact number exceeds 1, analysis and simulation agree. When\n", "the contact number is less than 1, they do not: analysis indicates there should be no infections; in the simulations there are a small number of infections.\n", "\n", "The reason for the discrepancy is that the simulation divides time into a discrete series of days, whereas the analysis treats time as a\n", - "continuous quantity. In other words, the two methods are actually based on different models. So which model is better?\n", - "\n", - "Probably neither. When the contact number is small, the early progress\n", - "of the epidemic depends on details of the scenario. If we are lucky, the original infected person, \"patient zero\", infects no one and there is no epidemic. If we are unlucky, patient zero might have a large number of close friends, or might work in the dining hall (and fail to observe safe food handling procedures).\n", - "\n", - "For contact numbers near or less than 1, we might need a more detailed\n", - "model. But for higher contact numbers the SIR model might be good\n", - "enough." + "continuous quantity.\n", + "When the contact number is large, these two models agree; when it is small, they diverge." ] }, { "cell_type": "markdown", - "id": "beginning-capital", + "id": "southeast-comparative", "metadata": {}, "source": [ "## Estimating contact number\n", "\n", - "Figure xxx shows that if we know the contact number, we can compute the fraction infected. But we can also read the figure the other way; that is, at the end of an epidemic, if we can estimate the fraction of the population that was ever infected, we can use it to estimate the contact number.\n", + "The previous figure shows that if we know the contact number, we can estimate the fraction of the population that will be infected with just a few arithmetic operations.\n", + "We don't have to run a simulation.\n", + "\n", + "Also, we can read the figure the other way; if we know what fraction of the population was affected by a past outbreak, we can estimate the contact number.\n", + "Then, if we know one of the parameters, like `gamma`, we can use the contact number to estimate the other parameter, like `beta`.\n", + "\n", + "At least in theory, we can.\n", + "In practice, it might not work very well, because of the shape of the curve. \n", "\n", - "Well, in theory we can. In practice, it might not work very well,\n", - "because of the shape of the curve. When the contact number is near 2,\n", - "the curve is quite steep, which means that small changes in $c$ yield\n", - "big changes in the number of infections. If we observe that the total\n", - "fraction infected is anywhere from 20% to 80%, we would conclude that\n", - "$c$ is near 2.\n", + "* When the contact number is low, the curve is quite steep, which means that small changes in $c$ yield big changes in the number of infections. If we observe that the total fraction infected is anywhere from 20% to 80%, we would conclude that $c$ is near 2.\n", + "\n", + "* And when the contact number is high, the curve is nearly flat, which means that it's hard to see the difference between values of $c$ between 3 and 6.\n", + "\n", + "So it might not be practical to use this curve to estimate $c$." + ] + }, + { + "cell_type": "markdown", + "id": "greenhouse-harmony", + "metadata": {}, + "source": [ + "## Summary\n", "\n", - "On the other hand, for larger contact numbers, nearly the entire\n", - "population is infected, so the curve is nearly flat. In that case we\n", - "would not be able to estimate $c$ precisely, because any value greater\n", - "than 3 would yield effectively the same results. Fortunately, this is\n", - "unlikely to happen in the real world; very few epidemics affect anything close to 90% of the population.\n", + "In this chapter we used simulations to explore the relationship between `beta`, `gamma`, and the fraction infected.\n", + "Then we used analysis to explain that relationship.\n", "\n", - "So the SIR model has limitations; nevertheless, it provides insight into the behavior of infectious disease, especially the phenomenon of herd immunity. As we saw in Chapter xxx, if we know the parameters of the model, we can use it to evaluate possible interventions. And as we saw in this chapter, we might be able to use data from earlier outbreaks to estimate the parameters.\n" + "With that, we are done with the SIR model.\n", + "In the next chapter we move on to thermal systems and the notorious coffee cooling problem." ] }, { "cell_type": "markdown", - "id": "olive-niger", + "id": "buried-tracy", "metadata": {}, "source": [ "## Exercises" @@ -474,10 +564,16 @@ }, { "cell_type": "markdown", - "id": "upper-interim", + "id": "mineral-walnut", "metadata": {}, "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", + "**Exercise:** At the beginning of this chapter, I suggested two ways to relate `beta` and `gamma`: we could compute their difference or their ratio.\n", + "\n", + "Because the ratio is dimensionless, I suggested we explore it first, and that led us to discover the contact number, which is `beta/gamma`.\n", + "When we plotted the fraction infected as a function of the contact number, we found that this metric falls on a single curve, at least approximately.\n", + "That indicates that the ratio is enough to predict the results; we don't have to know `beta` and `gamma` individually. \n", + "\n", + "But that leaves a question open: what happens if we do the same thing using the difference instead of the ratio?\n", "\n", "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", "\n", @@ -486,8 +582,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "talented-discovery", + "execution_count": 18, + "id": "right-official", "metadata": {}, "outputs": [], "source": [ @@ -496,8 +592,8 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "bright-label", + "execution_count": 19, + "id": "weekly-doctrine", "metadata": {}, "outputs": [], "source": [ @@ -506,8 +602,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "id": "suspended-louisiana", + "execution_count": 20, + "id": "failing-treaty", "metadata": {}, "outputs": [], "source": [ @@ -516,20 +612,20 @@ }, { "cell_type": "markdown", - "id": "understanding-fault", + "id": "statistical-senate", "metadata": {}, "source": [ "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", "\n", "What is your best estimate of `c`?\n", "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " + "Hint: if you display `frac_infected_series`, you can read off the answer. " ] }, { "cell_type": "code", - "execution_count": 26, - "id": "another-timing", + "execution_count": 21, + "id": "manufactured-cache", "metadata": { "scrolled": true }, @@ -540,8 +636,94 @@ }, { "cell_type": "code", - "execution_count": 17, - "id": "gross-terry", + "execution_count": 22, + "id": "academic-chancellor", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "id": "functioning-resort", + "metadata": {}, + "source": [ + "**Exercise**: So far the only metric we have considered is the total fraction of the population that gets infected over the course of an epidemic. That is an important metric, but it is not the only one we care about.\n", + "\n", + "For example, if we have limited resources to deal with infected people, we might also be concerned about the number of people who are sick at the peak of the epidemic, which is the maximum of `I`.\n", + "\n", + "Write a version of `sweep_beta` that computes this metric, and use it to compute a `SweepFrame` for a range of values of `beta` and `gamma`.\n", + "Make a contour plot that shows the value of this metric as a function of `beta` and `gamma`.\n", + "\n", + "Then use `plot_sweep_frame` to plot the maximum of `I` as a function of the contact number, `beta/gamma`.\n", + "Do the results fall on a single curve?" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "decent-understanding", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "laughing-imperial", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "close-cache", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "annoying-alexander", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "charming-checkout", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "passive-slave", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "promising-spyware", "metadata": {}, "outputs": [], "source": [ @@ -551,13 +733,14 @@ { "cell_type": "code", "execution_count": null, - "id": "found-surgery", + "id": "passing-quarterly", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -573,7 +756,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index 0e8361da..dfca2ad7 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "involved-hampshire", + "id": "stopped-plymouth", "metadata": {}, "source": [ "# Chapter 16" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "imported-table", + "id": "endangered-sequence", "metadata": { "tags": [] }, @@ -25,7 +25,7 @@ { "cell_type": "code", "execution_count": null, - "id": "electoral-turkey", + "id": "owned-renewal", "metadata": { "tags": [] }, @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "formal-context", + "id": "appreciated-prefix", "metadata": { "tags": [] }, @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": null, - "id": "progressive-typing", + "id": "grave-feature", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "senior-malawi", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap16.ipynb)" @@ -88,7 +88,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "straight-milan", + "id": "electrical-temple", "metadata": { "tags": [] }, @@ -103,7 +103,7 @@ }, { "cell_type": "markdown", - "id": "global-shooting", + "id": "vocal-parking", "metadata": {}, "source": [ "In the previous chapter we wrote a simulation of a cooling cup of\n", @@ -115,7 +115,7 @@ }, { "cell_type": "markdown", - "id": "ceramic-calibration", + "id": "extensive-peace", "metadata": {}, "source": [ "## Mixing liquids\n", @@ -157,7 +157,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "orange-beaver", + "id": "front-major", "metadata": {}, "outputs": [], "source": [ @@ -177,7 +177,7 @@ }, { "cell_type": "markdown", - "id": "quiet-payroll", + "id": "empirical-potter", "metadata": {}, "source": [ "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", @@ -194,7 +194,7 @@ }, { "cell_type": "markdown", - "id": "talented-appendix", + "id": "pacific-tuesday", "metadata": {}, "source": [ "## Mix first or last?\n", @@ -206,7 +206,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "breathing-pizza", + "id": "psychological-opera", "metadata": {}, "outputs": [], "source": [ @@ -216,7 +216,7 @@ }, { "cell_type": "markdown", - "id": "miniature-doctrine", + "id": "interested-moses", "metadata": {}, "source": [ "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." @@ -225,7 +225,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "faced-start", + "id": "outstanding-attendance", "metadata": {}, "outputs": [], "source": [ @@ -235,7 +235,7 @@ }, { "cell_type": "markdown", - "id": "interior-alpha", + "id": "american-channels", "metadata": {}, "source": [ "Now we can mix them and simulate 30 minutes:" @@ -244,7 +244,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "stock-release", + "id": "certified-testament", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +256,7 @@ }, { "cell_type": "markdown", - "id": "committed-preference", + "id": "opposed-function", "metadata": {}, "source": [ "The final temperature is 61.5 °C which is still warm enough to be\n", @@ -268,7 +268,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "integral-character", + "id": "military-receiver", "metadata": {}, "outputs": [], "source": [ @@ -280,7 +280,7 @@ }, { "cell_type": "markdown", - "id": "trying-jacob", + "id": "hundred-garbage", "metadata": {}, "source": [ "After mixing, the temperature is 62.9 °C, so it looks like adding the\n", @@ -290,7 +290,7 @@ }, { "cell_type": "markdown", - "id": "enclosed-shore", + "id": "traditional-episode", "metadata": {}, "source": [ "## Optimization\n", @@ -301,7 +301,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "accepting-consumer", + "id": "partial-strap", "metadata": {}, "outputs": [], "source": [ @@ -321,7 +321,7 @@ }, { "cell_type": "markdown", - "id": "critical-pound", + "id": "synthetic-bridal", "metadata": {}, "source": [ "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" @@ -330,7 +330,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "isolated-georgia", + "id": "naval-future", "metadata": {}, "outputs": [], "source": [ @@ -341,7 +341,7 @@ }, { "cell_type": "markdown", - "id": "latin-fireplace", + "id": "welcome-piece", "metadata": {}, "source": [ "Here's what the results look like:" @@ -350,7 +350,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "possible-prevention", + "id": "polished-module", "metadata": {}, "outputs": [], "source": [ @@ -364,7 +364,7 @@ }, { "cell_type": "markdown", - "id": "light-poland", + "id": "unauthorized-plate", "metadata": {}, "source": [ "Note that this is a parameter sweep, not a time series.\n", @@ -381,7 +381,7 @@ }, { "cell_type": "markdown", - "id": "industrial-circle", + "id": "confirmed-donor", "metadata": {}, "source": [ "## Analysis\n", @@ -403,7 +403,7 @@ }, { "cell_type": "markdown", - "id": "molecular-happiness", + "id": "unnecessary-variance", "metadata": {}, "source": [ "Now we can use the observed data to estimate the parameter $r$. If we\n", @@ -417,7 +417,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "dressed-supply", + "id": "bridal-freight", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +435,7 @@ }, { "cell_type": "markdown", - "id": "young-shift", + "id": "attractive-pennsylvania", "metadata": {}, "source": [ "We can use this function to compute `r` for the coffee, given the parameters of the problem." @@ -444,7 +444,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "bacterial-tonight", + "id": "civil-raise", "metadata": {}, "outputs": [], "source": [ @@ -456,7 +456,7 @@ }, { "cell_type": "markdown", - "id": "removable-authority", + "id": "cardiovascular-nickname", "metadata": {}, "source": [ "This value is close to the value of `r` we computed in the previous chapter, `0.115`, but not exactly the same.\n", @@ -469,7 +469,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "civic-trail", + "id": "improved-optimization", "metadata": {}, "outputs": [], "source": [ @@ -488,13 +488,13 @@ }, { "cell_type": "markdown", - "id": "eleven-faculty", + "id": "continuing-example", "metadata": {}, "source": [ "The first line unpacks the system variables.\n", "The next two lines compute `t_array`, which is a NumPy array of time stamps, and `T_array`, which is an array of the corresponding temperatures.\n", "\n", - "The last two lines store the final temperature in the `System` object and return the results in a Pandas `Series`.\n", + "The last two lines store the final temperature in the `System` object and use `make_series` to return the results in a Pandas `Series`.\n", "\n", "We can run it like this:" ] @@ -502,7 +502,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "terminal-carry", + "id": "numeric-technique", "metadata": {}, "outputs": [], "source": [ @@ -513,7 +513,7 @@ }, { "cell_type": "markdown", - "id": "approved-subject", + "id": "located-consumption", "metadata": {}, "source": [ "The final temperature is 70 °C, as it should be. In fact, the results\n", @@ -523,7 +523,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "grand-silence", + "id": "legendary-steal", "metadata": {}, "outputs": [], "source": [ @@ -534,7 +534,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "monetary-sensitivity", + "id": "conventional-islam", "metadata": {}, "outputs": [], "source": [ @@ -545,7 +545,7 @@ }, { "cell_type": "markdown", - "id": "polish-focus", + "id": "stopped-referral", "metadata": {}, "source": [ "## Exercises" @@ -553,7 +553,7 @@ }, { "cell_type": "markdown", - "id": "respected-inclusion", + "id": "exceptional-paper", "metadata": {}, "source": [ "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." @@ -562,7 +562,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "headed-circle", + "id": "municipal-sustainability", "metadata": {}, "outputs": [], "source": [ @@ -572,7 +572,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "enormous-consolidation", + "id": "radical-problem", "metadata": {}, "outputs": [], "source": [ @@ -582,7 +582,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "social-stamp", + "id": "cooked-revision", "metadata": {}, "outputs": [], "source": [ @@ -592,7 +592,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "exclusive-puzzle", + "id": "interstate-correspondence", "metadata": {}, "outputs": [], "source": [ @@ -601,7 +601,7 @@ }, { "cell_type": "markdown", - "id": "chinese-explanation", + "id": "medium-curtis", "metadata": {}, "source": [ "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", @@ -612,20 +612,63 @@ { "cell_type": "code", "execution_count": 25, - "id": "terminal-billy", + "id": "wicked-reasoning", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] }, + { + "cell_type": "markdown", + "id": "corrected-dealing", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "ModSim provides `make_series` to make it easier to create a Pandas Series. In this chapter, we used it like this: " + ] + }, { "cell_type": "code", - "execution_count": null, - "id": "nuclear-going", + "execution_count": 26, + "id": "consistent-eleven", + "metadata": {}, + "outputs": [], + "source": [ + "make_series(t_array, T_array)" + ] + }, + { + "cell_type": "markdown", + "id": "exceptional-assembly", + "metadata": {}, + "source": [ + "If you import `Series` from Pandas, you can make a `Series` yourself, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "interpreted-intro", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "from pandas import Series\n", + "\n", + "Series(T_array, t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "right-louis", + "metadata": {}, + "source": [ + "The difference is that the arguments are in reverse order: the first argument is stored as the values in the `Series`; the second argument is stored as the `index`.\n", + "\n", + "I find that order counterintuitive, which is why I use `make_series`.\n", + "`make_series` takes the same optional keyword arguments as `Series`, which you can read about at ." + ] } ], "metadata": { @@ -645,7 +688,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, From 2b9e2687981701a73ad27fdeba562b1479353fb2 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 19:53:43 -0500 Subject: [PATCH 048/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 163285 -> 163819 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 54410d0d620febdb0b81138697ce9f68f7edf706..467f6348f19ab0528619212804aed19ab05bc17a 100644 GIT binary patch delta 28946 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 NK?+mh0`a!l{|_&$FA)F$ delta 28442 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 OU?fmUj$m((%>MvI<8TlF From d899084f013b2c32973f6c8c7b1e5ecb3994813a Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 16 Feb 2021 19:54:16 -0500 Subject: [PATCH 049/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 163819 -> 163819 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 467f6348f19ab0528619212804aed19ab05bc17a..c272a5cec28a90b6d1a15d854db8e911f666e21b 100644 GIT binary patch delta 928 zcmaF;pY!#9PVNA2W)=|!1_lm>6BD`3SS>Pj5-cV=UKiOIWuV4*Vsf_{RBZDxH5Ub- z0Jl3#(S}u`o1@*oiUS1$gFufaArHBCqL=VEO3^=$|6ez%U9j3zZdcGV`VB=Sqz?-kl0*oi77qBrx zMYgYIW8?waHGPL7Pzdas?VlAHWk9L~j9{uJZ&)R=J>H0Mu^``xc>zJK^P|nH#2FYo zBBvkx%_uWn$Ays>;vcZWAQ#3apf9IijfNWu^wmv}Ew9R9LX!gyifp&6V7v(Q({%1$ znDBPDUPg5ZpitgYxX{X_jB`Ok?)%_EP5T%P1i)@#{<%uuOpJjcIuPU*+39h$Oq?8? z49wu*1zW;&p3x2%PSYKq!nA{hCp=|T1_^KZ4HMq}{x{=wV4O`qF2e*13np2nP*7Mz z=)#32>oPTiyeIAo7YcG^%8>yI?N5XY{YqroFANmgRm$YTXfgeNDHAXzrpuKf^O{h2 z&pesctRD(D$77TxDB^Zwx2`c8C4^zoQA^t sg~E%gK~{MPg{M}FY(p1_2Y2;56kbprvfMTlo>V=uTpfgWxSmM^0Jo??TL1t6 delta 928 zcmY+BPiPZC6o+>vHZ(*f>SnjJX|M=Uq{Wg$#7iNN8qrG{5Y$Lx!HXj5CH)g^3n_xA zMP+H`lm_i_-F7TM#aTxKRwNNab^gW+tV?I=mLM9KI*0N zqx4D))%t{|wkGKMK2&c?G(&V~m1rC(J}Fa0A_hM=X(D-YN>09%h{4`zIXTIxJ%PbD z>5Re1jGtuiw1a|W`RsBBeU!+CEYVqkOf_R>4=pV=_CP4DLEq5m;9Glc*E From 7a041674e5e3d7d9d63be79c1dda5b06b485075c Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 17 Feb 2021 13:57:57 -0500 Subject: [PATCH 050/144] Updating modsim.py --- chap13.py | 2 ++ chap15.py | 5 ++--- modsim.py | 5 ++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/chap13.py b/chap13.py index ca40c10b..fd5aa080 100644 --- a/chap13.py +++ b/chap13.py @@ -5,6 +5,8 @@ from chap11 import make_system from chap11 import update_func from chap11 import run_simulation +from chap11 import plot_results + from chap12 import calc_total_infected from modsim import * diff --git a/chap15.py b/chap15.py index f9c28e9b..f439ced2 100644 --- a/chap15.py +++ b/chap15.py @@ -12,7 +12,7 @@ def make_system(T_init, volume, r, t_end): from modsim import * -def change_func(T, t, system): +def change_func(t, T, system): r, T_env, dt = system.r, system.T_env, system.dt return -r * (T - T_env) * dt @@ -28,9 +28,8 @@ def run_simulation(system, change_func): for i in range(n-1): t = t_array[i] T = series.iloc[i] - series.iloc[i+1] = T + change_func(T, t, system) + series.iloc[i+1] = T + change_func(t, T, system) - system.t_end = t_array[-1] system.T_final = series.iloc[-1] return series diff --git a/modsim.py b/modsim.py index cd389049..9ed50260 100644 --- a/modsim.py +++ b/modsim.py @@ -652,9 +652,12 @@ def make_series(x, y, **options): returns: Pandas Series """ + underride(options, name='values') if isinstance(y, pd.Series): y = y.values - return pd.Series(y, index=x, **options) + series = pd.Series(y, index=x, **options) + series.index.name = 'index' + return series def TimeSeries(*args, **kwargs): From 340da69c55cc06c65acecd35069158cba6e544a2 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 17 Feb 2021 14:23:13 -0500 Subject: [PATCH 051/144] Updating chapters --- chapters/chap14.ipynb | 167 ++++++++++++++++---------- chapters/chap15.ipynb | 264 ++++++++++++++++++++++++------------------ chapters/chap16.ipynb | 260 +++++++++++++++++++---------------------- chapters/chap17.ipynb | 6 +- 4 files changed, 384 insertions(+), 313 deletions(-) diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index f91da633..b712c1b3 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "narrow-announcement", + "id": "infrared-shower", "metadata": {}, "source": [ "# Chapter 14" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "still-fellow", + "id": "documentary-steal", "metadata": { "tags": [] }, @@ -25,7 +25,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "complicated-nickname", + "id": "wanted-precipitation", "metadata": { "tags": [] }, @@ -42,7 +42,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "pretty-ethics", + "id": "earned-kidney", "metadata": { "tags": [] }, @@ -66,7 +66,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "approved-terminal", + "id": "forty-hammer", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "legal-attack", + "id": "attractive-corner", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap14.ipynb)" @@ -88,7 +88,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "lucky-enforcement", + "id": "middle-surge", "metadata": { "tags": [] }, @@ -101,7 +101,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "hairy-fifth", + "id": "hybrid-making", "metadata": { "tags": [] }, @@ -114,7 +114,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "laden-thousand", + "id": "inclusive-characteristic", "metadata": { "tags": [] }, @@ -127,7 +127,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "future-baseball", + "id": "grave-occasions", "metadata": { "tags": [] }, @@ -147,7 +147,7 @@ }, { "cell_type": "markdown", - "id": "apparent-country", + "id": "brief-trademark", "metadata": {}, "source": [ "In the previous chapter we swept the parameters of the SIR model: the contact rate, `beta`, and the recovery rate, `gamma`.\n", @@ -158,7 +158,7 @@ }, { "cell_type": "markdown", - "id": "sharp-ladder", + "id": "weekly-award", "metadata": {}, "source": [ "## Nondimensionalization\n", @@ -181,7 +181,7 @@ }, { "cell_type": "markdown", - "id": "reasonable-letter", + "id": "legendary-terrorism", "metadata": {}, "source": [ "## Exploring the results\n", @@ -196,7 +196,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "compliant-butler", + "id": "genetic-morris", "metadata": {}, "outputs": [], "source": [ @@ -208,7 +208,7 @@ }, { "cell_type": "markdown", - "id": "temporal-danish", + "id": "hearing-cycle", "metadata": {}, "source": [ "Here's what the first few rows look like:" @@ -217,7 +217,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "diagnostic-creation", + "id": "appointed-terrorist", "metadata": {}, "outputs": [], "source": [ @@ -226,7 +226,7 @@ }, { "cell_type": "markdown", - "id": "senior-hazard", + "id": "catholic-alfred", "metadata": {}, "source": [ "The `SweepFrame` has one row for each value of `beta` and one column for each value of `gamma`. \n", @@ -237,7 +237,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "tested-nation", + "id": "collected-waterproof", "metadata": {}, "outputs": [], "source": [ @@ -250,7 +250,7 @@ }, { "cell_type": "markdown", - "id": "cloudy-volunteer", + "id": "unexpected-surgeon", "metadata": {}, "source": [ "This is the first example we've seen with one `for` loop inside another:\n", @@ -269,7 +269,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "elder-retirement", + "id": "polar-flash", "metadata": {}, "outputs": [], "source": [ @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "marine-stadium", + "id": "shared-boxing", "metadata": {}, "source": [ "On the $x$-axis, it plots the ratio `beta/gamma`.\n", @@ -297,7 +297,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "legal-onion", + "id": "incorporate-launch", "metadata": {}, "outputs": [], "source": [ @@ -309,7 +309,7 @@ }, { "cell_type": "markdown", - "id": "purple-jersey", + "id": "tropical-colony", "metadata": {}, "source": [ "The results fall on a single curve, at least approximately. That means that we can predict the fraction of the population that will be infected based on a single parameter, the ratio `beta/gamma`. We don't need to know the values of `beta` and `gamma` separately." @@ -317,7 +317,7 @@ }, { "cell_type": "markdown", - "id": "sublime-cargo", + "id": "lightweight-surfing", "metadata": {}, "source": [ "## Contact number\n", @@ -334,7 +334,7 @@ }, { "cell_type": "markdown", - "id": "potential-curve", + "id": "banner-egyptian", "metadata": {}, "source": [ "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", @@ -362,7 +362,7 @@ }, { "cell_type": "markdown", - "id": "reverse-prize", + "id": "noticed-mouse", "metadata": {}, "source": [ "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." @@ -370,7 +370,7 @@ }, { "cell_type": "markdown", - "id": "lightweight-upgrade", + "id": "accessible-bernard", "metadata": {}, "source": [ "Here's how the derivation goes. We multiply both sides of the previous\n", @@ -395,7 +395,7 @@ }, { "cell_type": "markdown", - "id": "blessed-charger", + "id": "instrumental-placement", "metadata": {}, "source": [ "Now, at the end of the epidemic, let's assume that $i(\\infty) = 0$, and $s(\\infty)$ is an unknown quantity, $s_{\\infty}$. Now we have:\n", @@ -407,7 +407,7 @@ }, { "cell_type": "markdown", - "id": "killing-flavor", + "id": "under-dating", "metadata": {}, "source": [ "## Analysis and simulation\n", @@ -418,7 +418,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "temporal-murray", + "id": "architectural-growth", "metadata": {}, "outputs": [], "source": [ @@ -427,7 +427,7 @@ }, { "cell_type": "markdown", - "id": "engaged-activity", + "id": "oriented-turtle", "metadata": {}, "source": [ "And compute the corresponding values of $c$:" @@ -436,7 +436,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "coordinated-sheffield", + "id": "narrative-embassy", "metadata": {}, "outputs": [], "source": [ @@ -447,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "cleared-gregory", + "id": "assisted-public", "metadata": {}, "source": [ "To get the total infected, we compute the difference between $s(0)$ and\n", @@ -457,7 +457,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "level-citizenship", + "id": "canadian-assumption", "metadata": {}, "outputs": [], "source": [ @@ -466,7 +466,7 @@ }, { "cell_type": "markdown", - "id": "divine-polls", + "id": "published-generation", "metadata": {}, "source": [ "The ModSim library provides a function called `make_series` we can use to put `c_array` and `frac_infected` in a Pandas `Series`." @@ -475,7 +475,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "mounted-patient", + "id": "antique-watch", "metadata": {}, "outputs": [], "source": [ @@ -484,7 +484,7 @@ }, { "cell_type": "markdown", - "id": "emerging-insert", + "id": "conscious-bathroom", "metadata": {}, "source": [ "Now we can plot the results:" @@ -493,7 +493,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "adjusted-spread", + "id": "fallen-router", "metadata": {}, "outputs": [], "source": [ @@ -506,7 +506,7 @@ }, { "cell_type": "markdown", - "id": "adjustable-calculator", + "id": "billion-worthy", "metadata": {}, "source": [ "When the contact number exceeds 1, analysis and simulation agree. When\n", @@ -519,7 +519,7 @@ }, { "cell_type": "markdown", - "id": "southeast-comparative", + "id": "alternate-surprise", "metadata": {}, "source": [ "## Estimating contact number\n", @@ -542,7 +542,7 @@ }, { "cell_type": "markdown", - "id": "greenhouse-harmony", + "id": "related-council", "metadata": {}, "source": [ "## Summary\n", @@ -556,7 +556,7 @@ }, { "cell_type": "markdown", - "id": "buried-tracy", + "id": "removed-conviction", "metadata": {}, "source": [ "## Exercises" @@ -564,7 +564,7 @@ }, { "cell_type": "markdown", - "id": "mineral-walnut", + "id": "textile-program", "metadata": {}, "source": [ "**Exercise:** At the beginning of this chapter, I suggested two ways to relate `beta` and `gamma`: we could compute their difference or their ratio.\n", @@ -583,7 +583,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "right-official", + "id": "current-tiger", "metadata": {}, "outputs": [], "source": [ @@ -593,7 +593,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "weekly-doctrine", + "id": "specialized-regression", "metadata": {}, "outputs": [], "source": [ @@ -603,7 +603,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "failing-treaty", + "id": "canadian-authentication", "metadata": {}, "outputs": [], "source": [ @@ -612,7 +612,7 @@ }, { "cell_type": "markdown", - "id": "statistical-senate", + "id": "angry-perfume", "metadata": {}, "source": [ "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", @@ -625,7 +625,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "manufactured-cache", + "id": "surgical-mouth", "metadata": { "scrolled": true }, @@ -637,7 +637,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "academic-chancellor", + "id": "focused-magnet", "metadata": {}, "outputs": [], "source": [ @@ -646,7 +646,7 @@ }, { "cell_type": "markdown", - "id": "functioning-resort", + "id": "charged-sample", "metadata": {}, "source": [ "**Exercise**: So far the only metric we have considered is the total fraction of the population that gets infected over the course of an epidemic. That is an important metric, but it is not the only one we care about.\n", @@ -663,7 +663,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "decent-understanding", + "id": "greatest-palestine", "metadata": {}, "outputs": [], "source": [ @@ -673,7 +673,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "laughing-imperial", + "id": "average-practitioner", "metadata": {}, "outputs": [], "source": [ @@ -683,7 +683,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "close-cache", + "id": "elegant-gamma", "metadata": {}, "outputs": [], "source": [ @@ -693,7 +693,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "annoying-alexander", + "id": "plain-dayton", "metadata": {}, "outputs": [], "source": [ @@ -703,7 +703,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "charming-checkout", + "id": "sexual-services", "metadata": {}, "outputs": [], "source": [ @@ -713,7 +713,7 @@ { "cell_type": "code", "execution_count": 30, - "id": "passive-slave", + "id": "central-fever", "metadata": {}, "outputs": [], "source": [ @@ -723,17 +723,68 @@ { "cell_type": "code", "execution_count": 31, - "id": "promising-spyware", + "id": "tropical-advancement", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] }, + { + "cell_type": "markdown", + "id": "editorial-coating", + "metadata": {}, + "source": [ + "## Under the hood\n", + "\n", + "ModSim provides `make_series` to make it easier to create a Pandas Series. In this chapter, we used it like this: " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "corresponding-india", + "metadata": {}, + "outputs": [], + "source": [ + "make_series(t_array, T_array)" + ] + }, + { + "cell_type": "markdown", + "id": "comparable-strap", + "metadata": {}, + "source": [ + "If you import `Series` from Pandas, you can make a `Series` yourself, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "constant-christianity", + "metadata": {}, + "outputs": [], + "source": [ + "from pandas import Series\n", + "\n", + "Series(T_array, t_array)" + ] + }, + { + "cell_type": "markdown", + "id": "wireless-president", + "metadata": {}, + "source": [ + "The difference is that the arguments are in reverse order: the first argument is stored as the values in the `Series`; the second argument is stored as the `index`.\n", + "\n", + "I find that order counterintuitive, which is why I use `make_series`.\n", + "`make_series` takes the same optional keyword arguments as `Series`, which you can read about at ." + ] + }, { "cell_type": "code", "execution_count": null, - "id": "passing-quarterly", + "id": "hidden-recipient", "metadata": {}, "outputs": [], "source": [] diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index e859829b..b8d79df4 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "located-subscription", + "id": "romantic-speech", "metadata": {}, "source": [ "# Chapter 15" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "imported-table", + "id": "higher-button", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "electoral-turkey", + "execution_count": 1, + "id": "narrow-indication", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "formal-context", + "execution_count": 2, + "id": "dependent-monitoring", "metadata": { "tags": [] }, @@ -65,8 +65,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "progressive-typing", + "execution_count": 3, + "id": "continental-decrease", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "derived-exhibit", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap15.ipynb)" @@ -87,7 +87,7 @@ }, { "cell_type": "markdown", - "id": "italic-murder", + "id": "capital-needle", "metadata": {}, "source": [ "So far the systems we have studied have been physical in the sense that they exist in the world, but they have not been physics, in the sense of what physics classes are usually about. In the next few chapters, we'll do some physics, starting with **thermal systems**, that is, systems where the temperature of objects changes as heat transfers from one to another." @@ -95,7 +95,7 @@ }, { "cell_type": "markdown", - "id": "adolescent-phone", + "id": "working-senator", "metadata": {}, "source": [ "## The coffee cooling problem\n", @@ -110,7 +110,7 @@ }, { "cell_type": "markdown", - "id": "appreciated-ukraine", + "id": "backed-steel", "metadata": {}, "source": [ "To help answer this question, I made a trial run with the milk and\n", @@ -135,14 +135,14 @@ }, { "cell_type": "markdown", - "id": "arranged-ridge", + "id": "retired-noise", "metadata": {}, "source": [ "## Temperature and heat\n", "\n", "To understand how coffee cools (and milk warms), we need a model of\n", "temperature and heat. **Temperature** is a property of an object or a\n", - "system; in SI units it is measured in degrees Celsius (°C). Temperature quantifies how hot or cold the object is, which is related to the average velocity of the particles that make up the object.\n", + "system; in SI units it is measured in degrees Celsius (°C). Temperature quantifies how hot or cold the object is, which is related to the average velocity of the particles that make it up.\n", "\n", "When particles in a hot object contact particles in a cold object, the\n", "hot object gets cooler and the cold object gets warmer as energy is\n", @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "purple-edward", + "id": "upper-johnson", "metadata": {}, "source": [ "For objects made primarily from one material, thermal mass can be\n", @@ -188,7 +188,7 @@ }, { "cell_type": "markdown", - "id": "other-finnish", + "id": "closed-vegetable", "metadata": {}, "source": [ "## Heat transfer\n", @@ -204,7 +204,7 @@ " place, they carry heat energy with them. Fluid flows can be caused\n", " by external action, like stirring, or by internal differences in\n", " temperature. For example, you might have heard that hot air rises,\n", - " which is a form of \"natural convection\\\".\n", + " which is a form of \"natural convection\".\n", "\n", "- Radiation: As the particles in an object move due to thermal energy,\n", " they emit electromagnetic radiation. The energy carried by this\n", @@ -214,7 +214,7 @@ }, { "cell_type": "markdown", - "id": "friendly-nurse", + "id": "valuable-shark", "metadata": {}, "source": [ "For objects like coffee in a car, the effect of radiation is much\n", @@ -225,22 +225,21 @@ }, { "cell_type": "markdown", - "id": "heavy-forward", + "id": "freelance-target", "metadata": {}, "source": [ "## Newton's law of cooling\n", "\n", - "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the\n", - "object and the surrounding environment:\n", + "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the object and the surrounding environment:\n", "\n", "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", "\n", - "where $T$, the temperature of the object, is a function of time, $t$; $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." + "where $T$, the temperature of the object, is a function of time, $t$, $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." ] }, { "cell_type": "markdown", - "id": "educated-accommodation", + "id": "corrected-attachment", "metadata": {}, "source": [ "Newton's so-called \"law \" is really a model: it is a good approximation in some conditions and less good in others.\n", @@ -262,7 +261,7 @@ }, { "cell_type": "markdown", - "id": "determined-seventh", + "id": "selective-video", "metadata": {}, "source": [ "## Implementation\n", @@ -275,7 +274,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "geological-graph", + "id": "incredible-greeting", "metadata": { "tags": [] }, @@ -294,16 +293,18 @@ }, { "cell_type": "markdown", - "id": "cardiac-lesson", + "id": "gross-appeal", "metadata": {}, "source": [ - "The values of `T_init`, `volume`, and `t_end` come from the statement of the problem:" + "In addition to the parameters, `make_system` sets the temperature of the environment, `T_env`, the initial time stamp, `t_0`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", + "\n", + "Here's a `System` object that represents the coffee." ] }, { "cell_type": "code", "execution_count": 5, - "id": "eastern-alignment", + "id": "fuzzy-support", "metadata": {}, "outputs": [], "source": [ @@ -312,12 +313,11 @@ }, { "cell_type": "markdown", - "id": "horizontal-background", + "id": "rental-pearl", "metadata": {}, "source": [ - "I chose the value of `r` arbitrarily for now; we will figure out how to estimate it soon.\n", - "\n", - "In addition, `make_system` sets the temperature of the environment, `T_env`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", + "The values of `T_init`, `volume`, and `t_end` come from the statement of the problem.\n", + "I chose the value of `r` arbitrarily for now; we will see how to estimate it soon.\n", "\n", "Strictly speaking, Newton's law is a differential equation, but over a short period of time we can approximate it with a difference equation:\n", "\n", @@ -329,26 +329,26 @@ "environment, $T - T_{env}$. To minimize confusion, I avoid this second\n", "use.\n", "\n", - "The following function takes the current temperature, `T`, the current time `t`, and a `System` object, and computes the change in temperature during a time step:" + "The following function takes the current time `t`, the current temperature, `T`, and a `System` object, and computes the change in temperature during a time step:" ] }, { "cell_type": "code", "execution_count": 6, - "id": "vulnerable-sarah", + "id": "tight-baptist", "metadata": { "tags": [] }, "outputs": [], "source": [ - "def change_func(T, t, system):\n", + "def change_func(t, T, system):\n", " r, T_env, dt = system.r, system.T_env, system.dt \n", " return -r * (T - T_env) * dt" ] }, { "cell_type": "markdown", - "id": "unknown-programming", + "id": "flexible-crest", "metadata": {}, "source": [ "We can test it with the initial temperature of the coffee, like this:" @@ -357,19 +357,19 @@ { "cell_type": "code", "execution_count": 7, - "id": "killing-tragedy", + "id": "fiscal-artwork", "metadata": {}, "outputs": [], "source": [ - "change_func(coffee.T_init, 0, coffee)" + "change_func(0, coffee.T_init, coffee)" ] }, { "cell_type": "markdown", - "id": "geographic-female", + "id": "sporting-morocco", "metadata": {}, "source": [ - "With `dt=1` minute, the temperature drops by about 0.7 °C/min, at least for this value of `r`.\n", + "With `dt=1` minute, the temperature drops by about 0.7 °C, at least for this value of `r`.\n", "\n", "Now here's a version of `run_simulation` that simulates a series of time steps from `t_0` to `t_end`:" ] @@ -377,7 +377,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "wireless-handy", + "id": "cardiac-independence", "metadata": { "tags": [] }, @@ -393,30 +393,48 @@ " for i in range(n-1):\n", " t = t_array[i]\n", " T = series.iloc[i]\n", - " series.iloc[i+1] = T + change_func(T, t, system)\n", + " series.iloc[i+1] = T + change_func(t, T, system)\n", " \n", - " system.t_end = t_array[-1]\n", " system.T_final = series.iloc[-1]\n", " return series" ] }, { "cell_type": "markdown", - "id": "voluntary-velvet", + "id": "saved-dublin", + "metadata": {}, + "source": [ + "There are a two things here that are different from previous versions of `run_simulation`.\n", + "\n", + "First, we use `linrange` to make an array of values from `t_0` to `t_end` with time step `dt`. \n", + "`linrange` is similar to `linspace`; they both take a start value and an end value and return an array of equally spaced values.\n", + "The difference is the third argument: `linspace` takes an integer that indicates the number of points in the range; `linrange` takes a step size that indicates the interval between values.\n", + "When we make the `TimeSeries`, we use the keyword argument `index` to indicate that the index of the `TimeSeries` is the array of time stamps, `t_array`." + ] + }, + { + "cell_type": "markdown", + "id": "fantastic-object", "metadata": {}, "source": [ - "This function is similar to previous versions of `run_simulation`.\n", + "Second, this version of `run_simulation` uses `iloc` rather than `loc` to specify the rows in the `TimeSeries`.\n", + "Here's the difference: \n", + "\n", + "* With `loc`, the label in brackets can be any kind of value, with any start, end, and time step. For example, in the world population model, the labels are years starting in 1960 and ending in 2016.\n", "\n", - "One difference is that it uses `linrange` to make an array of values\n", - "from `t_0` to `t_end` with time step `dt`.\n", + "* With `iloc`, the label in brackets is always an integer starting at 0. So we can always get the first element with `iloc[0]` and the last element with `iloc[-1]`, regardless of what the labels are.\n", "\n", - "We can run it like this:" + "In this version of `run_simulation`, the loop variable is an integer, `i`, that goes from `0` to `n-1`, including `0` but not including `n-1`.\n", + "So the first time through the loop, `i` is `0` and the value we add to the `TimeSeries` has index 1.\n", + "The last time through the loop, `i` is `n-2` and the value we add has index `n-1`.\n", + "\n", + "We can run the simulation like this:" ] }, { "cell_type": "code", "execution_count": 9, - "id": "after-championship", + "id": "numerous-metabolism", "metadata": {}, "outputs": [], "source": [ @@ -425,39 +443,64 @@ }, { "cell_type": "markdown", - "id": "consecutive-party", + "id": "earned-primary", "metadata": {}, "source": [ - "The result is a `TimeSeries` with one row per time step. " + "The result is a `TimeSeries` with one row per time step. \n", + "Here are the first few rows:" ] }, { "cell_type": "code", "execution_count": 10, - "id": "proof-guard", + "id": "infectious-carolina", "metadata": {}, "outputs": [], "source": [ - "results.head()" + "show(results.head())" ] }, { "cell_type": "markdown", - "id": "limiting-legislation", + "id": "color-olive", "metadata": {}, "source": [ - "Here's what the results look like." + "And the last few rows:" ] }, { "cell_type": "code", "execution_count": 11, - "id": "expected-company", + "id": "accompanied-melbourne", + "metadata": {}, + "outputs": [], + "source": [ + "show(results.tail())" + ] + }, + { + "cell_type": "markdown", + "id": "formal-headset", + "metadata": {}, + "source": [ + "With `t_0=0`, `t_end=30`, and `dt=1`, the time stamps go from `0.0` to `30.0`." + ] + }, + { + "cell_type": "markdown", + "id": "documentary-standing", + "metadata": {}, + "source": [ + "Here's what the `TimeSeries` looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "important-constitution", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "results.plot(label='coffee')\n", "\n", "decorate(xlabel='Time (minute)',\n", @@ -467,7 +510,7 @@ }, { "cell_type": "markdown", - "id": "incomplete-demonstration", + "id": "absent-arkansas", "metadata": {}, "source": [ "The temperature after 30 minutes is 72.3 °C, which is a little higher than what's stated in the problem, 70 °C. " @@ -475,8 +518,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "protecting-picture", + "execution_count": 13, + "id": "absolute-desire", "metadata": {}, "outputs": [], "source": [ @@ -485,7 +528,7 @@ }, { "cell_type": "markdown", - "id": "tight-operation", + "id": "light-carpet", "metadata": {}, "source": [ "By trial and error, we could find the value of `r` where the final temperature is precisely 70 °C.\n", @@ -494,16 +537,16 @@ }, { "cell_type": "markdown", - "id": "equipped-blackberry", + "id": "funny-weekly", "metadata": {}, "source": [ "## Finding roots\n", "\n", - "ModSim provides a function called `root_scalar` that finds the roots of non-linear equations. As a simple example, suppose you want to find the roots of the polynomial \n", + "The ModSim library provides a function called `root_scalar` that finds the roots of non-linear equations. As an example, suppose you want to find the roots of the polynomial \n", "\n", "$$f(x) = (x - 1)(x - 2)(x - 3)$$ \n", "\n", - "A **root** is a value of $x$ that makes $f(x)=0$. Because of the way I wrote the polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", + "A **root** is a value of $x$ that makes $f(x)=0$. Because of the way I wrote this polynomial, we can see that if $x=1$, the first factor is 0; if $x=2$, the second factor is 0; and if $x=3$, the third factor is 0, so those are the roots.\n", "\n", "I'll use this example to demonstrate `root_scalar`. First, we have to\n", "write a function that evaluates $f$:" @@ -511,8 +554,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "round-budapest", + "execution_count": 14, + "id": "small-shark", "metadata": {}, "outputs": [], "source": [ @@ -522,7 +565,7 @@ }, { "cell_type": "markdown", - "id": "injured-limitation", + "id": "cleared-cylinder", "metadata": {}, "source": [ "Now we call `root_scalar` like this:" @@ -530,8 +573,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "regulated-cloud", + "execution_count": 15, + "id": "defensive-content", "metadata": {}, "outputs": [], "source": [ @@ -541,17 +584,17 @@ }, { "cell_type": "markdown", - "id": "regulated-weekend", + "id": "adult-management", "metadata": {}, "source": [ "The first argument is the function whose roots we want. The second\n", - "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which stores the root that was found." + "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which is the root that was found." ] }, { "cell_type": "code", - "execution_count": 15, - "id": "graphic-preliminary", + "execution_count": 16, + "id": "behind-perth", "metadata": {}, "outputs": [], "source": [ @@ -560,7 +603,7 @@ }, { "cell_type": "markdown", - "id": "changing-winter", + "id": "disturbed-shade", "metadata": {}, "source": [ "If we provide a different interval, we find a different root." @@ -568,8 +611,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "authentic-hunter", + "execution_count": 17, + "id": "following-sentence", "metadata": {}, "outputs": [], "source": [ @@ -579,7 +622,7 @@ }, { "cell_type": "markdown", - "id": "bound-freight", + "id": "eligible-updating", "metadata": {}, "source": [ "If the interval doesn't contain a root, you'll get a `ValueError` and a message like \"f(a) and f(b) must have different signs\".\n", @@ -591,7 +634,7 @@ }, { "cell_type": "markdown", - "id": "impossible-spanish", + "id": "ahead-lawyer", "metadata": {}, "source": [ "Now we can use `root_scalar` to estimate `r`." @@ -599,7 +642,7 @@ }, { "cell_type": "markdown", - "id": "imperial-engineering", + "id": "commercial-correlation", "metadata": {}, "source": [ "## Estimating `r`\n", @@ -611,7 +654,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "quality-colors", + "id": "genetic-compound", "metadata": {}, "outputs": [], "source": [ @@ -623,7 +666,7 @@ }, { "cell_type": "markdown", - "id": "random-loading", + "id": "happy-bridal", "metadata": {}, "source": [ "This is called an \"error function\" because it returns the\n", @@ -636,7 +679,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "unknown-pharmacy", + "id": "french-financing", "metadata": {}, "outputs": [], "source": [ @@ -646,17 +689,16 @@ }, { "cell_type": "markdown", - "id": "moderate-monkey", + "id": "statutory-activation", "metadata": {}, "source": [ - "The result is an error of 2.3 °C, because the final temperature with\n", - "this value of `r` is too high." + "The result is an error of 2.3 °C, which means the final temperature with `r=0.01` is too high." ] }, { "cell_type": "code", "execution_count": 20, - "id": "fossil-israel", + "id": "excellent-fellow", "metadata": {}, "outputs": [], "source": [ @@ -665,18 +707,18 @@ }, { "cell_type": "markdown", - "id": "south-fabric", + "id": "unlimited-living", "metadata": {}, "source": [ "With `r=0.02`, the error is  about -11°C, which means that the final temperature is too low. So we know that the correct value must be in between.\n", "\n", - "So we can call `root_scalar` like this:" + "Now we can call `root_scalar` like this:" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "backed-while", + "execution_count": 21, + "id": "french-decline", "metadata": {}, "outputs": [], "source": [ @@ -686,7 +728,7 @@ }, { "cell_type": "markdown", - "id": "exotic-development", + "id": "tamil-absorption", "metadata": {}, "source": [ "The first argument is the error function.\n", @@ -698,8 +740,8 @@ }, { "cell_type": "code", - "execution_count": 25, - "id": "early-twelve", + "execution_count": 22, + "id": "afraid-ordering", "metadata": {}, "outputs": [], "source": [ @@ -709,7 +751,7 @@ }, { "cell_type": "markdown", - "id": "greenhouse-designer", + "id": "partial-definition", "metadata": {}, "source": [ "In this example, `r_coffee` turns out to be about `0.0115`, in units of min$^{-1}$ (inverse minutes).\n", @@ -719,8 +761,8 @@ }, { "cell_type": "code", - "execution_count": 26, - "id": "foster-lodging", + "execution_count": 23, + "id": "derived-annual", "metadata": {}, "outputs": [], "source": [ @@ -731,7 +773,7 @@ }, { "cell_type": "markdown", - "id": "sweet-horizontal", + "id": "prerequisite-conditioning", "metadata": {}, "source": [ "The final temperature is very close to 70 °C." @@ -739,7 +781,7 @@ }, { "cell_type": "markdown", - "id": "imposed-complement", + "id": "scientific-attachment", "metadata": {}, "source": [ "## Exercises\n", @@ -751,8 +793,8 @@ }, { "cell_type": "code", - "execution_count": 27, - "id": "radical-accident", + "execution_count": 24, + "id": "committed-angel", "metadata": {}, "outputs": [], "source": [ @@ -761,8 +803,8 @@ }, { "cell_type": "code", - "execution_count": 28, - "id": "extraordinary-andrew", + "execution_count": 25, + "id": "military-military", "metadata": {}, "outputs": [], "source": [ @@ -771,7 +813,7 @@ }, { "cell_type": "markdown", - "id": "initial-parallel", + "id": "logical-acoustic", "metadata": {}, "source": [ "**Exercise:** Write an error function that simulates the temperature of the milk and returns the difference between the final temperature and 20 °C. Use it to estimate the value of `r` for the milk." @@ -779,8 +821,8 @@ }, { "cell_type": "code", - "execution_count": 29, - "id": "yellow-single", + "execution_count": 26, + "id": "agreed-excuse", "metadata": {}, "outputs": [], "source": [ @@ -789,8 +831,8 @@ }, { "cell_type": "code", - "execution_count": 31, - "id": "cognitive-italian", + "execution_count": 27, + "id": "defined-nudist", "metadata": {}, "outputs": [], "source": [ @@ -799,8 +841,8 @@ }, { "cell_type": "code", - "execution_count": 32, - "id": "placed-concentrate", + "execution_count": 28, + "id": "loose-rehabilitation", "metadata": {}, "outputs": [], "source": [ @@ -810,7 +852,7 @@ { "cell_type": "code", "execution_count": null, - "id": "announced-continent", + "id": "alert-emerald", "metadata": {}, "outputs": [], "source": [] diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index dfca2ad7..285ffa16 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "stopped-plymouth", + "id": "medieval-johnston", "metadata": {}, "source": [ "# Chapter 16" @@ -10,7 +10,7 @@ }, { "cell_type": "markdown", - "id": "endangered-sequence", + "id": "fifty-chicken", "metadata": { "tags": [] }, @@ -24,8 +24,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "owned-renewal", + "execution_count": 2, + "id": "blank-belly", "metadata": { "tags": [] }, @@ -41,8 +41,8 @@ }, { "cell_type": "code", - "execution_count": 1, - "id": "appreciated-prefix", + "execution_count": 3, + "id": "british-place", "metadata": { "tags": [] }, @@ -65,8 +65,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "grave-feature", + "execution_count": 4, + "id": "determined-volunteer", "metadata": { "tags": [] }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "senior-malawi", + "id": "valuable-shannon", "metadata": {}, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap16.ipynb)" @@ -87,8 +87,21 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "electrical-temple", + "execution_count": 5, + "id": "fossil-moisture", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap15.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cutting-scale", "metadata": { "tags": [] }, @@ -103,26 +116,30 @@ }, { "cell_type": "markdown", - "id": "vocal-parking", + "id": "enhanced-copper", "metadata": {}, "source": [ "In the previous chapter we wrote a simulation of a cooling cup of\n", "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", "temperature of the coffee will change over time.\n", + "Then we used a root finding algorithm to estimate `r` based on data I invented for the example.\n", + "\n", + "If you did the exercises, you simulated the temperature of the milk as it warmed, and estimated its rate parameter as well.\n", "\n", - "..." + "Now let's put it together.\n", + "In this chapter we'll write a function that simulates mixing the two liquids and use it to answer the question we started with: is it better to mix the coffee and milk at the beginning, the end, or somewhere in the middle?" ] }, { "cell_type": "markdown", - "id": "extensive-peace", + "id": "hydraulic-belfast", "metadata": {}, "source": [ "## Mixing liquids\n", "\n", "When we mix two liquids, the temperature of the mixture depends on the\n", - "temperatures of the ingredients, but it might not be obvious how to\n", - "compute it.\n", + "temperatures of the ingredients as well as their volumes, densities, and specific heat capacities (as defined in the previous chapter).\n", + "In this section I'll explain how.\n", "\n", "Assuming there are no chemical reactions that either produce or consume heat, the total thermal energy of the system is the same before and after mixing; in other words, thermal energy is **conserved**.\n", "\n", @@ -150,14 +167,14 @@ "density and specific heat. As an exercise, you can look up these\n", "quantities and see how good this assumption is.\n", "\n", - "The following function takes two `System` objects that represent the\n", + "The following function takes two `System` objects, representing the\n", "coffee and milk, and creates a new `System` to represent the mixture:" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "front-major", + "execution_count": 11, + "id": "extensive-happening", "metadata": {}, "outputs": [], "source": [ @@ -177,10 +194,10 @@ }, { "cell_type": "markdown", - "id": "empirical-potter", + "id": "overhead-architect", "metadata": {}, "source": [ - "The first two lines extract volume and temperature from the two `System` objects. Then the following two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", + "The first two lines extract volume and temperature from the `System` objects. The next two lines compute the volume and temperature of the mixture. Finally, `mix` makes a new `System` object and returns it.\n", "\n", "This function uses the value of `r` from `system1` as the value of `r`\n", "for the mixture. If `system1` represents the coffee, and we are adding\n", @@ -194,19 +211,19 @@ }, { "cell_type": "markdown", - "id": "pacific-tuesday", + "id": "foreign-campbell", "metadata": {}, "source": [ "## Mix first or last?\n", "\n", "First I'll create objects to represent the coffee and milk.\n", - "For `r_coffee` and `r_milk`, I'll use the values we computed in the previous chapter." + "For `r_coffee`, I'll use the value we computed in the previous chapter." ] }, { "cell_type": "code", - "execution_count": 6, - "id": "psychological-opera", + "execution_count": 12, + "id": "polyphonic-specialist", "metadata": {}, "outputs": [], "source": [ @@ -216,7 +233,7 @@ }, { "cell_type": "markdown", - "id": "interested-moses", + "id": "authorized-system", "metadata": {}, "source": [ "For `r_milk`, I'll use the value I estimated in the exercise from the previous chapter." @@ -224,8 +241,8 @@ }, { "cell_type": "code", - "execution_count": 7, - "id": "outstanding-attendance", + "execution_count": 13, + "id": "subtle-donna", "metadata": {}, "outputs": [], "source": [ @@ -235,7 +252,7 @@ }, { "cell_type": "markdown", - "id": "american-channels", + "id": "satisfactory-rwanda", "metadata": {}, "source": [ "Now we can mix them and simulate 30 minutes:" @@ -243,8 +260,8 @@ }, { "cell_type": "code", - "execution_count": 8, - "id": "certified-testament", + "execution_count": 14, + "id": "domestic-tours", "metadata": {}, "outputs": [], "source": [ @@ -256,7 +273,7 @@ }, { "cell_type": "markdown", - "id": "opposed-function", + "id": "accredited-diagnosis", "metadata": {}, "source": [ "The final temperature is 61.5 °C which is still warm enough to be\n", @@ -267,8 +284,8 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "military-receiver", + "execution_count": 15, + "id": "subject-richardson", "metadata": {}, "outputs": [], "source": [ @@ -280,7 +297,7 @@ }, { "cell_type": "markdown", - "id": "hundred-garbage", + "id": "divine-trance", "metadata": {}, "source": [ "After mixing, the temperature is 62.9 °C, so it looks like adding the\n", @@ -290,7 +307,7 @@ }, { "cell_type": "markdown", - "id": "traditional-episode", + "id": "linear-republican", "metadata": {}, "source": [ "## Optimization\n", @@ -300,8 +317,8 @@ }, { "cell_type": "code", - "execution_count": 10, - "id": "partial-strap", + "execution_count": 16, + "id": "mental-corporation", "metadata": {}, "outputs": [], "source": [ @@ -321,16 +338,19 @@ }, { "cell_type": "markdown", - "id": "synthetic-bridal", + "id": "better-cemetery", "metadata": {}, "source": [ + "`run_and_mix` simulates both systems for the given time, `t_add`.\n", + "Then it mixes them and simulates the mixture fir the remaining time, `t_total - t_add`.\n", + "\n", "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" ] }, { "cell_type": "code", - "execution_count": 12, - "id": "naval-future", + "execution_count": 17, + "id": "adverse-hanging", "metadata": {}, "outputs": [], "source": [ @@ -341,7 +361,7 @@ }, { "cell_type": "markdown", - "id": "welcome-piece", + "id": "practical-state", "metadata": {}, "source": [ "Here's what the results look like:" @@ -349,13 +369,11 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "polished-module", + "execution_count": 18, + "id": "bright-proposal", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "sweep.plot(label='mixture', color='C2')\n", "\n", "decorate(xlabel='Time until mixing (minutes)',\n", @@ -364,29 +382,23 @@ }, { "cell_type": "markdown", - "id": "unauthorized-plate", + "id": "experienced-tribute", "metadata": {}, "source": [ "Note that this is a parameter sweep, not a time series.\n", "\n", "The final temperature is maximized when `t_add=30`, so adding the milk\n", - "at the end is optimal.\n", - "\n", - "As an exercise you will have a chance to explore a variation of the coffee cooling problem:\n", - "\n", - "> Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "But first, let's do some analysis." + "at the end is optimal." ] }, { "cell_type": "markdown", - "id": "confirmed-donor", + "id": "rough-investor", "metadata": {}, "source": [ "## Analysis\n", "\n", - "Simulating Newton's law of cooling is almost silly, because we can solve the differential equation analytically. If\n", + "Simulating Newton's law of cooling isn't really necessary because we can solve the differential equation analytically. If\n", "\n", "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", "\n", @@ -403,7 +415,7 @@ }, { "cell_type": "markdown", - "id": "unnecessary-variance", + "id": "chief-abortion", "metadata": {}, "source": [ "Now we can use the observed data to estimate the parameter $r$. If we\n", @@ -416,8 +428,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "bridal-freight", + "execution_count": 30, + "id": "secondary-swift", "metadata": {}, "outputs": [], "source": [ @@ -435,7 +447,7 @@ }, { "cell_type": "markdown", - "id": "attractive-pennsylvania", + "id": "correct-spare", "metadata": {}, "source": [ "We can use this function to compute `r` for the coffee, given the parameters of the problem." @@ -443,8 +455,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "civil-raise", + "execution_count": 31, + "id": "south-machinery", "metadata": {}, "outputs": [], "source": [ @@ -456,25 +468,24 @@ }, { "cell_type": "markdown", - "id": "cardiovascular-nickname", + "id": "worthy-steal", "metadata": {}, "source": [ "This value is close to the value of `r` we computed in the previous chapter, `0.115`, but not exactly the same.\n", "That's because the simulations use discrete time steps, and the analysis uses continuous time.\n", "\n", - "Nevertheless, the results of any analysis are consistent with the simulation.\n", + "Nevertheless, the results of the analysis are consistent with the simulation.\n", "To check, we'll use the following function, which takes a `System` object and uses the analytic result to compute a time series:" ] }, { "cell_type": "code", - "execution_count": 17, - "id": "improved-optimization", + "execution_count": 32, + "id": "opening-transsexual", "metadata": {}, "outputs": [], "source": [ "from numpy import exp\n", - "from pandas import Series\n", "\n", "def run_analysis(system):\n", " T_env, T_init, r = system.T_env, system.T_init, system.r\n", @@ -488,7 +499,7 @@ }, { "cell_type": "markdown", - "id": "continuing-example", + "id": "fallen-spiritual", "metadata": {}, "source": [ "The first line unpacks the system variables.\n", @@ -501,8 +512,8 @@ }, { "cell_type": "code", - "execution_count": 18, - "id": "numeric-technique", + "execution_count": 33, + "id": "agreed-bouquet", "metadata": {}, "outputs": [], "source": [ @@ -513,7 +524,7 @@ }, { "cell_type": "markdown", - "id": "located-consumption", + "id": "exact-juice", "metadata": {}, "source": [ "The final temperature is 70 °C, as it should be. In fact, the results\n", @@ -522,9 +533,11 @@ }, { "cell_type": "code", - "execution_count": 19, - "id": "legendary-steal", - "metadata": {}, + "execution_count": 34, + "id": "portuguese-sympathy", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "coffee.r = 0.011543\n", @@ -533,9 +546,11 @@ }, { "cell_type": "code", - "execution_count": 20, - "id": "conventional-islam", - "metadata": {}, + "execution_count": 35, + "id": "distinguished-regard", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from numpy import allclose\n", @@ -545,34 +560,38 @@ }, { "cell_type": "markdown", - "id": "stopped-referral", + "id": "rapid-payroll", "metadata": {}, "source": [ - "## Exercises" + "## Summary\n", + "\n", + "In this chapter we finished the coffee cooling problem from the previous chapter, and found that it is better to add the milk at the end, at least for the version of the problem I posed.\n", + "\n", + "As an exercise you will have a chance to explore a variation of the problem where the answer might be different.\n", + "\n", + "In the next chapter we'll move on to a new example, a model of how glucose and insulin interact to control blood sugar." ] }, { "cell_type": "markdown", - "id": "exceptional-paper", + "id": "gothic-clearance", "metadata": {}, "source": [ - "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." + "## Exercises" ] }, { - "cell_type": "code", - "execution_count": 21, - "id": "municipal-sustainability", + "cell_type": "markdown", + "id": "foreign-permission", "metadata": {}, - "outputs": [], "source": [ - "# Solution goes here" + "**Exercise:** Use `compute_r` to compute `r_milk` according to the analytic solution. Run the analysis with this value of `r_milk` and confirm that the results are consistent with the simulation." ] }, { "cell_type": "code", - "execution_count": 22, - "id": "radical-problem", + "execution_count": 25, + "id": "acting-howard", "metadata": {}, "outputs": [], "source": [ @@ -581,8 +600,8 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "cooked-revision", + "execution_count": 26, + "id": "ahead-compensation", "metadata": {}, "outputs": [], "source": [ @@ -591,28 +610,18 @@ }, { "cell_type": "code", - "execution_count": 24, - "id": "interstate-correspondence", + "execution_count": 27, + "id": "assumed-shock", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] }, - { - "cell_type": "markdown", - "id": "medium-curtis", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" - ] - }, { "cell_type": "code", - "execution_count": 25, - "id": "wicked-reasoning", + "execution_count": 28, + "id": "elementary-moral", "metadata": {}, "outputs": [], "source": [ @@ -621,53 +630,22 @@ }, { "cell_type": "markdown", - "id": "corrected-dealing", + "id": "western-mixture", "metadata": {}, "source": [ - "## Under the hood\n", + "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", "\n", - "ModSim provides `make_series` to make it easier to create a Pandas Series. In this chapter, we used it like this: " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "consistent-eleven", - "metadata": {}, - "outputs": [], - "source": [ - "make_series(t_array, T_array)" - ] - }, - { - "cell_type": "markdown", - "id": "exceptional-assembly", - "metadata": {}, - "source": [ - "If you import `Series` from Pandas, you can make a `Series` yourself, like this:" + "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" ] }, { "cell_type": "code", - "execution_count": 27, - "id": "interpreted-intro", + "execution_count": 29, + "id": "super-citizenship", "metadata": {}, "outputs": [], "source": [ - "from pandas import Series\n", - "\n", - "Series(T_array, t_array)" - ] - }, - { - "cell_type": "markdown", - "id": "right-louis", - "metadata": {}, - "source": [ - "The difference is that the arguments are in reverse order: the first argument is stored as the values in the `Series`; the second argument is stored as the `index`.\n", - "\n", - "I find that order counterintuitive, which is why I use `make_series`.\n", - "`make_series` takes the same optional keyword arguments as `Series`, which you can read about at ." + "# Solution goes here" ] } ], diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 7db8d0a4..24a3bda2 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] From 2d217808a67d1275744363252970fb1f0894759f Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 17 Feb 2021 14:23:13 -0500 Subject: [PATCH 052/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 163819 -> 164848 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index c272a5cec28a90b6d1a15d854db8e911f666e21b..7457da484b39936ab45f5b2896fa3a75bd2a9355 100644 GIT binary patch delta 27025 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 Date: Thu, 18 Feb 2021 09:44:44 -0500 Subject: [PATCH 053/144] Updating examples --- examples/bungee1.ipynb | 714 +++++++++++++++++ examples/bungee2.ipynb | 754 ++++++++++++++++++ examples/duck.ipynb | 209 +++++ examples/filter.ipynb | 929 +++++++++++++++++++++ examples/glucose.ipynb | 623 +++++++++++++++ examples/header.ipynb | 93 +++ examples/hiv_model_soln.ipynb | 311 ++++++++ examples/insulin.ipynb | 425 ++++++++++ examples/kitten.ipynb | 519 ++++++++++++ examples/oem.ipynb | 1106 ++++++++++++++++++++++++++ examples/orbit.ipynb | 377 +++++++++ examples/plague.ipynb | 623 +++++++++++++++ examples/queue.ipynb | 592 ++++++++++++++ examples/salmon.ipynb | 695 ++++++++++++++++ examples/spiderman.ipynb | 848 ++++++++++++++++++++ examples/throwingaxe.ipynb | 482 +++++++++++ examples/trees.ipynb | 1014 +++++++++++++++++++++++ examples/wall.ipynb | 629 +++++++++++++++ examples/wall_soln_with_fsolve.ipynb | 1021 ++++++++++++++++++++++++ examples/yoyo.ipynb | 607 ++++++++++++++ 20 files changed, 12571 insertions(+) create mode 100644 examples/bungee1.ipynb create mode 100644 examples/bungee2.ipynb create mode 100644 examples/duck.ipynb create mode 100644 examples/filter.ipynb create mode 100644 examples/glucose.ipynb create mode 100644 examples/header.ipynb create mode 100644 examples/hiv_model_soln.ipynb create mode 100644 examples/insulin.ipynb create mode 100644 examples/kitten.ipynb create mode 100644 examples/oem.ipynb create mode 100644 examples/orbit.ipynb create mode 100644 examples/plague.ipynb create mode 100644 examples/queue.ipynb create mode 100644 examples/salmon.ipynb create mode 100644 examples/spiderman.ipynb create mode 100644 examples/throwingaxe.ipynb create mode 100644 examples/trees.ipynb create mode 100644 examples/wall.ipynb create mode 100644 examples/wall_soln_with_fsolve.ipynb create mode 100644 examples/yoyo.ipynb diff --git a/examples/bungee1.ipynb b/examples/bungee1.ipynb new file mode 100644 index 00000000..0a146f3d --- /dev/null +++ b/examples/bungee1.ipynb @@ -0,0 +1,714 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bungee Dunk" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose you want to set the world record for the highest \"bungee dunk\", [as shown in this video](https://www.youtube.com/watch?v=UBf7WC19lpw). Since the record is 70 m, let's design a jump for 80 m.\n", + "\n", + "We'll make the following modeling assumptions:\n", + "\n", + "1. Initially the bungee cord hangs from a crane with the attachment point 80 m above a cup of tea.\n", + "\n", + "2. Until the cord is fully extended, it applies no force to the jumper. It turns out this might not be a good assumption; we will revisit it.\n", + "\n", + "3. After the cord is fully extended, it obeys [Hooke's Law](https://en.wikipedia.org/wiki/Hooke%27s_law); that is, it applies a force to the jumper proportional to the extension of the cord beyond its resting length.\n", + "\n", + "4. The jumper is subject to drag force proportional to the square of their velocity, in the opposite of their direction of motion.\n", + "\n", + "Our objective is to choose the length of the cord, `L`, and its spring constant, `k`, so that the jumper falls all the way to the tea cup, but no farther! \n", + "\n", + "First I'll create a `Param` object to contain the quantities we'll need:\n", + "\n", + "1. Let's assume that the jumper's mass is 75 kg.\n", + "\n", + "2. With a terminal velocity of 60 m/s.\n", + "\n", + "3. The length of the bungee cord is `L = 40 m`.\n", + "\n", + "4. The spring constant of the cord is `k = 20 N / m` when the cord is stretched, and 0 when it's compressed.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(y_attach = 80, # m,\n", + " v_init = 0, # m / s,\n", + " g = 9.8, # m/s**2,\n", + " mass = 75, # kg,\n", + " area = 1, # m**2,\n", + " rho = 1.2, # kg/m**3,\n", + " v_term = 60, # m / s,\n", + " L = 25, # m,\n", + " k = 40, # N / m\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", + "\n", + "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Makes a System object for the given params.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " area, mass = params.area, params.mass\n", + " g, rho = params.g, params.rho\n", + " v_init, v_term = params.v_init, params.v_term\n", + " y_attach = params.y_attach\n", + " \n", + " C_d = 2 * mass * g / (rho * area * v_term**2)\n", + " init = State(y=y_attach, v=v_init)\n", + " t_end = 20\n", + "\n", + " return System(params, C_d=C_d, \n", + " init=init, t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a `System`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`spring_force` computes the force of the cord on the jumper.\n", + "\n", + "If the spring is not extended, it returns `zero_force`, which is either 0 Newtons or 0, depending on whether the `System` object has units. I did that so the slope function works correctly with and without units." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def spring_force(y, system):\n", + " \"\"\"Computes the force of the bungee cord on the jumper:\n", + " \n", + " y: height of the jumper\n", + " \n", + " Uses these variables from system|\n", + " y_attach: height of the attachment point\n", + " L: resting length of the cord\n", + " k: spring constant of the cord\n", + " \n", + " returns: force in N\n", + " \"\"\"\n", + " y_attach, L, k = system.y_attach, system.L, system.k\n", + " \n", + " distance_fallen = y_attach - y\n", + " if distance_fallen <= L:\n", + " return 0\n", + " \n", + " extension = distance_fallen - L\n", + " f_spring = k * extension\n", + " return f_spring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The spring force is 0 until the cord is fully extended. When it is extended 1 m, the spring force is 40 N. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "spring_force(55, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "spring_force(54, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`drag_force` computes drag as a function of velocity:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(v, system):\n", + " \"\"\"Computes drag force in the opposite direction of `v`.\n", + " \n", + " v: velocity\n", + " system: System object\n", + "\n", + " returns: drag force\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the drag force at 60 meters per second." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "v = -60\n", + "f_drag = drag_force(v, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Acceleration due to drag at 60 m/s is approximately g, which confirms that 60 m/s is terminal velocity." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "a_drag = f_drag / system.mass\n", + "a_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now here's the slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing g, rho,\n", + " C_d, area, and mass\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " mass, g = system.mass, system.g\n", + " \n", + " a_drag = drag_force(v, system) / mass\n", + " a_spring = spring_force(y, system) / mass\n", + " \n", + " dvdt = -g + a_drag + a_spring\n", + " \n", + " return v, dvdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, let's test the slope function with the initial params." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the plot of position as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " results.y.plot()\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After reaching the lowest point, the jumper springs back almost to almost 70 m and oscillates several times. That looks like more oscillation that we expect from an actual jump, which suggests that there is some dissipation of energy in the real world that is not captured in our model. To improve the model, that might be a good thing to investigate.\n", + "\n", + "But since we are primarily interested in the initial descent, the model might be good enough for now.\n", + "\n", + "We can use `min` to find the lowest point:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "min(results.y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At the lowest point, the jumper is still too high, so we'll need to increase `L` or decrease `k`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's velocity as a function of time:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + " results.v.plot(color='C1', label='v')\n", + " \n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although we compute acceleration inside the slope function, we don't get acceleration as a result from `run_solve_ivp`.\n", + "\n", + "We can approximate it by computing the numerical derivative of `ys`:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "a = gradient(results.v)\n", + "a.plot(color='C2')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Acceleration (m/$s^2$)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can compute the maximum acceleration the jumper experiences:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "max_acceleration = max(a)\n", + "max_acceleration" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Relative to the acceleration of gravity, the jumper \"pulls\" about \"1.7 g's\"." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "max_acceleration / system.g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving for length\n", + "\n", + "Assuming that `k` is fixed, let's find the length `L` that makes the minimum altitude of the jumper exactly 0." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The metric we are interested in is the lowest point of the first oscillation. For both efficiency and accuracy, it is better to stop the simulation when we reach this point, rather than run past it and then compute the minimum.\n", + "\n", + "Here's an event function that stops the simulation when velocity is 0." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " \"\"\"Return velocity.\n", + " \"\"\"\n", + " y, v = state\n", + " return v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As usual, we should test it with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "event_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we call `run_solve_ivp` with this event function, we'll see that the simulation stops immediately because the initial velocity is 0.\n", + "\n", + "We could work around that by starting with a very small, non-zero initial velocity.\n", + "But we can also avoid it by setting the `direction` attribute of the `event_func`:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "event_func.direction = 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The value 1 (or any positive value) indicates that the event should only occur if the result from `event_func` is increasing.\n", + "A negative value would indicate that the results should be decreasing.\n", + "\n", + "Now we can test it and confirm that it stops at the bottom of the jump." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func, \n", + " events=event_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the height of the jumper at the lowest point." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "min(results.y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write an error function that takes `L` and `params` as arguments, simulates a bungee jump, and returns the lowest point.\n", + "\n", + "Test the error function with a guess of 25 m and confirm that the return value is about 5 meters.\n", + "\n", + "Use `root_scalar` with your error function to find the value of `L` that yields a perfect bungee dunk.\n", + "\n", + "Run a simulation with the result from `root_scalar` and confirm that it works." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/bungee2.ipynb b/examples/bungee2.ipynb new file mode 100644 index 00000000..10c1131a --- /dev/null +++ b/examples/bungee2.ipynb @@ -0,0 +1,754 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bungee Dunk Revisited" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous case study, we simulated a bungee jump with a model that took into account gravity, air resistance, and the spring force of the bungee cord, but we ignored the weight of the cord.\n", + "\n", + "It is tempting to say that the weight of the cord doesn't matter because it falls along with the jumper. But that intuition is incorrect, as explained by [Heck, Uylings, and Kędzierska](http://iopscience.iop.org/article/10.1088/0031-9120/45/1/007). As the cord falls, it transfers energy to the jumper. They derive a differential equation that relates the acceleration of the jumper to position and velocity:\n", + "\n", + "$a = g + \\frac{\\mu v^2/2}{\\mu(L+y) + 2L}$ \n", + "\n", + "where $a$ is the net acceleration of the jumper, $g$ is acceleration due to gravity, $v$ is the velocity of the jumper, $y$ is the position of the jumper relative to the starting point (usually negative), $L$ is the length of the cord, and $\\mu$ is the mass ratio of the cord and jumper.\n", + "\n", + "If you don't believe this model is correct, [this video might convince you](https://www.youtube.com/watch?v=X-QFAB0gEtE).\n", + "\n", + "Following the previous case study, we'll model the jump with the following assumptions:\n", + "\n", + "1. Initially the bungee cord hangs from a crane with the attachment point 80 m above a cup of tea.\n", + "\n", + "2. Until the cord is fully extended, it applies a force to the jumper as explained above.\n", + "\n", + "3. After the cord is fully extended, it obeys [Hooke's Law](https://en.wikipedia.org/wiki/Hooke%27s_law); that is, it applies a force to the jumper proportional to the extension of the cord beyond its resting length.\n", + "\n", + "4. The jumper is subject to drag force proportional to the square of their velocity, in the opposite of their direction of motion.\n", + "\n", + "First I'll create a `Param` object to contain the quantities we'll need:\n", + "\n", + "1. Let's assume that the jumper's mass is 75 kg and the cord's mass is also 75 kg, so `mu=1`.\n", + "\n", + "2. The jumpers's frontal area is 1 square meter, and terminal velocity is 60 m/s. I'll use these values to back out the coefficient of drag.\n", + "\n", + "3. The length of the bungee cord is `L = 25 m`.\n", + "\n", + "4. The spring constant of the cord is `k = 40 N / m` when the cord is stretched, and 0 when it's compressed.\n", + "\n", + "I adopt the coordinate system and most of the variable names from [Heck, Uylings, and Kędzierska](http://iopscience.iop.org/article/10.1088/0031-9120/45/1/007).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(y_attach = 80, # m,\n", + " v_init = 0, # m / s,\n", + " g = 9.8, # m/s**2,\n", + " M = 75, # kg,\n", + " m_cord = 75, # kg\n", + " area = 1, # m**2,\n", + " rho = 1.2, # kg/m**3,\n", + " v_term = 60, # m / s,\n", + " L = 25, # m,\n", + " k = 40, # N / m\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", + "\n", + "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`.\n", + "\n", + "It also computes `mu` and the initial `State` object." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Makes a System object for the given params.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " M, m_cord = params.M, params.m_cord\n", + " g, rho, area = params.g, params.rho, params.area\n", + " v_init, v_term = params.v_init, params.v_term\n", + " \n", + " # back out the coefficient of drag\n", + " C_d = 2 * M * g / (rho * area * v_term**2)\n", + " \n", + " mu = m_cord / M\n", + " init = State(y=params.y_attach, v=v_init)\n", + " t_end = 8\n", + "\n", + " return System(params, C_d=C_d, mu=mu,\n", + " init=init, t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a `System`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system1 = make_system(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`drag_force` computes drag as a function of velocity:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(v, system):\n", + " \"\"\"Computes drag force in the opposite direction of `v`.\n", + " \n", + " v: velocity\n", + " \n", + " returns: drag force in N\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + "\n", + " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's drag force at 20 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "drag_force(20, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function computes the acceleration of the jumper due to tension in the cord.\n", + "\n", + "$a_{cord} = \\frac{\\mu v^2/2}{\\mu(L+y) + 2L}$ " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def cord_acc(y, v, system):\n", + " \"\"\"Computes the force of the bungee cord on the jumper:\n", + " \n", + " y: height of the jumper\n", + " v: velocity of the jumpter\n", + " \n", + " returns: acceleration in m/s\n", + " \"\"\"\n", + " L, mu = system.L, system.mu\n", + " \n", + " a_cord = -v**2 / 2 / (2*L/mu + (L+y))\n", + " return a_cord" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's acceleration due to tension in the cord if we're going 20 m/s after falling 20 m." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "y = -20\n", + "v = -20\n", + "cord_acc(y, v, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now here's the slope function:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func1(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing g, rho,\n", + " C_d, area, and mass\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " M, g = system.M, system.g\n", + " \n", + " a_drag = drag_force(v, system) / M\n", + " a_cord = cord_acc(y, v, system)\n", + " dvdt = -g + a_cord + a_drag\n", + " \n", + " return v, dvdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, let's test the slope function with the initial params." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func1(0, system1.init, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll need an event function to stop the simulation when we get to the end of the cord." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func1(t, state, system):\n", + " \"\"\"Run until y=-L.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing g, rho,\n", + " C_d, area, and mass\n", + " \n", + " returns: difference between y and y_attach-L\n", + " \"\"\"\n", + " y, v = state \n", + " return y - (system.y_attach - system.L)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "event_func1(0, system1.init, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "results1, details1 = run_solve_ivp(system1, slope_func1, \n", + " events=event_func1)\n", + "details1.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the plot of position as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results, **options):\n", + " results.y.plot(**options)\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `min` to find the lowest point:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "min(results1.y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As expected, Phase 1 ends when the jumper reaches an altitude of 55 m." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Phase 2\n", + "\n", + "Once the jumper has falled more than the length of the cord, acceleration due to energy transfer from the cord stops abruptly. As the cord stretches, it starts to exert a spring force. So let's simulate this second phase." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`spring_force` computes the force of the cord on the jumper:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def spring_force(y, system):\n", + " \"\"\"Computes the force of the bungee cord on the jumper:\n", + " \n", + " y: height of the jumper\n", + " \n", + " Uses these variables from system:\n", + " y_attach: height of the attachment point\n", + " L: resting length of the cord\n", + " k: spring constant of the cord\n", + " \n", + " returns: force in N\n", + " \"\"\"\n", + " L, k = system.L, system.k\n", + " \n", + " distance_fallen = system.y_attach - y\n", + " extension = distance_fallen - L\n", + " f_spring = k * extension\n", + " return f_spring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The spring force is 0 until the cord is fully extended. When it is extended 1 m, the spring force is 40 N. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "spring_force(55, system1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "spring_force(56, system1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The slope function for Phase 2 includes the spring force, and drops the acceleration due to the cord." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func2(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object containing g, rho,\n", + " C_d, area, and mass\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " y, v = state\n", + " M, g = system.M, system.g\n", + " \n", + " a_drag = drag_force(v, system) / M\n", + " a_spring = spring_force(y, system) / M\n", + " dvdt = -g + a_drag + a_spring\n", + " \n", + " return v, dvdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The initial state for Phase 2 is the final state from Phase 1." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "t_final = results1.index[-1]\n", + "t_final" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "state_final = results1.iloc[-1]\n", + "state_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And that gives me the starting conditions for Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "system2 = System(system1, t_0=t_final, init=state_final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run Phase 2, setting the direction of the event function so it doesn't stop the simulation immediately. " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "results2, details2 = run_solve_ivp(system2, slope_func2)\n", + "details2.message" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "t_final = results2.index[-1]\n", + "t_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the results on the same axes." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results1, label='Phase 1')\n", + "plot_position(results2, label='Phase 2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And get the lowest position from Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "min(results2.y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To see how big the effect of the cord is, I'll collect the previous code in a function." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "def run_two_phases(params):\n", + " system1 = make_system(params)\n", + " results1, details1 = run_solve_ivp(system1, slope_func1, \n", + " events=event_func1)\n", + " t_final = results1.index[-1]\n", + " state_final = results1.iloc[-1]\n", + " \n", + " system2 = system1.set(t_0=t_final, init=state_final)\n", + " results2, details2 = run_solve_ivp(system2, slope_func2)\n", + " return results1.append(results2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run both phases and get the results in a single `TimeFrame`." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_two_phases(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "plot_position(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "params_no_cord = params.set(m_cord=1)\n", + "results_no_cord = run_two_phases(params_no_cord);" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "plot_position(results, label='m_cord = 75 kg')\n", + "plot_position(results_no_cord, label='m_cord = 1 kg')" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "min(results_no_cord.y)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "diff = min(results.y) - min(results_no_cord.y)\n", + "diff" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The difference is about a meter, which could certainly be the difference between a successful bungee dunk and a bad day." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/duck.ipynb b/examples/duck.ipynb new file mode 100644 index 00000000..d141be53 --- /dev/null +++ b/examples/duck.ipynb @@ -0,0 +1,209 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Title" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Copyright 2018 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The duck problem\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "g = UNITS.g\n", + "cm = UNITS.cm" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "system = System (\n", + " density_duck = 0.3 * g/cm**3,\n", + " density_water = 1 * g/cm**3,\n", + " r = 5 * cm,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(d, system):\n", + " # in order to work with root_scale, we have\n", + " # to accept input that does not have units\n", + " d = d * cm\n", + " r = system.r\n", + " \n", + " volume_duck = 4 / 3 * pi * r**3\n", + " mass_duck = volume_duck * system.density_duck\n", + "\n", + " volume_water = pi / 3 * (3 * r * d**2 - d**3)\n", + " mass_water = volume_water * system.density_water\n", + "\n", + " # and return an error that does not have units\n", + " error = mass_duck - mass_water\n", + " return magnitude(error)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "error_func(3, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "error_func(4, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "res = root_scalar(error_func, [3., 4.], system)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "res.root * cm" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/filter.ipynb b/examples/filter.ipynb new file mode 100644 index 00000000..b625bac2 --- /dev/null +++ b/examples/filter.ipynb @@ -0,0 +1,929 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Low-Pass Filter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following circuit diagram (from [Wikipedia](https://en.wikipedia.org/wiki/File:RC_Divider.svg)) shows a low-pass filter built with one resistor and one capacitor. \n", + "\n", + "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/RC_Divider.svg)\n", + "\n", + "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", + "\n", + "A filter is \"low-pass\" if it allows low-frequency signals to pass from $V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of high-frequency signals.\n", + "\n", + "By applying the laws of circuit analysis, we can derive a differential equation that describes the behavior of this system. By solving the differential equation, we can predict the effect of this circuit on any input signal.\n", + "\n", + "Suppose we are given $V_{in}$ and $V_{out}$ at a particular instant in time. By Ohm's law, which is a simple model of the behavior of resistors, the instantaneous current through the resistor is:\n", + "\n", + "$ I_R = (V_{in} - V_{out}) / R $\n", + "\n", + "where $R$ is resistance in ohms.\n", + "\n", + "Assuming that no current flows through the output of the circuit, Kirchhoff's current law implies that the current through the capacitor is:\n", + "\n", + "$ I_C = I_R $\n", + "\n", + "According to a simple model of the behavior of capacitors, current through the capacitor causes a change in the voltage across the capacitor:\n", + "\n", + "$ I_C = C \\frac{d V_{out}}{dt} $\n", + "\n", + "where $C$ is capacitance in farads (F).\n", + "\n", + "Combining these equations yields a differential equation for $V_{out}$:\n", + "\n", + "$ \\frac{d }{dt} V_{out} = \\frac{V_{in} - V_{out}}{R C} $\n", + "\n", + "Follow the instructions below to simulate the low-pass filter for input signals like this:\n", + "\n", + "$ V_{in}(t) = A \\cos (2 \\pi f t) $\n", + "\n", + "where $A$ is the amplitude of the input signal, say 5 V, and $f$ is the frequency of the signal in Hz." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Params and System objects\n", + "\n", + "Here's a `Params` object to contain the quantities we need. I've chosen values for `R1` and `C1` that might be typical for a circuit that works with audio signal." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(\n", + " R1 = 1e6, # * ohm\n", + " C1 = 1e-9, # * farad\n", + " A = 5, # * volt\n", + " f = 1000, # * Hz\n", + ")\n", + "params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", + "\n", + "* `omega` is the frequency of the input signal in radians/second.\n", + "\n", + "* `tau` is the time constant for this circuit, which is the time it takes to get from an initial startup phase to \n", + "\n", + "* `cutoff` is the cutoff frequency for this circuit (in Hz), which marks the transition from low frequency signals, which pass through the filter unchanged, to high frequency signals, which are attenuated.\n", + "\n", + "* `t_end` is chosen so we run the simulation for 4 cycles of the input signal." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import pi\n", + "\n", + "def make_system(params):\n", + " \"\"\"Makes a System object for the given conditions.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " f, R1, C1 = params.f, params.R1, params.C1\n", + " \n", + " init = State(V_out = 0)\n", + " omega = 2 * pi * f\n", + " tau = R1 * C1\n", + " cutoff = 1 / R1 / C1 / 2 / pi\n", + " t_end = 4 / f\n", + " \n", + " return System(params, \n", + " init=init, \n", + " t_end=t_end, num=401,\n", + " omega=omega, tau=tau, \n", + " cutoff=cutoff)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a `System`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)\n", + "system" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The system variable `num` controls how many time steps we get from `run_solve_ivp`. The default is 101; in this case we increase it to 401 because the methods we'll use to analyze the results require high resolution in time." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a slope function that takes as an input a `State` object that contains `V_out`, and returns the derivative of `V_out`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation. I suggest using `t_eval=ts` to make sure we have enough data points to plot and analyze the results. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func)\n", + "details.message" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a function you can use to plot `V_out` as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(results):\n", + " V_out = results.V_out.copy()\n", + " t_end = results.index[-1]\n", + " \n", + " if t_end < 0.1:\n", + " V_out.index *= 1000\n", + " xlabel = 'Time (ms)'\n", + " else:\n", + " V_out = results.V_out\n", + " xlabel = 'Time (s)'\n", + " \n", + " V_out.plot(label='_nolegend')\n", + " decorate(xlabel=xlabel,\n", + " ylabel='$V_{out}$ (volt)')\n", + " \n", + "plot_results(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If things have gone according to plan, the amplitude of the output signal should be about 0.8 V.\n", + "\n", + "Also, you might notice that it takes a few cycles for the signal to get to the full amplitude. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sweeping frequency\n", + "\n", + "Here's what `V_out` looks like for a range of frequencies:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import subplot\n", + "\n", + "fs = [1, 10, 100, 1000, 10000, 100000]\n", + "\n", + "for i, f in enumerate(fs):\n", + " system = make_system(params.set(f=f))\n", + " results, details = run_solve_ivp(system, slope_func)\n", + " subplot(3, 2, i+1)\n", + " plot_results(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At low frequencies, notice that there is an initial \"transient\" before the output gets to a steady-state sinusoidal output. The duration of this transient is a small multiple of the time constant, `tau`, which is 1 ms." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimating the output ratio\n", + "\n", + "Let's compare the amplitudes of the input and output signals. Below the cutoff frequency, we expect them to be about the same. Above the cutoff, we expect the amplitude of the output signal to be smaller.\n", + "\n", + "We'll start with a signal at the cutoff frequency, `f=1000` Hz." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params.set(f=1000))\n", + "results, details = run_solve_ivp(system, slope_func)\n", + "V_out = results.V_out\n", + "plot_results(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function computes `V_in` as a `TimeSeries`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_vin(results, system):\n", + " \"\"\"Computes V_in as a TimeSeries.\n", + " \n", + " results: TimeFrame with simulation results\n", + " system: System object with A and omega\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " A, omega = system.A, system.omega\n", + " \n", + " ts = results.index\n", + " V_in = A * np.cos(omega * ts)\n", + " return TimeSeries(V_in, results.index, name='V_in')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the input and output look like. Notice that the output is not just smaller; it is also \"out of phase\"; that is, the peaks of the output are shifted to the right, relative to the peaks of the input." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "V_in = compute_vin(results, system)\n", + "\n", + "V_out.plot()\n", + "V_in.plot()\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='V (volt)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function estimates the amplitude of a signal by computing half the distance between the min and max." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def estimate_A(series):\n", + " \"\"\"Estimate amplitude.\n", + " \n", + " series: TimeSeries\n", + " \n", + " returns: amplitude in volts\n", + " \"\"\"\n", + " return (series.max() - series.min()) / 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The amplitude of `V_in` should be near 5 (but not exact because we evaluated it at a finite number of points)." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "A_in = estimate_A(V_in)\n", + "A_in" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The amplitude of `V_out` should be lower." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "A_out = estimate_A(V_out)\n", + "A_out" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the ratio between them." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "ratio = A_out / A_in\n", + "ratio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Encapsulate the code we have so far in a function that takes two `TimeSeries` objects and returns the ratio between their amplitudes." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And test your function." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "estimate_ratio(V_out, V_in)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimating phase offset\n", + "\n", + "The delay between the peak of the input and the peak of the output is call a \"phase shift\" or \"phase offset\", usually measured in fractions of a cycle, degrees, or radians.\n", + "\n", + "To estimate the phase offset between two signals, we can use cross-correlation. Here's what the cross-correlation looks like between `V_out` and `V_in`:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "corr = np.correlate(V_out, V_in, mode='same')\n", + "corr_series = make_series(V_in.index, corr)\n", + "corr_series.plot(color='C4')\n", + "decorate(xlabel='Lag (s)',\n", + " ylabel='Correlation')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The location of the peak in the cross correlation is the estimated shift between the two signals, in seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "peak_time = corr_series.idxmax()\n", + "peak_time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can express the phase offset as a multiple of the period of the input signal:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "period = 1 / system.f\n", + "period" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "peak_time / period" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We don't care about whole period offsets, only the fractional part, which we can get using `modf`:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "frac, whole = np.modf(peak_time / period)\n", + "frac" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we can convert from a fraction of a cycle to degrees:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "frac * 360" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Encapsulate this code in a function that takes two `TimeSeries` objects and a `System` object, and returns the phase offset in degrees.\n", + "\n", + "Note: by convention, if the output is shifted to the right, the phase offset is negative." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "estimate_offset(V_out, V_in, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sweeping frequency again\n", + "\n", + "**Exercise:** Write a function that takes as parameters an array of input frequencies and a `Params` object.\n", + "\n", + "For each input frequency it should run a simulation and use the results to estimate the output ratio (dimensionless) and phase offset (in degrees).\n", + "\n", + "It should return two `SweepSeries` objects, one for the ratios and one for the offsets." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run your function with these frequencies." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "fs = 10 ** linspace(0, 4, 9)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "ratios, offsets = sweep_frequency(fs, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot output ratios like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "ratios.plot(color='C2', label='output ratio')\n", + "decorate(xlabel='Frequency (Hz)',\n", + " ylabel='$V_{out} / V_{in}$')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But it is useful and conventional to plot ratios on a log-log scale. The vertical gray line shows the cutoff frequency." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_ratios(ratios, system):\n", + " \"\"\"Plot output ratios.\n", + " \"\"\"\n", + " # axvline can't handle a Quantity with units\n", + " cutoff = magnitude(system.cutoff)\n", + " plt.axvline(cutoff, color='gray', alpha=0.4)\n", + " \n", + " ratios.plot(color='C2', label='output ratio')\n", + " decorate(xlabel='Frequency (Hz)',\n", + " ylabel='$V_{out} / V_{in}$',\n", + " xscale='log', yscale='log')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "plot_ratios(ratios, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This plot shows the cutoff behavior more clearly. Below the cutoff, the output ratio is close to 1. Above the cutoff, it drops off linearly, on a log scale, which indicates that output ratios for high frequencies are practically 0.\n", + "\n", + "Here's the plot for phase offset, on a log-x scale:" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_offsets(offsets, system):\n", + " \"\"\"Plot phase offsets.\n", + " \"\"\"\n", + " # axvline can't handle a Quantity with units\n", + " cutoff = magnitude(system.cutoff)\n", + " plt.axvline(cutoff, color='gray', alpha=0.4)\n", + " \n", + " offsets.plot(color='C9', label='phase offset')\n", + " decorate(xlabel='Frequency (Hz)',\n", + " ylabel='Phase offset (degree)',\n", + " xscale='log')" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "plot_offsets(offsets, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For low frequencies, the phase offset is near 0. For high frequencies, it approaches 90 degrees." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis\n", + "\n", + "By analysis we can show that the output ratio for this signal is\n", + "\n", + "$A = \\frac{1}{\\sqrt{1 + (R C \\omega)^2}}$ \n", + "\n", + "where $\\omega = 2 \\pi f$, and the phase offset is\n", + "\n", + "$ \\phi = \\arctan (- R C \\omega)$ \n", + "\n", + "**Exercise:** Write functions that take an array of input frequencies and returns $A(f)$ and $\\phi(f)$ as `SweepSeries` objects. Plot these objects and compare them with the results from the previous section.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function:" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "A = output_ratios(fs, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "phi = phase_offsets(fs, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the theoretical results along with the simulation results and see if they agree." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "A.plot(style=':', color='gray', label='analysis')\n", + "plot_ratios(ratios, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "phi.plot(style=':', color='gray', label='analysis')\n", + "plot_offsets(offsets, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the phase offsets, there are differences between the theoretical results and our estimates, but that is probably because it is not easy to estimate phase offsets precisely from numerical results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Consider modifying this notebook to model a [first order high-pass filter](https://en.wikipedia.org/wiki/High-pass_filter#First-order_continuous-time_implementation), a [two-stage second-order low-pass filter](https://www.electronics-tutorials.ws/filter/filter_2.html), or a [passive band-pass filter](https://www.electronics-tutorials.ws/filter/filter_4.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/glucose.ipynb b/examples/glucose.ipynb new file mode 100644 index 00000000..bde7bb82 --- /dev/null +++ b/examples/glucose.ipynb @@ -0,0 +1,623 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Glucose Minimal Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous chapter we implemented the glucose minimal model using given parameters, but I didn't say where those parameters came from.\n", + "This notebook solves the mystery.\n", + "\n", + "We'll use a SciPy function called `leastsq`, which stands for \"least squares\"; that is, it finds the parameters that minimize the sum of squared differences between the results of the model and the data.\n", + "\n", + "You can think of `leastsq` as optional material. We won't use it in the book itself, but it appears in a few of the case studies.\n", + "\n", + "You can read more about `leastsq` in [the SciPy documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html). It uses the Levenberg-Marquart algorithm, which you can read about [on Wikipedia](https://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells download and read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/data/glucose_insulin.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('glucose_insulin.csv', index_col='time');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll use `make_system` and `slope_func` as defined in Chapter 18." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from chap18 import make_system\n", + "from chap18 import slope_func" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computing errors\n", + "\n", + "In this context, the \"errors\" are the differences between the results from the model and the data.\n", + "\n", + "To compute the errors, I'll start again with the parameters we used in Chapter 18." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "G0 = 270\n", + "k1 = 0.02\n", + "k2 = 0.02\n", + "k3 = 1.5e-05" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "params = G0, k1, k2, k3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system` takes the parameters and actual data and returns a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we run the ODE solver." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func, \n", + " t_eval=data.index)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because we specify `t_eval=data.index`, the results are evaluated at the some time stamps as the data." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the results like this." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "data.glucose.plot(style='o', alpha=0.5, label='data')\n", + "results.G.plot(style='-', color='C0', label='model')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "During the first three time steps, the model does not fit the data. That's because it takes some time for the injected glucose to disperse.\n", + "\n", + "We can compute the errors like this." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "errors = results.G - data.glucose\n", + "errors.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first few errors are substantially larger than the rest.\n", + "\n", + "In the next section, we'll use `leastsq` to search for the parameters that minimize the sum of the squared errors." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "To use `leastsq`, we need an \"error function\" that takes a sequence of parameters and returns an array of errors.\n", + "\n", + "Here's a function that does what we need." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(params, data):\n", + " \"\"\"Computes an array of errors to be minimized.\n", + " \n", + " params: sequence of parameters\n", + " data: DataFrame of values to be matched\n", + " \n", + " returns: array of errors\n", + " \"\"\"\n", + " print(params)\n", + " \n", + " # make a System with the given parameters\n", + " system = make_system(params, data)\n", + " \n", + " # solve the ODE\n", + " results, details = run_solve_ivp(system, slope_func, \n", + " t_eval=data.index)\n", + " \n", + " # compute the difference between the model\n", + " # results and actual data\n", + " errors = results.G - data.glucose\n", + " return errors.iloc[3:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`error_func` uses the given parameters to make a `System` object, runs the simulation, and returns the errors.\n", + "\n", + "But notice that it does not return all of the errors; rather, it uses `iloc` to select only the elements with index 3 or more.\n", + "In other words, it omits the elements with index 0, 1, and 2.\n", + "Note: You can read more about this use of `iloc` [in the Pandas documentation](https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer).\n", + "\n", + "Since we don't expect the model to fit the data in this regime, we'll leave it out.\n", + "\n", + "We can call `error_func` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "error_func(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we're ready to call `leastsq`. As arguments, we pass `error_func`, the parameters where we want to start the search, and the data, which will be passed as an argument to `error_func`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "best_params, fit_details = leastsq(error_func, params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each time `error_func` is called, it prints the parameters, so we can get a sense of how `leastsq` works.\n", + "\n", + "`leastsq` has two return values.\n", + "The is an array with the best parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "best_params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The second is an object with information about the results, including a success flag and a message." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "fit_details.success" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "fit_details.mesg" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have `best_params`, we can use it to make a `System` object and run it." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "system2 = make_system(best_params, data)\n", + "results2, details = run_solve_ivp(system2, slope_func, \n", + " t_eval=data.index)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results, along with the data." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "data.glucose.plot(style='o', alpha=0.5, label='data')\n", + "results.G.plot(style='-', color='C0', label='model')\n", + "\n", + "decorate(xlabel='Time (min)',\n", + " ylabel='Concentration (mg/dL)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can compute the errors like this." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "errors2 = results2.G - data.glucose\n", + "errors2.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the sum of the squared errors like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import sum\n", + "\n", + "sum(errors2.iloc[3:]**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If things have gone according to plan, the sum of squared errors should be smaller now, compared to the parameters we started with." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "sum(errors.iloc[3:]**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpreting parameters\n", + "\n", + "So we found the parameters that best match the data. You might wonder why this is useful.\n", + "\n", + "The parameters themselves don't mean very much, but we can use them to compute two quantities we care about:\n", + "\n", + "- \"Glucose effectiveness\", $E$, which is the tendency of elevated\n", + " glucose to cause depletion of glucose.\n", + "\n", + "- \"Insulin sensitivity\", $S$, which is the ability of elevated blood\n", + " insulin to enhance glucose effectiveness.\n", + "\n", + "Glucose effectiveness is defined as the change in $dG/dt$ as we vary\n", + "$G$: \n", + "\n", + "$$E \\equiv - \\frac{\\delta \\dot{G}}{\\delta G}$$ \n", + "\n", + "where $\\dot{G}$ is shorthand for $dG/dt$. Taking the derivative of $dG/dt$ with respect to $G$, we get \n", + "\n", + "$$E = k_1 + X$$ \n", + "\n", + "The **glucose effectiveness index**, $S_G$, is the value of $E$ when blood insulin is near its basal level, $I_b$.\n", + "In that case, $X$ approaches 0 and $E$ approaches $k_1$. So we can use\n", + "the best-fit value of $k_1$ as an estimate of $S_G$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Insulin sensitivity is defined as the change in $E$ as we vary $I$:\n", + "\n", + "$$S \\equiv - \\frac{\\delta E}{\\delta I}$$ \n", + "\n", + "The **insulin sensitivity index**, $S_I$, is the value of $S$ when $E$ and $I$ are at steady state: \n", + "\n", + "$$S_I \\equiv \\frac{\\delta E_{SS}}{\\delta I_{SS}}$$ \n", + "\n", + "$E$ and $I$ are at steady state when $dG/dt$ and $dX/dt$ are 0, but we don't actually have to solve those equations to find $S_I$. \n", + "\n", + "If we set $dX/dt = 0$ and solve for $X$, we find the relation:\n", + "\n", + "$$X_{SS} = \\frac{k_3}{k_2} I_{SS}$$ \n", + "\n", + "And since $E = k_1 + X$, we have:\n", + "\n", + "$$S_I = \\frac{\\delta E_{SS}}{\\delta I_{SS}} = \\frac{\\delta X_{SS}}{\\delta I_{SS}}$$\n", + "\n", + "Taking the derivative of $X_{SS}$ with respect to $I_{SS}$, we have:\n", + "\n", + "$$S_I = k_3 / k_2$$ \n", + "\n", + "So if we find parameters that make the model fit the data, we can use $k_3 / k_2$ as an estimate of $S_I$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the parameters we found, here are the estimated values of $S_G$ and $S_I$:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "G0, k1, k2, k3 = best_params\n", + "indices = SimpleNamespace(S_G=k1, S_I=k3/k2)\n", + "show(indices)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "According to [Boston et al](https://www.researchgate.net/publication/8931437_MINMOD_Millennium_A_Computer_Program_to_Calculate_Glucose_Effectiveness_and_Insulin_Sensitivity_From_the_Frequently_Sampled_Intravenous_Glucose_Tolerance_Test), normal ranges for these values are..." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "S_G_interval = 1.2e-3, 4.5e-2\n", + "S_G_interval" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "S_I_interval = 5.0e-5, 2.2e-3\n", + "S_I_interval" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The estimated quantities are within the normal intervals." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** How sensitive are the results to the starting guess for the parameters? If you try different values for the starting guess, do we get the same values for the best parameters?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/header.ipynb b/examples/header.ipynb new file mode 100644 index 00000000..6b6acc86 --- /dev/null +++ b/examples/header.ipynb @@ -0,0 +1,93 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Title" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/hiv_model_soln.ipynb b/examples/hiv_model_soln.ipynb new file mode 100644 index 00000000..d4dd128e --- /dev/null +++ b/examples/hiv_model_soln.ipynb @@ -0,0 +1,311 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling HIV infection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "During the initial phase of HIV infection, the concentration of the virus in the bloodstream typically increases quickly and then decreases.\n", + "The most obvious explanation for the decline is an immune response that destroys the virus or controls its replication.\n", + "However, at least in some patients, the decline occurs even without any detectable immune response.\n", + "\n", + "In 1996 Andrew Phillips proposed another explanation for the decline (\"Reduction of HIV Concentration During Acute Infection: Independence from a Specific Immune Response\", available from ).\n", + "\n", + "Phillips presents a system of differential equations that models the concentrations of the HIV virus and the CD4 cells it infects.\n", + "The model does not include an immune response; nevertheless, it demonstrates behavior that is qualitatively similar to what is seen in patients during the first few weeks after infection.\n", + "\n", + "His conclusion is that the observed decline in the concentration of HIV might not be caused by an immune response; it could be due to the dynamic interaction between HIV and the cells it infects.\n", + "\n", + "In this notebook, we'll implement Phillips's model and consider whether it does the work it is meant to do." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The Model\n", + "\n", + "The model has four state variables, `R`, `L`, `E`, and `V`. Read the paper to understand what they represent.\n", + "\n", + "Here are the initial conditional we can glean from the paper. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(R=200, L=0, E=0, V=4e-7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The behavior of the system is controlled by 9 parameters.\n", + "That might seem like a lot, but they are not entirely free parameters; their values are constrained by measurements and background knowledge (although some are more constrained than others).\n", + "Here are the values from Table 1.\n", + "\n", + "Note: the parameter $\\rho$ (the Greek letter \"rho\") in the table appears as $p$ in the equations. Since it represents a proportion, we'll use $p$." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "gamma = 1.36\n", + "mu = 1.36e-3\n", + "tau = 0.2\n", + "beta = 0.00027\n", + "p = 0.1\n", + "alpha = 3.6e-2\n", + "sigma = 2\n", + "delta = 0.33\n", + "pi = 100" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a `System` object with the initial conditions and the duration of the simulation (120 days).\n", + "Normally we would store the parameters in the `System` object, but the code will be less cluttered if we leave them as global variables." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init,\n", + " t_end=120,\n", + " num=481)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Use the equations in the paper to write a slope function that takes a `State` object with the current values of `R`, `L`, `E`, and `V`, and returns their derivatives in the corresponding order." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your slope function with the initial conditions.\n", + "The results should be approximately\n", + "\n", + "```\n", + "-2.16e-08, 2.16e-09, 1.944e-08, -8e-07\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Now use `run_solve_ivp` to simulate the system of equations." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next few cells plot the results on the same scale as the figures in the paper.\n", + "\n", + "**Exericise:** Compare your results to the results in the paper.\n", + "Are they consistent?" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results.V.plot(label='V')\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Free virions V',\n", + " yscale='log',\n", + " ylim=[0.1, 1e4])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "results.R.plot(label='R', color='C1')\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Number of cells',\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "results.L.plot(color='C2', label='L')\n", + "results.E.plot(color='C4', label='E')\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Number of cells',\n", + " yscale='log',\n", + " ylim=[0.1, 100])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** What kind of work is this model doing? Do you find the results convincing? What are the strengths of the model? What are the weaknesses?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Read [this response to Phillips's article](https://science.sciencemag.org/content/sci/272/5270/1960.full.pdf) and Phillips's response to the response. What do you think of the arguments on both sides. Do you think the model Phillips proposed is sufficient to make his argument, or do you think it leaves out essential features of the real world?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/insulin.ipynb b/examples/insulin.ipynb new file mode 100644 index 00000000..374b7684 --- /dev/null +++ b/examples/insulin.ipynb @@ -0,0 +1,425 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Insulin Minimal Model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells download and read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/data/glucose_insulin.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('glucose_insulin.csv', index_col='time');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Chapter 17 I present the glucose minimal model; in Chapter 18 we implemented it using `run_simulation` and `run_solve_ivp`.\n", + "In this case study, we'll implement the other half of the Minimal Model, which describes the concentration of insulin.\n", + "\n", + "In the insulin minimal model, the concentration of insulin, $I$, is governed by this differential equation:\n", + "\n", + "$ \\frac{dI}{dt} = -k I(t) + \\gamma (G(t) - G_T) t $\n", + "\n", + "where $G(t)$ is the concentration of glucose at time $t$, and\n", + "$k$, $\\gamma$, and $G_T$ are positive-valued parameters:\n", + "\n", + "* $k$ controls the rate of insulin disappearance.\n", + "\n", + "* $G_T$ determines the glucose threshold: when $G(t)$ exceeds this threshold, it causes insulin to appear; when $G(t)$ is below this threshold, it causes insulin to disappear.\n", + "\n", + "* $\\gamma$ controls how quickly insulin appears or disappears when the concentration of glucose is elevated or depressed.\n", + " \n", + "Notice that this equation depends on time, $t$, since the initial injection. It has the effect of increasing glucose sensitivity over time. If you are familiar with control systems, the effect of this term is similar to the integral term in a [PID controller](https://en.wikipedia.org/wiki/PID_controller).\n", + "\n", + "In addition to the three parameters in the equation, we will also consider the initial concentration of insulin, $I_0$, to be a free parameter; that is, we will choose the value of $I_0$, and the other parameters, that best fit the data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a version of `make_system` that takes the parameters of the model (`I0`, `k`, `gamma`, and `G_T`) as parameters, along with a `DataFrame` containing the measurements, and returns a `System` object suitable for use with `run_solve_ivp`.\n", + "\n", + "Use it to make a `System` object with the following parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "I0 = 360 \n", + "k = 0.25\n", + "gamma = 0.004\n", + "G_T = 80\n", + "\n", + "params = I0, k, gamma, G_T" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a slope function that takes a time stamp, a `State` object, and a `System` object, and returns the derivative of `I` with respect to time. Test your function with the initial conditions from `system`." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Run `run_solve_ivp` with your `System` object and slope function, and plot the results, along with the measured insulin levels. Use the keyword argument `t_eval=data.index` so the results are evaluated as the same time stamps as the data." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write an error function that takes a sequence of parameters as an argument, along with the `DataFrame` containing the measurements. It should make a `System` object with the given parameters, call `run_solve_ivp`, and compute the difference between the results of the simulation and the measured values. Test your error function by calling it with the parameters from the previous exercise.\n", + "\n", + "Hint: As we did with the glucose model, you might want to drop the first 2-3 elements from the sequence of errors." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Use `leastsq` to find the parameters that best fit the data. Make a `System` object with those parameters, run it, and plot the results along with the measurements." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Using the best parameters, estimate the sensitivity to glucose of the first and second phase pancreatic responsivity:\n", + "\n", + "$ \\phi_1 = \\frac{I_{max} - I_b}{k (G_0 - G_b)} $\n", + "\n", + "$ \\phi_2 = \\gamma \\times 10^4 $\n", + "\n", + "For $G_0$, use the best estimate from the glucose model, 272 mg/dL. For $G_b$ and $I_b$, use the initial measurements from the data.\n", + "For $I_{max}$ is the maximum measurement of insulin concentration." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "According to [Pacini and Bergman](https://www.researchgate.net/publication/13707725_Insulin_sensitivity_and_glucose_effectiveness_Minimal_model_analysis_of_regular_and_insulin-modified_FSIGT), here are the normal ranges for these quantities." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "phi_1_interval = 2, 4\n", + "phi_1_interval" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [], + "source": [ + "phi_2_interval = 20, 35\n", + "phi_2_interval" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Do your estimates fall in these ranges?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/kitten.ipynb b/examples/kitten.ipynb new file mode 100644 index 00000000..e0c11988 --- /dev/null +++ b/examples/kitten.ipynb @@ -0,0 +1,519 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Kittens" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you have used the Internet, you have probably seen videos of kittens unrolling toilet paper.\n", + "And you might have wondered how long it would take a standard kitten to unroll 47 m of paper, the length of a standard roll.\n", + "\n", + "The interactions of the kitten and the paper rolls are complex. To keep things simple, let's assume that the kitten pulls down on the free end of the roll with constant force. And let's neglect the friction between the roll and the axle.\n", + "\n", + "This diagram shows the paper roll with the force applied by the kitten, $F$, the lever arm of the force around the axis of rotation, $r$, and the resulting torque, $\\tau$.\n", + "\n", + "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/kitten.png)\n", + "\n", + "Assuming that the force applied by the kitten is 0.002 N, how long would it take to unroll a standard roll of toilet paper?\n", + "\n", + "We'll use the same parameters as in Chapter 24:" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [], + "source": [ + "Rmin = 0.02 # m\n", + "Rmax = 0.055 # m\n", + "Mcore = 15e-3 # kg\n", + "Mroll = 215e-3 # kg\n", + "L = 47 # m\n", + "tension = 0.002 # N" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`Rmin` and `Rmax` are the minimum and maximum radius of the roll, respectively.\n", + "`Mcore` is the weight of the core (the cardboard tube at the center) and `Mroll` is the total weight of the paper.\n", + "`L` is the unrolled length of the paper.\n", + "`tension` is the force the kitten applies by pulling on the loose end of the roll (I chose this value because it yields reasonable results)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Chapter 24 we defined $k$ to be the constant that relates a change in the radius of the roll to a change in the rotation of the roll:\n", + "\n", + "$$dr = k~d\\theta$$ \n", + "\n", + "And we derived the equation for $k$ in terms of $R_{min}$, $R_{max}$, and $L$. \n", + "\n", + "$$k = \\frac{1}{2L} (R_{max}^2 - R_{min}^2)$$\n", + "\n", + "So we can compute `k` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [], + "source": [ + "k = (Rmax**2 - Rmin**2) / 2 / L \n", + "k " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Moment of Inertia\n", + "\n", + "To compute angular acceleration, we'll need the moment of inertia for the roll.\n", + "\n", + "At you can find moments of inertia for\n", + "simple geometric shapes. I'll model the core as a \"thin cylindrical shell\", and the paper roll as a \"thick-walled cylindrical tube with open ends\".\n", + "\n", + "The moment of inertia for a thin shell is just $m r^2$, where $m$ is the mass and $r$ is the radius of the shell.\n", + "\n", + "For a thick-walled tube the moment of inertia is\n", + "\n", + "$$I = \\frac{\\pi \\rho h}{2} (r_2^4 - r_1^4)$$ \n", + "\n", + "where $\\rho$ is the density of the material, $h$ is the height of the tube (if we think of the roll oriented vertically), $r_2$ is the outer diameter, and $r_1$ is the inner diameter.\n", + "\n", + "Since the outer diameter changes as the kitten unrolls the paper, we\n", + "have to compute the moment of inertia, at each point in time, as a\n", + "function of the current radius, `r`, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": {}, + "outputs": [], + "source": [ + "def moment_of_inertia(r, system):\n", + " \"\"\"Moment of inertia for a roll of toilet paper.\n", + " \n", + " r: current radius of roll in meters\n", + " system: System object\n", + " \n", + " returns: moment of inertia in kg m**2\n", + " \"\"\" \n", + " Icore = Mcore * Rmin**2 \n", + " Iroll = np.pi * rho_h / 2 * (r**4 - Rmin**4)\n", + " return Icore + Iroll" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`Icore` is the moment of inertia of the core; `Iroll` is the moment of inertia of the paper.\n", + "\n", + "`rho_h` is the density of the paper in terms of mass per unit of area. \n", + "To compute `rho_h`, we compute the area of the complete roll like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [], + "source": [ + "area = np.pi * (Rmax**2 - Rmin**2)\n", + "area" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And divide the mass of the roll by that area." + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": {}, + "outputs": [], + "source": [ + "rho_h = Mroll / area\n", + "rho_h" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As an example, here's the moment of inertia for the complete roll." + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [], + "source": [ + "moment_of_inertia(Rmax, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As `r` decreases, so does `I`. Here's the moment of inertia when the roll is empty." + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [], + "source": [ + "moment_of_inertia(Rmin, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The way $I$ changes over time might be more of a problem than I have made it seem. In the same way that $F = m a$ only applies when $m$ is constant, $\\tau = I \\alpha$ only applies when $I$ is constant. When $I$ varies, we usually have to use a more general version of Newton's law. However, I believe that in this example, mass and moment of inertia vary together in a way that makes the simple approach work out.\n", + "\n", + "A friend of mine who is a physicist is not convinced; nevertheless, let's proceed on the assumption that I am right." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "The state variables we'll use are\n", + "\n", + "* `theta`, the total rotation of the roll in radians, \n", + "\n", + "* `omega`, angular velocity in rad / s,\n", + "\n", + "* `r`, the radius of the roll, and\n", + "\n", + "* `y`, the length of the unrolled paper.\n", + "\n", + "Here's a `State` object with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(theta=0, omega=0, y=0, r=Rmax)\n", + "init" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's a `System` object with the starting conditions and `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, t_end=120)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can take it from here." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:**\n", + "\n", + "Write a slope function we can use to simulate this system. Test it with the initial conditions. The results should be approximately\n", + "\n", + "```\n", + "0.0, 0.294, 0.0, 0.0\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write an event function that stops the simulation when `y` equals `L`, that is, when the entire roll is unrolled. Test your function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And check the results." + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final value of `theta` should be about 200 rotations, the same as in Chapter 24.\n", + "\n", + "The final value of `omega` should be about 63 rad/s, which is about 10 revolutions per second. That's pretty fast, but it might be plausible.\n", + "\n", + "The final value of `y` should be `L`, which is 47 m.\n", + "\n", + "The final value of `r` should be `Rmin`, which is 0.02 m.\n", + "\n", + "And the total unrolling time should be about 76 seconds, which seems plausible." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells plot the results.\n", + "\n", + "`theta` increases slowly at first, then accelerates." + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [], + "source": [ + "results.theta.plot(color='C0', label='theta')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Angular velocity, `omega`, increases almost linearly at first, as constant force yields almost constant torque. Then, as the radius decreases, the lever arm decreases, yielding lower torque, but moment of inertia decreases even more, yielding higher angular acceleration." + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": {}, + "outputs": [], + "source": [ + "results.omega.plot(color='C2', label='omega')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`y` increases slowly and then accelerates." + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": {}, + "outputs": [], + "source": [ + "results.y.plot(color='C1', label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`r` decreases slowly, then accelerates." + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": {}, + "outputs": [], + "source": [ + "results.r.plot(color='C4', label='r')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Radius (m)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/oem.ipynb b/examples/oem.ipynb new file mode 100644 index 00000000..d9edd314 --- /dev/null +++ b/examples/oem.ipynb @@ -0,0 +1,1106 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Title" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Modeling and Simulation in Python\n", + "\n", + "Case study.\n", + "\n", + "Copyright 2017 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# Configure Jupyter to display the assigned value after an assignment\n", + "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Electric car" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Olin Electric Motorsports](https://www.olinelectricmotorsports.com/) is a club at Olin College that designs and builds electric cars, and participates in the [Formula SAE Electric](https://www.sae.org/attend/student-events/formula-sae-electric) competition.\n", + "\n", + "The goal of this case study is to use simulation to guide the design of a car intended to accelerate from standing to 100 kph as quickly as possible. The [world record for this event](https://www.youtube.com/watch?annotation_id=annotation_2297602723&feature=iv&src_vid=I-NCH8ct24U&v=n2XiCYA3C9s), using a car that meets the competition requirements, is 1.513 seconds.\n", + "\n", + "We'll start with a simple model that takes into account the characteristics of the motor and vehicle:\n", + "\n", + "* The motor is an [Emrax 228 high voltage axial flux synchronous permanent magnet motor](http://emrax.com/products/emrax-228/); according to the [data sheet](http://emrax.com/wp-content/uploads/2017/01/emrax_228_technical_data_4.5.pdf), its maximum torque is 240 Nm, at 0 rpm. But maximum torque decreases with motor speed; at 5000 rpm, maximum torque is 216 Nm.\n", + "\n", + "* The motor is connected to the drive axle with a chain drive with speed ratio 13:60 or 1:4.6; that is, the axle rotates once for each 4.6 rotations of the motor.\n", + "\n", + "* The radius of the tires is 0.26 meters.\n", + "\n", + "* The weight of the vehicle, including driver, is 300 kg.\n", + "\n", + "To start, we will assume no slipping between the tires and the road surface, no air resistance, and no rolling resistance. Then we will relax these assumptions one at a time.\n", + "\n", + "* First we'll add drag, assuming that the frontal area of the vehicle is 0.6 square meters, with coefficient of drag 0.6.\n", + "\n", + "* Next we'll add rolling resistance, assuming a coefficient of 0.2.\n", + "\n", + "* Finally we'll compute the peak acceleration to see if the \"no slip\" assumption is credible.\n", + "\n", + "We'll use this model to estimate the potential benefit of possible design improvements, including decreasing drag and rolling resistance, or increasing the speed ratio.\n", + "\n", + "I'll start by loading the units we need." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "radian = UNITS.radian\n", + "m = UNITS.meter\n", + "s = UNITS.second\n", + "minute = UNITS.minute\n", + "hour = UNITS.hour\n", + "km = UNITS.kilometer\n", + "kg = UNITS.kilogram\n", + "N = UNITS.newton\n", + "rpm = UNITS.rpm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And store the parameters in a `Params` object." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(r_wheel=0.26 * m,\n", + " speed_ratio=13/60,\n", + " C_rr=0.2,\n", + " C_d=0.5,\n", + " area=0.6*m**2,\n", + " rho=1.2*kg/m**3,\n", + " mass=300*kg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`make_system` creates the initial state, `init`, and constructs an `interp1d` object that represents torque as a function of motor speed." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Make a system object.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(x=0*m, v=0*m/s)\n", + " \n", + " rpms = [0, 2000, 5000]\n", + " torques = [240, 240, 216]\n", + " interpolate_torque = interpolate(Series(torques, rpms))\n", + " \n", + " return System(params, init=init,\n", + " interpolate_torque=interpolate_torque,\n", + " t_end=3*s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `make_system`" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "system.init" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Torque and speed\n", + "\n", + "The relationship between torque and motor speed is taken from the [Emrax 228 data sheet](http://emrax.com/wp-content/uploads/2017/01/emrax_228_technical_data_4.5.pdf). The following functions reproduce the red dotted line that represents peak torque, which can only be sustained for a few seconds before the motor overheats." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_torque(omega, system):\n", + " \"\"\"Maximum peak torque as a function of motor speed.\n", + " \n", + " omega: motor speed in radian/s\n", + " system: System object\n", + " \n", + " returns: torque in Nm\n", + " \"\"\"\n", + " factor = (1 * radian / s).to(rpm)\n", + " x = magnitude(omega * factor)\n", + " return system.interpolate_torque(x) * N * m" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "compute_torque(0*radian/s, system)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "omega = (5000 * rpm).to(radian/s)\n", + "compute_torque(omega, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the whole curve." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "xs = linspace(0, 525, 21) * radian / s\n", + "taus = [compute_torque(x, system) for x in xs]\n", + "plot(xs, taus)\n", + "decorate(xlabel='Motor speed (rpm)',\n", + " ylabel='Available torque (N m)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulation\n", + "\n", + "Here's the slope function that computes the maximum possible acceleration of the car as a function of it current speed." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " x, v = state\n", + " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", + " mass = system.mass\n", + " \n", + " # use velocity, v, to compute angular velocity of the wheel\n", + " omega2 = v / r_wheel\n", + " \n", + " # use the speed ratio to compute motor speed\n", + " omega1 = omega2 / speed_ratio\n", + " \n", + " # look up motor speed to get maximum torque at the motor\n", + " tau1 = compute_torque(omega1, system)\n", + " \n", + " # compute the corresponding torque at the axle\n", + " tau2 = tau1 / speed_ratio\n", + " \n", + " # compute the force of the wheel on the ground\n", + " F = tau2 / r_wheel\n", + " \n", + " # compute acceleration\n", + " a = F/mass\n", + "\n", + " return v, a " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `slope_func` at linear velocity 10 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "test_state = State(x=0*m, v=10*m/s)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(test_state, 0*s, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And look at the results." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After 3 seconds, the vehicle could be at 40 meters per second, in theory, which is 144 kph." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "v_final = get_last_value(results.v)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "v_final.to(km/hour)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `x`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " plot(results.x, label='x')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting `v`" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + " plot(results.v, label='v')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stopping at 100 kph\n", + "\n", + "We'll use an event function to stop the simulation when we reach 100 kph." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(state, t, system):\n", + " \"\"\"Stops when we get to 100 km/hour.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: difference from 100 km/hour\n", + " \"\"\"\n", + " x, v = state\n", + " \n", + " # convert to km/hour\n", + " factor = (1 * m/s).to(km/hour)\n", + " v = magnitude(v * factor)\n", + " \n", + " return v - 100 " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_ode_solver(system, slope_func, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "subplot(2, 1, 1)\n", + "plot_position(results)\n", + "\n", + "subplot(2, 1, 2)\n", + "plot_velocity(results)\n", + "\n", + "savefig('figs/chap11-fig02.pdf')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "According to this model, we should be able to make this run in just over 2 seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "t_final = get_last_label(results) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At the end of the run, the car has gone about 28 meters." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "state = results.last_row()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we send the final state back to the slope function, we can see that the final acceleration is about 13 $m/s^2$, which is about 1.3 times the acceleration of gravity." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "v, a = slope_func(state, 0, system)\n", + "v.to(km/hour)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "g = 9.8 * m/s**2\n", + "(a / g).to(UNITS.dimensionless)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's not easy for a vehicle to accelerate faster than `g`, because that implies a coefficient of friction between the wheels and the road surface that's greater than 1. But racing tires on dry asphalt can do that; the OEM team at Olin has tested their tires and found a peak coefficient near 1.5.\n", + "\n", + "So it's possible that our no slip assumption is valid, but only under ideal conditions, where weight is distributed equally on four tires, and all tires are driving." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** How much time do we lose because maximum torque decreases as motor speed increases? Run the model again with no drop off in torque and see how much time it saves." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we'll see how much effect drag has on the results.\n", + "\n", + "Here's a function to compute drag force, as we saw in Chapter 21." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(v, system):\n", + " \"\"\"Computes drag force in the opposite direction of `v`.\n", + " \n", + " v: velocity\n", + " system: System object\n", + " \n", + " returns: drag force\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", + " return f_drag" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it with a velocity of 20 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "drag_force(20 * m/s, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the resulting acceleration of the vehicle due to drag.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "drag_force(20 * m/s, system) / system.mass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the effect of drag is not huge, compared to the acceleration we computed in the previous section, but it is not negligible.\n", + "\n", + "Here's a modified slope function that takes drag into account." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func2(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " x, v = state\n", + " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", + " mass = system.mass\n", + " \n", + " omega2 = v / r_wheel * radian\n", + " omega1 = omega2 / speed_ratio\n", + " tau1 = compute_torque(omega1, system)\n", + " tau2 = tau1 / speed_ratio\n", + " F = tau2 / r_wheel\n", + " a_motor = F / mass\n", + " a_drag = drag_force(v, system) / mass\n", + " \n", + " a = a_motor + a_drag\n", + " return v, a " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the next run." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "results2, details = run_ode_solver(system, slope_func2, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The time to reach 100 kph is a bit higher." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "t_final2 = get_last_label(results2) * s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But the total effect of drag is only about 2/100 seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "t_final2 - t_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's not huge, which suggests we might not be able to save much time by decreasing the frontal area, or coefficient of drag, of the car." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Rolling resistance" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we'll consider [rolling resistance](https://en.wikipedia.org/wiki/Rolling_resistance), which the force that resists the motion of the car as it rolls on tires. The cofficient of rolling resistance, `C_rr`, is the ratio of rolling resistance to the normal force between the car and the ground (in that way it is similar to a coefficient of friction).\n", + "\n", + "The following function computes rolling resistance." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "system.set(unit_rr = 1 * N / kg)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "def rolling_resistance(system):\n", + " \"\"\"Computes force due to rolling resistance.\n", + " \n", + " system: System object\n", + " \n", + " returns: force\n", + " \"\"\"\n", + " return -system.C_rr * system.mass * system.unit_rr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The acceleration due to rolling resistance is 0.2 (it is not a coincidence that it equals `C_rr`)." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_resistance(system)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_resistance(system) / system.mass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a modified slope function that includes drag and rolling resistance." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func3(state, t, system):\n", + " \"\"\"Computes the derivatives of the state variables.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object \n", + " \n", + " returns: sequence of derivatives\n", + " \"\"\"\n", + " x, v = state\n", + " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", + " mass = system.mass\n", + " \n", + " omega2 = v / r_wheel * radian\n", + " omega1 = omega2 / speed_ratio\n", + " tau1 = compute_torque(omega1, system)\n", + " tau2 = tau1 / speed_ratio\n", + " F = tau2 / r_wheel\n", + " a_motor = F / mass\n", + " a_drag = drag_force(v, system) / mass\n", + " a_roll = rolling_resistance(system) / mass\n", + " \n", + " a = a_motor + a_drag + a_roll\n", + " return v, a " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the run." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "results3, details = run_ode_solver(system, slope_func3, events=event_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final time is a little higher, but the total cost of rolling resistance is only 3/100 seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "t_final3 = get_last_label(results3) * s" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "t_final3 - t_final2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, again, there is probably not much to be gained by decreasing rolling resistance.\n", + "\n", + "In fact, it is hard to decrease rolling resistance without also decreasing traction, so that might not help at all." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Optimal gear ratio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The gear ratio 13:60 is intended to maximize the acceleration of the car without causing the tires to slip. In this section, we'll consider other gear ratios and estimate their effects on acceleration and time to reach 100 kph.\n", + "\n", + "Here's a function that takes a speed ratio as a parameter and returns time to reach 100 kph." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "def time_to_speed(speed_ratio, params):\n", + " \"\"\"Computes times to reach 100 kph.\n", + " \n", + " speed_ratio: ratio of wheel speed to motor speed\n", + " params: Params object\n", + " \n", + " returns: time to reach 100 kph, in seconds\n", + " \"\"\"\n", + " params = Params(params, speed_ratio=speed_ratio)\n", + " system = make_system(params)\n", + " system.set(unit_rr = 1 * N / kg)\n", + " \n", + " results, details = run_ode_solver(system, slope_func3, events=event_func)\n", + " t_final = get_last_label(results)\n", + " a_initial = slope_func(system.init, 0, system)\n", + " return t_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it with the default ratio:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "time_to_speed(13/60, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can try it with different numbers of teeth on the motor gear (assuming that the axle gear has 60 teeth):" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "for teeth in linrange(8, 18):\n", + " print(teeth, time_to_speed(teeth/60, params))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wow! The speed ratio has a big effect on the results. At first glance, it looks like we could break the world record (1.513 seconds) just by decreasing the number of teeth.\n", + "\n", + "But before we try it, let's see what effect that has on peak acceleration." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_acceleration(speed_ratio, params):\n", + " \"\"\"Maximum acceleration as a function of speed ratio.\n", + " \n", + " speed_ratio: ratio of wheel speed to motor speed\n", + " params: Params object\n", + " \n", + " returns: peak acceleration, in m/s^2\n", + " \"\"\"\n", + " params = Params(params, speed_ratio=speed_ratio)\n", + " system = make_system(params)\n", + " a_initial = slope_func(system.init, 0, system)[1] * m/s**2\n", + " return a_initial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "for teeth in linrange(8, 18):\n", + " print(teeth, initial_acceleration(teeth/60, params))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we decrease the speed ratio, the peak acceleration increases. With 8 teeth on the motor gear, we could break the world record, but only if we can accelerate at 2.3 times the acceleration of gravity, which is impossible without very sticky ties and a vehicle that generates a lot of downforce." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "23.07 / 9.8" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results suggest that the most promising way to improve the performance of the car (for this event) would be to improve traction." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/orbit.ipynb b/examples/orbit.ipynb new file mode 100644 index 00000000..d2eae086 --- /dev/null +++ b/examples/orbit.ipynb @@ -0,0 +1,377 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Orbiting the Sun" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a previous example, we modeled the interaction between the Earth and the Sun, simulating what would happen if the Earth stopped in its orbit and fell straight into the Sun.\n", + "\n", + "Now let's extend the model to two dimensions and simulate one revolution of the Earth around the Sun, that is, one year.\n", + "\n", + "At perihelion, the distance from the Earth to the Sun is 147.09 million km and its velocity is 30,290 m/s." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "r_0 = 147.09e9 # initial distance m\n", + "v_0 = 30.29e3 # initial velocity m/s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here are the other constants we'll need, all with about 4 significant digits." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "G = 6.6743e-11 # gravitational constant N / kg**2 * m**2\n", + "m1 = 1.989e30 # mass of the Sun kg\n", + "m2 = 5.972e24 # mass of the Earth kg\n", + "t_end = 3.154e7 # one year in seconds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Put the initial conditions in a `State` object with variables `x`, `y`, `vx`, and `vy`.\n", + "Create a `System` object with variables `init` and `t_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a function called `universal_gravitation` that takes a `State` and a `System` and returns the gravitational force of the Sun on the Earth as a `Vector`.\n", + "\n", + "Test your function with the initial conditions; the result should be a Vector with approximate components:\n", + "\n", + "```\n", + "x -3.66e+22\n", + "y 0\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Write a slope function that takes a timestamp, a `State`, and a `System` and computes the derivatives of the state variables.\n", + "\n", + "Test your function with the initial conditions. The result should be a sequence of four values, approximately\n", + "\n", + "```\n", + "0.0, -30290.0, -0.006, 0.0\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Use `run_solve_ivp` to run the simulation.\n", + "Save the return values in variables called `results` and `details`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can use the following function to plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "def plot_trajectory(results):\n", + " x = results.x / 1e9\n", + " y = results.y / 1e9\n", + "\n", + " make_series(x, y).plot(label='orbit')\n", + " plot(0, 0, 'yo')\n", + "\n", + " decorate(xlabel='x distance (million km)',\n", + " ylabel='y distance (million km)')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "plot_trajectory(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You will probably see that the earth does not end up back where it started, as we expect it to after one year.\n", + "The following cells compute the error, which is the distance between the initial and final positions." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "error = results.iloc[-1] - system.init\n", + "error" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "offset = Vector(error.x, error.y)\n", + "vector_mag(offset) / 1e9" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that the algorithm used by `run_solve_ivp` does not work very well with systems like this.\n", + "There are two ways we can improve it.\n", + "\n", + "`run_solve_ivp` takes a keyword argument, `rtol`, that specifies the \"relative tolerance\", which determines the size of the time steps in the simulation. Lower values of `rtol` require smaller steps, which yield more accurate results.\n", + "The default value of `rtol` is `1e-3`. \n", + "\n", + "**Exercise:** Try running the simulation again with smaller values, like `1e-4` or `1e-5`, and see what effect it has on the magnitude of `offset`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The other way to improve the results is to use a different algorithm. `run_solve_ivp` takes a keyword argument, `method`, that specifies which algorithm it should use. The default is `RK45`, which is a good, general-purpose algorithm, but not particularly good for this system. One of the other options is `RK23`, which is usually less accurate than `RK45` (with the same step size), but for this system it turns out to be unreasonably good, [for reasons I don't entirely understand](https://mathoverflow.net/questions/314940/celestial-mechanics-and-runge-kutta-methods).\n", + "Yet another option is 'DOP853', which is particularly good when `rtol` is small.\n", + "\n", + "**Exercise:** Run the simulation with one of these methods and see what effect it has on the results. To get a sense of how efficient the methods are, display `details.nfev`, which is the number of times `run_solve_ivp` called the slope function." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "details.nfev" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "You can use the following draw function to animate the results, if you want to see what the orbit looks like (not in real time)." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "xlim = results.x.min(), results.x.max()\n", + "ylim = results.y.min(), results.y.max()\n", + "\n", + "def draw_func(t, state):\n", + " x, y, vx, vy = state\n", + " plot(x, y, 'b.')\n", + " plot(0, 0, 'yo')\n", + " decorate(xlabel='x distance (million km)',\n", + " ylabel='y distance (million km)',\n", + " xlim=xlim,\n", + " ylim=ylim)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# animate(results, draw_func)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/plague.ipynb b/examples/plague.ipynb new file mode 100644 index 00000000..a2b391c5 --- /dev/null +++ b/examples/plague.ipynb @@ -0,0 +1,623 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "combined-semiconductor", + "metadata": {}, + "source": [ + "# The Freshman Plague" + ] + }, + { + "cell_type": "markdown", + "id": "imported-table", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "electoral-turkey", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "formal-context", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "progressive-typing", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "undefined-miller", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap11.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "growing-sperm", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import code from previous notebooks\n", + "\n", + "from chap11 import make_system\n", + "from chap11 import update_func\n", + "from chap11 import run_simulation" + ] + }, + { + "cell_type": "markdown", + "id": "plastic-trigger", + "metadata": {}, + "source": [ + "[Click here to run this case study on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/plague.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "complex-renewal", + "metadata": {}, + "source": [ + "This case study picks up where Chapter 12 leaves off." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "recent-cooper", + "metadata": {}, + "outputs": [], + "source": [ + "def add_immunization(system, fraction):\n", + " system.init.S -= fraction\n", + " system.init.R += fraction" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "found-learning", + "metadata": {}, + "outputs": [], + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "synthetic-element", + "metadata": {}, + "outputs": [], + "source": [ + "def calc_total_infected(results, system):\n", + " s_0 = results.S[0]\n", + " s_end = results.S[system.t_end]\n", + " return s_0 - s_end" + ] + }, + { + "cell_type": "markdown", + "id": "changed-capability", + "metadata": {}, + "source": [ + "## Hand washing\n", + "\n", + "Suppose you are the Dean of Student Life, and you have a budget of just \\$1200 to combat the Freshman Plague. You have two options for spending this money:\n", + "\n", + "1. You can pay for vaccinations, at a rate of \\$100 per dose.\n", + "\n", + "2. You can spend money on a campaign to remind students to wash hands\n", + " frequently.\n", + "\n", + "We have already seen how we can model the effect of vaccination. Now\n", + "let's think about the hand-washing campaign. We'll have to answer two\n", + "questions:\n", + "\n", + "1. How should we incorporate the effect of hand washing in the model?\n", + "\n", + "2. How should we quantify the effect of the money we spend on a\n", + " hand-washing campaign?\n", + "\n", + "For the sake of simplicity, let's assume that we have data from a\n", + "similar campaign at another school showing that a well-funded campaign\n", + "can change student behavior enough to reduce the infection rate by 20%.\n", + "\n", + "In terms of the model, hand washing has the effect of reducing `beta`.\n", + "That's not the only way we could incorporate the effect, but it seems\n", + "reasonable and it's easy to implement." + ] + }, + { + "cell_type": "markdown", + "id": "alpine-guest", + "metadata": {}, + "source": [ + "Now we have to model the relationship between the money we spend and the\n", + "effectiveness of the campaign. Again, let's suppose we have data from\n", + "another school that suggests:\n", + "\n", + "- If we spend \\$500 on posters, materials, and staff time, we can\n", + " change student behavior in a way that decreases the effective value of `beta` by 10%.\n", + "\n", + "- If we spend \\$1000, the total decrease in `beta` is almost 20%.\n", + "\n", + "- Above \\$1000, additional spending has little additional benefit." + ] + }, + { + "cell_type": "markdown", + "id": "agricultural-trinidad", + "metadata": {}, + "source": [ + "## Logistic function\n", + "\n", + "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "blond-armstrong", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import exp\n", + "\n", + "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", + " \"\"\"Computes the generalize logistic function.\n", + " \n", + " A: controls the lower bound\n", + " B: controls the steepness of the transition \n", + " C: not all that useful, AFAIK\n", + " M: controls the location of the transition\n", + " K: controls the upper bound\n", + " Q: shift the transition left or right\n", + " nu: affects the symmetry of the transition\n", + " \n", + " returns: float or array\n", + " \"\"\"\n", + " exponent = -B * (x - M)\n", + " denom = C + Q * exp(exponent)\n", + " return A + (K-A) / denom ** (1/nu)" + ] + }, + { + "cell_type": "markdown", + "id": "seven-budget", + "metadata": {}, + "source": [ + "The following array represents the range of possible spending." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "disturbed-amount", + "metadata": {}, + "outputs": [], + "source": [ + "spending = linspace(0, 1200, 21)" + ] + }, + { + "cell_type": "markdown", + "id": "supreme-nutrition", + "metadata": {}, + "source": [ + "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "\n", + "`M` is chosen so the transition happens around \\$500.\n", + "\n", + "`K` is the maximum reduction in `beta`, 20%.\n", + "\n", + "`B` is chosen by trial and error to yield a curve that seems feasible." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "otherwise-answer", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " \"\"\"Reduction factor as a function of spending.\n", + " \n", + " spending: dollars from 0 to 1200\n", + " \n", + " returns: fractional reduction in beta\n", + " \"\"\"\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "expected-venture", + "metadata": {}, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "seventh-strike", + "metadata": {}, + "outputs": [], + "source": [ + "percent_reduction = compute_factor(spending) * 100\n", + "\n", + "make_series(spending, percent_reduction).plot()\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Percent reduction in infection rate',\n", + " title='Effect of hand washing on infection rate')" + ] + }, + { + "cell_type": "markdown", + "id": "legal-michigan", + "metadata": {}, + "source": [ + "The result is the following function, which\n", + "takes spending as a parameter and returns `factor`, which is the factor\n", + "by which `beta` is reduced:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "obvious-congress", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_factor(spending):\n", + " return logistic(spending, M=500, K=0.2, B=0.01)" + ] + }, + { + "cell_type": "markdown", + "id": "sunset-investing", + "metadata": {}, + "source": [ + "I use `compute_factor` to write `add_hand_washing`, which takes a\n", + "`System` object and a budget, and modifies `system.beta` to model the\n", + "effect of hand washing:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "polish-multiple", + "metadata": {}, + "outputs": [], + "source": [ + "def add_hand_washing(system, spending):\n", + " factor = compute_factor(spending)\n", + " system.beta *= (1 - factor)" + ] + }, + { + "cell_type": "markdown", + "id": "worthy-fellowship", + "metadata": {}, + "source": [ + "Now we can sweep a range of values for `spending` and use the simulation\n", + "to compute the effect:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "statistical-garden", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_hand_washing(spending_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " sweep[spending] = calc_total_infected(results, system)\n", + " \n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "clinical-surge", + "metadata": {}, + "source": [ + "Here's how we run it:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "joined-graduation", + "metadata": {}, + "outputs": [], + "source": [ + "from numpy import linspace\n", + "\n", + "spending_array = linspace(0, 1200, 20)\n", + "infected_sweep2 = sweep_hand_washing(spending_array)" + ] + }, + { + "cell_type": "markdown", + "id": "designing-smile", + "metadata": {}, + "source": [ + "The following figure shows the result. " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "cheap-decision", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep2.plot()\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Total fraction infected',\n", + " title='Effect of hand washing on total infections')" + ] + }, + { + "cell_type": "markdown", + "id": "selective-right", + "metadata": {}, + "source": [ + "Below \\$200, the campaign has little effect. \n", + "\n", + "At \\$800 it has a substantial effect, reducing total infections from more than 45% to about 20%. \n", + "\n", + "Above \\$800, the additional benefit is small." + ] + }, + { + "cell_type": "markdown", + "id": "lucky-boulder", + "metadata": {}, + "source": [ + "## Optimization\n", + "\n", + "Let's put it all together. With a fixed budget of \\$1200, we have to\n", + "decide how many doses of vaccine to buy and how much to spend on the\n", + "hand-washing campaign.\n", + "\n", + "Here are the parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "surrounded-copying", + "metadata": {}, + "outputs": [], + "source": [ + "num_students = 90\n", + "budget = 1200\n", + "price_per_dose = 100\n", + "max_doses = int(budget / price_per_dose)\n", + "max_doses" + ] + }, + { + "cell_type": "markdown", + "id": "expired-conditioning", + "metadata": {}, + "source": [ + "The fraction `budget/price_per_dose` might not be an integer. `int` is a\n", + "built-in function that converts numbers to integers, rounding down.\n", + "\n", + "We'll sweep the range of possible doses:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "shaped-utility", + "metadata": {}, + "outputs": [], + "source": [ + "dose_array = linrange(max_doses)" + ] + }, + { + "cell_type": "markdown", + "id": "occupational-reply", + "metadata": {}, + "source": [ + "In this example we call `linrange` with only one argument; it returns a NumPy array with the integers from 0 to `max_doses`, including both.\n", + "\n", + "Then we run the simulation for each element of `dose_array`:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "recognized-release", + "metadata": {}, + "outputs": [], + "source": [ + "def sweep_doses(dose_array):\n", + " sweep = SweepSeries()\n", + " \n", + " for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " sweep[doses] = calc_total_infected(results, system)\n", + "\n", + " return sweep" + ] + }, + { + "cell_type": "markdown", + "id": "cardiac-mitchell", + "metadata": {}, + "source": [ + "For each number of doses, we compute the fraction of students we can\n", + "immunize, `fraction` and the remaining budget we can spend on the\n", + "campaign, `spending`. Then we run the simulation with those quantities\n", + "and store the number of infections.\n", + "\n", + "The following figure shows the result." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "worth-mounting", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep3 = sweep_doses(dose_array)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "adjusted-highlight", + "metadata": {}, + "outputs": [], + "source": [ + "infected_sweep3.plot()\n", + "\n", + "decorate(xlabel='Doses of vaccine',\n", + " ylabel='Total fraction infected',\n", + " title='Total infections vs. doses')" + ] + }, + { + "cell_type": "markdown", + "id": "dynamic-easter", + "metadata": {}, + "source": [ + "If we buy no doses of vaccine and spend the entire budget on the campaign, the fraction infected is around 19%. At 4 doses, we have \\$800 left for the campaign, and this is the optimal point that minimizes the number of students who get sick.\n", + "\n", + "As we increase the number of doses, we have to cut campaign spending,\n", + "which turns out to make things worse. But interestingly, when we get\n", + "above 10 doses, the effect of herd immunity starts to kick in, and the\n", + "number of sick students goes down again." + ] + }, + { + "cell_type": "markdown", + "id": "timely-bottom", + "metadata": {}, + "source": [ + "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "swiss-preview", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/queue.ipynb b/examples/queue.ipynb new file mode 100644 index 00000000..eed8b76c --- /dev/null +++ b/examples/queue.ipynb @@ -0,0 +1,592 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# One Queue or Two" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", + "\n", + "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", + "\n", + "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", + "\n", + "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "\n", + "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", + "\n", + "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One server, one queue\n", + "\n", + "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", + "\n", + "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n", + "\n", + "It should return the total number of customers at the end of the time step." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate a queueing system.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " \"\"\"\n", + " x = 0\n", + " results = TimeSeries()\n", + " results[0] = x\n", + " \n", + " for t in linrange(0, system.duration):\n", + " x = update_func(x, t, system)\n", + " results[t+1] = x\n", + "\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Call `run_simulation` with your update function and plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n", + "\n", + "$L = \\lambda W$\n", + "\n", + "Where $\\lambda$ is the arrival rate. Here's a function that computes them." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_metrics(results, system):\n", + " \"\"\"Compute average number of customers and wait time.\n", + " \n", + " results: TimeSeries of queue lengths\n", + " system: System object\n", + " \n", + " returns: L, W\n", + " \"\"\"\n", + " L = results.mean()\n", + " W = L / system.lam\n", + " return L, W" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Call `compute_metrics` with the results from your simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Parameter sweep\n", + "\n", + "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n", + "\n", + "Create an array of values for `lam`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n", + "\n", + "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n", + "\n", + "It should return the `SweepSeries`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Call your function to generate a `SweepSeries`, and plot it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis\n", + "\n", + "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n", + "\n", + "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n", + "\n", + "$W = 1 / (\\mu - \\lambda)$\n", + "\n", + "The following function plots the theoretical value of $W$ as a function of $\\lambda$." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_W(lam_array, mu):\n", + " \"\"\"Plot the theoretical mean wait time.\n", + " \n", + " lam_array: array of values for `lam`\n", + " mu: probability of finishing a checkout\n", + " \"\"\"\n", + " W_array = 1 / (mu - lam_array)\n", + " W_series = make_series(lam_array, W_array)\n", + " W_series.plot(style='-', label='analysis')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple servers\n", + "\n", + "Now let's try the other two queueing strategies:\n", + "\n", + "1. One queue with two checkout counters.\n", + "2. Two queues, one for each counter.\n", + "\n", + "The following figure shows the three scenarios:\n", + "\n", + "![](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", + "\n", + "Write an update function for one queue with two servers." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use this update function to simulate the system, plot the results, and print the metrics." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n", + "\n", + "Create a new array of values for `lam` from 10% to 160% of `mu`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n", + "\n", + "Plot the results and print the average value of `W` across all values of `lam`." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple queues\n", + "\n", + "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n", + "\n", + "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n", + "\n", + "When a customer arrives, which queue do they join?" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write a version of `run_simulation` that works with this update function." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your functions by running a simulation with a single value of `lam`." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n", + "\n", + "How do the results compare to the scenario with two servers and one queue." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/salmon.ipynb b/examples/salmon.ipynb new file mode 100644 index 00000000..4d59bbc1 --- /dev/null +++ b/examples/salmon.ipynb @@ -0,0 +1,695 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Salmon" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Can we predict salmon populations?\n", + "\n", + "Each year the [U.S. Atlantic Salmon Assessment Committee](https://www.nefsc.noaa.gov/USASAC/Reports/USASAC2018-Report-30-2017-Activities.pdf) reports estimates of salmon populations in oceans and rivers in the northeastern United States. The reports are useful for monitoring changes in these populations, but they generally do not include predictions.\n", + "\n", + "The goal of this case study is to model year-to-year changes in population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", + "\n", + "As an example, I'll use data from page 18 of the 2017 report, which provides population estimates for the Narraguagus and Sheepscot Rivers in Maine.\n", + "\n", + "![USASAC_Report_2017_Page18](https://github.com/AllenDowney/ModSim/raw/main/data/USASAC_Report_2017_Page18.png)\n", + "\n", + "There are tools for extracting data from a PDF document automatically, but for this example I will keep it simple and type it in.\n", + "\n", + "Here are the population estimates for the Narraguagus River:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "pops = [2749, 2845, 4247, 1843, 2562, 1774, 1201, 1284, 1287, \n", + " 2339, 1177, 962, 1176, 2149, 1404, 969, 1237, 1615, 1201]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get this data into a Pandas Series, I'll also make a range of years to use as an index." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "years = linrange(1997, 2015)\n", + "years" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the series." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "pop_series = TimeSeries(pops, index=years)\n", + "pop_series" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what it looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_population(series):\n", + " series.plot(label='Estimated population')\n", + " decorate(xlabel='Year', \n", + " ylabel='Population estimate', \n", + " title='Narraguacus River',\n", + " ylim=[0, 5000])\n", + " \n", + "plot_population(pop_series)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling changes\n", + "\n", + "To see how the population changes from year-to-year, I'll use `diff` to compute the absolute difference between each year and the next.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "abs_diffs = pop_series.diff()\n", + "abs_diffs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can compute relative differences by dividing by the original series elementwise." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "rel_diffs = abs_diffs / pop_series\n", + "rel_diffs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These relative differences are observed annual net growth rates. So let's drop the `0` and save them." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "rates = rel_diffs.dropna()\n", + "rates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A simple way to model this system is to draw a random value from this series of observed rates each year. We can use the NumPy function `choice` to make a random choice from a series." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "np.random.choice(rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simulation\n", + "\n", + "Now we can simulate the system by drawing random growth rates from the series of observed rates.\n", + "\n", + "I'll start the simulation in 2015." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = 2015\n", + "p_0 = pop_series[t_0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll create a `System` object with variables `t_0`, `p_0`, `rates`, and `duration=10` years. \n", + "\n", + "The series of observed rates is one big parameter of the model." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(t_0=t_0,\n", + " p_0=p_0,\n", + " duration=10,\n", + " rates=rates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write an update functon that takes as parameters `pop`, `t`, and `system`.\n", + "It should choose a random growth rate, compute the change in population, and return the new population." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your update function and run it a few times" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "update_func1(p_0, t_0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a version of `run_simulation` that stores the results in a `TimeSeries` and returns it." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate a queueing system.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " \"\"\"\n", + " t_0 = system.t_0\n", + " t_end = t_0 + system.duration\n", + " \n", + " results = TimeSeries()\n", + " results[t_0] = system.p_0\n", + " \n", + " for t in linrange(t_0, t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + "\n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `run_simulation` to run generate a prediction for the next 10 years.\n", + "\n", + "The plot your prediction along with the original data. Your prediction should pick up where the data leave off." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get a sense of how much the results vary, we can run the model several times and plot all of the results." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_many_simulations(system, update_func, iters):\n", + " \"\"\"Runs simulations and plots the results.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " iters: number of simulations to run\n", + " \"\"\"\n", + " for i in range(iters):\n", + " results = run_simulation(system, update_func)\n", + " results.plot(color='gray', label='_nolegend', \n", + " linewidth=1, alpha=0.3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The plot option `alpha=0.1` makes the lines semi-transparent, so they are darker where they overlap.\n", + "\n", + "Run `plot_many_simulations` with your update function and `iters=30`. Also plot the original data." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results are highly variable: according to this model, the population might continue to decline over the next 10 years, or it might recover and grow rapidly!\n", + "\n", + "It's hard to say how seriously we should take this model. There are many factors that influence salmon populations that are not included in the model. For example, if the population starts to grow quickly, it might be limited by resource limits, predators, or fishing. If the population starts to fall, humans might restrict fishing and stock the river with farmed fish.\n", + "\n", + "So these results should probably not be considered useful predictions. However, there might be something useful we can do, which is to estimate the probability that the population will increase or decrease in the next 10 years. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Distribution of net changes\n", + "\n", + "To describe the distribution of net changes, write a function called `run_many_simulations` that runs many simulations, saves the final populations in a `ModSimSeries`, and returns the `ModSimSeries`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "def run_many_simulations(system, update_func, iters):\n", + " \"\"\"Runs simulations and report final populations.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " iters: number of simulations to run\n", + " \n", + " returns: series of final populations\n", + " \"\"\"\n", + " # FILL THIS IN" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your function by running it with `iters=5`." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "run_many_simulations(system, update_func1, 5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can run 1000 simulations and describe the distribution of the results." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "last_pops = run_many_simulations(system, update_func1, 1000)\n", + "last_pops.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we substract off the initial population, we get the distribution of changes." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "net_changes = last_pops - p_0\n", + "net_changes.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The median is negative, which indicates that the population decreases more often than it increases.\n", + "\n", + "We can be more specific by counting the number of runs where `net_changes` is positive." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "np.sum(net_changes > 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or we can use `mean` to compute the fraction of runs where `net_changes` is positive." + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "np.mean(net_changes > 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the fraction where it's negative." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "np.mean(net_changes < 0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So, based on observed past changes, this model predicts that the population is more likely to decrease than increase over the next 10 years, by about 2:1." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## A refined model\n", + "\n", + "There are a few ways we could improve the model.\n", + "\n", + "1. It looks like there might be cyclic behavior in the past data, with a period of 4-5 years. We could extend the model to include this effect.\n", + "\n", + "2. Older data might not be as relevant for prediction as newer data, so we could give more weight to newer data.\n", + "\n", + "The second option is easier to implement, so let's try it.\n", + "\n", + "I'll use `linspace` to create an array of \"weights\" for the observed rates. The probability that I choose each rate will be proportional to these weights.\n", + "\n", + "The weights have to add up to 1, so I divide through by the total." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "weights = linspace(0, 1, len(rates))\n", + "weights /= sum(weights)\n", + "weights" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll add the weights to the `System` object, since they are parameters of the model." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "system.weights = weights" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can pass these weights as a parameter to `np.random.choice` (see the [documentation](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html))" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "np.random.choice(system.rates, p=system.weights)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write an update function that takes the weights into account." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `plot_many_simulations` to plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use `run_many_simulations` to collect the results and `describe` to summarize the distribution of net changes." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Does the refined model have much effect on the probability of population decline?" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/spiderman.ipynb b/examples/spiderman.ipynb new file mode 100644 index 00000000..39ecaa1e --- /dev/null +++ b/examples/spiderman.ipynb @@ -0,0 +1,848 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Spider-Man" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case study we'll develop a model of Spider-Man swinging from a springy cable of webbing attached to the top of the Empire State Building. Initially, Spider-Man is at the top of a nearby building, as shown in this diagram.\n", + "\n", + "![Diagram of the initial state for the Spider-Man case\n", + "study.](https://github.com/AllenDowney/ModSim/raw/main/figs/spiderman.png)\n", + "\n", + "The origin, `O⃗`, is at the base of the Empire State Building. The vector `H⃗` represents the position where the webbing is attached to the building, relative to `O⃗`. The vector `P⃗` is the position of Spider-Man relative to `O⃗`. And `L⃗` is the vector from the attachment point to Spider-Man.\n", + "\n", + "By following the arrows from `O⃗`, along `H⃗`, and along `L⃗`, we can see that \n", + "\n", + "`H⃗ + L⃗ = P⃗`\n", + "\n", + "So we can compute `L⃗` like this:\n", + "\n", + "`L⃗ = P⃗ - H⃗`\n", + "\n", + "The goals of this case study are:\n", + "\n", + "1. Implement a model of this scenario to predict Spider-Man's trajectory.\n", + "\n", + "2. Choose the right time for Spider-Man to let go of the webbing in order to maximize the distance he travels before landing.\n", + "\n", + "3. Choose the best angle for Spider-Man to jump off the building, and let go of the webbing, to maximize range." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll create a `Params` object to contain the quantities we'll need:\n", + "\n", + "1. According to [the Spider-Man Wiki](http://spiderman.wikia.com/wiki/Peter_Parker_%28Earth-616%29), Spider-Man weighs 76 kg.\n", + "\n", + "2. Let's assume his terminal velocity is 60 m/s.\n", + "\n", + "3. The length of the web is 100 m.\n", + "\n", + "4. The initial angle of the web is 45 degrees to the left of straight down.\n", + "\n", + "5. The spring constant of the web is 40 N / m when the cord is stretched, and 0 when it's compressed.\n", + "\n", + "Here's a `Params` object with the parameters of the system." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "params = Params(height = 381, # m,\n", + " g = 9.8, # m/s**2,\n", + " mass = 75, # kg,\n", + " area = 1, # m**2,\n", + " rho = 1.2, # kg/m**3,\n", + " v_term = 60, # m / s,\n", + " length = 100, # m,\n", + " angle = (270 - 45), # degree,\n", + " k = 40, # N / m,\n", + " t_0 = 0, # s,\n", + " t_end = 30, # s\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compute the initial position" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_condition(params):\n", + " \"\"\"Compute the initial position and velocity.\n", + " \n", + " params: Params object\n", + " \"\"\"\n", + " H⃗ = Vector(0, params.height)\n", + " theta = np.deg2rad(params.angle)\n", + " x, y = pol2cart(theta, params.length)\n", + " L⃗ = Vector(x, y)\n", + " P⃗ = H⃗ + L⃗\n", + " \n", + " return State(x=P⃗.x, y=P⃗.y, vx=0, vy=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "initial_condition(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", + "\n", + "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params):\n", + " \"\"\"Makes a System object for the given conditions.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = initial_condition(params)\n", + " \n", + " mass, g = params.mass, params.g\n", + " rho, area, v_term = params.rho, params.area, params.v_term\n", + " C_d = 2 * mass * g / (rho * area * v_term**2)\n", + " \n", + " return System(params, init=init, C_d=C_d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make a `System`" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "system.init" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Drag and spring forces\n", + "\n", + "Here's drag force, as we saw in Chapter 22." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def drag_force(V⃗, system):\n", + " \"\"\"Compute drag force.\n", + " \n", + " V⃗: velocity Vector\n", + " system: `System` object\n", + " \n", + " returns: force Vector\n", + " \"\"\"\n", + " rho, C_d, area = system.rho, system.C_d, system.area\n", + " \n", + " mag = rho * vector_mag(V⃗)**2 * C_d * area / 2\n", + " direction = -vector_hat(V⃗)\n", + " f_drag = direction * mag\n", + " return f_drag" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "V⃗_test = Vector(10, 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "drag_force(V⃗_test, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the 2-D version of spring force. We saw the 1-D version in Chapter 21." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def spring_force(L⃗, system):\n", + " \"\"\"Compute drag force.\n", + " \n", + " L⃗: Vector representing the webbing\n", + " system: System object\n", + " \n", + " returns: force Vector\n", + " \"\"\"\n", + " extension = vector_mag(L⃗) - system.length\n", + " if extension < 0:\n", + " mag = 0\n", + " else:\n", + " mag = system.k * extension\n", + " \n", + " direction = -vector_hat(L⃗)\n", + " f_spring = direction * mag\n", + " return f_spring" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "L⃗_test = Vector(0, -system.length-1)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "f_spring = spring_force(L⃗_test, system)\n", + "f_spring" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the slope function, including acceleration due to gravity, drag, and the spring force of the webbing." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " \"\"\"Computes derivatives of the state variables.\n", + " \n", + " state: State (x, y, x velocity, y velocity)\n", + " t: time\n", + " system: System object with g, rho, C_d, area, mass\n", + " \n", + " returns: sequence (vx, vy, ax, ay)\n", + " \"\"\"\n", + " x, y, vx, vy = state\n", + " P⃗ = Vector(x, y)\n", + " V⃗ = Vector(vx, vy)\n", + " g, mass = system.g, system.mass\n", + " \n", + " H⃗ = Vector(0, system.height)\n", + " L⃗ = P⃗ - H⃗\n", + " \n", + " a_grav = Vector(0, -g)\n", + " a_spring = spring_force(L⃗, system) / mass\n", + " a_drag = drag_force(V⃗, system) / mass\n", + " \n", + " A⃗ = a_grav + a_drag + a_spring\n", + " \n", + " return V⃗.x, V⃗.y, A⃗.x, A⃗.y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, let's test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing the results\n", + "\n", + "We can extract the x and y components as `Series` objects." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The simplest way to visualize the results is to plot x and y as functions of time." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " results.x.plot(label='x')\n", + " results.y.plot(label='y')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the velocities the same way." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + " results.vx.plot(label='vx')\n", + " results.vy.plot(label='vy')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another way to visualize the results is to plot y versus x. The result is the trajectory through the plane of motion." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_trajectory(results, label):\n", + " x = results.x\n", + " y = results.y\n", + " make_series(x, y).plot(label=label)\n", + "\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + " \n", + "plot_trajectory(results, label='trajectory')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Letting go\n", + "\n", + "Now let's find the optimal time for Spider-Man to let go. We have to run the simulation in two phases because the spring force changes abruptly when Spider-Man lets go, so we can't integrate through it.\n", + "\n", + "Here are the parameters for Phase 1, running for 9 seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "params1 = params.set(t_end=9)\n", + "system1 = make_system(params1)\n", + "results1, details1 = run_solve_ivp(system1, slope_func)\n", + "plot_trajectory(results1, label='phase 1')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final conditions from Phase 1 are the initial conditions for Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "t_0 = results1.index[-1]\n", + "t_0" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "init = results1.iloc[-1]\n", + "init" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "t_end = t_0 + 10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is the `System` for Phase 2. We can turn off the spring force by setting `k=0`, so we don't have to write a new slope function." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "system2 = system1.set(init=init, t_0=t_0, t_end=t_end, k=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an event function that stops the simulation when Spider-Man reaches the ground." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "def event_func(t, state, system):\n", + " \"\"\"Stops when y=0.\n", + " \n", + " state: State object\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: height\n", + " \"\"\"\n", + " x, y, vx, vy = state\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run Phase 2." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func)\n", + "details2.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "plot_trajectory(results1, label='phase 1')\n", + "plot_trajectory(results2, label='phase 2')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can gather all that into a function that takes `t_release` and `V_0`, runs both phases, and returns the results." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "def run_two_phase(t_release, params):\n", + " \"\"\"Run both phases.\n", + " \n", + " t_release: time when Spider-Man lets go of the webbing\n", + " \"\"\"\n", + " params1 = params.set(t_end=t_release)\n", + " system1 = make_system(params1)\n", + " results1, details1 = run_solve_ivp(system1, slope_func)\n", + "\n", + " t_0 = results1.index[-1]\n", + " t_end = t_0 + 10\n", + " init = results1.iloc[-1]\n", + "\n", + " system2 = system1.set(init=init, t_0=t_0, t_end=t_end, k=0)\n", + " results2, details2 = run_solve_ivp(system2, slope_func, \n", + " events=event_func)\n", + "\n", + " return results1.append(results2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's a test run." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "t_release = 9 \n", + "results = run_two_phase(t_release, params)\n", + "plot_trajectory(results, 'trajectory')" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "x_final = results.iloc[-1].x\n", + "x_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Animation\n", + "\n", + "Here's a draw function we can use to animate the results." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pyplot import plot\n", + "\n", + "xlim = results.x.min(), results.x.max()\n", + "ylim = results.y.min(), results.y.max()\n", + "\n", + "def draw_func(t, state):\n", + " plot(state.x, state.y, 'bo')\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)',\n", + " xlim=xlim,\n", + " ylim=ylim)" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "# animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Maximizing range\n", + "\n", + "To find the best value of `t_release`, we need a function that takes possible values, runs the simulation, and returns the range." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [], + "source": [ + "def range_func(t_release, params):\n", + " \"\"\"Compute the final value of x.\n", + " \n", + " t_release: time to release web\n", + " params: Params object\n", + " \"\"\"\n", + " results = run_two_phase(t_release, params)\n", + " x_final = results.iloc[-1].x\n", + " print(t_release, x_final)\n", + " return x_final" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "range_func(9, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And run it for a few values." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "for t_release in linrange(3, 15, 3):\n", + " range_func(t_release, params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use `maximize_scalar` to find the optimum." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "bounds = [6, 12]\n", + "res = maximize_scalar(range_func, params, bounds=bounds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we can run the simulation with the optimal value." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "best_time = res.x\n", + "results = run_two_phase(best_time, params)\n", + "plot_trajectory(results, label='trajectory')" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "x_final = results.iloc[-1].x\n", + "x_final" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/throwingaxe.ipynb b/examples/throwingaxe.ipynb new file mode 100644 index 00000000..89f5bc3c --- /dev/null +++ b/examples/throwingaxe.ipynb @@ -0,0 +1,482 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Throwing Axes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "My favorite event at Lumberjack Competitions is axe throwing.  The axes used for this event typically weigh 1.5 to 2 kg, with handles roughly 0.7 m long.  They are thrown overhead at a target typically 6 m away and 1.5 m off the ground.  Normally, the axe makes one full rotation in the air to hit the target blade first, with the handle close to vertical.\n", + "\n", + "![Diagram of throwing axe](https://github.com/AllenDowney/ModSim/raw/main/figs/throwingaxe1.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a version of `make_system` that sets the initial conditions.\n", + "\n", + "The state variables are x, y, theta, vx, vy, omega, where theta is the orientation (angle) of the axe in radians and omega is the angular velocity in radians per second.\n", + "\n", + "I chose initial conditions based on videos of axe throwing." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "g = 9.8 # m/s**2,\n", + "mass = 1.5 # kg,\n", + "length = 0.7 # m" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "x = 0 # m\n", + "y = 2 # m\n", + "vx = 8 # m / s\n", + "vy = 4 # m / s\n", + "theta = 2 # rad\n", + "omega = -7 # rad / s" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(x=x, y=y, \n", + " vx=vx, vy=vy, \n", + " theta=theta, omega=omega)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, t_end=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a simple starting place, I ignore drag, so `vx` and `omega` are constant, and `ay` is just `-g`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " x, y, vx, vy, theta, omega = state\n", + "\n", + " ax = 0\n", + " ay = -g\n", + " alpha = 0\n", + "\n", + " return vx, vy, ax, ay, omega, alpha" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, let's test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "slope_func(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Visualizing the results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The simplest way to visualize the results is to plot the state variables as a function of time." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_position(results):\n", + " results.x.plot(label='x')\n", + " results.y.plot(label='y')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Position (m)')\n", + " \n", + "plot_position(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the velocities the same way." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_velocity(results):\n", + " results.vx.plot(label='vx')\n", + " results.vy.plot(label='vy')\n", + "\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')\n", + " \n", + "plot_velocity(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "results.theta.plot(label='theta', color='C2')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (radian)')" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "results.omega.plot(label='omega', color='C2')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angular velocity (rad/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another way to visualize the results is to plot y versus x. The result is the trajectory through the plane of motion." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_trajectory(results):\n", + " x = results.x\n", + " y = results.y\n", + " make_series(x, y).plot(label='trajectory')\n", + " \n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)')\n", + " \n", + "plot_trajectory(results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Animation\n", + "\n", + "Animating this system is a little more complicated, if we want to show the shape and orientation of the axe.\n", + "\n", + "It is useful to construct a frame with $\\hat{r}$ along the handle of the axe and $\\hat{\\theta}$ perpendicular." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def make_frame(theta):\n", + " x, y = pol2cart(theta, 1)\n", + " rhat = Vector(x, y)\n", + " that = vector_perp(rhat)\n", + " return rhat, that" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "theta = 1\n", + "rhat, that = make_frame(theta)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "rhat" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "that" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "np.dot(rhat, that)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "O = Vector(0, 0)\n", + "plot_segment(O, rhat)\n", + "plot_segment(O, that)\n", + "plt.axis('equal');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we're ready to animate the results. The following figure shows the frame and the labeled points A, B, C, and D.\n", + "\n", + "![Diagram of the axe with reference frame](https://github.com/AllenDowney/ModSim/raw/main/figs//throwingaxe2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "l1 = 0.6\n", + "l2 = 0.1\n", + "\n", + "def draw_func(t, state): \n", + " x, y, vx, vy, theta, omega = state\n", + " P = Vector(x, y)\n", + " rhat, that = make_frame(theta)\n", + " \n", + " # plot the handle\n", + " A = P - l1 * rhat\n", + " B = P + l2 * rhat\n", + " plot_segment(A, B, color='red')\n", + "\n", + " # plot the axe head\n", + " C = B + l2 * that\n", + " D = B - l2 * that\n", + " plot_segment(C, D, color='black', linewidth=10)\n", + "\n", + " # plot the COG\n", + " plt.plot(x, y, 'bo')\n", + "\n", + " decorate(xlabel='x position (m)',\n", + " ylabel='y position (m)',\n", + " xlim=[-0.3, 8.2],\n", + " ylim=[0, 5]\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "During the animation, the parts of the axe seem to slide around relative to each other. I think that's because the lines and circles get rounded off to the nearest pixel.\n", + "\n", + "Here's the final state of the axe at the point of impact (assuming the target is 8 m away)." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "draw_func(0, system.init)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "animate(results, draw_func)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Find the starting conditions that make the final height of the COG as close as possible to 1.5 m. Ideally, the final angle should be a little past vertical." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/trees.ipynb b/examples/trees.ipynb new file mode 100644 index 00000000..c8c4cbe6 --- /dev/null +++ b/examples/trees.ipynb @@ -0,0 +1,1014 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trees" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling tree growth\n", + "\n", + "This case study is based on \"[Height-Age Curves for Planted Stands of Douglas Fir, with Adjustments for Density](http://www.cfr.washington.edu/research.smc/working_papers/smc_working_paper_1.pdf)\", a working paper by Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", + "\n", + "It provides \"site index curves\", which are curves that show the expected height of the tallest tree in a stand of Douglas firs as a function of age, for a stand where the trees are the same age.\n", + "\n", + "Depending on the quality of the site, the trees might grow more quickly or slowly. So each curve is identified by a \"site index\" that indicates the quality of the site.\n", + "\n", + "I'll start with some of the data from their Table 1. Here's the sequence of ages." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "years = [2, 3, 4, 5, 6, 8, 10, 15, 20, 25, 30,\n", + " 35, 40, 45, 50, 55, 60, 65, 70]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the series of heights for a site with index 45, indicating that height at 30 years is 45 feet." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "site45 = TimeSeries([1.4, 1.49, 1.75, 2.18, 2.78, 4.45, 6.74,\n", + " 14.86, 25.39, 35.60, 45.00, 53.65, 61.60,\n", + " 68.92, 75.66, 81.85, 87.56, 92.8, 97.63],\n", + " index=years)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the series for site index 65." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "site65 = TimeSeries([1.4, 1.56, 2.01, 2.76, 3.79, 6.64, 10.44, \n", + " 23.26, 37.65, 51.66, 65.00, 77.50, 89.07, \n", + " 99.66, 109.28, 117.96, 125.74, 132.68, 138.84],\n", + " index=years)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And for site index 85." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "site85 = TimeSeries([1.4, 1.8, 2.71, 4.09, 5.92, 10.73, 16.81, \n", + " 34.03, 51.26, 68.54, 85, 100.34, 114.33,\n", + " 126.91, 138.06, 147.86, 156.39, 163.76, 170.10],\n", + " index=years)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the curves look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "site85.plot(label='SI 85')\n", + "site65.plot(label='SI 65')\n", + "site45.plot(label='SI 45')\n", + "decorate(xlabel='Time (years)',\n", + " ylabel='Height (feet)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For my examples I'll work with the SI 65 data; as an exercise, you can run the notebook again with either of the other curves." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "data = site65" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model 1\n", + "\n", + "As a starting place, let's assume that the ability of the tree to gain mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", + "\n", + "$$ m_{n+1} = m_n + \\alpha A$$\n", + "\n", + "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", + "\n", + "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power:\n", + "\n", + "$$ m = \\beta h^D $$\n", + "\n", + "where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. We'll start by assuming $D=3$, but we'll revisit that assumption.\n", + "\n", + "Finally, we'll assume that area is proportional to height squared:\n", + "\n", + "$$ A = \\gamma h^2$$\n", + "\n", + "I'll specify height in feet, and choose units for mass and area so that $\\beta=1$ and $\\gamma=1$.\n", + "\n", + "Putting all that together, we can write a difference equation for height:\n", + "\n", + "$$ h_{n+1}^D = h_n^D + \\alpha h_n^2 $$\n", + "\n", + "Now let's simulate this system. Here's a system object with the parameters and initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 7\n", + "dim = 3\n", + "\n", + "t_0 = data.index[0]\n", + "h_0 = data[t_0]\n", + "t_end = data.index[-1]\n", + "\n", + "system = System(alpha=alpha, \n", + " dim=dim, \n", + " h_0=h_0, \n", + " t_0=t_0, \n", + " t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's an update function that takes the current height as a parameter and returns the height during the next time step." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def update(height, t, system):\n", + " \"\"\"Update height based on geometric model.\n", + " \n", + " height: current height in feet\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " area = height**2\n", + " mass = height**system.dim\n", + " mass += system.alpha * area\n", + " return mass**(1/system.dim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll test the update function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "update(h_0, t_0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's our usual version of `run_simulation`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.h_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end-1):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's how we run it." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "results = run_simulation(system, update)\n", + "results.tail()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(results, data):\n", + " results.plot(style=':', label='model', color='gray')\n", + " data.plot(label='data')\n", + " decorate(xlabel='Time (years)',\n", + " ylabel='Height (feet)')\n", + " \n", + "plot_results(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model converges to a straight line.\n", + "\n", + "I chose the value of `alpha` to fit the data as well as I could, but it is clear that the data have curvature that's not captured by the model.\n", + "\n", + "Here are the errors, that is, the differences between the model and the data." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "errors = results - data\n", + "errors.dropna()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the mean absolute error." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def mean_abs_error(results, data):\n", + " return (results-data).abs().mean()\n", + "\n", + "mean_abs_error(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This model might explain why the height of a tree grows roughly linearly:\n", + "\n", + "1. If area is proportional to $h^2$ and mass is proportional to $h^3$, and\n", + "\n", + "2. Change in mass is proportional to area, and\n", + "\n", + "3. Height grows linearly, then\n", + "\n", + "4. Area grows in proportion to $h^2$, and\n", + "\n", + "5. Mass grows in proportion to $h^3$.\n", + "\n", + "If the goal is to explain (approximate) linear growth, we might stop there. But this model does not fit the data particularly well, and it implies that trees could keep growing forever.\n", + "\n", + "So we might want to do better." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As a second attempt, let's suppose that we don't know $D$. In fact, we don't, because trees are not like simple solids; they are more like fractals, which have [fractal dimension](https://en.wikipedia.org/wiki/Fractal_dimension).\n", + "\n", + "I would expect the fractal dimension of a tree to be between 2 and 3, so I'll guess 2.5." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 7\n", + "dim = 2.5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll wrap the code from the previous section is a function that takes the parameters as inputs and makes a `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " \"\"\"Makes a System object.\n", + " \n", + " params: sequence of alpha, dim\n", + " data: Series\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " alpha, dim = params\n", + " \n", + " t_0 = data.index[0]\n", + " t_end = data.index[-1]\n", + " h_0 = data[t_0]\n", + "\n", + " return System(alpha=alpha, dim=dim, \n", + " h_0=h_0, t_0=t_0, t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we use it." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "params = alpha, dim\n", + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With different values for the parameters, we get curves with different behavior. Here are a few that I chose by hand." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def run_and_plot(alpha, dim, data):\n", + " params = alpha, dim\n", + " system = make_system(params, data)\n", + " results = run_simulation(system, update)\n", + " results.plot(style=':', color='gray', label='_nolegend')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "run_and_plot(0.145, 2, data)\n", + "run_and_plot(0.58, 2.4, data)\n", + "run_and_plot(2.8, 2.8, data)\n", + "run_and_plot(6.6, 3, data)\n", + "run_and_plot(15.5, 3.2, data)\n", + "run_and_plot(38, 3.4, data)\n", + "\n", + "data.plot(label='data')\n", + "decorate(xlabel='Time (years)',\n", + " ylabel='Height (feet)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To find the parameters that best fit the data, I'll use `leastsq`.\n", + "\n", + "We need an error function that takes parameters and returns errors:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(params, data, update_func):\n", + " \"\"\"Runs the model and returns errors.\n", + " \n", + " params: sequence of alpha, dim\n", + " data: Series\n", + " update_func: function object\n", + " \n", + " returns: Series of errors\n", + " \"\"\"\n", + " print(params)\n", + " system = make_system(params, data)\n", + " results = run_simulation(system, update_func)\n", + " return (results - data).dropna()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's how we use it:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "errors = error_func(params, data, update)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can pass `error_func` to `leastsq`, which finds the parameters that minimize the squares of the errors." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "best_params, details = leastsq(error_func, params, data, update)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "print(details.success)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the best parameters we found, we can run the model and plot the results." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(best_params, data)\n", + "results = run_simulation(system, update)\n", + "plot_results(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The mean absolute error is better than for Model 1, but that doesn't mean much. The model still doesn't fit the data well." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "mean_abs_error(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the estimated fractal dimension is 3.11, which doesn't seem likely.\n", + "\n", + "Let's try one more thing." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Model 3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Models 1 and 2 imply that trees can grow forever, but we know that's not true. As trees get taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", + "\n", + "We can model this effect by adding a term to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", + "\n", + "$ m_{n+1} = m_n + \\alpha A $ \n", + "\n", + "Let's assume\n", + "\n", + "$ m_{n+1} = m_n + \\alpha A (1 - h / K) $\n", + "\n", + "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", + "\n", + "Here's what the implementation of this model looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "alpha = 2.0\n", + "dim = 2.5\n", + "K = 150\n", + "\n", + "params = [alpha, dim, K]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an updated version of `make_system`" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " \"\"\"Makes a System object.\n", + " \n", + " params: sequence of alpha, dim, K\n", + " data: Series\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " alpha, dim, K = params\n", + " \n", + " t_0 = data.index[0]\n", + " t_end = data.index[-1]\n", + " h_0 = data[t_0]\n", + "\n", + " return System(alpha=alpha, dim=dim, K=K, \n", + " h_0=h_0, t_0=t_0, t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the new `System` object." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's the new update function." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def update3(height, t, system):\n", + " \"\"\"Update height based on geometric model with growth limiting term.\n", + " \n", + " height: current height in feet\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " area = height**2\n", + " mass = height**system.dim\n", + " mass += system.alpha * area * (1 - height/system.K)\n", + " return mass**(1/system.dim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As always, we'll test the update function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "update3(h_0, t_0, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we'll test the error function with the new update function." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "error_func(params, data, update3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's search for the best parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "best_params, details = leastsq(error_func, params, data, update3)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "details.success" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With these parameters, we can fit the data much better." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(best_params, data)\n", + "results = run_simulation(system, update3)\n", + "plot_results(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And the mean absolute error is substantially smaller." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "mean_abs_error(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The estimated fractal dimension is about 2.6, which is plausible; it suggests that if you double the height of the tree, the mass grows by a factor of $2^{2.6}$" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "2**2.6" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In other words, the mass of the tree scales faster than area, but not as fast as it would for a solid 3-D object.\n", + "\n", + "What is this model good for?\n", + "\n", + "1) It offers a possible explanation for the shape of tree growth curves.\n", + "\n", + "2) It provides a way to estimate the fractal dimension of a tree based on a growth curve (probably with different values for different species).\n", + "\n", + "3) It might provide a way to predict future growth of a tree, based on measurements of past growth. As with the logistic population model, this would probably only work if we have observed the part of the curve where the growth rate starts to decline." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Analysis\n", + "\n", + "With some help from my colleague, John Geddes, we can do some analysis.\n", + "\n", + "Starting with the difference equation in terms of mass:\n", + " \n", + "$m_{n+1} = m_n + \\alpha A (1 - h / K) $\n", + "\n", + "We can write the corresponding differential equation:\n", + "\n", + "(1) $ \\frac{dm}{dt} = \\alpha A (1 - h / K) $\n", + "\n", + "With\n", + "\n", + "(2) $A = h^2$\n", + "\n", + "and\n", + "\n", + "(3) $m = h^D$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Taking the derivative of the last equation yields\n", + "\n", + "(4) $\\frac{dm}{dt} = D h^{D-1} \\frac{dh}{dt}$\n", + "\n", + "Combining (1), (2), and (4), we can write a differential equation for $h$:\n", + "\n", + "(5) $\\frac{dh}{dt} = \\frac{\\alpha}{D} h^{3-D} (1 - h/K)$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's consider two cases:\n", + "\n", + "* With infinite $K$, the factor $(1 - h/K)$ approaches 1, so we have Model 2.\n", + "\n", + "* With finite $K$, we have Model 3." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Model 2\n", + "\n", + "Within Model 2, we'll consider two special cases, with $D=2$ and $D=3$.\n", + "\n", + "With $D=2$, we have\n", + "\n", + "$\\frac{dh}{dt} = \\frac{\\alpha}{2} h$\n", + "\n", + "which yields exponential growth with parameter $\\alpha/2$.\n", + "\n", + "With $D=3$, we have Model 1, with this equation:\n", + "\n", + "$\\frac{dh}{dt} = \\frac{\\alpha}{3}$\n", + "\n", + "which yields linear growth with parameter $\\alpha/3$. This result explains why Model 1 is linear." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Model 3\n", + "\n", + "Within Model 3, we'll consider two special cases, with $D=2$ and $D=3$.\n", + "\n", + "With $D=2$, we have\n", + "\n", + "$\\frac{dh}{dt} = \\frac{\\alpha}{2} h (1 - h/K)$\n", + "\n", + "which yields logisitic growth with parameters $r = \\alpha/2$ and $K$.\n", + "\n", + "With $D=3$, we have\n", + "\n", + "$\\frac{dh}{dt} = \\frac{\\alpha}{3} (1 - h/K)$\n", + "\n", + "which yields a first order step response; that is, it converges to $K$ like a negative exponential:\n", + "\n", + "$ h(t) = c \\exp(-\\frac{\\alpha}{3K} t) + K $\n", + "\n", + "where $c$ is a constant that depends on the initial conditions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Open Exercise** Find an analytic solution when $D$ is between 2 and 3, and compare it to the data. Note: The parameters we estimated for the difference equation might not be right for the differential equation." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Additional resources:\n", + "\n", + "Garcia, [A stochastic differential equation model for the\n", + "height growth of forest stands](http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=664FED1E46ABCBF6E16741C294B79976?doi=10.1.1.608.81&rep=rep1&type=pdf)\n", + "\n", + "[EasySDE software and data](http://forestgrowth.unbc.ca/)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/wall.ipynb b/examples/wall.ipynb new file mode 100644 index 00000000..2fd4d5ba --- /dev/null +++ b/examples/wall.ipynb @@ -0,0 +1,629 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Thermal behavior of a wall" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/main/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This case study is based on Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, 15 January 2017, Pages 398-409, [which I downloaded here](https://www.sciencedirect.com/science/article/pii/S0378778816313056).\n", + " \n", + "The authors put their paper under a Creative Commons license, and [make their data available here](http://discovery.ucl.ac.uk/1526521). I thank them for their commitment to open, reproducible science, which made this case study possible.\n", + "\n", + "The goal of their paper is to model the thermal behavior of a wall as a step toward understanding the \"performance gap between the expected energy use of buildings and their measured energy use\". The wall they study is identified as the exterior wall of an office building in central London, [not unlike this one](https://www.google.com/maps/@51.5269375,-0.1303666,3a,75y,90h,88.17t/data=!3m6!1e1!3m4!1sAoAXzN0mbGF9acaVEgUdDA!2e0!7i13312!8i6656)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following figure shows the scenario and their model:\n", + "\n", + "![Figure 2](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr2.jpg)\n", + "\n", + "On the interior and exterior surfaces of the wall, they measure temperature and heat flux over a period of three days. They model the wall using two thermal masses connected to the surfaces, and to each other, by thermal resistors.\n", + "\n", + "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", + "\n", + "The primary result is a comparison of two models: the one shown here with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tempting as it is, I will not replicate their method for estimating the parameters. Rather, I will implement their model and run it with their estimated parameters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells download and read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/data/DataOWall.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('DataOWall.csv', \n", + " parse_dates=[0], index_col=0, \n", + " header=0, skiprows=[1,2])\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The index contains Pandas `Timestamp` objects, which is good for dealing with real-world dates and times, but not as good for running the simulations, so I'm going to convert to seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "timestamp_0 = data.index[0]\n", + "timestamp_0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Subtracting the first `Timestamp` yields `Timedelta` objects:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "time_deltas = data.index - timestamp_0\n", + "time_deltas.dtype" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we can convert to seconds and replace the index." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "data.index = time_deltas.days * 86400 + time_deltas.seconds\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The timesteps are all 5 minutes:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "np.all(np.diff(data.index) == 300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the measured fluxes." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "data.Q_in.plot(color='C2')\n", + "data.Q_out.plot(color='C0')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the measured temperatures." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "data.T_int.plot(color='C2')\n", + "data.T_ext.plot(color='C0')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Temperature (degC)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making the System object\n", + "\n", + "`params` is a sequence with the [estimated parameters from the paper](https://www.sciencedirect.com/science/article/pii/S0378778816313056#tbl0005)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "R1 = 0.076 # m**2 * K / W,\n", + "R2 = 0.272 # m**2 * K / W,\n", + "R3 = 0.078 # m**2 * K / W,\n", + "C1 = 212900 # J / m**2 / K,\n", + "C2 = 113100 # J / m**2 / K" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "params = R1, R2, R3, C1, C2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll pass `params` to `make_system`, which computes `init`, packs the parameters into `Series` objects, and computes the interpolation functions." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " \"\"\"Makes a System object for the given conditions.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " R1, R2, R3, C1, C2 = params\n", + " \n", + " init = State(T_C1 = 16.11, T_C2 = 15.27)\n", + " \n", + " t_end = data.index[-1]\n", + " \n", + " return System(init=init,\n", + " R=(R1, R2, R3),\n", + " C=(C1, C2),\n", + " T_int_func=interpolate(data.T_int),\n", + " T_ext_func=interpolate(data.T_ext),\n", + " t_end=t_end)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make a `System` object" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the interpolation function:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "system.T_ext_func(0), system.T_ext_func(150), system.T_ext_func(300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Implementing the model\n", + "\n", + "Next we need a slope function that takes instantaneous values of the two internal temperatures and computes their time rates of change.\n", + "\n", + "The slope function gets called two ways.\n", + "\n", + "* When we call it directly, `state` is a `State` object and the values it contains have units.\n", + "\n", + "* When `run_solve_ivp` calls it, `state` is an array and the values it contains don't have units.\n", + "\n", + "In the second case, we have to apply the units before attempting the computation. `require_units` applies units if necessary:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function computes the fluxes between the four zones." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_flux(t, state, system):\n", + " \"\"\"Compute the fluxes between the walls surfaces and the internal masses.\n", + " \n", + " state: State with T_C1 and T_C2\n", + " t: time in seconds\n", + " system: System with interpolated measurements and the R Series\n", + " \n", + " returns: Series of fluxes\n", + " \"\"\" \n", + " # unpack the temperatures\n", + " T_C1, T_C2 = state\n", + " \n", + " # compute a series of temperatures from inside out\n", + " T_int = system.T_int_func(t)\n", + " T_ext = system.T_ext_func(t)\n", + " \n", + " T = [T_int, T_C1, T_C2, T_ext]\n", + " \n", + " # compute differences of adjacent temperatures\n", + " T_diff = np.diff(T)\n", + "\n", + " # compute fluxes between adjacent compartments\n", + " Q = T_diff / system.R\n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it like this." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "compute_flux(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a slope function that computes derivatives of `T_C1` and `T_C2`" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " Q = compute_flux(t, state, system)\n", + "\n", + " # compute the net flux in each node\n", + " Q_diff = np.diff(Q)\n", + " \n", + " # compute the rate of change of temperature\n", + " dQdt = Q_diff / system.C\n", + " return dQdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "slopes = slope_func(0, system.init, system)\n", + "slopes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's run the simulation, generating estimates for the time steps in the data." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " t_eval=data.index)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(results, data):\n", + " data.T_int.plot(color='C2')\n", + " results.T_C1.plot(color='C3')\n", + " results.T_C2.plot(color='C1')\n", + " data.T_ext.plot(color='C0')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Temperature (degC)')\n", + " \n", + "plot_results(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results are similar to what's in the paper:\n", + "\n", + "![Figure 5](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr5.jpg). \n", + "\n", + "To get the estimated fluxes, we have to go through the results and basically do the flux calculation again." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "def recompute_fluxes(results, system):\n", + " \"\"\"Compute fluxes between wall surfaces and internal masses.\n", + " \n", + " results: Timeframe with T_C1 and T_C2\n", + " system: System object\n", + " \n", + " returns: Timeframe with Q_in and Q_out\n", + " \"\"\"\n", + " Q_frame = TimeFrame(index=results.index, \n", + " columns=['Q_in', 'Q_out'])\n", + " \n", + " for t, row in results.iterrows():\n", + " Q = compute_flux(t, row, system)\n", + " Q_frame.loc[t] = (-Q[0], -Q[2])\n", + " \n", + " return Q_frame" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "Q_frame = recompute_fluxes(results, system)\n", + "Q_frame.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see how the estimates compare to the data." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_Q_in(frame, data):\n", + " frame.Q_in.plot(color='gray')\n", + " data.Q_in.plot(color='C2')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')\n", + " \n", + "plot_Q_in(Q_frame, data)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_Q_out(frame, data):\n", + " frame.Q_out.plot(color='gray')\n", + " data.Q_out.plot(color='C0')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')\n", + " \n", + "plot_Q_out(Q_frame, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results are also similar to what's in the paper (the bottom row):\n", + "\n", + "![Figure 3](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr3.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/wall_soln_with_fsolve.ipynb b/examples/wall_soln_with_fsolve.ipynb new file mode 100644 index 00000000..e5d972e6 --- /dev/null +++ b/examples/wall_soln_with_fsolve.ipynb @@ -0,0 +1,1021 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Thermal behavior of a wall" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This case study is based on Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, 15 January 2017, Pages 398-409, [which I downloaded here](https://www.sciencedirect.com/science/article/pii/S0378778816313056).\n", + " \n", + "The authors put their paper under a Creative Commons license, and [make their data available here](http://discovery.ucl.ac.uk/1526521). I thank them for their commitment to open, reproducible science, which made this case study possible.\n", + "\n", + "The goal of their paper is to model the thermal behavior of a wall as a step toward understanding the \"performance gap between the expected energy use of buildings and their measured energy use\". The wall they study is identified as the exterior wall of an office building in central London, [not unlike this one](https://www.google.com/maps/@51.5269375,-0.1303666,3a,75y,90h,88.17t/data=!3m6!1e1!3m4!1sAoAXzN0mbGF9acaVEgUdDA!2e0!7i13312!8i6656)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following figure shows the scenario and their model:\n", + "\n", + "![Figure 2](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr2.jpg)\n", + "\n", + "On the interior and exterior surfaces of the wall, they measure temperature and heat flux over a period of three days. They model the wall using two thermal masses connected to the surfaces, and to each other, by thermal resistors.\n", + "\n", + "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", + "\n", + "The primary result is a comparison of two models: the one shown here with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tempting as it is, I will not replicate their method for estimating the parameters. Rather, I will\n", + "\n", + "1. Implement their model and run it with their estimated parameters, to replicate the results, and \n", + "\n", + "2. Use SciPy's `leastsq` to see if I can find parameters that a yield lower sum of squared errors.\n", + "\n", + "`leastsq` is a wrapper for some venerable FORTRAN code that runs [\"a modification of the Levenberg-Marquardt algorithm\"](https://www.math.utah.edu/software/minpack/minpack/lmdif.html), which is one of my favorites ([really](http://allendowney.com/research/model)).\n", + "\n", + "Implementing their model in the ModSimPy framework turns out to be straightforward. The simulations run fast enough even when we carry units through the computation. And the results are visually similar to the ones in the original paper.\n", + "\n", + "I find that `leastsq` is not able to find parameters that yield substantially better results, which suggest that the estimates in the paper are at least locally optimal." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loading the data\n", + "\n", + "First I'll load the units we need from Pint." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "m = units.meter\n", + "K = units.kelvin\n", + "W = units.watt\n", + "J = units.joule\n", + "degC = units.celsius\n", + "s = units.second" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Read the data." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSim/main/data/DataOWall.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('DataOWall.csv', \n", + " parse_dates=[0], index_col=0, \n", + " header=0, skiprows=[1,2])\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The index contains Pandas `Timestamp` objects, which is good for dealing with real-world dates and times, but not as good for running the simulations, so I'm going to convert to seconds." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "timestamp_0 = data.index[0]\n", + "timestamp_0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Subtracting the first `Timestamp` yields `Timedelta` objects:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "time_deltas = data.index - timestamp_0\n", + "time_deltas" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then we can convert to seconds and replace the index." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "data.index = time_deltas.days * 86400 + time_deltas.seconds\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The timesteps are all 5 minutes:" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "np.all(np.diff(data.index) == 300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mark the columns of the `Dataframe` with units." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "data.Q_in.units = W / m**2\n", + "data.Q_out.units = W / m**2\n", + "data.T_int.units = degC\n", + "data.T_ext.units = degC" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the measured fluxes." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "data.Q_in.plot(color='C2')\n", + "data.Q_out.plot(color='C0')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot the measured temperatures." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "data.T_int.plot(color='C2')\n", + "data.T_ext.plot(color='C0')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Temperature (degC)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Params and System objects\n", + "\n", + "Here's a `Params` object with the [estimated parameters from the paper](https://www.sciencedirect.com/science/article/pii/S0378778816313056#tbl0005)." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "R1 = 0.076 # m**2 * K / W,\n", + "R2 = 0.272 # m**2 * K / W,\n", + "R3 = 0.078 # m**2 * K / W,\n", + "C1 = 212900 # J / m**2 / K,\n", + "C2 = 113100 # J / m**2 / K" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "params = R1, R2, R3, C1, C2" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [], + "source": [ + "params = 0.07, R2, R3, C1, C2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I'll pass the `Params` object `make_system`, which computes `init`, packs the parameters into `Series` objects, and computes the interpolation functions." + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [], + "source": [ + "def make_system(params, data):\n", + " \"\"\"Makes a System object for the given conditions.\n", + " \n", + " params: Params object\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " R1, R2, R3, C1, C2 = params\n", + " \n", + " init = State(T_C1 = 16.11, T_C2 = 15.27)\n", + " \n", + " ts = data.index\n", + " t_end = ts[-1] * s\n", + " \n", + " return System(init=init,\n", + " R= (R1, R2, R3),\n", + " C= (C1, C2),\n", + " T_int_func=interpolate(data.T_int),\n", + " T_ext_func=interpolate(data.T_ext),\n", + " unit_temp=degC,\n", + " t_end=t_end, ts=ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Make a `System` object" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(params, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the interpolation function:" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [], + "source": [ + "system.T_ext_func(0), system.T_ext_func(150), system.T_ext_func(300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Implementing the model\n", + "\n", + "Next we need a slope function that takes instantaneous values of the two internal temperatures and computes their time rates of change.\n", + "\n", + "The slope function gets called two ways.\n", + "\n", + "* When we call it directly, `state` is a `State` object and the values it contains have units.\n", + "\n", + "* When `run_solve_ivp` calls it, `state` is an array and the values it contains don't have units.\n", + "\n", + "In the second case, we have to apply the units before attempting the computation. `require_units` applies units if necessary:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function computes the fluxes between the four zones." + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [], + "source": [ + "def compute_flux(t, state, system):\n", + " \"\"\"Compute the fluxes between the walls surfaces and the internal masses.\n", + " \n", + " state: State with T_C1 and T_C2\n", + " t: time in seconds\n", + " system: System with interpolated measurements and the R Series\n", + " \n", + " returns: Series of fluxes\n", + " \"\"\" \n", + " # unpack the temperatures\n", + " T_C1, T_C2 = state\n", + " \n", + " # compute a series of temperatures from inside out\n", + " T_int = system.T_int_func(t)\n", + " T_ext = system.T_ext_func(t)\n", + " \n", + " T = [T_int, T_C1, T_C2, T_ext]\n", + " \n", + " # compute differences of adjacent temperatures\n", + " T_diff = np.diff(T)\n", + "\n", + " # compute fluxes between adjacent compartments\n", + " Q = T_diff / system.R\n", + " return Q" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can test it like this." + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [], + "source": [ + "compute_flux(0, system.init, system)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a slope function that computes derivatives of `T_C1` and `T_C2`" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " \"\"\"Compute derivatives of the state.\n", + " \n", + " state: position, velocity\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: derivatives of y and v\n", + " \"\"\"\n", + " Q = compute_flux(t, state, system)\n", + "\n", + " # compute the net flux in each node\n", + " Q_diff = np.diff(Q)\n", + " \n", + " # compute the rate of change of temperature\n", + " dQdt = Q_diff / system.C\n", + " return dQdt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test the slope function with the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [], + "source": [ + "slopes = slope_func(system.ts[0], system.init, system)\n", + "slopes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's run the simulation, generating estimates for the time steps in the data." + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func,\n", + " t_eval=data.index)\n", + "details.message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like." + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_results(results, data):\n", + " data.T_int.plot(color='C2')\n", + " results.T_C1.plot(color='C3')\n", + " results.T_C2.plot(color='C1')\n", + " data.T_ext.plot(color='C0')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Temperature (degC)')\n", + " \n", + "plot_results(results, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results are similar to what's in the paper:\n", + "\n", + "![Figure 5](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr5.jpg). \n", + "\n", + "To get the estimated fluxes, we have to go through the results and basically do the flux calculation again." + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "def recompute_fluxes(results, system):\n", + " \"\"\"Compute fluxes between wall surfaces and internal masses.\n", + " \n", + " results: Timeframe with T_C1 and T_C2\n", + " system: System object\n", + " \n", + " returns: Timeframe with Q_in and Q_out\n", + " \"\"\"\n", + " Q_frame = TimeFrame(index=results.index, \n", + " columns=['Q_in', 'Q_out'])\n", + " \n", + " for t, row in results.iterrows():\n", + " Q = compute_flux(t, row, system)\n", + " Q_frame.loc[t] = (-Q[0], -Q[2])\n", + " \n", + " return Q_frame" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [], + "source": [ + "Q_frame = recompute_fluxes(results, system)\n", + "Q_frame.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see how the estimates compare to the data." + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_Q_in(frame, data):\n", + " frame.Q_in.plot(color='gray')\n", + " data.Q_in.plot(color='C2')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')\n", + " \n", + "plot_Q_in(Q_frame, data)" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_Q_out(frame, data):\n", + " frame.Q_out.plot(color='gray')\n", + " data.Q_out.plot(color='C0')\n", + " decorate(xlabel='Time (s)',\n", + " ylabel='Heat flux (W/$m^2$)')\n", + " \n", + "plot_Q_out(Q_frame, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These results are also similar to what's in the paper (the bottom row):\n", + "\n", + "![Figure 3](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr3.jpg)" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": {}, + "outputs": [], + "source": [ + "error_Q_in = Q_frame.Q_in - data.Q_in\n", + "error_Q_out = Q_frame.Q_out - data.Q_out\n", + "\n", + "errors = np.hstack([error_Q_in, error_Q_out])\n", + "errors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's the sum of the squared errors." + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": {}, + "outputs": [], + "source": [ + "np.sum(errors**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Estimating parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's see if we can do any better than the parameters in the paper." + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [], + "source": [ + "params = R1, R2, R3, C1, C2\n", + "params" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [], + "source": [ + "params = R1, 0.27, R3, C1, C2\n", + "params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's an error function that takes a hypothetical set of parameters, runs the simulation, and returns an array of errors." + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": {}, + "outputs": [], + "source": [ + "def error_func(params, data):\n", + " \"\"\"Run a simulation and return an array of errors.\n", + " \n", + " params: Params object or array\n", + " data: DataFrame\n", + " \n", + " returns: array of float\n", + " \"\"\"\n", + " print(params)\n", + " system = make_system(params, data) \n", + " results, details = run_solve_ivp(system, slope_func, \n", + " t_eval=data.index)\n", + " Q_frame = recompute_fluxes(results, system)\n", + " error_Q_in = Q_frame.Q_in - data.Q_in\n", + " error_Q_out = Q_frame.Q_out - data.Q_out\n", + "\n", + " errors = np.hstack([error_Q_in, error_Q_out])\n", + " print(np.sum(errors**2))\n", + " return errors" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Testing `error_func`." + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": {}, + "outputs": [], + "source": [ + "errors = error_func(params, data)" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": {}, + "outputs": [], + "source": [ + "np.sum(errors**2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pass `error_func` to `leastsq` to see if it can do any better." + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [], + "source": [ + "best_params, details = leastsq(error_func, params, data)" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [], + "source": [ + "details.ier" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [], + "source": [ + "print(details.mesg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The best params are only slightly different from the starting place. " + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": {}, + "outputs": [], + "source": [ + "best_params" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "best_params - params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what the results look like with the `best_params`." + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [], + "source": [ + "system = make_system(best_params, data)\n", + "system = remove_units(system)\n", + "\n", + "results, details = run_solve_ivp(system, slope_func, t_eval=system.ts)\n", + "Q_frame = recompute_fluxes(results, system)\n", + "errors = compute_error(Q_frame, data)\n", + "print(np.sum(errors**2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The sum of squared errors is only slightly smaller.\n", + "\n", + "And the results are visually similar." + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "plot_Q_in(Q_frame, data)" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "plot_Q_out(Q_frame, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Try starting the model with a different set of parameters and see if it moves toward the parameters in the paper.\n", + "\n", + "I found that no matter where I start, `leastsq` doesn't move far, which suggests that it is not able to optimize the parameters effectively." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Notes\n", + "\n", + "Notes on working with degC.\n", + "\n", + "Usually I construct a `Quantity` object by multiplying a number and a unit. With degC, that doesn't work; you get\n", + "\n", + "```\n", + "OffsetUnitCalculusError: Ambiguous operation with offset unit (degC).\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [], + "source": [ + "#16.11 * C " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The problem is that it doesn't know whether you want a temperature measurement or a temperature difference.\n", + "\n", + "You can create a temperature measurement like this." + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": {}, + "outputs": [], + "source": [ + "T = Quantity(16.11, degC)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you convert to Kelvin, it does the right thing." + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "T.to(K)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you subtract temperatures, the results is a temperature difference, indicated by the units." + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [], + "source": [ + "diff = T - 273.15 * K" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you convert a temperature difference to Kelvin, it does the right thing." + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [], + "source": [ + "diff.to(K)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/yoyo.ipynb b/examples/yoyo.ipynb new file mode 100644 index 00000000..8ecf3111 --- /dev/null +++ b/examples/yoyo.ipynb @@ -0,0 +1,607 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simulating a Yo-Yo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Yo-yo\n", + "\n", + "Suppose you are holding a yo-yo with a length of string wound around its axle, and you drop it while holding the end of the string stationary. As gravity accelerates the yo-yo downward, tension in the string exerts a force upward. Since this force acts on a point offset from the center of mass, it exerts a torque that causes the yo-yo to spin.\n", + "\n", + "The following diagram shows the forces on the yo-yo and the resulting torque. The outer shaded area shows the body of the yo-yo. The inner shaded area shows the rolled up string, the radius of which changes as the yo-yo unrolls.\n", + "\n", + "![Diagram of a yo-yo showing forces due to gravity and tension in the\n", + "string, the lever arm of tension, and the resulting\n", + "torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/yoyo.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this system, we can't figure out the linear and angular acceleration independently; we have to solve a system of equations:\n", + "\n", + "$\\sum F = m a $\n", + "\n", + "$\\sum \\tau = I \\alpha$\n", + "\n", + "where the summations indicate that we are adding up forces and torques.\n", + "\n", + "As in the previous examples, linear and angular velocity are related because of the way the string unrolls:\n", + "\n", + "$\\frac{dy}{dt} = -r \\frac{d \\theta}{dt} $\n", + "\n", + "In this example, the linear and angular accelerations have opposite sign. As the yo-yo rotates counter-clockwise, $\\theta$ increases and $y$, which is the length of the rolled part of the string, decreases." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Taking the derivative of both sides yields a similar relationship between linear and angular acceleration:\n", + "\n", + "$\\frac{d^2 y}{dt^2} = -r \\frac{d^2 \\theta}{dt^2} $\n", + "\n", + "Which we can write more concisely:\n", + "\n", + "$ a = -r \\alpha $\n", + "\n", + "This relationship is not a general law of nature; it is specific to scenarios like this where there is rolling without stretching or slipping.\n", + "\n", + "Because of the way we've set up the problem, $y$ actually has two meanings: it represents the length of the rolled string and the height of the yo-yo, which decreases as the yo-yo falls. Similarly, $a$ represents acceleration in the length of the rolled string and the height of the yo-yo.\n", + "\n", + "We can compute the acceleration of the yo-yo by adding up the linear forces:\n", + "\n", + "$\\sum F = T - mg = ma $\n", + "\n", + "Where $T$ is positive because the tension force points up, and $mg$ is negative because gravity points down." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because gravity acts on the center of mass, it creates no torque, so the only torque is due to tension:\n", + "\n", + "$\\sum \\tau = T r = I \\alpha $\n", + "\n", + "Positive (upward) tension yields positive (counter-clockwise) angular acceleration.\n", + "\n", + "Now we have three equations in three unknowns, $T$, $a$, and $\\alpha$, with $I$, $m$, $g$, and $r$ as known parameters. We could solve these equations by hand, but we can also get SymPy to do it for us." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import symbols, Eq, solve\n", + "\n", + "T, a, alpha, I, m, g, r = symbols('T a alpha I m g r')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "eq1 = Eq(a, -r * alpha)\n", + "eq1" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "eq2 = Eq(T - m * g, m * a)\n", + "eq2" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "eq3 = Eq(T * r, I * alpha)\n", + "eq3" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "soln = solve([eq1, eq2, eq3], [T, a, alpha])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "soln[T]" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "soln[a]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "soln[alpha]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The results are\n", + "\n", + "$T = m g I / I^* $\n", + "\n", + "$a = -m g r^2 / I^* $\n", + "\n", + "$\\alpha = m g r / I^* $\n", + "\n", + "where $I^*$ is the augmented moment of inertia, $I + m r^2$.\n", + "\n", + "You can also see [the derivation of these equations in this video](https://www.youtube.com/watch?v=chC7xVDKl4Q)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use these equations for $a$ and $\\alpha$ to write a slope function and simulate this system." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Exercise:** Simulate the descent of a yo-yo. How long does it take to reach the end of the string?\n", + "\n", + "Here are the system parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "Rmin = 8e-3 # m\n", + "Rmax = 16e-3 # m\n", + "Rout = 35e-3 # m\n", + "mass = 50e-3 # kg\n", + "L = 1 # m\n", + "g = 9.8 # m / s**2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* `Rmin` is the radius of the axle. `Rmax` is the radius of the axle plus rolled string.\n", + "\n", + "* `Rout` is the radius of the yo-yo body. `mass` is the total mass of the yo-yo, ignoring the string. \n", + "\n", + "* `L` is the length of the string.\n", + "\n", + "* `g` is the acceleration of gravity." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "1 / (Rmax)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Based on these parameters, we can compute the moment of inertia for the yo-yo, modeling it as a solid cylinder with uniform density ([see here](https://en.wikipedia.org/wiki/List_of_moments_of_inertia)).\n", + "\n", + "In reality, the distribution of weight in a yo-yo is often designed to achieve desired effects. But we'll keep it simple." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "I = mass * Rout**2 / 2\n", + "I" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can compute `k`, which is the constant that determines how the radius of the spooled string decreases as it unwinds." + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "k = (Rmax**2 - Rmin**2) / 2 / L \n", + "k" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The state variables we'll use are angle, `theta`, angular velocity, `omega`, the length of the spooled string, `y`, and the linear velocity of the yo-yo, `v`.\n", + "\n", + "Here is a `State` object with the the initial conditions." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "init = State(theta=0, omega=0, y=L, v=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's a `System` object with `init` and `t_end` (chosen to be longer than I expect for the yo-yo to drop 1 m)." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "system = System(init=init, t_end=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write a slope function for this system, using these results from the book:\n", + "\n", + "$ r = \\sqrt{2 k y + R_{min}^2} $ \n", + "\n", + "$ T = m g I / I^* $\n", + "\n", + "$ a = -m g r^2 / I^* $\n", + "\n", + "$ \\alpha = m g r / I^* $\n", + "\n", + "where $I^*$ is the augmented moment of inertia, $I + m r^2$." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your slope function with the initial conditions.\n", + "The results should be approximately\n", + "\n", + "```\n", + "0, 180.5, 0, -2.9\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the initial acceleration is substantially smaller than `g` because the yo-yo has to start spinning before it can fall.\n", + "\n", + "Write an event function that will stop the simulation when `y` is 0." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Test your event function:" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Then run the simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check the final state. If things have gone according to plan, the final value of `y` should be close to 0." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How long does it take for the yo-yo to fall 1 m? Does the answer seem reasonable?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells plot the results.\n", + "\n", + "`theta` should increase and accelerate." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "results.theta.plot(color='C0', label='theta')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Angle (rad)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`y` should decrease and accelerate down." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "results.y.plot(color='C1', label='y')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Length (m)')\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plot velocity as a function of time; is the acceleration constant?" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "results.v.plot(label='velocity', color='C3')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Velocity (m/s)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use `gradient` to estimate the derivative of `v`. How does the acceleration of the yo-yo compare to `g`?" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "a = gradient(results.v)\n", + "a.plot(label='acceleration', color='C4')\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Acceleration (m/$s^2$)')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we can use the formula for `r` to plot the radius of the spooled thread over time." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "r = np.sqrt(2*k*results.y + Rmin**2)\n", + "r.plot(label='radius')\n", + "\n", + "decorate(xlabel='Time (s)',\n", + " ylabel='Radius of spooled thread (m)')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 95a8bc6987ad467cfc6bed3745265c19cb0a8d0a Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 09:47:43 -0500 Subject: [PATCH 054/144] Updating examples --- .../{hiv_model_soln.ipynb => hiv_model.ipynb} | 0 examples/wall_soln_with_fsolve.ipynb | 1021 ----------------- 2 files changed, 1021 deletions(-) rename examples/{hiv_model_soln.ipynb => hiv_model.ipynb} (100%) delete mode 100644 examples/wall_soln_with_fsolve.ipynb diff --git a/examples/hiv_model_soln.ipynb b/examples/hiv_model.ipynb similarity index 100% rename from examples/hiv_model_soln.ipynb rename to examples/hiv_model.ipynb diff --git a/examples/wall_soln_with_fsolve.ipynb b/examples/wall_soln_with_fsolve.ipynb deleted file mode 100644 index e5d972e6..00000000 --- a/examples/wall_soln_with_fsolve.ipynb +++ /dev/null @@ -1,1021 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Thermal behavior of a wall" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# download modsim.py if necessary\n", - "\n", - "from os.path import basename, exists\n", - "\n", - "def download(url):\n", - " filename = basename(url)\n", - " if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " local, _ = urlretrieve(url, filename)\n", - " print('Downloaded ' + local)\n", - " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSim/main/modsim.py')" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# import functions from modsim\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This case study is based on Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, 15 January 2017, Pages 398-409, [which I downloaded here](https://www.sciencedirect.com/science/article/pii/S0378778816313056).\n", - " \n", - "The authors put their paper under a Creative Commons license, and [make their data available here](http://discovery.ucl.ac.uk/1526521). I thank them for their commitment to open, reproducible science, which made this case study possible.\n", - "\n", - "The goal of their paper is to model the thermal behavior of a wall as a step toward understanding the \"performance gap between the expected energy use of buildings and their measured energy use\". The wall they study is identified as the exterior wall of an office building in central London, [not unlike this one](https://www.google.com/maps/@51.5269375,-0.1303666,3a,75y,90h,88.17t/data=!3m6!1e1!3m4!1sAoAXzN0mbGF9acaVEgUdDA!2e0!7i13312!8i6656)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following figure shows the scenario and their model:\n", - "\n", - "![Figure 2](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr2.jpg)\n", - "\n", - "On the interior and exterior surfaces of the wall, they measure temperature and heat flux over a period of three days. They model the wall using two thermal masses connected to the surfaces, and to each other, by thermal resistors.\n", - "\n", - "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", - "\n", - "The primary result is a comparison of two models: the one shown here with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tempting as it is, I will not replicate their method for estimating the parameters. Rather, I will\n", - "\n", - "1. Implement their model and run it with their estimated parameters, to replicate the results, and \n", - "\n", - "2. Use SciPy's `leastsq` to see if I can find parameters that a yield lower sum of squared errors.\n", - "\n", - "`leastsq` is a wrapper for some venerable FORTRAN code that runs [\"a modification of the Levenberg-Marquardt algorithm\"](https://www.math.utah.edu/software/minpack/minpack/lmdif.html), which is one of my favorites ([really](http://allendowney.com/research/model)).\n", - "\n", - "Implementing their model in the ModSimPy framework turns out to be straightforward. The simulations run fast enough even when we carry units through the computation. And the results are visually similar to the ones in the original paper.\n", - "\n", - "I find that `leastsq` is not able to find parameters that yield substantially better results, which suggest that the estimates in the paper are at least locally optimal." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Loading the data\n", - "\n", - "First I'll load the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "m = units.meter\n", - "K = units.kelvin\n", - "W = units.watt\n", - "J = units.joule\n", - "degC = units.celsius\n", - "s = units.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSim/main/data/DataOWall.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('DataOWall.csv', \n", - " parse_dates=[0], index_col=0, \n", - " header=0, skiprows=[1,2])\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The index contains Pandas `Timestamp` objects, which is good for dealing with real-world dates and times, but not as good for running the simulations, so I'm going to convert to seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "timestamp_0 = data.index[0]\n", - "timestamp_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Subtracting the first `Timestamp` yields `Timedelta` objects:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "time_deltas = data.index - timestamp_0\n", - "time_deltas" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can convert to seconds and replace the index." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "data.index = time_deltas.days * 86400 + time_deltas.seconds\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The timesteps are all 5 minutes:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "np.all(np.diff(data.index) == 300)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Mark the columns of the `Dataframe` with units." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "data.Q_in.units = W / m**2\n", - "data.Q_out.units = W / m**2\n", - "data.T_int.units = degC\n", - "data.T_ext.units = degC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the measured fluxes." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "data.Q_in.plot(color='C2')\n", - "data.Q_out.plot(color='C0')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the measured temperatures." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "data.T_int.plot(color='C2')\n", - "data.T_ext.plot(color='C0')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Temperature (degC)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Params and System objects\n", - "\n", - "Here's a `Params` object with the [estimated parameters from the paper](https://www.sciencedirect.com/science/article/pii/S0378778816313056#tbl0005)." - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "R1 = 0.076 # m**2 * K / W,\n", - "R2 = 0.272 # m**2 * K / W,\n", - "R3 = 0.078 # m**2 * K / W,\n", - "C1 = 212900 # J / m**2 / K,\n", - "C2 = 113100 # J / m**2 / K" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "params = R1, R2, R3, C1, C2" - ] - }, - { - "cell_type": "code", - "execution_count": 136, - "metadata": {}, - "outputs": [], - "source": [ - "params = 0.07, R2, R3, C1, C2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll pass the `Params` object `make_system`, which computes `init`, packs the parameters into `Series` objects, and computes the interpolation functions." - ] - }, - { - "cell_type": "code", - "execution_count": 137, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " R1, R2, R3, C1, C2 = params\n", - " \n", - " init = State(T_C1 = 16.11, T_C2 = 15.27)\n", - " \n", - " ts = data.index\n", - " t_end = ts[-1] * s\n", - " \n", - " return System(init=init,\n", - " R= (R1, R2, R3),\n", - " C= (C1, C2),\n", - " T_int_func=interpolate(data.T_int),\n", - " T_ext_func=interpolate(data.T_ext),\n", - " unit_temp=degC,\n", - " t_end=t_end, ts=ts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a `System` object" - ] - }, - { - "cell_type": "code", - "execution_count": 138, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the interpolation function:" - ] - }, - { - "cell_type": "code", - "execution_count": 139, - "metadata": {}, - "outputs": [], - "source": [ - "system.T_ext_func(0), system.T_ext_func(150), system.T_ext_func(300)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Implementing the model\n", - "\n", - "Next we need a slope function that takes instantaneous values of the two internal temperatures and computes their time rates of change.\n", - "\n", - "The slope function gets called two ways.\n", - "\n", - "* When we call it directly, `state` is a `State` object and the values it contains have units.\n", - "\n", - "* When `run_solve_ivp` calls it, `state` is an array and the values it contains don't have units.\n", - "\n", - "In the second case, we have to apply the units before attempting the computation. `require_units` applies units if necessary:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function computes the fluxes between the four zones." - ] - }, - { - "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_flux(t, state, system):\n", - " \"\"\"Compute the fluxes between the walls surfaces and the internal masses.\n", - " \n", - " state: State with T_C1 and T_C2\n", - " t: time in seconds\n", - " system: System with interpolated measurements and the R Series\n", - " \n", - " returns: Series of fluxes\n", - " \"\"\" \n", - " # unpack the temperatures\n", - " T_C1, T_C2 = state\n", - " \n", - " # compute a series of temperatures from inside out\n", - " T_int = system.T_int_func(t)\n", - " T_ext = system.T_ext_func(t)\n", - " \n", - " T = [T_int, T_C1, T_C2, T_ext]\n", - " \n", - " # compute differences of adjacent temperatures\n", - " T_diff = np.diff(T)\n", - "\n", - " # compute fluxes between adjacent compartments\n", - " Q = T_diff / system.R\n", - " return Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 141, - "metadata": {}, - "outputs": [], - "source": [ - "compute_flux(0, system.init, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a slope function that computes derivatives of `T_C1` and `T_C2`" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(t, state, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " Q = compute_flux(t, state, system)\n", - "\n", - " # compute the net flux in each node\n", - " Q_diff = np.diff(Q)\n", - " \n", - " # compute the rate of change of temperature\n", - " dQdt = Q_diff / system.C\n", - " return dQdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 143, - "metadata": {}, - "outputs": [], - "source": [ - "slopes = slope_func(system.ts[0], system.init, system)\n", - "slopes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's run the simulation, generating estimates for the time steps in the data." - ] - }, - { - "cell_type": "code", - "execution_count": 145, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_solve_ivp(system, slope_func,\n", - " t_eval=data.index)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 147, - "metadata": {}, - "outputs": [], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 148, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(results, data):\n", - " data.T_int.plot(color='C2')\n", - " results.T_C1.plot(color='C3')\n", - " results.T_C2.plot(color='C1')\n", - " data.T_ext.plot(color='C0')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Temperature (degC)')\n", - " \n", - "plot_results(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These results are similar to what's in the paper:\n", - "\n", - "![Figure 5](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr5.jpg). \n", - "\n", - "To get the estimated fluxes, we have to go through the results and basically do the flux calculation again." - ] - }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [], - "source": [ - "def recompute_fluxes(results, system):\n", - " \"\"\"Compute fluxes between wall surfaces and internal masses.\n", - " \n", - " results: Timeframe with T_C1 and T_C2\n", - " system: System object\n", - " \n", - " returns: Timeframe with Q_in and Q_out\n", - " \"\"\"\n", - " Q_frame = TimeFrame(index=results.index, \n", - " columns=['Q_in', 'Q_out'])\n", - " \n", - " for t, row in results.iterrows():\n", - " Q = compute_flux(t, row, system)\n", - " Q_frame.loc[t] = (-Q[0], -Q[2])\n", - " \n", - " return Q_frame" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [], - "source": [ - "Q_frame = recompute_fluxes(results, system)\n", - "Q_frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how the estimates compare to the data." - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_Q_in(frame, data):\n", - " frame.Q_in.plot(color='gray')\n", - " data.Q_in.plot(color='C2')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')\n", - " \n", - "plot_Q_in(Q_frame, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_Q_out(frame, data):\n", - " frame.Q_out.plot(color='gray')\n", - " data.Q_out.plot(color='C0')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')\n", - " \n", - "plot_Q_out(Q_frame, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These results are also similar to what's in the paper (the bottom row):\n", - "\n", - "![Figure 3](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr3.jpg)" - ] - }, - { - "cell_type": "code", - "execution_count": 173, - "metadata": {}, - "outputs": [], - "source": [ - "error_Q_in = Q_frame.Q_in - data.Q_in\n", - "error_Q_out = Q_frame.Q_out - data.Q_out\n", - "\n", - "errors = np.hstack([error_Q_in, error_Q_out])\n", - "errors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the sum of the squared errors." - ] - }, - { - "cell_type": "code", - "execution_count": 175, - "metadata": {}, - "outputs": [], - "source": [ - "np.sum(errors**2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Estimating parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see if we can do any better than the parameters in the paper." - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [], - "source": [ - "params = R1, R2, R3, C1, C2\n", - "params" - ] - }, - { - "cell_type": "code", - "execution_count": 194, - "metadata": {}, - "outputs": [], - "source": [ - "params = R1, 0.27, R3, C1, C2\n", - "params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an error function that takes a hypothetical set of parameters, runs the simulation, and returns an array of errors." - ] - }, - { - "cell_type": "code", - "execution_count": 195, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(params, data):\n", - " \"\"\"Run a simulation and return an array of errors.\n", - " \n", - " params: Params object or array\n", - " data: DataFrame\n", - " \n", - " returns: array of float\n", - " \"\"\"\n", - " print(params)\n", - " system = make_system(params, data) \n", - " results, details = run_solve_ivp(system, slope_func, \n", - " t_eval=data.index)\n", - " Q_frame = recompute_fluxes(results, system)\n", - " error_Q_in = Q_frame.Q_in - data.Q_in\n", - " error_Q_out = Q_frame.Q_out - data.Q_out\n", - "\n", - " errors = np.hstack([error_Q_in, error_Q_out])\n", - " print(np.sum(errors**2))\n", - " return errors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `error_func`." - ] - }, - { - "cell_type": "code", - "execution_count": 196, - "metadata": {}, - "outputs": [], - "source": [ - "errors = error_func(params, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 197, - "metadata": {}, - "outputs": [], - "source": [ - "np.sum(errors**2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pass `error_func` to `leastsq` to see if it can do any better." - ] - }, - { - "cell_type": "code", - "execution_count": 198, - "metadata": {}, - "outputs": [], - "source": [ - "best_params, details = leastsq(error_func, params, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 199, - "metadata": {}, - "outputs": [], - "source": [ - "details.ier" - ] - }, - { - "cell_type": "code", - "execution_count": 200, - "metadata": {}, - "outputs": [], - "source": [ - "print(details.mesg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The best params are only slightly different from the starting place. " - ] - }, - { - "cell_type": "code", - "execution_count": 203, - "metadata": {}, - "outputs": [], - "source": [ - "best_params" - ] - }, - { - "cell_type": "code", - "execution_count": 201, - "metadata": {}, - "outputs": [], - "source": [ - "best_params - params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like with the `best_params`." - ] - }, - { - "cell_type": "code", - "execution_count": 202, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(best_params, data)\n", - "system = remove_units(system)\n", - "\n", - "results, details = run_solve_ivp(system, slope_func, t_eval=system.ts)\n", - "Q_frame = recompute_fluxes(results, system)\n", - "errors = compute_error(Q_frame, data)\n", - "print(np.sum(errors**2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The sum of squared errors is only slightly smaller.\n", - "\n", - "And the results are visually similar." - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [], - "source": [ - "plot_Q_in(Q_frame, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [], - "source": [ - "plot_Q_out(Q_frame, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Try starting the model with a different set of parameters and see if it moves toward the parameters in the paper.\n", - "\n", - "I found that no matter where I start, `leastsq` doesn't move far, which suggests that it is not able to optimize the parameters effectively." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Notes\n", - "\n", - "Notes on working with degC.\n", - "\n", - "Usually I construct a `Quantity` object by multiplying a number and a unit. With degC, that doesn't work; you get\n", - "\n", - "```\n", - "OffsetUnitCalculusError: Ambiguous operation with offset unit (degC).\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [], - "source": [ - "#16.11 * C " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The problem is that it doesn't know whether you want a temperature measurement or a temperature difference.\n", - "\n", - "You can create a temperature measurement like this." - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [], - "source": [ - "T = Quantity(16.11, degC)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you convert to Kelvin, it does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [], - "source": [ - "T.to(K)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you subtract temperatures, the results is a temperature difference, indicated by the units." - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [], - "source": [ - "diff = T - 273.15 * K" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you convert a temperature difference to Kelvin, it does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [], - "source": [ - "diff.to(K)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From ff530af634b269fdba8e8ff6c5778fecbe3dd5f4 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 13:43:29 -0500 Subject: [PATCH 055/144] Updating modsim.py --- chap22.py | 7 +++---- modsim.py | 11 ++++------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/chap22.py b/chap22.py index 040c12e3..00fe5be2 100644 --- a/chap22.py +++ b/chap22.py @@ -4,7 +4,7 @@ x = 0, # m y = 1, # m angle = 45, # degree - velocity = 40, # m / s + speed = 40, # m / s mass = 145e-3, # kg diameter = 73e-3, # m @@ -25,7 +25,7 @@ def make_system(params): theta = deg2rad(params.angle) # compute x and y components of velocity - vx, vy = pol2cart(theta, params.velocity) + vx, vy = pol2cart(theta, params.speed) # make the initial state init = State(x=params.x, y=params.y, vx=vx, vy=vy) @@ -35,8 +35,7 @@ def make_system(params): return System(params, init = init, - area = area, - ) + area = area) from modsim import * diff --git a/modsim.py b/modsim.py index 9ed50260..4613793e 100644 --- a/modsim.py +++ b/modsim.py @@ -33,11 +33,6 @@ from types import SimpleNamespace from copy import copy -import pint - -units = pint.UnitRegistry() -#Quantity = units.Quantity - def flip(p=0.5): """Flips a coin with the given probability. @@ -691,8 +686,9 @@ def SweepSeries(*args, **kwargs): def show(obj): """Display a Series or Namespace as a DataFrame.""" if isinstance(obj, pd.Series): - return pd.DataFrame(obj) - elif isinstance(obj, SimpleNamespace): + df = pd.DataFrame(obj) + return df + elif hasattr(obj, __dict__): return pd.DataFrame(pd.Series(obj.__dict__), columns=['value']) else: @@ -716,6 +712,7 @@ def SweepFrame(*args, **kwargs): def Vector(x, y, z=None, **options): """ """ + underride(options, name='component') if z is None: return pd.Series(dict(x=x, y=y), **options) else: From 24c68860b5a14aa7f7d9f41aff3efcd40c7b48d1 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 14:17:21 -0500 Subject: [PATCH 056/144] Updating modsim.py --- modsim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modsim.py b/modsim.py index 4613793e..02bdb103 100644 --- a/modsim.py +++ b/modsim.py @@ -688,7 +688,7 @@ def show(obj): if isinstance(obj, pd.Series): df = pd.DataFrame(obj) return df - elif hasattr(obj, __dict__): + elif hasattr(obj, '__dict__'): return pd.DataFrame(pd.Series(obj.__dict__), columns=['value']) else: From 85e2cf0a35f11aeb2e23502e1936bc17f0e6baac Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 14:17:26 -0500 Subject: [PATCH 057/144] Updating chapters --- chapters/chap10.ipynb | 35 +++- chapters/chap14.ipynb | 2 +- chapters/chap15.ipynb | 6 +- chapters/chap16.ipynb | 6 +- chapters/chap17.ipynb | 129 ++++++------ chapters/chap18.ipynb | 150 ++++++++------ chapters/chap19.ipynb | 108 +++++++--- chapters/chap20.ipynb | 224 ++++++--------------- chapters/chap21.ipynb | 126 ++++++------ chapters/chap22.ipynb | 448 +++++++++++++++++++++++++++--------------- chapters/chap23.ipynb | 135 ++++++++----- 11 files changed, 774 insertions(+), 595 deletions(-) diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index b6a1d3c6..727b3d4a 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -272,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "rural-express", "metadata": { "tags": [] @@ -288,7 +288,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "preceding-sheep", "metadata": { "tags": [] @@ -301,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "together-jackson", "metadata": {}, "outputs": [], @@ -311,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "id": "simple-verse", "metadata": { "scrolled": true @@ -361,6 +361,15 @@ "than one or two lines of code a time, and test as you go!" ] }, + { + "cell_type": "markdown", + "id": "norwegian-watch", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/queue.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/queue.ipynb)" + ] + }, { "cell_type": "markdown", "id": "forward-point", @@ -384,6 +393,15 @@ "something different, please do!" ] }, + { + "cell_type": "markdown", + "id": "copyrighted-smooth", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/salmon.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/salmon.ipynb)" + ] + }, { "cell_type": "markdown", "id": "limiting-moore", @@ -411,6 +429,15 @@ "There are no exercises in this case study, but it is an example of what you can do with the tools we have so far and a preview of what you will be able to do with the tools in the next few chapters." ] }, + { + "cell_type": "markdown", + "id": "solid-summit", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/trees.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/trees.ipynb)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index b712c1b3..6b82fe40 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -807,7 +807,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index b8d79df4..1018b6c1 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -59,8 +59,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -401,7 +401,7 @@ }, { "cell_type": "markdown", - "id": "saved-dublin", + "id": "together-adapter", "metadata": {}, "source": [ "There are a two things here that are different from previous versions of `run_simulation`.\n", diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index 285ffa16..81e97912 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -59,8 +59,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -666,7 +666,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 24a3bda2..fe6a8163 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -59,8 +59,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -90,9 +90,10 @@ "id": "european-movement", "metadata": {}, "source": [ - "In this chapter we start a new example, a model of how glucose and insulin interact to control blood sugar. We will implement a widely used model called the \"Minimal Model\" because it is intended to include only the elements essential to explain the observed behavior of the system.\n", + "In this chapter we start a new example, a model of how glucose and insulin interact to control blood sugar. \n", + "We will implement a widely used model called the \"Minimal Model\" because it is intended to include only the elements essential to explain the observed behavior of the system.\n", "\n", - "This chapter presents the model itself and some background information we need to understand it.\n", + "This chapter presents the model and some background information we need to understand it.\n", "In the next chapter we'll implement the model and compare the results to real data.\n", "\n", "My presentation in this chapter follows Bergman (2005) \"Minimal Model\"\n", @@ -107,9 +108,7 @@ "source": [ "## The Minimal Model\n", "\n", - "**Pharmacokinetics** is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, we\n", - "implement one of the most widely used pharmacokinetic models: the\n", - "so-called \"minimal model\" of glucose and insulin in the blood stream.\n", + "**Pharmacokinetics** is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, I present a widely used pharmacokinetic models: the so-called \"minimal model\" of glucose and insulin in the blood stream.\n", "\n", "**Glucose** is a form of sugar that circulates in the blood of animals; it is used as fuel for muscles, the brain, and other organs. The concentration of blood sugar is controlled by the hormone system, and especially by **insulin**, which is produced by the pancreas and has the effect of reducing blood sugar.\n", "\n", @@ -125,7 +124,7 @@ "id": "sharp-yukon", "metadata": {}, "source": [ - "One of the most-used tests for hyperglycemia and diabetes is the\n", + "A widely used test for hyperglycemia and diabetes is the\n", "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to\n", "measure the concentrations of glucose and insulin.\n", "\n", @@ -140,7 +139,7 @@ "source": [ "## The glucose minimal model\n", "\n", - "The \"minimal model\", as proposed by Bergman, Ider, Bowden, and\n", + "The minimal model, as proposed by Bergman, Ider, Bowden, and\n", "Cobelli, consists of two parts: the glucose model and the insulin model. I will present an implementation of the glucose model; as a case study, you will have the chance to implement the insulin model.\n", "\n", "The original model was developed in the 1970s; since then, many\n", @@ -162,21 +161,27 @@ "> (1) Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize (2) Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", "\n", "To paraphrase the second point, the effect of insulin on glucose\n", - "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a \"remote compartment\" where it has its effect." + "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a remote compartment where it has its effect." ] }, { "cell_type": "markdown", - "id": "bottom-extent", + "id": "growing-logistics", "metadata": {}, "source": [ - "At the time, the remote compartment was a modeling abstraction that\n", + "At the time, the \"remote compartment\" was a modeling abstraction that\n", "might, or might not, represent something physical. Later, according to\n", "Bergman, it was \"shown to be interstitial fluid\", that is, the fluid\n", - "that surrounds tissue cells. In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve\n", - "particular effects, to be found later to correspond to physical\n", - "entities. The most notable example, historically, might be [genes](https://en.wikipedia.org/wiki/Gene#Discovery_of_discrete_inherited_units).\n", + "that surrounds tissue cells. \n", "\n", + "In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve particular effects, to be found later to correspond to physical entities. One notable example is [the gene] https://en.wikipedia.org/wiki/Gene#Discovery_of_discrete_inherited_units)." + ] + }, + { + "cell_type": "markdown", + "id": "bottom-extent", + "metadata": {}, + "source": [ "The glucose model consists of two differential equations:\n", "\n", "$$\\frac{dG}{dt} = -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t)$$\n", @@ -220,14 +225,10 @@ " unspecified; we can consider $X$ to be in whatever units make the\n", " parameter of this term 1.\n", "\n", - "- $k_3 \\left[ I(t) - I_b \\right]$ is the rate at which insulin\n", - " diffuses between blood and tissue fluid. When $I(t)$ is above basal\n", - " level, insulin diffuses from the blood into the tissue fluid. When\n", - " $I(t)$ is below basal level, insulin diffuses from tissue to the\n", + "- $k_3 \\left[ I(t) - I_b \\right]$ is the rate at which insulin diffuses between blood and tissue fluid. When $I(t)$ is above basal level, insulin diffuses from the blood into the tissue fluid. When $I(t)$ is below basal level, insulin diffuses from tissue to the\n", " blood.\n", "\n", - "- $-k_2 X(t)$ is the rate of insulin disappearance in tissue fluid as\n", - " it is consumed or broken down." + "- $-k_2 X(t)$ is the rate of insulin disappearance in tissue fluid as it is consumed or broken down." ] }, { @@ -242,37 +243,36 @@ }, { "cell_type": "markdown", - "id": "exact-heating", + "id": "apart-giant", "metadata": {}, "source": [ "## Data\n", "\n", - "To develop and test the model, we'll use data from [Pacini and Bergman](https://www.researchgate.net/publication/13707725_Insulin_sensitivity_and_glucose_effectiveness_Minimal_model_analysis_of_regular_and_insulin-modified_FSIGT), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122, (1986)." + "To develop and test the model, we'll use data from [Pacini and Bergman](https://www.researchgate.net/publication/13707725_Insulin_sensitivity_and_glucose_effectiveness_Minimal_model_analysis_of_regular_and_insulin-modified_FSIGT), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 1986." ] }, { "cell_type": "markdown", - "id": "separated-strip", - "metadata": {}, + "id": "exact-heating", + "metadata": { + "tags": [] + }, "source": [ "The following cell downloads the data." ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 4, "id": "looking-needle", "metadata": { - "scrolled": true + "scrolled": true, + "tags": [] }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + "download('https://github.com/AllenDowney/ModSim/raw/master/' +\n", + " 'glucose_insulin.csv')" ] }, { @@ -285,14 +285,31 @@ }, { "cell_type": "code", - "execution_count": 30, - "id": "naval-geology", + "execution_count": 5, + "id": "cosmetic-matrix", "metadata": {}, "outputs": [], "source": [ "from pandas import read_csv\n", "\n", - "data = read_csv('glucose_insulin.csv', index_col='time')\n", + "data = read_csv('glucose_insulin.csv', index_col='time')" + ] + }, + { + "cell_type": "markdown", + "id": "written-beast", + "metadata": {}, + "source": [ + "Here are the first few rows:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "naval-geology", + "metadata": {}, + "outputs": [], + "source": [ "data.head()" ] }, @@ -301,7 +318,7 @@ "id": "close-payday", "metadata": {}, "source": [ - "`data` has two columns: `glucose` is the concentration of blood glucose in mg/dL; `insulin` is concentration of insulin in the blood in μU/mL (a medical \"unit\", denoted U, is an amount defined by convention in context). The index is time in minutes.\n", + "`data` has two columns: `glucose` is the concentration of blood glucose in mg/dL; `insulin` is the concentration of insulin in the blood in μU/mL (a medical \"unit\", denoted U, is an amount defined by convention in context). The index is time in minutes.\n", "\n", "This dataset represents glucose and insulin concentrations over\n", "182 min for a subject with normal insulin production and sensitivity." @@ -316,14 +333,14 @@ "\n", "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. This is a job for interpolation!\n", "\n", - "The ModSim library provides an `interpolate`, function that takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", + "The ModSim library provides an `interpolate` function that takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", "\n", - "So we can call `interpolate` like this:" + "We can call `interpolate` like this:" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 7, "id": "terminal-teaching", "metadata": {}, "outputs": [], @@ -336,12 +353,12 @@ "id": "banner-shakespeare", "metadata": {}, "source": [ - "Then we can call the new function, `I`, like this:" + "The result is a function we can call like this:" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 8, "id": "intense-thursday", "metadata": {}, "outputs": [], @@ -354,14 +371,14 @@ "id": "severe-desire", "metadata": {}, "source": [ - "The result is about 31.7, which is a linear interpolation between the actual measurements at `t=16` and `t=19`. \n", + "In this example the interpolated value is about 31.7, which is a linear interpolation between the actual measurements at `t=16` and `t=19`. \n", "\n", "We can also pass an array as an argument to `I`. Here's an array of equally-spaced values from `t_0` to `t_end`." ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 9, "id": "least-pattern", "metadata": {}, "outputs": [], @@ -381,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 10, "id": "mounted-venice", "metadata": {}, "outputs": [], @@ -399,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 11, "id": "affecting-response", "metadata": {}, "outputs": [], @@ -417,13 +434,13 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 12, "id": "engaging-watershed", "metadata": {}, "outputs": [], "source": [ "data.insulin.plot(style='o', color='C2', label='insulin data')\n", - "I_series.plot(color='C2', label='interpolated')\n", + "I_series.plot(color='C2', label='interpolation')\n", "\n", "decorate(xlabel='Time (min)',\n", " ylabel='Concentration ($\\mu$U/mL)')" @@ -437,12 +454,11 @@ "## Summary\n", "\n", "This chapter introduces a model of the interaction between glucose and insulin in the blood stream.\n", - "And it introduces a new tool, interpolation, which we'll need to implement the model\n", + "And it introduces a new tool, interpolation, which we'll need to implement the model.\n", "\n", "In the next chapter, we will use measured concentrations of insulin to simulate the glucose-insulin system, and compare the results to measured concentrations of glucose.\n", "\n", - "Then, you'll have a chance to implement the second part of the model, which uses measured concentrations of glucose to simulate the insulin response, and compare the results to the data.\n", - "\n" + "Then you'll have a chance to implement the second part of the model, which uses measured concentrations of glucose to simulate the insulin response, and compare the results to the data." ] }, { @@ -469,7 +485,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 13, "id": "endless-network", "metadata": {}, "outputs": [], @@ -479,13 +495,13 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 14, "id": "entire-concern", "metadata": {}, "outputs": [], "source": [ "data.insulin.plot(style='o', color='C2', label='insulin data')\n", - "I_series.plot(color='C2', label='interpolated')\n", + "I_series.plot(color='C2', label='interpolation')\n", "\n", "decorate(xlabel='Time (min)',\n", " ylabel='Concentration ($\\mu$U/mL)')" @@ -501,7 +517,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 15, "id": "representative-acquisition", "metadata": {}, "outputs": [], @@ -511,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 16, "id": "rocky-sydney", "metadata": { "scrolled": true @@ -535,6 +551,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 6a450990..a69372fc 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -59,13 +59,13 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -90,22 +90,24 @@ "id": "detected-welsh", "metadata": {}, "source": [ - "The previous chapter present the minimal model of the glucose-insulin system, and introduces a tool we will need to implement it: interpolation.\n", + "The previous chapter presents the minimal model of the glucose-insulin system and introduces a tool we will need to implement it, interpolation.\n", "\n", "In this chapter, we'll implement the model two ways:\n", "\n", - "* We'll start by rewriting the differential equations as difference equations; then we'll solve the difference equations using a version of `run_simulation`, similar to what we have used in previous chapters.\n", + "* We'll start by rewriting the differential equations as difference equations; then we'll solve the difference equations using a version of `run_simulation` similar to what we have used in previous chapters.\n", "\n", - "* Then we'll use a new SciPy function, called `solve_ivp`, to solve the differential equation.\n", + "* Then we'll use a new SciPy function, called `solve_ivp`, to solve the differential equation using a better algorithm.\n", "\n", "We'll see that `solve_ivp` is faster and more accurate than `run_simulation`.\n", - "As a result, we will us it for every model in the rest of the book." + "As a result, we will use it for the models in the rest of the book." ] }, { "cell_type": "markdown", "id": "original-photographer", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "The following cell downloads the data." ] @@ -114,21 +116,21 @@ "cell_type": "code", "execution_count": 4, "id": "fewer-weather", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" + "download('https://github.com/AllenDowney/ModSim/raw/master/' +\n", + " 'glucose_insulin.csv')" ] }, { "cell_type": "markdown", "id": "postal-procedure", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "We can use Pandas to read the data." ] @@ -137,12 +139,14 @@ "cell_type": "code", "execution_count": 5, "id": "computational-border", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from pandas import read_csv\n", "\n", - "data = read_csv(filename, index_col='time');" + "data = read_csv('glucose_insulin.csv', index_col='time');" ] }, { @@ -154,7 +158,7 @@ "\n", "To get started, let's assume that the parameters of the model are known.\n", "We'll implement the model and use it to generate time series for `G` and `X`. \n", - "Then we'll see how we can choose parameters that generate a series that fits the data.\n", + "Then we'll see how we can choose parameters that make the simulation fit the data.\n", "\n", "Here are the parameters." ] @@ -258,7 +262,7 @@ "\n", "$$\\frac{dX}{dt} = k_3 \\left[I(t) - I_b \\right] - k_2 X(t)$$ \n", "\n", - "To simulate this system, we will rewriting them as difference equations. \n", + "To simulate this system, we will rewrite them as difference equations. \n", "If we multiply both sides by $dt$, we have:\n", "\n", "$$dG = \\left[ -k_1 \\left[ G(t) - G_b \\right] - X(t) G(t) \\right] dt$$\n", @@ -277,7 +281,7 @@ "metadata": {}, "outputs": [], "source": [ - "def update_func(state, t, system):\n", + "def update_func(t, state, system):\n", " G, X = state\n", " G0, k1, k2, k3 = system.params \n", " I, Ib, Gb = system.I, system.Ib, system.Gb\n", @@ -297,15 +301,13 @@ "id": "basic-subdivision", "metadata": {}, "source": [ - "As usual, the update function takes a `State` object, a time, and a\n", - "`System` object as parameters. The first line uses multiple assignment\n", - "to extract the current values of `G` and `X`.\n", + "As usual, the update function takes a time stamp, a `State` object, and a `System` object as parameters. The first line uses multiple assignment to extract the current values of `G` and `X`.\n", "\n", "The following lines unpack the parameters we need from the `System`\n", "object.\n", "\n", - "Computing the derivatives `dGdt` and `dXdt` is straightforward; we just translate the equations from math notation to Python.\n", - "Then, to perform the update, we multiply each derivative by the discrete time step `dt`, which is 2 min in this example. \n", + "To compute the derivatives `dGdt` and `dXdt` we translate the equations from math notation to Python.\n", + "Then, to perform the update, we multiply each derivative by the time step `dt`, which is 2 min in this example. \n", "\n", "The return value is a `State` object with the new values of `G` and `X`.\n", "\n", @@ -320,7 +322,7 @@ "metadata": {}, "outputs": [], "source": [ - "update_func(system.init, system.t_0, system)" + "update_func(system.t_0, system.init, system)" ] }, { @@ -359,7 +361,7 @@ " for i in range(n-1):\n", " t = t_array[i]\n", " state = frame.iloc[i]\n", - " frame.iloc[i+1] = update_func(state, t, system)\n", + " frame.iloc[i+1] = update_func(t, state, system)\n", " \n", " return frame" ] @@ -369,6 +371,11 @@ "id": "musical-loading", "metadata": {}, "source": [ + "This version is similar to the one we used for the coffee cooling problem.\n", + "The biggest difference is that it makes and returns a `TimeFrame` rather than a `TimeSeries`.\n", + "\n", + "When we make the `TimeSeries`, we use `index` to indicate that the index is the array of time stamps, `t_array`, and `columns` to indicate that the column names are the state variables we get from `init`.\n", + "\n", "We can run it like this:" ] }, @@ -428,7 +435,7 @@ "id": "stopped-excuse", "metadata": {}, "source": [ - "With the parameters I chose, the model fits the data well, except during the first few minutes after the injection.\n", + "With the parameters I chose, the model fits the data well except during the first few minutes after the injection.\n", "But we don't expect the model to do well in this regime.\n", "\n", "The problem is that the model is **non-spatial**; that is, it does not\n", @@ -486,15 +493,15 @@ "In effect, the simulations assume that the derivatives $dG/dt$ and $dX/dt$ are constant during each 2 min time step.\n", "This method, evaluating derivatives at discrete time steps and assuming that they are constant in between, is called **Euler's method** (see ).\n", "\n", - "Euler's method is good enough for many simple problems, but sometimes it is not very accurate.\n", - "In that case, sometimes we can make it more accurate by decreasing the size of `dt`.\n", + "Euler's method is good enough for many problems, but sometimes it is not very accurate.\n", + "In that case, we can usually make it more accurate by decreasing the size of `dt`.\n", "But then it is not very efficient.\n", "\n", "There are other methods that are more accurate and more efficient than Euler's method.\n", - "SciPy provides several of them as a function called `solve_ivp` \n", + "SciPy provides several of them wrapped in a function called `solve_ivp`.\n", "The \"ivp\" in `solve_ivp` stands for \"initial value problem\", which is the term for problems like the ones we've been solving, where we are given the initial conditions and try to predict what will happen.\n", "\n", - "ModSim provides a function called `run_solve_ivp` that makes `solve_ivp` a little easier to use.\n", + "The ModSim library provides a function called `run_solve_ivp` that makes `solve_ivp` a little easier to use.\n", "\n", "To use it, we have to provide a \"slope function\", which is similar to an update function; in fact, it takes the same parameters: a time stamp, a `State` object, and a `System` object.\n", "\n", @@ -533,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 18, "id": "intelligent-visitor", "metadata": {}, "outputs": [], @@ -559,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 19, "id": "industrial-focus", "metadata": {}, "outputs": [], @@ -569,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 20, "id": "frequent-exhibit", "metadata": {}, "outputs": [], @@ -590,7 +597,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 21, "id": "immediate-legislature", "metadata": {}, "outputs": [], @@ -605,12 +612,12 @@ "source": [ "Because we used `t_eval=results.index`, the time stamps in `results2` are the same as in `results`, which makes them easier to compare.\n", "\n", - "Here are the results from `run_solve_ivp` along with the results from `run_simulation`:" + "The following figure shows the results from `run_solve_ivp` along with the results from `run_simulation`:" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 22, "id": "peripheral-commission", "metadata": {}, "outputs": [], @@ -634,13 +641,30 @@ }, { "cell_type": "code", - "execution_count": 40, - "id": "clear-neighbor", + "execution_count": 23, + "id": "diagnostic-lawsuit", "metadata": {}, "outputs": [], "source": [ "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", + "percent_diff = diff / results2.G * 100" + ] + }, + { + "cell_type": "markdown", + "id": "comparative-boulder", + "metadata": {}, + "source": [ + "And we can use `describe` to compute summary statistics:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "clear-neighbor", + "metadata": {}, + "outputs": [], + "source": [ "percent_diff.abs().describe()" ] }, @@ -649,7 +673,8 @@ "id": "temporal-threat", "metadata": {}, "source": [ - "The biggest differences are a little more than 1%.\n", + "The mean relative difference is about 0.65%;\n", + "the maximum is a little more than 1%.\n", "So in this example, the results from Euler's method are probably good enough for practical purposes." ] }, @@ -663,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 25, "id": "happy-guess", "metadata": {}, "outputs": [], @@ -684,6 +709,20 @@ "As an exercise, you can experiment with `dt` and see what effect it has on these results." ] }, + { + "cell_type": "code", + "execution_count": 26, + "id": "julian-dublin", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "diff = results.G - results2.X\n", + "percent_diff = diff / results2.X * 100\n", + "percent_diff.abs().describe()" + ] + }, { "cell_type": "markdown", "id": "prostate-psychology", @@ -719,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 27, "id": "thermal-trance", "metadata": {}, "outputs": [], @@ -729,7 +768,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 28, "id": "prompt-activity", "metadata": {}, "outputs": [], @@ -739,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 29, "id": "developed-collaboration", "metadata": {}, "outputs": [], @@ -747,19 +786,6 @@ "# Solution goes here" ] }, - { - "cell_type": "markdown", - "id": "alpha-configuration", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "The documentation for `solve_ivp` is at .\n", - "\n", - "It uses a Runge-Kutta method...\n", - "[RK45](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index 734b0ee9..26182b16 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -85,6 +85,14 @@ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap19.ipynb)" ] }, + { + "cell_type": "markdown", + "id": "reflected-sitting", + "metadata": {}, + "source": [ + "This chapter presents case studies where you can apply the tools we have learned so far to the glucose-insulin minimal model, an electronic circuit, a thermal model of a wall, and the interaction of HIV and T cells." + ] + }, { "cell_type": "markdown", "id": "structured-satellite", @@ -97,11 +105,20 @@ "In the repository for this book, you will find a notebook,\n", "`glucose.ipynb`, that shows how we can find the parameters that best fit the data.\n", "\n", - "It uses a SciPy function called `leastsq`, which stands for \"least squares\"; that is, it finds the parameters that minimize the sum of squared differences between the results of the model and the data.\n", + "It uses a SciPy function called `leastsq`, which stands for \"least squares\"; so-named because it finds the parameters that minimize the sum of squared differences between the results of the model and the data.\n", "\n", "You can think of `leastsq` as an optional tool for this book. We won't use it in the text itself, but it appears in a few of the case studies.\n" ] }, + { + "cell_type": "markdown", + "id": "everyday-stopping", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/glucose.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/glucose.ipynb)" + ] + }, { "cell_type": "markdown", "id": "laden-gathering", @@ -126,7 +143,7 @@ "- $\\gamma$ is a parameter that controls the rate of increase (or\n", " decrease) in blood insulin when glucose is above (or below) $G_T$.\n", "\n", - "The initial condition is $I(0) = I_0$. As in the glucose minimal model, we treat the initial condition as a parameter which we'll choose to fit the data." + "The initial condition is $I(0) = I_0$. As in the glucose minimal model, we treat this initial concentration as a free parameter; that is, we'll choose it to fit the data." ] }, { @@ -149,21 +166,36 @@ }, { "cell_type": "markdown", - "id": "parallel-radical", + "id": "sustainable-breath", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/insulin.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/insulin.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "hybrid-vienna", "metadata": {}, "source": [ "## Low-Pass Filter\n", "\n", "The following circuit diagram (from ) shows a low-pass filter built with one resistor and one capacitor.\n", "\n", - "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/master/figs/RC_Divider.svg)\n", + "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/RC_Divider.svg)\n", "\n", "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", "\n", "A filter is \"low-pass\" if it allows low-frequency signals to pass from\n", "$V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of\n", - "high-frequency signals.\n", - "\n", + "high-frequency signals." + ] + }, + { + "cell_type": "markdown", + "id": "visible-estonia", + "metadata": {}, + "source": [ "By applying the laws of circuit analysis, we can derive a differential\n", "equation that describes the behavior of this system. By solving the\n", "differential equation, we can predict the effect of this circuit on any input signal.\n", @@ -180,8 +212,14 @@ "Kirchhoff's current law implies that the current through the capacitor\n", "is: \n", "\n", - "$$I_C = I_R$$ \n", - "\n", + "$$I_C = I_R$$ " + ] + }, + { + "cell_type": "markdown", + "id": "parallel-radical", + "metadata": {}, + "source": [ "According to a simple model of the behavior of\n", "capacitors, current through the capacitor causes a change in the voltage across the capacitor: \n", "\n", @@ -202,6 +240,15 @@ "the notebook, run the code, and work on the exercises." ] }, + { + "cell_type": "markdown", + "id": "twenty-sight", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/filter.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/filter.ipynb)" + ] + }, { "cell_type": "markdown", "id": "violent-directive", @@ -209,18 +256,14 @@ "source": [ "## Thermal behavior of a wall\n", "\n", - "This case study is based on a paper by Gori, et al[^2] that models the\n", - "thermal behavior of a brick wall, with the goal of understanding the\n", - "\"performance gap between the expected energy use of buildings and their measured energy use\".\n", + "This case study is based on a paper that models the thermal behavior of a brick wall with the goal of understanding the \"performance gap between the expected energy use of buildings and their measured energy use\".\n", "\n", "The following figure shows the scenario and their model of the wall:\n", "\n", - "![Model of a wall as a series of thermal insulators](https://github.com/AllenDowney/ModSim/raw/master/figs/wall_model.png)\n", + "![Model of a wall as a series of thermal insulators](https://github.com/AllenDowney/ModSim/raw/main/figs/wall_model.png)\n", "\n", "On the interior and exterior surfaces of the wall, they measure\n", - "temperature and heat flux over a period of three days. They model the\n", - "wall using two thermal masses connected to the surfaces, and to each\n", - "other, by thermal resistors." + "temperature and heat flux (rate of heat flow) over a period of three days. They model the wall using two thermal masses connected to the surfaces, and to each other, by thermal resistors." ] }, { @@ -239,17 +282,27 @@ "\n", "In the repository for this book, you will find a notebook, `wall.ipynb` with the code and results for this case study.\n", "\n", + "The paper this case study is based on is\n", + "Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, 2017, available from .\n", + "\n", "The authors put their paper under a Creative Commons license, and\n", "make their data available at . I thank them\n", "for their commitment to open, reproducible science, which made this\n", - "case study possible.\n", - "\n", - "Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, pages 398-409, ." + "case study possible." ] }, { "cell_type": "markdown", - "id": "narrow-voice", + "id": "wireless-advocacy", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/owall.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/owall.ipynb)" + ] + }, + { + "cell_type": "markdown", + "id": "duplicate-joshua", "metadata": {}, "source": [ "## HIV\n", @@ -258,7 +311,7 @@ "The most obvious explanation for the decline is an immune response that destroys the virus or controls its replication.\n", "However, at least in some patients, the decline occurs even without any detectable immune response.\n", "\n", - "In 1996 Andrew Phillips proposed another explanation for the decline (\"Reduction of HIV Concentration During Acute Infection: Independence from a Specific Immune Response\", available from ).\n", + "In 1996 Andrew Phillips proposed another explanation for the decline in this paper: \"Reduction of HIV Concentration During Acute Infection: Independence from a Specific Immune Response\", available from ).\n", "\n", "Phillips presents a system of differential equations that models the concentrations of the HIV virus and the CD4 cells it infects.\n", "The model does not include an immune response; nevertheless, it demonstrates behavior that is qualitatively similar to what is seen in patients during the first few weeks after infection.\n", @@ -268,6 +321,15 @@ "In the repository for this book, you will find a notebook, `hiv_model.ipynb`, which you can use to implement Phillips's model and consider whether it does the work it is meant to do." ] }, + { + "cell_type": "markdown", + "id": "narrow-voice", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/hiv_model.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/hiv_model.ipynb)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index aa7fee08..0ac9851f 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -92,11 +92,9 @@ "source": [ "So far the differential equations we've worked with have been **first\n", "order**, which means they involve only first derivatives. In this\n", - "chapter, we turn our attention to second order ODEs, which can involve\n", - "both first and second derivatives.\n", + "chapter, we turn our attention to second order differential equations, which can involve both first and second derivatives.\n", "\n", - "We'll revisit the falling penny example from\n", - "Chapter xxx, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." + "We'll revisit the falling penny example from Chapter 1, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." ] }, { @@ -106,18 +104,18 @@ "source": [ "## Newton's second law of motion\n", "\n", - "First order ODEs can be written \n", + "First order differential equations (DEs) can be written \n", "\n", "$$\\frac{dy}{dx} = G(x, y)$$ \n", "\n", - "where $G$ is some function of $x$ and $y$ (see ). Second order ODEs can be written \n", + "where $G$ is some function of $x$ and $y$ (see ). Second order DEs can be written \n", "\n", "$$\\frac{d^2y}{dx^2} = H(x, y, \\frac{dy}{dt})$$\n", "\n", "where $H$ is a function of $x$, $y$, and $dy/dx$.\n", "\n", "In this chapter, we will work with one of the most famous and useful\n", - "second order ODEs, Newton's second law of motion: \n", + "second order DEs, Newton's second law of motion: \n", "\n", "$$F = m a$$ \n", "\n", @@ -139,7 +137,7 @@ "\n", "$$\\frac{d^2y}{dt^2} = F / m$$ \n", "\n", - "And that's definitely a second order ODE.\n", + "And that's definitely a second order DE.\n", "In general, $F$ can be a function of time, position, and velocity." ] }, @@ -175,8 +173,7 @@ "source": [ "## Dropping pennies\n", "\n", - "As a first example, let's get back to the penny falling from the Empire State Building, which we considered in\n", - "Chapter xxx. We will implement two models of this system: first without air resistance, then with.\n", + "As a first example, let's get back to the penny falling from the Empire State Building, which we considered in Chapter 1. We will implement two models of this system: first without air resistance, then with.\n", "\n", "Given that the Empire State Building is 381 m high, and assuming that\n", "the penny is dropped from a standstill, the initial conditions are:" @@ -184,13 +181,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "id": "compatible-increase", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "init = State(y=381, v=0)" ] }, @@ -201,69 +196,19 @@ "source": [ "where `y` is height above the sidewalk and `v` is velocity. \n", "\n", - "The units `m` and `s` are from the `units` object provided by Pint:" - ] - }, - { - "cell_type": "markdown", - "id": "wicked-thomas", - "metadata": {}, - "source": [ - "The only system parameter is the acceleration of gravity:" + "I'll put the initial conditions in a `System` object, along with the magnitude of acceleration due to gravity, `g`, and the duration of the simulations, `t_end`." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 19, "id": "reverse-authorization", "metadata": {}, "outputs": [], "source": [ - "g = 9.8" - ] - }, - { - "cell_type": "markdown", - "id": "developing-newfoundland", - "metadata": {}, - "source": [ - "In addition, we'll specify the duration of the simulation and the step\n", - "size:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "square-toolbox", - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10\n", - "dt = 0.1" - ] - }, - { - "cell_type": "markdown", - "id": "precise-tobago", - "metadata": {}, - "source": [ - "With these parameters, the number of time steps is 100, which is good\n", - "enough for many problems. Once we have a solution, we will increase the\n", - "number of steps and see what effect it has on the results.\n", - "\n", - "We need a `System` object to store the parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "built-piece", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "system = System(init=init, g=g, t_end=t_end, dt=dt)" + "system = System(init=init, \n", + " g=9.8, \n", + " t_end=10)" ] }, { @@ -271,7 +216,7 @@ "id": "heavy-boards", "metadata": {}, "source": [ - "Now we need a slope function, and here's where things get tricky. As we have seen, `run_solve_ivp` can solve systems of first order ODEs, but Newton's law is a second order ODE. However, if we recognize that\n", + "Now we need a slope function, and here's where things get tricky. As we have seen, `run_solve_ivp` can solve systems of first order DEs, but Newton's law is a second order DE. However, if we recognize that\n", "\n", "1. Velocity, $v$, is the derivative of position, $dy/dt$, and\n", "\n", @@ -289,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 20, "id": "occupied-mercury", "metadata": {}, "outputs": [], @@ -308,16 +253,15 @@ "id": "opening-adolescent", "metadata": {}, "source": [ - "The first parameter, `state`, contains the position and velocity of the\n", - "penny. The last parameter, `system`, contains the system parameter `g`,\n", - "which is the magnitude of acceleration due to gravity.\n", + "As usual, the parameters are a time stamp, a `State` object, and a `System` object.\n", + "\n", + "The first line unpacks the state variables, `y` and `v`.\n", "\n", - "The second parameter, `t`, is time. It is not used in this slope\n", - "function because none of the factors of the model are time dependent. I include it anyway because this function will be called by `run_solve_ivp`, which always provides the same arguments,\n", - "whether they are needed or not.\n", + "The next two lines compute the derivatives of the state variables, `dydt` and `dvdt`.\n", + "The derivative of position is velocity, and the derivative of velocity is acceleration.\n", + "In this case, $a = -g$, which indicates that acceleration due to gravity is in the direction of decreasing $y$. \n", "\n", - "The rest of the function is a straightforward translation of the\n", - "differential equations, with the substitution $a = -g$, which indicates that acceleration due to gravity is in the direction of decreasing $y$. `slope_func` returns a sequence containing the two derivatives.\n", + "`slope_func` returns a sequence containing the two derivatives.\n", "\n", "Before calling `run_solve_ivp`, it is a good idea to test the slope\n", "function with the initial conditions:" @@ -325,14 +269,13 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 21, "id": "positive-feeling", "metadata": {}, "outputs": [], "source": [ "dydt, dvdt = slope_func(0, system.init, system)\n", - "print(dydt)\n", - "print(dvdt)" + "dydt, dvdt" ] }, { @@ -340,25 +283,34 @@ "id": "false-charlotte", "metadata": {}, "source": [ - "The result is 0 m/s for velocity and 9.8 m/s$^2$ for acceleration. Now we call `run_solve_ivp` like this:" + "The result is 0 m/s for velocity and -9.8 m/s$^2$ for acceleration.\n", + "\n", + "Now we call `run_solve_ivp` like this:" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 22, "id": "lovely-management", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "results, details = run_solve_ivp(system, slope_func)\n", - "details" + "details.message" + ] + }, + { + "cell_type": "markdown", + "id": "ranging-lingerie", + "metadata": {}, + "source": [ + "`results` is a `TimeFrame` with two columns: `y` contains the height of the penny; `v` contains its velocity.\n", + "Here are the first few rows." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 23, "id": "assisted-swimming", "metadata": {}, "outputs": [], @@ -371,21 +323,16 @@ "id": "solved-chambers", "metadata": {}, "source": [ - "`results` is a `TimeFrame` with two columns: `y` contains the height of\n", - "the penny; `v` contains its velocity.\n", - "\n", "We can plot the results like this:" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 24, "id": "authorized-barrier", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "results.y.plot()\n", "\n", "decorate(xlabel='Time (s)',\n", @@ -404,13 +351,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 25, "id": "protected-fiber", "metadata": {}, "outputs": [], "source": [ - "t_end = results.index[-1]\n", - "results.y[t_end]" + "results.iloc[-1].y" ] }, { @@ -426,13 +372,11 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 26, "id": "japanese-clear", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "t_crossings = crossings(results.y, 0)\n", "t_crossings" ] @@ -457,15 +401,12 @@ "detects an \"event\", like the penny hitting the sidewalk, and ends the\n", "simulation.\n", "\n", - "Event functions take the same parameters as slope functions, `state`,\n", - "`t`, and `system`. They should return a value that passes through `0`\n", - "when the event occurs. Here's an event function that detects the penny\n", - "hitting the sidewalk:" + "Event functions take the same parameters as slope functions, `t`, `state`, and `system`. They should return a value that passes through `0` when the event occurs. Here's an event function that detects the penny hitting the sidewalk:" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 27, "id": "comfortable-simple", "metadata": {}, "outputs": [], @@ -488,14 +429,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 28, "id": "exotic-shareware", "metadata": {}, "outputs": [], "source": [ "results, details = run_solve_ivp(system, slope_func,\n", " events=event_func)\n", - "details" + "details.message" ] }, { @@ -519,14 +460,13 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 29, "id": "orange-retro", "metadata": {}, "outputs": [], "source": [ "y, v = results.iloc[-1]\n", - "print(y)\n", - "print(v)" + "y, v" ] }, { @@ -534,9 +474,7 @@ "id": "cleared-jamaica", "metadata": {}, "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." + "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at about 86 m/s. So it's a good thing there is air resistance." ] }, { @@ -546,7 +484,12 @@ "source": [ "## Summary\n", "\n", - "But air resistance...\n" + "In this chapter, we wrote Newton's second law, which is a second order DE, as a system of first order DEs.\n", + "Then we used `run_solve_ivp` to simulate a penny dropping from the Empire State Building in the absence of air resistance.\n", + "And we used an event function to stop the simulation when the penny reaches the sidewalk.\n", + "\n", + "In the next chapter we'll add air resistance to the model.\n", + "But first you might want to work on this exercise." ] }, { @@ -595,16 +538,6 @@ "# Solution goes here" ] }, - { - "cell_type": "code", - "execution_count": 52, - "id": "biological-creek", - "metadata": {}, - "outputs": [], - "source": [ - "r_0 / r_final" - ] - }, { "cell_type": "code", "execution_count": 38, @@ -612,14 +545,7 @@ "metadata": {}, "outputs": [], "source": [ - "t_end = 1e7 # seconds\n", - "\n", - "system = System(init=init,\n", - " G=6.674e-11, # N m^2 / kg^2\n", - " m1=1.989e30, # kg\n", - " m2=5.972e24, # kg\n", - " r_final=radius_sun + radius_earth,\n", - " t_end=t_end)" + "# Solution goes here" ] }, { @@ -742,36 +668,6 @@ "# Solution goes here" ] }, - { - "cell_type": "markdown", - "id": "right-colleague", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "`solve_ivp`\n", - "\n", - "Here is the source code for `crossings` so you can see what's happening under the hood:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "chief-error", - "metadata": {}, - "outputs": [], - "source": [ - "%psource crossings" - ] - }, - { - "cell_type": "markdown", - "id": "comparable-company", - "metadata": {}, - "source": [ - "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." - ] - }, { "cell_type": "code", "execution_count": null, diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index 803a25b4..a74f2afe 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -119,11 +119,11 @@ "\n", "- $F_d$ is force due to drag, in newtons (N).\n", "\n", - "- $\\rho$ is the density of the fluid in kg/m^3^.\n", + "- $\\rho$ is the density of the fluid in kg/m$^3$.\n", "\n", "- $v$ is the magnitude of velocity in m/s.\n", "\n", - "- $A$ is the **reference area** of the object, in m^2^. In this\n", + "- $A$ is the **reference area** of the object, in m$^2$. In this\n", " context, the reference area is the projected frontal area, that is, the visible area of the object as seen from a point on its line of\n", " travel (and far away).\n", "\n", @@ -182,12 +182,12 @@ "params = Params(\n", " mass = 0.0025, # kg\n", " diameter = 0.019, # m\n", - " rho = 1.2, # kg/m**3\n", - " g = 9.8, # m/s**2\n", - " v_init = 0, # m / s\n", - " v_term = 18, # m / s\n", - " height = 381, # m\n", - " t_end = 30, # s\n", + " rho = 1.2, # kg/m**3\n", + " g = 9.8, # m/s**2\n", + " v_init = 0, # m / s\n", + " v_term = 18, # m / s\n", + " height = 381, # m\n", + " t_end = 30, # s\n", ")" ] }, @@ -229,8 +229,7 @@ " mass=params.mass,\n", " rho=params.rho,\n", " g=params.g,\n", - " t_end=params.t_end\n", - " )" + " t_end=params.t_end)" ] }, { @@ -359,14 +358,20 @@ "id": "baking-class", "metadata": {}, "source": [ + "As usual, the parameters of the slope function are a time stamp, a `State` object, and a `System` object. \n", + "We don't use `t` in this example, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", + "\n", "`f_drag` is force due to drag, based on the drag equation. `a_drag` is\n", "acceleration due to drag, based on Newton's second law.\n", "\n", "To compute total acceleration, we add accelerations due to gravity and\n", - "drag. `g` is negated because it is in the direction of decreasing `y`,\n", - "and `a_drag` is positive because it is in the direction of increasing\n", - "`y`. In the next chapter we will use `Vector` objects to keep track of\n", - "the direction of forces and add them up in a less error-prone way." + "drag. \n", + "`g` is negated because it is in the direction of decreasing `y`; `a_drag` is positive because it is in the direction of increasing\n", + "`y`. \n", + "In the next chapter we will use `Vector` objects to keep track of\n", + "the direction of forces and add them up in a less error-prone way.\n", + "\n", + "As usual, let's test the slope function with the initial conditions." ] }, { @@ -384,8 +389,10 @@ "id": "psychological-style", "metadata": {}, "source": [ + "Because the initial velocity is 0, so is the drag force, so the initial acceleration is still `g`. \n", + "\n", "To stop the simulation when the penny hits the sidewalk, we'll use the\n", - "event function from Section xxx:" + "event function from the previous chapter." ] }, { @@ -400,16 +407,6 @@ " return y" ] }, - { - "cell_type": "code", - "execution_count": 13, - "id": "animated-clause", - "metadata": {}, - "outputs": [], - "source": [ - "event_func(0, system.init, system)" - ] - }, { "cell_type": "markdown", "id": "executive-there", @@ -420,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "liberal-dictionary", "metadata": {}, "outputs": [], @@ -440,7 +437,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "coastal-anthropology", "metadata": {}, "outputs": [], @@ -455,14 +452,14 @@ "source": [ "The final height is close to 0, as expected.\n", "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", + "Interestingly, the final velocity is not exactly terminal velocity, which is a reminder that the simulation results are only approximate.\n", "\n", "We can get the flight time from `results`." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "interim-underground", "metadata": {}, "outputs": [], @@ -476,12 +473,14 @@ "id": "institutional-colors", "metadata": {}, "source": [ - "Here's the plot of position as a function of time." + "With air resistance, it takes about 22 seconds for the penny to reach the sidewalk.\n", + "\n", + "Here's a plot of position as a function of time." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "small-franchise", "metadata": {}, "outputs": [], @@ -505,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "analyzed-criticism", "metadata": {}, "outputs": [], @@ -533,7 +532,13 @@ "id": "inside-confidence", "metadata": {}, "source": [ - "## Summary" + "## Summary\n", + "\n", + "This chapter presents a model of drag force, which we use to estimate the coefficient of drag for a penny, and then simulate, one more time, dropping a penny from the Empire State building.\n", + "\n", + "In the next chapter we'll move from one dimension to two, simulating the flight of a baseball.\n", + "\n", + "But first you might want to work on these exercises." ] }, { @@ -558,7 +563,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "inclusive-twenty", "metadata": {}, "outputs": [], @@ -568,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "vertical-judge", "metadata": {}, "outputs": [], @@ -578,28 +583,27 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "greenhouse-madagascar", "metadata": {}, "outputs": [], "source": [ - "t_sidewalk = results2.index[-1]\n", - "t_sidewalk" + "# Solution goes here" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "sudden-details", "metadata": {}, "outputs": [], "source": [ - "plot_position(results2)" + "# Solution goes here" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "opening-jurisdiction", "metadata": { "scrolled": false @@ -630,12 +634,12 @@ "\n", "6. Use your best estimate of `v_term` to compute `C_d`.\n", "\n", - "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." + "Note: I fabricated the \"observed\" flight time, so don't take the results of this exercise too seriously." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "compact-bunny", "metadata": {}, "outputs": [], @@ -645,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "shared-contrary", "metadata": {}, "outputs": [], @@ -655,7 +659,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "portable-account", "metadata": {}, "outputs": [], @@ -665,7 +669,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "arabic-shareware", "metadata": {}, "outputs": [], @@ -675,7 +679,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "valued-literature", "metadata": {}, "outputs": [], @@ -685,7 +689,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "sufficient-retail", "metadata": {}, "outputs": [], @@ -695,7 +699,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "comparable-lounge", "metadata": {}, "outputs": [], @@ -705,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "ready-people", "metadata": {}, "outputs": [], @@ -715,7 +719,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "miniature-remark", "metadata": {}, "outputs": [], @@ -725,25 +729,13 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "frozen-termination", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] - }, - { - "cell_type": "markdown", - "id": "colored-oxygen", - "metadata": {}, - "source": [ - "## Under the Hood\n", - "\n", - "`Params` is a `SimpleNamespace`, like `System`.\n", - "\n", - "`Params` and `System` are actually the same; I have given them different names to document the different roles they play." - ] } ], "metadata": { diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 96420aed..366e22f7 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -36,12 +36,16 @@ "try:\n", " import pint\n", "except ImportError:\n", - " !pip install pint" + " !pip install pint\n", + " \n", + "# import units\n", + "from pint import UnitRegistry\n", + "units = UnitRegistry()" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -90,7 +94,7 @@ "id": "advanced-guidance", "metadata": {}, "source": [ - "In the previous chapter we modeled objects moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", + "In the previous chapter we modeled an object moving in one dimension, with and without drag. Now let's move on to two dimensions, and baseball!\n", "\n", "In this chapter we model the flight of a baseball including the effect\n", "of air resistance. In the next chapter we use this model to solve an\n", @@ -107,9 +111,6 @@ "To model the flight of a baseball, we have to make some\n", "decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", "\n", - "Air resistance has a substantial effect on most projectiles in air, so\n", - "we will include a drag force.\n", - "\n", "To model air resistance, we'll need the mass, frontal area, and drag\n", "coefficient of a baseball. Mass and diameter are easy to find (see\n", "). Drag coefficient is only a little\n", @@ -120,7 +121,7 @@ "Furthermore, the transition between these regimes typically happens\n", "exactly in the range of velocities we are interested in, between 20 m/s and 40 m/s.\n", "\n", - "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you will have a chance to implement a more detailed model and see what effect is has on the results.\n", + "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you can implement a more detailed model and see what effect it has on the results.\n", "\n", "But first we need a new computational tool, the `Vector` object." ] @@ -135,7 +136,7 @@ "Now that we are working in two dimensions, it will be useful to\n", "work with **vector quantities**, that is, quantities that represent both a magnitude and a direction. We will use vectors to represent positions, velocities, accelerations, and forces in two and three dimensions.\n", "\n", - "ModSim provides a function called `Vector` the creates a Pandas `Series` that contains the **components** of the vector.\n", + "ModSim provides a function called `Vector` that creates a Pandas `Series` that contains the **components** of the vector.\n", "In a `Vector` that represents a position in space, the components are the $x$ and $y$ coordinates in 2-D, plus a $z$ coordinate if the `Vector` is in 3-D.\n", "\n", "You can create a `Vector` by specifying its components. The following\n", @@ -150,7 +151,7 @@ "outputs": [], "source": [ "A = Vector(3, 4)\n", - "A" + "show(A)" ] }, { @@ -207,27 +208,17 @@ "outputs": [], "source": [ "B = Vector(1, 2)\n", - "B" + "show(A + B)" ] }, { "cell_type": "code", "execution_count": 8, - "id": "crucial-opening", - "metadata": {}, - "outputs": [], - "source": [ - "A + B" - ] - }, - { - "cell_type": "code", - "execution_count": 9, "id": "encouraging-cabinet", "metadata": {}, "outputs": [], "source": [ - "A - B" + "show(A - B)" ] }, { @@ -235,18 +226,12 @@ "id": "combined-command", "metadata": {}, "source": [ - "For the definition and graphical interpretation of these operations, see ." - ] - }, - { - "cell_type": "markdown", - "id": "later-adelaide", - "metadata": {}, - "source": [ + "For the definition and graphical interpretation of these operations, see .\n", + "\n", "We can specify a `Vector` with coordinates `x` and `y`, as in the previous examples.\n", "Equivalently, we can specify a `Vector` with a magnitude and angle.\n", "\n", - "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is the distance from the origin; if it represents a velocity, magnitude is speed, that is, how fast the object is moving, regardless of direction.\n", + "**Magnitude** is the length of the vector: if the `Vector` represents a position, magnitude is its distance from the origin; if it represents a velocity, magnitude is its speed.\n", "\n", "The **angle** of a `Vector` is its direction, expressed as an angle in radians from the positive $x$ axis. In the Cartesian plane, the angle 0 rad is due east, and the angle $\\pi$ rad is due west.\n", "\n", @@ -255,13 +240,11 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 61, "id": "peripheral-tattoo", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "mag = vector_mag(A)\n", "theta = vector_angle(A)\n", "mag, theta" @@ -274,14 +257,15 @@ "source": [ "The magnitude is 5 because the length of `A` is the hypotenuse of a 3-4-5 triangle.\n", "\n", - "The result from `vector_angle` is in radians, and most Python functions, like `sin` and `cos`, work with radians. \n", - "But many people think more naturally in degrees. \n", + "The result from `vector_angle` is in radians.\n", + "Most Python functions, like `sin` and `cos`, work with radians, \n", + "but many people find it more natural to work with degrees. \n", "Fortunately, NumPy provides a function to convert radians to degrees:" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "strange-cleaning", "metadata": {}, "outputs": [], @@ -302,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "cellular-community", "metadata": {}, "outputs": [], @@ -318,21 +302,22 @@ "id": "responsible-gentleman", "metadata": {}, "source": [ - "Following convention, I'll use `angle` for a value in degrees and `theta` for a value in radians.\n", + "To avoid confusion, I'll use the variable name `angle` for a value in degrees and `theta` for a value in radians.\n", "\n", - "If you are given an angle and velocity, you can make a `Vector` using\n", + "If you are given an angle and magnitude, you can make a `Vector` using\n", "`pol2cart`, which converts from polar to Cartesian coordinates. For example, here's a new `Vector` with the same angle and magnitude of `A`:" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "monetary-firmware", "metadata": {}, "outputs": [], "source": [ "x, y = pol2cart(theta, mag)\n", - "Vector(x, y)" + "C = Vector(x, y)\n", + "show(C)" ] }, { @@ -348,12 +333,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "explicit-piano", "metadata": {}, "outputs": [], "source": [ - "A / vector_mag(A)" + "show(A / vector_mag(A))" ] }, { @@ -361,17 +346,18 @@ "id": "respected-oliver", "metadata": {}, "source": [ - "We can do the same thing using the `vector_hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$." + "ModSim provides a function that does the same thing, called `vector_hat` because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "relative-republic", "metadata": {}, "outputs": [], "source": [ - "vector_hat(A)" + "A_hat = vector_hat(A)\n", + "show(A_hat)" ] }, { @@ -390,12 +376,14 @@ "## Simulating baseball flight\n", "\n", "Let's simulate the flight of a baseball that is batted from home plate\n", - "at an angle of 45° and initial speed 40 m/s. We'll use the center of home plate as the origin, a horizontal x-axis (parallel to the ground), and vertical y-axis (perpendicular to the ground). The initial height is about 1 m." + "at an angle of 45° and initial speed 40 m/s. We'll use the center of home plate as the origin, a horizontal x-axis (parallel to the ground), and a vertical y-axis (perpendicular to the ground). The initial height is 1 m.\n", + "\n", + "Here's a `Params` object with the parameters we'll need." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "narrative-latest", "metadata": { "tags": [] @@ -406,7 +394,7 @@ " x = 0, # m\n", " y = 1, # m\n", " angle = 45, # degree\n", - " velocity = 40, # m / s\n", + " speed = 40, # m / s\n", "\n", " mass = 145e-3, # kg \n", " diameter = 73e-3, # m \n", @@ -423,29 +411,19 @@ "id": "metric-collins", "metadata": {}, "source": [ - "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag is from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:" - ] - }, - { - "cell_type": "markdown", - "id": "increasing-combination", - "metadata": {}, - "source": [ + "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:\n", + "\n", "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", - "And we'll need the acceleration of gravity, `g`." - ] - }, - { - "cell_type": "markdown", - "id": "detected-return", - "metadata": {}, - "source": [ + "As usual, `g` is acceleration due to gravity.\n", + "\n", + "`t_end` is 10 seconds, which is long enough for the ball to land on the ground.\n", + "\n", "The following function uses these quantities to make a `System` object." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "bored-billy", "metadata": { "tags": [] @@ -460,7 +438,7 @@ " theta = deg2rad(params.angle)\n", " \n", " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, params.velocity)\n", + " vx, vy = pol2cart(theta, params.speed)\n", " \n", " # make the initial state\n", " init = State(x=params.x, y=params.y, vx=vx, vy=vy)\n", @@ -470,8 +448,7 @@ "\n", " return System(params,\n", " init = init,\n", - " area = area,\n", - " )" + " area = area)" ] }, { @@ -489,13 +466,14 @@ "\n", "* `vx` and `vy` are the components of velocity.\n", "\n", - "The `System` object also contains `t_end`, which is 10 seconds, long enough for the ball to land on the ground.\n", - "Here's the `System` object." + "When we call `System`, we pass `Params` as the first argument, which means that the variables in `Params` are copied to the new `System` object.\n", + "\n", + "Here's how we make the `System` object." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "ethical-donna", "metadata": {}, "outputs": [], @@ -513,12 +491,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "legitimate-gossip", "metadata": {}, "outputs": [], "source": [ - "system.init" + "show(system.init)" ] }, { @@ -526,12 +504,14 @@ "id": "occasional-given", "metadata": {}, "source": [ + "## Drag Force\n", + "\n", "Next we need a function to compute drag force:" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "legal-terminal", "metadata": { "tags": [] @@ -567,14 +547,15 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "frank-chick", "metadata": {}, "outputs": [], "source": [ "vx, vy = system.init.vx, system.init.vy\n", "V_test = Vector(vx, vy)\n", - "drag_force(V_test, system)" + "f_drag = drag_force(V_test, system)\n", + "show(f_drag)" ] }, { @@ -589,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "suitable-salem", "metadata": { "tags": [] @@ -614,11 +595,11 @@ "id": "scheduled-courage", "metadata": {}, "source": [ - "As usual, the parameters of the slope function are a time, a `State` object, and a `System` object. \n", - "In this example, we don't use `t`, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", + "As usual, the parameters of the slope function are a time stamp, a `State` object, and a `System` object. \n", + "We don't use `t` in this example, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", "\n", "`slope_func` unpacks the `State` object into variables `x`, `y`, `vx`, and `vy`.\n", - "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force and acceleration due to drag, `a_drag`.\n", + "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force, `f_drag`, and acceleration due to drag, `a_drag`.\n", "\n", "To represent acceleration due to gravity, it makes a `Vector` with magnitude `g` in the negative $y$ direction.\n", "\n", @@ -636,7 +617,7 @@ "\n", "* The components of acceleration, `A.x` and `A.y`.\n", "\n", - "Together, these components represent the slope of the state variables, because `V` is the derivative of position and `A` is the derivative of velocity." + "These components represent the slope of the state variables, because `V` is the derivative of position and `A` is the derivative of velocity." ] }, { @@ -649,7 +630,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "closing-simon", "metadata": {}, "outputs": [], @@ -659,19 +640,27 @@ }, { "cell_type": "markdown", - "id": "regulated-railway", + "id": "selective-letter", "metadata": {}, "source": [ "Using vectors to represent forces and accelerations makes the code\n", "concise, readable, and less error-prone. In particular, when we add\n", - "`a_grav` and `a_drag`, the directions are likely to be correct, because they are encoded in the `Vector` objects.\n", + "`a_grav` and `a_drag`, the directions are likely to be correct, because they are encoded in the `Vector` objects." + ] + }, + { + "cell_type": "markdown", + "id": "regulated-railway", + "metadata": {}, + "source": [ + "## Simulation\n", "\n", "We're almost ready to run the simulation. The last thing we need is an event function that stops when the ball hits the ground." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "brief-level", "metadata": { "tags": [] @@ -695,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "threatened-alberta", "metadata": {}, "outputs": [], @@ -713,13 +702,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "special-background", "metadata": {}, "outputs": [], "source": [ - "\n", - "\n", "results, details = run_solve_ivp(system, slope_func,\n", " events=event_func)\n", "details.message" @@ -730,14 +717,15 @@ "id": "iraqi-appeal", "metadata": {}, "source": [ - "`details` contains information about the simulation, including a message that indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", + "The message in `details` indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", "\n", - "`results` is a `TimeFrame` with one column for each of the state variables:" + "`results` is a `TimeFrame` with one row for each time step and one column for each of the state variables.\n", + "Here are the last few rows." ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "prospective-external", "metadata": {}, "outputs": [], @@ -755,7 +743,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "medieval-calvin", "metadata": {}, "outputs": [], @@ -774,13 +762,13 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "gorgeous-survey", "metadata": {}, "outputs": [], "source": [ "final_state = results.iloc[-1]\n", - "final_state" + "show(final_state)" ] }, { @@ -793,7 +781,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "failing-bangkok", "metadata": {}, "outputs": [], @@ -812,26 +800,26 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "copyrighted-highway", "metadata": {}, "outputs": [], "source": [ "final_V = Vector(final_state.vx, final_state.vy)\n", - "final_V" + "show(final_V)" ] }, { "cell_type": "markdown", - "id": "vietnamese-diagram", + "id": "official-handle", "metadata": {}, "source": [ - "The speed of the ball on impact is about 26 m/s, which is substantially slower than the initial velocity, 40 m/s." + "The magnitude of final velocity is the speed of the ball when it lands." ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "structured-adams", "metadata": {}, "outputs": [], @@ -839,6 +827,14 @@ "vector_mag(final_V)" ] }, + { + "cell_type": "markdown", + "id": "vietnamese-diagram", + "metadata": {}, + "source": [ + "The final speed is about 26 m/s, which is substantially slower than the initial speed, 40 m/s." + ] + }, { "cell_type": "markdown", "id": "continuous-quick", @@ -851,7 +847,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "spare-burst", "metadata": {}, "outputs": [], @@ -871,12 +867,12 @@ "As expected, the $x$ component increases as the ball moves away from home plate. The $y$ position climbs initially and then descends, falling to 0 m near 5.0 s.\n", "\n", "Another way to view the results is to plot the $x$ component on the\n", - "x-axis and the $y$ component on the y-axis, so the plotted line follows the trajectory of the ball through the plane:" + "$x$-axis and the $y$ component on the $y$-axis, so the plotted line follows the trajectory of the ball through the plane:" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "id": "dated-browse", "metadata": {}, "outputs": [], @@ -902,34 +898,39 @@ "A trajectory plot can be easier to interpret than a time series plot,\n", "because it shows what the motion of the projectile would look like (at\n", "least from one point of view). Both plots can be useful, but don't get\n", - "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused." + "them mixed up! If you are looking at a time series plot and interpreting it as a trajectory, you will be very confused.\n", + "\n", + "Notice that the trajectory is not symmetric.\n", + "With a launch angle of 45°, the landing angle is closer to vertical, about 57° degrees." ] }, { - "cell_type": "markdown", - "id": "cosmetic-aircraft", + "cell_type": "code", + "execution_count": 34, + "id": "atmospheric-logan", "metadata": {}, + "outputs": [], "source": [ - "## Animation\n", - "\n", - "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", - "\n", - "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function." + "rad2deg(vector_angle(final_V))" ] }, { "cell_type": "markdown", - "id": "neither-craps", + "id": "cosmetic-aircraft", "metadata": {}, "source": [ - "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", + "## Animation\n", + "\n", + "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", + "\n", + "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", "\n", - "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." + "The draw function should take as parameters a time stamps and a `State`. It should draw a single frame of the animation." ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 35, "id": "starting-fabric", "metadata": {}, "outputs": [], @@ -947,9 +948,20 @@ " ylim=ylim)" ] }, + { + "cell_type": "markdown", + "id": "oriental-inclusion", + "metadata": {}, + "source": [ + "Inside the draw function, should use `decorate` to set the limits of the $x$ and $y$ axes.\n", + "Otherwise `matplotlib` auto-scales the axes, which is usually not what you want.\n", + "\n", + "To run the animation, uncomment the following line of code and run the cell." + ] + }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 36, "id": "prescription-boutique", "metadata": {}, "outputs": [], @@ -1030,7 +1042,7 @@ "id": "generic-shelter", "metadata": {}, "source": [ - "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" + "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / m$^3$. How much farther would a ball hit with the same initial speed and launch angle travel?" ] }, { @@ -1074,55 +1086,169 @@ "\n", "\n", "\n", - "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" + "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. " + ] + }, + { + "cell_type": "markdown", + "id": "governmental-error", + "metadata": { + "tags": [] + }, + "source": [ + "The following cell downloads the data file." ] }, { "cell_type": "code", "execution_count": 45, - "id": "therapeutic-onion", - "metadata": {}, + "id": "understanding-mason", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "import os\n", - "\n", - "filename = 'baseball_drag.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'baseball_drag.csv')" + ] + }, + { + "cell_type": "markdown", + "id": "familiar-bargain", + "metadata": { + "tags": [] + }, + "source": [ + "We can use Pandas to read it." ] }, { "cell_type": "code", "execution_count": 46, - "id": "returning-fellowship", - "metadata": {}, + "id": "spatial-finish", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from pandas import read_csv\n", "\n", - "\n", - "baseball_drag = read_csv(filename)\n", - "mph = Quantity(baseball_drag['Velocity in mph'], units.mph)\n", - "mps = mph.to(units.meter / units.second)\n", - "baseball_drag.index = mps.magnitude\n", - "baseball_drag.index.name = 'Velocity in meters per second'\n", + "baseball_drag = read_csv('baseball_drag.csv')" + ] + }, + { + "cell_type": "markdown", + "id": "weekly-flavor", + "metadata": { + "tags": [] + }, + "source": [ + "Here are the first few rows." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "returning-fellowship", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ "baseball_drag.head()" ] }, + { + "cell_type": "markdown", + "id": "spare-thompson", + "metadata": { + "tags": [] + }, + "source": [ + "I'll use Pint to convert miles per hour to meters per second." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, + "id": "liable-concord", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mph_to_mps = (1 * units.mph).to(units.mps).magnitude\n", + "speed = baseball_drag['Velocity in mph'] * mph_to_mps" + ] + }, + { + "cell_type": "markdown", + "id": "forward-acrobat", + "metadata": { + "tags": [] + }, + "source": [ + "I'll put the results in a `Series`." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "designed-inclusion", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "C_d_series = make_series(speed, baseball_drag['Drag coefficient'])" + ] + }, + { + "cell_type": "markdown", + "id": "consolidated-offset", + "metadata": { + "tags": [] + }, + "source": [ + "We can plot the `Series` like this." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "sunset-kennedy", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "C_d_series.plot(label='C_d')\n", + "decorate(xlabel='Speed (m/s)', \n", + " ylabel='C_d',\n", + " title='Coefficient of drag versus speed')" + ] + }, + { + "cell_type": "markdown", + "id": "forbidden-inside", + "metadata": { + "tags": [] + }, + "source": [ + "And, for use in the slope function, we can make a function that interpolates the data." + ] + }, + { + "cell_type": "code", + "execution_count": 51, "id": "heated-belfast", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ - "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n", - "vs = linspace(0, 60)\n", - "cds = drag_interp(vs)\n", - "make_series(vs, cds).plot()\n", - "decorate(xlabel='Velocity (m/s)', ylabel='C_d')" + "drag_interp = interpolate(C_d_series)\n", + "drag_interp(30)" ] }, { @@ -1135,7 +1261,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "id": "engaged-provision", "metadata": {}, "outputs": [], @@ -1145,7 +1271,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "id": "directed-fiber", "metadata": {}, "outputs": [], @@ -1155,7 +1281,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "id": "framed-dealer", "metadata": {}, "outputs": [], @@ -1165,7 +1291,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "id": "accomplished-elizabeth", "metadata": {}, "outputs": [], @@ -1175,7 +1301,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "id": "going-techno", "metadata": {}, "outputs": [], @@ -1185,7 +1311,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "id": "brief-saying", "metadata": {}, "outputs": [], @@ -1195,7 +1321,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "id": "spare-pregnancy", "metadata": {}, "outputs": [], @@ -1205,7 +1331,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "id": "catholic-staff", "metadata": {}, "outputs": [], @@ -1215,7 +1341,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "id": "broad-sequence", "metadata": {}, "outputs": [], @@ -1224,14 +1350,12 @@ ] }, { - "cell_type": "markdown", - "id": "contained-diversity", + "cell_type": "code", + "execution_count": null, + "id": "strategic-background", "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "`Vector` " - ] + "outputs": [], + "source": [] } ], "metadata": { diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index b8d7de76..46777e94 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -36,12 +36,16 @@ "try:\n", " import pint\n", "except ImportError:\n", - " !pip install pint" + " !pip install pint\n", + " \n", + "# import units\n", + "from pint import UnitRegistry\n", + "units = UnitRegistry()" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -129,7 +133,26 @@ "most famous features is the \"Green Monster\", which is a wall in left\n", "field that is unusually close to home plate, only 310 feet away. To\n", "compensate for the short distance, the wall is unusually high, at 37\n", - "feet (see )." + "feet (see ).\n", + "\n", + "Starting with `params` from the previous chapter, I'll make a new `Params` object with two additional parameters, `wall_distance` and `wall_height`, in meters." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cardiac-attraction", + "metadata": {}, + "outputs": [], + "source": [ + "feet_to_meter = (1 * units.feet).to(units.meter).magnitude\n", + "\n", + "params = params.set(\n", + " wall_distance = 310 * feet_to_meter,\n", + " wall_height = 37 * feet_to_meter,\n", + ")\n", + "\n", + "show(params)" ] }, { @@ -137,13 +160,12 @@ "id": "exposed-diving", "metadata": {}, "source": [ - "We want to find the minimum velocity at which a ball can leave home\n", - "plate and still go over the Green Monster. We'll proceed in the\n", + "The answer we want is the minimum speed at which a ball can leave home plate and still go over the Green Monster. We'll proceed in the\n", "following steps:\n", "\n", - "1. For a given velocity, we'll find the optimal **launch angle**, that is, the angle the ball should leave home plate to maximize its height when it reaches the wall.\n", + "1. For a given speed, we'll find the optimal **launch angle**, that is, the angle the ball should leave home plate to maximize its height when it reaches the wall.\n", "\n", - "2. Then we'll find the minimal velocity that clears the wall, given\n", + "2. Then we'll find the minimum speed that clears the wall, given\n", " that it has the optimal launch angle." ] }, @@ -161,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "forty-knitting", "metadata": {}, "outputs": [], @@ -190,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "senior-counter", "metadata": {}, "outputs": [], @@ -203,14 +225,18 @@ "id": "paperback-passing", "metadata": {}, "source": [ - "And we can sweep a sequence of angles like this:" + "With launch angle 45°, the ball lands about 99 meters from home plate.\n", + "\n", + "Now we can sweep a sequence of angles like this:" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "biological-evans", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "angles = linspace(20, 80, 21)\n", @@ -231,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "experienced-providence", "metadata": {}, "outputs": [], @@ -247,14 +273,13 @@ "id": "conscious-blade", "metadata": {}, "source": [ - "It looks like the optimal angle is near 40°.\n", - "\n", + "It looks like the range is maximized when the initial angle is near 40°.\n", "We can find the optimal angle more precisely and more efficiently using `maximize_scalar`, like this:" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "invisible-jaguar", "metadata": {}, "outputs": [], @@ -269,22 +294,16 @@ "source": [ "The first parameter is the function we want to maximize. The second is\n", "the range of values we want to search; in this case, it's the range of\n", - "angles from 0° to 90°. " - ] - }, - { - "cell_type": "markdown", - "id": "violent-explanation", - "metadata": {}, - "source": [ + "angles from 0° to 90°. \n", + "\n", "The return value from `maximize_scalar` is an object that contains the\n", - "results, including `x`, which is the angle that yielded the highest\n", - "range, and `fun`, which is the value of `range_func` when it's evaluated at `x`, that is, range when the baseball is launched at the optimal angle." + "results, including `x`, which is the angle that yielded the maximum\n", + "range, and `fun`, which is the range when the ball is launched at the optimal angle." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "vocal-nerve", "metadata": {}, "outputs": [], @@ -294,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "figured-uniform", "metadata": {}, "outputs": [], @@ -319,10 +338,13 @@ "source": [ "## Summary\n", "\n", - "\n", + "This chapter introduces the Manny Ramirez problem and starts to solve it.\n", + "As an exercise, you can finish it off.\n", "\n", "If you enjoy this exercise, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at\n", - "." + ".\n", + "\n", + "In the next chapter, we start a new topic: rotation!" ] }, { @@ -342,19 +364,19 @@ "\n", "> What is the minimum effort required to hit a home run in Fenway Park?\n", "\n", - "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", + "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial speed that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", "\n", - "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", + "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range; we want the maximum height at the point where it reaches the wall.\n", "\n", "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", "\n", - "As a first step, write an `event_func` that stops the simulation when the ball reaches the wall at 310 feet (94.5 m).\n", + "As a first step, write an `event_func` that stops the simulation when the ball reaches the wall at `wall_distance`, which is a parameter in `params`.\n", "Test your function with the initial conditions." ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "studied-association", "metadata": {}, "outputs": [], @@ -364,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "developmental-alabama", "metadata": {}, "outputs": [], @@ -383,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "ignored-decrease", "metadata": {}, "outputs": [], @@ -393,7 +415,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "western-communist", "metadata": {}, "outputs": [], @@ -411,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "duplicate-madison", "metadata": {}, "outputs": [], @@ -421,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "legislative-prospect", "metadata": {}, "outputs": [], @@ -434,14 +456,17 @@ "id": "interpreted-telephone", "metadata": {}, "source": [ - "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 37 feet (11.3 m), given that it's launched at the optimal angle. And that's a job for `root_scalar`.\n", + "The angle that maximizes the height at the wall is a little higher than the angle that maximizes range.\n", + "\n", + "Now, let's find the initial speed that makes the height at the wall exactly 37 feet, given that it's launched at the optimal angle. \n", + "This is a root-finding problem, so we'll use `root_scalar`.\n", "\n", - "Write an error function that takes a velocity and a `System` object as parameters. It should use `maximize_scalar` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11.3 meters." + "Write an error function that takes a speed and a `System` object as parameters. It should use `maximize_scalar` to find the highest possible height of the ball at the wall, for the given speed. Then it should return the difference between that optimal height and `wall_height`, which is a parameter in `params`." ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "egyptian-shadow", "metadata": {}, "outputs": [], @@ -459,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "sustainable-supply", "metadata": {}, "outputs": [], @@ -467,17 +492,27 @@ "# Solution goes here" ] }, + { + "cell_type": "code", + "execution_count": 21, + "id": "curious-liberia", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, { "cell_type": "markdown", "id": "reserved-shelter", "metadata": {}, "source": [ - "Then use `root_scalar` to find the answer to the problem, the minimum velocity that gets the ball out of the park." + "Then use `root_scalar` to find the answer to the problem, the minimum speed that gets the ball out of the park." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "id": "certified-webster", "metadata": {}, "outputs": [], @@ -487,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "id": "silver-bernard", "metadata": {}, "outputs": [], @@ -497,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "id": "absent-encoding", "metadata": {}, "outputs": [], @@ -515,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "thick-jungle", "metadata": {}, "outputs": [], From 76481d757eaceee656d125c588024c77a2a51dd8 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 14:17:26 -0500 Subject: [PATCH 058/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 164848 -> 238714 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 7457da484b39936ab45f5b2896fa3a75bd2a9355..02c0c6b587a5e182db303b8bbb1ebc43855afca9 100644 GIT binary patch delta 133418 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

    A-FgoKqQ1bf#_v=KVZ-~$62YD%!ylviwr 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�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 delta 59328 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 Date: Thu, 18 Feb 2021 15:50:56 -0500 Subject: [PATCH 059/144] Updating chapters --- chapters/chap01.ipynb | 126 +++++++++++++++++++++++++++--------------- chapters/chap10.ipynb | 25 ++------- chapters/chap14.ipynb | 68 +++++++++-------------- chapters/chap21.ipynb | 17 ------ chapters/chap22.ipynb | 38 ++++++------- chapters/chap23.ipynb | 6 +- chapters/chap24.ipynb | 29 ++-------- chapters/chap25.ipynb | 107 +++++++++++++++-------------------- chapters/chap26.ipynb | 123 +++++++++++++++++++---------------------- 9 files changed, 238 insertions(+), 301 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 93b0181a..f3bea000 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -34,14 +34,14 @@ "# install Pint if necessary\n", "\n", "try:\n", - " import pint\n", + " from pint import UnitRegistry\n", "except ImportError:\n", " !pip install pint" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -475,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "consecutive-sleeve", + "id": "judicial-capability", "metadata": {}, "source": [ "## Computation with units\n", @@ -488,13 +488,34 @@ "When possible, it is better to include units in the computation.\n", "\n", "To represent units, we'll use a Python library called [Pint](https://pint.readthedocs.io/en/latest/).\n", - "The ModSim library initializes Pint and provides an object called `units` that contains variables representing pretty much every unit you've ever heard of.\n", + "\n", + "To use it, we have to import a function called `UnitRegistry` and call it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "threatened-mediterranean", + "metadata": {}, + "outputs": [], + "source": [ + "from pint import UnitRegistry\n", + "\n", + "units = UnitRegistry()" + ] + }, + { + "cell_type": "markdown", + "id": "consecutive-sleeve", + "metadata": {}, + "source": [ + "The result is an object that contains variables representing pretty much every unit you've heard of.\n", "For example:" ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 14, "id": "cardiac-class", "metadata": {}, "outputs": [], @@ -504,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 15, "id": "phantom-copper", "metadata": {}, "outputs": [], @@ -523,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 16, "id": "russian-popularity", "metadata": {}, "outputs": [], @@ -534,7 +555,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "id": "endless-paint", "metadata": {}, "outputs": [], @@ -548,7 +569,10 @@ "id": "spiritual-scenario", "metadata": {}, "source": [ - "To find out what other units are defined, type `units.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." + "To find out what other units are defined, type `units.` (including the period) in the next cell.\n", + "\n", + "If you are on Colab, a pop-up menu should appear with a list of units.\n", + "In other Jupyter environments, you might have to press `TAB` to get the menu." ] }, { @@ -569,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 18, "id": "earlier-bandwidth", "metadata": {}, "outputs": [], @@ -588,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 19, "id": "missing-privilege", "metadata": {}, "outputs": [], @@ -598,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 20, "id": "fourth-swedish", "metadata": {}, "outputs": [], @@ -616,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 21, "id": "apart-france", "metadata": {}, "outputs": [], @@ -635,7 +659,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 22, "id": "alien-scout", "metadata": {}, "outputs": [], @@ -654,7 +678,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 23, "id": "confidential-costs", "metadata": {}, "outputs": [], @@ -672,7 +696,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "id": "studied-opera", "metadata": {}, "outputs": [], @@ -691,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "id": "exterior-greek", "metadata": {}, "outputs": [], @@ -700,6 +724,16 @@ "v" ] }, + { + "cell_type": "code", + "execution_count": 57, + "id": "beautiful-digit", + "metadata": {}, + "outputs": [], + "source": [ + "assert abs(v.magnitude - 86.41527642726142) < 1e7" + ] + }, { "cell_type": "markdown", "id": "superior-biography", @@ -712,7 +746,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "id": "antique-landing", "metadata": {}, "outputs": [], @@ -723,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "id": "included-failure", "metadata": {}, "outputs": [], @@ -787,7 +821,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 28, "id": "postal-marking", "metadata": {}, "outputs": [], @@ -810,7 +844,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 29, "id": "legal-observer", "metadata": {}, "outputs": [], @@ -834,7 +868,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 30, "id": "pressing-belgium", "metadata": {}, "outputs": [], @@ -856,7 +890,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 31, "id": "inner-equivalent", "metadata": {}, "outputs": [], @@ -866,7 +900,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 32, "id": "nuclear-thirty", "metadata": {}, "outputs": [], @@ -876,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 33, "id": "available-steering", "metadata": {}, "outputs": [], @@ -894,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 34, "id": "documentary-doctrine", "metadata": {}, "outputs": [], @@ -937,7 +971,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 35, "id": "greenhouse-reason", "metadata": {}, "outputs": [], @@ -975,7 +1009,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 36, "id": "secure-crowd", "metadata": {}, "outputs": [], @@ -986,7 +1020,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 37, "id": "thirty-minneapolis", "metadata": {}, "outputs": [], @@ -996,7 +1030,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 38, "id": "premier-seeking", "metadata": {}, "outputs": [], @@ -1006,7 +1040,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 39, "id": "brave-laundry", "metadata": {}, "outputs": [], @@ -1016,7 +1050,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 40, "id": "adjusted-consultation", "metadata": {}, "outputs": [], @@ -1026,7 +1060,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 41, "id": "understanding-consortium", "metadata": {}, "outputs": [], @@ -1049,7 +1083,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 42, "id": "about-complex", "metadata": {}, "outputs": [], @@ -1059,7 +1093,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 43, "id": "unique-owner", "metadata": {}, "outputs": [], @@ -1069,7 +1103,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 44, "id": "minus-batman", "metadata": {}, "outputs": [], @@ -1079,7 +1113,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 45, "id": "exact-vegetable", "metadata": {}, "outputs": [], @@ -1089,7 +1123,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 46, "id": "neutral-lightning", "metadata": {}, "outputs": [], @@ -1107,7 +1141,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 47, "id": "virgin-cambodia", "metadata": {}, "outputs": [], @@ -1119,7 +1153,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 48, "id": "right-intention", "metadata": {}, "outputs": [], @@ -1129,7 +1163,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 49, "id": "mineral-sally", "metadata": {}, "outputs": [], @@ -1139,7 +1173,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 50, "id": "coral-camel", "metadata": {}, "outputs": [], @@ -1149,7 +1183,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 51, "id": "preceding-cricket", "metadata": {}, "outputs": [], @@ -1160,7 +1194,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 52, "id": "effective-rendering", "metadata": {}, "outputs": [], @@ -1170,7 +1204,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 53, "id": "printable-reply", "metadata": {}, "outputs": [], diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 727b3d4a..6118041e 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -22,23 +22,6 @@ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -363,11 +346,11 @@ }, { "cell_type": "markdown", - "id": "norwegian-watch", + "id": "wicked-dispute", "metadata": {}, "source": [ "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/queue.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/queue.ipynb)" + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/queue.ipynb)." ] }, { @@ -395,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "copyrighted-smooth", + "id": "guided-radio", "metadata": {}, "source": [ "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/salmon.ipynb) or\n", @@ -431,7 +414,7 @@ }, { "cell_type": "markdown", - "id": "solid-summit", + "id": "acknowledged-vault", "metadata": {}, "source": [ "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/trees.ipynb) or\n", diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 6b82fe40..4d7fb778 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -25,23 +25,6 @@ { "cell_type": "code", "execution_count": 1, - "id": "wanted-precipitation", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, "id": "earned-kidney", "metadata": { "tags": [] @@ -65,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "forty-hammer", "metadata": { "tags": [] @@ -87,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "middle-surge", "metadata": { "tags": [] @@ -100,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "hybrid-making", "metadata": { "tags": [] @@ -113,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "inclusive-characteristic", "metadata": { "tags": [] @@ -126,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 6, "id": "grave-occasions", "metadata": { "tags": [] @@ -138,6 +121,7 @@ "from chap11 import make_system\n", "from chap11 import update_func\n", "from chap11 import run_simulation\n", + "from chap11 import plot_results\n", "\n", "from chap12 import calc_total_infected\n", "\n", @@ -195,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "genetic-morris", "metadata": {}, "outputs": [], @@ -216,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "appointed-terrorist", "metadata": {}, "outputs": [], @@ -236,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "collected-waterproof", "metadata": {}, "outputs": [], @@ -268,7 +252,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "polar-flash", "metadata": {}, "outputs": [], @@ -296,7 +280,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "incorporate-launch", "metadata": {}, "outputs": [], @@ -417,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "architectural-growth", "metadata": {}, "outputs": [], @@ -435,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "narrative-embassy", "metadata": {}, "outputs": [], @@ -456,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "canadian-assumption", "metadata": {}, "outputs": [], @@ -474,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "antique-watch", "metadata": {}, "outputs": [], @@ -492,7 +476,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "fallen-router", "metadata": {}, "outputs": [], @@ -582,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "current-tiger", "metadata": {}, "outputs": [], @@ -592,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "specialized-regression", "metadata": {}, "outputs": [], @@ -602,7 +586,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "canadian-authentication", "metadata": {}, "outputs": [], @@ -624,7 +608,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "surgical-mouth", "metadata": { "scrolled": true @@ -636,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "focused-magnet", "metadata": {}, "outputs": [], @@ -702,7 +686,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "sexual-services", "metadata": {}, "outputs": [], @@ -712,7 +696,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 27, "id": "central-fever", "metadata": {}, "outputs": [], @@ -722,7 +706,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 28, "id": "tropical-advancement", "metadata": {}, "outputs": [], @@ -742,7 +726,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "id": "corresponding-india", "metadata": {}, "outputs": [], @@ -760,7 +744,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "constant-christianity", "metadata": {}, "outputs": [], diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index a74f2afe..bf0da871 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -22,23 +22,6 @@ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, { "cell_type": "code", "execution_count": 2, diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 366e22f7..a556d27f 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -34,7 +34,7 @@ "# install Pint if necessary\n", "\n", "try:\n", - " import pint\n", + " from pint import UnitRegistry\n", "except ImportError:\n", " !pip install pint\n", " \n", @@ -240,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 9, "id": "peripheral-tattoo", "metadata": {}, "outputs": [], @@ -640,7 +640,7 @@ }, { "cell_type": "markdown", - "id": "selective-letter", + "id": "fluid-equilibrium", "metadata": {}, "source": [ "Using vectors to represent forces and accelerations makes the code\n", @@ -811,7 +811,7 @@ }, { "cell_type": "markdown", - "id": "official-handle", + "id": "expressed-monday", "metadata": {}, "source": [ "The magnitude of final velocity is the speed of the ball when it lands." @@ -907,7 +907,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "atmospheric-logan", + "id": "moving-handling", "metadata": {}, "outputs": [], "source": [ @@ -950,7 +950,7 @@ }, { "cell_type": "markdown", - "id": "oriental-inclusion", + "id": "current-costume", "metadata": {}, "source": [ "Inside the draw function, should use `decorate` to set the limits of the $x$ and $y$ axes.\n", @@ -1091,7 +1091,7 @@ }, { "cell_type": "markdown", - "id": "governmental-error", + "id": "exotic-adjustment", "metadata": { "tags": [] }, @@ -1102,7 +1102,7 @@ { "cell_type": "code", "execution_count": 45, - "id": "understanding-mason", + "id": "hungarian-vulnerability", "metadata": { "tags": [] }, @@ -1114,7 +1114,7 @@ }, { "cell_type": "markdown", - "id": "familiar-bargain", + "id": "complete-momentum", "metadata": { "tags": [] }, @@ -1125,7 +1125,7 @@ { "cell_type": "code", "execution_count": 46, - "id": "spatial-finish", + "id": "horizontal-steam", "metadata": { "tags": [] }, @@ -1138,7 +1138,7 @@ }, { "cell_type": "markdown", - "id": "weekly-flavor", + "id": "narrative-telling", "metadata": { "tags": [] }, @@ -1160,7 +1160,7 @@ }, { "cell_type": "markdown", - "id": "spare-thompson", + "id": "vulnerable-shore", "metadata": { "tags": [] }, @@ -1171,7 +1171,7 @@ { "cell_type": "code", "execution_count": 48, - "id": "liable-concord", + "id": "continental-defendant", "metadata": { "tags": [] }, @@ -1183,7 +1183,7 @@ }, { "cell_type": "markdown", - "id": "forward-acrobat", + "id": "alpha-warrior", "metadata": { "tags": [] }, @@ -1194,7 +1194,7 @@ { "cell_type": "code", "execution_count": 49, - "id": "designed-inclusion", + "id": "actual-sherman", "metadata": { "tags": [] }, @@ -1205,7 +1205,7 @@ }, { "cell_type": "markdown", - "id": "consolidated-offset", + "id": "random-alignment", "metadata": { "tags": [] }, @@ -1216,7 +1216,7 @@ { "cell_type": "code", "execution_count": 50, - "id": "sunset-kennedy", + "id": "chinese-optimization", "metadata": { "tags": [] }, @@ -1230,7 +1230,7 @@ }, { "cell_type": "markdown", - "id": "forbidden-inside", + "id": "involved-behalf", "metadata": { "tags": [] }, @@ -1352,7 +1352,7 @@ { "cell_type": "code", "execution_count": null, - "id": "strategic-background", + "id": "existing-lighter", "metadata": {}, "outputs": [], "source": [] diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 46777e94..493c75a1 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -34,7 +34,7 @@ "# install Pint if necessary\n", "\n", "try:\n", - " import pint\n", + " from pint import UnitRegistry\n", "except ImportError:\n", " !pip install pint\n", " \n", @@ -141,7 +141,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "cardiac-attraction", + "id": "published-requirement", "metadata": {}, "outputs": [], "source": [ @@ -495,7 +495,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "curious-liberia", + "id": "corrected-parker", "metadata": {}, "outputs": [], "source": [ diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 28cc37c4..b1d88682 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -24,24 +24,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -91,7 +74,6 @@ "metadata": {}, "source": [ "In this chapter and the next we'll model systems that involve rotating objects.\n", - "\n", "In general, rotation is complicated.\n", "In three dimensions, objects can rotate around three axes and many objects are easier to spin around some axes than others.\n", "\n", @@ -108,8 +90,7 @@ "id": "composed-carol", "metadata": {}, "source": [ - "In this book, we will not take on the physics of rotation in all its glory. \n", - "Rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. \n", + "We will not take on the physics of rotation in all its glory; rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. \n", "In that case, we can treat some vector quantities as if they were scalars, in the same way that we sometimes treat velocity as a scalar with an implicit direction.\n", "\n", "The fundamental ideas in these examples are angular velocity, angular acceleration, torque, and moment of inertia.\n", @@ -129,7 +110,7 @@ "The following figure shows a diagram of the system: $r$ represents\n", "the radius of the roll at a point in time. Initially, $r$ is the radius of the cardboard core, $R_{min}$. When the roll is complete, $r$ is $R_{max}$.\n", "\n", - "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/master/figs/paper_roll.png)\n", + "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/main/figs/paper_roll.png)\n", "\n", "I'll use $\\theta$ to represent the total rotation of the roll in\n", "radians. In the diagram, $d\\theta$ represents a small increase in\n", @@ -741,7 +722,7 @@ "\n", "In the next chapter, we'll see a more interesting example where angular velocity is not constant. And we'll introduce three new concepts: torque, angular acceleration, and moment of inertia.\n", "\n", - "But first, you might want to work on the following exercises." + "But first, you might want to work on the following exercise." ] }, { diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index 68d2d92e..8e307091 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -22,23 +22,6 @@ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, { "cell_type": "code", "execution_count": 1, @@ -65,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "progressive-typing", "metadata": { "tags": [] @@ -92,7 +75,7 @@ "source": [ "In the previous chapter we modeled a system with constant angular\n", "velocity.\n", - "In this chapter we take the next step, modeling a system with constant angular acceleration and deceleration." + "In this chapter we take the next step, modeling a system with angular acceleration and deceleration." ] }, { @@ -187,14 +170,14 @@ "The following figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the lever arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", "\n", "![Diagram of a turntable with a\n", - "teapot.](https://github.com/AllenDowney/ModSim/raw/master/figs/teapot.png)\n", + "teapot.](https://github.com/AllenDowney/ModSim/raw/main/figs/teapot.png)\n", "\n", "Here are the parameters from the statement of the problem:" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "spiritual-disorder", "metadata": {}, "outputs": [], @@ -226,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "recorded-administration", "metadata": {}, "outputs": [], @@ -244,7 +227,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "present-termination", "metadata": {}, "outputs": [], @@ -262,7 +245,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "former-driver", "metadata": {}, "outputs": [], @@ -282,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "enclosed-happiness", "metadata": {}, "outputs": [], @@ -302,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "passing-sullivan", "metadata": {}, "outputs": [], @@ -320,7 +303,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "acoustic-furniture", "metadata": {}, "outputs": [], @@ -341,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "ranking-local", "metadata": {}, "outputs": [], @@ -375,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "saved-purple", "metadata": {}, "outputs": [], @@ -414,7 +397,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "black-wichita", "metadata": {}, "outputs": [], @@ -434,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "ranking-google", "metadata": {}, "outputs": [], @@ -452,7 +435,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "meaning-philosophy", "metadata": {}, "outputs": [], @@ -472,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "focused-invention", "metadata": {}, "outputs": [], @@ -494,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "russian-experience", "metadata": {}, "outputs": [], @@ -514,7 +497,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "chinese-cover", "metadata": {}, "outputs": [], @@ -533,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "recovered-section", "metadata": {}, "outputs": [], @@ -553,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "corporate-taste", "metadata": {}, "outputs": [], @@ -571,7 +554,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "destroyed-adrian", "metadata": {}, "outputs": [], @@ -592,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "frank-scene", "metadata": {}, "outputs": [], @@ -610,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "short-singer", "metadata": {}, "outputs": [], @@ -630,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "distributed-humanitarian", "metadata": {}, "outputs": [], @@ -650,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "proved-surfing", "metadata": { "scrolled": true @@ -685,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "constant-wallace", "metadata": {}, "outputs": [], @@ -724,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "played-ranking", "metadata": {}, "outputs": [], @@ -748,7 +731,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "skilled-diving", "metadata": {}, "outputs": [], @@ -771,7 +754,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "united-ranch", "metadata": {}, "outputs": [], @@ -790,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "rotary-brazilian", "metadata": {}, "outputs": [], @@ -809,7 +792,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "hungarian-cattle", "metadata": {}, "outputs": [], @@ -827,7 +810,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "sorted-struggle", "metadata": {}, "outputs": [], @@ -861,7 +844,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "funky-affect", "metadata": {}, "outputs": [], @@ -896,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "id": "illegal-remainder", "metadata": {}, "outputs": [], @@ -915,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "id": "toxic-shark", "metadata": {}, "outputs": [], @@ -931,12 +914,10 @@ "## Summary\n", "\n", "The example in this chapter demonstrates the concepts of torque, angular acceleration, and moment of inertia.\n", - "\n", "We used these concepts to simulate a turntable, using a hypothetical observation to estimating torque due to friction.\n", - "\n", "As an exercise, you can finish off the example, estimating the force needed to rotate the table to a given target angle.\n", "\n", - "The next chapter describes several case studies you can work on to practice the tools from the last few chapters, including projectiles, rotating objects, `root_scalar`, and `maximize_scalar`.\n" + "The next chapter describes several case studies you can work on to practice the tools from the last few chapters, including projectiles, rotating objects, `root_scalar`, and `maximize_scalar`." ] }, { @@ -958,7 +939,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "id": "dental-density", "metadata": {}, "outputs": [], @@ -976,7 +957,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "id": "grave-consent", "metadata": {}, "outputs": [], @@ -996,7 +977,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "id": "apparent-lancaster", "metadata": {}, "outputs": [], @@ -1006,7 +987,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "id": "persistent-rings", "metadata": {}, "outputs": [], @@ -1016,7 +997,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "id": "previous-pittsburgh", "metadata": {}, "outputs": [], @@ -1026,7 +1007,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "id": "governing-component", "metadata": {}, "outputs": [], @@ -1036,7 +1017,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 41, "id": "statistical-behalf", "metadata": {}, "outputs": [], @@ -1046,7 +1027,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 42, "id": "unauthorized-equity", "metadata": {}, "outputs": [], diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index bf0d7cee..091fb691 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -22,69 +22,6 @@ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "formal-context", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# download modsim.py if necessary\n", - "\n", - "from os.path import basename, exists\n", - "\n", - "def download(url):\n", - " filename = basename(url)\n", - " if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " local, _ = urlretrieve(url, filename)\n", - " print('Downloaded ' + local)\n", - " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "progressive-typing", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# import functions from modsim\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "id": "plastic-trigger", - "metadata": {}, - "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap26.ipynb)" - ] - }, { "cell_type": "markdown", "id": "acoustic-small", @@ -125,6 +62,15 @@ "`bungee1.ipynb`, which contains starter code and exercises for this case study." ] }, + { + "cell_type": "markdown", + "id": "given-album", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/bungee1.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/bungee1.ipynb)." + ] + }, { "cell_type": "markdown", "id": "recognized-bidding", @@ -152,6 +98,15 @@ "`bungee2.ipynb`, which contains starter code and exercises for this case study. How does the behavior of the system change as we vary the mass of the cord? When the mass of the cord equals the mass of the jumper, what is the net effect on the lowest point in the jump?" ] }, + { + "cell_type": "markdown", + "id": "sporting-armenia", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/bungee2.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/bungee2.ipynb)." + ] + }, { "cell_type": "markdown", "id": "german-penetration", @@ -169,6 +124,15 @@ "Among other things, you will have a chance to experiment with different algorithms and see what effect they have on the accuracy of the results." ] }, + { + "cell_type": "markdown", + "id": "parliamentary-louis", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/orbit.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/orbit.ipynb)." + ] + }, { "cell_type": "markdown", "id": "victorian-colonial", @@ -233,6 +197,15 @@ "notebook and run the code. It uses `minimize`, which is a SciPy function that can search for an optimal set of parameters (as contrasted with `minimize_scalar`, which can only search along a single axis)." ] }, + { + "cell_type": "markdown", + "id": "ambient-recall", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/spiderman.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/spiderman.ipynb)." + ] + }, { "cell_type": "markdown", "id": "african-relative", @@ -247,7 +220,7 @@ "\n", "This diagram shows the paper roll with the force applied by the kitten, $F$, the lever arm of the force around the axis of rotation, $r$, and the resulting torque, $\\tau$.\n", "\n", - "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/master/figs/kitten.png)\n", + "![Diagram of a roll of toilet paper, showing a force, lever arm, and the resulting torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/kitten.png)\n", "\n", "Assuming that the force applied by the kitten is 0.002 N, how long would it take to unroll a standard roll of toilet paper?\n", "\n", @@ -255,6 +228,15 @@ "`kitten.ipynb`, which contains starter code for this case study. Use it to implement this model and check whether the results seem plausible." ] }, + { + "cell_type": "markdown", + "id": "flying-forge", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/kitten.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/kitten.ipynb)." + ] + }, { "cell_type": "markdown", "id": "future-burlington", @@ -268,7 +250,7 @@ "\n", "![Diagram of a yo-yo showing forces due to gravity and tension in the\n", "string, the lever arm of tension, and the resulting\n", - "torque.](https://github.com/AllenDowney/ModSim/raw/master/figs/yoyo.png)" + "torque.](https://github.com/AllenDowney/ModSim/raw/main/figs/yoyo.png)" ] }, { @@ -336,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "id": "crude-tribune", "metadata": {}, "outputs": [], @@ -369,6 +351,15 @@ "In the repository for this book, you will find a notebook, `yoyo.ipynb`, which contains starter code for this case study. Use it to implement and test this model." ] }, + { + "cell_type": "markdown", + "id": "excessive-equity", + "metadata": {}, + "source": [ + "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/yoyo.ipynb) or\n", + "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/yoyo.ipynb)." + ] + }, { "cell_type": "code", "execution_count": null, From 1a7995195e0c1be14625042099a3d28dddd97eb4 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 15:50:57 -0500 Subject: [PATCH 060/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 238714 -> 238412 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 02c0c6b587a5e182db303b8bbb1ebc43855afca9..e3375844a56545654ed3d9d545eb4954717de90b 100644 GIT binary patch delta 59829 zcmY(JV~n6p*R9+3v~AnAF>Q0&wx)HrIc?jvZB3igwry+9^Ss}Aznt@T0kc z;LHn*M*l81Pk0beh!b!SkpFB|dUh^&TnS%2yTJL*5=GOli|iH?}k^c8%&+0odG}dWwc54-BLNmM8Ho{OLOgw9!7H)m5m!F ziG0ibJ`({IVCU~)=JR6*`^yvc@*lS|jp4a8ppnLR72W-+!bc@zT$cctP^ebbx8c7X z?LDNs&Y)!x;S~f*w&>loGi9?0=D7a$0WWj!)3*2X>di7#%{gY~6GNq1qoFbMDC^?{?rlvi;?L^ArHbZ}n|W=t z7pHFlBb;T`&hY645!FNo<7aAVsSHY5cvpEPW@)2+@XY4#lP#a63VBTG2ZQ}ESU_qaVZ@YcaJut8Z;^#@YuUO~OxT5K9fYO!4w zy+c~q{b?A6&aY&&XSA~ZmS_`KKC1pA6e)O+B%#+A<;NKDMOUcaM%0!q?DX{unFl4I#)-6Hoy#f8Z%TtD*h51*oB{ zi!~QQs#B+`Zo?fLyp$DDTS|Wsf)SR+ee8lQlI5Y-ogP10)d(2vG&P?Vf)~D7ZIexm zGtjm{@0bS82@fk0EgP5oR3&dhVrogcyl|Cy<%uD6(TrFd#A4dD^ULADPef zl!~++1N=OhYtH(Ug7)Xtd||aycFAOh(-~^1;VD5XM;5u|f33$kG+L*Odeac_%oH}s zT4P>I)ww98bL_u;#x%wJUAUzgfM;{L@~YC1%cMUXMQ6!wXO;4#QQcS>2QWUaF?1a- zag$F(t7&!da-`^93DE1?!HEGE>jmYApnoeqBt9cOzs91TbRnKz>`Y4dvD9B#eVVxjmE@OCun zvHjt@HrjG!Nan_35gkdr1+@N-!rUX*^gikTJwwjjOgPt;;=m%4_(vD9ha_jQg@jNj zJSoR~towwHb1LR^B+1UTerwl)6?aOgWCMvt6snEymQ!AJLJ4g`ZGTrGgzT zDoj^s01gg(6f`l4eV|B*^67B1O}`|pMt_YQDloaPj6eA2ND(O70T8XM04ta2pTW)x zSN-%*O0hwzt9aBhE73r3<1yG5^Rk80$&&Se;7zV}E%}Z_khkyL{)Bm|{>rh#EY;Lc z*~wxaZxXkt*dBIZ?>e%5cWSX-I8IarWm>dB|Sm z1o_T6YF>IDwaALE6maRhDRs(ucA+1s(sL7Fu+nI5u<8zeuu#m=Bm8s|`WDc@32VuD z(+TD+=IkeY=cRjIL8%au=fAa6nx4MA=UW(G=E+Vv=$Xg-(dmspEU|P7k2e8R9mFRF z{hIEM4(-q0Udd`Ut#du|>k@)rGE#}ri4 zY6%4-M;(H85+FI)=QZ=8LY`zR&WB6uVt+w~#$gXmKtnywCv;Q3XU_g9--lc2G%5%<|=fONa z4ko55^$VPAia{k%Z2>#-RYPu3iac#YO=VbiLDToU1CXa}8Cw!+b{ROLf{!kav{P#Y zp{BeO&`>UWJhc@4MJmXTyLmE+mLn$H`fb%ofg^fy7k0whSAlz}cm!2xdN7mQi#Trz zrW=M-#1yB9EVwC{Zx@m<44zTmP}jfPzz+e(JPh?|k^}aqGRGY3Gp!1y8$kY^f^JyF z_s}&1^wWee&S)dKa6J;n!I*;Bs4;^+*~AgVCw~* z31C;<3ZY~Uk@AdOzg&buZNt?F8KVWdCuId(rpJ8Kn3vS&XmoSEcMxW$W_#+e zS&<&2F~^PYkwQ3dqKpy0+9irvbIa2pbms}6>$LXw#5T=mWhROAeee9qA7d2;NqV`l z!uudaGe&W6`Z$g~tY~T7uYHA zzdSfW6LGQWS4J3i`UCRCoucxqmWBwIW|StI{U&Q%$+_dlhqC$i^{4f@xIXbxtKShl zQj^3rV$I1mabhyDAovh z$@a{YM>}m`GecuE~yif#m_?0vlQ^JrQVDM7Ps-ipZ0-AkZpTA$?rlhFj_^7~`eHL^x(4 zML-RV4623oNh4Y;9b170>SjAMHwU8ZO!=3_3KR_^m1C`vOzP0-_XS!r^FC z#2SrqXrPQl2OYe-hWkSUCfYsW#he!-qF5+}QL6QZ;tdX0orj7VvP%SM*-Nz81f&xJ>i9I zdqg;vNes$X4le#ntALQ9!CwMiM(bLjO7aJ7Y6LNs9+wNt; zeG3}*Wgq}|&^c9Oi#Nc=P2U<~)u2_{HD(hKt3hgF*XGTX#%B5TK7^hJZ|{9cl}|Ff zj8;kL@y#|su?EDuQT~tOi}k;wLdi^YJ~W-(j!#<{vC1}V3F>AwaIHjox_@!M z_zi8S@u&|1%L=8vxE&qv*l#IRv zTBSg*#mRz|va+C}l8i;lFSoyCz^FJHWxg@4$sYh$lfl2>3Uhr%e}A{%U|mh0uv_x% zdafB`PI3CtmoPc=_u&yD%vAhaOkxHS8-VziATcU`$zarNqTM50IWn)#^r$&uKFqls zwVuXpHf@Kdj)s<3XS2_naCpRQC|7E5KE5Wy=xo-V)T{M=5dtH+eHYAdO|FpW=AkNI zOjgLaM`=PtKMCE03guA&YN|RweBptbuE(0L6wgK@NDOR~?auH7;&EcZk)vGi9zdm4 zc+%7$L>CuW@G~IRSrZCFE4_Z4e3Qa=cBU4w3C-)x_raXRL!COi`kj|8LRNgVf_fJ2 zI&+etzBEbI+qsutdgPEMdBIQfH|K3y5BdjGqiKrlQluh45Y|a9VUzNUBIu-uBlQj5947Zzk1+`mv6;{1p;RwoJOQ4~pW@UH zPyOwzs?YOe>X-v(x!-f$)F&eVc`lW!U8XJ_TB;uY$(!6~^{uU!G}E`Ml%Y{OMLi<# z^_i!r@w9W;H2>9app+{!#zmS}-!W8C9-hP8# zjB?PZ&r17#Xgp}>qnU`a7y&A@@^SD};AaVr+m+R)pS-#4^7_#=2Y%q$bN)}#`Jgkt z%XjA7cHKq$v*PUuj#KIbdNp74CgoAougBJ;+b`yrd@nC|YCT1K0X+hw9k?OsQw+vw z>$Uv%OIr#TpoMFo3=#E&g9d>Wo%@nWN#)Yqyw-}*uBx4JeC68mO#rF+nd4zKG(y(H zTDaXcB_Vc^AwoxJ*}QP@X#pA$+l$zyjZiDt44D|#H^rQsGdm`#i$KfMEttFL>+so@ z7$Lv6B>0c3A?KhN6kC-W3%l0Ds&MCm^Oycs`;*{8*kn?UZKTl|EZ^)p8|rdtWNYYe4IJx~(0|78RQ@9d-1TLtPXi0aT&ScYQ4753P)j`f76QxV7KVMYn_c;?K)OnV>(PwQ^Lhey`HUU^oo8^D}_$cMyb|C24 zhOKmfqDb3XYSqi}p1DgHWZjSUgU_2)I49J>UEZi}@Py`@wl5f9jo5~8MxpE_sOyAyXb|_t$D+Kt0ZOEKf;qnVr7<29YZ->)EjeEAGn83p z@bT*!wr=t9ZlD(l$WM$J@Lh4Ubc(uSfmlp{ay@~3ilJ#U;W%L<2xqi7#(SHIL!rFw zyG>*s*eXBF!CEL6%uSkr-kq|sFM6??dU*#eig}!mbdN2x?IQb&Oiybm zQ20IG;N$2E>K`eFGR2Ceq|X8qzC?#l*C%>PrMOxyT|N|4?D{5M0>nt8Vwdg49y+Jy zTWVbSfU-!fnbvmBCSQ+A7OTh+T5A+@`)S2=QF1=5UE>cr9o)~2Zh|JLS4g8PtJ*e0 zGX9|xC2;ubC7;ro&MDJZu&8n`Ec9Ys?OHuYnwGnrH`p21dO!V>%B+J8? zRw3L1ulv>bnpcCdlR?5K>vnr4sxeD@$u3Vpz}Nlh^%ZL-Hyd#J`nXtq{iCI?WI;@> zU$%EAJ#ajHKT#;~ZvWR>W#U?js$-EYb92n>+P+stm@8!SONVaQD7H-;uDy6v5>n@v zaCi|x!{VvroRnXnbdT|K53by^nL%r+VsSdAL)rt>iRR+iDuuh^e5_=RP(+&B>j6$tK8O^-!|SQEng|u;Q?I(6Xsuif z(jlYb-_VRC!#??rbF~}0LY~0Ja(UNHLts{GKl4{DY(?$~T2Z-Rs3`l9FZR9Qub=WG z0^YB8hb6;%c6Ux~8x#!hU!61!k1x~OK=9^#XFR2(YtQ57peH&Xm@n=mh_?~sl z?l3{f>7q0iw}@Pwu<9K12Xigoj?ZZ_$}NR(H@WWpUz(rKhsC4Py*?^v+@6nZ2F{xG zdA!g^fiZOYX`NpcLju|lqkmz9ui=<7@BZwxCw>}sJa!%8vE8P#a3S;ioo^!`0a$h> zh1^}XxS2dXE;K(UKo~nxTqFl~#n$&yVb-Hm?FBc-;gC2^^R#n~C@a6IiM`b{?C-my zQ%jgNTTTYRi1vrvxGK4)bB+#)!(3w%+KV=%0m(}FNdHjKVCJL+X zjqx;++ktpD3cf68X-}#>SN>VF_@F6_q~-p5!D;iZ-a}(L_qodj(aY}i>4MyV>?g=k z@PtuP-)msA>o^1&hatx3H58+moRVh48=V{L$GhtIk5x+oF+rMvOjk{Drgb<&dt-zWUz9u!sNW``3-0T+2|CbT|N~EKkr;NG`y`Z ziKwcuL~{Ko7;6ZyN~2Qn8RUw3w*MuxLctAQ(;JCA1zFkiHHr72wL6 z-g2CvhF4nT)qt6pX zljdr(V@+>Yf67~jz!MjVmNfdC2kIjvyM-exF{-&W!q7bN2<8NShI=ul?8-sdV^sYb z__vhIJ1ErMUO-y#TzR#ku@!aOq z+f5#qu}d(!1rbKxow#;tb;8{gD>I$I^X0$iMR}Ztj@DO*;Y!!^*cRw~4iFG^VAH-D zYvRw}`^)8FH({r%`LJmiV9g$V8QJ3IghrQr+xDGp&U7zq#i~SAK_ZTu6g2<@+&|%Q z7PvO>zIG`T)*&yF2AEQ0_M9CZ8Q&Y0)=X0rmqRl;1EX+ZM(43if8k5(I!WQ$9(2t` z>-9{^MOj8`is^6}k_#;N1yQ%j6^I~R!yZibj$1-uV$P0?3Pgfd$L%$1y ziw7qgIPP#$n zH~G6C%q3X?Y5U-gTna$(X^KlXCTLji%{|HFY^pR9pI??ZH3Up?518#a3IN zC0t)sy2E{~?4V);+k#y?S#^1SgWa2OO~asIP+YnpX{Xt35qn!LGRR%i{ZItmP}uuR z3p?YxS<6yPkA!2ug$j{w9x|vx5|W$HuGoxJI8-elncNs4+2O6wgk|@LZU;nY*yD^M zaFC3eGGiR{*zZX|2?`F5&!}1}UrGC;LRu@LS@4=>&&O(R8i}%iWjT5MgO6g&!xFEh z#AgniQLQ;Pm0vl0=q^Rp#}w3(VsY#)CGE2q9fvdsV5 z#{9U%`NO_*Jz&ofT_~SS`%-gmeP{^)U2e%+;zlWX`cVU z=zaTp%8p9OLXI=R`AJ_mA}1icq>@@LTw0H+k**2j$d@nDWl09D;oD6EPNNI^?BQ zb?I~0>ucFOKe*I3Z zLmggy+0Q_p+^8Sp6Qmm_Fq!*8A#1;=_jAcn=3Rr_EMxT`?h~zc*=YjEa<7ATf@orl zs{rH)4dSJ&rO&0^f%7~y%2r4T{`au4uDsT;bG!vR319~HFs2!rLC3(?c5(R&7Y#hL z*N^-40X6`ZzK|)&DmSxVi7~fLN)xcWlZH; zA32&63<=}g-vK{@YHA_V;k}Zm2t*?ZKSm4ax{?%aWSDqZ%G6Bz_)JsXk+)#5=mH)X z6hNrP$^d#jsew%l4W(@bQdwKlTy4@Jb105u6QZ%{N$FJ_#9IZJ3%Tn`p={w3VFsD)6&r2&*QVJy-FT`Lyx0GTR=jx3X$tgQ?nUC=a(rtMzK5 zGB;Q#wl)gH&5Nh|-R+979}?>2!+MNLCwdn*q=q9fW79u+{~G^PfFooItXs)>N9&m| zds($o^gifqkcop(b920MHsP2( z+rMsCm*Vw<4Gkva+)&(X1bKEkQRj{j`2)+*EWReM&$Elv2K<5cFj2B*=cG2sbF+oi zyy@n>VzW$Q-CFW(TYC!6vpdwGMG?IJ{NI(89lq>8)UgSxD&`q2Wvl1-wH$u1NIe7- zU^s6nIfr!hSgB)JqaI#*(o%@7%E{v0N!CebCh7H&PFakUusD%i6gLs+*NZGQ`2Z(s zA*??XI~!oSWM;{HOWgxiI$ymcE}brq2Bgzdu20A~w1_D+ zu2Nibs9^O_+E{F^RCVfC4%c7)b}P!cAuE0TQkapxP3m^rTGCQz1M{z9VE@oo~M>R(Bym)iMq$j6W7G~gc? zwk93B|7v}0riPCxhg>(t>IoiJ@d|+xH2-wBrCGgb-i~10P)5Lj7IgHFP)?hPwKe1U zrHLu|n$K)fi?A)w#0DocZ{KYRRoImMxX-dJ#+RDc&7KIA8u~$n?GRg49uEj;W=KR; z-0Q7a3lJa9Y$*6~Y3d~}=Z%PMpNvPObZ!EVs(~*U?kR9(>P)aeR>kq88R6lvJ$#NCWwR5=|pxnIUvD7DD z+_oXA4E?5e;9gelwaF$@0stRy#@82^%UX&Ag47Tk_HY=Xn$VsY`gJGu#*7KuY@8?J zsb3e`Cr8-zW;TxLUKA3??6otNoH?iA9=S~BU~5NC9|=@8eQXim&tDzqwwOW;;-IRO zCm%%6lFl=|v3ub&0<*qXPkn$&dT{+&OPsReHw>`r#G(GMfY3G2ihkHc66J zLhR-{R;?UQmaFIXxv2=(y$gC2{4Ptm6OIm2nMzs8_eL>@Ar;E#)nTGKX?0WGR85QO z{sygdaZID>*J{;SmIrh#z3&WgjwHwBGDU)2YvU5n${EcmdTcF}m-1yJ`+!iFho~E@ zp1bUOZaAldmlF+Rw~+wv50ymm+Mj3XqD@BN2b-2jVncJD2rw|>S9zO_uDWGsle>Ov?F(Fd>U#X)7wQb&V?C_rrIAg|em@QXwLWO>9Z zSemsOd)qDr(C<{xHN z{Ah|&E`jR{=Gv89ZrOJ5z~L!j|K%Rerz;#siT0}V&tuQK7g+S$^JQsUH7XQ)Z!qq` zOK{}=!%}>90pHJ0E(ZfQp@G)4BxxV?rY+h#~5_^sONil~S&ZZTDNQqR1m;@R83Ko_=!&FSexOi#2YU!T*<8kL6smup zVWMH#@)iap6X9F+W*XzgD$;Vyj*J^4TmRtooCoVMYbz(5l*|IbyifagPuMH06fWaf zI41iUfbm=NZ1=6>CM4PtKb$HRB{Wz@JmA2%85#r?ZaUYajk!}<32 zS-q#SGMmx}Z(+gO4JNDJ+BK%RE{qpxwSqcST8|GY<6p(If?~J4hsKKzZ*MQHlK&KM zQIP&(>DMSbW(s(Nliis!o z$C)V`Q&AA?jBa)ek!8H%JEpdFqIMdz-jB%Dn-fL*WMzek4*76oELWTsmr|L~(Wwop zPRK6WuoG9-koiXW)%Vf0*3odtRO8|*v@ICj)PdTjZ!*97U|dHjQ=<&{^K0wmON$gV z8Yk1}0nMs2BM@C&2ldY1Qw4L^{AeB@yGB4sr9%5lT@ADcl702IJbdz5u*vr4^H)jl zT%^027eZe|$h})d@;4jI$&p2D#*nHCAMn?>GWnQN*(!2THzehx8+?l)6`cgKUx*Q< zj=#|~DSHbZL>5?Wmcj+iX*AqKAmUZBCQ(x*0JDlT?G5q1a~p}o4Jb4^W>E*(28`qd zR|j=5J4*M-crzWo75D;niliy2gJY(l2z3;~`Ht^H$RkJP+*Yqd4G%zS*I%NC;+i}f z8rpOk6095A`lHv)ul*iM{y`FlALm)4ki!_|yPDw<9dU$kqB$ggnkOHIxV^P*UK*IH zfVDqys>S0~OJbN$ac#Hhg*5ft76jQI13V5C+`6x%fMwq2S*R3cs;V%hc%&i&T}&EA zmPiMsG1ykoaZ^M;%sR#KZJ6ool(CIV+QPg&+Y>}Sn)bZlc5Yv*sv9EC!2^XlZ1~~K zXzfUMSA>jrz*@{M!ym>uj9^$bHU$kRfaOfY@k#BF_I8hy`SEFIa~MM8JC(oqRm))d zPRl_R@o=Xbrh! zEp|3Ez)FQXEUwlRsfr5ZR6_f>U8_ud;1h>a*2jUB@s6@Ml`gvi&nfPY)JRSPpp5)F zs2utN8(qnw3SldaJ~M&XfGFS2C@bO~a}Wv=9BjgKVNk9@21R1bRMjz`OWybO>OQM= z(9orp+o2cEi`+@p>c=PeI>WUeferl4@asvS*_cdvcyaF zJY+ATHo>7*tpgQ6`O9AHEN@~4zY7;qyWQ9F=%BT3~4C}8$iG1$lBSoBw{+$x!$5Oio8;Jp4 z5;{AzcI^XL9d1O{fwE;%nc6{;xxg-Ub2u6D;_dQh_I#)?M>_6BldH$|H%udt7|VH; zqwflY1y5z?v|N7IPQ4g$0P&BX%^un3d#~%K{eoYa;bI@b*0su5G$8&&s3l?Gqm(_j zg9<~P%P{x1o~+C>Ho29@`-vi1>#w#%o@(v6hqS6@9jy?4t~Y;SpmWQ>d>tlxDjcmDFH@e%db$O{rLL==E1mu5H3(gcroTr092)SeMio)9nc319Iy{ z+7xzF8rjGXX+fXW2mxT5-_7p6j9*lF`v1;-k#zoO+@2y|`dvVq&3G%<5lamyDtn!q zt)pw58CXr%JC_UK0ioyVlE~4%7E3UteTGR25x*q-Tm@D9C5mui2;RiTes2|J?)L{{Q(F)-1>|^Z1tc4xm~?gJi-N|gFX;s(R#(5; zAOso8zw_X+_o*Skb@@U<7&QxG~S1jiXxG!t`|nC~Gz zN4Q;s$Rw9cYYa#Ve_JWF_QHW!R5s1buMm9j%(R;YM7t$1F-SS6^GZNC|FTf#iW<Y?WVml)~hH8EK*WrMxebeB4}G73DKqVgg^;QBC_DSM&s8iYq@*z9h^fahbkn2 zAl%S`NXtsIJ&9^>feTm|HhncGI$yiYzV?Nt7xs9etQ4s z&NK;lk*b()I;+*#U^G%ne#Oi0L0xdu{8FTO@CS&P+Nxo~5kI=~#HaFW9eBgFfJ4Oh zA2~9sU1Ts8LFjNDjFCO3OwZNe4N{Or1X%yjEYY9dmwYCf#Bk>GC0#PSU%_eZhm%pv zk0D?}zDVZASdH}7oMQz&3;0oQ#@wq6?cVLI!C+}a_d&0k%t{60aIjJd%2PjF^c$kz zu1=~sJZ|65Z08U%>k3V}XDz5Y0Mk^q+erCBl~6TYgq!b!{utl^2wIZT_T7g%MEipf z2h&X+N%C?w%Lc3k)RHuGZ^Lj5e6c-eRFqy0pM$=^O5RW%eeJ!2EQ zl+fa{V~2Lm=b^C1=f`cD0PF9Gm`~A_Q`}o?9UKAAuDh*D)WyEtb-dOZcZAj5R&+tm zMMQGLS3md2yek*yBk?RKIH_q8m^zQSPoZdOtgi8=>ngiv5{K$3e?DdZB-;=Ogen_m zIan3CVQ2c`=VD4G-p7shy-5PBeSQtT<|-F=GkOs}g-ivFq$s>V0486TONZLPscJ?| z=2Lm7V9}8~F!#`{B4cDZ`$|^NRB|NEtuoG5l}N_a?+w#a1|6yHpY{A z4sLp&Ll4md)u?;05`UR7HxhUe4<5Slho(qut%r5(K`5JTVIFU~hi8xS6&Ci*E9LCQ zKHmgtJ!4b0z;<$m!00CtxY*J;EjylGGT_lG20}UCMAa+g+k0U8BjJv;hJ&XS!0*84 zX5~q%!!ntLmYKbZ7;ko+8>hM0oUBQ|sOsa^NF<7Yt747CW6)0DfSl-z6pC#P^()4I zY`=e;A7iHdKHLb3RYy)};1^{)Dx)l?Q)icQ#zZr@+40+)6X^zi51rOuAjkN&B>BpX*nR$!jD%mQO#LD;>-!2!4L?} z-Q3myg13lgYFQP?&*V@WkhzqWHK_6{3pbq{zT~MfQVx$-#5 z-ML2Lfr_UrOjaO#HLNRRvpq=9zDzC99K}om<|GUZuc6b3R$nJ*hk@e+#(pkw5?mUn z!JNm7w)v@pL^2Vj@pK3Lff*lVds4R|_kP$uyw(Q`)7;C4^Gy?Rzu**F%cuYGNiI#H zF;}WsWMB=hBzx(evf#?Zt~WkNSTLwjB~uj|elVudk|(igN6QP(%o_-dFC`I=dEf$)<_ZnR9 zantMTtj`u?%47fTV5=X&TE%L=Bn{fz-rmj)P$r+RIWcmc;R*R-hV z^eQ7!!QBZzvu|Z90>=VBSJdd#@eMmZS4Ey{u_|nv zMp{okqGw6z1HE3k_+N;d%rXk@#2#fF&2?A5| zcsgrif+ij1y~=4MLmMjO%y3c!pA{_|I}_@JduO4Jh2nIl$4g@pPIZ5eeQM#4Pi2_w ziVaRFzv&~LCc*(&cvEMVg*`h4`NRH@QXLSsa9trGgR0i;!;OJh8s5Io7#72k_+!AC&OthoZK8T3f4FG7L?Jcf^Cq}2xiquYk| zCkXTp(E41-I=~-N&uwBC*hnOq5e?M?gUYlVR`wF)72*YBI46~a`BhvX@SB=#ZQ1YY z)_y!D$bE-p+yk8srJaHOl8H$eaicDIHc&nCw8Q9+EG{PBCp<536*B%pszmWZp>L8e$lCVbeRJp^Se5D4P2Y!C_nn?F+Z-r!RSUJ6fifpTW86Wh3%IY$i26_3=m5(yHHH zz0E`Ig*66n0=lIkdVsFtHsJ|kUTZJ- zdQ2E??bTKWS9ylhvC632+20WtSzqFkYU-N*y2s+rvfoYLIQZX%G>K2*~1lyte&&OL*^BAMv;}xwuj&DeUWc=%njkFGMNb@g^v%en-nVDf#S@lR*u- z?>=DDQ204QaGIGu2koJC``ktQdC)L&nQ{xLX`g_CS{M|p@ZiH;XJ_@es%tbA{c$E?-LXS zO6~L)atEvv-=R#{crO;mvqO-+oP0K%e?m#~3c4!=nmRk~nhk56(-cw6Ed7&^koSxFkzu*F5J;wt`)~)1{&8!t{BkD50rimyYgBZ_q zy%;O0A=)lbsg?6Sxle^Ia!AK(=_`O<^WLoKBUN`^zQNqmmwN<2FtedY<@Ad$+c$>n zD_F>IXC_sZGdG*{BfIz19CdTRcY5uQRRGgga88Z_z8&j=GW2;8B)lItCU#OjM)0|C zCAIyYEj1-!d`@rR94OvtRbid+WQy@rlMY@=0N)Jrt7i{Ud+$jx+qlXY7(L)hclAe* zoeE-R=VNRxrY-7cvkDF~@l1-2?XFb*;nf&^g|Rw}xB*oQ`7O0TfMlOY{rFiIHtz8Q z7+%6k?%W#|XQ>pq3*7K(0wH%2r({qY)oahi5BLW#9<4cCenfri;uP;Wqm*xDd6cPV|DmpNUW z+K6916WvJ0^iAqf8Rop8jD9Yw%8TU7Nlh1?@QK3I=KhSna6|mvCJD<3ig(fmx=-_< zH8Yyk+e?h4vBN)$B+TPDXDPTwekb%xc)qZF)l_2~(w4U;XH=J|cNEB`hTe-&$s9pk zGOCn)5RG&Ve=4-MA#&D6j}6?2Bn#Pd$90ShTl_zSeN%WQz_w*<+qTiM)3I$k9ozY1 z+qP}nwrzB5C)4NN;nTdX+F#XURqch%jO$@y`4lolk{_wCsKS#I#)q64 z;VdBXZR?LQ*h#wh`7bCpo)?_0F*!_)_1|?le7IX@F0)f!vyflXi*L(8qf*TKpN^5n zZjV9}a_b|lhXXDWST>6EwinvXVzb7 zbEoJa5y_bi{eWQV;`$Ag;>;>g!H$bC-y79*f=VdDa=2ENFl{PPr6~K7LWa-GmiCyz z^?kHc+OMbm$Tw2Q%s|hDsv3DZKeNjA?mOw7OvY7GYpBv+U{Bk6m0ca76dD3Z3Yo9Um8wIKB5gQBkqwU zxU3-&^iV&5za`1AEzGS1s9pU{v?s1DSdFatI&;FP$h_7bV+Y4%wFxH48~-Mp!-llV zKrPt*?a$B6^|ft;CRtIUJU_%roge22Ndim@pdmF(@|eC&8al|{fQT|RwTQwH>BDg0 z7`L-I04@hE0hVe0+&YcJ7*m?elf-U*Hvl}!z|IO`q&6UYkqB>BXXwgzV9PTRzSQVZ z!H}R@`!38;_;89n>oDJhvJ@Z1(r++Wwk&{&+{Ky;Iq7eIe)q2O*4l z(4vBI!)ehdOm-8fm`bI1gYxjLtJH1&^S~Af((MrbvyDr;S>Hbw*8IoVJq5uG&@e-j*XYjCgHjJGX-%G#0R;cH7RuoH1+w_xh7nf z=?O$mCe$y^750R2K6n$q;Lak$2{)08t~|k$C)WqT#aW`I0Un?lC#af0AzpZhMw`rq zQS%E7ao*(cL2;Rcas@8mSBUR747K8bZC03)!gaI~IP3F**f%a)e+q^i;GwT~W6(L! zP;x`C-5SoKfT0nHNMRd7k9xZ;L#0zfP8BqYA&J>U)DRtwUsf7qU}*r#=i&+H^?d`% zoKFP0AbHYVoVCxm3jLsD9z@!EQzcp#uF)}vEPoWe0%)+P&WQ=N0nGSJYCGHl6>P`C znGU}JiYjdUE$>lAFgorGU~Z&|zisRp7c?pTXTWE`AleYx+jbgW3_V$*dd3PEZxh2U zS_Z(eMW;+XIBF-(uATUm*_Ew<8>YGlgI2<3=jz4z81+TQw5wkvVwUeTh(q0AB7@xn zZck=yC2_hPY5|r(=%{ix)4I-|H%sONjn*lDj|I;6plq zRB(YQ%Rof6;}4+8bj@rNYT^Tqz=&MQl6OtwcHVBfQlBOH1(EdR*>wbrOnp`~q#f@b z|2NEtdMdh{8a(0=kR+a(DwtW}aUgfVbe^mAJVXE-1s}OmQ3%rQc`DWo$@dJp?$UD5 zdI0P_i$4?CKIn~8#U~7r9RGK4DVZZ$BtR0c0|+;=8?d_R5mOo1YKzX3v9tD|1k_jf zi`DhV0M0nMF?J;02&2^2dJ*;k6Xcd0ovV4WLs;=)X`^`=P|6^9C<3i zK?M#9Qc}8EOWmuu5AONBId})|s10nNk2^a%M@i^ylCku%aS>lxMM~OmGOxL&g?fYk zCSwO80!23j0Ey+g`)E{q)gdUNfZH)9gfs=J*(`3hNPItNh0h*{fWkMF=nx7>CICnC z7?9I=<-i(wiz)IOln5-Mx)5bw(U*AXMH*>nce-w!-xUfcj*&%i#y$N|tk%#wH3bhR1!rX!j0!Z5nDEQ?#tUL6sj zO;_pxK$sFEJq>dgMWdI!R3x&&x4TVoEJ0t`=xaKfLvGN7*J?iDKeD2!!BZ?<18op4 zJsSll!XBq}K3l-oxVEQ@E%Kg?;t8c%f>g1zLDL>DDFNw8T?MvVT$U>#@YH`zX z7uE;kW;cw8LhQdW4Au;}#}a2*3$^^%*d0}_WPvtyg}J)f?0R72WygacW17VHwOyYG zW~Atf0#J1OC^!bG{uVl{6pAs!w~p$-1n&N7;}(v#x7kd!Rr{9$b@@2lz+^;?v1DnW zeaS2hJ@F7SPoLf_2z>V@??%^nVEO^MTp0QR7Q6miDFQm!71;Z}C8dmwhDqrQ!{b1x za@J@ryWECxKqGBI)tY$mR)_d`gy5DCZn7{ z^VddE`o4vO8YTZZ09jcLG*SN2I*xr5F0k~8(@ae;6n?2qXXT%}3y2Mc^aOoX1#cK{ zGpunJc5Mbtim**X)tI8#TyP&~Y5b>8lon8E{b@8Oh>P$i+;wyY@Vb802DkWb+q?g_?JA0r zp)Q19$Yqgzsx^3feWYE8r0x?pE87;37f@;vF%w8jZgc7%P&d1yq|hfbRvEz%F4)vC zCep*|<6u{0=RkXSB~01z$A7n&$!K&lTmvFCJ!}t-`fPF3&d2-GjbDJDKt?I_lFbye zhax&y{#JN}$lV`UmazUs@Mf|-dbL{4ve32sw_-~THZLhI&lu@GUn->rFcqNj5D-Q6 z$v6H1llpS7+XDZb1KJ2S9q0bFz2i`%N8Kpes6v%fCI&jYsTqO+C{S?eD2U^csPBlo zp{;Ou`NX{kgV@NlN3>5b*EL?V@KskQc=${~0eN&l5SE~haJtw5O6(^bdBYF?D|PL@ z%H+~IzhpNNDeT#REC%xRy^=z4FDTHMMcZ3t?A&a)eRjN#59(6*(zqw z>_fRP@QOlfKtosa(ky>&2s_?$(e`R~WnpYQ*+fh&B}AC>dI|CCuiL^?W!YvFgj_6c z=%6=UIAwVTYjQgrP681)Aq9XBSAvTOk6fl}e83Z3>)%^E__3W3%>z!?I568##|H28 z;{Q?vD41)WY6p4x;NDj-NP}l|C^jR8Dd@9-y0DWvF0D8dqDz0tePsK5Q^zo&zviw% z_c}5!Nax+qgaRFoMwK@Afk#gSTUiq(Qz$qC!M0c(4kO%*=Rc0F21Xpz)@^ao5c7gy zLEV~WM57hW>d0Bj;HFM%0>cAeq;6^g;{XUvz8m#$pOl8rXvDbWVe417n_@>FUR@H= z7~$uGb9K|cUtjU^fO%}Pp>D-+>^gNlTD$jc25bG#tS`kP%R0W@FkY#DN7GKVNN)aZ zr2jJT3hLz-oEA*JLH|QcE{_{%F;zHrB003kF~6`MV@R{W|^S=~LUxak_`L%oYAV z9M+D13*9jrp`%U1*}Gh~Q%b2|-u_&k=V5eM!(@hEPmNgcny1FIMn=&0;^s?g9V#6h zF-d-?xZNIj1#ZIqneJbF1}1a__vHI&gKmprSHaECov_+RD`j#@@mBhk zB?RkJidZdQbVavCQ;L>B2~t#rpqqE5-25u8WGPWL#NBV3TI)_mO3S6dvs^2rNhkH4 z!CIKtc$MPe6H+Mzh*ro=J6Vl)-{S(4cY?XsBdZP%-pdVLFbB5&!LS7o#u&irf=}24 z&-8`rAVU=?*56QrefVx6n{1ne8Q*#+?;qUxD#J!3R^8l~-C9ge?NdU7&&D6PBGY)y zbt1#F&dF!Vq_VXvAo+l@Y>Ry;#{uc{Qclt4iu=n=UBSp97d)h2X#|%;t4vNY&?BU@!dQ zK6bLUWzduWslKJ(VA072`Jk)7I45JF+MqD`TQYP0EO&XDSVIb+Q&}=5i|9#tKGb

    @J!! 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 delta 60599 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 delta 162810 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 z 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�nB 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 khU#g}a$zT_TvR4$L1%e~h&C39YS01ACWd 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 o;jfwe;XpM2ozPzi6M&~CzFs5$9|kO&Hvj+t From cc14dbb22c8c11ab3f25477d04575709a955812a Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 17 May 2021 14:57:16 -0400 Subject: [PATCH 074/144] Updating chapters --- chapters/chap03.py | 43 +++++++++++++++++++++++++++++ chapters/chap06.py | 12 ++++++++ chapters/chap11.py | 43 +++++++++++++++++++++++++++++ chapters/chap12.py | 7 +++++ chapters/chap13.py | 29 +++++++++++++++++++ chapters/chap15.py | 35 +++++++++++++++++++++++ chapters/chap18.py | 30 ++++++++++++++++++++ chapters/chap22.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 268 insertions(+) create mode 100644 chapters/chap03.py create mode 100644 chapters/chap06.py create mode 100644 chapters/chap11.py create mode 100644 chapters/chap12.py create mode 100644 chapters/chap13.py create mode 100644 chapters/chap15.py create mode 100644 chapters/chap18.py create mode 100644 chapters/chap22.py diff --git a/chapters/chap03.py b/chapters/chap03.py new file mode 100644 index 00000000..5b6f1626 --- /dev/null +++ b/chapters/chap03.py @@ -0,0 +1,43 @@ +from modsim import * + +def step(state, p1, p2): + """Simulate one time step. + + state: bikeshare State object + p1: probability of an Olin->Wellesley ride + p2: probability of a Wellesley->Olin ride + """ + if flip(p1): + bike_to_wellesley(state) + + if flip(p2): + bike_to_olin(state) + +from modsim import * + +def bike_to_olin(state): + """Move one bike from Wellesley to Olin. + + state: bikeshare State object + """ + if state.wellesley == 0: + state.wellesley_empty += 1 + return + state.wellesley -= 1 + state.olin += 1 + +from modsim import * + +# Solution + +def bike_to_wellesley(state): + """Move one bike from Olin to Wellesley. + + state: bikeshare State object + """ + if state.olin == 0: + state.olin_empty += 1 + return + state.olin -= 1 + state.wellesley += 1 + diff --git a/chapters/chap06.py b/chapters/chap06.py new file mode 100644 index 00000000..f18bcbe4 --- /dev/null +++ b/chapters/chap06.py @@ -0,0 +1,12 @@ +from modsim import * + +def run_simulation(system, growth_func): + results = TimeSeries() + results[system.t_0] = system.p_0 + + for t in range(system.t_0, system.t_end): + growth = growth_func(t, results[t], system) + results[t+1] = results[t] + growth + + return results + diff --git a/chapters/chap11.py b/chapters/chap11.py new file mode 100644 index 00000000..d8569569 --- /dev/null +++ b/chapters/chap11.py @@ -0,0 +1,43 @@ +from modsim import * + +def make_system(beta, gamma): + init = State(s=89, i=1, r=0) + init /= init.sum() + + return System(init=init, t_end=7*14, + beta=beta, gamma=gamma) + +from modsim import * + +def update_func(t, state, system): + s, i, r = state.s, state.i, state.r + + infected = system.beta * i * s + recovered = system.gamma * i + + s -= infected + i += infected - recovered + r += recovered + + return State(s=s, i=i, r=r) + +from modsim import * + +def plot_results(S, I, R): + S.plot(style='--', label='Susceptible') + I.plot(style='-', label='Infected') + R.plot(style=':', label='Resistant') + decorate(xlabel='Time (days)', + ylabel='Fraction of population') + +from modsim import * + +def run_simulation(system, update_func): + frame = TimeFrame(columns=system.init.index) + frame.loc[0] = system.init + + for t in range(0, system.t_end): + frame.loc[t+1] = update_func(t, frame.loc[t], system) + + return frame + diff --git a/chapters/chap12.py b/chapters/chap12.py new file mode 100644 index 00000000..7cfc3909 --- /dev/null +++ b/chapters/chap12.py @@ -0,0 +1,7 @@ +from modsim import * + +def calc_total_infected(results, system): + s_0 = results.s[0] + s_end = results.s[system.t_end] + return s_0 - s_end + diff --git a/chapters/chap13.py b/chapters/chap13.py new file mode 100644 index 00000000..fd5aa080 --- /dev/null +++ b/chapters/chap13.py @@ -0,0 +1,29 @@ +from modsim import * + +# import code from previous notebooks + +from chap11 import make_system +from chap11 import update_func +from chap11 import run_simulation +from chap11 import plot_results + +from chap12 import calc_total_infected + +from modsim import * + +def sweep_beta(beta_array, gamma): + sweep = SweepSeries() + for beta in beta_array: + system = make_system(beta, gamma) + results = run_simulation(system, update_func) + sweep[beta] = calc_total_infected(results, system) + return sweep + +from modsim import * + +def sweep_parameters(beta_array, gamma_array): + frame = SweepFrame(columns=gamma_array) + for gamma in gamma_array: + frame[gamma] = sweep_beta(beta_array, gamma) + return frame + diff --git a/chapters/chap15.py b/chapters/chap15.py new file mode 100644 index 00000000..f439ced2 --- /dev/null +++ b/chapters/chap15.py @@ -0,0 +1,35 @@ +from modsim import * + +def make_system(T_init, volume, r, t_end): + return System(T_init=T_init, + T_final=T_init, + volume=volume, + r=r, + t_end=t_end, + T_env=22, + t_0=0, + dt=1) + +from modsim import * + +def change_func(t, T, system): + r, T_env, dt = system.r, system.T_env, system.dt + return -r * (T - T_env) * dt + +from modsim import * + +def run_simulation(system, change_func): + t_array = linrange(system.t_0, system.t_end, system.dt) + n = len(t_array) + + series = TimeSeries(index=t_array) + series.iloc[0] = system.T_init + + for i in range(n-1): + t = t_array[i] + T = series.iloc[i] + series.iloc[i+1] = T + change_func(t, T, system) + + system.T_final = series.iloc[-1] + return series + diff --git a/chapters/chap18.py b/chapters/chap18.py new file mode 100644 index 00000000..7e3db625 --- /dev/null +++ b/chapters/chap18.py @@ -0,0 +1,30 @@ +from modsim import * + +def make_system(params, data): + G0, k1, k2, k3 = params + + t_0 = data.index[0] + t_end = data.index[-1] + + Gb = data.glucose[t_0] + Ib = data.insulin[t_0] + I = interpolate(data.insulin) + + init = State(G=G0, X=0) + + return System(init=init, params=params, + Gb=Gb, Ib=Ib, I=I, + t_0=t_0, t_end=t_end, dt=2) + +from modsim import * + +def slope_func(t, state, system): + G, X = state + G0, k1, k2, k3 = system.params + I, Ib, Gb = system.I, system.Ib, system.Gb + + dGdt = -k1 * (G - Gb) - X*G + dXdt = k3 * (I(t) - Ib) - k2 * X + + return dGdt, dXdt + diff --git a/chapters/chap22.py b/chapters/chap22.py new file mode 100644 index 00000000..00fe5be2 --- /dev/null +++ b/chapters/chap22.py @@ -0,0 +1,69 @@ +from modsim import * + +params = Params( + x = 0, # m + y = 1, # m + angle = 45, # degree + speed = 40, # m / s + + mass = 145e-3, # kg + diameter = 73e-3, # m + C_d = 0.33, # dimensionless + + rho = 1.2, # kg/m**3 + g = 9.8, # m/s**2 + t_end = 10, # s +) + +from modsim import * + +from numpy import pi, deg2rad + +def make_system(params): + + # convert angle to degrees + theta = deg2rad(params.angle) + + # compute x and y components of velocity + vx, vy = pol2cart(theta, params.speed) + + # make the initial state + init = State(x=params.x, y=params.y, vx=vx, vy=vy) + + # compute the frontal area + area = pi * (params.diameter/2)**2 + + return System(params, + init = init, + area = area) + +from modsim import * + +def drag_force(V, system): + rho, C_d, area = system.rho, system.C_d, system.area + + mag = rho * vector_mag(V)**2 * C_d * area / 2 + direction = -vector_hat(V) + f_drag = mag * direction + return f_drag + +from modsim import * + +def slope_func(t, state, system): + x, y, vx, vy = state + mass, g = system.mass, system.g + + V = Vector(vx, vy) + a_drag = drag_force(V, system) / mass + a_grav = g * Vector(0, -1) + + A = a_grav + a_drag + + return V.x, V.y, A.x, A.y + +from modsim import * + +def event_func(t, state, system): + x, y, vx, vy = state + return y + From bd358b0ec30f08c8be1b034382aac4f1640be4e4 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 23 Jun 2021 14:51:49 -0400 Subject: [PATCH 075/144] Adding secant figure --- figs/secant.fig | 19 +++++++++++++++++++ figs/secant.png | Bin 0 -> 289 bytes 2 files changed, 19 insertions(+) create mode 100644 figs/secant.fig create mode 100644 figs/secant.png diff --git a/figs/secant.fig b/figs/secant.fig new file mode 100644 index 00000000..2c9f8000 --- /dev/null +++ b/figs/secant.fig @@ -0,0 +1,19 @@ +#FIG 3.2 Produced by xfig version 3.2.6a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 1725 3075 38 38 1687 3075 1763 3075 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4275 5400 38 38 4237 5400 4313 5400 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 1725 3150 1725 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4275 4800 4275 5400 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1200 4800 4800 4800 +4 0 0 50 0 16 14 0.0000 4 165 450 4425 5400 f(x2)\001 +4 0 0 50 0 16 14 0.0000 4 165 450 1875 3225 f(x1)\001 diff --git a/figs/secant.png b/figs/secant.png new file mode 100644 index 0000000000000000000000000000000000000000..01a2594cec443b5195e50980f1531fac6bdcfc20 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^KY(~KBQubk8|GL8q}T#{LR^9L|NsA&-kg6I$hzj~ z;usRq`u2t*-ys8uqaRf@{2CuKc`(T|Di;X2I150Qzanh+ z=*_I1KjWwB{rb$H%RDukepssiF}ZqJs_(0FGw(+&le^O_b}iMP!Cs&6t~p+$t?H!B zR{4iJpa13mTi?&t_*Q<;@_Rww_vdbzEcx`+>h=46A&84VXZ-(t+r|Frj2A$`e^dU6 ziWlu?Y!}`8pYQmjpLez$VXUq%UN2{PJHOU%kKDKSC;r{KF?->=H$7GS2L1j{PyWPx fJlQ#~evW?Qw(N8 Date: Wed, 23 Jun 2021 14:53:04 -0400 Subject: [PATCH 076/144] Adding figures --- figs/golden1.fig | 23 +++++++++++++++++++++++ figs/golden1.png | Bin 0 -> 296 bytes figs/golden2.fig | 45 +++++++++++++++++++++++++++++++++++++++++++++ figs/golden2.png | Bin 0 -> 657 bytes 4 files changed, 68 insertions(+) create mode 100644 figs/golden1.fig create mode 100644 figs/golden1.png create mode 100644 figs/golden2.fig create mode 100644 figs/golden2.png diff --git a/figs/golden1.fig b/figs/golden1.fig new file mode 100644 index 00000000..ef10ce9f --- /dev/null +++ b/figs/golden1.fig @@ -0,0 +1,23 @@ +#FIG 3.2 Produced by xfig version 3.2.6a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 1725 3075 38 38 1687 3075 1763 3075 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4350 3450 38 38 4312 3450 4388 3450 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 2625 4050 38 38 2587 4050 2663 4050 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 1725 3150 1725 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 2625 4050 2625 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4350 3450 4350 4800 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1200 4800 4800 4800 +4 0 0 50 0 16 14 0.0000 4 135 180 4275 5100 x3\001 +4 0 0 50 0 16 14 0.0000 4 135 180 2550 5100 x2\001 +4 0 0 50 0 16 14 0.0000 4 135 180 1650 5100 x1\001 diff --git a/figs/golden1.png b/figs/golden1.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d2df71268541ba1389660cf7b8d7641e296f67 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^pMbcVkr_xPc89$KQfvV}A+A9B|Ns9>Z_d99WZm_2 zaSVxQP5!~p(*FN36T5^%%43Gp!bS3V4zfSLi=67eWiRtKUtQt6&w-jpPdR7$pQzoz zsQPce|CT>1{x1Folz#H|e{%o*fAXJxymg;^e1rUQ8^zC@JNeBOPX7NN@YLYVaZUTI z|4_AA_Fvx~=a+eL$zJBur|*h;_%(|DKY94+v!c@ZR}-K9pVxk}Ii%@8walld0-yI^ zS3do}ntysc|HS`a`CaR6?)-|8%-;%C%|Eo(r&tH7P{m|2^il63x pnz;1;&!ippj7R_GKk4L%XNWi*r+B(3aUIa344$rjF6*2UngG9uk^KMw literal 0 HcmV?d00001 diff --git a/figs/golden2.fig b/figs/golden2.fig new file mode 100644 index 00000000..8eae8714 --- /dev/null +++ b/figs/golden2.fig @@ -0,0 +1,45 @@ +#FIG 3.2 Produced by xfig version 3.2.6a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 6300 3075 38 38 6262 3075 6338 3075 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 8925 3450 38 38 8887 3450 8963 3450 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7200 4125 38 38 7162 4125 7238 4125 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 7800 3975 38 38 7762 3975 7838 3975 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 1725 3075 38 38 1687 3075 1763 3075 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 4350 3450 38 38 4312 3450 4388 3450 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 2625 4125 38 38 2587 4125 2663 4125 +1 4 0 1 0 0 50 -1 20 0.000 1 0.0000 3225 4275 38 38 3187 4275 3263 4275 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 1200 4800 4800 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 6300 3150 6300 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 7200 4125 7200 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 8925 3450 8925 4800 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2 + 5775 4800 9375 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 7800 4050 7800 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 1725 3150 1725 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 2625 4125 2625 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 4350 3450 4350 4800 +2 1 2 1 0 7 50 -1 -1 3.000 0 0 -1 0 0 2 + 3225 4275 3225 4800 +4 0 0 50 0 16 14 0.0000 4 135 180 7725 5100 x4\001 +4 0 0 50 0 16 14 0.0000 4 135 180 7125 5100 x2\001 +4 0 0 50 0 16 14 0.0000 4 135 180 8850 5100 x3\001 +4 0 0 50 0 16 14 0.0000 4 135 180 6225 5100 x1\001 +4 0 0 50 0 16 14 0.0000 4 135 180 3150 5100 x4\001 +4 0 0 50 0 16 14 0.0000 4 135 180 2550 5100 x2\001 +4 0 0 50 0 16 14 0.0000 4 135 180 4275 5100 x3\001 +4 0 0 50 0 16 14 0.0000 4 135 180 1650 5100 x1\001 diff --git a/figs/golden2.png b/figs/golden2.png new file mode 100644 index 0000000000000000000000000000000000000000..13d96a8a396cf82071c567972da10d24f06f5f56 GIT binary patch literal 657 zcmV;C0&e|@P)CsNe=jAdv!zB^6}~4!{MF zphXmkl!B6yazg_R!iY#X1jok9cpPVToH(&Tfy^&P-ktID&fiU>U5R3Kq9S_8&2(2x zY!srjmyS}6yJfX_6t7UN|0|TT5?_9vBEIkx@r9@G9i5Uf-%)1@Wwj8c5l!xhQg~HO zsivc9+%2o0KQEe$`HsAbDP<+T@Dg8mi7&jw7hd8EFY$%fyp+(fDYJJJ)bOc{FC1ld zjVMvYl-WBPx%*$v3rCrwBZUu^FM(Tx0>(0wM16-{6Vdo4f2&H0$5J$@^|KU(vz9L< zDY#bGS}UXRKZS2C?0E@`QB)2kVkvo2){N~-F^f4$)|bA6Pny)u;>&c3%ArIoB~Qwl zv3;3Nv1R)*a#xeuzj|H@q8Linmk~viTJZ&>Nv-$-(xg^=0clbzzJN5T6<jPKABjxws7}Gp)3tW!|2t70CUzg6R*0;Bo)rqQp!0@JgO{Zct>aw*BB-fx+tO{qgizKT=+KBhfFxq*&8TQTMH8Y%UZatV}yS?1s! z-`a7;Dfd7bs<@-!5mGLjNNED4Z!GD*;9Cw^%PmlX;}{Usk6GwblqfD`?RAc6H>}HpYLUAbnXkaAe7>=*C_HF}iQ-00000NkvXXu0mjf??NZT literal 0 HcmV?d00001 From dc7ebd6772c4564106001c5cee4cba418aca3c86 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 14 Jul 2021 09:43:18 -0400 Subject: [PATCH 077/144] Updating chapters --- chapters/chap01.ipynb | 2 +- chapters/chap09.ipynb | 18 +- chapters/chap12.ipynb | 2 +- chapters/chap14.ipynb | 6 +- chapters/chap15.ipynb | 138 ++++++------ chapters/chap16.ipynb | 39 +++- chapters/chap17.ipynb | 81 ++++--- chapters/chap18.ipynb | 37 +-- chapters/chap19.ipynb | 87 +++---- chapters/chap20.ipynb | 109 +++++---- chapters/chap21.ipynb | 97 ++++---- chapters/chap22.ipynb | 219 +++++++++++------- chapters/chap23.ipynb | 30 +-- chapters/chap24.ipynb | 104 +++++---- chapters/chap25.ipynb | 12 +- chapters/chap26.ipynb | 92 +++----- chapters/chap27.ipynb | 512 ++++++++++++++++++++++++++++++++++++++++++ 17 files changed, 1083 insertions(+), 502 deletions(-) create mode 100644 chapters/chap27.ipynb diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index ac87c061..2f358775 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -1183,7 +1183,7 @@ "source": [ "### Exercise 8\n", "\n", - "Suppose I run a 10K race in 44:52 (44 minutes and 52 seconds). What is my average page in minutes per mile?" + "Suppose I run a 10K race in 44:52 (44 minutes and 52 seconds). What is my average pace in minutes per mile?" ] }, { diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 6a4b6a95..3c5a7249 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -92,7 +92,7 @@ "id": "hybrid-retrieval", "metadata": {}, "source": [ - "## Recurrence Relations\n", + "## Difference Equations\n", "\n", "The population models in the previous chapter and this one are simple\n", "enough that we didn't really need to run simulations. We could have\n", @@ -110,13 +110,11 @@ "where $x_n$ is the population during year $n$, \n", "$x_{n+1}$ is the population during year $n+1$,\n", "and $c$ is constant annual growth.\n", - "This way of representing the model, where future population is a function of current population, is a *recurrence relation*; see\n", - ".\n", + "This way of representing the model, where future population is a function of current population, is a *difference equation*; see\n", + ".\n", "\n", - "Sometimes it is possible to solve a recurrence relation by writing an\n", - "equation that computes $x_n$, for a given value of $n$, directly; that\n", - "is, without computing the intervening values from $x_1$ through\n", - "$x_{n-1}$." + "Sometimes it is possible to compute $x_n$, for a given value of $n$, directly; that\n", + "is, without computing the intervening values from $x_1$ through $x_{n-1}$." ] }, { @@ -130,9 +128,7 @@ "\n", "$$x_n = x_0 + nc$$ \n", "\n", - "So if we want to know $x_{100}$ and we don't care\n", - "about the other values, we can compute it with one multiplication and\n", - "one addition." + "So if we want to know $x_{100}$ and we don't care about the other values, we can compute it with one multiplication and one addition." ] }, { @@ -140,7 +136,7 @@ "id": "sufficient-tampa", "metadata": {}, "source": [ - "We can also write the proportional model as a recurrence relation:\n", + "We can also write the proportional model as a difference equation:\n", "\n", "$$x_{n+1} = x_n + \\alpha x_n$$ \n", "\n", diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index 913a1c29..61be3d58 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -263,7 +263,7 @@ }, { "cell_type": "markdown", - "id": "surrounded-niagara", + "id": "parallel-pipeline", "metadata": {}, "source": [ "And here are the results from the two simulations." diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 13c116d5..f9e4255b 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -375,7 +375,11 @@ "\n", "$$q = 1 = 0 + s_{\\infty}- \\frac{1}{c} \\log s_{\\infty}$$ \n", "\n", - "Solving for $c$, we get $$c = \\frac{\\log s_{\\infty}}{s_{\\infty}- 1}$$ By relating $c$ and $s_{\\infty}$, this equation makes it possible to estimate $c$ based on data, and possibly predict the behavior of future epidemics." + "Solving for $c$, we get \n", + "\n", + "$$c = \\frac{\\log s_{\\infty}}{s_{\\infty}- 1}$$ \n", + "\n", + "By relating $c$ and $s_{\\infty}$, this equation makes it possible to estimate $c$ based on data, and possibly predict the behavior of future epidemics." ] }, { diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index 7c861373..5cf0fb8b 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -5,7 +5,7 @@ "id": "romantic-speech", "metadata": {}, "source": [ - "# Chapter 15" + "# Cooling Coffee" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "dependent-monitoring", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "continental-decrease", "metadata": { "tags": [] @@ -62,8 +62,10 @@ }, { "cell_type": "markdown", - "id": "derived-exhibit", - "metadata": {}, + "id": "moving-trademark", + "metadata": { + "tags": [] + }, "source": [ "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", "Click here to access the notebooks: ." @@ -89,7 +91,7 @@ "\n", "Here is my version of the problem:\n", "\n", - "> Suppose I stop on the way to work to pick up a cup of coffee, which I take with milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?" + "> Suppose I stop on the way to work to pick up a cup of coffee and a small container of milk. Assuming that I want the coffee to be as hot as possible when I arrive at work, should I add the milk at the coffee shop, wait until I get to work, or add the milk at some point in between?" ] }, { @@ -138,7 +140,7 @@ "\n", "$$Q = C~\\Delta T$$ \n", "\n", - "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the *thermal mass* of the object, which quantifies how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." + "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the object's *thermal mass*, which is a property of the object that determines how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." ] }, { @@ -151,7 +153,7 @@ "\n", "$$C = m c_p$$ \n", "\n", - "where $m$ is the mass of the object and $c_p$ is the *specific heat capacity* of the material (see ).\n", + "where $m$ is the mass of the object and $c_p$ is the *specific heat capacity* of the material, which is the amount of thermal mass per gram (see ).\n", "\n", "We can use these equations to estimate the thermal mass of a cup of\n", "coffee. The specific heat capacity of coffee is probably close to that\n", @@ -160,14 +162,12 @@ "\n", "So when a cup of coffee cools from 90 °C to 70 °C, the change in\n", "temperature, $\\Delta T$ is 20 °C, which means that 25 200 J of heat\n", - "energy was transferred from the coffee to the surrounding environment\n", + "energy was transferred from the cup and the coffee to the surrounding environment\n", "(the cup holder and air in my car).\n", "\n", "To give you a sense of how much energy that is, if you were able to\n", "harness all of that heat to do work (which you cannot), you could\n", - "use it to lift a cup of coffee from sea level to 8571 m, just shy of the height of Mount Everest, 8848 m.\n", - "\n", - "Assuming that the cup has less mass than the coffee, and is made from a material with lower specific heat, we can ignore the thermal mass of the cup. For a cup with substantial thermal mass, like a ceramic mug, we might consider a model that computes the temperature of coffee and cup separately." + "use it to lift a cup of coffee from sea level to 8571 m, just shy of the height of Mount Everest, 8848 m." ] }, { @@ -214,11 +214,11 @@ "source": [ "## Newton's Law of Cooling\n", "\n", - "Newton's law of cooling asserts that the temperature rate of change for an object is proportional to the difference in temperature between the object and the surrounding environment:\n", + "*Newton's law of cooling* asserts that the temperature rate of change for an object is proportional to the difference in temperature between the object and the surrounding environment:\n", "\n", "$$\\frac{dT}{dt} = -r (T - T_{env})$$ \n", "\n", - "where $T$, the temperature of the object, is a function of time, $t$, $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the system and the environment." + "where $t$ is time, $T$ is the temperature of the object, $T_{env}$ is the temperature of the environment, and $r$ is a constant that characterizes how quickly heat is transferred between the object and the environment." ] }, { @@ -239,8 +239,9 @@ "law is not a good model at all. This is the case for objects in space or in a vacuum, and for objects at high temperatures (more than a few\n", "hundred degrees Celsius, say).\n", "\n", - "However, for a situation like the coffee cooling problem, we expect\n", - "Newton's model to be quite good." + "However, for a situation like the coffee cooling problem, we expect Newton's model to be quite good.\n", + "\n", + "With that, we have just one more modeling decision to make: whether to treat the coffee and the cup as separate objects or a single object. If the cup is made of paper, it has less mass than the coffee, and the specific heat capacity of paper is lower, too. In that case, it would be reasonable to treat the cup and coffee as a single object. For a cup with substantial thermal mass, like a ceramic mug, we might consider a model that computes the temperature of coffee and cup separately." ] }, { @@ -248,15 +249,16 @@ "id": "selective-video", "metadata": {}, "source": [ - "## Implementation\n", + "## Implementing Newtonian Cooling\n", + "\n", + "To get started, we'll focus on the coffee. Then, as an exercise, you can simulate the milk. In the next chapter, we'll put them together, literally.\n", "\n", - "To get started, let's forget about the milk temporarily and focus on the coffee.\n", "Here's a function that takes the parameters of the system and makes a `System` object:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "incredible-greeting", "metadata": { "tags": [] @@ -285,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "fuzzy-support", "metadata": {}, "outputs": [], @@ -316,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "tight-baptist", "metadata": { "tags": [] @@ -338,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "fiscal-artwork", "metadata": {}, "outputs": [], @@ -358,7 +360,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "cardiac-independence", "metadata": { "tags": [] @@ -388,7 +390,7 @@ "source": [ "There are a two things here that are different from previous versions of `run_simulation`.\n", "\n", - "First, we use `linrange` to make an array of values from `t_0` to `t_end` with time step `dt`. \n", + "First, we use `linrange` to make an array of values from `t_0` to `t_end` with time step `dt`.\n", "`linrange` is similar to `linspace`; they both take a start value and an end value and return an array of equally spaced values.\n", "The difference is the third argument: `linspace` takes an integer that indicates the number of points in the range; `linrange` takes a step size that indicates the interval between values.\n", "When we make the `TimeSeries`, we use the keyword argument `index` to indicate that the index of the `TimeSeries` is the array of time stamps, `t_array`." @@ -415,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "numerous-metabolism", "metadata": {}, "outputs": [], @@ -434,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "infectious-carolina", "metadata": {}, "outputs": [], @@ -452,7 +454,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "accompanied-melbourne", "metadata": {}, "outputs": [], @@ -472,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "important-constitution", "metadata": {}, "outputs": [], @@ -489,12 +491,12 @@ "id": "absent-arkansas", "metadata": {}, "source": [ - "The temperature after 30 minutes is 72.3 °C, which is a little higher than what's stated in the problem, 70 °C. " + "The temperature after 30 minutes is 72.3 °C, which is a little higher than the measurement we're trying to match, which is 70 °C. " ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "absolute-desire", "metadata": {}, "outputs": [], @@ -507,8 +509,7 @@ "id": "light-carpet", "metadata": {}, "source": [ - "By trial and error, we could find the value of `r` where the final temperature is precisely 70 °C.\n", - "But it is more efficient to use a root-finding algorithm." + "To find the value of `r` where the final temperature is precisely 70 °C, we could proceed by by trial and error, but it is more efficient to use a root-finding algorithm." ] }, { @@ -530,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "small-shark", "metadata": {}, "outputs": [], @@ -549,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "defensive-content", "metadata": {}, "outputs": [], @@ -564,12 +565,12 @@ "metadata": {}, "source": [ "The first argument is the function whose roots we want. The second\n", - "argument is an interval that contains or \"brackets\" a root. The result is an object that contains several variables, including `root`, which is the root that was found." + "argument is an interval that contains or *brackets* a root. The result is an object that contains several variables, including the Boolean value `converged`, which is `True` if the search converged successfully on a root, and `root`, which is the root that was found." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "behind-perth", "metadata": {}, "outputs": [], @@ -587,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "following-sentence", "metadata": {}, "outputs": [], @@ -601,18 +602,8 @@ "id": "eligible-updating", "metadata": {}, "source": [ - "If the interval doesn't contain a root, you'll get a `ValueError` and a message like \"f(a) and f(b) must have different signs\".\n", + "If the interval doesn't contain a root, you'll get a `ValueError` and a message like `f(a) and f(b) must have different signs`.\n", "\n", - "```\n", - "res = root_scalar(func, bracket=[4, 5])\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "ahead-lawyer", - "metadata": {}, - "source": [ "Now we can use `root_scalar` to estimate `r`." ] }, @@ -621,7 +612,7 @@ "id": "commercial-correlation", "metadata": {}, "source": [ - "## Estimating `r`\n", + "## Estimating r\n", "\n", "What we want is the value of `r` that yields a final temperature of\n", "70 °C. To use `root_scalar`, we need a function that takes `r` as a parameter and returns the difference between the final temperature and the goal:" @@ -629,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "genetic-compound", "metadata": {}, "outputs": [], @@ -645,7 +636,7 @@ "id": "happy-bridal", "metadata": {}, "source": [ - "This is called an \"error function\" because it returns the\n", + "This is called an *error function* because it returns the\n", "difference between what we got and what we wanted, that is, the error.\n", "With the right value of `r`, the error is 0.\n", "\n", @@ -654,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "french-financing", "metadata": {}, "outputs": [], @@ -673,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "excellent-fellow", "metadata": {}, "outputs": [], @@ -693,13 +684,13 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "french-decline", "metadata": {}, "outputs": [], "source": [ "res = root_scalar(error_func, coffee, bracket=[0.01, 0.02])\n", - "res.flag" + "res" ] }, { @@ -711,12 +702,12 @@ "The second argument is the `System` object, which `root_scalar` passes as an argument to `error_func`.\n", "The third argument is an interval that brackets the root.\n", "\n", - "Here are the results." + "Here's the root we found." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "afraid-ordering", "metadata": {}, "outputs": [], @@ -736,7 +727,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "derived-annual", "metadata": {}, "outputs": [], @@ -754,12 +745,29 @@ "The final temperature is very close to 70 °C." ] }, + { + "cell_type": "markdown", + "id": "outer-powder", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter presents the basics of heat, temperature, and Newton's law of cooling, which is a model that is accurate when most heat transfer is by conduction and convection, not radiation.\n", + "\n", + "To simulate a hot cup of coffee, we wrote Newton's law as a difference equation, then wrote a version of `run_simulation` that implements it. Then we used `root_scalar` to find the value of `r` that matches the measurement from my hypothetical experiment.\n", + "\n", + "All that is the first step toward solving the coffee cooling problem I posed at the beginning of the chapter. As an exercise, you'll do the next step, which is simulating the milk. In the next chapter, we'll model the mixing process and finish off the problem." + ] + }, { "cell_type": "markdown", "id": "smart-yeast", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -769,13 +777,13 @@ "source": [ "### Exercise 1\n", "\n", - "Simulate the temperature of 50 mL of milk with a starting temperature of 5 °C, in a vessel with `r=0.1`, for 15 minutes, and plot the results.\n", + "Simulate the temperature of 50 mL of milk with a starting temperature of 5 °C, in a vessel with `r=0.1`, for 15 minutes, and plot the results. Use `make_system` to make a `System` object that represents the milk, and use `run_simulation` to simulate it.\n", "By trial and error, find a value for `r` that makes the final temperature close to 20 °C." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "committed-angel", "metadata": {}, "outputs": [], @@ -785,7 +793,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "military-military", "metadata": {}, "outputs": [], @@ -805,7 +813,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "agreed-excuse", "metadata": {}, "outputs": [], @@ -815,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "defined-nudist", "metadata": {}, "outputs": [], @@ -825,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "id": "loose-rehabilitation", "metadata": {}, "outputs": [], diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index da35c2a5..ca0b41cc 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -5,7 +5,7 @@ "id": "medieval-johnston", "metadata": {}, "source": [ - "# Chapter 16" + "# Adding Milk" ] }, { @@ -63,7 +63,9 @@ { "cell_type": "markdown", "id": "valuable-shannon", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", "Click here to access the notebooks: ." @@ -104,14 +106,14 @@ "metadata": {}, "source": [ "In the previous chapter we wrote a simulation of a cooling cup of\n", - "coffee. Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we can predict how the\n", - "temperature of the coffee will change over time.\n", - "Then we used a root finding algorithm to estimate `r` based on data I invented for the example.\n", + "coffee. \n", + "Given the initial temperature of the coffee, the temperature of the atmosphere, and the rate parameter, `r`, we predicted the temperature of the coffee over time.\n", + "Then we used a root finding algorithm to estimate `r` based on data.\n", "\n", "If you did the exercises, you simulated the temperature of the milk as it warmed, and estimated its rate parameter as well.\n", "\n", "Now let's put it together.\n", - "In this chapter we'll write a function that simulates mixing the two liquids and use it to answer the question we started with: is it better to mix the coffee and milk at the beginning, the end, or somewhere in the middle?" + "In this chapter we'll write a function that simulates mixing the two liquids, and use it to answer the question we started with: is it better to mix the coffee and milk at the beginning, the end, or somewhere in the middle?" ] }, { @@ -148,9 +150,10 @@ "where $V_1$ and $V_2$ are the volumes of the liquids.\n", "\n", "As an approximation, I'll assume that milk and coffee have the same\n", - "density and specific heat. As an exercise, you can look up these\n", + "density and specific heat. If you are interested, you can look up these\n", "quantities and see how good this assumption is.\n", "\n", + "Now let's simulate the mixing process.\n", "The following function takes two `System` objects, representing the\n", "coffee and milk, and creates a new `System` to represent the mixture:" ] @@ -294,7 +297,7 @@ "id": "linear-republican", "metadata": {}, "source": [ - "## Optimization\n", + "## Optimal Timing\n", "\n", "Adding the milk after 30 minutes is better than adding it immediately, but maybe there's something in between that's even better. To find out, I'll use the following function, which takes the time to add the milk, `t_add`, as a parameter:" ] @@ -326,7 +329,7 @@ "metadata": {}, "source": [ "`run_and_mix` simulates both systems for the given time, `t_add`.\n", - "Then it mixes them and simulates the mixture fir the remaining time, `t_total - t_add`.\n", + "Then it mixes them and simulates the mixture for the remaining time, `t_total - t_add`.\n", "\n", "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" ] @@ -380,7 +383,7 @@ "id": "rough-investor", "metadata": {}, "source": [ - "## Analysis\n", + "## Analytic Solution\n", "\n", "Simulating Newton's law of cooling isn't really necessary because we can solve the differential equation analytically. If\n", "\n", @@ -541,6 +544,17 @@ "allclose(results, results2)" ] }, + { + "cell_type": "markdown", + "id": "floral-homework", + "metadata": {}, + "source": [ + "Since we can solve this problem analytically, you might wonder why we bothered writing a simulation. \n", + "One reason is validation: since we solved the same problem two ways, we can be more confident that the answer is correct. \n", + "The other reason is flexibility: now that we have a working simulation, it would be easy to add more features. For example, the temperature of the environment might change over time, or we could simulate the coffee and container as two objects. \n", + "If the coffee and milk are next to each other, we could include the heat flow between them. A model with these features would be difficult or impossible to solve analytically. " + ] + }, { "cell_type": "markdown", "id": "rapid-payroll", @@ -560,7 +574,10 @@ "id": "gothic-clearance", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 2df9f137..7228d016 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -5,7 +5,7 @@ "id": "interracial-guitar", "metadata": {}, "source": [ - "# Chapter 17" + "# Pharmacokinetics" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "formal-context", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "progressive-typing", "metadata": { "tags": [] @@ -63,7 +63,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", "Click here to access the notebooks: ." @@ -74,8 +76,8 @@ "id": "european-movement", "metadata": {}, "source": [ - "In this chapter we start a new example, a model of how glucose and insulin interact to control blood sugar. \n", - "We will implement a widely used model called the \"Minimal Model\" because it is intended to include only the elements essential to explain the observed behavior of the system.\n", + "In this chapter we'll start a new example, a model of how glucose and insulin interact to control blood sugar.\n", + "We will implement a widely used model called the \"minimal model\" because it is intended to include only the elements essential to explain the observed behavior of the system.\n", "\n", "This chapter presents the model and some background information we need to understand it.\n", "In the next chapter we'll implement the model and compare the results to real data.\n", @@ -92,7 +94,7 @@ "source": [ "## The Minimal Model\n", "\n", - "*Pharmacokinetics* is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, I present a widely used pharmacokinetic models: the so-called \"minimal model\" of glucose and insulin in the blood stream.\n", + "*Pharmacokinetics* is the study of how drugs and other substances move around the body, react, and are eliminated. In this chapter, I present a widely used pharmacokinetic model of glucose and insulin in the blood stream.\n", "\n", "*Glucose* is a form of sugar that circulates in the blood of animals; it is used as fuel for muscles, the brain, and other organs. The concentration of blood sugar is controlled by the hormone system, and especially by *insulin*, which is produced by the pancreas and has the effect of reducing blood sugar.\n", "\n", @@ -109,8 +111,7 @@ "metadata": {}, "source": [ "A widely used test for hyperglycemia and diabetes is the\n", - "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to\n", - "measure the concentrations of glucose and insulin.\n", + "frequently sampled intravenous glucose tolerance test (FSIGT), in which glucose is injected into the blood stream of a fasting subject (someone who has not eaten recently); then blood samples are collected at intervals of 2--10 minutes for 3 hours. The samples are analyzed to measure the concentrations of glucose and insulin.\n", "\n", "Using these measurements, we can estimate several parameters of\n", "the subject's response; the most important is a parameter denoted $S_I$, which quantifies the effect of insulin on the rate of reduction in blood sugar." @@ -142,7 +143,8 @@ "Bergman discusses the features he and his colleagues thought were\n", "essential:\n", "\n", - "> (1) Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize (2) Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", + "> 1. Glucose, once elevated by injection, returns to basal level due to two effects: the effect of glucose itself to normalize its own concentration \\[...\\] as well as the catalytic effect of insulin to allow glucose to self-normalize.\n", + "> 2. Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", "\n", "To paraphrase the second point, the effect of insulin on glucose\n", "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a remote compartment where it has its effect." @@ -230,7 +232,7 @@ "id": "apart-giant", "metadata": {}, "source": [ - "## Data\n", + "## Getting the Data\n", "\n", "To develop and test the model, we'll use data from Pacini and Bergman, \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 1986 (see )." ] @@ -247,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "mental-wrong", "metadata": { "tags": [] @@ -270,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "cosmetic-matrix", "metadata": {}, "outputs": [], @@ -290,7 +292,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "naval-geology", "metadata": {}, "outputs": [], @@ -316,7 +318,7 @@ "source": [ "## Interpolation\n", "\n", - "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. This is a job for interpolation!\n", + "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. The solution is interpolation, which estimates the value of $I$ for values of $t$ between the measurements.\n", "\n", "The ModSim library provides an `interpolate` function that takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", "We can call `interpolate` like this:" @@ -324,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "terminal-teaching", "metadata": {}, "outputs": [], @@ -342,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "intense-thursday", "metadata": {}, "outputs": [], @@ -361,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "least-pattern", "metadata": {}, "outputs": [], @@ -381,7 +383,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "mounted-venice", "metadata": {}, "outputs": [], @@ -399,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "affecting-response", "metadata": {}, "outputs": [], @@ -417,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "engaging-watershed", "metadata": {}, "outputs": [], @@ -429,6 +431,14 @@ " ylabel='Concentration ($\\mu$U/mL)')" ] }, + { + "cell_type": "markdown", + "id": "blond-prince", + "metadata": {}, + "source": [ + "Linear interpolation connects the dots with straight lines, and for this dataset that's probably good enough. As an exercise, below, you can try out other kinds of interpolation." + ] + }, { "cell_type": "markdown", "id": "adopted-locking", @@ -449,7 +459,10 @@ "id": "floppy-store", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -470,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "endless-network", "metadata": {}, "outputs": [], @@ -480,11 +493,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "entire-concern", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ + "# Here's the plotting code again.\n", + "\n", "data.insulin.plot(style='o', color='C2', label='insulin data')\n", "I_series.plot(color='C2', label='interpolation')\n", "\n", @@ -492,6 +509,16 @@ " ylabel='Concentration ($\\mu$U/mL)')" ] }, + { + "cell_type": "code", + "execution_count": 14, + "id": "invisible-activation", + "metadata": {}, + "outputs": [], + "source": [ + "# Solution goes here" + ] + }, { "cell_type": "markdown", "id": "furnished-recognition", @@ -504,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "representative-acquisition", "metadata": {}, "outputs": [], @@ -514,7 +541,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "rocky-sydney", "metadata": { "scrolled": true diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index a40e9224..6af7974b 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -5,7 +5,7 @@ "id": "electric-netherlands", "metadata": {}, "source": [ - "# Chapter 18" + "# Glucose and Insulin" ] }, { @@ -62,8 +62,10 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", - "metadata": {}, + "id": "preliminary-mexico", + "metadata": { + "tags": [] + }, "source": [ "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", "Click here to access the notebooks: ." @@ -321,7 +323,7 @@ "id": "strange-citation", "metadata": {}, "source": [ - "## The Simulation\n", + "## Running the Simulation\n", "\n", "We'll use the following version of `run_simulation`:" ] @@ -355,9 +357,9 @@ "metadata": {}, "source": [ "This version is similar to the one we used for the coffee cooling problem.\n", - "The biggest difference is that it makes and returns a `TimeFrame` rather than a `TimeSeries`.\n", + "The biggest difference is that it makes and returns a `TimeFrame`, which contains one column for each state variable, rather than a `TimeSeries`, which can only store one state variable.\n", "\n", - "When we make the `TimeSeries`, we use `index` to indicate that the index is the array of time stamps, `t_array`, and `columns` to indicate that the column names are the state variables we get from `init`.\n", + "When we make the `TimeFrame`, we use `index` to indicate that the index is the array of time stamps, `t_array`, and `columns` to indicate that the column names are the state variables we get from `init`.\n", "\n", "We can run it like this:" ] @@ -419,7 +421,7 @@ "metadata": {}, "source": [ "With the parameters I chose, the model fits the data well except during the first few minutes after the injection.\n", - "But we don't expect the model to do well in this regime.\n", + "But we don't expect the model to do well in this part of the time series.\n", "\n", "The problem is that the model is *non-spatial*; that is, it does not\n", "take into account different concentrations in different parts of the\n", @@ -481,11 +483,11 @@ "\n", "There are other methods that are more accurate and more efficient than Euler's method.\n", "SciPy provides several of them wrapped in a function called `solve_ivp`.\n", - "The \"ivp\" in `solve_ivp` stands for \"initial value problem\", which is the term for problems like the ones we've been solving, where we are given the initial conditions and try to predict what will happen.\n", + "The `ivp` stands for *initial value problem*, which is the term for problems like the ones we've been solving, where we are given the initial conditions and try to predict what will happen.\n", "\n", "The ModSim library provides a function called `run_solve_ivp` that makes `solve_ivp` a little easier to use.\n", "\n", - "To use it, we have to provide a \"slope function\", which is similar to an update function; in fact, it takes the same parameters: a time stamp, a `State` object, and a `System` object.\n", + "To use it, we have to provide a *slope function*, which is similar to an update function; in fact, it takes the same parameters: a time stamp, a `State` object, and a `System` object.\n", "\n", "Here's a slope function that evaluates the differential equations of the minimal model." ] @@ -655,10 +657,7 @@ "id": "temporal-threat", "metadata": {}, "source": [ - "The mean relative difference is about 0.65%;\n", - "the maximum is a little more than 1%.\n", - "So in this example, the results from Euler's method are probably good enough for practical purposes.\n", - "\n", + "The mean relative difference is about 0.65% and the maximum is a little more than 1%.\n", "Here are the results for `X`." ] }, @@ -682,7 +681,12 @@ "metadata": {}, "source": [ "These differences are little bigger, especially at the beginning.\n", - "As an exercise, you can experiment with `dt` and see what effect it has on these results." + "\n", + "If we use `run_simulation` with smaller time steps, the results are more accurate, but they take longer to compute.\n", + "For some problems, we can find a value of `dt` that produces accurate results in a reasonable time. However, if `dt` is *too* small, the results can be inaccurate again. So it can be tricky to get it right.\n", + "\n", + "The advantage of `run_solve_ivp` is that it chooses the step size automatically in order to balance accuracy and efficiency.\n", + "You can use keyword arguments to adjust this balance, but most of the time the results are accurate enough, and the computation is fast enough, without any intervention." ] }, { @@ -719,7 +723,10 @@ "id": "unusual-springer", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index c7bbc9bb..d5c7dd21 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -5,7 +5,7 @@ "id": "mighty-israeli", "metadata": {}, "source": [ - "# Chapter 19" + "# Case Studies Part 2" ] }, { @@ -60,6 +60,17 @@ "from modsim import *" ] }, + { + "cell_type": "markdown", + "id": "dense-seattle", + "metadata": { + "tags": [] + }, + "source": [ + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." + ] + }, { "cell_type": "markdown", "id": "reflected-sitting", @@ -78,19 +89,12 @@ "In the previous chapter we implemented the glucose minimal model using given parameters, but I didn't say where those parameters came from.\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`glucose.ipynb`, that shows how we can find the parameters that best fit the data.\n", + "*glucose.ipynb*, that shows how we can find the parameters that best fit the data.\n", + "You can download it from or run it on Colab at .\n", "\n", "It uses a SciPy function called `leastsq`, which stands for \"least squares\"; so-named because it finds the parameters that minimize the sum of squared differences between the results of the model and the data.\n", "\n", - "You can think of `leastsq` as an optional tool for this book. We won't use it in the text itself, but it appears in a few of the case studies.\n" - ] - }, - { - "cell_type": "markdown", - "id": "everyday-stopping", - "metadata": {}, - "source": [ - "You can download it from or run it on Colab at ." + "You can think of `leastsq` as an optional tool for this book. We won't use it in the text itself, but it appears in a few of the case studies." ] }, { @@ -135,14 +139,7 @@ "where $I_{max}$ is the maximum measured insulin level, and $I_b$ and $G_b$ are the basal levels of insulin and glucose.\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`insulin.ipynb`, that contains starter code for this case study. Use it to implement the insulin model, find the parameters that best fit the data, and estimate $\\phi_1$ and $\\phi_2$." - ] - }, - { - "cell_type": "markdown", - "id": "sustainable-breath", - "metadata": {}, - "source": [ + "*insulin.ipynb*, that contains starter code for this case study. Use it to implement the insulin model, find the parameters that best fit the data, and estimate $\\phi_1$ and $\\phi_2$.\n", "You can download it from or run it on Colab at ." ] }, @@ -157,9 +154,9 @@ "\n", "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/Lowpass_Filter_RC.png)\n", "\n", - "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", + "A *filter* is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a *signal* is a voltage that changes over time.\n", "\n", - "A filter is \"low-pass\" if it allows low-frequency signals to pass from\n", + "A filter is *low-pass* if it allows low-frequency signals to pass from\n", "$V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of\n", "high-frequency signals." ] @@ -202,23 +199,12 @@ "\n", "$$\\frac{d V_{out}}{dt} = \\frac{V_{in} - V_{out}}{R C}$$ \n", "\n", - "In the repository for this book, you will find a notebook, `filter.ipynb`, which contains starter code for this case study. Follow the instructions to simulate the low-pass filter for input signals like this:\n", + "In the repository for this book, you will find a notebook, *filter.ipynb*, which contains starter code for this case study. You can download it from or run it on Colab at .\n", + "Follow the instructions to simulate the low-pass filter for input signals like this:\n", "\n", "$$V_{in}(t) = A \\cos (2 \\pi f t)$$ \n", "\n", - "where $A$ is the amplitude of the input signal, say 5 V, and $f$ is the frequency of the signal in Hz.\n", - "\n", - "In the repository for this book, you will find a notebook,\n", - "`filter.ipynb`, which contains starter code for this case study. Read\n", - "the notebook, run the code, and work on the exercises." - ] - }, - { - "cell_type": "markdown", - "id": "twenty-sight", - "metadata": {}, - "source": [ - "You can download it from or run it on Colab at ." + "where $A$ is the amplitude of the input signal, say 5 V, and $f$ is the frequency of the signal in Hz." ] }, { @@ -243,32 +229,21 @@ "id": "entire-stations", "metadata": {}, "source": [ - "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", + "The primary methodology of the paper is a statistical method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", "\n", - "The primary result is a comparison of two models: the one shown here\n", - "with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better.\n", + "The primary result is a comparison of two models: the one shown here with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better.\n", "\n", "For this case study we will implement their model and run it with the\n", "estimated parameters from the paper, and then use `leastsq` to see\n", "if we can find parameters that yield lower errors.\n", "\n", - "In the repository for this book, you will find a notebook, `wall.ipynb` with the code and results for this case study.\n", + "In the repository for this book, you will find a notebook, *wall.ipynb* with the code and results for this case study.\n", + "You can download it from or run it on Colab at .\n", "\n", "The paper this case study is based on is\n", "Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, 2017, available from .\n", "\n", - "The authors put their paper under a Creative Commons license, and\n", - "make their data available at . I thank them\n", - "for their commitment to open, reproducible science, which made this\n", - "case study possible." - ] - }, - { - "cell_type": "markdown", - "id": "wireless-advocacy", - "metadata": {}, - "source": [ - "You can download it from or run it on Colab at ." + "The authors put their paper under a Creative Commons license and made their data available at . I thank them for their commitment to open, reproducible science, which made this case study possible." ] }, { @@ -289,14 +264,7 @@ "\n", "His conclusion is that the observed decline in the concentration of HIV might not be caused by an immune response; it could be due to the dynamic interaction between HIV and the cells it infects.\n", "\n", - "In the repository for this book, you will find a notebook, `hiv_model.ipynb`, which you can use to implement Phillips's model and consider whether it does the work it is meant to do." - ] - }, - { - "cell_type": "markdown", - "id": "narrow-voice", - "metadata": {}, - "source": [ + "In the repository for this book, you will find a notebook, *hiv_model.ipynb*, which you can use to implement Phillips's model and consider whether it does the work it is meant to do.\n", "You can download it from or run it on Colab at ." ] }, @@ -310,6 +278,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index 7d994520..ed187056 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -5,7 +5,7 @@ "id": "funded-utilization", "metadata": {}, "source": [ - "# Chapter 20" + "# Pennies" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 18, "id": "electoral-turkey", "metadata": { "tags": [] @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, "id": "formal-context", "metadata": { "tags": [] @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 20, "id": "progressive-typing", "metadata": { "tags": [] @@ -83,8 +83,10 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", - "metadata": {}, + "id": "removable-zoning", + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap20.ipynb)" ] @@ -94,9 +96,8 @@ "id": "embedded-gentleman", "metadata": {}, "source": [ - "So far the differential equations we've worked with have been **first\n", - "order**, which means they involve only first derivatives. In this\n", - "chapter, we turn our attention to second order differential equations, which can involve both first and second derivatives.\n", + "So far the differential equations we've worked with have been *first order*, which means they involve only first derivatives. In this\n", + "chapter, we turn our attention to *second order* differential equations, which can involve both first and second derivatives.\n", "\n", "We'll revisit the falling penny example from Chapter 1, and use `run_solve_ivp` to find the position and velocity of the penny as it falls, with and without air resistance." ] @@ -185,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 21, "id": "compatible-increase", "metadata": {}, "outputs": [], @@ -205,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "id": "reverse-authorization", "metadata": {}, "outputs": [], @@ -238,7 +239,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "id": "occupied-mercury", "metadata": {}, "outputs": [], @@ -273,7 +274,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "id": "positive-feeling", "metadata": {}, "outputs": [], @@ -294,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 25, "id": "lovely-management", "metadata": {}, "outputs": [], @@ -314,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 26, "id": "assisted-swimming", "metadata": {}, "outputs": [], @@ -332,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "id": "authorized-barrier", "metadata": {}, "outputs": [], @@ -355,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "id": "protected-fiber", "metadata": {}, "outputs": [], @@ -376,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "id": "japanese-clear", "metadata": {}, "outputs": [], @@ -410,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 30, "id": "comfortable-simple", "metadata": {}, "outputs": [], @@ -433,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 31, "id": "exotic-shareware", "metadata": {}, "outputs": [], @@ -448,12 +449,12 @@ "id": "recreational-blair", "metadata": {}, "source": [ - "Then we can get the flight time and final velocity like this:" + "Then we can get the flight time like this:" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 32, "id": "appropriate-roberts", "metadata": {}, "outputs": [], @@ -462,9 +463,17 @@ "t_end" ] }, + { + "cell_type": "markdown", + "id": "pediatric-portal", + "metadata": {}, + "source": [ + "And the final velocity like this:" + ] + }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 33, "id": "orange-retro", "metadata": {}, "outputs": [], @@ -498,16 +507,25 @@ }, { "cell_type": "markdown", - "id": "straight-johns", + "id": "operational-bhutan", "metadata": {}, "source": [ - "### Exercises\n", + "## Exercises\n", "\n", - "### Exercise\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." + ] + }, + { + "cell_type": "markdown", + "id": "straight-johns", + "metadata": {}, + "source": [ + "### Exercise 1\n", "\n", - " Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", + "Here's a question from the web site *Ask an Astronomer* (see http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", "\n", - "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", + "> \"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", "\n", "Use `run_solve_ivp` to answer this question.\n", "\n", @@ -521,12 +539,12 @@ "\n", "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", "\n", - "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." + "You might also be interested to know that it's not that easy to get to the Sun; see https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/." ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 34, "id": "forbidden-distributor", "metadata": {}, "outputs": [], @@ -536,7 +554,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 35, "id": "former-taxation", "metadata": {}, "outputs": [], @@ -546,7 +564,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 36, "id": "oriental-riverside", "metadata": {}, "outputs": [], @@ -556,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 37, "id": "radio-reproduction", "metadata": {}, "outputs": [], @@ -566,7 +584,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 38, "id": "heavy-cologne", "metadata": {}, "outputs": [], @@ -576,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 39, "id": "little-electric", "metadata": {}, "outputs": [], @@ -586,7 +604,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 40, "id": "continental-details", "metadata": {}, "outputs": [], @@ -596,7 +614,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 41, "id": "suitable-traveler", "metadata": {}, "outputs": [], @@ -606,7 +624,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 42, "id": "upper-victory", "metadata": {}, "outputs": [], @@ -616,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 43, "id": "transparent-treat", "metadata": {}, "outputs": [], @@ -626,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 44, "id": "brutal-woman", "metadata": {}, "outputs": [], @@ -636,7 +654,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 45, "id": "gentle-burst", "metadata": {}, "outputs": [], @@ -646,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 46, "id": "comfortable-galaxy", "metadata": {}, "outputs": [], @@ -656,7 +674,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 47, "id": "satisfactory-latitude", "metadata": {}, "outputs": [], @@ -666,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 48, "id": "significant-rebound", "metadata": {}, "outputs": [], @@ -684,6 +702,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -699,7 +718,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index 6998bb46..e272f5da 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -5,7 +5,7 @@ "id": "excited-advance", "metadata": {}, "source": [ - "# Chapter 21" + "# Drag" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 32, "id": "formal-context", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 33, "id": "progressive-typing", "metadata": { "tags": [] @@ -63,7 +63,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap21.ipynb)" ] @@ -125,7 +127,7 @@ "\n", "For simple geometric objects we can sometimes guess the drag coefficient with reasonable accuracy; for more complex objects we usually have to take measurements and estimate $C_d$ from data.\n", "\n", - "Of course, the drag equation is itself a model, based on the assumption that $C_d$ does not depend on the other terms in the equation: density, velocity, and area. For objects moving in air at moderate speeds (below 45 mph or 20 m/s), this model might be good enough, but we should remember to revisit this assumption.\n", + "Of course, the drag equation is itself a model, based on the assumption that $C_d$ does not depend on the other terms in the equation: density, velocity, and area. For objects moving in air at moderate speeds (below 45 mph or 20 m/s), this model might be good enough, but we will revisit this assumption in the next chapter.\n", "\n", "For the falling penny, we can use measurements to estimate $C_d$. In\n", "particular, we can measure *terminal velocity*, $v_{term}$, which is\n", @@ -140,7 +142,7 @@ "\n", "According to *Mythbusters*, the terminal velocity of a penny is between 35 and 65 mph (see ). Using the low end of their range, 40 mph or about 18 m/s, the estimated value of $C_d$ is 0.44, which is close to the drag coefficient of a smooth sphere.\n", "\n", - "Now we are ready to add air resistance to the model." + "Now we are ready to add air resistance to the model. But first I want to introduce one more computational tool, the `Params` object." ] }, { @@ -157,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 34, "id": "established-knitting", "metadata": {}, "outputs": [], @@ -181,9 +183,8 @@ "source": [ "The mass and diameter are from . The density\n", "of air depends on temperature, barometric pressure (which depends on\n", - "altitude), humidity, and composition (). I\n", - "chose a value that might be typical in Boston, Massachusetts at 20 °C.\n", - "\n", + "altitude), humidity, and composition (see ). \n", + "I chose a value that might be typical in New York City at 20 °C.\n", "\n", "Here's a version of `make_system` that takes the `Params` object and computes the inital state, `init`, the area, and the coefficient of drag.\n", "Then it returns a `System` object with the quantities we'll need for the simulation. " @@ -191,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 35, "id": "published-jesus", "metadata": {}, "outputs": [], @@ -225,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 36, "id": "executive-protection", "metadata": {}, "outputs": [], @@ -243,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 37, "id": "quick-cedar", "metadata": {}, "outputs": [], @@ -265,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 38, "id": "great-crime", "metadata": {}, "outputs": [], @@ -279,13 +280,12 @@ "metadata": {}, "source": [ "The result from `set` is a new `Params` object that is identical to the original except for the given value of `v_term`. \n", - "\n", "If we pass `params2` to `make_system`, we see that it computes a different value of `C_d`." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 39, "id": "independent-trace", "metadata": {}, "outputs": [], @@ -310,14 +310,14 @@ "id": "primary-advocate", "metadata": {}, "source": [ - "## Simulation\n", + "## Simulating the Penny Drop\n", "\n", "Now let's get to the simulation. Here's a version of the slope function that includes drag:" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 40, "id": "noble-stick", "metadata": {}, "outputs": [], @@ -359,7 +359,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 41, "id": "velvet-tunisia", "metadata": {}, "outputs": [], @@ -380,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 42, "id": "practical-nowhere", "metadata": {}, "outputs": [], @@ -400,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 43, "id": "liberal-dictionary", "metadata": {}, "outputs": [], @@ -420,7 +420,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 44, "id": "coastal-anthropology", "metadata": {}, "outputs": [], @@ -442,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 45, "id": "interim-underground", "metadata": {}, "outputs": [], @@ -463,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 46, "id": "small-franchise", "metadata": {}, "outputs": [], @@ -487,7 +487,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 47, "id": "analyzed-criticism", "metadata": {}, "outputs": [], @@ -517,10 +517,9 @@ "source": [ "## Summary\n", "\n", - "This chapter presents a model of drag force, which we use to estimate the coefficient of drag for a penny, and then simulate, one more time, dropping a penny from the Empire State building.\n", + "This chapter presents a model of drag force, which we use to estimate the coefficient of drag for a penny, and then simulate, one more time, dropping a penny from the Empire State Building.\n", "\n", "In the next chapter we'll move from one dimension to two, simulating the flight of a baseball.\n", - "\n", "But first you might want to work on these exercises." ] }, @@ -529,7 +528,10 @@ "id": "planned-endorsement", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -537,7 +539,7 @@ "id": "respective-address", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 1\n", "\n", " Run the simulation with a downward initial velocity that exceeds the penny's terminal velocity.\n", "\n", @@ -548,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 48, "id": "inclusive-twenty", "metadata": {}, "outputs": [], @@ -558,7 +560,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 49, "id": "vertical-judge", "metadata": {}, "outputs": [], @@ -568,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 50, "id": "greenhouse-madagascar", "metadata": {}, "outputs": [], @@ -578,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 51, "id": "sudden-details", "metadata": {}, "outputs": [], @@ -588,7 +590,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 52, "id": "opening-jurisdiction", "metadata": { "scrolled": false @@ -603,11 +605,11 @@ "id": "smaller-millennium", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 2\n", "\n", " Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate terminal velocity and coefficient of drag.\n", "\n", - "You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", + "You can get the relevant dimensions of a quarter from .\n", "\n", "1. Create a `Params` object with new values of `mass` and `diameter`. We don't know `v_term`, so we'll start with the initial guess 18 m/s.\n", "\n", @@ -626,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 53, "id": "compact-bunny", "metadata": {}, "outputs": [], @@ -636,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 54, "id": "shared-contrary", "metadata": {}, "outputs": [], @@ -646,7 +648,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 55, "id": "portable-account", "metadata": {}, "outputs": [], @@ -656,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 56, "id": "arabic-shareware", "metadata": {}, "outputs": [], @@ -666,7 +668,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 57, "id": "valued-literature", "metadata": {}, "outputs": [], @@ -676,7 +678,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 58, "id": "sufficient-retail", "metadata": {}, "outputs": [], @@ -686,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 59, "id": "comparable-lounge", "metadata": {}, "outputs": [], @@ -696,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 60, "id": "ready-people", "metadata": {}, "outputs": [], @@ -706,7 +708,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 61, "id": "miniature-remark", "metadata": {}, "outputs": [], @@ -716,7 +718,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 62, "id": "frozen-termination", "metadata": {}, "outputs": [], @@ -726,6 +728,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -741,7 +744,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 619c0c5d..ba9b76ed 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -5,7 +5,7 @@ "id": "collaborative-people", "metadata": {}, "source": [ - "# Chapter 22" + "# Baseball" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 64, "id": "electoral-turkey", "metadata": { "tags": [] @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 65, "id": "formal-context", "metadata": { "tags": [] @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 66, "id": "progressive-typing", "metadata": { "tags": [] @@ -84,7 +84,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap22.ipynb)" ] @@ -108,13 +110,12 @@ "source": [ "## Baseball\n", "\n", - "To model the flight of a baseball, we have to make some\n", - "decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", + "To model the flight of a baseball, we have to make some decisions. To get started, we'll ignore any spin that might be on the ball, and the resulting Magnus force (see ). Under this assumption, the ball travels in a vertical plane, so we'll run simulations in two dimensions, rather than three.\n", "\n", "To model air resistance, we'll need the mass, frontal area, and drag\n", "coefficient of a baseball. Mass and diameter are easy to find (see\n", "). Drag coefficient is only a little\n", - "harder; according to *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*, the drag coefficient of a baseball is approximately 0.33 (with no units).\n", + "harder; according to *The Physics of Baseball* (see https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), the drag coefficient of a baseball is approximately 0.33 (with no units).\n", "\n", "However, this value *does* depend on velocity. At low velocities it\n", "might be as high as 0.5, and at high velocities as low as 0.28.\n", @@ -145,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 67, "id": "handy-terrain", "metadata": {}, "outputs": [], @@ -165,12 +166,22 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 68, + "id": "vocal-latino", + "metadata": {}, + "outputs": [], + "source": [ + "A.x" + ] + }, + { + "cell_type": "code", + "execution_count": 69, "id": "controversial-shower", "metadata": {}, "outputs": [], "source": [ - "A.x, A.y" + "A.y" ] }, { @@ -183,12 +194,22 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 70, + "id": "digital-channels", + "metadata": {}, + "outputs": [], + "source": [ + "A[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 71, "id": "automated-drove", "metadata": {}, "outputs": [], "source": [ - "A[0], A[1]" + "A[1]" ] }, { @@ -197,12 +218,12 @@ "metadata": {}, "source": [ "`Vector` objects support most mathematical operations, including\n", - "addition and subtraction:" + "addition:" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 72, "id": "conditional-latitude", "metadata": {}, "outputs": [], @@ -211,9 +232,17 @@ "show(A + B)" ] }, + { + "cell_type": "markdown", + "id": "charming-reviewer", + "metadata": {}, + "source": [ + "And subtraction:" + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 73, "id": "encouraging-cabinet", "metadata": {}, "outputs": [], @@ -240,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 74, "id": "peripheral-tattoo", "metadata": {}, "outputs": [], @@ -265,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 75, "id": "strange-cleaning", "metadata": {}, "outputs": [], @@ -286,7 +315,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 76, "id": "cellular-community", "metadata": {}, "outputs": [], @@ -310,7 +339,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 77, "id": "monetary-firmware", "metadata": {}, "outputs": [], @@ -333,7 +362,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 78, "id": "explicit-piano", "metadata": {}, "outputs": [], @@ -351,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 79, "id": "relative-republic", "metadata": {}, "outputs": [], @@ -383,7 +412,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 80, "id": "narrative-latest", "metadata": { "tags": [] @@ -411,11 +440,9 @@ "id": "metric-collins", "metadata": {}, "source": [ - "I got the mass and diameter of the baseball from [Wikipedia](https://en.wikipedia.org/wiki/Baseball_(ball)) and the coefficient of drag from *[The Physics of Baseball](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC)*:\n", - "\n", + "I got the mass and diameter of the baseball from Wikipedia (see ) and the coefficient of drag from *The Physics of Baseball* (see ):\n", "The density of air, `rho`, is based on a temperature of 20 °C at sea level (see ). \n", "As usual, `g` is acceleration due to gravity.\n", - "\n", "`t_end` is 10 seconds, which is long enough for the ball to land on the ground.\n", "\n", "The following function uses these quantities to make a `System` object." @@ -423,7 +450,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 81, "id": "bored-billy", "metadata": { "tags": [] @@ -473,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 82, "id": "ethical-donna", "metadata": {}, "outputs": [], @@ -491,7 +518,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 83, "id": "legitimate-gossip", "metadata": {}, "outputs": [], @@ -511,7 +538,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 84, "id": "legal-terminal", "metadata": { "tags": [] @@ -547,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 85, "id": "frank-chick", "metadata": {}, "outputs": [], @@ -560,17 +587,17 @@ }, { "cell_type": "markdown", - "id": "absent-vector", + "id": "ultimate-upgrade", "metadata": {}, "source": [ "The result is a `Vector` that represents the drag force on the baseball, in Newtons, under the initial conditions.\n", "\n", - "Now we're ready for a slope function:" + "Now we can add drag to the slope function." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 86, "id": "suitable-salem", "metadata": { "tags": [] @@ -630,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 87, "id": "closing-simon", "metadata": {}, "outputs": [], @@ -653,14 +680,14 @@ "id": "regulated-railway", "metadata": {}, "source": [ - "## Simulation\n", + "## Adding an Event Function\n", "\n", "We're almost ready to run the simulation. The last thing we need is an event function that stops when the ball hits the ground." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 88, "id": "brief-level", "metadata": { "tags": [] @@ -684,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 89, "id": "threatened-alberta", "metadata": {}, "outputs": [], @@ -697,12 +724,12 @@ "id": "unlikely-dressing", "metadata": {}, "source": [ - "Now we're ready to run the simulation:" + "Here's how we run the simulation with this event function:" ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 90, "id": "special-background", "metadata": {}, "outputs": [], @@ -717,7 +744,7 @@ "id": "iraqi-appeal", "metadata": {}, "source": [ - "The message in `details` indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", + "The message in indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", "\n", "`results` is a `TimeFrame` with one row for each time step and one column for each of the state variables.\n", "Here are the last few rows." @@ -725,7 +752,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 91, "id": "prospective-external", "metadata": {}, "outputs": [], @@ -743,7 +770,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 92, "id": "medieval-calvin", "metadata": {}, "outputs": [], @@ -762,7 +789,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 93, "id": "gorgeous-survey", "metadata": {}, "outputs": [], @@ -781,7 +808,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 94, "id": "failing-bangkok", "metadata": {}, "outputs": [], @@ -800,7 +827,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 95, "id": "copyrighted-highway", "metadata": {}, "outputs": [], @@ -819,7 +846,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 96, "id": "structured-adams", "metadata": {}, "outputs": [], @@ -840,14 +867,14 @@ "id": "continuous-quick", "metadata": {}, "source": [ - "## Trajectories\n", + "## Visualizing Trajectories\n", "\n", "To visualize the results, we can plot the $x$ and $y$ components of position like this:" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 97, "id": "spare-burst", "metadata": {}, "outputs": [], @@ -872,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 98, "id": "dated-browse", "metadata": {}, "outputs": [], @@ -894,7 +921,6 @@ "metadata": {}, "source": [ "This way of visualizing the results is called a *trajectory plot* (see ).\n", - "\n", "A trajectory plot can be easier to interpret than a time series plot,\n", "because it shows what the motion of the projectile would look like (at\n", "least from one point of view). Both plots can be useful, but don't get\n", @@ -906,7 +932,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 99, "id": "resistant-vegetation", "metadata": {}, "outputs": [], @@ -919,7 +945,7 @@ "id": "cosmetic-aircraft", "metadata": {}, "source": [ - "## Animation\n", + "## Animating the Baseball\n", "\n", "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", "\n", @@ -930,7 +956,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 100, "id": "starting-fabric", "metadata": {}, "outputs": [], @@ -950,20 +976,36 @@ }, { "cell_type": "markdown", - "id": "incomplete-beijing", + "id": "sustained-slide", "metadata": {}, "source": [ "Inside the draw function, should use `decorate` to set the limits of the $x$ and $y$ axes.\n", "Otherwise `matplotlib` auto-scales the axes, which is usually not what you want.\n", "\n", + "Now we can run the animation like this:\n", + "\n", + "```\n", + "animate(results, draw_func)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "incomplete-beijing", + "metadata": { + "tags": [] + }, + "source": [ "To run the animation, uncomment the following line of code and run the cell." ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 101, "id": "prescription-boutique", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# animate(results, draw_func)" @@ -974,7 +1016,10 @@ "id": "lyric-harassment", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -982,14 +1027,14 @@ "id": "pressing-retrieval", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 1\n", "\n", " Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 102, "id": "optical-weather", "metadata": {}, "outputs": [], @@ -1001,7 +1046,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 103, "id": "acknowledged-belgium", "metadata": {}, "outputs": [], @@ -1011,7 +1056,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 104, "id": "spatial-ensemble", "metadata": {}, "outputs": [], @@ -1021,7 +1066,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 105, "id": "domestic-apparatus", "metadata": {}, "outputs": [], @@ -1031,7 +1076,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 106, "id": "correct-pittsburgh", "metadata": {}, "outputs": [], @@ -1044,14 +1089,14 @@ "id": "generic-shelter", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 2\n", "\n", " The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / m$^3$. How much farther would a ball hit with the same initial speed and launch angle travel?" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 107, "id": "global-referral", "metadata": {}, "outputs": [], @@ -1063,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 108, "id": "appointed-sugar", "metadata": {}, "outputs": [], @@ -1073,7 +1118,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 109, "id": "specialized-mediterranean", "metadata": {}, "outputs": [], @@ -1086,13 +1131,13 @@ "id": "shaped-paragraph", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 3\n", "\n", - " The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", + " The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, *The Physics of Baseball*, shows coefficient of drag as a function of velocity (see ).\n", "\n", "![Graph of drag coefficient versus velocity](https://github.com/AllenDowney/ModSimPy/raw/master/figs/baseball_drag.png)\n", "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. " + "I used an online graph digitizer () to extract the data and save it in a CSV file. " ] }, { @@ -1107,7 +1152,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 110, "id": "directed-moisture", "metadata": { "tags": [] @@ -1130,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 111, "id": "fuzzy-register", "metadata": { "tags": [] @@ -1154,7 +1199,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 112, "id": "returning-fellowship", "metadata": { "tags": [] @@ -1176,7 +1221,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 113, "id": "reasonable-swaziland", "metadata": { "tags": [] @@ -1199,7 +1244,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 114, "id": "attached-shower", "metadata": { "tags": [] @@ -1221,7 +1266,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 115, "id": "christian-camcorder", "metadata": { "tags": [] @@ -1246,7 +1291,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 116, "id": "heated-belfast", "metadata": { "tags": [] @@ -1267,7 +1312,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 117, "id": "engaged-provision", "metadata": {}, "outputs": [], @@ -1277,7 +1322,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 118, "id": "directed-fiber", "metadata": {}, "outputs": [], @@ -1287,7 +1332,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 119, "id": "framed-dealer", "metadata": {}, "outputs": [], @@ -1297,7 +1342,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 120, "id": "accomplished-elizabeth", "metadata": {}, "outputs": [], @@ -1307,7 +1352,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 121, "id": "going-techno", "metadata": {}, "outputs": [], @@ -1317,7 +1362,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 122, "id": "brief-saying", "metadata": {}, "outputs": [], @@ -1327,7 +1372,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 123, "id": "spare-pregnancy", "metadata": {}, "outputs": [], @@ -1337,7 +1382,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 124, "id": "catholic-staff", "metadata": {}, "outputs": [], @@ -1347,7 +1392,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 125, "id": "broad-sequence", "metadata": {}, "outputs": [], diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 3dbcf551..7fd7a805 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -5,7 +5,7 @@ "id": "foreign-pepper", "metadata": {}, "source": [ - "# Chapter 23" + "# Optimal Baseball" ] }, { @@ -84,7 +84,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap23.ipynb)" ] @@ -127,7 +129,7 @@ "In the previous chapter we developed a model of the flight of a\n", "baseball, including gravity and a simple version of drag, but neglecting spin, Magnus force, and the dependence of the coefficient of drag on velocity.\n", "\n", - "In this chapter we apply that model to an optimization problem." + "In this chapter we apply that model to an optimization problem. In general, *optimization* is a process for improving a design by searching for the parameters that maximize a benefit or minimize a cost. For example, in this chapter we'll find the angle you should hit a baseball to maximize the distance it travels. And we'll use a new function, called `maximize_scalar` that searches for this angle efficiently." ] }, { @@ -339,9 +341,8 @@ "id": "shaped-southeast", "metadata": {}, "source": [ - "For these parameters, the optimal angle is about 41°, which yields a\n", - "range of 100 m.\n", - "\n" + "For these parameters, the optimal angle is about 41°, which yields a range of 100 m.\n", + "Now we have what we need to finish the problem; the last step is to find the minimum velocity needed to get the ball over the wall. In the exercises at the end of the chapter, I provide some suggestions. Then it's up to you!" ] }, { @@ -351,11 +352,9 @@ "source": [ "## Summary\n", "\n", - "This chapter introduces the Manny Ramirez problem and starts to solve it.\n", - "As an exercise, you can finish it off.\n", + "This chapter introduces an new tool, `maximize_scalar`, that provides an efficient way to search for the maximum of a function. We used it to find the launch angle that maximizes the distance a baseball flies through the air, given its initial velocity.\n", "\n", - "If you enjoy this exercise, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at\n", - ".\n", + "If you enjoy this example, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at .\n", "\n", "In the next chapter, we start a new topic: rotation!" ] @@ -365,7 +364,10 @@ "id": "processed-constitution", "metadata": {}, "source": [ - "## Exercise" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -373,9 +375,9 @@ "id": "handmade-rhythm", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 1\n", "\n", - " Let's finish off the Manny Ramirez problem:\n", + "Let's finish off the Manny Ramirez problem:\n", "\n", "> What is the minimum effort required to hit a home run in Fenway Park?\n", "\n", @@ -610,7 +612,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 916ebe70..8d50d082 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -5,7 +5,7 @@ "id": "august-parks", "metadata": {}, "source": [ - "# Chapter 24" + "# Rotation" ] }, { @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "formal-context", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "progressive-typing", "metadata": { "tags": [] @@ -63,7 +63,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap24.ipynb)" ] @@ -82,7 +84,7 @@ "gymnasts, divers, ice skaters, etc.\n", "\n", "And when you apply a twisting force to a rotating object, the effect is often contrary to intuition. \n", - "For an example, see this video on gyroscopic precession ." + "For an example, see this video on gyroscopic precession: ." ] }, { @@ -104,7 +106,7 @@ "source": [ "## The Physics of Toilet Paper\n", "\n", - "As an example of a system with rotation, we'll simulate the manufacture of a roll of toilet paper, as shown in this video . \n", + "As an example of a system with rotation, we'll simulate the manufacture of a roll of toilet paper, as shown in this video: . \n", "Starting with a cardboard tube at the center, we will roll up 47 m of paper, a typical length for a roll of toilet paper in the U.S. (see ).\n", "\n", "The following figure shows a diagram of the system: $r$ represents\n", @@ -112,9 +114,7 @@ "\n", "![Diagram of a roll of toilet paper, showing change in paper length as a result of a small rotation, $d\\theta$.](https://github.com/AllenDowney/ModSim/raw/main/figs/paper_roll.png)\n", "\n", - "I'll use $\\theta$ to represent the total rotation of the roll in\n", - "radians. In the diagram, $d\\theta$ represents a small increase in\n", - "$\\theta$, which corresponds to a distance along the circumference of $r~d\\theta$." + "I'll use $\\theta$ to represent the total rotation of the roll in radians. In the diagram, $d\\theta$ represents a small increase in $\\theta$, which corresponds to a distance along the circumference of $r~d\\theta$." ] }, { @@ -154,14 +154,14 @@ "id": "prostate-smell", "metadata": {}, "source": [ - "## Parameters\n", + "## Setting Parameters\n", "\n", "Here are the parameters of the system:" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "honey-translator", "metadata": {}, "outputs": [], @@ -186,7 +186,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "floppy-plane", "metadata": {}, "outputs": [], @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "funky-bandwidth", "metadata": {}, "outputs": [], @@ -222,7 +222,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "front-conservation", "metadata": {}, "outputs": [], @@ -240,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "defined-plymouth", "metadata": {}, "outputs": [], @@ -259,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "subject-brief", "metadata": {}, "outputs": [], @@ -281,7 +281,7 @@ "id": "phantom-yacht", "metadata": {}, "source": [ - "## Simulation\n", + "## Simulating the System\n", "\n", "The state variables we'll use are, `theta`, `y`, and `r`.\n", "Here are the initial conditions:" @@ -289,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "ranging-graham", "metadata": {}, "outputs": [], @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "fresh-domestic", "metadata": {}, "outputs": [], @@ -326,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "signed-eight", "metadata": {}, "outputs": [], @@ -363,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "exterior-water", "metadata": {}, "outputs": [], @@ -381,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "strong-custody", "metadata": {}, "outputs": [], @@ -401,7 +401,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "moved-present", "metadata": {}, "outputs": [], @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "stable-lying", "metadata": {}, "outputs": [], @@ -439,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "careful-bahrain", "metadata": {}, "outputs": [], @@ -457,7 +457,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "individual-patrick", "metadata": {}, "outputs": [], @@ -475,7 +475,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "indian-skirt", "metadata": {}, "outputs": [], @@ -494,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "higher-conflict", "metadata": {}, "outputs": [], @@ -512,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "employed-ordinary", "metadata": {}, "outputs": [], @@ -535,14 +535,14 @@ "id": "lesser-consumer", "metadata": {}, "source": [ - "## Plotting\n", + "## Plotting the Results\n", "\n", "Here's what `theta` looks like over time." ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "included-schema", "metadata": {}, "outputs": [], @@ -567,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "persistent-siemens", "metadata": {}, "outputs": [], @@ -593,7 +593,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "contrary-typing", "metadata": {}, "outputs": [], @@ -692,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "acknowledged-register", "metadata": {}, "outputs": [], @@ -727,19 +727,28 @@ }, { "cell_type": "markdown", - "id": "thick-luther", + "id": "variable-lambda", "metadata": {}, "source": [ "## Exercises\n", "\n", - "### Exercise\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." + ] + }, + { + "cell_type": "markdown", + "id": "thick-luther", + "metadata": {}, + "source": [ + "### Exercise 1\n", "\n", " Since we keep `omega` constant, the linear velocity of the paper increases with radius. We can use `gradient` to estimate the derivative of `results.y`." ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "cardiac-hospital", "metadata": {}, "outputs": [], @@ -749,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "welsh-charleston", "metadata": {}, "outputs": [], @@ -769,7 +778,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "informational-washer", "metadata": {}, "outputs": [], @@ -794,7 +803,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "excellent-japanese", "metadata": {}, "outputs": [], @@ -804,7 +813,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "steady-member", "metadata": {}, "outputs": [], @@ -814,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "applied-sacramento", "metadata": {}, "outputs": [], @@ -824,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "adult-chuck", "metadata": {}, "outputs": [], @@ -834,7 +843,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "conditional-cliff", "metadata": {}, "outputs": [], @@ -844,7 +853,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "id": "arranged-queensland", "metadata": {}, "outputs": [], @@ -854,7 +863,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "id": "similar-variance", "metadata": {}, "outputs": [], @@ -872,6 +881,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -887,7 +897,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index b34fb451..dfedacc0 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -5,7 +5,7 @@ "id": "unauthorized-winter", "metadata": {}, "source": [ - "# Chapter 25" + "# Torque" ] }, { @@ -925,7 +925,10 @@ "id": "pediatric-precipitation", "metadata": {}, "source": [ - "## Exercises" + "## Exercises\n", + "\n", + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "You can access the notebooks at ." ] }, { @@ -933,7 +936,7 @@ "id": "sixth-breach", "metadata": {}, "source": [ - "### Exercise\n", + "### Exercise 1\n", "\n", " Continuing the example from this chapter, estimate the force that delivers the teapot to the desired position.\n", "Use this `System` object, with the friction we computed in the previous section." @@ -1047,6 +1050,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -1062,7 +1066,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index 1ab7ef95..94196b18 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -5,7 +5,7 @@ "id": "early-drove", "metadata": {}, "source": [ - "# Chapter 26" + "# Case Studies Part 3" ] }, { @@ -27,9 +27,7 @@ "id": "acoustic-small", "metadata": {}, "source": [ - "You made it to the end of the book. Congratulations!\n", - "\n", - "This last chapter is a collection of case studies you might want to read and work on.\n", + "This chapter is a collection of case studies you might want to read and work on.\n", "They are based on the methods in the last few chapters, including Newtonian mechanics in 1-D and 2-D, and rotation around a single axis." ] }, @@ -59,16 +57,8 @@ "constant, `k`, so that the jumper falls all the way to the tea cup, but no farther!\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`bungee1.ipynb`, which contains starter code and exercises for this case study." - ] - }, - { - "cell_type": "markdown", - "id": "given-album", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/bungee1.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/bungee1.ipynb)." + "*bungee1.ipynb*, which contains starter code and exercises for this case study.\n", + "You can download it from or run it on Colab at ." ] }, { @@ -95,16 +85,10 @@ "convince you: .\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`bungee2.ipynb`, which contains starter code and exercises for this case study. How does the behavior of the system change as we vary the mass of the cord? When the mass of the cord equals the mass of the jumper, what is the net effect on the lowest point in the jump?" - ] - }, - { - "cell_type": "markdown", - "id": "sporting-armenia", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/bungee2.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/bungee2.ipynb)." + "*bungee2.ipynb*, which contains starter code and exercises for this case study. \n", + "You can download it from or run it on Colab at .\n", + "\n", + "How does the behavior of the system change as we vary the mass of the cord? When the mass of the cord equals the mass of the jumper, what is the net effect on the lowest point in the jump?" ] }, { @@ -119,20 +103,12 @@ "Now let's extend the model to two dimensions and simulate one revolution of the Earth around the Sun, that is, one year.\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`orbit.ipynb`, which contains starter code and exercises for this case study.\n", + "*orbit.ipynb*, which contains starter code and exercises for this case study.\n", + "You can download it from or run it on Colab at .\n", "\n", "Among other things, you will have a chance to experiment with different algorithms and see what effect they have on the accuracy of the results." ] }, - { - "cell_type": "markdown", - "id": "parliamentary-louis", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/orbit.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/orbit.ipynb)." - ] - }, { "cell_type": "markdown", "id": "victorian-colonial", @@ -146,7 +122,7 @@ "shown in this figure:\n", "\n", "![Diagram of the initial state for the Spider-Man case\n", - "study.](https://github.com/AllenDowney/ModSim/raw/master/figs/spiderman.png)\n", + "study.](https://github.com/AllenDowney/ModSim/raw/main/figs/spiderman.png)\n", "\n", "The origin, `O`, is at the base of the Empire State Building. The vector `H` represents the position where the webbing is attached to the building, relative to `O`. The vector `P` is the position of Spider-Man relative to `O`. And `L` is the vector from the attachment point to Spider-Man.\n", "\n", @@ -193,19 +169,13 @@ "5. The spring constant of the web is 40 N/m when the cord is stretched, and 0 when it's compressed.\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`spiderman.ipynb`, which contains starter code. Read through the\n", + "*spiderman.ipynb*, which contains starter code. \n", + "You can download it from or run it on Colab at .\n", + "\n", + "Read through the\n", "notebook and run the code. It uses `minimize`, which is a SciPy function that can search for an optimal set of parameters (as contrasted with `minimize_scalar`, which can only search along a single axis)." ] }, - { - "cell_type": "markdown", - "id": "ambient-recall", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/spiderman.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/spiderman.ipynb)." - ] - }, { "cell_type": "markdown", "id": "african-relative", @@ -225,16 +195,8 @@ "Assuming that the force applied by the kitten is 0.002 N, how long would it take to unroll a standard roll of toilet paper?\n", "\n", "In the repository for this book, you will find a notebook,\n", - "`kitten.ipynb`, which contains starter code for this case study. Use it to implement this model and check whether the results seem plausible." - ] - }, - { - "cell_type": "markdown", - "id": "flying-forge", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/kitten.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/kitten.ipynb)." + "*kitten.ipynb*, which contains starter code for this case study. Use it to implement this model and check whether the results seem plausible.\n", + "You can download it from or run it on Colab at ." ] }, { @@ -284,7 +246,11 @@ "\n", "$$\\frac{d^2 y}{dt^2} = -r \\frac{d^2 \\theta}{dt^2}$$ \n", "\n", - "Which we can write more concisely: $$a = -r \\alpha$$ This relationship is not a general law of nature; it is specific to scenarios like this where one object rolls along another without stretching or slipping.\n", + "Which we can write more concisely: \n", + "\n", + "$$a = -r \\alpha$$ \n", + "\n", + "This relationship is not a general law of nature; it is specific to scenarios like this where one object rolls along another without stretching or slipping.\n", "\n", "Because of the way we've set up the problem, $y$ actually has two\n", "meanings: it represents the length of the rolled string and the height\n", @@ -348,16 +314,8 @@ "where $I^*$ is the augmented moment of inertia, $I + m r^2$. \n", "We can use these equations for $a$ and $\\alpha$ to write a slope function and simulate this system.\n", "\n", - "In the repository for this book, you will find a notebook, `yoyo.ipynb`, which contains starter code for this case study. Use it to implement and test this model." - ] - }, - { - "cell_type": "markdown", - "id": "excessive-equity", - "metadata": {}, - "source": [ - "[Click here to download it](https://github.com/AllenDowney/ModSimPy/raw/master/examples/yoyo.ipynb) or\n", - "[click here to run it on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/examples/yoyo.ipynb)." + "In the repository for this book, you will find a notebook, *yoyo.ipynb*, which contains starter code you can use to implement and test this model.\n", + "You can download it from or run it on Colab at ." ] }, { @@ -385,7 +343,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.9" } }, "nbformat": 4, diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb new file mode 100644 index 00000000..543d856e --- /dev/null +++ b/chapters/chap27.ipynb @@ -0,0 +1,512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "early-drove", + "metadata": {}, + "source": [ + "# Under the Hood" + ] + }, + { + "cell_type": "markdown", + "id": "imported-table", + "metadata": { + "tags": [] + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "approximate-working", + "metadata": {}, + "outputs": [], + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/modsim.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "suspended-occasion", + "metadata": {}, + "outputs": [], + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *" + ] + }, + { + "cell_type": "markdown", + "id": "younger-bullet", + "metadata": {}, + "source": [ + "In this chapter we \"open the hood,\" looking more closely at how some of\n", + "the tools we have used---`run_solve_ivp`, `root_scalar`, and `maximize_scalar`---work.\n", + "\n", + "Most of the time you don't need to know, which is why I left this chapter for last.\n", + "But you might be curious. And if nothing else, I have found that I can remember how to use these tools more easily because I know something about how they work." + ] + }, + { + "cell_type": "markdown", + "id": "african-collector", + "metadata": {}, + "source": [ + "## How run_solve_ivp Works\n", + "\n", + "`run_solve_ivp` is a function in the ModSimPy library that checks for common errors in the parameters and then calls `solve_ip`, which is the function in the SciPy library that does the actual work.\n", + "\n", + "By default, `solve_ivp` uses the Dormand-Prince method, which is a kind of Runge-Kutta method. You can read about it at\n", + ", but I'll give you a sense of\n", + "it here.\n", + "\n", + "The key idea behind all Runge-Kutta methods is to evaluate the slope function several times at each time step and use a weighted average of the computed slopes to estimate the value at the next time step.\n", + "Different methods evaluate the slope function in different places and compute the average with different weights.\n", + "\n", + "So let's see if we can figure out how `solve_ivp` works.\n", + "As an example, we'll solve the following differential equation:\n", + "\n", + "$$\\frac{dy}{dt}(t) = y \\sin t$$\n", + "\n", + "Here's the slope function we'll use:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "coastal-cameroon", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def slope_func(t, state, system):\n", + " y, = state\n", + " dydt = y * np.sin(t)\n", + " return dydt" + ] + }, + { + "cell_type": "markdown", + "id": "egyptian-inventory", + "metadata": {}, + "source": [ + "I'll create a `State` object with the initial state and a `System` object with the end time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "recovered-makeup", + "metadata": {}, + "outputs": [], + "source": [ + "init = State(y=1)\n", + "system = System(init=init, t_end=3)" + ] + }, + { + "cell_type": "markdown", + "id": "resident-document", + "metadata": {}, + "source": [ + "Now we can call `run_solve_ivp`." + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "younger-affect", + "metadata": {}, + "outputs": [], + "source": [ + "results, details = run_solve_ivp(system, slope_func)\n", + "details" + ] + }, + { + "cell_type": "markdown", + "id": "sophisticated-person", + "metadata": {}, + "source": [ + "One of the variables in `details` is `nfev`, which stands for \"number of function evaluations\", that is, the number of times `solve_ivp` called the slope function.\n", + "This example took 50 evaluations.\n", + "Keep that in mind.\n", + "\n", + "Here are the first few time steps in `results`: " + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "suspended-tumor", + "metadata": {}, + "outputs": [], + "source": [ + "results.head()" + ] + }, + { + "cell_type": "markdown", + "id": "removable-queens", + "metadata": {}, + "source": [ + "And here is the number of time steps." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "noticed-portable", + "metadata": {}, + "outputs": [], + "source": [ + "len(results)" + ] + }, + { + "cell_type": "markdown", + "id": "unable-visibility", + "metadata": {}, + "source": [ + "`results` contains 101 points that are equally spaced in time.\n", + "Now you might wonder, if `solve_ivp` ran the slope function 50 times, how did we get 101 time steps?\n", + "\n", + "To answer that question, we need to know more how the solver works.\n", + "There are actually three steps:\n", + "\n", + "1. For each time step, `solve_ivp` evaluates the slope function seven times, with different values of `t` and `y`.\n", + "\n", + "2. Using the results, it computes the best estimate for the value `y` at the next time step.\n", + "\n", + "3. After computing all of the time steps, it uses interpolation to compute equally spaced points that connect the estimates from the previous step.\n", + "\n", + "So we can see what's happening, I will run `run_solve_ivp` with the keyword argument `dense_output=False`, which skips the interpolation step and returns time steps that are not equally spaced (that is, not \"dense\").\n", + "\n", + "While we're at it, I'll modify the slope function so that every time it runs, it adds the values of `t`, `y`, and `dydt` to a list called `evals`." + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "efficient-aluminum", + "metadata": {}, + "outputs": [], + "source": [ + "def slope_func(t, state, system):\n", + " y, = state\n", + " dydt = y * np.sin(t)\n", + " evals.append((t, y, dydt))\n", + " return dydt" + ] + }, + { + "cell_type": "markdown", + "id": "compliant-sampling", + "metadata": {}, + "source": [ + "Now, before we call `run_solve_ivp` again, I'll initialize `evals` with an empty list." + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "handed-gothic", + "metadata": {}, + "outputs": [], + "source": [ + "evals = []\n", + "results2, details = run_solve_ivp(system, slope_func, dense_output=False)" + ] + }, + { + "cell_type": "markdown", + "id": "mathematical-terrace", + "metadata": {}, + "source": [ + "Here are the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "accessory-wrapping", + "metadata": {}, + "outputs": [], + "source": [ + "results2" + ] + }, + { + "cell_type": "markdown", + "id": "rapid-parks", + "metadata": {}, + "source": [ + "It turns out there are only eight time steps, and the first five of them only cover 0.11 seconds.\n", + "\n", + "The time steps are not equal because the Dormand-Prince method is *adaptive*.\n", + "At each time step, it actually computes two estimates of the next\n", + "value. By comparing them, it can estimate the magnitude of the error,\n", + "which it uses to adjust the time step. If the error is too big, it uses\n", + "a smaller time step; if the error is small enough, it uses a bigger time\n", + "step. By adjusting the time step in this way, it minimizes the number\n", + "of times it calls the slope function to achieve a given level of\n", + "accuracy.\n", + "\n", + "Because we saved the values of `y` and `t`, we can plot the locations where the slope function was evaluated.\n", + "I'll need to use a couple of features we have not seen before, if you don't mind.\n", + "\n", + "First we'll unpack the values from `evals` using `np.transpose`.\n", + "Then we can use trigonometry to convert the slope, `dydt`, to components called `u` and `v`." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "indie-antigua", + "metadata": {}, + "outputs": [], + "source": [ + "t, y, slope = np.transpose(evals)\n", + "theta = np.arctan(slope)\n", + "u = np.cos(theta)\n", + "v = np.sin(theta)" + ] + }, + { + "cell_type": "markdown", + "id": "sublime-significance", + "metadata": {}, + "source": [ + "Using these values, we can generate a *quiver plot* that shows an arrow for each time the slope function ran.\n", + "The location of the each arrow represents the values of `t` and `y`; the orientation of the arrow shows the slope that was computed." + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "fossil-librarian", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.quiver(t, y, u, v, pivot='middle', \n", + " color='C1', alpha=0.4, label='evaluation points')\n", + "results2['y'].plot(style='o', color='C0', label='solution points')\n", + "results['y'].plot(lw=1, label='interpolation')\n", + "\n", + "decorate()" + ] + }, + { + "cell_type": "markdown", + "id": "uniform-cable", + "metadata": {}, + "source": [ + "In this figure, the arrows show where the slope function was executed;\n", + "the dots show the best estimate of `y` for each time step; and the line shows the interpolation that connects the estimates.\n", + "\n", + "Notice that many of the arrows do not fall on the line; `solve_ivp` evaluated the slope function at these locations in order to compute the solution, but as it turned out, they are not part of the solution.\n", + "\n", + "This is good to know when you are writing a slope function; you should not assume that the time and state you get as input variables are correct." + ] + }, + { + "cell_type": "markdown", + "id": "split-arabic", + "metadata": {}, + "source": [ + "## How root_scalar Works\n", + "\n", + "`root_scalar` in the ModSim library is a wrapper for a function in the SciPy library with the same name.\n", + "Like `run_solve_ivp`, it checks for common errors and changes some of the parameters in a way that makes the SciPy function easier to use (I hope).\n", + "\n", + "According to the documentation, `root_scalar` uses \"a combination of bisection, secant, and inverse quadratic interpolation methods.\" (See\n", + ")\n", + "\n", + "To understand what that means, suppose we're trying to find a root of a\n", + "function of one variable, $f(x)$, and assume we have evaluated the\n", + "function at two places, $x_1$ and $x_2$, and found that the results have\n", + "opposite signs. Specifically, assume $f(x_1) > 0$ and $f(x_2) < 0$, as\n", + "shown in the following diagram:\n", + "\n", + "![Initial state of a root-finding search](https://github.com/AllenDowney/ModSim/raw/main/figs/secant.png)" + ] + }, + { + "cell_type": "markdown", + "id": "divided-sailing", + "metadata": {}, + "source": [ + "If $f$ is a continuous function, there must be at least one root in this\n", + "interval. In this case we would say that $x_1$ and $x_2$ *bracket* a\n", + "root.\n", + "\n", + "If this were all you knew about $f$, where would you go looking for a\n", + "root? If you said \"halfway between $x_1$ and $x_2$,\" congratulations!\n", + "`You just invented a numerical method called *bisection*!\n", + "\n", + "If you said, \"I would connect the dots with a straight line and compute\n", + "the zero of the line,\" congratulations! You just invented the *secant\n", + "method*!\n", + "\n", + "And if you said, \"I would evaluate $f$ at a third point, find the\n", + "parabola that passes through all three points, and compute the zeros of\n", + "the parabola,\" congratulations, you just invented *inverse quadratic\n", + "interpolation*!\n", + "\n", + "That's most of how `root_scalar` works. The details of how these methods are\n", + "combined are interesting, but beyond the scope of this book. You can\n", + "read more at ." + ] + }, + { + "cell_type": "markdown", + "id": "dental-archives", + "metadata": {}, + "source": [ + "## How maximize_scalar Works \n", + "\n", + "`maximize_scalar` in the ModSim library is a wrapper for a function in the SciPy library called `minimize_scalar`.\n", + "You can read about it at .\n", + "\n", + "By default, it uses Brent's method, which is related to the method I described in the previous section for root-finding.\n", + "Brent's method for finding a maximum or minimum is based on a simpler algorithm:\n", + "the *golden-section search*, which I will explain.\n", + "\n", + "Suppose we're trying to find the minimum of a function of a single variable, $f(x)$.\n", + "As a starting place, assume that we have evaluated the function at three\n", + "places, $x_1$, $x_2$, and $x_3$, and found that $x_2$ yields the lowest\n", + "value. The following diagram shows this initial state.\n", + "\n", + "![Initial state of a golden-section\n", + "search](https://github.com/AllenDowney/ModSim/raw/main/figs/golden1.png)" + ] + }, + { + "cell_type": "markdown", + "id": "alpine-metro", + "metadata": {}, + "source": [ + "We will assume that $f(x)$ is continuous and *unimodal* in this range,\n", + "which means that there is exactly one minimum between $x_1$ and $x_3$.\n", + "\n", + "The next step is to choose a fourth point, $x_4$, and evaluate $f(x_4)$.\n", + "There are two possible outcomes, depending on whether $f(x_4)$ is\n", + "greater than $f(x_2)$ or not.\n", + "The following figure shows the two possible states.\n", + "\n", + "![Possible states of a golden-section search after evaluating\n", + "$f(x_4)$](https://github.com/AllenDowney/ModSim/raw/main/figs/golden2.png)" + ] + }, + { + "cell_type": "markdown", + "id": "african-check", + "metadata": {}, + "source": [ + "If $f(x_4)$ is less than $f(x_2)$ (shown on the left), the minimum must\n", + "be between $x_2$ and $x_3$, so we would discard $x_1$ and proceed with\n", + "the new bracket $(x_2, x_4, x_3)$.\n", + "\n", + "If $f(x_4)$ is greater than $f(x_2)$ (shown on the right), the local\n", + "minimum must be between $x_1$ and $x_4$, so we would discard $x_3$ and\n", + "proceed with the new bracket $(x_1, x_2, x_4)$.\n", + "\n", + "Either way, the range gets smaller and our estimate of the optimal value\n", + "of $x$ gets better.\n", + "\n", + "This method works for almost any value of $x_4$, but some choices are\n", + "better than others. You might be tempted to bisect the interval between\n", + "$x_2$ and $x_3$, but that turns out not to be optimal. You can\n", + "read about a better option at ." + ] + }, + { + "cell_type": "markdown", + "id": "broken-preparation", + "metadata": {}, + "source": [ + "## Chapter Review\n", + "\n", + "The information in this chapter is not strictly necessary; you can use\n", + "these methods without knowing much about how they work. But there are\n", + "two reasons you might want to know.\n", + "\n", + "One reason is pure curiosity. If you use these methods, and especially\n", + "if you come to rely on them, you might find it unsatisfying to treat\n", + "them as \"black boxes.\" At the risk of mixing metaphors, I hope you\n", + "enjoyed opening the hood.\n", + "\n", + "The other reason is that these methods are not infallible; sometimes\n", + "things go wrong. If you know how they work, at least in a general sense,\n", + "you might find it easier to debug them." + ] + }, + { + "cell_type": "markdown", + "id": "noted-interview", + "metadata": {}, + "source": [ + "With that, you have reached the end of the book, so congratulations! I\n", + "hope you enjoyed it and learned a lot. I think the tools in this book\n", + "are useful, and the ways of thinking are important, not just in\n", + "engineering and science, but in practically every field of inquiry.\n", + "\n", + "Models are the tools we use to understand the world: if you build good\n", + "models, you are more likely to get things right. Good luck!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "suspended-apparel", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e3b3a278bafeee7bbb1bf17cd2cc92de4d7f5e2a Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 14 Jul 2021 09:43:18 -0400 Subject: [PATCH 078/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 231584 -> 239267 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index de086933d461737f60593ff3ac5a6ba60619972c..dbaa662e32e2f5d1441ed8744e0210e97c0e05e6 100644 GIT binary patch delta 98962 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 Date: Thu, 18 Feb 2021 16:10:14 -0500 Subject: [PATCH 061/144] Updating chapters --- chapters/chap01.ipynb | 9 +++-- chapters/chap07.ipynb | 76 ++++++++++++++++++++----------------------- chapters/chap08.ipynb | 69 +++++++++++++++++++++++---------------- chapters/chap12.ipynb | 55 +++++++++++-------------------- chapters/chap14.ipynb | 8 ++--- chapters/chap17.ipynb | 2 +- chapters/chap18.ipynb | 2 +- chapters/chap20.ipynb | 8 +++-- chapters/chap22.ipynb | 44 ++++++++++++------------- chapters/chap23.ipynb | 8 ++--- 10 files changed, 138 insertions(+), 143 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index f3bea000..af6790bf 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -475,7 +475,7 @@ }, { "cell_type": "markdown", - "id": "judicial-capability", + "id": "clinical-blackjack", "metadata": {}, "source": [ "## Computation with units\n", @@ -495,7 +495,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "threatened-mediterranean", + "id": "lovely-declaration", "metadata": {}, "outputs": [], "source": [ @@ -727,7 +727,7 @@ { "cell_type": "code", "execution_count": 57, - "id": "beautiful-digit", + "id": "impaired-puzzle", "metadata": {}, "outputs": [], "source": [ @@ -1188,8 +1188,7 @@ "metadata": {}, "outputs": [], "source": [ - "pace_per_mile = pace_per_km.to(minute / mile)\n", - "pace_per_mile" + "# Solution goes here" ] }, { diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index e3f69fc6..2290abf5 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -22,23 +22,6 @@ "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" ] }, - { - "cell_type": "code", - "execution_count": 1, - "id": "incorrect-probability", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, { "cell_type": "code", "execution_count": 2, @@ -59,8 +42,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -104,8 +87,8 @@ }, "outputs": [], "source": [ - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/data/World_population_estimates.html')" + "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", + " 'World_population_estimates.html')" ] }, { @@ -153,6 +136,19 @@ { "cell_type": "code", "execution_count": 7, + "id": "simple-coupon", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap06.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "id": "monetary-profile", "metadata": { "tags": [] @@ -210,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "beginning-belly", "metadata": {}, "outputs": [], @@ -229,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "listed-florence", "metadata": {}, "outputs": [], @@ -254,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "signed-impossible", "metadata": {}, "outputs": [], @@ -273,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "italian-converter", "metadata": {}, "outputs": [], @@ -291,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "simplified-sight", "metadata": {}, "outputs": [], @@ -336,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "neural-guinea", "metadata": {}, "outputs": [], @@ -356,7 +352,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "animal-spoke", "metadata": {}, "outputs": [], @@ -376,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "informed-three", "metadata": {}, "outputs": [], @@ -394,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "unexpected-nigeria", "metadata": {}, "outputs": [], @@ -455,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "ordinary-honolulu", "metadata": {}, "outputs": [], @@ -518,7 +514,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "realistic-opinion", "metadata": {}, "outputs": [], @@ -550,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "marine-entry", "metadata": {}, "outputs": [], @@ -584,7 +580,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "moving-brazil", "metadata": {}, "outputs": [], @@ -627,7 +623,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "sacred-physiology", "metadata": {}, "outputs": [], @@ -704,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "stretch-check", "metadata": {}, "outputs": [], @@ -714,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "tender-treat", "metadata": {}, "outputs": [], @@ -724,7 +720,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "passive-certificate", "metadata": {}, "outputs": [], @@ -748,7 +744,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "agricultural-burke", "metadata": {}, "outputs": [], @@ -782,7 +778,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.9.1" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index 228360d3..c96210af 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -59,8 +59,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -104,8 +104,8 @@ }, "outputs": [], "source": [ - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/data/World_population_estimates.html')" + "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", + " 'World_population_estimates.html')" ] }, { @@ -153,6 +153,19 @@ { "cell_type": "code", "execution_count": 7, + "id": "measured-arthur", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap06.py')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "id": "cutting-financing", "metadata": { "tags": [] @@ -201,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "indirect-russia", "metadata": {}, "outputs": [], @@ -220,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "comfortable-compression", "metadata": {}, "outputs": [], @@ -245,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "broken-windsor", "metadata": {}, "outputs": [], @@ -263,7 +276,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "latest-function", "metadata": {}, "outputs": [], @@ -281,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "portable-pottery", "metadata": {}, "outputs": [], @@ -352,7 +365,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "precious-contribution", "metadata": {}, "outputs": [], @@ -373,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "headed-tuner", "metadata": {}, "outputs": [], @@ -391,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "paperback-delay", "metadata": {}, "outputs": [], @@ -421,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "billion-dynamics", "metadata": {}, "outputs": [], @@ -473,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "handmade-funeral", "metadata": {}, "outputs": [], @@ -494,7 +507,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "objective-accused", "metadata": {}, "outputs": [], @@ -513,7 +526,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "unique-matrix", "metadata": {}, "outputs": [], @@ -539,7 +552,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "pressing-proceeding", "metadata": {}, "outputs": [], @@ -560,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "mexican-denver", "metadata": {}, "outputs": [], @@ -581,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "addressed-worker", "metadata": {}, "outputs": [], @@ -600,7 +613,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "cathedral-shakespeare", "metadata": {}, "outputs": [], @@ -634,7 +647,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "common-april", "metadata": {}, "outputs": [], @@ -644,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "ignored-chain", "metadata": {}, "outputs": [], @@ -654,7 +667,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "color-accountability", "metadata": {}, "outputs": [], @@ -664,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "id": "numeric-raise", "metadata": {}, "outputs": [], @@ -674,7 +687,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "id": "included-vehicle", "metadata": {}, "outputs": [], @@ -684,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "id": "brown-rating", "metadata": {}, "outputs": [], @@ -694,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "id": "laughing-cylinder", "metadata": {}, "outputs": [], @@ -704,7 +717,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "id": "personalized-parking", "metadata": {}, "outputs": [], diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index fc23c876..06c7386b 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -25,23 +25,6 @@ { "cell_type": "code", "execution_count": 1, - "id": "electoral-turkey", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -59,13 +42,13 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "progressive-typing", "metadata": { "tags": [] @@ -87,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "breathing-hamilton", "metadata": { "tags": [] @@ -143,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "id": "recent-cooper", "metadata": {}, "outputs": [], @@ -166,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "id": "found-learning", "metadata": {}, "outputs": [], @@ -192,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "id": "enormous-abortion", "metadata": {}, "outputs": [], @@ -211,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 8, "id": "funny-copper", "metadata": {}, "outputs": [], @@ -230,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "id": "divided-biotechnology", "metadata": {}, "outputs": [], @@ -274,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 10, "id": "synthetic-element", "metadata": { "tags": [] @@ -289,7 +272,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 11, "id": "recovered-picnic", "metadata": {}, "outputs": [], @@ -299,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 12, "id": "american-transfer", "metadata": {}, "outputs": [], @@ -328,7 +311,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 13, "id": "progressive-architect", "metadata": {}, "outputs": [], @@ -357,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 14, "id": "measured-pavilion", "metadata": {}, "outputs": [], @@ -376,7 +359,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 15, "id": "interior-humanitarian", "metadata": {}, "outputs": [], @@ -448,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 16, "id": "impressive-librarian", "metadata": {}, "outputs": [], @@ -458,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 17, "id": "assumed-license", "metadata": {}, "outputs": [], @@ -468,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 18, "id": "intended-premium", "metadata": {}, "outputs": [], @@ -478,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 19, "id": "limiting-interest", "metadata": {}, "outputs": [], diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 4d7fb778..39e7d841 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -726,12 +726,12 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "id": "corresponding-india", "metadata": {}, "outputs": [], "source": [ - "make_series(t_array, T_array)" + "frac_infected_series = make_series(c_array, frac_infected)" ] }, { @@ -744,14 +744,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "constant-christianity", "metadata": {}, "outputs": [], "source": [ "from pandas import Series\n", "\n", - "Series(T_array, t_array)" + "frac_infected_series = Series(frac_infected, c_array)" ] }, { diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index fe6a8163..f1dbacb1 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -271,7 +271,7 @@ }, "outputs": [], "source": [ - "download('https://github.com/AllenDowney/ModSim/raw/master/' +\n", + "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", " 'glucose_insulin.csv')" ] }, diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index a69372fc..0f4de3ee 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -121,7 +121,7 @@ }, "outputs": [], "source": [ - "download('https://github.com/AllenDowney/ModSim/raw/master/' +\n", + "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", " 'glucose_insulin.csv')" ] }, diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index 0ac9851f..172ad017 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -34,9 +34,13 @@ "# install Pint if necessary\n", "\n", "try:\n", - " import pint\n", + " from pint import UnitRegistry\n", "except ImportError:\n", - " !pip install pint" + " !pip install pint\n", + " \n", + "# import units\n", + "from pint import UnitRegistry\n", + "units = UnitRegistry()" ] }, { diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index a556d27f..b9f926ca 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -63,8 +63,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -640,7 +640,7 @@ }, { "cell_type": "markdown", - "id": "fluid-equilibrium", + "id": "received-winner", "metadata": {}, "source": [ "Using vectors to represent forces and accelerations makes the code\n", @@ -811,7 +811,7 @@ }, { "cell_type": "markdown", - "id": "expressed-monday", + "id": "higher-spirituality", "metadata": {}, "source": [ "The magnitude of final velocity is the speed of the ball when it lands." @@ -907,7 +907,7 @@ { "cell_type": "code", "execution_count": 34, - "id": "moving-handling", + "id": "abandoned-census", "metadata": {}, "outputs": [], "source": [ @@ -950,7 +950,7 @@ }, { "cell_type": "markdown", - "id": "current-costume", + "id": "alpine-compromise", "metadata": {}, "source": [ "Inside the draw function, should use `decorate` to set the limits of the $x$ and $y$ axes.\n", @@ -1091,7 +1091,7 @@ }, { "cell_type": "markdown", - "id": "exotic-adjustment", + "id": "primary-choice", "metadata": { "tags": [] }, @@ -1102,19 +1102,19 @@ { "cell_type": "code", "execution_count": 45, - "id": "hungarian-vulnerability", + "id": "educational-isolation", "metadata": { "tags": [] }, "outputs": [], "source": [ - "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", " 'baseball_drag.csv')" ] }, { "cell_type": "markdown", - "id": "complete-momentum", + "id": "virtual-albuquerque", "metadata": { "tags": [] }, @@ -1125,7 +1125,7 @@ { "cell_type": "code", "execution_count": 46, - "id": "horizontal-steam", + "id": "personal-database", "metadata": { "tags": [] }, @@ -1138,7 +1138,7 @@ }, { "cell_type": "markdown", - "id": "narrative-telling", + "id": "assumed-harrison", "metadata": { "tags": [] }, @@ -1160,7 +1160,7 @@ }, { "cell_type": "markdown", - "id": "vulnerable-shore", + "id": "backed-access", "metadata": { "tags": [] }, @@ -1170,20 +1170,20 @@ }, { "cell_type": "code", - "execution_count": 48, - "id": "continental-defendant", + "execution_count": 61, + "id": "spectacular-trash", "metadata": { "tags": [] }, "outputs": [], "source": [ - "mph_to_mps = (1 * units.mph).to(units.mps).magnitude\n", + "mph_to_mps = (1 * units.mph).to(units.m/units.s).magnitude\n", "speed = baseball_drag['Velocity in mph'] * mph_to_mps" ] }, { "cell_type": "markdown", - "id": "alpha-warrior", + "id": "finnish-switch", "metadata": { "tags": [] }, @@ -1194,7 +1194,7 @@ { "cell_type": "code", "execution_count": 49, - "id": "actual-sherman", + "id": "right-burton", "metadata": { "tags": [] }, @@ -1205,7 +1205,7 @@ }, { "cell_type": "markdown", - "id": "random-alignment", + "id": "mobile-flashing", "metadata": { "tags": [] }, @@ -1216,7 +1216,7 @@ { "cell_type": "code", "execution_count": 50, - "id": "chinese-optimization", + "id": "labeled-closing", "metadata": { "tags": [] }, @@ -1230,7 +1230,7 @@ }, { "cell_type": "markdown", - "id": "involved-behalf", + "id": "indoor-zealand", "metadata": { "tags": [] }, @@ -1352,7 +1352,7 @@ { "cell_type": "code", "execution_count": null, - "id": "existing-lighter", + "id": "ignored-conditions", "metadata": {}, "outputs": [], "source": [] diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 493c75a1..20612664 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -63,8 +63,8 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/master/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'modsim.py')" ] }, { @@ -141,7 +141,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "published-requirement", + "id": "finite-warrant", "metadata": {}, "outputs": [], "source": [ @@ -495,7 +495,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "corrected-parker", + "id": "american-biodiversity", "metadata": {}, "outputs": [], "source": [ From 006631b3b9d4af203d7f22da4cc1fedffc1820f0 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 18 Feb 2021 16:10:14 -0500 Subject: [PATCH 062/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 238412 -> 238281 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index e3375844a56545654ed3d9d545eb4954717de90b..b15f4f82e33e290aba04d11f6d356c47b9d6549d 100644 GIT binary patch delta 60513 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

  2. 7)EuSfVPr z&TwS;`YLvoyVNJ@Kb%Dc;XgTj71brj;wVj=v}nV!T*t_#~uk8gZZKP?0Hnv*{N{9rRs^o1NnFPx+80e z+WoL7D*N@Hv#;G%j-5>;J2F-JEoND)&|M{Kw3ZS(Up($zoVriRL`Y41U*sIWN^~Ax zxX@%4jPv+jUxNN8{U5GD8N}ljg%%SCNI~mAu?#H#f5$TK|3@styP3Gjo_g~JVn&b8m^NJEp$~acP@mH_m70KsKt?ni>ro$8Eu@^p|Le7n~$eVdEsyiIk zBna;s8$g1dDzW9%{&knsWvW^rvR@XuYtUGQK36k;b+C@C|BlRWd1bPi^1HSfUCHo` z7@3czD}*-gw*;pEF3`yYphA+AISPA@_*uPFY_LWZI|spw=gWm1Oj zFvSeh0`v4rEioJr?F;G<*=YZ2jU71+rTHWcoBpF-Pm@wg&2p8}qD>E@%ktVadD}Q& za3po>HqzpeGTvf1cVcnX_22U$$IeD}4h97U5dovKlPntiJaRiO=T6EXS~xg?5NLS? z0#P@p_S-cycVg1~S`jrWG4`n_~7Uqf`fiY6CN1?~CGCFp~ z>_g%N*_0?{^nNGih)j)g=``=D+X!AzJvayPVMRKVBSj3G@0^&i76S*Ji_?8$N7yf! zjCs7P#@yIYR|z7Q$#=8TWtL6n1s^C1+4%7h-KacRBO7pf-DQw=p{>Y|IWp>_iD*4g zyc$OU)MRz&-O;y6M`}h60pQS`lGttf`;2@OXIoe*B=#_Jf^~P=J9V z?x+3MG8HQGPyG!jOY-DzhiyOGD{e|-n<+qYP8RFpcofioBuJ-|fxN8t$RQo4?bJX3 z)Y>$#mFTiT+MlGt)+g}4jSe(Tg^MIRjVzfBiBeAd9T7$=cs6RAk!TaCD9w*@wAiR% zJx@xJqOJF?#^a9N2a)=z<|e&Z)4|Bw6Y8<^%Ygaoa+#^05C_PaOAYfn;hkW!$%q0J zaWOZ5>r&zJ3eAuVwBT4ObaW*OAyQHSC8oC+mR8y@lOjc|px)?g4l`@!WJBm@qI>!o z*xHL|IIM|6#o}b;wAh2hQ|68BvMhVVf(l@P)%ymFX4BOjCBFtkdw9ISKX$A8!O|)X zdFPT69nCrNqaDfiGUM0s?2}x?1tX48IOvek6m7z>ss^U_Nb>n$BcL+d(2m*wFj~-V zqX8TKxS&VG{9P#tij=C36)Dha^dkSJ39U$D05Kv^Y-esF2C3@Lue#GP7${2&k^2I* zdyfSVhBa}JpQ80fJRi6eWafLd-*{@;(eSbmB4oD)*_3+UA;613-oO!Gv@+-z5M}+o zWP(f%g6*l3gj)V)cXwXgrdHj6d9wIJ+qvm%qBzp=`9IA{3WZ?IIDvGf$4Wl5?}G9` z{m6}iIeDQMe1XweaEUXDIq! z)9_0Uc+5VPJ$$X_&{JW+%LT$>qM35g4i4wAsxHsN^I$ttfJ0zqhvxk}#)beiarz#| zCB}^70=DsNwP9H7UQ6z)wV87OZ)-Zk@cB=-$Mf#g=P%fSAwXLirovpG-NU!e6x&3U z3BRE)J{_75qYkaVeYMIZ2xy2nD|9ij#hm`T(?mDa$AUu z`X{|Fr-{m{%TF%Uq>mpP11MeFR&sCQ8cG;uQk9fzKGUBhg7mS^6qOH{esTeGVq=yk zcA;N4q#~Cv-{@z{nRpNug*Pl8dJWkH9twGuJO}-Pe=DC!73b*p{nyi&s(Bu{^D}|1 zbdR9fZV3953u`)HcVMqq?`IQnmsJP%0AUz}cm!K7c$;WDDWn-;FJH3ybhf!h4mj~_ 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 From 98c50c6ca248eb64586887547342a99ce0a46f83 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 15 Jul 2021 15:22:22 -0400 Subject: [PATCH 079/144] Updating chapters --- chapters/chap24.ipynb | 35 ++++++++++++++++-------------- chapters/chap25.ipynb | 50 ++++++++++++++++++++++++++++++------------- chapters/chap26.ipynb | 2 +- chapters/chap27.ipynb | 36 ++++++++++++++++++------------- 4 files changed, 76 insertions(+), 47 deletions(-) diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 8d50d082..91a8c07f 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -78,11 +78,9 @@ "In this chapter and the next we'll model systems that involve rotating objects.\n", "In general, rotation is complicated.\n", "In three dimensions, objects can rotate around three axes and many objects are easier to spin around some axes than others.\n", - "\n", "If the configuration of an object changes over time, it might become\n", "easier or harder to spin, which explains the surprising dynamics of\n", "gymnasts, divers, ice skaters, etc.\n", - "\n", "And when you apply a twisting force to a rotating object, the effect is often contrary to intuition. \n", "For an example, see this video on gyroscopic precession: ." ] @@ -93,10 +91,10 @@ "metadata": {}, "source": [ "We will not take on the physics of rotation in all its glory; rather, we will focus on simple scenarios where all rotation and all twisting forces are around a single axis. \n", - "In that case, we can treat some vector quantities as if they were scalars, in the same way that we sometimes treat velocity as a scalar with an implicit direction.\n", + "In that case, we can treat some vector quantities as if they were scalars; that is, simple numbers.\n", "\n", "The fundamental ideas in these examples are angular velocity, angular acceleration, torque, and moment of inertia.\n", - "If you are not already familiar with these concepts, I will define them as we go along, and I will point to additional reading." + "If you are not already familiar with these concepts, don't worry; I will define them as we go along, and I will point to additional reading." ] }, { @@ -199,7 +197,7 @@ "id": "ordinary-leader", "metadata": {}, "source": [ - "In that case, the circumference of the roll is also be constant:" + "In that case, the circumference of the roll is also constant:" ] }, { @@ -348,7 +346,6 @@ "As usual, the slope function takes a time stamp, a `State` object, and a `System` object. \n", "\n", "The job of the slope function is to compute the time derivatives of the state variables.\n", - "\n", "The derivative of `theta` is angular velocity, `omega`.\n", "The derivatives of `y` and `r` are given by the differential equations we derived." ] @@ -583,12 +580,12 @@ }, { "cell_type": "markdown", - "id": "dedicated-tuning", + "id": "smoking-spine", "metadata": {}, "source": [ "`r` also increases linearly.\n", "\n", - "But since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope." + "Here's what `y` looks like over time." ] }, { @@ -609,11 +606,12 @@ }, { "cell_type": "markdown", - "id": "furnished-executive", + "id": "dedicated-tuning", "metadata": {}, "source": [ - "In the next section, we'll see that we could have solved the\n", - "differential equations analytically.\n", + "Since the derivative of `y` depends on `r`, and `r` is increasing, `y` grows with increasing slope.\n", + "\n", + "In the next section, we'll see that we could have solved these differential equations analytically.\n", "However, it is often useful to start with simulation as a way of exploring and checking assumptions." ] }, @@ -622,7 +620,7 @@ "id": "better-asbestos", "metadata": {}, "source": [ - "## Analysis\n", + "## Analytic Solution\n", "\n", "Since angular velocity is constant: \n", "\n", @@ -717,7 +715,6 @@ "## Summary\n", "\n", "This chapter introduces rotation, starting with an example where angular velocity is constant.\n", - "\n", "We simulated the manufacture of a roll of toilet paper, then we solved the same problem analytically.\n", "\n", "In the next chapter, we'll see a more interesting example where angular velocity is not constant. And we'll introduce three new concepts: torque, angular acceleration, and moment of inertia.\n", @@ -756,6 +753,14 @@ "dydt = gradient(results.y)" ] }, + { + "cell_type": "markdown", + "id": "atomic-montana", + "metadata": {}, + "source": [ + "Here's what the result looks like." + ] + }, { "cell_type": "code", "execution_count": 26, @@ -793,12 +798,10 @@ "metadata": {}, "source": [ "Now suppose this peak velocity is the limiting factor; that is, we can't move the paper any faster than that.\n", - "\n", "In that case, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", "\n", "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." + "Then, run the simulation and see how much faster we could finish rolling the paper." ] }, { diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index dfedacc0..cc17ba05 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -63,7 +63,9 @@ { "cell_type": "markdown", "id": "plastic-trigger", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap25.ipynb)" ] @@ -85,12 +87,12 @@ "source": [ "## Angular Acceleration\n", "\n", - "Just as linear acceleration is the derivative of velocity, **angular\n", - "acceleration* is the derivative of angular velocity. And just as linear acceleration is caused by force, angular acceleration is caused by the rotational version of force, *torque**. If you are not familiar with torque, you can read about it at .\n", + "Just as linear acceleration is the derivative of velocity, *angular\n", + "acceleration* is the derivative of angular velocity. And just as linear acceleration is caused by force, angular acceleration is caused by the rotational version of force, *torque*. If you are not familiar with torque, you can read about it at .\n", "\n", - "In general, torque is a vector quantity, defined as the **cross\n", + "In general, torque is a vector quantity, defined as the *cross\n", "product* of $\\vec{r}$ and $\\vec{F}$, where $\\vec{r}$ is the *lever\n", - "arm**, a vector from the center of rotation to the point where the force is applied, and $\\vec{F}$ is the vector that represents the magnitude and direction of the force." + "arm*, a vector from the center of rotation to the point where the force is applied, and $\\vec{F}$ is the vector that represents the magnitude and direction of the force." ] }, { @@ -98,7 +100,7 @@ "id": "promotional-trigger", "metadata": {}, "source": [ - "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute \n", + "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute this product of scalar quantities:\n", "\n", "$$\\tau = r F \\sin \\theta$$ \n", "\n", @@ -121,7 +123,7 @@ "where $\\alpha$ is angular acceleration and $I$ is *moment of inertia*. Just as mass is what makes it hard to accelerate an object, moment of inertia is what makes it hard to spin an object.\n", "\n", "In the most general case, a 3-D object rotating around an arbitrary\n", - "axis, moment of inertia is a tensor, which is a function that takes a\n", + "axis, moment of inertia is a *tensor*, which is a function that takes a\n", "vector as a parameter and returns a vector as a result.\n", "\n", "Fortunately, in a system where all rotation and torque happens around a single axis, we don't have to deal with the most general case. We can treat moment of inertia as a scalar quantity.\n", @@ -167,7 +169,7 @@ "\n", "2. The teapot weights 0.3 kg, and it sits 0.4 m from the center of the turntable.\n", "\n", - "The following figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the lever arm, $r$, and $\\tau$ is the resulting torque. The blue circle near the bottom is the teapot.\n", + "The following figure shows the scenario, where $F$ is the force I apply to the turntable at the perimeter, perpendicular to the lever arm, $r$, and $\\tau$ is the resulting torque. The circle near the bottom is the teapot.\n", "\n", "![Diagram of a turntable with a\n", "teapot.](https://github.com/AllenDowney/ModSim/raw/main/figs/teapot.png)\n", @@ -376,7 +378,7 @@ }, { "cell_type": "markdown", - "id": "decent-microwave", + "id": "tribal-disclosure", "metadata": {}, "source": [ "## Two Phase Simulation\n", @@ -390,7 +392,15 @@ "2. During the second phase, force is 0, and we run until `omega` is 0.\n", "\n", "Then we can combine the results of the two phases into a single\n", - "`TimeFrame`.\n", + "`TimeFrame`." + ] + }, + { + "cell_type": "markdown", + "id": "decent-microwave", + "metadata": {}, + "source": [ + "### Phase 1\n", "\n", "Here's the event function I'll use for Phase 1; it stops the simulation when `theta` reaches `theta_push`, which is when I stop pushing:" ] @@ -491,6 +501,8 @@ "id": "aware-generator", "metadata": {}, "source": [ + "### Phase 2\n", + "\n", "Now we can make a `System` object for Phase 2 with the initial state\n", "from Phase 1 and with `force=0`." ] @@ -549,6 +561,8 @@ "id": "administrative-major", "metadata": {}, "source": [ + "The result is the angular velocity at the beginning of Phase 2, in rad/s.\n", + "\n", "Now we can run the second phase." ] }, @@ -569,6 +583,8 @@ "id": "hindu-requirement", "metadata": {}, "source": [ + "### Combining the Results\n", + "\n", "`DataFrame` provides `append`, which appends `results2` to the end of\n", "`results1`." ] @@ -749,6 +765,12 @@ "id": "generous-parcel", "metadata": {}, "source": [ + "This error function takes torque due to friction as an input.\n", + "It extracts `force` from the `System` object and runs the simulation.\n", + "From the results, it extracts the last value of `theta` and returns the difference between the result of the simulation and the result of the experiment.\n", + "When this difference is 0, the value of `torque_friction` is an estimate for the friction in the experiment.\n", + "\n", + "To bracket the root, we need one value that's too low and one that's too high.\n", "With `torque_friction=0.3`, the table rotates a bit too far:" ] }, @@ -827,8 +849,7 @@ "Now that we know the torque due to friction, we can compute the force\n", "needed to rotate the turntable through the remaining angle, that is,\n", "from 1.5 rad to 3.14 rad.\n", - "\n", - "But first, let's animate the results." + "You'll have a chance to do that as an exercise, but first, let's animate the results." ] }, { @@ -836,8 +857,7 @@ "id": "knowing-sleeve", "metadata": {}, "source": [ - "## Animation\n", - "\n", + "## Animating the Turntable\n", "\n", "Here's a function that takes the state of the system and draws it." ] @@ -893,7 +913,7 @@ "id": "efficient-summary", "metadata": {}, "source": [ - "And here's an animation of the first push." + "And here's how we call it." ] }, { diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index 94196b18..758cd3c6 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -98,7 +98,7 @@ "source": [ "## Orbiting the Sun\n", "\n", - "In a previous example, we modeled the interaction between the Earth and the Sun, simulating what would happen if the Earth stopped in its orbit and fell straight into the Sun.\n", + "In the exercise at the end of Chapter 20, we modeled the interaction between the Earth and the Sun, simulating what would happen if the Earth stopped in its orbit and fell straight into the Sun.\n", "\n", "Now let's extend the model to two dimensions and simulate one revolution of the Earth around the Sun, that is, one year.\n", "\n", diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb index 543d856e..c5f52c3d 100644 --- a/chapters/chap27.ipynb +++ b/chapters/chap27.ipynb @@ -24,9 +24,11 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 2, "id": "approximate-working", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# download modsim.py if necessary\n", @@ -46,9 +48,11 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 3, "id": "suspended-occasion", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# import functions from modsim\n", @@ -94,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 4, "id": "coastal-cameroon", "metadata": {}, "outputs": [], @@ -117,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "recovered-makeup", "metadata": {}, "outputs": [], @@ -136,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 6, "id": "younger-affect", "metadata": {}, "outputs": [], @@ -159,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 7, "id": "suspended-tumor", "metadata": {}, "outputs": [], @@ -177,7 +181,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 8, "id": "noticed-portable", "metadata": {}, "outputs": [], @@ -209,7 +213,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 9, "id": "efficient-aluminum", "metadata": {}, "outputs": [], @@ -231,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 10, "id": "handed-gothic", "metadata": {}, "outputs": [], @@ -250,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 11, "id": "accessory-wrapping", "metadata": {}, "outputs": [], @@ -283,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 12, "id": "indie-antigua", "metadata": {}, "outputs": [], @@ -305,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 13, "id": "fossil-librarian", "metadata": {}, "outputs": [], @@ -317,7 +321,8 @@ "results2['y'].plot(style='o', color='C0', label='solution points')\n", "results['y'].plot(lw=1, label='interpolation')\n", "\n", - "decorate()" + "decorate(xlabel='Time (t)',\n", + " ylabel='Quantity (y)')" ] }, { @@ -489,6 +494,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", From 9c164caf9a444f3715b8801c514f26be327c4e8d Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 15 Jul 2021 15:22:22 -0400 Subject: [PATCH 080/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 239267 -> 239582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index dbaa662e32e2f5d1441ed8744e0210e97c0e05e6..7dd8b9a7d34198fc4b21df597d6d55ff2984761d 100644 GIT binary patch delta 26099 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 C=Q{QP From 32672cd91a2cfc9cdd82455db9beb78770006484 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 10 Feb 2022 14:36:40 -0500 Subject: [PATCH 081/144] Update chap01.ipynb --- chapters/chap01.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 2f358775..844e7204 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -752,7 +752,7 @@ }, "outputs": [], "source": [ - "assert abs(v.magnitude - 86.41527642726142) < 1e7" + "assert abs(v.magnitude - 86.41527642726142) < 1e-7" ] }, { From 1fe1cee5ebbca47fde1c7114ba343ced1bbc5806 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 20 Mar 2022 19:07:24 -0400 Subject: [PATCH 082/144] Removing old versions --- colab/chap01.ipynb | 532 ----------------- colab/chap02.ipynb | 893 ----------------------------- colab/chap03.ipynb | 606 -------------------- colab/chap04.ipynb | 681 ---------------------- colab/chap05.ipynb | 617 -------------------- colab/chap06.ipynb | 560 ------------------ colab/chap07.ipynb | 547 ------------------ colab/chap08.ipynb | 609 -------------------- colab/chap09.ipynb | 657 --------------------- colab/chap10.ipynb | 474 ---------------- colab/chap11.ipynb | 476 ---------------- colab/chap12.ipynb | 887 ----------------------------- colab/chap13.ipynb | 526 ----------------- colab/chap13ode.ipynb | 194 ------- colab/chap14.ipynb | 487 ---------------- colab/chap15.ipynb | 332 ----------- colab/chap16.ipynb | 854 ---------------------------- colab/chap17.ipynb | 299 ---------- colab/chap18.ipynb | 559 ------------------ colab/chap20.ipynb | 656 --------------------- colab/chap21.ipynb | 527 ----------------- colab/chap22.ipynb | 1264 ----------------------------------------- colab/chap23.ipynb | 584 ------------------- colab/chap24.ipynb | 653 --------------------- colab/chap25.ipynb | 957 ------------------------------- 25 files changed, 15431 deletions(-) delete mode 100644 colab/chap01.ipynb delete mode 100644 colab/chap02.ipynb delete mode 100644 colab/chap03.ipynb delete mode 100644 colab/chap04.ipynb delete mode 100644 colab/chap05.ipynb delete mode 100644 colab/chap06.ipynb delete mode 100644 colab/chap07.ipynb delete mode 100644 colab/chap08.ipynb delete mode 100644 colab/chap09.ipynb delete mode 100644 colab/chap10.ipynb delete mode 100644 colab/chap11.ipynb delete mode 100644 colab/chap12.ipynb delete mode 100644 colab/chap13.ipynb delete mode 100644 colab/chap13ode.ipynb delete mode 100644 colab/chap14.ipynb delete mode 100644 colab/chap15.ipynb delete mode 100644 colab/chap16.ipynb delete mode 100644 colab/chap17.ipynb delete mode 100644 colab/chap18.ipynb delete mode 100644 colab/chap20.ipynb delete mode 100644 colab/chap21.ipynb delete mode 100644 colab/chap22.ipynb delete mode 100644 colab/chap23.ipynb delete mode 100644 colab/chap24.ipynb delete mode 100644 colab/chap25.ipynb diff --git a/colab/chap01.ipynb b/colab/chap01.ipynb deleted file mode 100644 index 7a39ec16..00000000 --- a/colab/chap01.ipynb +++ /dev/null @@ -1,532 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Jupyter\n", - "\n", - "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", - "\n", - "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting and running cells\n", - "\n", - "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", - "\n", - "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding and removing cells\n", - "\n", - "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", - "\n", - "Try the following exercises:\n", - "\n", - "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", - "\n", - "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", - "\n", - "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", - "\n", - "4. In the new cell, type some text, and then run it.\n", - "\n", - "5. Use the arrow buttons in the toolbar to move cells up and down.\n", - "\n", - "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", - "\n", - "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", - "\n", - "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing modules\n", - "\n", - "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", - "\n", - "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n", - "\n", - "The following cells check whether you have these modules already and tries to install them if you don't." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", - "\n", - "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", - "\n", - "You can find out what version of Python and Jupyter you have by running the following cells." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "!python --version" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "!jupyter-notebook --version" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The penny myth\n", - "\n", - "The following cells contain code from the beginning of Chapter 1.\n", - "\n", - "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", - "\n", - "The following lines create new variables named `meter` and `second`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "meter = UNITS.meter" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "second = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a variable named `a` and give it the value of acceleration due to gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8 * meter / second**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create `t` and give it the value 4 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t = 4 * second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "a * t**2 / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", - "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", - "\n", - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", - "\n", - "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Falling pennies\n", - "\n", - "Now let's solve the falling penny problem.\n", - "\n", - "Set `h` to the height of the Empire State Building:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the time it would take a penny to fall, assuming constant acceleration.\n", - "\n", - "$ a t^2 / 2 = h $\n", - "\n", - "$ t = \\sqrt{2 h / a}$" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "t = sqrt(2 * h / a)\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given `t`, we can compute the velocity of the penny when it lands.\n", - "\n", - "$v = a t$" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "v = a * t\n", - "v" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can convert from one set of units to another like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "mile = UNITS.mile\n", - "hour = UNITS.hour" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "v.to(mile/hour)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", - "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", - "\n", - "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", - "\n", - "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", - "\n", - "You can break this question into three parts:\n", - "\n", - "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", - "2. How far would the penny fall during that time?\n", - "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", - "\n", - "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Restart and run all\n", - "\n", - "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", - "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", - "\n", - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap02.ipynb b/colab/chap02.ipynb deleted file mode 100644 index 52250e76..00000000 --- a/colab/chap02.ipynb +++ /dev/null @@ -1,893 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modeling a bikeshare system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with a `State` object that represents the number of bikes at each station.\n", - "\n", - "When you display a `State` object, it lists the state variables and their values:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the state variables using dot notation." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", - "\n", - "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating\n", - "\n", - "We can use the update operators `+=` and `-=` to change state variables." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we display `bikeshare`, we should see the change." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley += 1\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Functions\n", - "\n", - "We can take the code we've written so far and encapsulate it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conditionals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", - "\n", - "The Python function `help` looks up a function and displays its documentation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "help(flip)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "flip(0.7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')\n", - "else:\n", - " print('tails')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step\n", - "\n", - "Now let's get back to the bikeshare state. Again let's start with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def step():\n", - " if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since this function takes no parameters, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "step()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parameters\n", - "\n", - "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", - "\n", - "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "step(0.5, 0.4)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## For loop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we go on, I'll redefine `step` without the print statements." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's start again with a new `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use a `for` loop to move 4 bikes from Olin to Wellesley." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " bike_to_wellesley()\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can simulate 4 random time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " step(0.3, 0.2)\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If each step corresponds to a minute, we can simulate an entire hour like this." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(60):\n", - " step(0.3, 0.2)\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", - "\n", - "But first, we want to plot the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TimeSeries\n", - "\n", - "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", - "\n", - "We can create a new, empty `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can add a value to the `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "results[0] = bikeshare.olin\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", - "\n", - "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a for loop that runs 10 steps and stores the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(10):\n", - " step(0.3, 0.2)\n", - " results[i] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can display the results." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "results.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "results.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "We can also plot the results like this." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", - "\n", - "It should:\n", - "\n", - "1. Create a `TimeSeries` object to hold the results.\n", - "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", - "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", - "4. After the for loop, it should plot the results and\n", - "5. Decorate the axes.\n", - "\n", - "To test your function:\n", - "\n", - "1. Create a `State` object with the initial state of the system.\n", - "2. Call `run_simulation` with appropriate parameters.\n", - "3. Save the resulting figure.\n", - "\n", - "Optional:\n", - "\n", - "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Opening the hood\n", - "\n", - "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", - "\n", - "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", - "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pandas\n", - "\n", - "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", - "\n", - "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", - "\n", - "The primary differences between `TimeSeries` and `Series` are:\n", - "\n", - "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", - "\n", - "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", - "\n", - "3. I provide a function called `set` that we'll use later.\n", - "\n", - "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pyplot\n", - "\n", - "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", - "\n", - "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### NumPy\n", - "\n", - "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", - "\n", - "You can get the source code for `flip` by running the following cell." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(flip)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap03.ipynb b/colab/chap03.ipynb deleted file mode 100644 index 9aae1691..00000000 --- a/colab/chap03.ipynb +++ /dev/null @@ -1,606 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 3" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More than one State object\n", - "\n", - "Here's the code from the previous chapter, with two changes:\n", - "\n", - "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", - "\n", - "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(state, p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " state: State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " results = TimeSeries() \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " results[i] = state.olin\n", - " \n", - " plot(results, label='Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can create more than one `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1 = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2 = State(olin=2, wellesley=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whenever we call a function, we indicate which `State` object to work with:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_olin(bikeshare1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley(bikeshare2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can confirm that the different objects are getting updated independently:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Negative bikes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", - "\n", - "If you run this simulation a few times, it happens often." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if you run the simulation again, it should behave." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparison operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", - "\n", - "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", - "\n", - "Remember that `=` creates a variable or gives an existing variable a new value." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "x = 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whereas `==` compares two values and returns `True` if they are equal." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "x == 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can use `==` in an `if` statement." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if x == 5:\n", - " print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you use `=` in an `if` statement, you get an error." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# If you remove the # from the if statement and run it, you'll get\n", - "# SyntaxError: invalid syntax\n", - "\n", - "#if x = 5:\n", - "# print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", - "\n", - "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now when we run a simulation, it keeps track of unhappy customers." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can print the number of unhappy customers at each location." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin_empty" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", - "\n", - "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", - "\n", - "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", - "\n", - "Test your code by running the simulation and check the value of `clock` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0,\n", - " clock=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", - "\n", - "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", - "\n", - "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", - "\n", - "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap04.ipynb b/colab/chap04.ipynb deleted file mode 100644 index 5a790b56..00000000 --- a/colab/chap04.ipynb +++ /dev/null @@ -1,681 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 4" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Returning values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a simple function that returns a value:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def add_five(x):\n", - " return x + 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "y = add_five(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you run a function on the last line of a cell, Jupyter displays the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", - "\n", - "In the following example, Jupyter shows the second result, but the first result just disappears." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(3)\n", - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "y1 = add_five(3)\n", - "y2 = add_five(5)\n", - "\n", - "print(y1, y2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", - "\n", - "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running simulations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the code from the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " state = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` doesn't plot anything:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.4, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But after the simulation, we can read the metrics from the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.2, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When `p1` is large, we probably do." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.6, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More for loops" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` creates a NumPy array of equally spaced numbers." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "p1_array = linspace(0, 1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an array in a `for` loop, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " print(p1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will come in handy in the next section.\n", - "\n", - "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "help(linspace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** \n", - "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "help(linrange)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sweeping parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`p1_array` contains a range of values for `p1`." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "p2 = 0.2\n", - "num_steps = 60\n", - "p1_array = linspace(0, 1, 11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " print(p1, state.olin_empty)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "\n", - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", - "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional Exercises\n", - "\n", - "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", - "\n", - "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", - "\n", - "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", - "`num_runs` specifies how many times it should call `run_simulation`.\n", - "\n", - "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", - "\n", - "Test your function with parameters\n", - "\n", - "```\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "```\n", - "\n", - "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", - "\n", - "```\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "```\n", - "\n", - "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", - "\n", - "What value of `p1` minimizes the average number of unhappy customers?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap05.ipynb b/colab/chap05.ipynb deleted file mode 100644 index 2dca482e..00000000 --- a/colab/chap05.ipynb +++ /dev/null @@ -1,617 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 5" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reading data\n", - "\n", - "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n", - "\n", - "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", - "\n", - "`head` selects the header and the first five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2 = tables[2]\n", - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`tail` selects the last five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "table2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Long column names are awkard to work with, but we can replace them with abbreviated names." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the DataFrame looks like now. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", - "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", - "\n", - "`NaN` is a special value that indicates missing data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Series\n", - "\n", - "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "census.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", - "\n", - "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From here on, we will work in units of billions." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what these estimates look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year',\n", - " ylabel='World population (billion)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", - "\n", - "So the largest relative error between the estimates is about 1.3%." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "max(abs(census - un) / un) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", - "\n", - "1. Compute the elementwise differences, `census - un`\n", - "2. Compute the absolute differences, `abs(census - un)`\n", - "3. Compute the relative differences, `abs(census - un) / un`\n", - "4. Compute the percent differences, `abs(census - un) / un * 100`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Constant growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select a value from a `Series` using bracket notation. Here's the first element:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "census[1950]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the last value." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "census[2016]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = get_last_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "elapsed_time = t_end - t_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can get the first and last values:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "p_end = get_last_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can compute the average annual growth in billions of people per year." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "total_growth = p_end - p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TimeSeries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's create a `TimeSeries` to contain values generated by a linear growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "results[t_0] = census[t_0]\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After that, the population in the model grows by a constant amount each year." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "for t in linrange(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results looks like, compared to the actual data." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well after 1990, but not so well before." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", - "\n", - "Hint: \n", - "\n", - "1. Copy the code from above and make a few changes. Test your code after each small change.\n", - "\n", - "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", - "\n", - "3. You might want to add a constant to the starting value to match the data better." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "census.loc[1960:1970]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap06.ipynb b/colab/chap06.ipynb deleted file mode 100644 index 6d32eff3..00000000 --- a/colab/chap06.ipynb +++ /dev/null @@ -1,560 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 6" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = get_first_value(census)\n", - "p_end = get_last_value(census)\n", - "total_growth = p_end - p_0\n", - "\n", - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### System objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can rewrite the code from the previous chapter using system objects." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " annual_growth=annual_growth)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can encapsulate the code that runs the model in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation1(system):\n", - " \"\"\"Runs the constant growth model.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = results[t] + system.annual_growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also encapsulate the code that plots the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation1(system)\n", - "plot_results(census, un, results, 'Constant growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Proportional growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a more realistic model where the number of births and deaths is proportional to the current population." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation2(system):\n", - " \"\"\"Run a model with proportional birth and death.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " births = system.birth_rate * results[t]\n", - " deaths = system.death_rate * results[t]\n", - " results[t+1] = results[t] + births - deaths\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "system.death_rate = 0.01\n", - "system.birth_rate = 0.027" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation2(system)\n", - "plot_results(census, un, results, 'Proportional model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well for the first 20 years, but not so well after that." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Factoring out the update function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func1(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " births = system.birth_rate * pop\n", - " deaths = system.death_rate * pop\n", - " return pop + births - deaths" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The name `update_func` refers to a function object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "update_func1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which we can confirm by checking its type." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "type(update_func1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation` takes the update function as a parameter and calls it just like any other function." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " birth_rate=0.027,\n", - " death_rate=0.01)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func1)\n", - "plot_results(census, un, results, 'Proportional model, factored')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Remember not to put parentheses after `update_func1`. What happens if you try?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining birth and death" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func2(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = system.birth_rate - system.death_rate\n", - "\n", - "results = run_simulation(system, update_func2)\n", - "plot_results(census, un, results, 'Proportional model, combined birth and death')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", - "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", - "\n", - "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap07.ipynb b/colab/chap07.ipynb deleted file mode 100644 index e8ed937c..00000000 --- a/colab/chap07.ipynb +++ /dev/null @@ -1,547 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 7" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Quadratic growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the implementation of the quadratic growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Compute the population next year with a quadratic model.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `System` object with the parameters `alpha` and `beta`:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Can you find values for the parameters that make the model fit better?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Equilibrium\n", - "\n", - "To understand the quadratic model better, let's plot net growth as a function of population." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "pop_array = linspace(0, 15, 100)\n", - "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid')\n", - "\n", - "plot(pop_array, net_growth_array)\n", - "decorate(xlabel='Population (billions)',\n", - " ylabel='Net growth (billions)')\n", - "\n", - "sns.set_style('white')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like. Remember that the x axis is population now, not time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", - "\n", - "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the equilibrium the population tends toward." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dysfunctions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", - "\n", - "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see all the ways that can go wrong.\n", - "\n", - "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity():\n", - " K = -sys1.alpha / sys1.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity()\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", - "\n", - "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " system = System(alpha=0.025, beta=-0.0018)\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", - "\n", - "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", - "\n", - "\n", - "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", - "\n", - "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys2 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys2)\n", - "\n", - "# print(K) This line won't work because K only exists inside the function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", - "\n", - "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", - "\n", - "For example, you could eliminate the temporary variable `pop` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "print(carrying_capacity(sys1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or if you had more than one system, you could compute the total carrying capacity like this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", - "\n", - "$ \\Delta p = r p (1 - p / K) $\n", - "\n", - "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap08.ipynb b/colab/chap08.ipynb deleted file mode 100644 index a77508ed..00000000 --- a/colab/chap08.ipynb +++ /dev/null @@ -1,609 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 8" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Functions from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates2.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "table2 = pd.read_csv('World_population_estimates2.csv')\n", - "table2.index = table2.Year\n", - "table2.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Estimated world population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Running the quadratic model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Update population based on a quadratic model.\n", - " \n", - " pop: current population in billions\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the starting time and population." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the system object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model and plot results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To generate projections, all we have to do is change `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "system.t_end = 2250\n", - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'World population projection')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The population in the model converges on the equilibrium population, `-alpha/beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results[system.t_end]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare the projection from our model with projections produced by people who know what they are doing." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates3.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates3.csv\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table3(filename = 'data/World_population_estimates.html'):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table3 = tables[3]\n", - " table3.columns = ['census', 'prb', 'un']\n", - " return table3" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "#table3 = read_table3()\n", - "#table3.to_csv('data/World_population_estimates3.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "table3 = pd.read_csv('World_population_estimates3.csv')\n", - "table3.index = table3.Year\n", - "table3.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projections(table):\n", - " \"\"\"Plot world population projections.\n", - " \n", - " table: DataFrame with columns 'un' and 'census'\n", - " \"\"\"\n", - " census_proj = table.census / 1e9\n", - " un_proj = table.un / 1e9\n", - " \n", - " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", - " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model until 2100, which is as far as the other projections go." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=2100,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "\n", - "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", - "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "People who know what they are doing expect the growth rate to decline more sharply than our model projects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", - "\n", - "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", - "\n", - "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "alpha_census = compute_rel_diff(census)\n", - "plot(alpha_census, label='US Census')\n", - "\n", - "alpha_un = compute_rel_diff(un)\n", - "plot(alpha_un, label='UN DESA')\n", - "\n", - "decorate(xlabel='Year', label='Net growth rate')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", - "\n", - "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", - "\n", - "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", - "\n", - "3. Create a `System` object that includes `alpha_func` as a system variable.\n", - "\n", - "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", - "\n", - "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", - "\n", - "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", - "\n", - "7. Compare your projections with those from the US Census and UN." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap09.ipynb b/colab/chap09.ipynb deleted file mode 100644 index 9e3b0cd5..00000000 --- a/colab/chap09.ipynb +++ /dev/null @@ -1,657 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 9" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following displays SymPy expressions and provides the option of showing results in LaTeX format." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy.printing import latex\n", - "\n", - "def show(expr, show_latex=False):\n", - " \"\"\"Display a SymPy expression.\n", - " \n", - " expr: SymPy expression\n", - " show_latex: boolean\n", - " \"\"\"\n", - " if show_latex:\n", - " print(latex(expr))\n", - " return expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis with SymPy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a symbol for time." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import sympy as sp\n", - "\n", - "t = sp.symbols('t')\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you combine symbols and numbers, you get symbolic expressions." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "expr = t + 1\n", - "expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `Add` object, which just represents the sum without trying to compute it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "type(expr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`f` is a special class of symbol that represents a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "f = sp.Function('f')\n", - "f" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The type of `f` is `UndefinedFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "type(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`diff` returns a `Derivative` object that represents the time derivative of `f`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dfdt = sp.diff(f(t), t)\n", - "dfdt" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "type(dfdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a symbol for `alpha`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "alpha = sp.symbols('alpha')\n", - "alpha" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation for proportional growth." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "eq1 = sp.Eq(dfdt, alpha*f(t))\n", - "eq1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And use `dsolve` to solve it. The result is the general solution." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = sp.dsolve(eq1)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", - "\n", - "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "C1, p_0 = sp.symbols('C1 p_0')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "particular = solution_eq.subs(C1, p_0)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next example, we have to work a little harder to find the particular solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the quadratic growth equation \n", - "\n", - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r, K = sp.symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "eq2 = sp.Eq(sp.diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", - "eq2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = sp.dsolve(eq2)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "at_0 = general.subs(t, 0)\n", - "at_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", - "\n", - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "solutions = sp.solve(sp.Eq(at_0, p_0), C1)\n", - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "particular = general.subs(C1, value_of_C1)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a method that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "particular = sp.simplify(particular)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", - "\n", - "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "particular.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", - "\n", - "In some places you'll see it written in a different form:\n", - "\n", - "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", - "\n", - "where $A = (K - p_0) / p_0$.\n", - "\n", - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "A = (K - p_0) / p_0\n", - "A" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "logistic = K / (1 + A * sp.exp(-r*t))\n", - "logistic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "sp.simplify(particular - logistic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap10.ipynb b/colab/chap10.ipynb deleted file mode 100644 index f2e903ab..00000000 --- a/colab/chap10.ipynb +++ /dev/null @@ -1,474 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 10" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", - "\n", - "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - "table2.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `columns`, which labels the columns." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `values`, which is an array of values." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table2.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Series` does not have `columns`, but it does have `name`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "census.name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It contains `values`, which is an array." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "census.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And it contains `index`:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "census.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", - "\n", - "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", - "\n", - "`ndarray` is defined by NumPy." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.values)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "type(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "type(census.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "type(census.values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional exercise\n", - "\n", - "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", - "\n", - "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Select `tables[1]`, which is the second table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "table1 = tables[1]\n", - "table1.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "table1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Again, we'll replace the long column names with more convenient abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", - " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "for col in table1.columns:\n", - " table1[col] = pd.to_numeric(table1[col], errors='coerce')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results. Notice that we are working in millions now, not billions." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[-10000, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='Prehistoric population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `xlim` to zoom in on everything after Year 0." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap11.ipynb b/colab/chap11.ipynb deleted file mode 100644 index 887d7df7..00000000 --- a/colab/chap11.ipynb +++ /dev/null @@ -1,476 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 11" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SIR implementation\n", - "\n", - "We'll use a `State` object to represent the number (or fraction) of people in each compartment." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "init = State(S=89, I=1, R=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To convert from number of people to fractions, we divide through by the total." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "init /= sum(init)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates a `System` object with the given parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example with hypothetical values for `beta` and `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function takes the state during the current time step and returns the state during the next time step." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run a single time step, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "state = update_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run a simulation by calling the update function for each time step." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: State object for final state\n", - " \"\"\"\n", - " state = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the state of the system at `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", - "\n", - "Hint: what is the change in `S` between the beginning and the end of the simulation?" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using TimeSeries objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add three Series objects to the System: S, I, R\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " S = TimeSeries()\n", - " I = TimeSeries()\n", - " R = TimeSeries()\n", - "\n", - " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " S[t+1], I[t+1], R[t+1] = state\n", - " \n", - " return S, I, R" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what they look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(S, I, R)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a DataFrame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", - "\n", - "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it, and what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)\n", - "results.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can extract the results and plot them." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap12.ipynb b/colab/chap12.ipynb deleted file mode 100644 index ef6f4478..00000000 --- a/colab/chap12.ipynb +++ /dev/null @@ -1,887 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 12" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code\n", - "\n", - "Here's the code from the previous notebook that we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example.|" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beta = 0.333\n", - "gamma = 0.25\n", - "system = make_system(beta, gamma)\n", - "\n", - "results = run_simulation(system, update_func)\n", - "print(beta, gamma, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", - "\n", - "1. The fraction of students who are sick at the peak of the outbreak.\n", - "\n", - "2. The day the outbreak peaks.\n", - "\n", - "3. The fraction of students who are sick at the end of the semester.\n", - "\n", - "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", - "\n", - "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", - "\n", - " I.max()\n", - "\n", - "And the index of the largest value like this:\n", - "\n", - " I.idxmax()\n", - "\n", - "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What if?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def add_immunization(system, fraction):\n", - " \"\"\"Immunize a fraction of the population.\n", - " \n", - " Moves the given fraction from S to R.\n", - " \n", - " system: System object\n", - " fraction: number from 0 to 1\n", - " \"\"\"\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start again with the system we used in the previous sections." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run the model without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func)\n", - "calc_total_infected(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now with 10% immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", - "results2 = run_simulation(system2, update_func)\n", - "calc_total_infected(results2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "10% immunization leads to a drop in infections of 16 percentage points.\n", - "\n", - "Here's what the time series looks like for S, with and without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.S, '-', label='No immunization')\n", - "plot(results2.S, '--', label='10% immunization')\n", - "\n", - "decorate(xlabel='Time (days)',\n", - " ylabel='Fraction susceptible')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep through a range of values for the fraction of the population who are immunized." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 11)\n", - "for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " print(fraction, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function does the same thing and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_immunity(immunize_array):\n", - " \"\"\"Sweeps a range of values for immunity.\n", - " \n", - " immunize_array: array of fraction immunized\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " sweep[fraction] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Fraction immunized',\n", - " ylabel='Total fraction infected',\n", - " title='Fraction infected vs. immunization rate',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If 40% of the population is immunized, less than 4% of the population gets sick." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Logistic function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", - "\n", - "`M` is chosen so the transition happens around \\$500.\n", - "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", - "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "plot(spending, percent_reduction)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hand washing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can model the effect of a hand-washing campaign by modifying `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " \"\"\"Modifies system to model the effect of hand washing.\n", - " \n", - " system: System object\n", - " spending: campaign spending in USD\n", - " \"\"\"\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start with the same values of `beta` and `gamma` we've been using." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "beta, gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep different levels of campaign spending." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 13)\n", - "\n", - "for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " print(spending, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " \"\"\"Run simulations with a range of spending.\n", - " \n", - " spending_array: array of dollars from 0 to 1200\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's put it all together to make some public health spending decisions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)\n", - "dose_array = linrange(max_doses, endpoint=True)\n", - "max_doses" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", - "\n", - "For each scenario, we compute the fraction of students who get sick." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " print(doses, system.init.S, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function wraps that loop and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " \"\"\"Runs simulations with different doses and campaign spending.\n", - " \n", - " dose_array: range of values for number of vaccinations\n", - " \n", - " return: Sweep object with total number of infections \n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compute the number of infected students for each possible allocation of the budget." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_doses(dose_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap13.ipynb b/colab/chap13.ipynb deleted file mode 100644 index bff8f833..00000000 --- a/colab/chap13.ipynb +++ /dev/null @@ -1,526 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 13" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " beta, gamma = system.beta, system.gamma\n", - " s, i, r = state\n", - "\n", - " infected = beta * i * s \n", - " recovered = gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a range of values for `beta`, with constant `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma = 0.2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the simulation once for each value of `beta` and print total infections." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wrap that loop in a function and return a `SweepSeries` object." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "label = 'gamma = ' + str(gamma)\n", - "plot(infected_sweep, label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the same array of values for `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now an array of values for `gamma`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "gamma_array = [0.2, 0.4, 0.6, 0.8]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each value of `gamma`, sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "for gamma in gamma_array:\n", - " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(infected_sweep, label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " loc='upper left')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SweepFrame\n", - "\n", - "The following sweeps two parameters and stores the results in a `SweepFrame`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the `SweepFrame` look like." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in gamma_array:\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(frame[gamma], label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " title='',\n", - " loc='upper left')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also plot one line for each value of `beta`, although there are a lot of them." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "\n", - "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", - " label = 'beta = ' + str(beta)\n", - " plot(frame.row[beta], label=label)\n", - " \n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", - "\n", - "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "contour(frame)\n", - "\n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap13ode.ipynb b/colab/chap13ode.ipynb deleted file mode 100644 index c376d88b..00000000 --- a/colab/chap13ode.ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 13" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a slope function for the SIR model and test it with `run_ode_solver`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(0.333, 0.25)\n", - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, max_step=3)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap14.ipynb b/colab/chap14.ipynb deleted file mode 100644 index c8522091..00000000 --- a/colab/chap14.ipynb +++ /dev/null @@ -1,487 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 14" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Contact number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "frame.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_sweep_frame(frame):\n", - " \"\"\"Plot the values from a SweepFrame.\n", - " \n", - " For each (beta, gamma), compute the contact number,\n", - " beta/gamma\n", - " \n", - " frame: SweepFrame with one row per beta, one column per gamma\n", - " \"\"\"\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta/gamma, frac_infected, 'ro')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "\n", - "decorate(xlabel='Contact number (beta/gamma)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", - "\n", - "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "s_inf_array = linspace(0.0001, 0.9999, 101);" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "c_array = log(s_inf_array) / (s_inf_array - 1);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`total_infected` is the change in $s$ from the beginning to the end." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "frac_infected = 1 - s_inf_array\n", - "frac_infected_series = Series(frac_infected, index=c_array);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot the analytic results and compare them to the simulations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "plot(frac_infected_series, label='Analysis')\n", - "\n", - "decorate(xlabel='Contact number (c)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The agreement is generally good, except for values of `c` less than 1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", - "\n", - "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", - "\n", - "What do the results look like, and what does that imply? " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", - "\n", - "What is your best estimate of `c`?\n", - "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap15.ipynb b/colab/chap15.ipynb deleted file mode 100644 index 66c8b36a..00000000 --- a/colab/chap15.ipynb +++ /dev/null @@ -1,332 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 15" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The coffee cooling problem\n", - "\n", - "I'll use a `State` object to store the initial temperature.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "init = State(T=90)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a `System` object to contain the system parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = System(init=init,\n", - " volume=300,\n", - " r=0.01,\n", - " T_env=22,\n", - " t_0=0,\n", - " t_end=30,\n", - " dt=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function implements Newton's law of cooling." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "update_func(init, 0, coffee)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `run_simulation` that uses `linrange` to make an array of time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(coffee, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.T, label='coffee')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the final temperature:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "coffee.T_final = get_last_value(results.T)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Encapsulation\n", - "\n", - "Before we go on, let's define a function to initialize `System` objects with relevant parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=0.01, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", - "\n", - "By trial and error, find a value for `r` that makes the final temperature close to 20 C." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.T, label='milk')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap16.ipynb b/colab/chap16.ipynb deleted file mode 100644 index 163d9611..00000000 --- a/colab/chap16.ipynb +++ /dev/null @@ -1,854 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 16" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code from previous notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using `root_bisect`\n", - "\n", - "As a simple example, let's find the roots of this function; that is, the values of `x` that make the result 0." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def func(x):\n", - " return (x-1) * (x-2) * (x-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `root_bisect`, which searches for a root by bisection. The first argument is the function whose roots we want. The second argument is an interval that contains a root." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [0.5, 1.5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an object that contains the root that was found and other information." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we provide a different interval, we find a different root." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [1.5, 2.5])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the interval doesn't contain a root, the results explain the error." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [4, 5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to find the value of `r` that makes the final temperature 70, so we define an \"error function\" that takes `r` as a parameter and returns the difference between the final temperature and the goal." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(r):\n", - " \"\"\"Runs a simulation and returns the `error`.\n", - " \n", - " r: heat transfer rate, in 1/min\n", - " \n", - " returns: difference between final temp and 70 C\n", - " \"\"\"\n", - " system = make_system(T_init=90, r=r, volume=300, t_end=30)\n", - " results = run_simulation(system, update_func)\n", - " T_final = get_last_value(results.T)\n", - " return T_final - 70" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.01`, we end up a little too warm." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "error_func1(r=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.02`, we end up too cold." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "error_func1(r=0.02)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `root_bisect` is an array with a single element, the estimated value of `r`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(error_func1, [0.01, 0.02])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "r_coffee = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we run the simulation with the estimated value of `r`, the final temperature is 70 C, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you call `root_bisect`, it calls `error_func1` several times. To see how this works, add a print statement to `error_func1` and run `root_bisect` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Repeat this process to estimate `r_milk`, given that it starts at 5 C and reaches 20 C after 15 minutes. \n", - "\n", - "Before you use `root_bisect`, you might want to try a few values for `r_milk` and see how close you can get by trial and error. Here's an initial guess to get you started:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r_milk = 0.1\n", - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=15)\n", - "results = run_simulation(milk, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mixing liquids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `System` objects that represent two liquids, computes the temperature of the mixture, and returns a new `System` object that represents the mixture." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def mix(system1, system2):\n", - " \"\"\"Simulates the mixture of two liquids.\n", - " \n", - " system1: System representing coffee\n", - " system2: System representing milk\n", - " \n", - " returns: System representing the mixture\n", - " \"\"\"\n", - " assert system1.t_end == system2.t_end\n", - " \n", - " V1, V2 = system1.volume, system2.volume\n", - " T1, T2 = system1.temp, system2.temp\n", - " \n", - " V_mix = V1 + V2\n", - " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", - " \n", - " return make_system(T_init=T_mix,\n", - " r=system1.r,\n", - " volume=V_mix,\n", - " t_end=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`mix` requires the `System` objects to have `temp` as a system variable. `make_system` initializes this variable;\n", - "the following function makes sure it gets updated when we run a simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_set(system):\n", - " \"\"\"Run a simulation and set the final temperature.\n", - " \n", - " system: System\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " results = run_simulation(system, update_func)\n", - " system.temp = get_last_value(results.T)\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing immediately\n", - "\n", - "Next here's what we get if we add the milk immediately." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=30)\n", - "milk.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "mix_first = mix(coffee, milk)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "mix_results = run_and_set(mix_first)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing at the end\n", - "\n", - "First we'll see what happens if we add the milk at the end. We'll simulate the coffee and the milk separately." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "coffee_results = run_and_set(coffee)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "milk_results = run_and_set(milk)\n", - "milk.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "plot(coffee_results.T, label='coffee')\n", - "plot(milk_results.T, '--', label='milk')\n", - "\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)',\n", - " loc='center left')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what happens when we mix them." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "mix_last = mix(coffee, milk)\n", - "mix_last.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "mix_last.temp - mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `t_add`, which is the time when the milk is added, and returns the final temperature." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_mix(t_add, t_total):\n", - " \"\"\"Simulates two liquids and them mixes them at t_add.\n", - " \n", - " t_add: time in minutes\n", - " t_total: total time to simulate, min\n", - " \n", - " returns: final temperature\n", - " \"\"\"\n", - " coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=t_add)\n", - " coffee_results = run_and_set(coffee)\n", - " \n", - " milk = make_system(T_init=5, r=r_milk, volume=50, t_end=t_add)\n", - " milk_results = run_and_set(milk)\n", - " \n", - " mixture = mix(coffee, milk)\n", - " mixture.t_end = t_total - t_add\n", - " results = run_and_set(mixture)\n", - "\n", - " return mixture.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can try it out with a few values." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=0, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=15, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=30, t_total=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then sweep a range of values for `t_add`" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "for t_add in linspace(0, 30, 11):\n", - " sweep[t_add] = run_and_mix(t_add, 30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, label='final temp', color='C2')\n", - "decorate(xlabel='Time added (min)',\n", - " ylabel='Final temperature (C)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the analytic result to compute temperature as a function of time. The following function is similar to `run_simulation`." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "def run_analysis(system):\n", - " \"\"\"Computes temperature using the analytic solution.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " T_env, r = system.T_env, system.r\n", - " \n", - " T_init = system.init.T \n", - " ts = linspace(0, system.t_end)\n", - " \n", - " T_array = T_env + (T_init - T_env) * exp(-r * ts)\n", - " \n", - " # to be consistent with run_simulation,\n", - " # we put the array into a TimeFrame\n", - " return TimeFrame(T_array, index=ts, columns=['T'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it. From the analysis (see `chap16sympy.ipynb`), we have the computed value of `r_coffee2`" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "r_coffee2 = 0.011610223142273859\n", - "coffee2 = make_system(T_init=90, r=r_coffee2, volume=300, t_end=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_analysis(coffee2)\n", - "T_final_analysis = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can compare to the results from simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final_simulation = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "They are identical except for a small roundoff error." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "T_final_analysis - T_final_simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap17.ipynb b/colab/chap17.ipynb deleted file mode 100644 index 4e65e064..00000000 --- a/colab/chap17.ipynb +++ /dev/null @@ -1,299 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 17" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data\n", - "\n", - "We have data from Pacini and Bergman (1986), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122.." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv(filename, index_col='time')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the glucose time series looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the insulin time series." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the book, I put them in a single figure, using `subplot`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interpolation\n", - "\n", - "We have measurements of insulin concentration at discrete points in time, but we need to estimate it at intervening points. We'll use `interpolate`, which takes a `Series` and returns a function:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `interpolate` is a function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the result, `I`, to estimate the insulin level at any point in time." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "I(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`I` can also take an array of time and return an array of estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)\n", - "ts = linrange(t_0, t_end, endpoint=True)\n", - "I(ts)\n", - "type(ts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the interpolated values look like." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.insulin, 'go', label='insulin data')\n", - "plot(ts, I(ts), color='green', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** [Read the documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html) of `scipy.interpolate.interp1d`. Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(interpolate)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap18.ipynb b/colab/chap18.ipynb deleted file mode 100644 index 089fb4b3..00000000 --- a/colab/chap18.ipynb +++ /dev/null @@ -1,559 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 18" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'glucose_insulin.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/glucose_insulin.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv(filename, index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The glucose minimal model\n", - "\n", - "I'll cheat by starting with parameters that fit the data roughly; then we'll see how to improve them." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(G0 = 290,\n", - " k1 = 0.03,\n", - " k2 = 0.02,\n", - " k3 = 1e-05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `make_system` that takes the parameters and data:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object with the given parameters.\n", - " \n", - " params: sequence of G0, k1, k2, k3\n", - " data: DataFrame with `glucose` and `insulin`\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " G0, k1, k2, k3 = params\n", - " \n", - " Gb = data.glucose[0]\n", - " Ib = data.insulin[0]\n", - " I = interpolate(data.insulin)\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " init = State(G=G0, X=0)\n", - " \n", - " return System(params,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the update function." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Updates the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " dt = system.dt\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " G += dGdt * dt\n", - " X += dXdt * dt\n", - "\n", - " return State(G=G, X=X)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before running the simulation, it is always a good idea to test the update function using the initial conditions. In this case we can veryify that the results are at least qualitatively correct." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "update_func(system.init, system.t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` is pretty much the same as it always is." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are in a `TimeFrame` object with one column per state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following plot shows the results of the simulation along with the actual glucose data." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "\n", - "plot(results.G, 'b-', label='simulation')\n", - "plot(data.glucose, 'bo', label='glucose data')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "\n", - "plot(results.X, 'C1', label='remote insulin')\n", - "\n", - "decorate(xlabel='Time (min)', \n", - " ylabel='Concentration (arbitrary units)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Numerical solution\n", - "\n", - "Now let's solve the differential equation numerically using `run_ode_solver`, which is an implementation of Ralston's method.\n", - "\n", - "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations.\n", - "\n", - "We don't have to do the update part; the solver does it for us." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: derivatives of G and X\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run the ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details = run_ode_solver(system, slope_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`details` is a `ModSimSeries` object with information about how the solver worked." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.G, 'C0', label='run_simulation')\n", - "plot(results2.G, 'C2--', label='run_ode_solver')\n", - "\n", - "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The differences in `G` are less than 2%." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "percent_diff" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "max(abs(percent_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", - "\n", - "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Here's the source code for `run_ode_solver` if you'd like to know how it works.\n", - "\n", - "Notice that `run_ode_solver` is another name for `run_ralston`, which implements [Ralston's method](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(run_ode_solver)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap20.ipynb b/colab/chap20.ipynb deleted file mode 100644 index f1968b01..00000000 --- a/colab/chap20.ipynb +++ /dev/null @@ -1,656 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 20" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dropping pennies\n", - "\n", - "I'll start by getting the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And defining the initial state." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "init = State(y=381 * m, \n", - " v=0 * m/s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Acceleration due to gravity is about 9.8 m / s$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "g = 9.8 * m/s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start with a duration of 10 seconds and step size 0.1 second." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10 * s" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "dt = 0.1 * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(init=init, g=g, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And define the slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `g`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " g = system.g \n", - "\n", - " dydt = v\n", - " dvdt = -g\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's always a good idea to test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "dydt, dvdt = slope_func(system.init, 0, system)\n", - "print(dydt)\n", - "print(dvdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's position as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_position(results):\n", - " plot(results.y, label='y')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "plot_position(results)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Onto the sidewalk\n", - "\n", - "To figure out when the penny hit the sidewalk, we can use `crossings`, which finds the times where a `Series` passes through a given value." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this example there should be just one crossing, the time when the penny hits the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = t_crossings[0] * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare that to the exact result. Without air resistance, we have\n", - "\n", - "$v = -g t$\n", - "\n", - "and\n", - "\n", - "$y = 381 - g t^2 / 2$\n", - "\n", - "Setting $y=0$ and solving for $t$ yields\n", - "\n", - "$t = \\sqrt{\\frac{2 y_{init}}{g}}$" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "sqrt(2 * init.y / g)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The estimate is accurate to about 9 decimal places." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Events\n", - "\n", - "Instead of running the simulation until the penny goes through the sidewalk, it would be better to detect the point where the penny hits the sidewalk and stop. `run_ode_solver` provides exactly the tool we need, **event functions**.\n", - "\n", - "Here's an event function that returns the height of the penny above the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we pass it to `run_ode_solver`. The solver should run until the event function returns 0, and then terminate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The message from the solver indicates the solver stopped because the event we wanted to detect happened.\n", - "\n", - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the `events` option, the solver returns the actual time steps it computed, which are not necessarily equally spaced. \n", - "\n", - "The last time step is when the event occurred:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is accurate to about 4 decimal places.\n", - "\n", - "We can also check the velocity of the penny when it hits the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "v_sidewalk = get_last_value(results.v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And convert to kilometers per hour." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "km = UNITS.kilometer\n", - "h = UNITS.hour\n", - "v_sidewalk.to(km / h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "Here is the source code for `crossings` so you can see what's happening under the hood:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(crossings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", - "\n", - "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", - "\n", - "Use `run_ode_solver` to answer this question.\n", - "\n", - "Here are some suggestions about how to proceed:\n", - "\n", - "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", - "\n", - "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", - "\n", - "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", - "\n", - "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", - "\n", - "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap21.ipynb b/colab/chap21.ipynb deleted file mode 100644 index ae52a9b9..00000000 --- a/colab/chap21.ipynb +++ /dev/null @@ -1,527 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 21" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### With air resistance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we'll add air resistance using the [drag equation](https://en.wikipedia.org/wiki/Drag_equation)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start by getting the units we'll need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(height = 381 * m,\n", - " v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " mass = 2.5e-3 * kg,\n", - " diameter = 19e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 18 * m / s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " diameter, mass = params.diameter, params.mass\n", - " g, rho = params.g, params.rho, \n", - " v_init, v_term = params.v_init, params.v_term\n", - " height = params.height\n", - " \n", - " area = np.pi * (diameter/2)**2\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " init = State(y=height, v=v_init)\n", - " t_end = 30 * s\n", - " dt = t_end / 100\n", - " \n", - " return System(params, area=area, C_d=C_d, \n", - " init=init, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function, including acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " rho, C_d, g = system.rho, system.C_d, system.g\n", - " area, mass = system.area, system.mass\n", - " \n", - " f_drag = rho * v**2 * C_d * area / 2\n", - " a_drag = f_drag / mass\n", - " \n", - " dydt = v\n", - " dvdt = -g + a_drag\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the same event function as in the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final height is close to 0, as expected.\n", - "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", - "\n", - "We can get the flight time from `results`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_position(results):\n", - " plot(results.y)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. Hint: You can create a new `Params` object based on an existing one, like this:\n", - "\n", - "`params2 = Params(params, v_init=-30 * m/s)`\n", - "\n", - "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "plot_position(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate the terminal velocity.\n", - "\n", - "1. You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", - "\n", - "2. Create a `Params` object with the system parameters. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", - "\n", - "3. Use `make_system` to create a `System` object.\n", - "\n", - "4. Call `run_ode_solver` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", - "\n", - "5. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", - "\n", - "6. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", - "\n", - "7. Use your best estimate of `v_term` to compute `C_d`.\n", - "\n", - "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap22.ipynb b/colab/chap22.ipynb deleted file mode 100644 index 10bc4bcf..00000000 --- a/colab/chap22.ipynb +++ /dev/null @@ -1,1264 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 22" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Vector` object represents a vector quantity. In the context of mechanics, vector quantities include position, velocity, acceleration, and force, all of which might be in 2D or 3D.\n", - "\n", - "You can define a `Vector` object without units, but if it represents a physical quantity, you will often want to attach units to it.\n", - "\n", - "I'll start by grabbing the units we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a two dimensional `Vector` in meters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "A = Vector(3, 4) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the elements by name." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "A.x" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "A.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The magnitude is the length of the vector." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The angle is the number of radians between the vector and the positive x axis." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we make another `Vector` with the same units," - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "B = Vector(1, 2) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can add `Vector` objects like this" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "A + B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And subtract like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "A - B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compute the Euclidean distance between two Vectors." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "A.dist(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the difference in angle" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "A.diff_angle(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we are given the magnitude and angle of a vector, what we have is the representation of the vector in polar coordinates." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "mag = A.mag\n", - "angle = A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `pol2cart` to convert from polar to Cartesian coordinates, and then use the Cartesian coordinates to make a `Vector` object.\n", - "\n", - "In this example, the `Vector` we get should have the same components as `A`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "x, y = pol2cart(angle, mag)\n", - "Vector(x, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to represent the direction of `A` is a unit vector, which is a vector with magnitude 1 that points in the same direction as `A`. You can compute a unit vector by dividing a vector by its magnitude:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "A / A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or by using the `hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "A.hat()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_grav` that represents acceleration due to gravity, with x component 0 and y component $-9.8$ meters / second$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Degrees and radians\n", - "\n", - "Pint provides units to represent degree and radians." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "degree = UNITS.degree\n", - "radian = UNITS.radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you have an angle in degrees," - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "angle = 45 * degree\n", - "angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can convert to radians." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad = angle.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If it's already in radians, `to` does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also convert from radians to degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad.to(degree)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As an alterative, you can use `np.deg2rad`, which works with Pint quantities, but it also works with simple numbers and NumPy arrays:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_force` that represents acceleration due to a force of 0.5 Newton applied to an object with mass 0.3 kilograms, in a direction 45 degrees up from the positive x-axis.\n", - "\n", - "Add `a_force` to `a_grav` from the previous exercise. If that addition succeeds, that means that the units are compatible. Confirm that the total acceleration seems to make sense." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Baseball" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `Params` object that contains parameters for the flight of a baseball." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.33,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the function that uses the `Params` object to make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that computes drag force using vectors:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "V_test = Vector(10, 10) * m/s\n", - "drag_force(V_test, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function that computes acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an event function to stop the simulation when the ball hits the ground:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final label tells us the flight time." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "flight_time = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `x` tells us the how far the ball landed from home plate:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "R_final = get_last_value(results.R)\n", - "x_dist = R_final.x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the results\n", - "\n", - "The simplest way to visualize the results is to plot x and y as functions of time." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "xs.plot()\n", - "ys.plot()\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the velocities the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "vx = results.V.extract('x')\n", - "vy = results.V.extract('y')\n", - "\n", - "vx.plot(label='vx')\n", - "vy.plot(label='vy')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The x velocity slows down due to drag.\n", - "\n", - "The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall.\n", - "\n", - "Another way to visualize the results is to plot y versus x. The result is the trajectory of the ball through its plane of motion." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_trajectory(results):\n", - " xs = results.R.extract('x')\n", - " ys = results.R.extract('y')\n", - " plot(xs, ys, color='C2', label='trajectory')\n", - "\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - "\n", - "plot_trajectory(results)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", - "\n", - "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", - "\n", - "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "def draw_func(state, t):\n", - " set_xlim(xs)\n", - " set_ylim(ys)\n", - " x, y = state.R\n", - " plot(x, y, 'bo')\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Delete the lines that set the x and y axes (or [comment them out](https://en.wiktionary.org/wiki/comment_out)) and see what the animation does." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "`Vector` is a function that returns a `ModSimVector` object." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "V = Vector(3, 4)\n", - "type(V)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `ModSimVector` is a specialized kind of Pint `Quantity`." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "isinstance(V, Quantity)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There's one gotcha you might run into with Vectors and Quantities. If you multiply a `ModSimVector` and a `Quantity`, you get a `ModSimVector`:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "V1 = V * m" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "type(V1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you multiply a `Quantity` and a `Vector`, you get a `Quantity`:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "V2 = m * V" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "type(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `ModSimVector` you can get the coordinates using dot notation, as well as `mag`, `mag2`, and `angle`:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "V1.x, V1.y, V1.mag, V1.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `Quantity`, you can't. But you can use indexing to get the coordinates:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "V2[0], V2[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can use vector functions to get the magnitude and angle." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "vector_mag(V2), vector_angle(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And often you can avoid the whole issue by doing the multiplication with the `ModSimVector` on the left." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system_no_drag = System(system, C_d=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system2 = System(system, rho=1.0*kg/m**3)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", - "\n", - "\n", - "\n", - "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'baseball_drag.csv'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/baseball_drag.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "baseball_drag = pd.read_csv(filename)\n", - "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n", - "mps = mph.to(m/s)\n", - "baseball_drag.index = magnitude(mps)\n", - "baseball_drag.index.name = 'Velocity in meters per second'\n", - "baseball_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results. Hint: use `interpolate`." - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [], - "source": [ - "C_d = drag_interp(43 * m / s)" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap23.ipynb b/colab/chap23.ipynb deleted file mode 100644 index 713d90ae..00000000 --- a/colab/chap23.ipynb +++ /dev/null @@ -1,584 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 23" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "degree = UNITS.degree" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 20 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.3,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end,\n", - " dt=dt)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `V`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimal launch angle\n", - "\n", - "To find the launch angle that maximizes distance from home plate, we need a function that takes launch angle and returns range." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def range_func(angle, params): \n", - " \"\"\"Computes range for a given launch angle.\n", - " \n", - " angle: launch angle in degrees\n", - " params: Params object\n", - " \n", - " returns: distance in meters\n", - " \"\"\"\n", - " params = Params(params, angle=angle)\n", - " system = make_system(params)\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " x_dist = get_last_value(results.R).x\n", - " print(angle, x_dist)\n", - " return x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test `range_func`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "range_func(45, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And sweep through a range of angles." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "angles = linspace(20, 80, 21)\n", - "sweep = SweepSeries()\n", - "\n", - "for angle in angles:\n", - " x_dist = range_func(angle, params)\n", - " sweep[angle] = x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the `Sweep` object, it looks like the peak is between 40 and 45 degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, color='C2')\n", - "decorate(xlabel='Launch angle (degree)',\n", - " ylabel='Range (m)',\n", - " title='Range as a function of launch angle',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `maximize` to search for the peak efficiently." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "bounds = [0, 90] * degree\n", - "res = maximize(range_func, bounds, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`res` is an `ModSimSeries` object with detailed results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "res" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`x` is the optimal angle and `fun` the optional range." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "optimal_angle = res.x" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "max_x_dist = res.fun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Read the source code for `maximize` and `minimize_scalar`, below.\n", - "\n", - "Add a print statement to `range_func` that prints `angle`. Then run `maximize` again so you can see how many times it calls `range_func` and what the arguments are." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(maximize)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(minimize_scalar)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The Manny Ramirez problem\n", - "\n", - "Finally, let's solve the Manny Ramirez problem:\n", - "\n", - "*What is the minimum effort required to hit a home run in Fenway Park?*\n", - "\n", - "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its most famous features is the \"Green Monster\", which is a wall in left field that is unusually close to home plate, only 310 feet along the left field line. To compensate for the short distance, the wall is unusually high, at 37 feet.\n", - "\n", - "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", - "\n", - "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", - "\n", - "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", - "\n", - "As a first step, write a function called `height_func` that takes a launch angle and a params as parameters, simulates the flights of a baseball, and returns the height of the baseball when it reaches a point 94.5 meters (310 feet) from home plate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function with a launch angle of 45 degrees:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now use `maximize` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With initial velocity 40 m/s and an optimal launch angle, the ball clears the Green Monster with a little room to spare.\n", - "\n", - "Which means we can get over the wall with a lower initial velocity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Finding the minimum velocity\n", - "\n", - "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 11 m, given given that it's launched at the optimal angle. And that's a job for `root_bisect`.\n", - "\n", - "Write an error function that takes a velocity and a `Params` object as parameters. It should use `maximize` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your error function before you call `root_bisect`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then use `root_bisect` to find the answer to the problem, the minimum velocity that gets the ball out of the park." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And just to check, run `error_func` with the value you found." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap24.ipynb b/colab/chap24.ipynb deleted file mode 100644 index a2273574..00000000 --- a/colab/chap24.ipynb +++ /dev/null @@ -1,653 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 24" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling paper\n", - "\n", - "We'll start by loading the units we need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And creating a `Params` object with the system parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " L = 47 * m,\n", - " omega = 10 * radian / s,\n", - " t_end = 130 * s,\n", - " dt = 1*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def estimate_k(params):\n", - " \"\"\"Estimates the parameter `k`.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: k in meters per radian\n", - " \"\"\"\n", - " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", - " \n", - " Ravg = (Rmax + Rmin) / 2\n", - " Cavg = 2 * pi * Ravg\n", - " revs = L / Cavg\n", - " rads = 2 * pi * revs\n", - " k = (Rmax - Rmin) / rads\n", - " return k" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As usual, `make_system` takes a `Params` object and returns a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: System with init, k, and ts\n", - " \"\"\"\n", - " init = State(theta = 0 * radian,\n", - " y = 0 * m,\n", - " r = params.Rmin)\n", - " \n", - " k = estimate_k(params)\n", - "\n", - " return System(params, init=init, k=k)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write a slope function based on the differential equations\n", - "\n", - "$\\omega = \\frac{d\\theta}{dt} = 10$\n", - "\n", - "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", - "\n", - "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = r * omega\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `slope_func`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll use an event function to stop when `y=L`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Detects when we've rolled length `L`.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with L\n", - " \n", - " returns: difference between `y` and `L`\n", - " \"\"\"\n", - " theta, y, r = state\n", - " \n", - " return y - system.L" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `y` is 47 meters, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "unrolled = get_last_value(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of radius is `R_max`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "radius = get_last_value(results.r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The total number of rotations is close to 200, which seems plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "radians = get_last_value(results.theta) \n", - "rotations = magnitude(radians) / 2 / np.pi" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The elapsed time is about 2 minutes, which is also plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "t_final = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `theta`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `y`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_y(results):\n", - " plot(results.y, color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `r`" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_r(results):\n", - " plot(results.r, color='C2', label='r')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Radius (m)')\n", - " \n", - "plot_r(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also see the relationship between `y` and `r`, which I derive analytically in the book." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.r, results.y, color='C3')\n", - "\n", - "decorate(xlabel='Radius (m)',\n", - " ylabel='Length (m)',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the figure from the book." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_three(results):\n", - " subplot(3, 1, 1)\n", - " plot_theta(results)\n", - "\n", - " subplot(3, 1, 2)\n", - " plot_y(results)\n", - "\n", - " subplot(3, 1, 3)\n", - " plot_r(results)\n", - "\n", - "plot_three(results)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "Here's a draw function that animates the results using `matplotlib` patches." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " # get radius in mm\n", - " theta, y, r = state\n", - " radius = r.magnitude * 1000\n", - " \n", - " # draw a circle with\n", - " circle = Circle([0, 0], radius, fill=True)\n", - " plt.gca().add_patch(circle)\n", - " \n", - " # draw an arrow to show rotation\n", - " dx, dy = pol2cart(theta, radius)\n", - " arrow = Arrow(0, 0, dx, dy)\n", - " plt.gca().add_patch(arrow)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "plot(dydt, label='dydt')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Linear velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", - "\n", - "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", - "\n", - "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/colab/chap25.ipynb b/colab/chap25.ipynb deleted file mode 100644 index 1516eaff..00000000 --- a/colab/chap25.ipynb +++ /dev/null @@ -1,957 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 25" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Teapots and Turntables" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tables in Chinese restaurants often have a rotating tray or turntable that makes it easy for customers to share dishes. These turntables are supported by low-friction bearings that allow them to turn easily and glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", - "\n", - "Suppose I am sitting at a table with a pot of tea on the turntable directly in front of me, and the person sitting directly opposite asks me to pass the tea. I push on the edge of the turntable with 1 Newton of force until it has turned 0.5 radians, then let go. The turntable glides until it comes to a stop 1.5 radians from the starting position. How much force should I apply for a second push so the teapot glides to a stop directly opposite me?\n", - "\n", - "The following figure shows the scenario, where `F` is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, `r`, and `tau` is the resulting torque. The blue circle near the bottom is the teapot.\n", - "\n", - "![](diagrams/teapot.png)\n", - "\n", - "We'll answer this question in these steps:\n", - "\n", - "1. We'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", - "\n", - "2. We'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", - "\n", - "Our simulation will use the following parameters:\n", - "\n", - "1. The radius of the turntable is 0.5 meters, and its weight is 7 kg.\n", - "\n", - "2. The teapot weights 0.3 kg, and it sits 0.4 meters from the center of the turntable.\n", - "\n", - "As usual, I'll get units from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And store the parameters in a `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(radius_disk=0.5*m,\n", - " mass_disk=7*kg,\n", - " radius_pot=0.4*m,\n", - " mass_pot=0.3*kg,\n", - " force=1*N,\n", - " torque_friction=0.2*N*m,\n", - " theta_end=0.5*radian,\n", - " t_end=20*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates the initial state, `init`, and computes the total moment of inertia for the turntable and the teapot." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", - " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", - " \n", - " init = State(theta=0*radian, omega=0*radian/s)\n", - " \n", - " I_disk = mass_disk * radius_disk**2 / 2\n", - " I_pot = mass_pot * radius_pot**2\n", - " \n", - " return System(params, init=init, I=I_disk+I_pot)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `System` object we'll use for the first phase of the simulation, while I am pushing the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "system1 = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulation\n", - "\n", - "When I stop pushing on the turntable, the angular acceleration changes abruptly. We could implement the slope function with an `if` statement that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more accurate results if we simulate the system in two phases:\n", - "\n", - "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", - "\n", - "2. During the second phase, force is 0, and we run until `omega` is 0.\n", - "\n", - "Then we can combine the results of the two phases into a single `TimeFrame`.\n", - "\n", - "Here's the slope function we'll use:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega = state\n", - " radius_disk, force = system.radius_disk, system.force\n", - " torque_friction, I = system.torque_friction, system.I\n", - " \n", - " torque = radius_disk * force - torque_friction\n", - " alpha = torque / I\n", - " \n", - " return omega, alpha " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we'll test the slope function before running the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops the simulation when `theta` reaches `theta_end`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func1(state, t, system):\n", - " \"\"\"Stops when theta reaches theta_end.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: difference from target\n", - " \"\"\"\n", - " theta, omega = state\n", - " return theta - system.theta_end " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "event_func1(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results1, details1 = run_ode_solver(system1, slope_func, events=event_func1)\n", - "details1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Phase 2\n", - "\n", - "Before we run the second phase, we have to extract the final time and state of the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = results1.last_label() * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And make an initial `State` object for Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "init2 = results1.last_row()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a new `System` object with zero force." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "system2 = System(system1, t_0=t_0, init=init2, force=0*N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops when angular velocity is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func2(state, t, system):\n", - " \"\"\"Stops when omega is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: omega\n", - " \"\"\"\n", - " theta, omega = state\n", - " return omega" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "event_func2(system2.init, 0, system2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the second phase." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system2.init, system2.t_0, system2)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details2 = run_ode_solver(system2, slope_func, events=event_func2)\n", - "details2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "results2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pandas provides `combine_first`, which combines `results1` and `results2`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "results = results1.combine_first(results2)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot `theta` for both phases." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `omega`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_omega(results):\n", - " plot(results.omega, label='omega', color='C1')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')\n", - " \n", - "plot_omega(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "plot_theta(results)\n", - "subplot(2, 1, 2)\n", - "plot_omega(results)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating friction\n", - "\n", - "Let's take the code from the previous section and wrap it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def run_two_phases(force, torque_friction, params):\n", - " \"\"\"Run both phases.\n", - " \n", - " force: force applied to the turntable\n", - " torque_friction: friction due to torque\n", - " params: Params object\n", - " \n", - " returns: TimeFrame of simulation results\n", - " \"\"\"\n", - " # put the specified parameters into the Params object\n", - " params = Params(params, force=force, torque_friction=torque_friction)\n", - "\n", - " # run phase 1\n", - " system1 = make_system(params)\n", - " results1, details1 = run_ode_solver(system1, slope_func, \n", - " events=event_func1)\n", - "\n", - " # get the final state from phase 1\n", - " t_0 = results1.last_label() * s\n", - " init2 = results1.last_row()\n", - " \n", - " # run phase 2\n", - " system2 = System(system1, t_0=t_0, init=init2, force=0*N)\n", - " results2, details2 = run_ode_solver(system2, slope_func, \n", - " events=event_func2)\n", - " \n", - " # combine and return the results\n", - " results = results1.combine_first(results2)\n", - " return TimeFrame(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test it with the same parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "force = 1*N\n", - "torque_friction = 0.2*N*m\n", - "results = run_two_phases(force, torque_friction, params)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "theta_final = results.last_row().theta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the error function we'll use with `root_bisect`.\n", - "\n", - "It takes a hypothetical value for `torque_friction` and returns the difference between `theta_final` and the observed duration of the first push, 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(torque_friction, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " torque_friction: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " force = 1 * N\n", - " results = run_two_phases(force, torque_friction, params)\n", - " theta_final = results.last_row().theta\n", - " print(torque_friction, theta_final)\n", - " return theta_final - 1.5 * radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing the error function." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "guess1 = 0.1*N*m\n", - "error_func1(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "guess2 = 0.3*N*m\n", - "error_func1(guess2, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And running `root_scalar`." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(error_func1, [guess1, guess2], params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the coefficient of friction that yields a total rotation of 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "torque_friction = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a test run with the estimated value." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "force = 1 * N\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks good." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "\n", - "Here's a draw function we can use to animate the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " theta, omega = state\n", - " \n", - " # draw a circle for the table\n", - " radius_disk = magnitude(params.radius_disk)\n", - " circle1 = Circle([0, 0], radius_disk)\n", - " plt.gca().add_patch(circle1)\n", - " \n", - " # draw a circle for the teapot\n", - " radius_pot = magnitude(params.radius_pot)\n", - " center = pol2cart(theta, radius_pot)\n", - " circle2 = Circle(center, 0.05, color='C1')\n", - " plt.gca().add_patch(circle2)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "state = results.first_row()\n", - "draw_func(state, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Exercises\n", - "\n", - "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", - "\n", - "Write an error function that takes `force` and `params` and returns the offset from the desired angle." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the error function with `force=1`" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run `root_bisect` to find the desired force." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "force = res.root\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "remaining_angle = np.pi - 1.5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Now suppose my friend pours 0.1 kg of tea and puts the teapot back on the turntable at distance 0.3 meters from the center. If I ask for the tea back, how much force should they apply, over an arc of 0.5 radians, to make the teapot glide to a stop back in front of me? You can assume that torque due to friction is proportional to the total mass of the teapot and the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 294666b7292117cbd632fa09143c49bbbe325e7c Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 20 Mar 2022 19:42:37 -0400 Subject: [PATCH 083/144] Update README.md --- README.md | 233 ++---------------------------------------------------- 1 file changed, 5 insertions(+), 228 deletions(-) diff --git a/README.md b/README.md index 5d66e33b..518d976f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Modeling and Simulation in Python +[Read the book and run the code](https://allendowney.github.io/ModSimPy/). + +[Pre-order the books from No Starch Press](https://nostarch.com/modeling-and-simulation-python). + *Modeling and Simulation in Python* is an introduction to physical modeling using a computational approach. It is organized in three parts: * The first part presents discrete models, including a bikeshare system and world population growth. @@ -14,232 +18,5 @@ Python is an ideal programming language for this material. It is a good first l *Modeling and Simulation in Python* is a Free Book. It is available under the [Creative Commons Attribution-NonCommercial 4.0 Unported License](https://creativecommons.org/licenses/by-nc/4.0/), which means that you are free to copy, distribute, and modify it, as long as you attribute the work and don’t use it for commercial purposes. -[This](http://greenteapress.com/wp/modsimpy/) and other Free Books by Allen Downey are available from [Green Tea Press](http://greenteapress.com/wp). - - -## Getting started - -There are three ways to work with the code: - -* You can run the notebooks on Colab. - -* You can run them on Binder. - -* You can download them and run them in your own Jupyter environment. - -### Colab - -Use these links to run the notebooks on Colab: - -* [chap01.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap01.ipynb) - -* [chap02.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap02.ipynb) - -* [chap03.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap03.ipynb) - -* [chap04.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap04.ipynb) - -* [chap05.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap05.ipynb) - -* [chap06.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap06.ipynb) - -* [chap07.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap07.ipynb) - -* [chap08.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap08.ipynb) - -* [chap09.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap09.ipynb) - -* [chap10.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap10.ipynb) - -* [chap11.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap11.ipynb) - -* [chap12.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap12.ipynb) - -* [chap13.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap13.ipynb) - -* [chap13ode.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap13ode.ipynb) - -* [chap14.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap14.ipynb) - -* [chap15.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap15.ipynb) - -* [chap16.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap16.ipynb) - -* [chap17.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap17.ipynb) - -* [chap18.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap18.ipynb) - -* [chap20.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap20.ipynb) - -* [chap21.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap21.ipynb) - -* [chap22.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap22.ipynb) - -* [chap23.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap23.ipynb) - -* [chap24.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap24.ipynb) - -* [chap25.ipynb](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master/colab/chap25.ipynb) - -### Binder - -You can run the code from the repository in a browser by pressing the Binder button below. - -[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/AllenDowney/ModSimPy/master?filepath=notebooks) - - -### Install Jupyter - -To run the examples and work on the exercises in this book, you have to: - -1. Install Python on your computer, along with the libraries we will - use. - -2. Copy my files onto your computer. - -3. Run Jupyter, which is a tool for running and writing programs, and - load a **notebook**, which is a file that contains code and - text. - -The next three sections provide details for these steps. I wish there -were an easier way to get started; it’s regrettable that you have to do so much work before you write your first program. Be persistent! - -#### Installing Python - -You might already have Python installed on your computer, but you might -not have the latest version. To use the code in this book, you need -Python 3.6 or later. Even if you have the latest version, you probably -don’t have all of the libraries we need. - -You could update Python and install these libraries, but I strongly -recommend that you don’t go down that road. I think you will find it -easier to use **Anaconda**, which is a free Python distribution that -includes all the libraries you need for this book (and more). - -Anaconda is available for Linux, macOS, and Windows. By default, it puts -all files in your home directory, so you don’t need administrator (root) -permission to install it, and if you have a version of Python already, -Anaconda will not remove or modify it. - -Start at [the Anaconda download page](https://www.anaconda.com/distribution/#download-section). -Download the installer for -your system and run it. You don’t need administrative privileges to -install Anaconda, so I recommend you run the installer as a normal user, -not as administrator or root. - -I suggest you accept the recommended options. On Windows you have the -option to install Visual Studio Code, which is an interactive -environment for writing programs. You won’t need it for this book, but -you might want it for other projects. - -By default, Anaconda installs most of the packages you need, but there -are a few more you have to add. Once the installation is complete, open -a command window. On macOS or Linux, you can use Terminal. On Windows, -open the Anaconda Prompt that should be in your Start menu. - -Run the following command (copy and paste it if you can, to avoid -typos): -``` -conda install jupyterlab pandas seaborn sympy beautifulsoup4 lxml html5lib pytables -``` -To install Pint, run this command: -``` -conda install -c conda-forge pint -``` -And to install the ModSim library, run this command: -``` -pip install modsimpy -``` -That should be everything you need. - -#### Copying my files - -The simplest way to get the files for this book is to download a [Zip -archive from GitHub](https://github.com/AllenDowney/ModSimPy/archive/master.zip). -You will need a program like -WinZip or gzip to unpack the Zip file. Make a note of the location of -the files you download. - -If you download the Zip file, you can skip the rest of this section, -which explains how to use Git. - -The code for this book is available from -, which is a **Git -repository**. Git is a software tool that helps you keep track of the -programs and other files that make up a project. A collection of files -under Git’s control is called a repository (the cool kids call it a -“repo"). GitHub is a hosting service that provides storage for Git -repositories and a convenient web interface. - -Before you download these files, I suggest you copy my repository on -GitHub, which is called **forking**. If you don’t already have a -GitHub account, you’ll need to create one. - -Use a browser to view the homepage of my repository at -. You should see a gray button -in the upper right that says [Fork]{}. If you press it, GitHub will -create a copy of my repository that belongs to you. - -Now, the best way to download the files is to use a **Git client**, -which is a program that manages git repositories. You can get -installation instructions for Windows, macOS, and Linux at -. - -In Windows, I suggest you accept the options recommended by the -installer, with two exceptions: - -- As the default editor, choose instead of . - -- For “Configuring line ending conversions", select “Check out as is, - commit as is". - -For macOS and Linux, I suggest you accept the recommended options. - -Once the installation is complete, open a command window. On Windows, -open Git Bash, which should be in your Start menu. On macOS or Linux, -you can use Terminal. - -To find out what directory you are in, type , which stands for “print -working directory". On Windows, most likely you are in . On MacOS or -Linux, you are probably in your home directory, . - -The next step is to copy files from your repository on GitHub to your -computer; in Git vocabulary, this process is called **cloning**. Run -this command: - -``` -git clone https://github.com/YourGitHubUserName/ModSimPy -``` - -Of course, you should replace with your GitHub user name. After cloning, -you should have a new directory called . - -#### Running Jupyter - -The code for each chapter, and starter code for the exercises, is in -Jupyter notebooks. If you have not used Jupyter before, you can read -about it at . - -To start Jupyter on macOS or Linux, open a Terminal; on Windows, open -Git Bash. Use to “change directory" into the code directory in the -repository: -``` -cd ModSimPy/notebooks -``` -Then launch the Jupyter notebook server: -``` -jupyter notebook -``` -Jupyter should open a window in a browser, and you should see the list -of notebooks in my repository. Click on the first notebook, and follow -the instructions to run the first few “cells". The first time you run a -notebook, it might take several seconds to start, while some Python -files get initialized. After that, it should run faster. - -Feel free to read through the notebook, but it might not make sense -until you read Chapter 1. +This and other Free Books by Allen Downey are available from [Green Tea Press](http://greenteapress.com/wp). -You can also launch Jupyter from the Start menu on Windows, the Dock on -macOS, or the Anaconda Navigator on any system. If you do that, Jupyter -might start in your home directory or somewhere else in your file -system, so you might have to navigate to find the directory. From 85cd9a43a52ebdbd395e63b0ab5af6132dd02692 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 20 Mar 2022 19:42:48 -0400 Subject: [PATCH 084/144] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 518d976f..5339bbf3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [Read the book and run the code](https://allendowney.github.io/ModSimPy/). -[Pre-order the books from No Starch Press](https://nostarch.com/modeling-and-simulation-python). +[Pre-order the book from No Starch Press](https://nostarch.com/modeling-and-simulation-python). *Modeling and Simulation in Python* is an introduction to physical modeling using a computational approach. It is organized in three parts: From 7db4ddaf11b6fd91ff00d2fd5a38486b22576b43 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 10 Jun 2022 15:39:16 -0400 Subject: [PATCH 085/144] Updating chapters --- chapters/chap01.ipynb | 117 ++++++++++++++++++++++-------------------- chapters/chap02.ipynb | 108 +++++++++++++++++++++----------------- chapters/chap03.ipynb | 14 +++-- chapters/chap04.ipynb | 22 ++++---- chapters/chap05.ipynb | 22 ++++---- chapters/chap06.ipynb | 13 +++-- chapters/chap07.ipynb | 17 +++--- chapters/chap08.ipynb | 117 ++++++++++++++++++++++++------------------ chapters/chap09.ipynb | 94 ++++++++++++++++++--------------- chapters/chap10.ipynb | 4 +- chapters/chap11.ipynb | 18 +++---- chapters/chap12.ipynb | 4 +- chapters/chap13.ipynb | 5 +- chapters/chap14.ipynb | 16 +++--- chapters/chap15.ipynb | 4 +- chapters/chap16.ipynb | 6 +-- chapters/chap17.ipynb | 12 ++--- chapters/chap18.ipynb | 10 ++-- chapters/chap19.ipynb | 4 +- chapters/chap20.ipynb | 9 ++-- chapters/chap21.ipynb | 11 ++-- chapters/chap22.ipynb | 15 +++--- chapters/chap23.ipynb | 9 ++-- chapters/chap24.ipynb | 13 ++--- chapters/chap25.ipynb | 14 ++--- chapters/chap26.ipynb | 22 ++++++-- chapters/chap27.ipynb | 89 ++++++++++++++------------------ 27 files changed, 423 insertions(+), 366 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 844e7204..3f4722ec 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -236,12 +236,10 @@ "so fast when it hit the pavement that it would be embedded in the\n", "concrete; or if it hit a person, it would break their skull.\n", "\n", - "We can test this myth by making and analyzing a model. To get started,\n", - "we'll assume that the effect of air resistance is small. This will turn out to be a bad assumption, but bear with me.\n", - "If air resistance is negligible, the primary force acting on the penny\n", - "is gravity, which causes the penny to accelerate downward.\n", + "We can test this myth by making and analyzing two models. For the first model,\n", + "we'll assume that the effect of air resistance is small. In that case, the primary force acting on the penny is gravity, which causes the penny to accelerate downward.\n", "\n", - "If the initial velocity is 0 and the acceleration is $a$, the velocity after $t$ seconds is \n", + "If the initial velocity is 0 and the acceleration, $a$, is constant, the velocity after $t$ seconds is \n", "\n", "$$v = a t$$\n", "\n", @@ -263,17 +261,18 @@ "id": "documentary-diagnosis", "metadata": {}, "source": [ - "Of course, these results are not exact because the model is based on\n", - "simplifications. For example, we assume that gravity is constant. In\n", - "fact, the force of gravity is different on different parts of the globe, and it gets weaker as you move away from the surface. But these differences are small, so ignoring them is probably a good choice for this scenario.\n", + "Of course, these results are not exact because the model is based on simplifications. For example, we assume that gravity is constant. \n", + "In fact, the force of gravity is different on different parts of the globe, and it gets weaker as you move away from the surface. \n", + "But these differences are small, so ignoring them is probably a good choice for this problem.\n", "\n", - "On the other hand, ignoring air resistance is not a good choice. Once\n", - "the penny gets to about 29 m/s, the upward force of air resistance\n", - "equals the downward force of gravity, so the penny stops accelerating.\n", + "On the other hand, ignoring air resistance is not a good choice, because in this scenario its effect is substantial.\n", + "Once the penny gets to about 29 m/s, the upward force of air resistance equals the downward force of gravity, so the penny stops accelerating.\n", "This is the *terminal velocity* of the penny in air.\n", "\n", - "Once the penny reaches terminal velocity, it doesn't matter how much farther it falls; it hits the sidewalk at about 29 m/s.\n", - "That's much less than 86 m/s, as the simple model predicts." + "And that suggests a second model, where the penny accelerates until it reaches terminal velocity; after that, acceleration is 0 and velocity is constant.\n", + "In this model, the penny hits the sidewalk at about 29 m/s.\n", + "That's much less than 86 m/s, which is what the first model predicts.\n", + "Getting hit with a penny at that speed might hurt, but it would be unlikely to cause real harm. And it would not damage concrete." ] }, { @@ -349,14 +348,20 @@ "v = a * t" ] }, + { + "cell_type": "markdown", + "id": "serial-pilot", + "metadata": {}, + "source": [ + "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation." + ] + }, { "cell_type": "markdown", "id": "qualified-diabetes", "metadata": {}, "source": [ - "Python uses the symbol `*` for multiplication. The other arithmetic operators are `+` for addition, `-` for subtraction, `/` for division, and `**` for exponentiation.\n", - "\n", - "When you assign a value to a variable, Jupyter does not show the result automatically, but you can display the value of a variable like this:" + "After you assign a value to a variable, you can display the value like this:" ] }, { @@ -500,7 +505,7 @@ "When we set `h=381`, we left out the meters, and when we set `a=9.8`, we left out the meters per second squared.\n", "And, when we got the result `v=86`, we added back the meters per second.\n", "\n", - "Leaving units of out computation is common practice, but it tends to cause errors, including the very expensive failure of the Mars Climate Orbiter in 1999 (see ).\n", + "Leaving units out of computation is a common practice, but it tends to cause errors, including the very expensive failure of the Mars Climate Orbiter in 1999 (see ).\n", "When possible, it is better to include units in the computation.\n", "\n", "To represent units, we'll use a library called Pint ().\n", @@ -553,7 +558,8 @@ "id": "unlike-opera", "metadata": {}, "source": [ - "But leagues and fortnights are not SI units.\n", + "But leagues and fortnights are not part of the International System of Units\n", + "(see ); in the jargon, they are not \"SI units\".\n", "Instead, we will use `meter` and `second`." ] }, @@ -745,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 26, "id": "impaired-puzzle", "metadata": { "tags": [] @@ -767,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "antique-landing", "metadata": {}, "outputs": [], @@ -778,7 +784,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "id": "included-failure", "metadata": {}, "outputs": [], @@ -828,7 +834,7 @@ }, { "cell_type": "markdown", - "id": "handmade-zoning", + "id": "periodic-objective", "metadata": {}, "source": [ "### Exercise 1\n", @@ -840,15 +846,16 @@ "v = a t\n", "```\n", "\n", - "you'll get a *syntax error*, which means that something is wrong with the structure of the program.\n", - "Try it out in the next cell so you see what the error message looks like." + "you'll get a *syntax error*, which means that something is wrong with the structure of the program. Try it out so you see what the error message looks like." ] }, { "cell_type": "code", - "execution_count": 28, - "id": "postal-marking", - "metadata": {}, + "execution_count": 29, + "id": "exempt-delight", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "a = 9.8 * meter / second**2\n", @@ -871,7 +878,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "id": "legal-observer", "metadata": {}, "outputs": [], @@ -895,7 +902,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "id": "pressing-belgium", "metadata": {}, "outputs": [], @@ -919,7 +926,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "id": "inner-equivalent", "metadata": {}, "outputs": [], @@ -929,7 +936,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "id": "nuclear-thirty", "metadata": {}, "outputs": [], @@ -939,7 +946,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "id": "available-steering", "metadata": {}, "outputs": [], @@ -959,7 +966,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "id": "documentary-doctrine", "metadata": {}, "outputs": [], @@ -1012,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "id": "greenhouse-reason", "metadata": {}, "outputs": [], @@ -1033,7 +1040,7 @@ "\n", "* If we take air resistance into account, and drop the penny at its terminal velocity, it falls with constant velocity. \n", "\n", - "Now let's consider a third model that includes elements of the first two: let's assume that the acceleration of the penny is `a` until the penny reaches $29$ m/s, and then $0$ m/s afterwards. What is the total time for the penny to fall $381$ m?" + "Now let's consider a third model that includes elements of the first two: let's assume that the acceleration of the penny is `a` until the penny reaches $29$ m/s, and then $0$ m/s$^2$ afterwards. What is the total time for the penny to fall $381$ m?" ] }, { @@ -1052,7 +1059,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "id": "secure-crowd", "metadata": {}, "outputs": [], @@ -1063,7 +1070,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "id": "thirty-minneapolis", "metadata": {}, "outputs": [], @@ -1073,7 +1080,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "id": "premier-seeking", "metadata": {}, "outputs": [], @@ -1083,7 +1090,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "id": "brave-laundry", "metadata": {}, "outputs": [], @@ -1093,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "id": "adjusted-consultation", "metadata": {}, "outputs": [], @@ -1103,7 +1110,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "id": "understanding-consortium", "metadata": {}, "outputs": [], @@ -1128,7 +1135,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "id": "about-complex", "metadata": {}, "outputs": [], @@ -1138,7 +1145,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 44, "id": "unique-owner", "metadata": {}, "outputs": [], @@ -1148,7 +1155,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 45, "id": "minus-batman", "metadata": {}, "outputs": [], @@ -1158,7 +1165,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 46, "id": "exact-vegetable", "metadata": {}, "outputs": [], @@ -1168,7 +1175,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "id": "neutral-lightning", "metadata": {}, "outputs": [], @@ -1188,7 +1195,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 48, "id": "virgin-cambodia", "metadata": {}, "outputs": [], @@ -1200,7 +1207,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 49, "id": "right-intention", "metadata": {}, "outputs": [], @@ -1210,7 +1217,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 50, "id": "mineral-sally", "metadata": {}, "outputs": [], @@ -1220,7 +1227,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 51, "id": "coral-camel", "metadata": {}, "outputs": [], @@ -1230,7 +1237,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 52, "id": "preceding-cricket", "metadata": {}, "outputs": [], @@ -1240,7 +1247,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 53, "id": "effective-rendering", "metadata": {}, "outputs": [], @@ -1250,7 +1257,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 54, "id": "printable-reply", "metadata": {}, "outputs": [], @@ -1314,7 +1321,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1328,7 +1335,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index 0b49a1fe..d6c54436 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "progressive-typing", "metadata": { "tags": [] @@ -114,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "incorrect-comparison", "metadata": {}, "outputs": [], @@ -136,12 +136,12 @@ "bikes at each location. The initial values are `10` and `2`, indicating that there are 10 bikes at Olin and 2 at Wellesley. \n", "\n", "The `State` object is assigned to a new variable named `bikeshare`.\n", - "We can read the variables inside a `State` object using the *dot operator*, like this:" + "We can get the value of a variable in a `State` object using the *dot operator*, like this:" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "brief-diversity", "metadata": {}, "outputs": [], @@ -159,7 +159,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "designed-brazilian", "metadata": {}, "outputs": [], @@ -172,12 +172,12 @@ "id": "phantom-oklahoma", "metadata": {}, "source": [ - "Or, to display the state variables and their values, you can just enter the name of the object:" + "Or, to display all of the state variables and their values, you can enter just the name of the object:" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "impaired-potter", "metadata": {}, "outputs": [], @@ -205,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "basic-fabric", "metadata": { "tags": [] @@ -236,7 +236,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "floppy-trainer", "metadata": {}, "outputs": [], @@ -256,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "hungarian-bride", "metadata": {}, "outputs": [], @@ -287,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "vertical-drawing", "metadata": {}, "outputs": [], @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "significant-nutrition", "metadata": {}, "outputs": [], @@ -338,7 +338,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "moving-jurisdiction", "metadata": {}, "outputs": [], @@ -358,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "proper-symposium", "metadata": {}, "outputs": [], @@ -377,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "identical-yacht", "metadata": {}, "outputs": [], @@ -410,7 +410,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "heavy-patrol", "metadata": {}, "outputs": [], @@ -431,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "french-preference", "metadata": {}, "outputs": [], @@ -452,7 +452,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "alternative-keyboard", "metadata": {}, "outputs": [], @@ -475,7 +475,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "robust-holly", "metadata": {}, "outputs": [], @@ -502,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "fifteen-atmosphere", "metadata": {}, "outputs": [], @@ -523,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "matched-narrow", "metadata": {}, "outputs": [], @@ -557,7 +557,21 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 57, + "id": "29c1f41a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# this line sets the random number generator so the results in\n", + "# the book are the same every time we run it\n", + "np.random.seed(17)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, "id": "illegal-metropolitan", "metadata": {}, "outputs": [], @@ -586,7 +600,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 59, "id": "excessive-murder", "metadata": {}, "outputs": [], @@ -613,7 +627,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 60, "id": "fundamental-nursing", "metadata": {}, "outputs": [], @@ -639,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 61, "id": "twenty-health", "metadata": {}, "outputs": [], @@ -660,7 +674,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 62, "id": "played-character", "metadata": {}, "outputs": [], @@ -679,7 +693,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 63, "id": "ecological-colon", "metadata": {}, "outputs": [], @@ -702,7 +716,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 64, "id": "mediterranean-german", "metadata": {}, "outputs": [], @@ -736,7 +750,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 65, "id": "hollywood-shopping", "metadata": {}, "outputs": [], @@ -760,7 +774,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 66, "id": "buried-alert", "metadata": {}, "outputs": [], @@ -781,7 +795,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 67, "id": "recognized-denmark", "metadata": {}, "outputs": [], @@ -819,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 68, "id": "polish-river", "metadata": {}, "outputs": [], @@ -867,7 +881,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "id": "every-consultation", "metadata": {}, "outputs": [], @@ -885,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "id": "changing-planet", "metadata": {}, "outputs": [], @@ -903,7 +917,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "id": "aquatic-richardson", "metadata": {}, "outputs": [], @@ -923,7 +937,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "id": "english-titanium", "metadata": {}, "outputs": [], @@ -954,7 +968,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 73, "id": "indonesian-singing", "metadata": {}, "outputs": [], @@ -983,7 +997,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 74, "id": "saved-hands", "metadata": {}, "outputs": [], @@ -1045,7 +1059,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "id": "helpful-zambia", "metadata": {}, "outputs": [], @@ -1067,7 +1081,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 41, "id": "beneficial-mainland", "metadata": {}, "outputs": [], @@ -1105,7 +1119,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "id": "former-frost", "metadata": {}, "outputs": [], @@ -1115,7 +1129,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "id": "spare-honduras", "metadata": {}, "outputs": [], @@ -1175,7 +1189,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "id": "agricultural-midwest", "metadata": {}, "outputs": [], @@ -1195,7 +1209,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1209,7 +1223,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 13638e4f..0afd2830 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -134,9 +134,8 @@ "the first assumption might be reasonable if we simulate the system for a short period of time, like one hour.\n", "\n", "The second assumption is not very realistic, but it might not affect the results very much, depending on what we use the model for.\n", - "\n", - "On the other hand, the third assumption seems problematic, and it is\n", - "relatively easy to fix. In this chapter, we will.\n", + "On the other hand, the third assumption seems more problematic.\n", + "It is relatively easy to fix, though; in this chapter, we'll fix it.\n", "\n", "This process, starting with a simple model, identifying the most\n", "important problems, and making gradual improvements, is called\n", @@ -495,8 +494,7 @@ "id": "twelve-defensive", "metadata": {}, "source": [ - "The equals operator is one of Python's *comparison operators*. The others\n", - "are:\n", + "The equals operator is one of Python's *comparison operators*; the complete list is in the following table.\n", "\n", "| Operation \t| Symbol \t|\n", "|-----------------------\t|--------\t|\n", @@ -752,7 +750,7 @@ "source": [ "### Exercise 1\n", "\n", - " Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add one to `olin_empty`.\n", + " Modify `bike_to_wellesley` so it checks whether a bike is available at Olin. If not, it should add `1` to `olin_empty`.\n", "\n", "To test it, create a `State` that initializes `olin` and `olin_empty` to `0`, run `bike_to_wellesley`, and check the result." ] @@ -836,7 +834,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -850,7 +848,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index c0634758..44186d1e 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -318,7 +318,7 @@ "Each time through the loop, the next number in the sequence gets assigned to the loop variable, `i`.\n", "\n", "But `range` only works with integers; to get a sequence of non-integer\n", - "values, we can use `linspace`, which is defined NumPy:" + "values, we can use `linspace`, which is provided by NumPy:" ] }, { @@ -501,7 +501,7 @@ "id": "instructional-showcase", "metadata": {}, "source": [ - "We can plot the results like this:" + "We can plot the elements of the `SweepSeries` like this:" ] }, { @@ -524,11 +524,11 @@ "metadata": {}, "source": [ "The keyword argument `color='C1'` specifies the color of the line.\n", - "The `TimeSeries` we have plotted so far use the default color, `C0`, which is blue.\n", + "The `TimeSeries` we have plotted so far use the default color, `C0`, which is blue (see for the other colors defined by Matplotlib).\n", "I use a different color for `SweepSeries` to remind us that it is not a `TimeSeries`.\n", "\n", "When the arrival rate at Olin is low, there are plenty of bikes and no unhappy customers.\n", - "As the arrival rate increases, we are more likely to run out of bikes and the number of unhappy customers increases. The line is jagged because the simulation is based on random numbers. Sometime we get lucky and there are relatively few unhappy customers; other times are are unlucky and there are more. " + "As the arrival rate increases, we are more likely to run out of bikes and the number of unhappy customers increases. The line is jagged because the simulation is based on random numbers. Sometime we get lucky and there are relatively few unhappy customers; other times we are unlucky and there are more. " ] }, { @@ -560,7 +560,7 @@ " change you made was small, it shouldn't take long to find the\n", " problem.\n", "\n", - "When this process works, your changes usually work the first time, or if they don't, the problem is obvious. In practice, there are two problems with incremental development:\n", + "When this process works, your changes usually work the first time or, if they don't, the problem is obvious. In practice, there are two problems with incremental development:\n", "\n", "- Sometimes you have to write extra code to generate visible output\n", " that you can check. This extra code is called *scaffolding*\n", @@ -666,7 +666,7 @@ " Wrap the code from this chapter in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries` and run a simulation for each value of `p1` in `p1_array`, with `p2=0.2` and `num_steps=60`.\n", "It should store the results in the `SweepSeries` and return it. \n", "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." + "Use your function to generate a `SweepSeries` and then plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." ] }, { @@ -820,7 +820,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "broad-latitude", "metadata": { "scrolled": true @@ -866,7 +866,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -880,7 +880,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index a82967d0..0e1bd458 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -252,7 +252,7 @@ "source": [ "The first column, which is labeled `Year`, is special. It is the *index* for this `DataFrame`, which means it contains the labels for the rows.\n", "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", + "Some of the values use scientific notation; for example, `2.516000e+09` is shorthand for $2.516 \\cdot 10^9$ or 2.544 billion.\n", "\n", "`NaN` is a special value that indicates missing data." ] @@ -512,7 +512,7 @@ }, "outputs": [], "source": [ - "rel_error = abs_error / census * 100\n", + "rel_error = 100 * abs_error / census\n", "rel_error.tail()" ] }, @@ -885,7 +885,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 34, "id": "terminal-reynolds", "metadata": { "tags": [] @@ -911,7 +911,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 35, "id": "organizational-memphis", "metadata": { "tags": [] @@ -941,7 +941,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 36, "id": "rising-anger", "metadata": {}, "outputs": [], @@ -951,7 +951,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 37, "id": "false-handbook", "metadata": {}, "outputs": [], @@ -961,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 38, "id": "political-loading", "metadata": {}, "outputs": [], @@ -973,7 +973,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -987,7 +987,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index efaffaeb..5dc999b5 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "plastic-trigger", + "id": "375794f9", "metadata": {}, "source": [ "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", @@ -215,7 +215,10 @@ "`t0` and `t_end` are the first and last years; `p_0` is the initial\n", "population, and `annual_growth` is the estimated annual growth.\n", "\n", - "Here's what `system` looks like." + "The assignment `t_0=t_0` reads the value of the existing variable named `t_0`, which we created previously, and stores it in a new system variable, also named `t_0`.\n", + "The variables inside the `System` object are distinct from other variables, so you can change one without affecting the other, even if they have the same name.\n", + "\n", + "So this `System` object contains four new variables; here's what they look like." ] }, { @@ -258,7 +261,7 @@ "id": "rough-strain", "metadata": {}, "source": [ - "`run_simulation1` takes a `System` object and uses the parameters in it to determine `t_0`, `t_end`, and `annual_growth`.\n", + "`run_simulation1` takes a `System` object and reads from it the values of `t_0`, `t_end`, and `annual_growth`.\n", "\n", "It simulates population growth over time and returns the results in a `TimeSeries`.\n", "Here's how we call it." @@ -677,7 +680,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -691,7 +694,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index efb6bb0e..8a89f9a3 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -81,15 +81,15 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "affiliated-eleven", "metadata": { "tags": [] }, "outputs": [], "source": [ - "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", - " 'World_population_estimates.html')" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { @@ -440,7 +440,7 @@ "$$\\Delta p = \\alpha p + \\beta p^2$$ \n", "\n", "where $\\alpha$ and $\\beta$ are the parameters of the model. \n", - "If rewrite the right hand side like this: \n", + "If we rewrite the right hand side like this: \n", "\n", "$$\\Delta p = p (\\alpha + \\beta p)$$ \n", "\n", @@ -463,7 +463,8 @@ "id": "adaptive-pharmacy", "metadata": {}, "source": [ - "With these parameters, net growth is 0 when the population is about 13.9 billion.\n", + "With these parameters, net growth is 0 when the population is about 13.9 billion\n", + "(the result is positive because `beta` is negative).\n", "\n", "In the context of population modeling, the quadratic model is more\n", "conventionally written like this: \n", @@ -564,7 +565,7 @@ "metadata": {}, "source": [ "This version works, but it is not as versatile as it could be.\n", - "If there are several `System` objects, this function can only work with one of them, and only if it is named `sys1`." + "If there are several `System` objects, this function can work with only one of them, and only if it is named `sys1`." ] }, { @@ -766,7 +767,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -780,7 +781,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index 87ae7238..dafd3e12 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "progressive-typing", "metadata": { "tags": [] @@ -89,20 +89,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "necessary-factor", "metadata": { "tags": [] }, "outputs": [], "source": [ - "download('https://github.com/AllenDowney/ModSim/raw/main/' +\n", - " 'World_population_estimates.html')" + "download('https://raw.githubusercontent.com/AllenDowney/' +\n", + " 'ModSimPy/master/data/World_population_estimates.html')" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "changed-desktop", "metadata": { "tags": [] @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "metallic-inventory", "metadata": { "tags": [] @@ -144,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "measured-arthur", "metadata": { "tags": [] @@ -157,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "cutting-financing", "metadata": { "tags": [] @@ -206,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "indirect-russia", "metadata": {}, "outputs": [], @@ -225,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "comfortable-compression", "metadata": {}, "outputs": [], @@ -250,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "broken-windsor", "metadata": {}, "outputs": [], @@ -268,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "latest-function", "metadata": {}, "outputs": [], @@ -286,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "portable-pottery", "metadata": {}, "outputs": [], @@ -304,12 +304,11 @@ "source": [ "According to the model, population growth will slow gradually after 2020, approaching 12.6 billion by 2100.\n", "\n", - "I am using the word \"projection\" deliberately, rather than\n", - "\"prediction\", with the following distinction: \"prediction\" implies\n", - "something like \"this is what we should reasonably expect to happen, at\n", + "I am using the word *projection* deliberately, rather than\n", + "*prediction*, with the following distinction: \"prediction\" implies\n", + "something like \"this is what we expect to happen, at\n", "least approximately\"; \"projection\" implies something like \"if this\n", - "model is a good description of what is happening in this\n", - "system, and if nothing in the future causes the system parameters to change, this is what would happen.\"\n", + "model is a good description of the system, and if nothing in the future causes the system parameters to change, this is what would happen.\"\n", "\n", "Using \"projection\" leaves open the possibility that there are important things in the real world that are not captured in the model. It also suggests that, even if the model is good, the parameters we estimate based on the past might be different in the future.\n", "\n", @@ -352,18 +351,17 @@ "source": [ "## Comparing Projections\n", "\n", - "From the same Wikipedia page where we got the past population estimates, we'll read `table3`, which contains predictions for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." + "From the same Wikipedia page where we got the past population estimates, we'll read `table3`, which contains projections for population growth over the next 50-100 years, generated by the U.S. Census, U.N. DESA, and the Population Reference Bureau." ] }, { "cell_type": "code", - "execution_count": 14, - "id": "precious-contribution", + "execution_count": 15, + "id": "20e6f166", "metadata": {}, "outputs": [], "source": [ - "table3 = tables[3]\n", - "table3.head()" + "table3 = tables[3]" ] }, { @@ -371,14 +369,12 @@ "id": "coated-smoke", "metadata": {}, "source": [ - "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", - "\n", "The column names are long strings; for convenience, I'll replace them with abbreviations." ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "headed-tuner", "metadata": {}, "outputs": [], @@ -388,15 +384,34 @@ }, { "cell_type": "markdown", - "id": "ceramic-scroll", + "id": "c2a91ffb", + "metadata": {}, + "source": [ + "Here are the first few rows:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "precious-contribution", + "metadata": {}, + "outputs": [], + "source": [ + "table3.head()" + ] + }, + { + "cell_type": "markdown", + "id": "f62861c1", "metadata": {}, "source": [ + "Some values are `NaN`, which indicates missing data, because some organizations did not publish projections for some years.\n", "The following function plots projections from the U.N. DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "id": "paperback-delay", "metadata": {}, "outputs": [], @@ -426,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "id": "billion-dynamics", "metadata": {}, "outputs": [], @@ -461,7 +476,7 @@ "theirs differ from each other almost as much as they differ from ours.\n", "So the results from the model, simple as it is, are not entirely unreasonable.\n", "\n", - "If you are interested in some of the factors that go into the professional predictions, you might like this video by Hans Rosling about the demographic changes we expect this century: ." + "If you are interested in some of the factors that go into the professional projections, you might like this video by Hans Rosling about the demographic changes we expect this century: ." ] }, { @@ -489,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "id": "handmade-funeral", "metadata": {}, "outputs": [], @@ -510,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "id": "objective-accused", "metadata": {}, "outputs": [], @@ -529,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "id": "unique-matrix", "metadata": {}, "outputs": [], @@ -555,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "id": "pressing-proceeding", "metadata": {}, "outputs": [], @@ -568,7 +583,7 @@ "id": "cross-reducing", "metadata": {}, "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1970.\n", + "Other than a bump around 1990, the net growth rate has been declining roughly linearly since 1970.\n", "\n", "We can model the decline by fitting a line to this data and extrapolating into the future.\n", "Here's a function that takes a time stamp and computes a line that roughly fits the growth rates since 1970." @@ -576,7 +591,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "id": "mexican-denver", "metadata": {}, "outputs": [], @@ -597,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "id": "addressed-worker", "metadata": {}, "outputs": [], @@ -616,7 +631,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "id": "cathedral-shakespeare", "metadata": {}, "outputs": [], @@ -637,7 +652,7 @@ "source": [ "If you don't like the `slope` and `intercept` I chose, feel free to adjust them.\n", "\n", - "Now, as an exercise, you can use this function project world population until 2100.\n", + "Now, as an exercise, you can use this function to project world population until 2100.\n", "\n", "1. Create a `System` object that includes `alpha_func` as a system parameter.\n", "\n", @@ -650,7 +665,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "id": "common-april", "metadata": {}, "outputs": [], @@ -660,7 +675,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "id": "ignored-chain", "metadata": {}, "outputs": [], @@ -670,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "id": "color-accountability", "metadata": {}, "outputs": [], @@ -680,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "id": "numeric-raise", "metadata": {}, "outputs": [], @@ -690,7 +705,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "id": "included-vehicle", "metadata": {}, "outputs": [], @@ -700,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "id": "brown-rating", "metadata": {}, "outputs": [], @@ -710,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "id": "laughing-cylinder", "metadata": {}, "outputs": [], @@ -720,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "id": "personalized-parking", "metadata": {}, "outputs": [], @@ -740,7 +755,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -754,7 +769,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 3c5a7249..d04ff587 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -113,7 +113,7 @@ "This way of representing the model, where future population is a function of current population, is a *difference equation*; see\n", ".\n", "\n", - "Sometimes it is possible to compute $x_n$, for a given value of $n$, directly; that\n", + "For a given value of $n$, sometimes it is possible to compute $x_n$ directly; that\n", "is, without computing the intervening values from $x_1$ through $x_{n-1}$." ] }, @@ -194,7 +194,7 @@ "This is a *discrete* model, which\n", "means time is only defined at integer values of $n$ and not in between.\n", "But in reality, people are born and die all the time, not once a year,\n", - "so it might be more realistic use a *continuous* model, which means\n", + "so it might be more realistic to use a *continuous* model, which means\n", "time is defined at all values of $t$, not just integers. " ] }, @@ -311,8 +311,8 @@ " find counterexamples, but it is hard to write proofs.\n", "\n", "- Analysis can provide insight into models and the systems they\n", - " describe; for example, sometimes we can identify regimes of\n", - " qualitatively different behavior and key parameters that control\n", + " describe; for example, sometimes we can identify\n", + " qualitatively different ways the system can behave and key parameters that control\n", " those behaviors." ] }, @@ -382,14 +382,14 @@ "tools similar to Mathematica. They are not as easy to use as\n", "WolframAlpha, but they have some other advantages.\n", "\n", - "To use it, we'll define `Symbol` objects that represent variable names and functions.\n", + "To use it, we'll define `Symbol` objects that represent names of variables and functions.\n", "The `symbols` function takes a string and returns `Symbol` objects.\n", "So if we run this assignment:" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "id": "flush-balance", "metadata": {}, "outputs": [], @@ -404,12 +404,13 @@ "id": "faced-praise", "metadata": {}, "source": [ - "Now when we use `t`, Python understands that it is a symbol, not a numerical value. For example, if we use `t` as part of an expression, like this," + "Now when we use `t`, Python treats it like a variable name rather than a specific number. \n", + "For example, if we use `t` as part of an expression, like this," ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "ancient-anderson", "metadata": {}, "outputs": [], @@ -563,8 +564,9 @@ "id": "inside-medicine", "metadata": {}, "source": [ - "The result is the *general\n", - "solution*, which still contains an unspecified constant, $C_1$. To get the *particular solution* where $f(0) = p_0$, we substitute `p_0` for `C1`. First, we have to create two more symbols:" + "The result is the *general solution*, which still contains an unspecified constant, $C_1$.\n", + "To get the *particular solution* where $f(0) = p_0$, we substitute $p_0$ for `C1`. \n", + "First, we have to tell Python that `C1` is a symbol." ] }, { @@ -574,7 +576,7 @@ "metadata": {}, "outputs": [], "source": [ - "C1, p_0 = symbols('C1 p_0')" + "C1 = symbols('C1')" ] }, { @@ -582,7 +584,8 @@ "id": "serious-license", "metadata": {}, "source": [ - "Now we can perform the substitution:" + "Now we can substitute the value of $p_0$ for `C1`.\n", + "For example, if $p_0$ is 1000:" ] }, { @@ -592,7 +595,7 @@ "metadata": {}, "outputs": [], "source": [ - "particular = solution_eq.subs(C1, p_0)\n", + "particular = solution_eq.subs(C1, 1000)\n", "particular" ] }, @@ -601,7 +604,17 @@ "id": "modern-raleigh", "metadata": {}, "source": [ - "When $t=0$, $e^{\\alpha t}$ is $1$, so $f(t)$ is $p_0$, which is what we wanted." + "When $t=0$, the value of $f(0)$ is $p_0$, which confirms that this is the solution we want." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "394e9410", + "metadata": {}, + "outputs": [], + "source": [ + "particular.subs(t, 0)" ] }, { @@ -616,7 +629,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "political-chinese", "metadata": {}, "outputs": [], @@ -634,7 +647,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "lined-queen", "metadata": {}, "outputs": [], @@ -653,7 +666,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "printable-typing", "metadata": {}, "outputs": [], @@ -672,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "final-treatment", "metadata": {}, "outputs": [], @@ -691,7 +704,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "freelance-admission", "metadata": {}, "outputs": [], @@ -707,18 +720,19 @@ "source": [ "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`." + "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic equation, not a differential equation, we use `solve`, not `dsolve`." ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "orange-glasgow", "metadata": {}, "outputs": [], "source": [ "from sympy import solve\n", "\n", + "p_0 = symbols('p_0')\n", "solutions = solve(Eq(at_0, p_0), C1)" ] }, @@ -732,7 +746,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "expensive-palace", "metadata": {}, "outputs": [], @@ -750,7 +764,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "worthy-sleeve", "metadata": {}, "outputs": [], @@ -769,7 +783,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "aggressive-queue", "metadata": {}, "outputs": [], @@ -788,7 +802,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 24, "id": "funded-tolerance", "metadata": {}, "outputs": [], @@ -823,7 +837,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "institutional-finish", "metadata": { "tags": [] @@ -836,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "noble-auditor", "metadata": { "tags": [] @@ -861,7 +875,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "id": "industrial-administrator", "metadata": { "scrolled": true, @@ -896,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 28, "id": "bibliographic-sarah", "metadata": { "tags": [] @@ -978,7 +992,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "id": "internal-knock", "metadata": {}, "outputs": [], @@ -988,7 +1002,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "id": "smooth-sunglasses", "metadata": {}, "outputs": [], @@ -998,7 +1012,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "id": "fundamental-arlington", "metadata": {}, "outputs": [], @@ -1008,7 +1022,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "id": "desirable-alpha", "metadata": {}, "outputs": [], @@ -1018,7 +1032,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "id": "coupled-grounds", "metadata": {}, "outputs": [], @@ -1028,7 +1042,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "id": "looking-ground", "metadata": {}, "outputs": [], @@ -1038,7 +1052,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "id": "anticipated-paragraph", "metadata": {}, "outputs": [], @@ -1076,7 +1090,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1090,7 +1104,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index ae02aeb4..76c63317 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -403,7 +403,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -417,7 +417,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index 5c6e0ef9..2c9e09bc 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -131,9 +131,8 @@ " susceptible.\n", "\n", "- *R*: People who are \"recovered\". In the basic version of the\n", - " model, people who have recovered are considered to be immune to\n", - " reinfection. That is a reasonable model for some diseases, but not\n", - " for others, so it should be on the list of assumptions to reconsider later." + " model, people who have recovered are considered to be no longer\n", + " infectious and immune to reinfection. That is a reasonable model for some diseases, but not for others, so it should be on the list of assumptions to reconsider later." ] }, { @@ -141,9 +140,8 @@ "id": "reasonable-kitchen", "metadata": {}, "source": [ - "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average. If 100 people are infectious at a\n", - "particular point in time, and we ignore the particular time each one\n", - "became infected, we expect about 1 out of 4 to recover on any particular day.\n", + "Let's think about how the number of people in each category changes over time. Suppose we know that people with the disease are infectious for a period of 4 days, on average.\n", + "If 100 people are infectious at a particular point in time, and we ignore the particular time each one became infected, we expect about 1 out of 4 to recover on any particular day.\n", "\n", "Putting that a different way, if the time between recoveries is 4 days, the recovery rate is about 0.25 recoveries per day, which we'll denote with the Greek letter gamma, $\\gamma$, or the variable name `gamma`.\n", "\n", @@ -367,7 +365,7 @@ "id": "requested-turning", "metadata": {}, "source": [ - "Now that we have object to represent the system and it's state, we are ready for the update function." + "Now that we have object to represent the system and its state, we are ready for the update function." ] }, { @@ -509,7 +507,7 @@ "source": [ "## Collecting the Results\n", "\n", - "The previous version of `run_simulation` only returns the final state,\n", + "The previous version of `run_simulation` returns only the final state,\n", "but we might want to see how the state changes over time. We'll consider two ways to do that: first, using three `TimeSeries` objects, then using a new object called a `TimeFrame`.\n", "\n", "Here's the first version:" @@ -814,7 +812,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -828,7 +826,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index 61be3d58..2f576a70 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -493,7 +493,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -507,7 +507,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index a741bf4c..0f04b715 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -485,6 +485,7 @@ "source": [ "The values of `gamma` are on the $x$-axis, corresponding to the columns of the `SweepFrame`.\n", "The values of `beta` are on the $y$-axis, corresponding to the rows of the `SweepFrame`.\n", + "Each line follows a contour where the infection rate is constant.\n", "\n", "Infection rates are lowest in the lower right, where the contact rate is low and the recovery rate is high. They increase as we move to the upper left, where the contact rate is high and the recovery rate is low.\n", "\n" @@ -577,7 +578,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -591,7 +592,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index f9e4255b..59533809 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -149,8 +149,7 @@ "Describing physical systems using dimensionless parameters is often a\n", "useful move in the modeling and simulation game. In fact, it is so useful that it has a name: *nondimensionalization* (see\n", ").\n", - "\n", - "So we'll try the second option first." + "So that's what we'll try first." ] }, { @@ -236,7 +235,7 @@ "\n", "Since there are 11 rows and 4 columns, the total number of lines in the output is 44.\n", "\n", - "The following function uses the same loop to enumerate the elements of the `SweepFrame`, but instead of printing a line for each element, it plots a point." + "The following function uses the same loops to enumerate the elements of the `SweepFrame`, but instead of printing a line for each element, it plots a point." ] }, { @@ -261,8 +260,7 @@ "id": "shared-boxing", "metadata": {}, "source": [ - "On the $x$-axis, it plots the ratio `beta/gamma`.\n", - "On the $y$-axis, it plots the fraction of the population that's infected.\n", + "For each element of the `SweepFrame` is plots a point with the ratio `beta/gamma` as the $x$ coordinate and `metric` -- which is the fraction of the population that's infected -- as the $y$ coordinate.\n", "\n", "Here's what it looks like:" ] @@ -295,7 +293,7 @@ "source": [ "## Contact Number\n", "\n", - "From Section xxx, recall that the number of new infections in a\n", + "From Chapter 11, recall that the number of new infections in a\n", "given day is $\\beta s i N$, and the number of recoveries is\n", "$\\gamma i N$. If we divide these quantities, the result is\n", "$\\beta s / \\gamma$, which is the number of new infections per recovery\n", @@ -311,7 +309,7 @@ "metadata": {}, "source": [ "The results in the previous section suggest that there is a relationship between $c$ and the total number of infections. We can derive this relationship by analyzing the differential equations from\n", - "Section xxx:\n", + "Chapter 11:\n", "\n", "$$\\begin{aligned}\n", "\\frac{ds}{dt} &= -\\beta s i \\\\\n", @@ -779,7 +777,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -793,7 +791,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index 5cf0fb8b..6df8c173 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -853,7 +853,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -867,7 +867,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index ca0b41cc..d4d8ce57 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -331,7 +331,7 @@ "`run_and_mix` simulates both systems for the given time, `t_add`.\n", "Then it mixes them and simulates the mixture for the remaining time, `t_total - t_add`.\n", "\n", - "When `t_add` is`0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" + "When `t_add` is `0`, we add the milk immediately; when `t_add` is `30`, we add it at the end. Now we can sweep the range of values in between:" ] }, { @@ -656,7 +656,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -670,7 +670,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 7228d016..cd0d3bc0 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -160,7 +160,7 @@ "Bergman, it was \"shown to be interstitial fluid\", that is, the fluid\n", "that surrounds tissue cells. \n", "\n", - "In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve particular effects, to be found later to correspond to physical entities. One notable example is the gene (see )." + "In the history of mathematical modeling, it is common for hypothetical entities, added to models to achieve particular effects, to be found later to correspond to physical entities. One notable example is the gene, which was defined as an inheritable unit several decades before we learned that genes are encoded in DNA (see )." ] }, { @@ -318,9 +318,9 @@ "source": [ "## Interpolation\n", "\n", - "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time, $t$. But in the `DataFrame`, we only have measurements at discrete times. The solution is interpolation, which estimates the value of $I$ for values of $t$ between the measurements.\n", + "Before we are ready to implement the model, there's one problem we have to solve. In the differential equations, $I$ is a function that can be evaluated at any time $t$. But in the `DataFrame`, we have measurements only at discrete times. The solution is interpolation, which estimates the value of $I$ for values of $t$ between the measurements.\n", "\n", - "The ModSim library provides an `interpolate` function that takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", + "To interpolate the values in `I`, we can use `interpolate`, which takes a `Series` as a parameter and returns a function. That's right, I said it returns a *function*.\n", "We can call `interpolate` like this:" ] }, @@ -478,7 +478,7 @@ "In particular, notice the `kind` argument, which specifies a kind of interpolation.\n", "The default is linear interpolation, which connects the data points with straight lines.\n", "\n", - "Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " + "Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation and plot the results." ] }, { @@ -563,7 +563,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -577,7 +577,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 6af7974b..0afbc8bf 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -76,7 +76,7 @@ "id": "detected-welsh", "metadata": {}, "source": [ - "The previous chapter presents the minimal model of the glucose-insulin system and introduces a tool we will need to implement it, interpolation.\n", + "The previous chapter presents the minimal model of the glucose-insulin system and introduces a tool we need to implement it: interpolation.\n", "\n", "In this chapter, we'll implement the model two ways:\n", "\n", @@ -517,7 +517,7 @@ "id": "modified-surname", "metadata": {}, "source": [ - "`slope_func` is a little simpler than `update_func` because it only compute the derivatives, that is, the slopes. It doesn't do the updates; the solver does them for us.\n", + "`slope_func` is a little simpler than `update_func` because it computes only the derivatives, that is, the slopes. It doesn't do the updates; the solver does them for us.\n", "\n", "Now we can call `run_solve_ivp` like this:" ] @@ -680,7 +680,7 @@ "id": "electronic-navigation", "metadata": {}, "source": [ - "These differences are little bigger, especially at the beginning.\n", + "These differences are a little bigger, especially at the beginning.\n", "\n", "If we use `run_simulation` with smaller time steps, the results are more accurate, but they take longer to compute.\n", "For some problems, we can find a value of `dt` that produces accurate results in a reasonable time. However, if `dt` is *too* small, the results can be inaccurate again. So it can be tricky to get it right.\n", @@ -782,7 +782,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -796,7 +796,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index d5c7dd21..5f255895 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -280,7 +280,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -294,7 +294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index ed187056..0ce7dfe4 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -5,7 +5,7 @@ "id": "funded-utilization", "metadata": {}, "source": [ - "# Pennies" + "# The Empire State Building Strikes Back" ] }, { @@ -88,7 +88,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap20.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -704,7 +705,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -718,7 +719,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index e272f5da..240aa9a2 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -67,7 +67,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap21.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -102,7 +103,7 @@ "\n", "where\n", "\n", - "- $F_d$ is force due to drag, in newtons (N).\n", + "- $F_d$ is force due to drag, in newtons (N), which are the SI units of force. A newton is 1 kg m/s$^2$.\n", "\n", "- $\\rho$ is the density of the fluid in kg/m$^3$.\n", "\n", @@ -258,7 +259,7 @@ "metadata": {}, "source": [ "It might not be obvious why it is useful to create a `Params` object just to create a `System` object.\n", - "In fact, if we only run one simulation, it might not be useful. But it helps when we want to change or sweep the parameters.\n", + "In fact, if we run only one simulation, it might not be useful. But it helps when we want to change or sweep the parameters.\n", "\n", "For example, suppose we learn that the terminal velocity of a penny is actually closer to 20 m/s.\n", "We can make a `Params` object with the new value, and a corresponding `System` object, like this:" @@ -730,7 +731,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -744,7 +745,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index ba9b76ed..c15b45a3 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -88,7 +88,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap22.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -119,7 +120,7 @@ "\n", "However, this value *does* depend on velocity. At low velocities it\n", "might be as high as 0.5, and at high velocities as low as 0.28.\n", - "Furthermore, the transition between these regimes typically happens\n", + "Furthermore, the transition between these values typically happens\n", "exactly in the range of velocities we are interested in, between 20 m/s and 40 m/s.\n", "\n", "Nevertheless, we'll start with a simple model where the drag coefficient does not depend on velocity; as an exercise at the end of the chapter, you can implement a more detailed model and see what effect it has on the results.\n", @@ -744,7 +745,7 @@ "id": "iraqi-appeal", "metadata": {}, "source": [ - "The message in indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", + "The message indicates that a \"termination event\" occurred; that is, the simulated ball reached the ground.\n", "\n", "`results` is a `TimeFrame` with one row for each time step and one column for each of the state variables.\n", "Here are the last few rows." @@ -951,7 +952,7 @@ "\n", "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", "\n", - "The draw function should take as parameters a time stamps and a `State`. It should draw a single frame of the animation." + "The draw function should take as parameters a time stamp and a `State`. It should draw a single frame of the animation." ] }, { @@ -1091,7 +1092,7 @@ "source": [ "### Exercise 2\n", "\n", - " The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / m$^3$. How much farther would a ball hit with the same initial speed and launch angle travel?" + "The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / m$^3$. Compared with the example near sea level, how much farther would a ball travel if hit with the same initial speed and launch angle?" ] }, { @@ -1412,7 +1413,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1426,7 +1427,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 7fd7a805..3b7e9663 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -88,7 +88,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap23.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -352,7 +353,7 @@ "source": [ "## Summary\n", "\n", - "This chapter introduces an new tool, `maximize_scalar`, that provides an efficient way to search for the maximum of a function. We used it to find the launch angle that maximizes the distance a baseball flies through the air, given its initial velocity.\n", + "This chapter introduces a new tool, `maximize_scalar`, that provides an efficient way to search for the maximum of a function. We used it to find the launch angle that maximizes the distance a baseball flies through the air, given its initial velocity.\n", "\n", "If you enjoy this example, you might be interested in this paper: \"How to hit home runs: Optimum baseball bat swing parameters for maximum range trajectories\", by Sawicki, Hubbard, and Stronge, at .\n", "\n", @@ -598,7 +599,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -612,7 +613,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 91a8c07f..68cfc0aa 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -67,7 +67,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap24.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -135,7 +136,7 @@ "\n", "$$dr = k~d\\theta$$ \n", "\n", - "Where $k$ is an unknown constant we'll have to figure out. \n", + "where $k$ is an unknown constant we'll have to figure out. \n", "Again, we can divide both sides by $dt$ to get a differential equation in time:\n", "\n", "$$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$$ \n", @@ -281,7 +282,7 @@ "source": [ "## Simulating the System\n", "\n", - "The state variables we'll use are, `theta`, `y`, and `r`.\n", + "The state variables we'll use are `theta`, `y`, and `r`.\n", "Here are the initial conditions:" ] }, @@ -657,7 +658,7 @@ "metadata": {}, "source": [ "We can also use these equations to find the relationship between $y$ and $r$, independent of time, which we can use to compute $k$.\n", - "Dividing Equations 1 and 2, yields\n", + "Dividing Equations 1 and 2 yields\n", "\n", "$$\\frac{dr}{dy} = \\frac{k}{r}$$ \n", "\n", @@ -886,7 +887,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -900,7 +901,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index cc17ba05..8053abc9 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -67,7 +67,8 @@ "tags": [] }, "source": [ - "[Click here to run this chapter on Colab](https://colab.research.google.com/github/AllenDowney/ModSimPy/blob/master//chapters/chap25.ipynb)" + "This chapter is available as a Jupyter notebook where you can read the text, run the code, and work on the exercises. \n", + "Click here to access the notebooks: ." ] }, { @@ -100,7 +101,7 @@ "id": "promotional-trigger", "metadata": {}, "source": [ - "However, for the problems in this chapter, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute this product of scalar quantities:\n", + "For the problems in this chapter, however, we only need the *magnitude* of torque; we don't care about the direction. In that case, we can compute this product of scalar quantities:\n", "\n", "$$\\tau = r F \\sin \\theta$$ \n", "\n", @@ -131,8 +132,7 @@ "For a small object with mass $m$, rotating around a point at distance\n", "$r$, the moment of inertia is $I = m r^2$. For more complex objects, we can compute $I$ by dividing the object into small masses, computing\n", "moments of inertia for each mass, and adding them up.\n", - "\n", - "However, for most simple shapes, people have already done the\n", + "For most simple shapes, people have already done the\n", "calculations; you can just look up the answers. For example, see\n", "." ] @@ -934,7 +934,7 @@ "## Summary\n", "\n", "The example in this chapter demonstrates the concepts of torque, angular acceleration, and moment of inertia.\n", - "We used these concepts to simulate a turntable, using a hypothetical observation to estimating torque due to friction.\n", + "We used these concepts to simulate a turntable, using a hypothetical observation to estimate torque due to friction.\n", "As an exercise, you can finish off the example, estimating the force needed to rotate the table to a given target angle.\n", "\n", "The next chapter describes several case studies you can work on to practice the tools from the last few chapters, including projectiles, rotating objects, `root_scalar`, and `maximize_scalar`." @@ -1072,7 +1072,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1086,7 +1086,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index 758cd3c6..a5fcd00b 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -318,10 +318,26 @@ "You can download it from or run it on Colab at ." ] }, + { + "cell_type": "markdown", + "id": "professional-meeting", + "metadata": {}, + "source": [ + "## Congratulations\n", + "\n", + "With that, you have reached the end of the book, so congratulations! I\n", + "hope you enjoyed it and learned a lot. I think the tools in this book\n", + "are useful, and the ways of thinking are important, not just in\n", + "engineering and science, but in practically every field of inquiry.\n", + "\n", + "Models are the tools we use to understand the world: if you build good\n", + "models, you are more likely to get things right. Good luck!" + ] + }, { "cell_type": "code", "execution_count": null, - "id": "accompanied-southwest", + "id": "leading-paint", "metadata": {}, "outputs": [], "source": [] @@ -329,7 +345,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -343,7 +359,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb index c5f52c3d..3ccf1585 100644 --- a/chapters/chap27.ipynb +++ b/chapters/chap27.ipynb @@ -65,11 +65,20 @@ "id": "younger-bullet", "metadata": {}, "source": [ - "In this chapter we \"open the hood,\" looking more closely at how some of\n", - "the tools we have used---`run_solve_ivp`, `root_scalar`, and `maximize_scalar`---work.\n", + "In this appendix we \"open the hood,\" looking more closely at how some of\n", + "the tools we have used work: specifically, `run_solve_ivp`, `root_scalar`, and `maximize_scalar`.\n", "\n", - "Most of the time you don't need to know, which is why I left this chapter for last.\n", - "But you might be curious. And if nothing else, I have found that I can remember how to use these tools more easily because I know something about how they work." + "Most of the time you don't need to know, you can use these methods without knowing much about how they work.\n", + "But there are a few reasons you might *want* to know.\n", + "\n", + "One reason is pure curiosity. \n", + "If you use these methods, and especially if you come to rely on them, you might find it unsatisfying to treat them as black boxes. \n", + "In that case, you might enjoy opening the hood.\n", + "\n", + "Another is that these methods are not infallible; sometimes things go wrong. \n", + "If you know how they work, at least in a general sense, you might find it easier to debug them.\n", + "\n", + "And if nothing else, I have found that I can remember how to use these tools more easily because I know something about how they work." ] }, { @@ -81,7 +90,7 @@ "\n", "`run_solve_ivp` is a function in the ModSimPy library that checks for common errors in the parameters and then calls `solve_ip`, which is the function in the SciPy library that does the actual work.\n", "\n", - "By default, `solve_ivp` uses the Dormand-Prince method, which is a kind of Runge-Kutta method. You can read about it at\n", + "By default, `solve_ivp` uses the *Dormand-Prince method*, which is a kind of *Runge-Kutta method*. You can read about it at\n", ", but I'll give you a sense of\n", "it here.\n", "\n", @@ -198,7 +207,7 @@ "Now you might wonder, if `solve_ivp` ran the slope function 50 times, how did we get 101 time steps?\n", "\n", "To answer that question, we need to know more how the solver works.\n", - "There are actually three steps:\n", + "There are actually three stages:\n", "\n", "1. For each time step, `solve_ivp` evaluates the slope function seven times, with different values of `t` and `y`.\n", "\n", @@ -206,14 +215,12 @@ "\n", "3. After computing all of the time steps, it uses interpolation to compute equally spaced points that connect the estimates from the previous step.\n", "\n", - "So we can see what's happening, I will run `run_solve_ivp` with the keyword argument `dense_output=False`, which skips the interpolation step and returns time steps that are not equally spaced (that is, not \"dense\").\n", - "\n", - "While we're at it, I'll modify the slope function so that every time it runs, it adds the values of `t`, `y`, and `dydt` to a list called `evals`." + "To show the first two steps, I'll modify the slope function so that every time it runs, it adds the values of `t`, `y`, and `dydt` to a list called `evals`." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "id": "efficient-aluminum", "metadata": {}, "outputs": [], @@ -230,7 +237,8 @@ "id": "compliant-sampling", "metadata": {}, "source": [ - "Now, before we call `run_solve_ivp` again, I'll initialize `evals` with an empty list." + "Before we call `run_solve_ivp`, I'll initialize `evals` with an empty list.\n", + "And I'll use the keyword argument `dense_output=False`, which skips the interpolation step and returns time steps that are not equally spaced (that is, not \"dense\")." ] }, { @@ -264,20 +272,29 @@ }, { "cell_type": "markdown", - "id": "rapid-parks", + "id": "worth-baseline", "metadata": {}, "source": [ - "It turns out there are only eight time steps, and the first five of them only cover 0.11 seconds.\n", + "Because we skipped the interpolation step, we can see that `solve_ivp` computed only seven time steps, not including the initial condition.\n", + "Also, we see that the time steps are different sizes. \n", + "The first is only 100 microseconds, the second is about 10 times bigger, and the third is 10 times bigger than that.\n", "\n", "The time steps are not equal because the Dormand-Prince method is *adaptive*.\n", - "At each time step, it actually computes two estimates of the next\n", + "At each time step, it computes two estimates of the next\n", "value. By comparing them, it can estimate the magnitude of the error,\n", "which it uses to adjust the time step. If the error is too big, it uses\n", "a smaller time step; if the error is small enough, it uses a bigger time\n", "step. By adjusting the time step in this way, it minimizes the number\n", "of times it calls the slope function to achieve a given level of\n", "accuracy.\n", - "\n", + "In this example, it takes five steps to simulate the first second, but then only two more steps to compute the remaining two seconds." + ] + }, + { + "cell_type": "markdown", + "id": "rapid-parks", + "metadata": {}, + "source": [ "Because we saved the values of `y` and `t`, we can plot the locations where the slope function was evaluated.\n", "I'll need to use a couple of features we have not seen before, if you don't mind.\n", "\n", @@ -330,8 +347,8 @@ "id": "uniform-cable", "metadata": {}, "source": [ - "In this figure, the arrows show where the slope function was executed;\n", - "the dots show the best estimate of `y` for each time step; and the line shows the interpolation that connects the estimates.\n", + "In this figure, there are 50 arrows, one for each time the slope function was evaluated, and 8 dots, one for each time step (although several of them overlap).\n", + "The line shows the 101 points in the interpolation that connects the estimates.\n", "\n", "Notice that many of the arrows do not fall on the line; `solve_ivp` evaluated the slope function at these locations in order to compute the solution, but as it turned out, they are not part of the solution.\n", "\n", @@ -423,8 +440,7 @@ "greater than $f(x_2)$ or not.\n", "The following figure shows the two possible states.\n", "\n", - "![Possible states of a golden-section search after evaluating\n", - "$f(x_4)$](https://github.com/AllenDowney/ModSim/raw/main/figs/golden2.png)" + "![](https://github.com/AllenDowney/ModSim/raw/main/figs/golden2.png)" ] }, { @@ -453,36 +469,7 @@ "cell_type": "markdown", "id": "broken-preparation", "metadata": {}, - "source": [ - "## Chapter Review\n", - "\n", - "The information in this chapter is not strictly necessary; you can use\n", - "these methods without knowing much about how they work. But there are\n", - "two reasons you might want to know.\n", - "\n", - "One reason is pure curiosity. If you use these methods, and especially\n", - "if you come to rely on them, you might find it unsatisfying to treat\n", - "them as \"black boxes.\" At the risk of mixing metaphors, I hope you\n", - "enjoyed opening the hood.\n", - "\n", - "The other reason is that these methods are not infallible; sometimes\n", - "things go wrong. If you know how they work, at least in a general sense,\n", - "you might find it easier to debug them." - ] - }, - { - "cell_type": "markdown", - "id": "noted-interview", - "metadata": {}, - "source": [ - "With that, you have reached the end of the book, so congratulations! I\n", - "hope you enjoyed it and learned a lot. I think the tools in this book\n", - "are useful, and the ways of thinking are important, not just in\n", - "engineering and science, but in practically every field of inquiry.\n", - "\n", - "Models are the tools we use to understand the world: if you build good\n", - "models, you are more likely to get things right. Good luck!" - ] + "source": [] }, { "cell_type": "code", @@ -496,7 +483,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -510,7 +497,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" + "version": "3.7.12" } }, "nbformat": 4, From b713ed30cedcf7d1dde431186da90a2830ea7857 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 10 Jun 2022 15:39:17 -0400 Subject: [PATCH 086/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 239582 -> 240226 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 7dd8b9a7d34198fc4b21df597d6d55ff2984761d..2a72aca2aee678f8a67cc4630ab668dc721930a5 100644 GIT binary patch delta 161170 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

    s|BRs(3QjJcdnsdeNu^W_7nzDEHhwT^*wv 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 E12GVR=l}o! From 4cc77ece4bf07208415f3f2158bb99d90410e22e Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 5 Sep 2022 14:09:06 -0400 Subject: [PATCH 087/144] Adding Makefile and dev requirements --- Makefile | 108 +++++++++++++++++++++++++++++++++++++++++++ requirements-dev.txt | 4 ++ requirements.txt | 1 - 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 Makefile create mode 100644 requirements-dev.txt diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..358c4272 --- /dev/null +++ b/Makefile @@ -0,0 +1,108 @@ +.PHONY: clean data lint format requirements create_environment + +################################################################################# +# GLOBALS # +################################################################################# + +PROJECT_NAME = ModSimPy +PYTHON_VERSION = 3.10 +PYTHON_INTERPRETER = python + + +################################################################################# +# COMMANDS # +################################################################################# + + +## Set up python interpreter environment +create_environment: + conda create -y --name $(PROJECT_NAME) python=$(PYTHON_VERSION) + @echo ">>> conda env created. Activate with:\nconda activate $(PROJECT_NAME)" + + +## Install Python Dependencies +requirements: + $(PYTHON_INTERPRETER) -m pip install -U pip setuptools wheel + $(PYTHON_INTERPRETER) -m pip install -r requirements-dev.txt + + +## Lint using flake8 and black (use `make format` to do formatting) +lint: + flake8 pacs + black --check --config pyproject.toml pacs + + +## Format source code with black +format: + black --config pyproject.toml pacs + + +## Delete all compiled Python files +clean: + find . -type f -name "*.py[co]" -delete + find . -type d -name "__pycache__" -delete + + + +################################################################################# +# Self Documenting Commands # +################################################################################# + +.DEFAULT_GOAL := help + +# Inspired by +# sed script explained: +# /^##/: +# * save line in hold space +# * purge line +# * Loop: +# * append newline + line to hold space +# * go to next line +# * if line starts with doc comment, strip comment character off and loop +# * remove target prerequisites +# * append hold space (+ newline) to line +# * replace newline plus comments by `---` +# * print line +# Separate expressions are necessary because labels cannot be delimited by +# semicolon; see +.PHONY: help +help: + @echo "$$(tput bold)Available rules:$$(tput sgr0)" + @echo + @sed -n -e "/^## / { \ + h; \ + s/.*//; \ + :doc" \ + -e "H; \ + n; \ + s/^## //; \ + t doc" \ + -e "s/:.*//; \ + G; \ + s/\\n## /---/; \ + s/\\n/ /g; \ + p; \ + }" ${MAKEFILE_LIST} \ + | LC_ALL='C' sort --ignore-case \ + | awk -F '---' \ + -v ncol=$$(tput cols) \ + -v indent=19 \ + -v col_on="$$(tput setaf 6)" \ + -v col_off="$$(tput sgr0)" \ + '{ \ + printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ + n = split($$2, words, " "); \ + line_length = ncol - indent; \ + for (i = 1; i <= n; i++) { \ + line_length -= length(words[i]) + 1; \ + if (line_length <= 0) { \ + line_length = ncol - indent - length(words[i]) - 1; \ + printf "\n%*s ", -indent, " "; \ + } \ + printf "%s ", words[i]; \ + } \ + printf "\n"; \ + }' \ + | more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars') + + diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..5b829f89 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,4 @@ +pandoc +jupyter-book +ghp-import +nbformat diff --git a/requirements.txt b/requirements.txt index cd11ff06..40465b84 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,5 +11,4 @@ html5lib beautifulsoup4 tables yapf -pip modsimpy From 19d11341d00206695480e2de4d4095c9e01967a2 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 5 Sep 2022 14:09:32 -0400 Subject: [PATCH 088/144] Adding Makefile and dev requirements --- requirements-dev.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 5b829f89..fd2b2219 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,3 @@ pandoc jupyter-book ghp-import -nbformat From d23d565300e4395fcd0e5e535d446b229215aa93 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 5 Sep 2022 14:33:31 -0400 Subject: [PATCH 089/144] Updating chapters --- chapters/chap02.ipynb | 9 ++++----- chapters/chap05.ipynb | 3 --- chapters/chap07.ipynb | 2 +- chapters/chap22.ipynb | 23 ++++++++++++++++++++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index d6c54436..a142d5b8 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -127,13 +127,12 @@ "id": "living-wayne", "metadata": {}, "source": [ - "The expressions in parentheses are *keyword arguments*.\n", - "They create two variables, `olin` and `wellesley`, and give them values.\n", - "Then we call the `State` function.\n", - "The result is a `State` object, which is a collection of *state variables*.\n", + "The equations in parentheses create two variables, `olin` and `wellesley`, and give them the values `10` and `2`.\n", + "The `State` function stores these variables and their values in a `State` object, which gets assigned to a new variable named `bikeshare`.\n", "\n", + "Variables stored inside a `State` object are called *state variables*.\n", "In this example, the state variables represent the number of\n", - "bikes at each location. The initial values are `10` and `2`, indicating that there are 10 bikes at Olin and 2 at Wellesley. \n", + "bikes at each location. Their values indicate that there are 10 bikes at Olin and 2 at Wellesley. \n", "\n", "The `State` object is assigned to a new variable named `bikeshare`.\n", "We can get the value of a variable in a `State` object using the *dot operator*, like this:" diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index 0e1bd458..f0c280f8 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -756,9 +756,6 @@ "id": "expired-salmon", "metadata": {}, "source": [ - "In this example, I use the keyword arguments `time` and `quantity` to give names to the index and the values.\n", - "These names don't affect the computation, but they appear when we display or plot the `TimeSeries`.\n", - "\n", "We can set the first value in the new `TimeSeries` like this." ] }, diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index 8a89f9a3..2c6b2efd 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -657,7 +657,7 @@ " return K\n", " \n", "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys1)\n", + "carrying_capacity(sys1) # WRONG\n", "print(K)\n", "```" ] diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index c15b45a3..09f59fc2 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -951,7 +951,6 @@ "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", "\n", "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", - "\n", "The draw function should take as parameters a time stamp and a `State`. It should draw a single frame of the animation." ] }, @@ -987,7 +986,9 @@ "\n", "```\n", "animate(results, draw_func)\n", - "```" + "```\n", + "\n", + "You can see the results when you run the code from this chapter." ] }, { @@ -1012,6 +1013,22 @@ "# animate(results, draw_func)" ] }, + { + "cell_type": "markdown", + "id": "3bede5d5", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This chapter introduces `Vector` objects, which we use to represent position, velocity, and acceleration in two dimensions.\n", + "We also represent forces using vectors, which make it easier to add up forces acting in different directions.\n", + "\n", + "Our ODE solver doesn't work with `Vector` objects, so it takes some work to pack and unpack their components.\n", + "Nevertheless, we were able to run simulations with vectors and display the results.\n", + "\n", + "In the next chapter we'll use these simulations to solve an optimization problem." + ] + }, { "cell_type": "markdown", "id": "lyric-harassment", @@ -1427,7 +1444,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.4" } }, "nbformat": 4, From 8d7274f010d865a70e5f81fb514fb6bca69be052 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 5 Sep 2022 14:33:31 -0400 Subject: [PATCH 090/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240226 -> 240360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 2a72aca2aee678f8a67cc4630ab668dc721930a5..ba4a3e5bab94478eb6d4f6a405567f31a64fa098 100644 GIT binary patch delta 21044 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 delta 21173 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 Bt8f4S From 4ad186d73a7219cd1eb336bfdaf82906fa2b9f9e Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 5 Sep 2022 14:57:04 -0400 Subject: [PATCH 091/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240360 -> 240360 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index ba4a3e5bab94478eb6d4f6a405567f31a64fa098..4897783c8a067e127b7c1ffee7a2544f42878c73 100644 GIT binary patch delta 1258 zcmZ9KUr3Wt7{7=x_x``>^V%D72d*o;}sx zrp#~eQzfbWv=7Xr`9h6GcFun6Yj;>wc-9+1NpoJ(U7hWAdmHiY$!s-SeVfaTc1Z#*vp{AyS_%nxhOdLq#M8-;t=q+cvZAeaHta2|ZGDRyZ89s=P@EJeL(K@gG)}RI6 z@zsqAZS1_fF0@GJ$|U0ox@@9vynhRoLI+k{0mR;H3~2Q^o&KQH&OvQ{NULuSY3(MR z4(fEyZEgO#POs{8&9FBARHrjWw7yrT!#Z6xs?AU7w0uYFck1+Koj!V3n;+NdxG}AN YR;TCw(@MiV6r;QufhJNmj>cpE0cS|Mvj6}9 delta 1376 zcmZY8Ur19?90%}w&RM$I-ED4jTgG&>ViQ9o`ZKBr?JsJ7+(WP)B6K4tdq`R$)?RWT zE{$a1HFLRgU{7N1;T9DnDE(m%NgCCh5~NI@EcGFU(aybhdG9@MKR$eazkBZQo|~Rw z(lZQQUx!piilWq1rN4(hsM@SDd08+H4KF;i4p`|AA96}Ce$UC-upX_EYDZ1Eg{k!K zy%_Y_7p96Ss`+XdOj^UK26}7YSYxsnx2En&Tgw9Hc42Mplj=mDrwD7wh*YnSbegcP zPl(!_fyVgpNx)}7eXUYQ^8fsRt_Z`)`nXtLlLi80v>OB~$dpV^&|`S%1s{2Av`Imheb%ICn85zoo| zk$K%JP?@p23!rp2kph^oV{fX+IX~xR1-z`sZmyQOuNsEhkTfA@qsp#PLX1z9nN~t(38{Lf b?1~Yh9#Up*5b{|nI`-2bWVn+t6wCVuoOA1v From f8e73b9040b11504fe17d429e6c38e732ea3bc23 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 30 Sep 2022 20:01:25 -0400 Subject: [PATCH 092/144] Updates --- environment.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/environment.yml b/environment.yml index d3445ea7..56d42fc4 100644 --- a/environment.yml +++ b/environment.yml @@ -1,13 +1,11 @@ name: ModSimPy channels: - conda-forge - - defaults dependencies: - - python=3.7 + - python - jupyter - numpy - matplotlib - - seaborn - pandas - scipy - pint @@ -16,7 +14,8 @@ dependencies: - html5lib - beautifulsoup4 - pytables - - yapf - pip - - pip: - - modsimpy + +# pip install pytest nbmake +# pip install jupyter-book ghp-import +# pip install pypandoc fastdoc From 8c0a1f1e0c7acfa2a145ed5fd4fa60e92499ba92 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 30 Sep 2022 20:06:34 -0400 Subject: [PATCH 093/144] Setting rcParams and dtypes --- modsim.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modsim.py b/modsim.py index 02bdb103..0af5c309 100644 --- a/modsim.py +++ b/modsim.py @@ -19,6 +19,11 @@ import inspect import matplotlib.pyplot as plt + +plt.rcParams['figure.dpi'] = 75 +plt.rcParams['savefig.dpi'] = 300 +plt.rcParams['figure.figsize'] = 6, 4 + import numpy as np import pandas as pd import scipy @@ -656,9 +661,10 @@ def make_series(x, y, **options): def TimeSeries(*args, **kwargs): - """ + """Make a pd.Series object to represent a time series. """ if args or kwargs: + underride(kwargs, dtype=float) series = pd.Series(*args, **kwargs) else: series = pd.Series([], dtype=np.float64) @@ -670,9 +676,10 @@ def TimeSeries(*args, **kwargs): def SweepSeries(*args, **kwargs): - """ + """Make a pd.Series object to store results from a parameter sweep. """ if args or kwargs: + underride(kwargs, dtype=float) series = pd.Series(*args, **kwargs) else: series = pd.Series([], dtype=np.float64) From b358869e8ac6f6f90ada9dbc7015a207bc19b10f Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 30 Sep 2022 20:09:44 -0400 Subject: [PATCH 094/144] Updating chapters --- chapters/chap01.ipynb | 4 +- chapters/chap02.ipynb | 104 +++++++++++++++++++++--------------------- chapters/chap03.ipynb | 8 ++-- chapters/chap04.ipynb | 6 +-- chapters/chap05.ipynb | 8 ++-- chapters/chap06.ipynb | 52 ++++++++++----------- chapters/chap07.ipynb | 32 ++++++------- chapters/chap08.ipynb | 82 ++++++++++++++++----------------- chapters/chap09.ipynb | 5 +- chapters/chap10.ipynb | 30 ++++++------ chapters/chap14.ipynb | 6 +-- chapters/chap15.ipynb | 66 +++++++++++++-------------- chapters/chap16.ipynb | 54 +++++++++++----------- chapters/chap17.ipynb | 8 ++-- chapters/chap18.ipynb | 4 +- chapters/chap19.ipynb | 4 +- chapters/chap23.ipynb | 52 ++++++++++----------- chapters/chap25.ipynb | 10 ++-- chapters/chap27.ipynb | 38 ++++++--------- 19 files changed, 282 insertions(+), 291 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 3f4722ec..9d0da03b 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -919,7 +919,7 @@ "\n", "Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", + "Define a variable named `foot` that contains the unit `foot` provided by the `UnitRegistry` we called `units`. Define a variable named `pole_height` and give it the value 10 feet.\n", "\n", "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" ] @@ -1335,7 +1335,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index a142d5b8..f1fc36d1 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -114,7 +114,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "incorrect-comparison", "metadata": {}, "outputs": [], @@ -140,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "brief-diversity", "metadata": {}, "outputs": [], @@ -158,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "designed-brazilian", "metadata": {}, "outputs": [], @@ -176,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "impaired-potter", "metadata": {}, "outputs": [], @@ -204,7 +204,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "basic-fabric", "metadata": { "tags": [] @@ -235,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "floppy-trainer", "metadata": {}, "outputs": [], @@ -255,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "hungarian-bride", "metadata": {}, "outputs": [], @@ -286,7 +286,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "vertical-drawing", "metadata": {}, "outputs": [], @@ -306,7 +306,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "significant-nutrition", "metadata": {}, "outputs": [], @@ -337,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "moving-jurisdiction", "metadata": {}, "outputs": [], @@ -357,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "proper-symposium", "metadata": {}, "outputs": [], @@ -376,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "identical-yacht", "metadata": {}, "outputs": [], @@ -409,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "heavy-patrol", "metadata": {}, "outputs": [], @@ -430,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "french-preference", "metadata": {}, "outputs": [], @@ -451,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "alternative-keyboard", "metadata": {}, "outputs": [], @@ -469,12 +469,12 @@ "them.\n", "\n", "Print statements are useful for debugging functions. For example, we can\n", - "add a print statement to `move_bike`, like this:" + "add a print statement to `bike_to_wellesley`, like this:" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "robust-holly", "metadata": {}, "outputs": [], @@ -501,7 +501,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "fifteen-atmosphere", "metadata": {}, "outputs": [], @@ -522,7 +522,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "matched-narrow", "metadata": {}, "outputs": [], @@ -556,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 22, "id": "29c1f41a", "metadata": { "tags": [] @@ -570,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 23, "id": "illegal-metropolitan", "metadata": {}, "outputs": [], @@ -599,7 +599,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 24, "id": "excessive-murder", "metadata": {}, "outputs": [], @@ -626,7 +626,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 25, "id": "fundamental-nursing", "metadata": {}, "outputs": [], @@ -652,7 +652,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 26, "id": "twenty-health", "metadata": {}, "outputs": [], @@ -673,7 +673,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 27, "id": "played-character", "metadata": {}, "outputs": [], @@ -692,7 +692,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 28, "id": "ecological-colon", "metadata": {}, "outputs": [], @@ -715,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 29, "id": "mediterranean-german", "metadata": {}, "outputs": [], @@ -749,7 +749,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 30, "id": "hollywood-shopping", "metadata": {}, "outputs": [], @@ -773,7 +773,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 31, "id": "buried-alert", "metadata": {}, "outputs": [], @@ -794,7 +794,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 32, "id": "recognized-denmark", "metadata": {}, "outputs": [], @@ -832,7 +832,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 33, "id": "polish-river", "metadata": {}, "outputs": [], @@ -868,19 +868,19 @@ "id": "breeding-groove", "metadata": {}, "source": [ - "## Timeseries\n", + "## TimeSeries\n", "\n", - "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of time stamps and a\n", + "When we run a simulation, we often want to save the results for later analysis. The ModSim library provides a `TimeSeries` object for this purpose. A `TimeSeries` contains a sequence of timestamps and a\n", "corresponding sequence of quantities.\n", "\n", - "In this example, the time stamps are integers representing minutes and the quantities are the number of bikes at one location.\n", + "In this example, the timestamps are integers representing minutes and the quantities are the number of bikes at one location.\n", "\n", "Since we have moved a number of bikes around, let's start again with a new `State` object." ] }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 34, "id": "every-consultation", "metadata": {}, "outputs": [], @@ -898,7 +898,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 35, "id": "changing-planet", "metadata": {}, "outputs": [], @@ -916,7 +916,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 36, "id": "aquatic-richardson", "metadata": {}, "outputs": [], @@ -929,14 +929,14 @@ "id": "searching-funeral", "metadata": {}, "source": [ - "The number in brackets is the time stamp, also called a *label*.\n", + "The number in brackets is the timestamp, also called a *label*.\n", "\n", "We can use a `TimeSeries` inside a for loop to store the results of the simulation:" ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 37, "id": "english-titanium", "metadata": {}, "outputs": [], @@ -954,12 +954,12 @@ "source": [ "Each time through the loop, we print the value of `i` and call `step`, which updates `bikeshare`.\n", "Then we store the number of bikes at Olin in `results`. \n", - "We use the loop variable, `i`, to compute the time stamp, `i+1`.\n", + "We use the loop variable, `i`, to compute the timestamp, `i+1`.\n", "\n", - "The first time through the loop, the value of `i` is `0`, so the time stamp is `1`.\n", - "The last time, the value of `i` is `2`, so the time stamp is `3`.\n", + "The first time through the loop, the value of `i` is `0`, so the timestamp is `1`.\n", + "The last time, the value of `i` is `2`, so the timestamp is `3`.\n", "\n", - "When the loop exits, `results` contains 4 time stamps, from 0 through\n", + "When the loop exits, `results` contains 4 timestamps, from 0 through\n", "3, and the number of bikes at Olin at the end of each time step.\n", "\n", "We can display the `TimeSeries` like this:" @@ -967,7 +967,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 38, "id": "indonesian-singing", "metadata": {}, "outputs": [], @@ -980,7 +980,7 @@ "id": "small-encoding", "metadata": {}, "source": [ - "The left column is the time stamps; the right column is the quantities." + "The left column is the timestamps; the right column is the quantities." ] }, { @@ -996,14 +996,14 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 39, "id": "saved-hands", "metadata": {}, "outputs": [], "source": [ "results.plot()\n", "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", + "decorate(title='Olin-Wellesley bikeshare',\n", " xlabel='Time step (min)', \n", " ylabel='Number of bikes')" ] @@ -1177,7 +1177,7 @@ "id": "digital-stretch", "metadata": {}, "source": [ - "`decorate` is based on Matplotlib, which is a widely-used plotting library for Python. Matplotlib provides separate functions for `title`, `xlabel`, and `ylabel`.\n", + "`decorate` is based on Matplotlib, which is a widely used plotting library for Python. Matplotlib provides separate functions for `title`, `xlabel`, and `ylabel`.\n", "`decorate` makes them a little easier to use.\n", "For the list of keyword arguments you can pass to `decorate`, see .\n", "\n", @@ -1222,7 +1222,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 0afd2830..dbb7f229 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -86,7 +86,7 @@ "more wrong than others.\" This chapter demonstrates the process we\n", "use to make models less wrong.\n", "\n", - "As an example, we'll review the bikeshare model from the previous\n", + "As an example, we'll review the bike share model from the previous\n", "chapter, consider its strengths and weaknesses, and gradually improve\n", "it. We'll also see ways to use the model to understand the behavior of\n", "the system and evaluate designs intended to make it work better." @@ -374,7 +374,7 @@ "source": [ "The first line checks whether the number of bikes at Wellesley is zero. If so, it uses a *return statement*, which causes the function to end immediately, without running the rest of the statements. So if there are no bikes at Wellesley, we return from `bike_to_olin` without changing the state.\n", "\n", - "We can test it by initializing the state with no bikes at Wellesley And calling `bike_to_olin`." + "We can test it by initializing the state with no bikes at Wellesley and calling `bike_to_olin`." ] }, { @@ -421,7 +421,7 @@ "source": [ "## Comparison Operators\n", "\n", - "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True`, if they are equal, and `False` otherwise.\n", + "The updated version of `bike_to_olin` uses the equals operator, `==`, which compares two values and returns `True` if they are equal, and `False` otherwise.\n", "\n", "It is easy to confuse the equals operator with the assignment operator, `=`, which assigns a value to a variable. For example, the following statement creates a variable, `x`, if it doesn't already exist, and gives it the value `5`." ] @@ -848,7 +848,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index 44186d1e..20361f9d 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -513,7 +513,7 @@ "source": [ "sweep.plot(label='Olin', color='C1')\n", "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", + "decorate(title='Olin-Wellesley bikeshare',\n", " xlabel='Customer rate at Olin (p1 in customers/min)', \n", " ylabel='Number of unhappy customers at Olin')" ] @@ -528,7 +528,7 @@ "I use a different color for `SweepSeries` to remind us that it is not a `TimeSeries`.\n", "\n", "When the arrival rate at Olin is low, there are plenty of bikes and no unhappy customers.\n", - "As the arrival rate increases, we are more likely to run out of bikes and the number of unhappy customers increases. The line is jagged because the simulation is based on random numbers. Sometime we get lucky and there are relatively few unhappy customers; other times we are unlucky and there are more. " + "As the arrival rate increases, we are more likely to run out of bikes and the number of unhappy customers increases. The line is jagged because the simulation is based on random numbers. Sometimes we get lucky and there are relatively few unhappy customers; other times we are unlucky and there are more. " ] }, { @@ -880,7 +880,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index f0c280f8..3f630bb1 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -89,7 +89,7 @@ "decades, I am happy to report that those predictions were wrong.\n", "\n", "But world population growth is still a topic of concern, and it is an\n", - "open question how many people the earth can sustain while maintaining\n", + "open question how many people Earth can sustain while maintaining\n", "and improving our quality of life.\n", "\n", "In this chapter and the next, we use tools from the previous chapters to model world population growth since 1950 and generate predictions for the next 50-100 years.\n", @@ -368,7 +368,7 @@ " census.plot(style=':', label='US Census')\n", " un.plot(style='--', label='UN DESA')\n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)') " + " ylabel='World population (billions)') " ] }, { @@ -811,7 +811,7 @@ "id": "signed-colleague", "metadata": {}, "source": [ - "The values of `t` go from from `t_0` to `t_end`, including the first but not the last.\n", + "The values of `t` go from `t_0` to `t_end`, including the first but not the last.\n", "\n", "Inside the loop, we compute the population for the next year by adding the population for the current year and `annual_growth`. \n", "\n", @@ -984,7 +984,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index 5dc999b5..058a6412 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -98,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "critical-addition", "metadata": { "tags": [] @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "id": "naughty-swing", "metadata": { "tags": [] @@ -166,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "id": "numerous-university", "metadata": {}, "outputs": [], @@ -196,7 +196,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 7, "id": "colonial-domestic", "metadata": {}, "outputs": [], @@ -223,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "id": "floral-routine", "metadata": {}, "outputs": [], @@ -241,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 9, "id": "pacific-challenge", "metadata": {}, "outputs": [], @@ -269,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "id": "electoral-breach", "metadata": {}, "outputs": [], @@ -287,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 11, "id": "peripheral-cassette", "metadata": {}, "outputs": [], @@ -309,14 +309,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 12, "id": "capable-diana", "metadata": {}, "outputs": [], "source": [ "results1.plot(label='model', color='gray')\n", "plot_estimates()\n", - "decorate(title='Constant Growth Model')" + "decorate(title='Constant growth model')" ] }, { @@ -349,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 13, "id": "laughing-wesley", "metadata": {}, "outputs": [], @@ -381,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 14, "id": "wired-brief", "metadata": {}, "outputs": [], @@ -400,7 +400,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 15, "id": "looking-trace", "metadata": {}, "outputs": [], @@ -408,7 +408,7 @@ "results2 = run_simulation2(system)\n", "results2.plot(label='model', color='gray')\n", "plot_estimates()\n", - "decorate(title='Proportional Growth Model')" + "decorate(title='Proportional growth model')" ] }, { @@ -442,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 16, "id": "handmade-permit", "metadata": {}, "outputs": [], @@ -466,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 17, "id": "civilian-accused", "metadata": { "tags": [] @@ -499,7 +499,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 18, "id": "wicked-seeking", "metadata": {}, "outputs": [], @@ -533,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "id": "impressive-model", "metadata": {}, "outputs": [], @@ -554,7 +554,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 20, "id": "familiar-helena", "metadata": {}, "outputs": [], @@ -573,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 21, "id": "independent-effectiveness", "metadata": {}, "outputs": [], @@ -628,7 +628,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 22, "id": "minus-recommendation", "metadata": { "scrolled": false @@ -640,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 23, "id": "headed-amsterdam", "metadata": {}, "outputs": [], @@ -650,7 +650,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 24, "id": "preliminary-carnival", "metadata": {}, "outputs": [], @@ -694,7 +694,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index 2c6b2efd..e463dcaf 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -81,7 +81,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "affiliated-eleven", "metadata": { "tags": [] @@ -162,7 +162,7 @@ " census.plot(style=':', label='US Census')\n", " un.plot(style='--', label='UN DESA')\n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)') " + " ylabel='World population (billions)') " ] }, { @@ -295,7 +295,7 @@ "source": [ "results.plot(color='gray', label='model')\n", "plot_estimates()\n", - "decorate(title='Quadratic Growth Model')" + "decorate(title='Quadratic growth model')" ] }, { @@ -307,7 +307,7 @@ "\n", "It is not entirely surprising that the quadratic model fits better than the\n", "constant and proportional models, because it has two parameters we can\n", - "choose where the other models have only one. In general, the more\n", + "choose, where the other models have only one. In general, the more\n", "parameters you have to play with, the better you should expect the model\n", "to fit.\n", "\n", @@ -399,7 +399,7 @@ "\n", "decorate(xlabel='Population (billions)',\n", " ylabel='Net growth (billions)',\n", - " title='Net Growth vs. Population')" + " title='Net growth vs. population')" ] }, { @@ -440,7 +440,7 @@ "$$\\Delta p = \\alpha p + \\beta p^2$$ \n", "\n", "where $\\alpha$ and $\\beta$ are the parameters of the model. \n", - "If we rewrite the right hand side like this: \n", + "If we rewrite the right-hand side like this: \n", "\n", "$$\\Delta p = p (\\alpha + \\beta p)$$ \n", "\n", @@ -450,7 +450,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "ordinary-honolulu", "metadata": {}, "outputs": [], @@ -513,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "realistic-opinion", "metadata": {}, "outputs": [], @@ -545,7 +545,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "marine-entry", "metadata": {}, "outputs": [], @@ -579,7 +579,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "moving-brazil", "metadata": {}, "outputs": [], @@ -622,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "sacred-physiology", "metadata": {}, "outputs": [], @@ -701,7 +701,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "stretch-check", "metadata": {}, "outputs": [], @@ -711,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "tender-treat", "metadata": {}, "outputs": [], @@ -721,7 +721,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "passive-certificate", "metadata": {}, "outputs": [], @@ -747,7 +747,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "agricultural-burke", "metadata": {}, "outputs": [], @@ -781,7 +781,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index dafd3e12..d93ef6a4 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "necessary-factor", "metadata": { "tags": [] @@ -102,7 +102,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "changed-desktop", "metadata": { "tags": [] @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "metallic-inventory", "metadata": { "tags": [] @@ -144,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "measured-arthur", "metadata": { "tags": [] @@ -157,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "cutting-financing", "metadata": { "tags": [] @@ -170,7 +170,7 @@ " census.plot(style=':', label='US Census')\n", " un.plot(style='--', label='UN DESA')\n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)') " + " ylabel='World population (billions)') " ] }, { @@ -206,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "indirect-russia", "metadata": {}, "outputs": [], @@ -225,7 +225,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "comfortable-compression", "metadata": {}, "outputs": [], @@ -250,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "broken-windsor", "metadata": {}, "outputs": [], @@ -268,7 +268,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "latest-function", "metadata": {}, "outputs": [], @@ -286,15 +286,15 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "portable-pottery", "metadata": {}, "outputs": [], "source": [ "results.plot(color='gray', label='model')\n", "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Quadratic Model Projection')" + " ylabel='World population (billions)',\n", + " title='Quadratic model projection')" ] }, { @@ -356,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "20e6f166", "metadata": {}, "outputs": [], @@ -374,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "headed-tuner", "metadata": {}, "outputs": [], @@ -392,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "precious-contribution", "metadata": {}, "outputs": [], @@ -411,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "paperback-delay", "metadata": {}, "outputs": [], @@ -428,7 +428,7 @@ " un_proj.plot(style='--', label='UN DESA')\n", " \n", " decorate(xlabel='Year', \n", - " ylabel='World population (billion)')" + " ylabel='World population (billions)')" ] }, { @@ -441,14 +441,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "billion-dynamics", "metadata": {}, "outputs": [], "source": [ - "plot_projections(table3)\n", "results.plot(color='gray', label='model')\n", - "decorate(title='Quadratic Model Projection')" + "plot_projections(table3)\n", + "decorate(title='Quadratic model projection, with UN and Census')" ] }, { @@ -504,7 +504,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "handmade-funeral", "metadata": {}, "outputs": [], @@ -525,7 +525,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "objective-accused", "metadata": {}, "outputs": [], @@ -544,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "unique-matrix", "metadata": {}, "outputs": [], @@ -556,7 +556,7 @@ " alpha_un = un.diff() / un\n", " alpha_un.plot(style='.', label='UN DESA')\n", "\n", - " decorate(xlabel='Year', label='Net growth rate')" + " decorate(xlabel='Year', ylabel='Net growth rate')" ] }, { @@ -570,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "pressing-proceeding", "metadata": {}, "outputs": [], @@ -591,7 +591,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "mexican-denver", "metadata": {}, "outputs": [], @@ -612,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "addressed-worker", "metadata": {}, "outputs": [], @@ -631,7 +631,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "cathedral-shakespeare", "metadata": {}, "outputs": [], @@ -665,7 +665,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "common-april", "metadata": {}, "outputs": [], @@ -675,7 +675,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "ignored-chain", "metadata": {}, "outputs": [], @@ -685,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 28, "id": "color-accountability", "metadata": {}, "outputs": [], @@ -695,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 29, "id": "numeric-raise", "metadata": {}, "outputs": [], @@ -705,7 +705,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 30, "id": "included-vehicle", "metadata": {}, "outputs": [], @@ -715,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 31, "id": "brown-rating", "metadata": {}, "outputs": [], @@ -725,7 +725,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "id": "laughing-cylinder", "metadata": {}, "outputs": [], @@ -735,7 +735,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "id": "personalized-parking", "metadata": {}, "outputs": [], @@ -769,7 +769,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index d04ff587..26e145d2 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -383,8 +383,7 @@ "WolframAlpha, but they have some other advantages.\n", "\n", "To use it, we'll define `Symbol` objects that represent names of variables and functions.\n", - "The `symbols` function takes a string and returns `Symbol` objects.\n", - "So if we run this assignment:" + "The `symbols` function takes a string and returns `Symbol` objects." ] }, { @@ -1104,7 +1103,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 76c63317..f35a6820 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "formal-context", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "progressive-typing", "metadata": { "tags": [] @@ -93,7 +93,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "usual-penguin", "metadata": { "tags": [] @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "thick-lincoln", "metadata": { "tags": [] @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "conscious-orange", "metadata": { "tags": [] @@ -147,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "thick-blanket", "metadata": { "tags": [] @@ -170,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "ranking-prescription", "metadata": { "tags": [] @@ -193,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "metallic-offense", "metadata": { "scrolled": false, @@ -228,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "solar-action", "metadata": {}, "outputs": [], @@ -250,7 +250,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "rural-express", "metadata": { "tags": [] @@ -266,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "preceding-sheep", "metadata": { "tags": [] @@ -279,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "together-jackson", "metadata": {}, "outputs": [], @@ -289,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "simple-verse", "metadata": { "scrolled": true @@ -337,7 +337,7 @@ "You can download it from or run it on Colab at .\n", "\n", "As always, you should practice incremental development: write no more\n", - "than one or two lines of code a time, and test as you go!" + "than one or two lines of code at a time, and test as you go!" ] }, { @@ -417,7 +417,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index 59533809..f8283be9 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -260,7 +260,7 @@ "id": "shared-boxing", "metadata": {}, "source": [ - "For each element of the `SweepFrame` is plots a point with the ratio `beta/gamma` as the $x$ coordinate and `metric` -- which is the fraction of the population that's infected -- as the $y$ coordinate.\n", + "For each element of the `SweepFrame` it plots a point with the ratio `beta/gamma` as the $x$ coordinate and `metric` -- which is the fraction of the population that's infected -- as the $y$ coordinate.\n", "\n", "Here's what it looks like:" ] @@ -336,7 +336,7 @@ "id": "noticed-mouse", "metadata": {}, "source": [ - "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$ and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." + "Dividing one differential equation by another is not an obvious move, but in this case it is useful because it gives us a relationship between $i$, $s$, and $c$ that does not depend on time. From that relationship, we can derive an equation that relates $c$ to the final value of $s$. In theory, this equation makes it possible to infer $c$ by observing the course of an epidemic." ] }, { @@ -791,7 +791,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index 6df8c173..92d125d9 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "dependent-monitoring", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "continental-decrease", "metadata": { "tags": [] @@ -140,7 +140,7 @@ "\n", "$$Q = C~\\Delta T$$ \n", "\n", - "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is resulting change in temperature, and $C$ is the object's *thermal mass*, which is a property of the object that determines how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." + "where $Q$ is the amount of heat transferred to an object, $\\Delta T$ is the resulting change in temperature, and $C$ is the object's *thermal mass*, which is a property of the object that determines how much energy it takes to heat or cool it. In SI units, thermal mass is measured in joules per degree Celsius (J/°C)." ] }, { @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "incredible-greeting", "metadata": { "tags": [] @@ -281,13 +281,13 @@ "id": "gross-appeal", "metadata": {}, "source": [ - "In addition to the parameters, `make_system` sets the temperature of the environment, `T_env`, the initial time stamp, `t_0`, and the time step, `dt`, which we will use use to simulate the cooling process.\n", + "In addition to the parameters, `make_system` sets the temperature of the environment, `T_env`, the initial time stamp, `t_0`, and the time step, `dt`, which we will use to simulate the cooling process.\n", "Here's a `System` object that represents the coffee." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "fuzzy-support", "metadata": {}, "outputs": [], @@ -318,7 +318,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "tight-baptist", "metadata": { "tags": [] @@ -340,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "fiscal-artwork", "metadata": {}, "outputs": [], @@ -360,7 +360,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "cardiac-independence", "metadata": { "tags": [] @@ -388,7 +388,7 @@ "id": "together-adapter", "metadata": {}, "source": [ - "There are a two things here that are different from previous versions of `run_simulation`.\n", + "There are two things here that are different from previous versions of `run_simulation`.\n", "\n", "First, we use `linrange` to make an array of values from `t_0` to `t_end` with time step `dt`.\n", "`linrange` is similar to `linspace`; they both take a start value and an end value and return an array of equally spaced values.\n", @@ -417,7 +417,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "numerous-metabolism", "metadata": {}, "outputs": [], @@ -436,7 +436,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "infectious-carolina", "metadata": {}, "outputs": [], @@ -454,7 +454,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "accompanied-melbourne", "metadata": {}, "outputs": [], @@ -474,14 +474,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "important-constitution", "metadata": {}, "outputs": [], "source": [ "results.plot(label='coffee')\n", "\n", - "decorate(xlabel='Time (minute)',\n", + "decorate(xlabel='Time (min)',\n", " ylabel='Temperature (C)',\n", " title='Coffee Cooling')" ] @@ -496,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "absolute-desire", "metadata": {}, "outputs": [], @@ -509,7 +509,7 @@ "id": "light-carpet", "metadata": {}, "source": [ - "To find the value of `r` where the final temperature is precisely 70 °C, we could proceed by by trial and error, but it is more efficient to use a root-finding algorithm." + "To find the value of `r` where the final temperature is precisely 70 °C, we could proceed by trial and error, but it is more efficient to use a root-finding algorithm." ] }, { @@ -531,7 +531,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "id": "small-shark", "metadata": {}, "outputs": [], @@ -550,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "id": "defensive-content", "metadata": {}, "outputs": [], @@ -570,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "id": "behind-perth", "metadata": {}, "outputs": [], @@ -588,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "id": "following-sentence", "metadata": {}, "outputs": [], @@ -620,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "id": "genetic-compound", "metadata": {}, "outputs": [], @@ -645,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "french-financing", "metadata": {}, "outputs": [], @@ -664,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "id": "excellent-fellow", "metadata": {}, "outputs": [], @@ -684,7 +684,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "id": "french-decline", "metadata": {}, "outputs": [], @@ -707,7 +707,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "id": "afraid-ordering", "metadata": {}, "outputs": [], @@ -727,7 +727,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "derived-annual", "metadata": {}, "outputs": [], @@ -783,7 +783,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "id": "committed-angel", "metadata": {}, "outputs": [], @@ -793,7 +793,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "id": "military-military", "metadata": {}, "outputs": [], @@ -813,7 +813,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 25, "id": "agreed-excuse", "metadata": {}, "outputs": [], @@ -823,7 +823,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 26, "id": "defined-nudist", "metadata": {}, "outputs": [], @@ -833,7 +833,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 27, "id": "loose-rehabilitation", "metadata": {}, "outputs": [], @@ -867,7 +867,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index d4d8ce57..562342c3 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "british-place", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "determined-volunteer", "metadata": { "tags": [] @@ -73,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "fossil-moisture", "metadata": { "tags": [] @@ -86,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "cutting-scale", "metadata": { "tags": [] @@ -160,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 5, "id": "extensive-happening", "metadata": {}, "outputs": [], @@ -209,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "id": "polyphonic-specialist", "metadata": {}, "outputs": [], @@ -228,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 7, "id": "subtle-donna", "metadata": {}, "outputs": [], @@ -247,7 +247,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 8, "id": "domestic-tours", "metadata": {}, "outputs": [], @@ -271,7 +271,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, "id": "subject-richardson", "metadata": {}, "outputs": [], @@ -304,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "id": "mental-corporation", "metadata": {}, "outputs": [], @@ -336,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 11, "id": "adverse-hanging", "metadata": {}, "outputs": [], @@ -356,15 +356,15 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 12, "id": "bright-proposal", "metadata": {}, "outputs": [], "source": [ "sweep.plot(label='mixture', color='C2')\n", "\n", - "decorate(xlabel='Time until mixing (minutes)',\n", - " ylabel='Final emperature (C)')" + "decorate(xlabel='Time until mixing (min)',\n", + " ylabel='Final temperature (C)')" ] }, { @@ -406,7 +406,7 @@ "metadata": {}, "source": [ "Now we can use the observed data to estimate the parameter $r$. If we\n", - "observe the that temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", + "observe the that the temperature at $t_{end}$ is $T_{final}$, we can plug these values into the particular solution and solve for $r$. The result is:\n", "\n", "$$r = \\frac{1}{t_{end}} \\log{\\left (\\frac{T_{init} - T_{env}}{T_{final} - T_{env}} \\right )}$$\n", "\n", @@ -415,7 +415,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 13, "id": "secondary-swift", "metadata": {}, "outputs": [], @@ -442,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "id": "south-machinery", "metadata": {}, "outputs": [], @@ -467,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 15, "id": "opening-transsexual", "metadata": {}, "outputs": [], @@ -498,7 +498,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "id": "agreed-bouquet", "metadata": {}, "outputs": [], @@ -519,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 17, "id": "portuguese-sympathy", "metadata": { "tags": [] @@ -532,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 18, "id": "distinguished-regard", "metadata": { "tags": [] @@ -592,7 +592,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 19, "id": "acting-howard", "metadata": {}, "outputs": [], @@ -602,7 +602,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 20, "id": "ahead-compensation", "metadata": {}, "outputs": [], @@ -612,7 +612,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 21, "id": "assumed-shock", "metadata": {}, "outputs": [], @@ -622,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 22, "id": "elementary-moral", "metadata": {}, "outputs": [], @@ -644,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 23, "id": "super-citizenship", "metadata": {}, "outputs": [], @@ -670,7 +670,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index cd0d3bc0..46c74d6b 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -147,7 +147,7 @@ "> 2. Also, we discovered that the effect of insulin on net glucose disappearance must be sluggish --- that is, that insulin acts slowly because insulin must first move from plasma to a remote compartment \\[...\\] to exert its action on glucose disposal.\n", "\n", "To paraphrase the second point, the effect of insulin on glucose\n", - "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a remote compartment where it has its effect." + "disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a remote compartment where it has its effect." ] }, { @@ -428,7 +428,7 @@ "I_series.plot(color='C2', label='interpolation')\n", "\n", "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" + " ylabel='Concentration (μU/mL)')" ] }, { @@ -506,7 +506,7 @@ "I_series.plot(color='C2', label='interpolation')\n", "\n", "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" + " ylabel='Concentration (μU/mL)')" ] }, { @@ -577,7 +577,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 0afbc8bf..80bb5739 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -286,7 +286,7 @@ "id": "basic-subdivision", "metadata": {}, "source": [ - "As usual, the update function takes a time stamp, a `State` object, and a `System` object as parameters. The first line uses multiple assignment to extract the current values of `G` and `X`.\n", + "As usual, the update function takes a timestamp, a `State` object, and a `System` object as parameters. The first line uses multiple assignment to extract the current values of `G` and `X`.\n", "\n", "The following lines unpack the parameters we need from the `System`\n", "object.\n", @@ -796,7 +796,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index 5f255895..70050688 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -154,7 +154,7 @@ "\n", "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/Lowpass_Filter_RC.png)\n", "\n", - "A *filter* is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a *signal* is a voltage that changes over time.\n", + "A *filter* is a circuit that takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a *signal* is a voltage that changes over time.\n", "\n", "A filter is *low-pass* if it allows low-frequency signals to pass from\n", "$V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of\n", @@ -294,7 +294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 3b7e9663..6c1d23f8 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "usual-institution", "metadata": { "tags": [] @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "quantitative-montana", "metadata": { "tags": [] @@ -156,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "finite-warrant", "metadata": {}, "outputs": [], @@ -199,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "forty-knitting", "metadata": {}, "outputs": [], @@ -228,7 +228,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "senior-counter", "metadata": {}, "outputs": [], @@ -248,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "biological-evans", "metadata": { "tags": [] @@ -273,15 +273,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "experienced-providence", "metadata": {}, "outputs": [], "source": [ "sweep.plot()\n", "\n", - "decorate(xlabel='Launch angle (degree)',\n", - " ylabel='Range (meter)')" + "decorate(xlabel='Launch angle (degrees)',\n", + " ylabel='Range (m)')" ] }, { @@ -295,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "invisible-jaguar", "metadata": {}, "outputs": [], @@ -319,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "vocal-nerve", "metadata": {}, "outputs": [], @@ -329,7 +329,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "id": "figured-uniform", "metadata": {}, "outputs": [], @@ -394,7 +394,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "studied-association", "metadata": {}, "outputs": [], @@ -404,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "developmental-alabama", "metadata": {}, "outputs": [], @@ -423,7 +423,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "ignored-decrease", "metadata": {}, "outputs": [], @@ -433,7 +433,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "western-communist", "metadata": {}, "outputs": [], @@ -451,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "duplicate-madison", "metadata": {}, "outputs": [], @@ -461,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "id": "legislative-prospect", "metadata": {}, "outputs": [], @@ -484,7 +484,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "id": "egyptian-shadow", "metadata": {}, "outputs": [], @@ -502,7 +502,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "id": "sustainable-supply", "metadata": {}, "outputs": [], @@ -512,7 +512,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "id": "american-biodiversity", "metadata": {}, "outputs": [], @@ -530,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "id": "certified-webster", "metadata": {}, "outputs": [], @@ -540,7 +540,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "id": "silver-bernard", "metadata": {}, "outputs": [], @@ -550,7 +550,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "id": "absent-encoding", "metadata": {}, "outputs": [], @@ -568,7 +568,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "id": "thick-jungle", "metadata": {}, "outputs": [], @@ -613,7 +613,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index 8053abc9..4d0155ee 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -585,8 +585,8 @@ "source": [ "### Combining the Results\n", "\n", - "`DataFrame` provides `append`, which appends `results2` to the end of\n", - "`results1`." + "Pandas provides a function called `concat`, which makes a \n", + "`DataFrame` with the rows from `results1` followed by the rows from `results2`." ] }, { @@ -596,7 +596,7 @@ "metadata": {}, "outputs": [], "source": [ - "results = results1.append(results2)" + "results = pd.concat([results1, results2])" ] }, { @@ -709,7 +709,7 @@ " events=event_func2)\n", " \n", " # combine and return the results\n", - " results = results1.append(results2)\n", + " results = pd.concat([results1, results2])\n", " return results" ] }, @@ -1086,7 +1086,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb index 3ccf1585..5046d8ff 100644 --- a/chapters/chap27.ipynb +++ b/chapters/chap27.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "approximate-working", "metadata": { "tags": [] @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "suspended-occasion", "metadata": { "tags": [] @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "coastal-cameroon", "metadata": {}, "outputs": [], @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "recovered-makeup", "metadata": {}, "outputs": [], @@ -149,7 +149,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "younger-affect", "metadata": {}, "outputs": [], @@ -172,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "suspended-tumor", "metadata": {}, "outputs": [], @@ -190,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "noticed-portable", "metadata": {}, "outputs": [], @@ -206,7 +206,7 @@ "`results` contains 101 points that are equally spaced in time.\n", "Now you might wonder, if `solve_ivp` ran the slope function 50 times, how did we get 101 time steps?\n", "\n", - "To answer that question, we need to know more how the solver works.\n", + "To answer that question, we need to know more about how the solver works.\n", "There are actually three stages:\n", "\n", "1. For each time step, `solve_ivp` evaluates the slope function seven times, with different values of `t` and `y`.\n", @@ -220,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "id": "efficient-aluminum", "metadata": {}, "outputs": [], @@ -243,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "id": "handed-gothic", "metadata": {}, "outputs": [], @@ -262,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "id": "accessory-wrapping", "metadata": {}, "outputs": [], @@ -304,7 +304,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "id": "indie-antigua", "metadata": {}, "outputs": [], @@ -321,12 +321,12 @@ "metadata": {}, "source": [ "Using these values, we can generate a *quiver plot* that shows an arrow for each time the slope function ran.\n", - "The location of the each arrow represents the values of `t` and `y`; the orientation of the arrow shows the slope that was computed." + "The location of each arrow represents the values of `t` and `y`; the orientation of the arrow shows the slope that was computed." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "id": "fossil-librarian", "metadata": {}, "outputs": [], @@ -470,14 +470,6 @@ "id": "broken-preparation", "metadata": {}, "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "suspended-apparel", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -497,7 +489,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, From 8ca65359e5ac51004c81e0b973dfb37d7bd73d48 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Fri, 30 Sep 2022 20:09:44 -0400 Subject: [PATCH 095/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240360 -> 240367 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 4897783c8a067e127b7c1ffee7a2544f42878c73..12baf6af19630b6099d634238170e16a0961b3a2 100644 GIT binary patch delta 107494 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

    N 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�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°W4sQb>nzKS@TpHcae#LAf~q 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 Date: Thu, 27 Apr 2023 15:29:44 -0400 Subject: [PATCH 096/144] Updates --- Makefile | 82 ++------------------------------------------ requirements-dev.txt | 6 ++-- requirements.txt | 13 +++---- 3 files changed, 12 insertions(+), 89 deletions(-) diff --git a/Makefile b/Makefile index 358c4272..4d980441 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,23 @@ -.PHONY: clean data lint format requirements create_environment - -################################################################################# -# GLOBALS # -################################################################################# - PROJECT_NAME = ModSimPy -PYTHON_VERSION = 3.10 +PYTHON_VERSION = 3.8 PYTHON_INTERPRETER = python -################################################################################# -# COMMANDS # -################################################################################# - - -## Set up python interpreter environment create_environment: conda create -y --name $(PROJECT_NAME) python=$(PYTHON_VERSION) @echo ">>> conda env created. Activate with:\nconda activate $(PROJECT_NAME)" -## Install Python Dependencies requirements: $(PYTHON_INTERPRETER) -m pip install -U pip setuptools wheel $(PYTHON_INTERPRETER) -m pip install -r requirements-dev.txt -## Lint using flake8 and black (use `make format` to do formatting) lint: flake8 pacs black --check --config pyproject.toml pacs -## Format source code with black format: black --config pyproject.toml pacs @@ -43,66 +28,5 @@ clean: find . -type d -name "__pycache__" -delete - -################################################################################# -# Self Documenting Commands # -################################################################################# - -.DEFAULT_GOAL := help - -# Inspired by -# sed script explained: -# /^##/: -# * save line in hold space -# * purge line -# * Loop: -# * append newline + line to hold space -# * go to next line -# * if line starts with doc comment, strip comment character off and loop -# * remove target prerequisites -# * append hold space (+ newline) to line -# * replace newline plus comments by `---` -# * print line -# Separate expressions are necessary because labels cannot be delimited by -# semicolon; see -.PHONY: help -help: - @echo "$$(tput bold)Available rules:$$(tput sgr0)" - @echo - @sed -n -e "/^## / { \ - h; \ - s/.*//; \ - :doc" \ - -e "H; \ - n; \ - s/^## //; \ - t doc" \ - -e "s/:.*//; \ - G; \ - s/\\n## /---/; \ - s/\\n/ /g; \ - p; \ - }" ${MAKEFILE_LIST} \ - | LC_ALL='C' sort --ignore-case \ - | awk -F '---' \ - -v ncol=$$(tput cols) \ - -v indent=19 \ - -v col_on="$$(tput setaf 6)" \ - -v col_off="$$(tput sgr0)" \ - '{ \ - printf "%s%*s%s ", col_on, -indent, $$1, col_off; \ - n = split($$2, words, " "); \ - line_length = ncol - indent; \ - for (i = 1; i <= n; i++) { \ - line_length -= length(words[i]) + 1; \ - if (line_length <= 0) { \ - line_length = ncol - indent - length(words[i]) - 1; \ - printf "\n%*s ", -indent, " "; \ - } \ - printf "%s ", words[i]; \ - } \ - printf "\n"; \ - }' \ - | more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars') - - +tests: + cd chapters; pytest --nbmake chap01.ipynb diff --git a/requirements-dev.txt b/requirements-dev.txt index fd2b2219..38916bad 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,5 @@ +-r requirements.txt pandoc -jupyter-book -ghp-import +pypandoc +pytest +nbmake diff --git a/requirements.txt b/requirements.txt index 40465b84..002783d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,11 @@ +beautifulsoup4 +html5lib jupyter -numpy +lxml matplotlib -seaborn +numpy pandas -scipy pint +scipy sympy -lxml -html5lib -beautifulsoup4 tables -yapf -modsimpy From 8b12e5c7eac71003f3382c5dd0536ddcf381eb92 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 15:38:53 -0400 Subject: [PATCH 097/144] Removing iteritems --- modsim.py | 881 +----------------------------------------------------- 1 file changed, 1 insertion(+), 880 deletions(-) mode change 100644 => 120000 modsim.py diff --git a/modsim.py b/modsim.py deleted file mode 100644 index 0af5c309..00000000 --- a/modsim.py +++ /dev/null @@ -1,880 +0,0 @@ -""" -Code from Modeling and Simulation in Python. - -Copyright 2020 Allen Downey - -MIT License: https://opensource.org/licenses/MIT -""" - -import logging - -logger = logging.getLogger(name="modsim.py") - -# make sure we have Python 3.6 or better -import sys - -if sys.version_info < (3, 6): - logger.warning("modsim.py depends on Python 3.6 features.") - -import inspect - -import matplotlib.pyplot as plt - -plt.rcParams['figure.dpi'] = 75 -plt.rcParams['savefig.dpi'] = 300 -plt.rcParams['figure.figsize'] = 6, 4 - -import numpy as np -import pandas as pd -import scipy - -import scipy.optimize as spo - -from scipy.interpolate import interp1d -from scipy.interpolate import InterpolatedUnivariateSpline - -from scipy.integrate import solve_ivp - -from types import SimpleNamespace -from copy import copy - - -def flip(p=0.5): - """Flips a coin with the given probability. - - p: float 0-1 - - returns: boolean (True or False) - """ - return np.random.random() < p - - -def cart2pol(x, y, z=None): - """Convert Cartesian coordinates to polar. - - x: number or sequence - y: number or sequence - z: number or sequence (optional) - - returns: theta, rho OR theta, rho, z - """ - x = np.asarray(x) - y = np.asarray(y) - - rho = np.hypot(x, y) - theta = np.arctan2(y, x) - - if z is None: - return theta, rho - else: - return theta, rho, z - - -def pol2cart(theta, rho, z=None): - """Convert polar coordinates to Cartesian. - - theta: number or sequence in radians - rho: number or sequence - z: number or sequence (optional) - - returns: x, y OR x, y, z - """ - x = rho * np.cos(theta) - y = rho * np.sin(theta) - - if z is None: - return x, y - else: - return x, y, z - -from numpy import linspace - -def linrange(start, stop=None, step=1, **options): - """Make an array of equally spaced values. - - start: first value - stop: last value (might be approximate) - step: difference between elements (should be consistent) - - returns: NumPy array - """ - if stop is None: - stop = start - start = 0 - n = int(round((stop-start) / step)) - return linspace(start, stop, n+1, **options) - - -def root_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `min_func`. - - Wrapper for - https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html - - func: computes the function to be minimized - bracket: sequence of two values, lower and upper bounds of the range to be searched - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to root_scalar - - returns: RootResults object - """ - bracket = kwargs.get('bracket', None) - if bracket is None or len(bracket) != 2: - msg = ("To run root_scalar, you have to provide a " - "`bracket` keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) - - try: - func(bracket[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.root_scalar " - "I tried running the function you provided " - "with `bracket[0]`, " - "and I got the following error:") - logger.error(msg) - raise (e) - - underride(kwargs, rtol=1e-4) - - res = spo.root_scalar(func, *args, **kwargs) - - if not res.converged: - msg = ("scipy.optimize.root_scalar did not converge. " - "The message it returned is:\n" + res.flag) - raise ValueError(msg) - - return res - - -def minimize_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `func`. - - Wrapper for - https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - - func: computes the function to be minimized - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to minimize_scalar - - returns: OptimizeResult object - """ - bounds = kwargs.get('bounds', None) - - if bounds is None or len(bounds) != 2: - msg = ("To run maximize_scalar or minimize_scalar, " - "you have to provide a `bounds` " - "keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) - - try: - func(bounds[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.minimize_scalar, " - "I tried running the function you provided " - "with the lower bound, " - "and I got the following error:") - logger.error(msg) - raise (e) - - underride(kwargs, method='bounded') - - res = spo.minimize_scalar(func, args=args, **kwargs) - - if not res.success: - msg = ("minimize_scalar did not succeed." - "The message it returned is: \n" + - res.message) - raise Exception(msg) - - return res - - -def maximize_scalar(max_func, *args, **kwargs): - """Finds the input value that maximizes `max_func`. - - Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - - min_func: computes the function to be maximized - args: any additional positional arguments are passed to max_func - options: any keyword arguments are passed as options to minimize_scalar - - returns: ModSimSeries object - """ - def min_func(*args): - return -max_func(*args) - - res = minimize_scalar(min_func, *args, **kwargs) - - # we have to negate the function value before returning res - res.fun = -res.fun - return res - - -def run_solve_ivp(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - `t_end` with the end time. Optionally, it can contain - `t_0` with the start time. - - It should contain any other parameters required by the - slope function. - - `options` can be any legal options of `scipy.integrate.solve_ivp` - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - system = remove_units(system) - - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # make sure `system` contains `t_end` - if not hasattr(system, "t_end"): - msg = """It looks like `system` does not contain `t_end` - as a system variable. `t_end` should be the - final time:""" - raise ValueError(msg) - - # the default value for t_0 is 0 - t_0 = getattr(system, "t_0", 0) - - # try running the slope function with the initial conditions - try: - slope_func(t_0, system.init, system) - except Exception as e: - msg = """Before running scipy.integrate.solve_ivp, I tried - running the slope function you provided with the - initial conditions in `system` and `t=t_0` and I got - the following error:""" - logger.error(msg) - raise (e) - - # get the list of event functions - events = options.get('events', []) - - # if there's only one event function, put it in a list - try: - iter(events) - except TypeError: - events = [events] - - for event_func in events: - # make events terminal unless otherwise specified - if not hasattr(event_func, 'terminal'): - event_func.terminal = True - - # test the event function with the initial conditions - try: - event_func(t_0, system.init, system) - except Exception as e: - msg = """Before running scipy.integrate.solve_ivp, I tried - running the event function you provided with the - initial conditions in `system` and `t=t_0` and I got - the following error:""" - logger.error(msg) - raise (e) - - # get dense output unless otherwise specified - if not 't_eval' in options: - underride(options, dense_output=True) - - # run the solver - bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, - args=[system], **options) - - # separate the results from the details - y = bunch.pop("y") - t = bunch.pop("t") - - # get the column names from `init`, if possible - if hasattr(system.init, 'index'): - columns = system.init.index - else: - columns = range(len(system.init)) - - # evaluate the results at equally-spaced points - if options.get('dense_output', False): - try: - num = system.num - except AttributeError: - num = 101 - t_final = t[-1] - t_array = linspace(t_0, t_final, num) - y_array = bunch.sol(t_array) - - # pack the results into a TimeFrame - results = TimeFrame(y_array.T, index=t_array, - columns=columns) - else: - results = TimeFrame(y.T, index=t, - columns=columns) - - return results, bunch - - -def leastsq(error_func, x0, *args, **options): - """Find the parameters that yield the best fit for the data. - - `x0` can be a sequence, array, Series, or Params - - Positional arguments are passed along to `error_func`. - - Keyword arguments are passed to `scipy.optimize.leastsq` - - error_func: function that computes a sequence of errors - x0: initial guess for the best parameters - args: passed to error_func - options: passed to leastsq - - :returns: Params object with best_params and ModSimSeries with details - """ - # override `full_output` so we get a message if something goes wrong - options["full_output"] = True - - # run leastsq - t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) - best_params, cov_x, infodict, mesg, ier = t - - # pack the results into a ModSimSeries object - details = SimpleNamespace(cov_x=cov_x, - mesg=mesg, - ier=ier, - **infodict) - details.success = details.ier in [1,2,3,4] - - # if we got a Params object, we should return a Params object - if isinstance(x0, Params): - best_params = Params(pd.Series(best_params, x0.index)) - - # return the best parameters and details - return best_params, details - - -def crossings(series, value): - """Find the labels where the series passes through value. - - The labels in series must be increasing numerical values. - - series: Series - value: number - - returns: sequence of labels - """ - values = series.values - value - interp = InterpolatedUnivariateSpline(series.index, values) - return interp.roots() - - -def has_nan(a): - """Checks whether the an array contains any NaNs. - - :param a: NumPy array or Pandas Series - :return: boolean - """ - return np.any(np.isnan(a)) - - -def is_strictly_increasing(a): - """Checks whether the elements of an array are strictly increasing. - - :param a: NumPy array or Pandas Series - :return: boolean - """ - return np.all(np.diff(a) > 0) - - -def interpolate(series, **options): - """Creates an interpolation function. - - series: Series object - options: any legal options to scipy.interpolate.interp1d - - returns: function that maps from the index to the values - """ - if has_nan(series.index): - msg = """The Series you passed to interpolate contains - NaN values in the index, which would result in - undefined behavior. So I'm putting a stop to that.""" - raise ValueError(msg) - - if not is_strictly_increasing(series.index): - msg = """The Series you passed to interpolate has an index - that is not strictly increasing, which would result in - undefined behavior. So I'm putting a stop to that.""" - raise ValueError(msg) - - # make the interpolate function extrapolate past the ends of - # the range, unless `options` already specifies a value for `fill_value` - underride(options, fill_value="extrapolate") - - # call interp1d, which returns a new function object - x = series.index - y = series.values - interp_func = interp1d(x, y, **options) - return interp_func - - -def interpolate_inverse(series, **options): - """Interpolate the inverse function of a Series. - - series: Series object, represents a mapping from `a` to `b` - options: any legal options to scipy.interpolate.interp1d - - returns: interpolation object, can be used as a function - from `b` to `a` - """ - inverse = pd.Series(series.index, index=series.values) - interp_func = interpolate(inverse, **options) - return interp_func - - -def gradient(series, **options): - """Computes the numerical derivative of a series. - - If the elements of series have units, they are dropped. - - series: Series object - options: any legal options to np.gradient - - returns: Series, same subclass as series - """ - x = series.index - y = series.values - - a = np.gradient(y, x, **options) - return series.__class__(a, series.index) - - -def source_code(obj): - """Prints the source code for a given object. - - obj: function or method object - """ - print(inspect.getsource(obj)) - - -def underride(d, **options): - """Add key-value pairs to d only if key is not in d. - - If d is None, create a new dictionary. - - d: dictionary - options: keyword args to add to d - """ - if d is None: - d = {} - - for key, val in options.items(): - d.setdefault(key, val) - - return d - - -def contour(df, **options): - """Makes a contour plot from a DataFrame. - - Wrapper for plt.contour - https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contour.html - - Note: columns and index must be numerical - - df: DataFrame - options: passed to plt.contour - """ - fontsize = options.pop("fontsize", 12) - underride(options, cmap="viridis") - x = df.columns - y = df.index - X, Y = np.meshgrid(x, y) - cs = plt.contour(X, Y, df, **options) - plt.clabel(cs, inline=1, fontsize=fontsize) - - -def savefig(filename, **options): - """Save the current figure. - - Keyword arguments are passed along to plt.savefig - - https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html - - filename: string - """ - print("Saving figure to file", filename) - plt.savefig(filename, **options) - - -def decorate(**options): - """Decorate the current axes. - - Call decorate with keyword arguments like - decorate(title='Title', - xlabel='x', - ylabel='y') - - The keyword arguments can be any of the axis properties - https://matplotlib.org/api/axes_api.html - """ - ax = plt.gca() - ax.set(**options) - - handles, labels = ax.get_legend_handles_labels() - if handles: - ax.legend(handles, labels) - - plt.tight_layout() - - -def remove_from_legend(bad_labels): - """Removes some labels from the legend. - - bad_labels: sequence of strings - """ - ax = plt.gca() - handles, labels = ax.get_legend_handles_labels() - handle_list, label_list = [], [] - for handle, label in zip(handles, labels): - if label not in bad_labels: - handle_list.append(handle) - label_list.append(label) - ax.legend(handle_list, label_list) - - -class SettableNamespace(SimpleNamespace): - """Contains a collection of parameters. - - Used to make a System object. - - Takes keyword arguments and stores them as attributes. - """ - def __init__(self, namespace=None, **kwargs): - super().__init__() - if namespace: - self.__dict__.update(namespace.__dict__) - self.__dict__.update(kwargs) - - def get(self, name, default=None): - """Look up a variable. - - name: string varname - default: value returned if `name` is not present - """ - try: - return self.__getattribute__(name, default) - except AttributeError: - return default - - def set(self, **variables): - """Make a copy and update the given variables. - - returns: Params - """ - new = copy(self) - new.__dict__.update(variables) - return new - - -def magnitude(x): - """Returns the magnitude of a Quantity or number. - - x: Quantity or number - - returns: number - """ - return x.magnitude if hasattr(x, 'magnitude') else x - - -def remove_units(namespace): - """Removes units from the values in a Namespace. - - Only removes units from top-level values; - does not traverse nested values. - - returns: new Namespace object - """ - res = copy(namespace) - for label, value in res.__dict__.items(): - if isinstance(value, pd.Series): - value = remove_units_series(value) - res.__dict__[label] = magnitude(value) - return res - - -def remove_units_series(series): - """Removes units from the values in a Series. - - Only removes units from top-level values; - does not traverse nested values. - - returns: new Series object - """ - res = copy(series) - for label, value in res.iteritems(): - res[label] = magnitude(value) - return res - - -class System(SettableNamespace): - """Contains system parameters and their values. - - Takes keyword arguments and stores them as attributes. - """ - pass - - -class Params(SettableNamespace): - """Contains system parameters and their values. - - Takes keyword arguments and stores them as attributes. - """ - pass - - -def State(**variables): - """Contains the values of state variables.""" - return pd.Series(variables, name='state') - - -def make_series(x, y, **options): - """Make a Pandas Series. - - x: sequence used as the index - y: sequence used as the values - - returns: Pandas Series - """ - underride(options, name='values') - if isinstance(y, pd.Series): - y = y.values - series = pd.Series(y, index=x, **options) - series.index.name = 'index' - return series - - -def TimeSeries(*args, **kwargs): - """Make a pd.Series object to represent a time series. - """ - if args or kwargs: - underride(kwargs, dtype=float) - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Time' - if 'name' not in kwargs: - series.name = 'Quantity' - return series - - -def SweepSeries(*args, **kwargs): - """Make a pd.Series object to store results from a parameter sweep. - """ - if args or kwargs: - underride(kwargs, dtype=float) - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Parameter' - if 'name' not in kwargs: - series.name = 'Metric' - return series - - -def show(obj): - """Display a Series or Namespace as a DataFrame.""" - if isinstance(obj, pd.Series): - df = pd.DataFrame(obj) - return df - elif hasattr(obj, '__dict__'): - return pd.DataFrame(pd.Series(obj.__dict__), - columns=['value']) - else: - return obj - - -def TimeFrame(*args, **kwargs): - """DataFrame that maps from time to State. - """ - underride(kwargs, dtype=float) - return pd.DataFrame(*args, **kwargs) - - -def SweepFrame(*args, **kwargs): - """DataFrame that maps from parameter value to SweepSeries. - """ - underride(kwargs, dtype=float) - return pd.DataFrame(*args, **kwargs) - - -def Vector(x, y, z=None, **options): - """ - """ - underride(options, name='component') - if z is None: - return pd.Series(dict(x=x, y=y), **options) - else: - return pd.Series(dict(x=x, y=y, z=z), **options) - - -## Vector functions (should work with any sequence) - -def vector_mag(v): - """Vector magnitude.""" - return np.sqrt(np.dot(v, v)) - - -def vector_mag2(v): - """Vector magnitude squared.""" - return np.dot(v, v) - - -def vector_angle(v): - """Angle between v and the positive x axis. - - Only works with 2-D vectors. - - returns: angle in radians - """ - assert len(v) == 2 - x, y = v - return np.arctan2(y, x) - - -def vector_polar(v): - """Vector magnitude and angle. - - returns: (number, angle in radians) - """ - return vector_mag(v), vector_angle(v) - - -def vector_hat(v): - """Unit vector in the direction of v. - - returns: Vector or array - """ - # check if the magnitude of the Quantity is 0 - mag = vector_mag(v) - if mag == 0: - return v - else: - return v / mag - - -def vector_perp(v): - """Perpendicular Vector (rotated left). - - Only works with 2-D Vectors. - - returns: Vector - """ - assert len(v) == 2 - x, y = v - return Vector(-y, x) - - -def vector_dot(v, w): - """Dot product of v and w. - - returns: number or Quantity - """ - return np.dot(v, w) - - -def vector_cross(v, w): - """Cross product of v and w. - - returns: number or Quantity for 2-D, Vector for 3-D - """ - res = np.cross(v, w) - - if len(v) == 3: - return Vector(*res) - else: - return res - - -def vector_proj(v, w): - """Projection of v onto w. - - returns: array or Vector with direction of w and units of v. - """ - w_hat = vector_hat(w) - return vector_dot(v, w_hat) * w_hat - - -def scalar_proj(v, w): - """Returns the scalar projection of v onto w. - - Which is the magnitude of the projection of v onto w. - - returns: scalar with units of v. - """ - return vector_dot(v, vector_hat(w)) - - -def vector_dist(v, w): - """Euclidean distance from v to w, with units.""" - if isinstance(v, list): - v = np.asarray(v) - return vector_mag(v - w) - - -def vector_diff_angle(v, w): - """Angular difference between two vectors, in radians. - """ - if len(v) == 2: - return vector_angle(v) - vector_angle(w) - else: - # TODO: see http://www.euclideanspace.com/maths/algebra/ - # vectors/angleBetween/ - raise NotImplementedError() - - -def plot_segment(A, B, **options): - """Plots a line segment between two Vectors. - - For 3-D vectors, the z axis is ignored. - - Additional options are passed along to plot(). - - A: Vector - B: Vector - """ - xs = A.x, B.x - ys = A.y, B.y - plt.plot(xs, ys, **options) - - -from time import sleep -from IPython.display import clear_output - -def animate(results, draw_func, *args, interval=None): - """Animate results from a simulation. - - results: TimeFrame - draw_func: function that draws state - interval: time between frames in seconds - """ - plt.figure() - try: - for t, state in results.iterrows(): - draw_func(t, state, *args) - plt.show() - if interval: - sleep(interval) - clear_output(wait=True) - draw_func(t, state, *args) - plt.show() - except KeyboardInterrupt: - pass diff --git a/modsim.py b/modsim.py new file mode 120000 index 00000000..8049cfc8 --- /dev/null +++ b/modsim.py @@ -0,0 +1 @@ +modsim/modsim.py \ No newline at end of file From ca36cb58b7ab069b8a0906961062367f8545dd12 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 15:42:19 -0400 Subject: [PATCH 098/144] No link --- modsim.py | 881 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 880 insertions(+), 1 deletion(-) mode change 120000 => 100644 modsim.py diff --git a/modsim.py b/modsim.py deleted file mode 120000 index 8049cfc8..00000000 --- a/modsim.py +++ /dev/null @@ -1 +0,0 @@ -modsim/modsim.py \ No newline at end of file diff --git a/modsim.py b/modsim.py new file mode 100644 index 00000000..b65c951a --- /dev/null +++ b/modsim.py @@ -0,0 +1,880 @@ +""" +Code from Modeling and Simulation in Python. + +Copyright 2020 Allen Downey + +MIT License: https://opensource.org/licenses/MIT +""" + +import logging + +logger = logging.getLogger(name="modsim.py") + +# make sure we have Python 3.6 or better +import sys + +if sys.version_info < (3, 6): + logger.warning("modsim.py depends on Python 3.6 features.") + +import inspect + +import matplotlib.pyplot as plt + +plt.rcParams['figure.dpi'] = 75 +plt.rcParams['savefig.dpi'] = 300 +plt.rcParams['figure.figsize'] = 6, 4 + +import numpy as np +import pandas as pd +import scipy + +import scipy.optimize as spo + +from scipy.interpolate import interp1d +from scipy.interpolate import InterpolatedUnivariateSpline + +from scipy.integrate import solve_ivp + +from types import SimpleNamespace +from copy import copy + + +def flip(p=0.5): + """Flips a coin with the given probability. + + p: float 0-1 + + returns: boolean (True or False) + """ + return np.random.random() < p + + +def cart2pol(x, y, z=None): + """Convert Cartesian coordinates to polar. + + x: number or sequence + y: number or sequence + z: number or sequence (optional) + + returns: theta, rho OR theta, rho, z + """ + x = np.asarray(x) + y = np.asarray(y) + + rho = np.hypot(x, y) + theta = np.arctan2(y, x) + + if z is None: + return theta, rho + else: + return theta, rho, z + + +def pol2cart(theta, rho, z=None): + """Convert polar coordinates to Cartesian. + + theta: number or sequence in radians + rho: number or sequence + z: number or sequence (optional) + + returns: x, y OR x, y, z + """ + x = rho * np.cos(theta) + y = rho * np.sin(theta) + + if z is None: + return x, y + else: + return x, y, z + +from numpy import linspace + +def linrange(start, stop=None, step=1): + """Make an array of equally spaced values. + + start: first value + stop: last value (might be approximate) + step: difference between elements (should be consistent) + + returns: NumPy array + """ + if stop is None: + stop = start + start = 0 + n = int(round((stop-start) / step)) + return linspace(start, stop, n+1) + + +def root_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `min_func`. + + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html + + func: computes the function to be minimized + bracket: sequence of two values, lower and upper bounds of the range to be searched + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to root_scalar + + returns: RootResults object + """ + bracket = kwargs.get('bracket', None) + if bracket is None or len(bracket) != 2: + msg = ("To run root_scalar, you have to provide a " + "`bracket` keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) + + try: + func(bracket[0], *args) + except Exception as e: + msg = ("Before running scipy.integrate.root_scalar " + "I tried running the function you provided " + "with `bracket[0]`, " + "and I got the following error:") + logger.error(msg) + raise (e) + + underride(kwargs, rtol=1e-4) + + res = spo.root_scalar(func, *args, **kwargs) + + if not res.converged: + msg = ("scipy.optimize.root_scalar did not converge. " + "The message it returned is:\n" + res.flag) + raise ValueError(msg) + + return res + + +def minimize_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `func`. + + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + func: computes the function to be minimized + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to minimize_scalar + + returns: OptimizeResult object + """ + bounds = kwargs.get('bounds', None) + + if bounds is None or len(bounds) != 2: + msg = ("To run maximize_scalar or minimize_scalar, " + "you have to provide a `bounds` " + "keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) + + try: + func(bounds[0], *args) + except Exception as e: + msg = ("Before running scipy.integrate.minimize_scalar, " + "I tried running the function you provided " + "with the lower bound, " + "and I got the following error:") + logger.error(msg) + raise (e) + + underride(kwargs, method='bounded') + + res = spo.minimize_scalar(func, args=args, **kwargs) + + if not res.success: + msg = ("minimize_scalar did not succeed." + "The message it returned is: \n" + + res.message) + raise Exception(msg) + + return res + + +def maximize_scalar(max_func, *args, **kwargs): + """Finds the input value that maximizes `max_func`. + + Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html + + min_func: computes the function to be maximized + args: any additional positional arguments are passed to max_func + options: any keyword arguments are passed as options to minimize_scalar + + returns: ModSimSeries object + """ + def min_func(*args): + return -max_func(*args) + + res = minimize_scalar(min_func, *args, **kwargs) + + # we have to negate the function value before returning res + res.fun = -res.fun + return res + + +def run_solve_ivp(system, slope_func, **options): + """Computes a numerical solution to a differential equation. + + `system` must contain `init` with initial conditions, + `t_end` with the end time. Optionally, it can contain + `t_0` with the start time. + + It should contain any other parameters required by the + slope function. + + `options` can be any legal options of `scipy.integrate.solve_ivp` + + system: System object + slope_func: function that computes slopes + + returns: TimeFrame + """ + system = remove_units(system) + + # make sure `system` contains `init` + if not hasattr(system, "init"): + msg = """It looks like `system` does not contain `init` + as a system variable. `init` should be a State + object that specifies the initial condition:""" + raise ValueError(msg) + + # make sure `system` contains `t_end` + if not hasattr(system, "t_end"): + msg = """It looks like `system` does not contain `t_end` + as a system variable. `t_end` should be the + final time:""" + raise ValueError(msg) + + # the default value for t_0 is 0 + t_0 = getattr(system, "t_0", 0) + + # try running the slope function with the initial conditions + try: + slope_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the slope function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get the list of event functions + events = options.get('events', []) + + # if there's only one event function, put it in a list + try: + iter(events) + except TypeError: + events = [events] + + for event_func in events: + # make events terminal unless otherwise specified + if not hasattr(event_func, 'terminal'): + event_func.terminal = True + + # test the event function with the initial conditions + try: + event_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the event function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get dense output unless otherwise specified + if not 't_eval' in options: + underride(options, dense_output=True) + + # run the solver + bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, + args=[system], **options) + + # separate the results from the details + y = bunch.pop("y") + t = bunch.pop("t") + + # get the column names from `init`, if possible + if hasattr(system.init, 'index'): + columns = system.init.index + else: + columns = range(len(system.init)) + + # evaluate the results at equally-spaced points + if options.get('dense_output', False): + try: + num = system.num + except AttributeError: + num = 101 + t_final = t[-1] + t_array = linspace(t_0, t_final, num) + y_array = bunch.sol(t_array) + + # pack the results into a TimeFrame + results = TimeFrame(y_array.T, index=t_array, + columns=columns) + else: + results = TimeFrame(y.T, index=t, + columns=columns) + + return results, bunch + + +def leastsq(error_func, x0, *args, **options): + """Find the parameters that yield the best fit for the data. + + `x0` can be a sequence, array, Series, or Params + + Positional arguments are passed along to `error_func`. + + Keyword arguments are passed to `scipy.optimize.leastsq` + + error_func: function that computes a sequence of errors + x0: initial guess for the best parameters + args: passed to error_func + options: passed to leastsq + + :returns: Params object with best_params and ModSimSeries with details + """ + # override `full_output` so we get a message if something goes wrong + options["full_output"] = True + + # run leastsq + t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) + best_params, cov_x, infodict, mesg, ier = t + + # pack the results into a ModSimSeries object + details = SimpleNamespace(cov_x=cov_x, + mesg=mesg, + ier=ier, + **infodict) + details.success = details.ier in [1,2,3,4] + + # if we got a Params object, we should return a Params object + if isinstance(x0, Params): + best_params = Params(pd.Series(best_params, x0.index)) + + # return the best parameters and details + return best_params, details + + +def crossings(series, value): + """Find the labels where the series passes through value. + + The labels in series must be increasing numerical values. + + series: Series + value: number + + returns: sequence of labels + """ + values = series.values - value + interp = InterpolatedUnivariateSpline(series.index, values) + return interp.roots() + + +def has_nan(a): + """Checks whether the an array contains any NaNs. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.any(np.isnan(a)) + + +def is_strictly_increasing(a): + """Checks whether the elements of an array are strictly increasing. + + :param a: NumPy array or Pandas Series + :return: boolean + """ + return np.all(np.diff(a) > 0) + + +def interpolate(series, **options): + """Creates an interpolation function. + + series: Series object + options: any legal options to scipy.interpolate.interp1d + + returns: function that maps from the index to the values + """ + if has_nan(series.index): + msg = """The Series you passed to interpolate contains + NaN values in the index, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + if not is_strictly_increasing(series.index): + msg = """The Series you passed to interpolate has an index + that is not strictly increasing, which would result in + undefined behavior. So I'm putting a stop to that.""" + raise ValueError(msg) + + # make the interpolate function extrapolate past the ends of + # the range, unless `options` already specifies a value for `fill_value` + underride(options, fill_value="extrapolate") + + # call interp1d, which returns a new function object + x = series.index + y = series.values + interp_func = interp1d(x, y, **options) + return interp_func + + +def interpolate_inverse(series, **options): + """Interpolate the inverse function of a Series. + + series: Series object, represents a mapping from `a` to `b` + options: any legal options to scipy.interpolate.interp1d + + returns: interpolation object, can be used as a function + from `b` to `a` + """ + inverse = pd.Series(series.index, index=series.values) + interp_func = interpolate(inverse, **options) + return interp_func + + +def gradient(series, **options): + """Computes the numerical derivative of a series. + + If the elements of series have units, they are dropped. + + series: Series object + options: any legal options to np.gradient + + returns: Series, same subclass as series + """ + x = series.index + y = series.values + + a = np.gradient(y, x, **options) + return series.__class__(a, series.index) + + +def source_code(obj): + """Prints the source code for a given object. + + obj: function or method object + """ + print(inspect.getsource(obj)) + + +def underride(d, **options): + """Add key-value pairs to d only if key is not in d. + + If d is None, create a new dictionary. + + d: dictionary + options: keyword args to add to d + """ + if d is None: + d = {} + + for key, val in options.items(): + d.setdefault(key, val) + + return d + + +def contour(df, **options): + """Makes a contour plot from a DataFrame. + + Wrapper for plt.contour + https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contour.html + + Note: columns and index must be numerical + + df: DataFrame + options: passed to plt.contour + """ + fontsize = options.pop("fontsize", 12) + underride(options, cmap="viridis") + x = df.columns + y = df.index + X, Y = np.meshgrid(x, y) + cs = plt.contour(X, Y, df, **options) + plt.clabel(cs, inline=1, fontsize=fontsize) + + +def savefig(filename, **options): + """Save the current figure. + + Keyword arguments are passed along to plt.savefig + + https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html + + filename: string + """ + print("Saving figure to file", filename) + plt.savefig(filename, **options) + + +def decorate(**options): + """Decorate the current axes. + + Call decorate with keyword arguments like + decorate(title='Title', + xlabel='x', + ylabel='y') + + The keyword arguments can be any of the axis properties + https://matplotlib.org/api/axes_api.html + """ + ax = plt.gca() + ax.set(**options) + + handles, labels = ax.get_legend_handles_labels() + if handles: + ax.legend(handles, labels) + + plt.tight_layout() + + +def remove_from_legend(bad_labels): + """Removes some labels from the legend. + + bad_labels: sequence of strings + """ + ax = plt.gca() + handles, labels = ax.get_legend_handles_labels() + handle_list, label_list = [], [] + for handle, label in zip(handles, labels): + if label not in bad_labels: + handle_list.append(handle) + label_list.append(label) + ax.legend(handle_list, label_list) + + +class SettableNamespace(SimpleNamespace): + """Contains a collection of parameters. + + Used to make a System object. + + Takes keyword arguments and stores them as attributes. + """ + def __init__(self, namespace=None, **kwargs): + super().__init__() + if namespace: + self.__dict__.update(namespace.__dict__) + self.__dict__.update(kwargs) + + def get(self, name, default=None): + """Look up a variable. + + name: string varname + default: value returned if `name` is not present + """ + try: + return self.__getattribute__(name, default) + except AttributeError: + return default + + def set(self, **variables): + """Make a copy and update the given variables. + + returns: Params + """ + new = copy(self) + new.__dict__.update(variables) + return new + + +def magnitude(x): + """Returns the magnitude of a Quantity or number. + + x: Quantity or number + + returns: number + """ + return x.magnitude if hasattr(x, 'magnitude') else x + + +def remove_units(namespace): + """Removes units from the values in a Namespace. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Namespace object + """ + res = copy(namespace) + for label, value in res.__dict__.items(): + if isinstance(value, pd.Series): + value = remove_units_series(value) + res.__dict__[label] = magnitude(value) + return res + + +def remove_units_series(series): + """Removes units from the values in a Series. + + Only removes units from top-level values; + does not traverse nested values. + + returns: new Series object + """ + res = copy(series) + for label, value in res.iteritems(): + res[label] = magnitude(value) + return res + + +class System(SettableNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +class Params(SettableNamespace): + """Contains system parameters and their values. + + Takes keyword arguments and stores them as attributes. + """ + pass + + +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables, name='state') + + +def make_series(x, y, **options): + """Make a Pandas Series. + + x: sequence used as the index + y: sequence used as the values + + returns: Pandas Series + """ + underride(options, name='values') + if isinstance(y, pd.Series): + y = y.values + series = pd.Series(y, index=x, **options) + series.index.name = 'index' + return series + + +def TimeSeries(*args, **kwargs): + """Make a pd.Series object to represent a time series. + """ + if args or kwargs: + underride(kwargs, dtype=float) + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=float) + + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series + + +def SweepSeries(*args, **kwargs): + """Make a pd.Series object to store results from a parameter sweep. + """ + if args or kwargs: + underride(kwargs, dtype=float) + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Parameter' + if 'name' not in kwargs: + series.name = 'Metric' + return series + + +def show(obj): + """Display a Series or Namespace as a DataFrame.""" + if isinstance(obj, pd.Series): + df = pd.DataFrame(obj) + return df + elif hasattr(obj, '__dict__'): + return pd.DataFrame(pd.Series(obj.__dict__), + columns=['value']) + else: + return obj + + +def TimeFrame(*args, **kwargs): + """DataFrame that maps from time to State. + """ + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) + + +def SweepFrame(*args, **kwargs): + """DataFrame that maps from parameter value to SweepSeries. + """ + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) + + +def Vector(x, y, z=None, **options): + """ + """ + underride(options, name='component') + if z is None: + return pd.Series(dict(x=x, y=y), **options) + else: + return pd.Series(dict(x=x, y=y, z=z), **options) + + +## Vector functions (should work with any sequence) + +def vector_mag(v): + """Vector magnitude.""" + return np.sqrt(np.dot(v, v)) + + +def vector_mag2(v): + """Vector magnitude squared.""" + return np.dot(v, v) + + +def vector_angle(v): + """Angle between v and the positive x axis. + + Only works with 2-D vectors. + + returns: angle in radians + """ + assert len(v) == 2 + x, y = v + return np.arctan2(y, x) + + +def vector_polar(v): + """Vector magnitude and angle. + + returns: (number, angle in radians) + """ + return vector_mag(v), vector_angle(v) + + +def vector_hat(v): + """Unit vector in the direction of v. + + returns: Vector or array + """ + # check if the magnitude of the Quantity is 0 + mag = vector_mag(v) + if mag == 0: + return v + else: + return v / mag + + +def vector_perp(v): + """Perpendicular Vector (rotated left). + + Only works with 2-D Vectors. + + returns: Vector + """ + assert len(v) == 2 + x, y = v + return Vector(-y, x) + + +def vector_dot(v, w): + """Dot product of v and w. + + returns: number or Quantity + """ + return np.dot(v, w) + + +def vector_cross(v, w): + """Cross product of v and w. + + returns: number or Quantity for 2-D, Vector for 3-D + """ + res = np.cross(v, w) + + if len(v) == 3: + return Vector(*res) + else: + return res + + +def vector_proj(v, w): + """Projection of v onto w. + + returns: array or Vector with direction of w and units of v. + """ + w_hat = vector_hat(w) + return vector_dot(v, w_hat) * w_hat + + +def scalar_proj(v, w): + """Returns the scalar projection of v onto w. + + Which is the magnitude of the projection of v onto w. + + returns: scalar with units of v. + """ + return vector_dot(v, vector_hat(w)) + + +def vector_dist(v, w): + """Euclidean distance from v to w, with units.""" + if isinstance(v, list): + v = np.asarray(v) + return vector_mag(v - w) + + +def vector_diff_angle(v, w): + """Angular difference between two vectors, in radians. + """ + if len(v) == 2: + return vector_angle(v) - vector_angle(w) + else: + # TODO: see http://www.euclideanspace.com/maths/algebra/ + # vectors/angleBetween/ + raise NotImplementedError() + + +def plot_segment(A, B, **options): + """Plots a line segment between two Vectors. + + For 3-D vectors, the z axis is ignored. + + Additional options are passed along to plot(). + + A: Vector + B: Vector + """ + xs = A.x, B.x + ys = A.y, B.y + plt.plot(xs, ys, **options) + + +from time import sleep +from IPython.display import clear_output + +def animate(results, draw_func, *args, interval=None): + """Animate results from a simulation. + + results: TimeFrame + draw_func: function that draws state + interval: time between frames in seconds + """ + plt.figure() + try: + for t, state in results.iterrows(): + draw_func(t, state, *args) + plt.show() + if interval: + sleep(interval) + clear_output(wait=True) + draw_func(t, state, *args) + plt.show() + except KeyboardInterrupt: + pass From ca68034482e5bd5e0f953ff3758fc29049577a24 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 15:47:34 -0400 Subject: [PATCH 099/144] No iteritems --- modsim/modsim.py | 1705 +++++++++------------------------------------- 1 file changed, 319 insertions(+), 1386 deletions(-) diff --git a/modsim/modsim.py b/modsim/modsim.py index 1d412a9b..ed012ec6 100644 --- a/modsim/modsim.py +++ b/modsim/modsim.py @@ -1,17 +1,15 @@ """ Code from Modeling and Simulation in Python. -Copyright 2017 Allen Downey +Copyright 2020 Allen Downey -License: https://creativecommons.org/licenses/by/4.0) +MIT License: https://opensource.org/licenses/MIT """ import logging logger = logging.getLogger(name="modsim.py") -# TODO: Make this Python 3.7 when conda is ready - # make sure we have Python 3.6 or better import sys @@ -19,41 +17,26 @@ logger.warning("modsim.py depends on Python 3.6 features.") import inspect + import matplotlib.pyplot as plt + +plt.rcParams['figure.dpi'] = 75 +plt.rcParams['savefig.dpi'] = 300 +plt.rcParams['figure.figsize'] = 6, 4 + import numpy as np import pandas as pd import scipy -import sympy - -import seaborn as sns - -sns.set(style="white", font_scale=1.2) - -import pint - -UNITS = pint.UnitRegistry() -Quantity = UNITS.Quantity - -# TODO: Consider making this optional -from pint.errors import UnitStrippedWarning -import warnings - -warnings.simplefilter("error", UnitStrippedWarning) -# expose some names so we can use them without dot notation -from copy import copy -from numpy import sqrt, log, exp, pi -from pandas import DataFrame, Series -from time import sleep +import scipy.optimize as spo from scipy.interpolate import interp1d from scipy.interpolate import InterpolatedUnivariateSpline -from scipy.integrate import odeint from scipy.integrate import solve_ivp -# from scipy.optimize import leastsq -# from scipy.optimize import minimize_scalar +from types import SimpleNamespace +from copy import copy def flip(p=0.5): @@ -66,17 +49,6 @@ def flip(p=0.5): return np.random.random() < p -# For all the built-in Python functions that do math, -# let's use the NumPy version instead. - -abs = np.abs -min = np.min -max = np.max -pow = np.power -sum = np.sum -round = np.round - - def cart2pol(x, y, z=None): """Convert Cartesian coordinates to polar. @@ -115,447 +87,140 @@ def pol2cart(theta, rho, z=None): else: return x, y, z +from numpy import linspace -def linspace(start, stop, num=50, **options): - """Returns an array of evenly-spaced values in the interval [start, stop]. +def linrange(start, stop=None, step=1): + """Make an array of equally spaced values. start: first value - stop: last value - num: number of values - - Also accepts the same keyword arguments as np.linspace. See - https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html - - returns: array or Quantity - """ - # drop the units - start = magnitude(start) - stop = magnitude(stop) - - underride(options, dtype=np.float64) - - array = np.linspace(start, stop, num, **options) - return array - - -def linrange(start=0, stop=None, step=1, endpoint=False, **options): - """Returns an array of evenly-spaced values in an interval. - - By default, the last value in the array is `stop-step` - (at least approximately). - If you provide the keyword argument `endpoint=True`, - the last value in the array is `stop`. - - This function works best if the space between start and stop - is divisible by step; otherwise the results might be surprising. - - start: first value - stop: last value - step: space between values + stop: last value (might be approximate) + step: difference between elements (should be consistent) returns: NumPy array """ if stop is None: stop = start start = 0 + n = int(round((stop-start) / step)) + return linspace(start, stop, n+1) - # drop the units - start = magnitude(start) - stop = magnitude(stop) - step = magnitude(step) - - n = np.round((stop - start) / step) - if endpoint: - n += 1 - - array = np.full(int(n), step, **options) - if n: - array[0] = start - - # TODO: restore units? - return np.cumsum(array) - - -def magnitude(x): - """Returns the magnitude of a Quantity or number. - - x: Quantity or number - - returns: number - """ - return x.magnitude if isinstance(x, Quantity) else x - - -def magnitudes(x): - """Returns the magnitude of a Quantity or number, or sequence. - - x: Quantity, number, or sequence - - returns: number or list or same type as x - """ - if isinstance(x, Quantity): - return x.magnitude - try: - t = [magnitude(elt) for elt in x] - - # if x is an array, return an array - if isinstance(x, np.ndarray): - return np.array(t) - - # if x is a Series, return a Series of the same subtype - if isinstance(x, pd.Series): - return x.__class__(t, x.index) - - return t - except TypeError: # not iterable - return x +def root_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `min_func`. -def get_unit(x): - """Returns the units of a Quantity or number. + Wrapper for + https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html - x: Quantity or number + func: computes the function to be minimized + bracket: sequence of two values, lower and upper bounds of the range to be searched + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to root_scalar - returns: Unit object or 1 + returns: RootResults object """ - return x.units if isinstance(x, Quantity) else 1 - - -def get_units(x): - """Returns the units of a Quantity, number, or sequence. - - x: Quantity, number, or sequence + bracket = kwargs.get('bracket', None) + if bracket is None or len(bracket) != 2: + msg = ("To run root_scalar, you have to provide a " + "`bracket` keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) - returns: Unit object or list or same type as x - """ - if isinstance(x, Quantity): - return x.units try: - t = [get_unit(elt) for elt in x] - - # if x is an array, return an array - if isinstance(x, np.ndarray): - return np.array(t) - - # if x is a Series, return a Series of the same subtype - if isinstance(x, pd.Series): - return x.__class__(t, x.index) - - return t - except TypeError: # not iterable - return 1 - - -def get_first_unit(x): - """Returns the units of a Quantity, number, or sequence. - - If x is a sequence, returns the units of the first element. - - :param x: Quantity, number, or sequence - - :return: Unit object or 1 - """ - units = get_units(x) - if hasattr(units, "__getitem__"): - units = units[0] - return units + func(bracket[0], *args) + except Exception as e: + msg = ("Before running scipy.integrate.root_scalar " + "I tried running the function you provided " + "with `bracket[0]`, " + "and I got the following error:") + logger.error(msg) + raise (e) + underride(kwargs, rtol=1e-4) -def remove_units(series): - """Removes units from the values in a Series. + res = spo.root_scalar(func, *args, **kwargs) - Only removes units from top-level values; - does not traverse nested values. + if not res.converged: + msg = ("scipy.optimize.root_scalar did not converge. " + "The message it returned is:\n" + res.flag) + raise ValueError(msg) - returns: new Series object - """ - res = copy(series) - for label, value in res.iteritems(): - res[label] = magnitude(value) return res -def require_units(x, units): - """Apply units to `x`, if necessary. - - x: Quantity or number - units: Pint Units object - - returns: Quantity - """ - if isinstance(x, Quantity): - return x.to(units) - else: - return Quantity(x, units) - - -def leastsq(error_func, x0, *args, **options): - """Find the parameters that yield the best fit for the data. - - `x0` can be a sequence, array, Series, or Params - - Positional arguments are passed along to `error_func`. - - Keyword arguments are passed to `scipy.optimize.leastsq` - - error_func: function that computes a sequence of errors - x0: initial guess for the best parameters - args: passed to error_func - options: passed to leastsq - - :returns: Params object with best_params and ModSimSeries with details - """ - # override `full_output` so we get a message if something goes wrong - options["full_output"] = True - - # run leastsq - t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) - best_params, cov_x, infodict, mesg, ier = t - - # pack the results into a ModSimSeries object - details = ModSimSeries(infodict) - details.set(cov_x=cov_x, mesg=mesg, ier=ier) - - # if we got a Params object, we should return a Params object - if isinstance(x0, Params): - best_params = Params(Series(best_params, x0.index)) - - # return the best parameters and details - return best_params, details - - -def minimize_scalar(min_func, bounds, *args, **options): - """Finds the input value that minimizes `min_func`. +def minimize_scalar(func, *args, **kwargs): + """Finds the input value that minimizes `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - min_func: computes the function to be minimized - bounds: sequence of two values, lower and upper bounds of the range to be searched - args: any additional positional arguments are passed to min_func - options: any keyword arguments are passed as options to minimize_scalar + func: computes the function to be minimized + args: any additional positional arguments are passed to func + kwargs: any keyword arguments are passed to minimize_scalar - returns: ModSimSeries object + returns: OptimizeResult object """ + bounds = kwargs.get('bounds', None) + + if bounds is None or len(bounds) != 2: + msg = ("To run maximize_scalar or minimize_scalar, " + "you have to provide a `bounds` " + "keyword argument with a sequence " + "of length 2.") + raise ValueError(msg) + try: - min_func(bounds[0], *args) + func(bounds[0], *args) except Exception as e: - msg = """Before running scipy.integrate.minimize_scalar, I tried - running the slope function you provided with the - initial conditions in system and t=0, and I got - the following error:""" + msg = ("Before running scipy.integrate.minimize_scalar, " + "I tried running the function you provided " + "with the lower bound, " + "and I got the following error:") logger.error(msg) raise (e) - underride(options, xatol=1e-3) + underride(kwargs, method='bounded') - res = scipy.optimize.minimize_scalar( - min_func, - bracket=bounds, - bounds=bounds, - args=args, - method="bounded", - options=options, - ) + res = spo.minimize_scalar(func, args=args, **kwargs) if not res.success: - msg = ( - """scipy.optimize.minimize_scalar did not succeed. - The message it returned is %s""" - % res.message - ) + msg = ("minimize_scalar did not succeed." + "The message it returned is: \n" + + res.message) raise Exception(msg) - return ModSimSeries(res) + return res -def maximize_scalar(max_func, bounds, *args, **options): +def maximize_scalar(max_func, *args, **kwargs): """Finds the input value that maximizes `max_func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html min_func: computes the function to be maximized - bounds: sequence of two values, lower and upper bounds of the - range to be searched args: any additional positional arguments are passed to max_func options: any keyword arguments are passed as options to minimize_scalar returns: ModSimSeries object """ - def min_func(*args): return -max_func(*args) - res = minimize_scalar(min_func, bounds, *args, **options) + res = minimize_scalar(min_func, *args, **kwargs) # we have to negate the function value before returning res res.fun = -res.fun return res -def minimize_golden(min_func, bracket, *args, **options): - """Find the minimum of a function by golden section search. - - Based on - https://en.wikipedia.org/wiki/Golden-section_search#Iterative_algorithm - - :param min_func: function to be minimized - :param bracket: interval containing a minimum - :param args: arguments passes to min_func - :param options: rtol and maxiter - - :return: ModSimSeries - """ - maxiter = options.get("maxiter", 100) - rtol = options.get("rtol", 1e-3) - - def success(**kwargs): - return ModSimSeries(dict(success=True, **kwargs)) - - def failure(**kwargs): - return ModSimSeries(dict(success=False, **kwargs)) - - a, b = bracket - ya = min_func(a, *args) - yb = min_func(b, *args) - - phi = 2 / (np.sqrt(5) - 1) - h = b - a - c = b - h / phi - yc = min_func(c, *args) - - d = a + h / phi - yd = min_func(d, *args) - - if yc > ya or yc > yb: - return failure(message="The bracket is not well-formed.") - - for i in range(maxiter): - - # check for convergence - if abs(h / c) < rtol: - return success(x=c, fun=yc) - - if yc < yd: - b, yb = d, yd - d, yd = c, yc - h = b - a - c = b - h / phi - yc = min_func(c, *args) - else: - a, ya = c, yc - c, yc = d, yd - h = b - a - d = a + h / phi - yd = min_func(d, *args) - - # if we exited the loop, too many iterations - return failure(root=c, message="maximum iterations = %d exceeded" % maxiter) - - -def maximize_golden(max_func, bracket, *args, **options): - """Find the maximum of a function by golden section search. - - :param min_func: function to be maximized - :param bracket: interval containing a maximum - :param args: arguments passes to min_func - :param options: rtol and maxiter - - :return: ModSimSeries - """ - - def min_func(*args): - return -max_func(*args) - - res = minimize_golden(min_func, bracket, *args, **options) - - # we have to negate the function value before returning res - res.fun = -res.fun - return res - - -def minimize_powell(min_func, x0, *args, **options): - """Finds the input value that minimizes `min_func`. - Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html - min_func: computes the function to be minimized - x0: initial guess - args: any additional positional arguments are passed to min_func - options: any keyword arguments are passed as options to minimize_scalar - returns: ModSimSeries object - """ - underride(options, tol=1e-3) - - res = scipy.optimize.minimize(min_func, x0, *args, **options) - - return ModSimSeries(res) - - -# make aliases for minimize and maximize -minimize = minimize_golden -maximize = maximize_golden - - -def run_odeint(system, slope_func, **options): - """Integrates an ordinary differential equation. - - `system` should contain system parameters and `ts`, which - is an array or Series that specifies the time when the - solution will be computed. - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # make sure `system` contains `ts` - if not hasattr(system, "ts"): - msg = """It looks like `system` does not contain `ts` - as a system variable. `ts` should be an array - or Series that specifies the times when the - solution will be computed:""" - raise ValueError(msg) - - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # try running the slope function with the initial conditions - try: - slope_func(system.init, system.ts[0], system) - except Exception as e: - msg = """Before running scipy.integrate.odeint, I tried - running the slope function you provided with the - initial conditions in system and t=0, and I got - the following error:""" - logger.error(msg) - raise (e) - - # when odeint calls slope_func, it should pass `system` as - # the third argument. To make that work, we have to make a - # tuple with a single element and pass the tuple to odeint as `args` - args = (system,) - - # now we're ready to run `odeint` with `init` and `ts` from `system` - array = odeint(slope_func, list(system.init), system.ts, args, **options) - - # the return value from odeint is an array, so let's pack it into - # a TimeFrame with appropriate columns and index - frame = TimeFrame( - array, columns=system.init.index, index=system.ts, dtype=np.float64 - ) - return frame - - def run_solve_ivp(system, slope_func, **options): """Computes a numerical solution to a differential equation. `system` must contain `init` with initial conditions, - `t_0` with the start time, and `t_end` with the end time. + `t_end` with the end time. Optionally, it can contain + `t_0` with the start time. - It can contain any other parameters required by the slope function. + It should contain any other parameters required by the + slope function. `options` can be any legal options of `scipy.integrate.solve_ivp` @@ -564,85 +229,8 @@ def run_solve_ivp(system, slope_func, **options): returns: TimeFrame """ - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # make sure `system` contains `t_end` - if not hasattr(system, "t_end"): - msg = """It looks like `system` does not contain `t_end` - as a system variable. `t_end` should be the - final time:""" - raise ValueError(msg) - - # remove units from the system object system = remove_units(system) - system.init = remove_units(system.init) - - # the default value for t_0 is 0 - t_0 = getattr(system, "t_0", 0) - - # remove units from max_step - # if not specified, require 50 steps - max_step = options.pop("max_step", None) - if max_step is None: - max_step = system.t_end - system.t_0 / 50 - options["max_step"] = magnitude(max_step) - - # try running the slope function with the initial conditions - try: - slope_func(system.init, t_0, system) - except Exception as e: - msg = """Before running scipy.integrate.solve_ivp, I tried - running the slope function you provided with the - initial conditions in `system` and `t=t_0` and I got - the following error:""" - logger.error(msg) - raise (e) - - # wrap the slope function to reverse the arguments and add `system` - f = lambda t, y: slope_func(y, t, system) - - def wrap_event(event): - """Wrap the event functions. - - Make events terminal by default. - """ - wrapped = lambda t, y: event(y, t, system) - wrapped.terminal = getattr(event, "terminal", True) - wrapped.direction = getattr(event, "direction", 0) - return wrapped - - # wrap the event functions so they take the right arguments - events = options.pop("events", []) - try: - events = [wrap_event(event) for event in events] - except TypeError: - events = wrap_event(events) - - # run the solver - bunch = solve_ivp(f, [t_0, system.t_end], system.init, events=events, **options) - - # separate the results from the details - y = bunch.pop("y") - t = bunch.pop("t") - details = ModSimSeries(bunch) - - # pack the results into a TimeFrame - results = TimeFrame(np.transpose(y), index=t, columns=system.init.index) - return results, details - -def check_system(system, slope_func): - """Make sure the system object has the fields we need for run_ode_solver. - - :param system: - :param slope_func: - :return: - """ # make sure `system` contains `init` if not hasattr(system, "init"): msg = """It looks like `system` does not contain `init` @@ -655,276 +243,121 @@ def check_system(system, slope_func): msg = """It looks like `system` does not contain `t_end` as a system variable. `t_end` should be the final time:""" - raise ValueError(msg) - - # the default value for t_0 is 0 - t_0 = getattr(system, "t_0", 0) - - # get the initial conditions - init = system.init - - # get t_end - t_end = system.t_end - - # if dt is not specified, take 100 steps - try: - dt = system.dt - except KeyError: - dt = t_end / 100 - - return init, t_0, t_end, dt - - -def run_euler(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - `t_end` with the end time, and `dt` with the time step. - - `system` may contain `t_0` to override the default, 0 - - It can contain any other parameters required by the slope function. - - `options` can be ... - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # the default message if nothing changes - msg = "The solver successfully reached the end of the integration interval." - - # get parameters from system - init, t_0, t_end, dt = check_system(system, slope_func) - - # make the TimeFrame - frame = TimeFrame(columns=init.index) - frame.row[t_0] = init - ts = linrange(t_0, t_end, dt) * get_units(t_end) - - # run the solver - for t1 in ts: - y1 = frame.row[t1] - slopes = slope_func(y1, t1, system) - y2 = [y + slope * dt for y, slope in zip(y1, slopes)] - t2 = t1 + dt - frame.row[t2] = y2 - - details = ModSimSeries(dict(message="Success")) - return frame, details - - -def run_ralston(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - and `t_end` with the end time. - - `system` may contain `t_0` to override the default, 0 - - It can contain any other parameters required by the slope function. - - `options` can be ... - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # the default message if nothing changes - msg = "The solver successfully reached the end of the integration interval." - - # get parameters from system - init, t_0, t_end, dt = check_system(system, slope_func) - - # make the TimeFrame - frame = TimeFrame(columns=init.index) - frame.row[t_0] = init - ts = linrange(t_0, t_end, dt) * get_units(t_end) - - event_func = options.get("events", None) - z1 = np.nan - - def project(y1, t1, slopes, dt): - t2 = t1 + dt - y2 = [y + slope * dt for y, slope in zip(y1, slopes)] - return y2, t2 - - # run the solver - for t1 in ts: - y1 = frame.row[t1] - - # evaluate the slopes at the start of the time step - slopes1 = slope_func(y1, t1, system) - - # evaluate the slopes at the two-thirds point - y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3) - slopes2 = slope_func(y_mid, t_mid, system) - - # compute the weighted sum of the slopes - slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)] - - # compute the next time stamp - y2, t2 = project(y1, t1, slopes, dt) - - # check for a terminating event - if event_func: - z2 = event_func(y2, t2, system) - if z1 * z2 < 0: - scale = magnitude(z1 / (z1 - z2)) - y2, t2 = project(y1, t1, slopes, scale * dt) - frame.row[t2] = y2 - msg = "A termination event occurred." - break - else: - z1 = z2 - - # store the results - frame.row[t2] = y2 - - details = ModSimSeries(dict(success=True, message=msg)) - return frame, details - - -run_ode_solver = run_ralston - -# TODO: Implement leapfrog - - -def fsolve(func, x0, *args, **options): - """Return the roots of the (non-linear) equations - defined by func(x) = 0 given a starting estimate. - - Uses scipy.optimize.fsolve, with extra error-checking. - - func: function to find the roots of - x0: scalar or array, initial guess - args: additional positional arguments are passed along to fsolve, - which passes them along to func - - returns: solution as an array - """ - # make sure we can run the given function with x0 - try: - func(x0, *args) - except Exception as e: - msg = """Before running scipy.optimize.fsolve, I tried - running the error function you provided with the x0 - you provided, and I got the following error:""" - logger.error(msg) - raise (e) - - # make the tolerance more forgiving than the default - underride(options, xtol=1e-6) - - # run fsolve - result = scipy.optimize.fsolve(func, x0, args=args, **options) - - return result - - -def root_scalar(func, bracket, *args, **options): - """Return the roots of the (non-linear) equations - defined by func(x) = 0 given a starting estimate. - - Uses scipy.optimize.root_scalar, with extra error-checking. - - func: function to find the roots of - bracket: - args: additional positional arguments are passed along to root_scalar, - which passes them along to func + raise ValueError(msg) - returns: solution as an array - """ - x0 = bracket[0] + # the default value for t_0 is 0 + t_0 = getattr(system, "t_0", 0) - # make sure we can run the given function with x0 + # try running the slope function with the initial conditions try: - error = func(x0, *args) + slope_func(t_0, system.init, system) except Exception as e: - msg = """Before running scipy.optimize.root_scalar, I tried - running the error function you provided with the x0 - you provided, and I got the following error:""" + msg = """Before running scipy.integrate.solve_ivp, I tried + running the slope function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" logger.error(msg) raise (e) - if isinstance(error, Quantity): - msg = """It looks like your error function returns a Quantity - with units. In order to work with root_scalar, it - has to return a number. You can use magnitude() - to get the unitless part of a Quantity.""" - raise ValueError(msg) - - # add the bracket to the options - underride(options, bracket=bracket) - - # run root_scalar - res = scipy.optimize.root_scalar(func, args=args, **options) + # get the list of event functions + events = options.get('events', []) - return res - - -def root_bisect(error_func, bracket, *args, **options): - """Return the roots of the (non-linear) equations - defined by error_func(x) = 0 given a starting bracket. + # if there's only one event function, put it in a list + try: + iter(events) + except TypeError: + events = [events] + + for event_func in events: + # make events terminal unless otherwise specified + if not hasattr(event_func, 'terminal'): + event_func.terminal = True + + # test the event function with the initial conditions + try: + event_func(t_0, system.init, system) + except Exception as e: + msg = """Before running scipy.integrate.solve_ivp, I tried + running the event function you provided with the + initial conditions in `system` and `t=t_0` and I got + the following error:""" + logger.error(msg) + raise (e) + + # get dense output unless otherwise specified + if not 't_eval' in options: + underride(options, dense_output=True) - error_func: function to find the roots of - bracket: interval that brackets at least one root - args: additional positional arguments are passed along to error_func + # run the solver + bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, + args=[system], **options) - returns: ModSimSeries with results - """ - maxiter = options.get("maxiter", 100) - rtol = options.get("rtol", 1e-7) + # separate the results from the details + y = bunch.pop("y") + t = bunch.pop("t") - def success(**kwargs): - return ModSimSeries(dict(converged=True, **kwargs)) + # get the column names from `init`, if possible + if hasattr(system.init, 'index'): + columns = system.init.index + else: + columns = range(len(system.init)) + + # evaluate the results at equally-spaced points + if options.get('dense_output', False): + try: + num = system.num + except AttributeError: + num = 101 + t_final = t[-1] + t_array = linspace(t_0, t_final, num) + y_array = bunch.sol(t_array) + + # pack the results into a TimeFrame + results = TimeFrame(y_array.T, index=t_array, + columns=columns) + else: + results = TimeFrame(y.T, index=t, + columns=columns) - def failure(**kwargs): - return ModSimSeries(dict(converged=False, **kwargs)) + return results, bunch - x0, x1 = bracket - y0 = error_func(x0, *args) - if y0 == 0: - return success(root=x0) +def leastsq(error_func, x0, *args, **options): + """Find the parameters that yield the best fit for the data. - y1 = error_func(x1, *args) - if y1 == 0: - return success(root=x1) + `x0` can be a sequence, array, Series, or Params - for i in range(maxiter): + Positional arguments are passed along to `error_func`. - # check the bracket - if np.sign(y0 * y1) > 0: - return failure(flag="%f and %f do not bracket a root" % (x0, x1)) + Keyword arguments are passed to `scipy.optimize.leastsq` - # bisection - x2 = (x0 + x1) / 2 + error_func: function that computes a sequence of errors + x0: initial guess for the best parameters + args: passed to error_func + options: passed to leastsq - # secant - # x2 = x1 - y1 * (x1 - x0) / (y1 - y0) + :returns: Params object with best_params and ModSimSeries with details + """ + # override `full_output` so we get a message if something goes wrong + options["full_output"] = True - # check for convergence - if abs(x1 - x0) / x2 < rtol: - return success(root=x2) + # run leastsq + t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) + best_params, cov_x, infodict, mesg, ier = t - # evaluate the error function - y2 = error_func(x2, *args) - if y2 == 0: - return success(root=x2) + # pack the results into a ModSimSeries object + details = SimpleNamespace(cov_x=cov_x, + mesg=mesg, + ier=ier, + **infodict) + details.success = details.ier in [1,2,3,4] - # make the new bracket - if np.sign(y0 * y2) > 0: - x0 = x2 - y0 = y2 - else: - x1 = x2 - y1 = y2 + # if we got a Params object, we should return a Params object + if isinstance(x0, Params): + best_params = Params(pd.Series(best_params, x0.index)) - # if we exited the loop, too many iterations - return failure(root=x2, flag="maximum iterations = %d exceeded" % maxiter) + # return the best parameters and details + return best_params, details def crossings(series, value): @@ -937,7 +370,7 @@ def crossings(series, value): returns: sequence of labels """ - values = magnitudes(series - value) + values = series.values - value interp = InterpolatedUnivariateSpline(series.index, values) return interp.roots() @@ -966,7 +399,7 @@ def interpolate(series, **options): series: Series object options: any legal options to scipy.interpolate.interp1d - returns: function that maps from the index of the series to values + returns: function that maps from the index to the values """ if has_nan(series.index): msg = """The Series you passed to interpolate contains @@ -985,15 +418,10 @@ def interpolate(series, **options): underride(options, fill_value="extrapolate") # call interp1d, which returns a new function object - x = magnitudes(series.index) - y = magnitudes(series.values) + x = series.index + y = series.values interp_func = interp1d(x, y, **options) - units = get_units(series.values[0]) - - def wrapper(x): - return interp_func(magnitudes(x)) * units - - return wrapper + return interp_func def interpolate_inverse(series, **options): @@ -1005,7 +433,7 @@ def interpolate_inverse(series, **options): returns: interpolation object, can be used as a function from `b` to `a` """ - inverse = Series(series.index, index=series.values) + inverse = pd.Series(series.index, index=series.values) interp_func = interpolate(inverse, **options) return interp_func @@ -1020,46 +448,13 @@ def gradient(series, **options): returns: Series, same subclass as series """ - x = magnitudes(series.index) - y = magnitudes(series.values) - # units = get_units(series) + x = series.index + y = series.values a = np.gradient(y, x, **options) return series.__class__(a, series.index) -def correlate(s1, s2, **options): - """Computes the numerical derivative of a series. - - If the elements of series have units, they are dropped. - - s1: sequence or Series - options: any legal options to np.correlate - - returns: NumPy array - """ - # TODO: Check that they have the same units. - # TODO: Check that they have the same index. - x = magnitudes(s1) - y = magnitudes(s2) - - corr = np.correlate(x, y, **options) - return corr - - -def unpack(series): - """Make the names in `series` available as globals. - - series: Series with variables names in the index - """ - # TODO: Make this a context manager, so the syntax is - # with series: - # and maybe even add an __exit__ that copies changes back - frame = inspect.currentframe() - caller = frame.f_back - caller.f_globals.update(series) - - def source_code(obj): """Prints the source code for a given object. @@ -1085,63 +480,6 @@ def underride(d, **options): return d -def plot(*args, **options): - """Makes line plots. - - args can be: - plot(y) - plot(y, style_string) - plot(x, y) - plot(x, y, style_string) - - options are the same as for pyplot.plot - """ - x, y, style = parse_plot_args(*args, **options) - - if isinstance(x, pd.DataFrame) or isinstance(y, pd.DataFrame): - raise ValueError("modsimpy.plot can't handle DataFrames.") - - if x is None: - if isinstance(y, Quantity): - y = y.magnitude - - if isinstance(y, (list, np.ndarray)): - x = np.arange(len(y)) - - if isinstance(y, pd.Series): - x = y.index - y = y.values - - x = magnitudes(x) - y = magnitudes(y) - underride(options, linewidth=2) - - if style is not None: - lines = plt.plot(x, y, style, **options) - else: - lines = plt.plot(x, y, **options) - return lines - - -def parse_plot_args(*args, **options): - """Parse the args the same way plt.plot does.""" - x = None - y = None - style = None - - if len(args) == 1: - y = args[0] - elif len(args) == 2: - if isinstance(args[1], str): - y, style = args - else: - x, y = args - elif len(args) == 3: - x, y, style = args - - return x, y, style - - def contour(df, **options): """Makes a contour plot from a DataFrame. @@ -1179,41 +517,21 @@ def decorate(**options): """Decorate the current axes. Call decorate with keyword arguments like - decorate(title='Title', xlabel='x', ylabel='y') The keyword arguments can be any of the axis properties - https://matplotlib.org/api/axes_api.html - - In addition, you can use `legend=False` to suppress the legend. - - And you can use `loc` to indicate the location of the legend - (the default value is 'best') - """ - loc = options.pop("loc", "best") - if options.pop("legend", True): - legend(loc=loc) - - plt.gca().set(**options) - plt.tight_layout() - - -def legend(**options): - """Draws a legend only if there is at least one labeled item. - - options are passed to plt.legend() - https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html - """ - underride(options, loc="best", frameon=False) - ax = plt.gca() + ax.set(**options) + handles, labels = ax.get_legend_handles_labels() if handles: - ax.legend(handles, labels, **options) + ax.legend(handles, labels) + + plt.tight_layout() def remove_from_legend(bad_labels): @@ -1231,500 +549,193 @@ def remove_from_legend(bad_labels): ax.legend(handle_list, label_list) -def subplot(nrows, ncols, plot_number, **options): - figsize = {(2, 1): (8, 8), (3, 1): (8, 10)} - key = nrows, ncols - default = (8, 5.5) - width, height = figsize.get(key, default) - - plt.subplot(nrows, ncols, plot_number, **options) - fig = plt.gcf() - fig.set_figwidth(width) - fig.set_figheight(height) - - -class ModSimSeries(pd.Series): - """Modified version of a Pandas Series, - with a few changes to make it more suited to our purpose. +class SettableNamespace(SimpleNamespace): + """Contains a collection of parameters. - In particular: + Used to make a System object. - 1. I provide a more consistent __init__ method. - - 2. Series provides two special variables called - `dt` and `T` that cause problems if we try to use those names - as variables. I override them so they can be used variable names. - - 3. Series doesn't provide a good _repr_html, so it doesn't look - good in Jupyter notebooks. - - 4. ModSimSeries provides a set() method that takes keyword arguments. + Takes keyword arguments and stores them as attributes. """ + def __init__(self, namespace=None, **kwargs): + super().__init__() + if namespace: + self.__dict__.update(namespace.__dict__) + self.__dict__.update(kwargs) - def __init__(self, *args, **kwargs): - """Initialize a Series. - - Note: this cleans up a weird Series behavior, which is - that Series() and Series([]) yield different results. - See: https://github.com/pandas-dev/pandas/issues/16737 - """ - if args or kwargs: - underride(kwargs, copy=True) - super().__init__(*args, **kwargs) - else: - super().__init__([], dtype=np.float64) - - def _repr_html_(self): - """Returns an HTML representation of the series. - - Mostly used for Jupyter notebooks. - """ - df = pd.DataFrame(self.values, index=self.index, columns=["values"]) - return df._repr_html_() - - def __copy__(self, deep=True): - series = super().copy(deep=deep) - return self.__class__(series) - - copy = __copy__ - - def __getitem__(self, key): - """ - - If the key is a Quantity, its units are stripped. - - :param key: - :return: - """ - key = magnitude(key) - return super().__getitem__(key) - - def __setitem__(self, key, value): - """ - - If the key is a Quantity, its units are stripped. - - :param key: - :param value: - """ - key = magnitude(key) - super().__setitem__(key, value) - - def first_label(self): - """Returns the first element of the index. - """ - return self.index[0] - - def last_label(self): - """Returns the last element of the index. - """ - return self.index[-1] - - def first_value(self): - """Returns the first element of the index. - """ - return self[self.index[0]] - - def last_value(self): - """Returns the last element of the index. - """ - return self[self.index[-1]] - - def set(self, **kwargs): - """Uses keyword arguments to update the Series in place. - - Example: series.set(a=1, b=2) - """ - for name, value in kwargs.items(): - self[name] = value - - def extract(self, var): - """Extract a variable from each element of a Series. + def get(self, name, default=None): + """Look up a variable. - Example: to extract the x-coordinate from a Series of Vectors - - x_series = series.extract('x') - - :param var: string variable name - :return: ModSimSeries, same subtype as `self` - """ - t = [getattr(V, var) for V in self] - return self.__class__(t, self.index, name=var) - - def plot(self, *args, **kwargs): - """Plot a Series. - - :param args: arguments passed to plt.plot - :param kwargs: keyword argumentspassed to plt.plot - :return: - """ - x = magnitudes(self.index) - y = magnitudes(self.values) - - underride(kwargs, linewidth=2) - if self.name: - underride(kwargs, label=self.name) - plt.plot(x, y, *args, **kwargs) - - @property - def dt(self): - """Intercept the Series accessor object so we can use `dt` - as a row label and access it using dot notation. - - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html + name: string varname + default: value returned if `name` is not present """ - return self.loc["dt"] + try: + return self.__getattribute__(name, default) + except AttributeError: + return default - @property - def T(self): - """Intercept the Series accessor object so we can use `T` - as a row label and access it using dot notation. + def set(self, **variables): + """Make a copy and update the given variables. - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.T.html + returns: Params """ - return self.loc["T"] - - -def get_first_label(x): - """Returns the label of the first element. - - :param x: Series or DataFrame - """ - return x.index[0] - - -def get_last_label(x): - """Returns the label of the last element. - - :param x: Series or DataFrame - """ - return x.index[-1] + new = copy(self) + new.__dict__.update(variables) + return new -def get_first_value(x): - """Returns the value of the first element. +def magnitude(x): + """Returns the magnitude of a Quantity or number. - Does not work with DataFrames; use first_row(). + x: Quantity or number - :param x: Series + returns: number """ - return x[x.index[0]] + return x.magnitude if hasattr(x, 'magnitude') else x -def get_last_value(x): - """Returns the value of the last element. +def remove_units(namespace): + """Removes units from the values in a Namespace. - Does not work with DataFrames; use last_row() + Only removes units from top-level values; + does not traverse nested values. - :param x: Series + returns: new Namespace object """ - return x[x.index[-1]] - - -class TimeSeries(ModSimSeries): - """Represents a mapping from times to values.""" - - pass - - -class SweepSeries(ModSimSeries): - """Represents a mapping from parameter values to metrics.""" + res = copy(namespace) + for label, value in res.__dict__.items(): + if isinstance(value, pd.Series): + value = remove_units_series(value) + res.__dict__[label] = magnitude(value) + return res - pass +def remove_units_series(series): + """Removes units from the values in a Series. -class System(ModSimSeries): - """Contains system variables and their values. + Only removes units from top-level values; + does not traverse nested values. - Takes keyword arguments and stores them as rows. + returns: new Series object """ - - def __init__(self, *args, **kwargs): - """Initialize the series. - - If there are no positional arguments, use kwargs. - - If there is one positional argument, copy it and add - in the kwargs. - - More than one positional argument is an error. - """ - if len(args) == 0: - super().__init__(list(kwargs.values()), index=kwargs) - elif len(args) == 1: - super().__init__(*args, copy=True) - self.set(**kwargs) - else: - msg = "__init__() takes at most one positional argument" - raise TypeError(msg) + res = copy(series) + for label, value in res.items(): + res[label] = magnitude(value) + return res -class State(System): - """Contains state variables and their values. +class System(SettableNamespace): + """Contains system parameters and their values. - Takes keyword arguments and stores them as rows. + Takes keyword arguments and stores them as attributes. """ - pass -class Condition(System): - """Represents the condition of a system. +class Params(SettableNamespace): + """Contains system parameters and their values. - Condition objects are often used to construct a System object. + Takes keyword arguments and stores them as attributes. """ - pass -class Params(System): - """Represents a set of parameters. - """ +def State(**variables): + """Contains the values of state variables.""" + return pd.Series(variables, name='state') - pass +def make_series(x, y, **options): + """Make a Pandas Series. -def compute_abs_diff(seq): - """Compute absolute differences between successive elements. + x: sequence used as the index + y: sequence used as the values - :param seq: - :return: Series is seq is a Series, otherwise NumPy array + returns: Pandas Series """ - xs = np.asarray(seq) - - # The right thing to put at the end is np.nan, but at - # the moment edfiff1d is broken - # https://github.com/numpy/numpy/issues/13103 - # So I'm working around by appending 0 instead. - # to_end = np.array([np.nan], dtype=np.float64) - to_end = np.array([0], dtype=np.float64) - diff = np.ediff1d(xs, to_end) - - if isinstance(seq, Series): - return Series(diff, seq.index) - else: - return diff + underride(options, name='values') + if isinstance(y, pd.Series): + y = y.values + series = pd.Series(y, index=x, **options) + series.index.name = 'index' + return series -def compute_rel_diff(seq): - """Compute absolute differences between successive elements. - - :param seq: any sequence - :return: Series is seq is a Series, otherwise NumPy array +def TimeSeries(*args, **kwargs): + """Make a pd.Series object to represent a time series. """ - diff = compute_abs_diff(seq) - return diff / seq - - -class ModSimDataFrame(pd.DataFrame): - """ModSimDataFrame is a modified version of a Pandas DataFrame, - with a few changes to make it more suited to our purpose. + if args or kwargs: + underride(kwargs, dtype=float) + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=float) - In particular: + series.index.name = 'Time' + if 'name' not in kwargs: + series.name = 'Quantity' + return series - 1. DataFrame provides two special variables called - `dt` and `T` that cause problems if we try to use those names - as variables. I override them so they can be used as row labels. - 2. When you select a row or column from a ModSimDataFrame, you get - back an appropriate subclass of Series: TimeSeries, SweepSeries, - or ModSimSeries. +def SweepSeries(*args, **kwargs): + """Make a pd.Series object to store results from a parameter sweep. """ - - column_constructor = ModSimSeries - row_constructor = ModSimSeries - - def __init__(self, *args, **options): - # TODO: currently ModSimDataFrame underrides to float64 and - # ModSimSeries does not. Does this inconsistency make sense? - # underride(options, dtype=np.float64) - super().__init__(*args, **options) - - def __getitem__(self, key): - """Intercept the column getter to return the right subclass of Series. - """ - obj = super().__getitem__(key) - if isinstance(obj, Series): - obj = self.column_constructor(obj) + if args or kwargs: + underride(kwargs, dtype=float) + series = pd.Series(*args, **kwargs) + else: + series = pd.Series([], dtype=np.float64) + + series.index.name = 'Parameter' + if 'name' not in kwargs: + series.name = 'Metric' + return series + + +def show(obj): + """Display a Series or Namespace as a DataFrame.""" + if isinstance(obj, pd.Series): + df = pd.DataFrame(obj) + return df + elif hasattr(obj, '__dict__'): + return pd.DataFrame(pd.Series(obj.__dict__), + columns=['value']) + else: return obj - def plot(self, *args, **kwargs): - """Plot the columns of a DataFrame. - - :param args: arguments passed to plt.plot - :param kwargs: keyword argumentspassed to plt.plot - :return: - """ - for col in self.columns: - self[col].plot(*args, **kwargs) - - @property - def dt(self): - """Intercept the Series accessor object so we can use `dt` - as a column label and access it using dot notation. - - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dt.html - """ - return self["dt"] - - @property - def T(self): - """Intercept the Series accessor object so we can use `T` - as a column label and access it using dot notation. - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.T.html - """ - return self["T"] - - @property - def row(self): - """Gets or sets a row. - - Returns a wrapper for the Pandas LocIndexer, so when we look up a row - we get the right kind of ModSimSeries. - - returns ModSimLocIndexer - """ - li = self.loc - return ModSimLocIndexer(li, self.row_constructor) - - def first_row(self): - """Returns the first row - - :return: some kind of ModSimSeries - """ - return self.row[self.index[0]] - - def last_row(self): - """Returns the first row - - :return: some kind of ModSimSeries - """ - return self.row[self.index[-1]] - - def first_label(self): - """Returns the first element of the index. - """ - return self.index[0] - - def last_label(self): - """Returns the last element of the index. - """ - return self.index[-1] - - -class ModSimLocIndexer: - """Wraps a Pandas LocIndexer.""" - - def __init__(self, li, constructor): - """Save the LocIndexer and constructor. - """ - self.li = li - self.constructor = constructor - - def __getitem__(self, key): - """Get a row and return the appropriate type of Series. - - If key is a Quantity, its units are stripped - - :key: scalar or Quantity - - :return: Series - """ - key = magnitude(key) - result = self.li[key] - if isinstance(result, Series): - result = self.constructor(result) - return result - - def __setitem__(self, key, value): - """Setting a row in a DataFrame. - - If key is a Quantity, its units are stripped - - :key: scalar or Quantity - :value: sequence or Series - """ - key = magnitude(key) - self.li[key] = value - - -class TimeFrame(ModSimDataFrame): - """A DataFrame that maps from time to State. +def TimeFrame(*args, **kwargs): + """DataFrame that maps from time to State. """ + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) - column_constructor = TimeSeries - row_constructor = State - -class SweepFrame(ModSimDataFrame): - """A DataFrame that maps from a parameter value to a SweepSeries. +def SweepFrame(*args, **kwargs): + """DataFrame that maps from parameter value to SweepSeries. """ - - column_constructor = SweepSeries - row_constructor = SweepSeries + underride(kwargs, dtype=float) + return pd.DataFrame(*args, **kwargs) -def Vector(*args, units=None): - """Make a ModSimVector. - - args: can be a single argument or sequence - units: Pint Unit object or Quantity - - If there's only one argument, it should be a sequence. - - Otherwise, the arguments are treated as coordinates. - - returns: ModSimVector +def Vector(x, y, z=None, **options): """ - if len(args) == 1: - args = args[0] - - # if it's a series, pull out the values - if isinstance(args, Series): - args = args.values - - # see if any of the arguments have units; if so, save the first one - for elt in args: - found_units = getattr(elt, "units", None) - if found_units: - break - - if found_units: - # if there are units, remove them - args = [float(magnitude(elt)) for elt in args] + """ + underride(options, name='component') + if z is None: + return pd.Series(dict(x=x, y=y), **options) else: - # otherwise, just ensure that all elements are floats (to avoid overflow issues in numpy) - args = [float(elt) for elt in args] - - # if the units keyword is provided, it overrides the units in args - if units is not None: - found_units = units - - return ModSimVector(args, found_units) + return pd.Series(dict(x=x, y=y, z=z), **options) ## Vector functions (should work with any sequence) - def vector_mag(v): - """Vector magnitude with units. - - returns: number or Quantity - """ - a = magnitude(v) - units = get_first_unit(v) - return np.sqrt(np.dot(a, a)) * units + """Vector magnitude.""" + return np.sqrt(np.dot(v, v)) def vector_mag2(v): - """Vector magnitude squared with units. - - returns: number of Quantity - """ - a = magnitude(v) - units = get_first_unit(v) - return np.dot(a, a) * units * units + """Vector magnitude squared.""" + return np.dot(v, v) def vector_angle(v): @@ -1732,7 +743,7 @@ def vector_angle(v): Only works with 2-D vectors. - returns: number in radians + returns: angle in radians """ assert len(v) == 2 x, y = v @@ -1742,7 +753,7 @@ def vector_angle(v): def vector_polar(v): """Vector magnitude and angle. - returns: (number or quantity, number in radians) + returns: (number, angle in radians) """ return vector_mag(v), vector_angle(v) @@ -1750,19 +761,12 @@ def vector_polar(v): def vector_hat(v): """Unit vector in the direction of v. - The result should have no units. - returns: Vector or array """ - # get the size of the vector - mag = vector_mag(v) - # check if the magnitude of the Quantity is 0 - if magnitude(mag) == 0: - if isinstance(v, ModSimVector): - return Vector(magnitude(v)) - else: - return magnitude(np.asarray(v)) + mag = vector_mag(v) + if mag == 0: + return v else: return v / mag @@ -1784,9 +788,7 @@ def vector_dot(v, w): returns: number or Quantity """ - a1 = magnitude(v) - a2 = magnitude(w) - return np.dot(a1, a2) * get_first_unit(v) * get_first_unit(w) + return np.dot(v, w) def vector_cross(v, w): @@ -1794,22 +796,17 @@ def vector_cross(v, w): returns: number or Quantity for 2-D, Vector for 3-D """ - a1 = magnitude(v) - a2 = magnitude(w) - res = np.cross(a1, a2) + res = np.cross(v, w) - if len(v) == 3 and (isinstance(v, ModSimVector) or isinstance(w, ModSimVector)): - return ModSimVector(res, get_first_unit(v) * get_first_unit(w)) + if len(v) == 3: + return Vector(*res) else: - return res * get_first_unit(v) * get_first_unit(w) + return res def vector_proj(v, w): """Projection of v onto w. - Results has the units of v, but that might not make sense unless - v and w have the same units. - returns: array or Vector with direction of w and units of v. """ w_hat = vector_hat(w) @@ -1821,9 +818,6 @@ def scalar_proj(v, w): Which is the magnitude of the projection of v onto w. - Results has the units of v, but that might not make sense unless - v and w have the same units. - returns: scalar with units of v. """ return vector_dot(v, vector_hat(w)) @@ -1847,54 +841,6 @@ def vector_diff_angle(v, w): raise NotImplementedError() -class ModSimVector(Quantity): - """Represented as a Pint Quantity with a NumPy array - - x, y, z, mag, mag2, and angle are accessible as attributes. - """ - - @property - def x(self): - """Returns the x component with units.""" - return self[0] - - @property - def y(self): - """Returns the y component with units.""" - return self[1] - - @property - def z(self): - """Returns the z component with units.""" - return self[2] - - @property - def mag(self): - """Returns the magnitude with units.""" - return vector_mag(self) - - @property - def mag2(self): - """Returns the magnitude squared with units.""" - return vector_mag2(self) - - @property - def angle(self): - """Returns the angle between self and the positive x axis.""" - return vector_angle(self) - - # make the vector functions available as methods - polar = vector_polar - hat = vector_hat - perp = vector_perp - dot = vector_dot - cross = vector_cross - proj = vector_proj - comp = scalar_proj - dist = vector_dist - diff_angle = vector_diff_angle - - def plot_segment(A, B, **options): """Plots a line segment between two Vectors. @@ -1907,12 +853,13 @@ def plot_segment(A, B, **options): """ xs = A.x, B.x ys = A.y, B.y - plot(xs, ys, **options) + plt.plot(xs, ys, **options) + from time import sleep from IPython.display import clear_output -def animate(results, draw_func, interval=None): +def animate(results, draw_func, *args, interval=None): """Animate results from a simulation. results: TimeFrame @@ -1922,26 +869,12 @@ def animate(results, draw_func, interval=None): plt.figure() try: for t, state in results.iterrows(): - draw_func(state, t) + draw_func(t, state, *args) plt.show() if interval: sleep(interval) clear_output(wait=True) - draw_func(state, t) + draw_func(t, state, *args) plt.show() except KeyboardInterrupt: pass - -def set_xlim(seq): - """Set the limits of the x-axis. - - seq: sequence of numbers or Quantities - """ - plt.xlim(magnitude(min(seq)), magnitude(max(seq))) - -def set_ylim(seq): - """Set the limits of the y-axis. - - seq: sequence of numbers or Quantities - """ - plt.ylim(magnitude(min(seq)), magnitude(max(seq))) From d05a61f2962bb810ea139fe692107209713508ef Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 15:47:57 -0400 Subject: [PATCH 100/144] No iteritems --- modsim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modsim.py b/modsim.py index b65c951a..ed012ec6 100644 --- a/modsim.py +++ b/modsim.py @@ -618,7 +618,7 @@ def remove_units_series(series): returns: new Series object """ res = copy(series) - for label, value in res.iteritems(): + for label, value in res.items(): res[label] = magnitude(value) return res From 1e2f797373139af33fcb7260406d7dca0037bca1 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 16:41:02 -0400 Subject: [PATCH 101/144] Updating examples --- examples/bungee1.ipynb | 20 ++--- examples/bungee2.ipynb | 36 +++++---- examples/filter.ipynb | 26 +++--- examples/glucose.ipynb | 43 +++++----- examples/header.ipynb | 20 ++--- examples/hiv_model.ipynb | 20 ++--- examples/insulin.ipynb | 7 +- examples/kitten.ipynb | 7 +- examples/orbit.ipynb | 18 +++-- examples/queue.ipynb | 159 +++++++++++++++++-------------------- examples/salmon.ipynb | 18 +++-- examples/spiderman.ipynb | 24 +++--- examples/throwingaxe.ipynb | 20 ++--- examples/trees.ipynb | 22 ++--- examples/wall.ipynb | 6 +- examples/yoyo.ipynb | 70 ++++++++-------- 16 files changed, 256 insertions(+), 260 deletions(-) diff --git a/examples/bungee1.ipynb b/examples/bungee1.ipynb index 0a146f3d..5c67e507 100644 --- a/examples/bungee1.ipynb +++ b/examples/bungee1.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -692,7 +694,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -706,7 +708,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/bungee2.ipynb b/examples/bungee2.ipynb index 10c1131a..ff6dc9ad 100644 --- a/examples/bungee2.ipynb +++ b/examples/bungee2.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -633,7 +635,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -646,7 +648,7 @@ " \n", " system2 = system1.set(t_0=t_final, init=state_final)\n", " results2, details2 = run_solve_ivp(system2, slope_func2)\n", - " return results1.append(results2)" + " return pd.concat([results1, results2])" ] }, { @@ -658,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -667,7 +669,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -676,7 +678,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -686,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 37, "metadata": { "scrolled": true }, @@ -698,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -707,7 +709,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -732,7 +734,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -746,7 +748,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/filter.ipynb b/examples/filter.ipynb index b625bac2..a7aab5db 100644 --- a/examples/filter.ipynb +++ b/examples/filter.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -71,9 +73,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following circuit diagram (from [Wikipedia](https://en.wikipedia.org/wiki/File:RC_Divider.svg)) shows a low-pass filter built with one resistor and one capacitor. \n", + "The following circuit diagram (from [Wikipedia](https://commons.wikimedia.org/wiki/File:1st_Order_Lowpass_Filter_RC.svg)) shows a low-pass filter built with one resistor and one capacitor. \n", "\n", - "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/RC_Divider.svg)\n", + "![Circuit diagram of a low-pass filter](https://github.com/AllenDowney/ModSim/raw/main/figs/Lowpass_Filter_RC.png)\n", "\n", "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", "\n", @@ -907,7 +909,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -921,7 +923,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/glucose.ipynb b/examples/glucose.ipynb index bde7bb82..e6fefbc2 100644 --- a/examples/glucose.ipynb +++ b/examples/glucose.ipynb @@ -25,22 +25,6 @@ "tags": [] }, "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], "source": [ "# download modsim.py if necessary\n", "\n", @@ -53,13 +37,12 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSim/main/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "tags": [] }, @@ -93,17 +76,17 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSim/main/data/glucose_insulin.csv')" + "download('https://github.com/AllenDowney/ModSim/raw/main/data/' +\n", + " 'glucose_insulin.csv')" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -117,6 +100,16 @@ "We'll use `make_system` and `slope_func` as defined in Chapter 18." ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", + " 'chap18.py')" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -601,7 +594,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -615,7 +608,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/header.ipynb b/examples/header.ipynb index 6b6acc86..be0a4822 100644 --- a/examples/header.ipynb +++ b/examples/header.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -71,7 +73,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -85,7 +87,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/hiv_model.ipynb b/examples/hiv_model.ipynb index d4dd128e..f1abf75c 100644 --- a/examples/hiv_model.ipynb +++ b/examples/hiv_model.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -289,7 +291,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -303,7 +305,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/insulin.ipynb b/examples/insulin.ipynb index 374b7684..3366b38f 100644 --- a/examples/insulin.ipynb +++ b/examples/insulin.ipynb @@ -53,8 +53,7 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSim/main/modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -403,7 +402,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -417,7 +416,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/kitten.ipynb b/examples/kitten.ipynb index 5b87b1a5..f9a5804c 100644 --- a/examples/kitten.ipynb +++ b/examples/kitten.ipynb @@ -37,8 +37,7 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", - " 'modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -483,7 +482,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -497,7 +496,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/orbit.ipynb b/examples/orbit.ipynb index d2eae086..32d03430 100644 --- a/examples/orbit.ipynb +++ b/examples/orbit.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -355,7 +357,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/queue.ipynb b/examples/queue.ipynb index eed8b76c..743a2097 100644 --- a/examples/queue.ipynb +++ b/examples/queue.ipynb @@ -11,98 +11,69 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "*Modeling and Simulation in Python*\n", + "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", "\n", - "Copyright 2021 Allen Downey\n", + "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", + "\n", + "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question." ] }, { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "# install Pint if necessary\n", + "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "\n", + "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" + "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." ] }, { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "# download modsim.py if necessary\n", - "\n", - "from os.path import exists\n", + "## One server, one queue\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": { "tags": [] }, "outputs": [], "source": [ - "# import functions from modsim\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", - "\n", - "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", - "\n", - "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", - "\n", - "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "# download modsim.py if necessary\n", "\n", - "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", + "from os.path import basename, exists\n", "\n", - "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 2, "metadata": {}, + "outputs": [], "source": [ - "## One server, one queue\n", - "\n", - "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " + "from modsim import *" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -118,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -138,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -154,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -170,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -181,7 +152,7 @@ " update_func: function object\n", " \"\"\"\n", " x = 0\n", - " results = TimeSeries()\n", + " results = TimeSeries(name='Queue length')\n", " results[0] = x\n", " \n", " for t in linrange(0, system.duration):\n", @@ -200,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -220,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -246,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -266,7 +237,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -286,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -302,7 +273,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -311,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -327,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -351,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -375,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -402,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -418,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -436,7 +407,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -454,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -463,7 +434,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -485,7 +456,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -501,7 +472,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -517,7 +488,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -535,7 +506,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -544,7 +515,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -553,13 +524,24 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -569,8 +551,9 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -584,7 +567,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/salmon.ipynb b/examples/salmon.ipynb index 4d59bbc1..b63b753c 100644 --- a/examples/salmon.ipynb +++ b/examples/salmon.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -673,7 +675,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/examples/spiderman.ipynb b/examples/spiderman.ipynb index 39ecaa1e..35154f0b 100644 --- a/examples/spiderman.ipynb +++ b/examples/spiderman.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -643,7 +645,7 @@ " results2, details2 = run_solve_ivp(system2, slope_func, \n", " events=event_func)\n", "\n", - " return results1.append(results2)" + " return pd.concat([results1, results2])" ] }, { @@ -826,7 +828,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -840,7 +842,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/throwingaxe.ipynb b/examples/throwingaxe.ipynb index 89f5bc3c..6ca67e19 100644 --- a/examples/throwingaxe.ipynb +++ b/examples/throwingaxe.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -460,7 +462,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -474,7 +476,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/trees.ipynb b/examples/trees.ipynb index c8c4cbe6..5dad9e80 100644 --- a/examples/trees.ipynb +++ b/examples/trees.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "from os.path import basename, exists\n", + "\n", + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -992,7 +994,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1006,7 +1008,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/wall.ipynb b/examples/wall.ipynb index 2fd4d5ba..4814fe1d 100644 --- a/examples/wall.ipynb +++ b/examples/wall.ipynb @@ -54,7 +54,7 @@ " print('Downloaded ' + local)\n", " \n", "download('https://raw.githubusercontent.com/AllenDowney/' +\n", - " 'ModSimPy/main/modsim.py')" + " 'ModSimPy/master/modsim.py')" ] }, { @@ -607,7 +607,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -621,7 +621,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.7.12" } }, "nbformat": 4, diff --git a/examples/yoyo.ipynb b/examples/yoyo.ipynb index 8ecf3111..316e3e0e 100644 --- a/examples/yoyo.ipynb +++ b/examples/yoyo.ipynb @@ -44,14 +44,16 @@ "source": [ "# download modsim.py if necessary\n", "\n", - "from os.path import exists\n", + "from os.path import basename, exists\n", "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" + "def download(url):\n", + " filename = basename(url)\n", + " if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " local, _ = urlretrieve(url, filename)\n", + " print('Downloaded ' + local)\n", + " \n", + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -139,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -160,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -170,7 +172,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -180,7 +182,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -189,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -198,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -207,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -249,7 +251,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -276,7 +278,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -294,7 +296,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -311,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -330,7 +332,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -346,7 +348,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -372,7 +374,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -393,7 +395,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -411,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -427,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 21, "metadata": { "scrolled": false }, @@ -445,7 +447,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 22, "metadata": { "scrolled": false }, @@ -463,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -488,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -506,7 +508,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -526,7 +528,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -545,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -564,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -585,7 +587,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -599,7 +601,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, From 67bbab01e13a50f722fa2badb05cc369e46aa5ad Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 16:46:59 -0400 Subject: [PATCH 102/144] Updating chapters --- chapters/chap01.ipynb | 2 +- chapters/chap04.ipynb | 2 +- chapters/chap05.ipynb | 6 +- chapters/chap11.ipynb | 10 +-- chapters/chap18.ipynb | 7 +- chapters/chap22.ipynb | 147 ++++++++++++++++++++---------------------- chapters/chap24.ipynb | 4 +- chapters/chap27.ipynb | 2 +- 8 files changed, 87 insertions(+), 93 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 9d0da03b..7bb182f1 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -1335,7 +1335,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index 20361f9d..f233a1f8 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -793,7 +793,7 @@ "source": [ "### Exercise 6\n", "\n", - "Continuing the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", + "Continuing the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and `p2`.\n", "\n", "```\n", "p2 = 0.3\n", diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index 3f630bb1..04ddeaab 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -390,7 +390,7 @@ "outputs": [], "source": [ "plot_estimates()\n", - "decorate(title='World Population Estimates')" + "decorate(title='World population estimates')" ] }, { @@ -829,7 +829,7 @@ "source": [ "results.plot(color='gray', label='model')\n", "plot_estimates()\n", - "decorate(title='Constant Growth Model')" + "decorate(title='Constant growth model')" ] }, { @@ -917,7 +917,7 @@ "source": [ "results.plot(color='gray', label='model')\n", "plot_estimates()\n", - "decorate(title='Constant Growth Model')" + "decorate(title='Constant growth model')" ] }, { diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index 2c9e09bc..cddab379 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -581,7 +581,7 @@ "def plot_results(S, I, R):\n", " S.plot(style='--', label='Susceptible')\n", " I.plot(style='-', label='Infected')\n", - " R.plot(style=':', label='Resistant')\n", + " R.plot(style=':', label='Recovered')\n", " decorate(xlabel='Time (days)',\n", " ylabel='Fraction of population')" ] @@ -772,7 +772,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "id": "parental-thunder", "metadata": {}, "outputs": [], @@ -782,7 +782,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 23, "id": "recovered-freeze", "metadata": {}, "outputs": [], @@ -792,7 +792,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 24, "id": "suited-spanking", "metadata": {}, "outputs": [], @@ -826,7 +826,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index 80bb5739..b82e3a16 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "formal-context", "metadata": { "tags": [] @@ -42,8 +42,7 @@ " local, _ = urlretrieve(url, filename)\n", " print('Downloaded ' + local)\n", " \n", - "download('https://github.com/AllenDowney/ModSimPy/raw/master/' +\n", - " 'modsim.py')" + "download('https://github.com/AllenDowney/ModSimPy/raw/master/modsim.py')" ] }, { @@ -796,7 +795,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 09f59fc2..83941ba4 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -147,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 4, "id": "handy-terrain", "metadata": {}, "outputs": [], @@ -167,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 5, "id": "vocal-latino", "metadata": {}, "outputs": [], @@ -177,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 6, "id": "controversial-shower", "metadata": {}, "outputs": [], @@ -195,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 7, "id": "digital-channels", "metadata": {}, "outputs": [], @@ -205,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 8, "id": "automated-drove", "metadata": {}, "outputs": [], @@ -224,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 9, "id": "conditional-latitude", "metadata": {}, "outputs": [], @@ -243,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 10, "id": "encouraging-cabinet", "metadata": {}, "outputs": [], @@ -270,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 11, "id": "peripheral-tattoo", "metadata": {}, "outputs": [], @@ -295,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 12, "id": "strange-cleaning", "metadata": {}, "outputs": [], @@ -316,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 13, "id": "cellular-community", "metadata": {}, "outputs": [], @@ -340,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 14, "id": "monetary-firmware", "metadata": {}, "outputs": [], @@ -363,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 15, "id": "explicit-piano", "metadata": {}, "outputs": [], @@ -381,7 +381,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 16, "id": "relative-republic", "metadata": {}, "outputs": [], @@ -413,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 17, "id": "narrative-latest", "metadata": { "tags": [] @@ -451,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 18, "id": "bored-billy", "metadata": { "tags": [] @@ -462,7 +462,7 @@ "\n", "def make_system(params):\n", " \n", - " # convert angle to degrees\n", + " # convert angle to radians\n", " theta = deg2rad(params.angle)\n", " \n", " # compute x and y components of velocity\n", @@ -494,14 +494,14 @@ "\n", "* `vx` and `vy` are the components of velocity.\n", "\n", - "When we call `System`, we pass `Params` as the first argument, which means that the variables in `Params` are copied to the new `System` object.\n", + "When we call `System`, we pass `params` as the first argument, which means that the variables in `params` are copied to the new `System` object.\n", "\n", "Here's how we make the `System` object." ] }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 19, "id": "ethical-donna", "metadata": {}, "outputs": [], @@ -519,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 20, "id": "legitimate-gossip", "metadata": {}, "outputs": [], @@ -539,7 +539,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 21, "id": "legal-terminal", "metadata": { "tags": [] @@ -575,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 22, "id": "frank-chick", "metadata": {}, "outputs": [], @@ -598,7 +598,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 23, "id": "suitable-salem", "metadata": { "tags": [] @@ -627,7 +627,7 @@ "We don't use `t` in this example, but we can't leave it out because when `run_solve_ivp` calls the slope function, it always provides the same arguments, whether they are needed or not.\n", "\n", "`slope_func` unpacks the `State` object into variables `x`, `y`, `vx`, and `vy`.\n", - "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute drag force, `f_drag`, and acceleration due to drag, `a_drag`.\n", + "Then it packs `vx` and `vy` into a `Vector`, which it uses to compute acceleration due to drag, `a_drag`.\n", "\n", "To represent acceleration due to gravity, it makes a `Vector` with magnitude `g` in the negative $y$ direction.\n", "\n", @@ -658,7 +658,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 24, "id": "closing-simon", "metadata": {}, "outputs": [], @@ -688,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 25, "id": "brief-level", "metadata": { "tags": [] @@ -712,7 +712,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 26, "id": "threatened-alberta", "metadata": {}, "outputs": [], @@ -730,7 +730,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 27, "id": "special-background", "metadata": {}, "outputs": [], @@ -753,7 +753,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 28, "id": "prospective-external", "metadata": {}, "outputs": [], @@ -771,7 +771,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 29, "id": "medieval-calvin", "metadata": {}, "outputs": [], @@ -790,7 +790,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 30, "id": "gorgeous-survey", "metadata": {}, "outputs": [], @@ -809,7 +809,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 31, "id": "failing-bangkok", "metadata": {}, "outputs": [], @@ -828,7 +828,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 32, "id": "copyrighted-highway", "metadata": {}, "outputs": [], @@ -847,7 +847,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 33, "id": "structured-adams", "metadata": {}, "outputs": [], @@ -875,7 +875,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 34, "id": "spare-burst", "metadata": {}, "outputs": [], @@ -900,7 +900,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 35, "id": "dated-browse", "metadata": {}, "outputs": [], @@ -933,7 +933,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 36, "id": "resistant-vegetation", "metadata": {}, "outputs": [], @@ -956,7 +956,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 37, "id": "starting-fabric", "metadata": {}, "outputs": [], @@ -1003,7 +1003,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 38, "id": "prescription-boutique", "metadata": { "tags": [] @@ -1052,7 +1052,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 39, "id": "optical-weather", "metadata": {}, "outputs": [], @@ -1064,7 +1064,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 40, "id": "acknowledged-belgium", "metadata": {}, "outputs": [], @@ -1074,7 +1074,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 41, "id": "spatial-ensemble", "metadata": {}, "outputs": [], @@ -1084,7 +1084,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 42, "id": "domestic-apparatus", "metadata": {}, "outputs": [], @@ -1094,7 +1094,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 43, "id": "correct-pittsburgh", "metadata": {}, "outputs": [], @@ -1114,7 +1114,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 44, "id": "global-referral", "metadata": {}, "outputs": [], @@ -1126,7 +1126,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 45, "id": "appointed-sugar", "metadata": {}, "outputs": [], @@ -1136,7 +1136,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 46, "id": "specialized-mediterranean", "metadata": {}, "outputs": [], @@ -1170,7 +1170,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 47, "id": "directed-moisture", "metadata": { "tags": [] @@ -1193,7 +1193,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 48, "id": "fuzzy-register", "metadata": { "tags": [] @@ -1217,7 +1217,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 49, "id": "returning-fellowship", "metadata": { "tags": [] @@ -1239,7 +1239,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 50, "id": "reasonable-swaziland", "metadata": { "tags": [] @@ -1262,7 +1262,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 51, "id": "attached-shower", "metadata": { "tags": [] @@ -1275,26 +1275,21 @@ { "cell_type": "markdown", "id": "amazing-horse", - "metadata": { - "tags": [] - }, + "metadata": {}, "source": [ - "We can plot the `Series` like this." + "Here's what it looks like." ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 64, "id": "christian-camcorder", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "C_d_series.plot(label='C_d')\n", + "C_d_series.plot(label='$C_d$')\n", "decorate(xlabel='Speed (m/s)', \n", - " ylabel='C_d',\n", - " title='Coefficient of drag versus speed')" + " ylabel='Coefficient of drag')" ] }, { @@ -1309,7 +1304,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 53, "id": "heated-belfast", "metadata": { "tags": [] @@ -1330,7 +1325,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 54, "id": "engaged-provision", "metadata": {}, "outputs": [], @@ -1340,7 +1335,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 55, "id": "directed-fiber", "metadata": {}, "outputs": [], @@ -1350,7 +1345,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 56, "id": "framed-dealer", "metadata": {}, "outputs": [], @@ -1360,7 +1355,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 57, "id": "accomplished-elizabeth", "metadata": {}, "outputs": [], @@ -1370,7 +1365,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 58, "id": "going-techno", "metadata": {}, "outputs": [], @@ -1380,7 +1375,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 59, "id": "brief-saying", "metadata": {}, "outputs": [], @@ -1390,7 +1385,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 60, "id": "spare-pregnancy", "metadata": {}, "outputs": [], @@ -1400,7 +1395,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 61, "id": "catholic-staff", "metadata": {}, "outputs": [], @@ -1410,7 +1405,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 62, "id": "broad-sequence", "metadata": {}, "outputs": [], @@ -1444,7 +1439,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index 68cfc0aa..fa25bd5a 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -487,7 +487,7 @@ "id": "running-tutorial", "metadata": {}, "source": [ - "The final value of radius is 0.55 m, which is `Rmax`." + "The final value of `r` is 0.55 m, which is `Rmax`." ] }, { @@ -901,7 +901,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.12" + "version": "3.10.6" } }, "nbformat": 4, diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb index 5046d8ff..6f3a40f3 100644 --- a/chapters/chap27.ipynb +++ b/chapters/chap27.ipynb @@ -88,7 +88,7 @@ "source": [ "## How run_solve_ivp Works\n", "\n", - "`run_solve_ivp` is a function in the ModSimPy library that checks for common errors in the parameters and then calls `solve_ip`, which is the function in the SciPy library that does the actual work.\n", + "`run_solve_ivp` is a function in the ModSimPy library that checks for common errors in the parameters and then calls `solve_ivp`, which is the function in the SciPy library that does the actual work.\n", "\n", "By default, `solve_ivp` uses the *Dormand-Prince method*, which is a kind of *Runge-Kutta method*. You can read about it at\n", ", but I'll give you a sense of\n", From 32aaa7ba695795b0ae443edfe76f6d9b9e6d185e Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 16:46:59 -0400 Subject: [PATCH 103/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240367 -> 240629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 12baf6af19630b6099d634238170e16a0961b3a2..9949a6f52dc14595d072564f21e27856a9192209 100644 GIT binary patch delta 94267 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 CuCI&$ delta 93928 zcmY(KRZN{*+qKui-QC^YDPEwsyIXO0XW>xX7w%Hr-JRm@THGm4De&*^{Uv|igZUhc zjFIQ$PDbW+XFjZ;TrZ*EDa%1ZVF3UDH~>O{u*SsL`|L6;01yub12cg{;PXsK1VnfM zt(Pxev^u z@V6R5G-4nq_wj^}Mx(v>pjI?V_Nd?))v#k&=ANP!pU`@dVY;UwbMJ@*)jKy?MJ)AB z&u@$%NV34S-?;d(bge*;z7KB_QJ$g>Ey>}bL0dj?pnY~~KUZ22Kh)v*+#)04@t0Lu zV!gOS{mZup{q-(=%DRjUb8hN92XLs)?VV5iCdFQdLJ!9|17Ry1uQuKpRpJlD%;l=g zY28`cALrT(3QQ5-G3&m}OBzO{lnB=SXtwGFIoCfJo;m84I4;=h73Uf`CZg@D5^Flv zaFrFAa;GkDx6-JysIHZCsdEz%cogZHWUlsVn%8F_aIA$qtNf+}ejlMW+OzsN90J@R z;SMlFh0+xw$Sc@Ht78bM)IMWJvHXaFLzMZ%h0uX`r2R;)N!2}no|S>9;gGT-RdYQA zNd?W$g|qlnqT>BMeM!GVo7x`vDvRc$NuD0?u zl>oY3#6m=iBJJ$1+;EjE|LE7d#t{?Sm)`kHB$4JM$({s_J+(|JM71iG<*>SX5%mVm z(yx$Yu=Tp4K&eoU$3|}H5MH;O#R}*v&{yks6QeIHYU&>3NJm|=RU}F2s*?eX<>vUL z1q5N(l3T8NCT#q9rAZYNo-$8w{B6|-ZJ7Qn`!38JFS)h&;~xUhUw%pZ3AI47=L z&k=^mTF@AZ%VXYbYd+5$JP$tBh3qDY#-e3YmD4wBs29G)jUt!A<_qNINw}pbf@;+M z2q5^C)aVh%j|Mq15ANJnf8?>qm8XN|^}+U!S@No7_7Lov+)+V&R+J?{hDf93*&S^X z6yrq)22-D6^;zgYbB-mp%WC!z7?fBmi|UH9gRkAJB=Cab?}ez=>+L-lYmlQ*9750? zM;m!|)(y~*!l-F~L>kz16=J(LfXpSE3x0I}B+!9Z2-~|@Lv!#o;b?3g%&)uKv8m3{ zpR?dGNsZ^_c;am{)NEtd-$yYQ@cRfzjbKy(Mt54u=6#`aF*(B8Ml^EJ_W47j;gbq` znDml+vB1xN>$-lrVBV5_5y&!O>*^>^!B-1={miq6Bg|6q;*}EfgK$uU3q(Jv>&;c2 zS=XWD!#jrl4#*JyWYo22)Y<|6b}vHvgR<+f%rZW?cYaRcMy$1NB3{GR@N*w;wm8H* zkmDen_LPSwwPN?Bt8gGCl@6>5iNaRtP~zl zd7bTC^M0ow+uzABMDBj6q1PKw>_|WJbI(&WH@)vT-a(EHs%G#_EMLJ~HcAt_5RUFl z_=Z8%D>zYG%dX)$Ok;@Ej&w6WmLrWuB=RO@i|@29rq}br^TPy&(yYmU$$17ZBdnqY zow#46J67W~#p!y5|AL9QTVwcPzh&d7G5($?J5?}mpN~#6StZYfUiNgm0m&&~S-)oD zK)qguBI^(k?EEE=-v02MCg?3AzS!tPoJV5MVi>t@u?MpI{N*n0is7qx9Bs_L2 z1o7}tNPMxG_~TGXrA>l0!@jQcH0QmJo4iF$4D3sOrIv!$d1Cha)+j|Y24o(ci8CY` zvmHo3g&1J?lyD?`b?u69&5(WhV)^lU@$tVknJh@h1^Z7OKK*kVJ?VPLp#GL;GQZ5f z>dRl%P399G%3n1a&o+97003~Y__tD%S4~j`yYHSB?1^dZ z2)ExXcSFU~HWvM7&&BFSg!~xg$-XE%SW(xG0p=0(6~Wlq0zWse!X(Xpr)A1#sb~gkwF@jAUz>>yOM#32NjrK z>VEnAZZ9dm1!{%>Wr{{YtwSN4`z81Iru?-0zJj+`EStH`X^gUmkxw z!dk94(rDDFa)XGMrWZ-u;;lqX&cPu=?!Wcl$^C-bOEG_ks2SQD>^dkxa>Z9J?R--D zsiMp_tiQ@l@s!rOnwlp0jf|mrnaiDJ8CTo#rdw&n5WLnor3_xEKn_8pk2Jcc8R*&- z78a@JLrR43cQCS>=mM+Fbj97}(=k^edrmjq7iuf@p%~#asA&S( zg=Lqoya@6}7elJ>{xnAIz=)q)5RdWvBEu{qB^y_nGeRb)KU&#MpM9kWf*9|J`{o=m zv#oAs5ft2T`qk%G11(e0w9XvX8vV%3Gi2B^Iq4o}MygIkvN--)g{iWE(6{CJkxCMR zHsmbrN-R-GKT~)5n?drJL)31+L)4J9s3A3&&pIHxj{5dl3+m{y#^pgYrzJSMHfN&k zd$vbE$EH{@O|}sol$e%2uC{Os(oU0BK66AQ?q5mPqXbo@r9UMg_Q(M<`wCJ%kzhD* zy{Bc!mr-Ar2##G;`NLO><&Ix{20(hYk_{YvEj=7mKdJ2pj9h(g_%^g8ATPMR$$TD` z5DnygfYK(x01TMZFnlRdl_ArDY!f9Jh)JDB$!f6u1}mMz zaCqFrYv3VFsfPX-6VywjzcLN0)lrqhor0EM4kmh`!SpvZ!DEc*$T6n9`7G^|w&2xs zwqK&tBbw%jZgh~6XN4Lh+E%$clB=zs;5?IxD$Vz#=>tVS;Y4%9;*tLfcpxYI|#I*4eu2}G+<+>Wfg&Yi(*;OP9SGg*hIqU>p+JBBL{r;&w*GzwO z`~2`whC61e?LOd;GIKu*zx7Kud#Jq*7p?L<;N5^63Jpoi~><(QViXw=TdFAZI=3rD`Thsa)6QF_jBxX(Nvc=O9 zR2~?u*^Zj<-F7h=iS?;HrY!BZFd25dof$x5U_%QXI$OZ;=S7`9FSnJBPn&6KwGOf2 zJC!n|`p4I`)M!m~#7Xkya18dHjiI~HZS2jD>YWeUcp{N}w}7ezCUMYMP6`?<#Lip? z5gsqM#=P_Dwq!Z-BDUutI%DqlBaJ%I4tN{N5G~lMN)+SkEOh1FZrOn2*SG=v6I1S) zfer6#S<5;9#&k=1i+IMyqg<1NY4n9gH5-43xB=I)oo9#Bd?5Y}l3N@&ES$k$Vw$+Y6!9O<@ZT&N5Ple@0V6;>m z%0}s9#t=Hc#SATEg)l83EoW;uv(;C%PogVx!KJH&w0N)n^x+0Ub4Nbo6J+tE2vi5- zMZ_D}QYiPbdb$A|p&~US1m?V>g|wXo;>2nQX$Nvjd|fyE(Gy&U8c+Oin%q6${~#l^ zouD{j!+jPOJSgo9@ALQ?xBWCauBiFFJxW?-0=aD{xJGNN3R}lgTxYAI6pP-Nst;0k z*Z)<>^qsHvE!+`gJy@Gz<`4CuNJtTC27?XLw0Syog|p8?j76oY1C;``EzR&v6U!U8q*0+Sup6Q7{e^6-ziKhh(bNcX|ldG_1BwR zep8qHff(!87sDewDF=--pZ$`8PzP+vKmJ%}U+KL-l0Q$wq}MIPk8##!w5`4dcYJ-G zbq@WA#T6VCMC?)B4}{sg?)-Js#@c~%uIYbz-Z8RklmY=HKa?GLPJ@}LS0s%)Z>TFI zqb>AHh`Q+pjb|6+xUyPeZq&ck3Ohpy3@{SH!nox5YxXitdzx|1zGm$d7Myro)Hdhkp)Ei=5m%ouHE^M;z)}{+mY|T?E zTDj9P)KOB&uRWQ*!`l{+Y5wdz!1S8d|46x5&^a|mtlRCsYJ4>@2N ze&beyCNWxA&L zjA~ej43G<1@6W)KS3x}4PR?TGBT}qfHM>O_Xb#J_=}jU1*rwARfs?+ffzg2a=?y1~ z#aRj0dY$>;zHWjn5HKkySLyu5>nwhUj-x#nmw=CtY0&0@JGIdr0_mQgN?Yi;*q%ie zg4IXb#~mE}aOgAoj?76b0)aiWHDnhae*v)#cK0$`4nrC7Pe?%a_tx+C4`keFvJWwy9d zO|~BbJ8X%tJZ$CrL-vJB(Xz59GjbU}JB0>JOT~{rw6>P+`H&&!Uf&TIX|>A>N`g~& zLj#TaTu?4YvXHa5ROAsQfA(@Zj(B7*Pd!3f57)=;E82Mqa$dg-5Bd-4yPn*DiiMap z_S=pc^v&^23wmg0qC;YMH#JrdKPDIufJm<)Ado`` zRdM6UTicjRa?XN9pY_%PJ@flNne+6)6zfPz&Lr#+E|VCn18DkYK&PD zy;JpNcnP9`E_K)OK#Rn3QBpz%?L#M?Yev_7ZDW1Fk;ENr{_P|cpybi^WnMP7Oqzoc z4(7bf)Q(TFAqAd}kR1xepg#5r;&Z~2%9rFEjtHj98?4!@_dh6bICfHW zR_r)<{dDTFAIHSX0Yt_qd+(fY-aTT1*-GOI3pu+}KaTx9ey1G2aVWxvfCgTRe&CkD zN0W}xgbpOVy4n^L+6>P@N3t@2xcmh!qkVgosF-3681-Yyu&BW{LGPO<4YOGIzL)iA=4K-97qc@mZ>Ms zKfVcZS23mwDEU_5m(N}Kf-1KS%606>>D)K$DPyXd!79!SV!R9A4Vlo~!wn>J|`N|O;{SA4G)yiP5Fca1F{F0^I)x<9A5G|noWJy9Kgv1{QS zO1pJKiZ=83yXy}7n{(!(^(bnHHaAfTrm*7rpO}o!U`|wpB1hsBf^daa|FF0(L!MMH zBFoWMf6>T`NALa!HclO6oa6~^M7$&-6M2drKY@n|Nh{)joH0EGe6r4}NP%QlUg=i0 zvD;i_4BPM!BGp6jzCSDs5o>h{IT7|=+=?QCh6Yc|&}h~&LQ-PK9v-sV)EK5*YOeP- zp(@W&=KC?Q$Fs)`1RW9V`kGvFt>06g6=_3 zx$8zgFLy>+qxEl|MC;(Gd&oZyFtqmUp+$Wb)OL>*O%EgKVWh`^ludUuSzqFhx2c=rqS%@ z9ti*->iORe0x|dh?;zm*I{i0(ll+(W{rztq@vqwQ`w{KmyjnC5S~uZ8D-H9%d1CMi zA`toS{T1aOSL-<<&=DI%Ch>E0<_({|&7$i@`29qxP$=3AK_|XtORnZ^RZB&sI@W~r z#(?Fi3wzKC81u0w`v`Ge(Qo7a@M71z&`O4jv%?6HEjsjD0BY3pQ}OGPg|hjh9n4(o zCw#EnxA>{+??QG>`054v*N(RAoA)vk$%u-&nR=x+c!<^5dS#2zJkn*j zvg9lwwUmxsDN(e+imuIvX>>;Q-q{tVNE)J@Tc{FyqoOCv?hSZ(1Xs9ADXjYECfd<~ zmO)zn96T4cW$Ox1#`FC;K6~=1grC;_;5xntWlF{eMvLBIEuTNEY?icyQo^5&pac&9 z+*vRwn|h#EmFpSF3Hgut&0EiG zZdzeQdClXn&KOm~=fsM5T1ZaX3>iOj?eE zcybgsjHLBFzw25$xy63tCX$a`E_HxV6a9VwL-;NS?S)`>cs+WWjkl3wYB#{zlz$z4 zfEz-Wh#pjhwOmD$7}w1iKn3Emxy6ZZRGZb%u8TDQk$61%%G*!8)Ve2r=h-J{V~k_v zd+CHM973Pv)~Wcut_e2u2cQMJqPE&iad$){9Nnc=|9NaOP;8XFiF>yoT^w%B-ZN{l zc3ZcWmUE72je5T9bGr&#@;;LKIt=a-_xs(uUQ^PlKnAz-#)wv?&LQzlL*tBGg;CPR z*PT@egf7p6!eK$5-lTp8x}Ln47G^78=i`N4X3O2m$ys?ij0@h*uDfowYgGy;u7SD- zRg)b{!>^(KR0u^u42;Vh4e*%`A9t{t+=nShbRggTF8X2-2CQ|xvP68>2$js#31huP zB89HEj5QHcP)TGAF2~eAWW`AyYaz(kfrBdr;d0R?SYTB87-(B-EHyyL1)$9-x)Ek9 zQ?k!hY7kLc4h~BYJ0P}`w`h&v=XlK4PMC6xpvWq2j>UM`J^9>*C@!-+a%snqcTx z3346(m{pQ(lutDd^VTxsGePH%mF&F@+MUnLN4lH|4hlo)!%cKy5HN#N*GcCl>{q(WaF$hhQq3Z2=he8hm@^;n8U5e( z1KZ02|E)iYzxsDsAOrrt{WskdqwG!!0H8Ym7k@MRFHZm0_Rs!4j`Uxf>^>*(4>kb6 zru3g}Jmfzc<6ql$2oU?fjs`zv{P!2;zdA=IFc=T{?^;9d)0nIyJ^+vh?r#7x{_R)R zzlOU8pf3=J4t8t;j)B^!^hmod~Lsm@qI_ z7}iUKb+WB7G|f@Ju%0+#Q5?Bg*LtDC_P?9sTdxf<=BZcrym>c}%5j?XhXw6xf7@gt zz3$uwW{|}Rl%J(VH~}w$+@k^fGIf!3-ie&tWzmSoHzV`>0v5}4k_e`_7qZn21nGdT zR@p;4=xnq)5l|3+K5sjnu>;Me91(+CNw!fY(&;94LwD*G+|j4;J1c_11iD7XVNE}K zLzF4kfq;D2*h4F!6|#raG@NeA>4YCIL_=D-H;PE|xSoU%i?o|ElD==)!fHOMG2{Km z!^uP9I`(6bjRFP8pNw{Qkkl_mxZb@+c0FgcV*ltcw}T`DnEB;(34<;+6XNl|F2Vb* zsA^E+0c&bkH`D`K9e7^g)Jd?|%s2~QziewXqW5^Y;u9NkolA#GBJaI?27aUslhNm{ zK+uLhNL&wG^3%G?cBs;=a@LvHOfe&~@U~%g?{eEeNki1y2R!|G*G+$*sh0z^1p-Z{Bd{I~-iRx~J{E z?jxwjAc%o%Rib_~(YlqWJ@c<%Qu=kcv02f|#=AWruj={)2P<&lfMw^4maADlX5)`n z^)8mMBHH|lqK+pIb&)#~;RjLgkDiP|1a;(VB?wYXnHFxpAFI}Kpx>_EcX0^Z3;B*= z2rtcy#7}~?2*+bgb7i9Naz8fynW)>VIq$+4CT0o^hCT<;P?(zKmAMlkjzZf9Au4?N zL9srpZdxqTZpg(Xeikylub*5itaN6BIl7iP ztPuq2qpQmVfRNW3*A8RCr)wSL?)s32~1gWNO#*zK-1cCBHs@R1S=AAEL4IYmx*Q-GU=L{NT0LSG=LlM6_#7MaDGASRJ zO+aZSZ=F4wKYH2cB8|6DVJCjKQx&4Vy?=wk8m!O`{y9z#S+&nS? zwx&Vgl&P{9$&s3CnFrk61#|`Z38xFQ89z=Kyk48^6A@ZC-qXq6^me8XZJfSM4u9_4 z?8CU1P8AUR@g>(R&IM3I_>-wB48A&*he}7Tgfjtyjss|)s@x5k;!=YBr!z5J?wwFo ze^S8&$AuWNDfLh2C89m|r(I`;OUz_`fMaibO5J7Ksv$)`RsQ8_4zW9^P#n8<;V6&~ zL-N#S0~Q(|4xyu%1h$W${2&^fH9foSRQ*EWM?d@7j#O2jbcZLP3pWP*+(sAw_EkXq zq21#R<+|^?e{?UYnx^Sl9&x?GKdqZw(ZwRm8T*(bXV-=2H79Yz;17DNhbHF>p!G+K zmE|gr!#{lX`#uNJA5jK+?*7x}owth<^DPpO0B7g@f~b5G{*ojSq5%JC!$T5T8j8~- z%5rcDr8DZoWW~5@5l7A0GAQG-nOMo9GNn9rsNA!N2`c*C0W z#|tHLa}^^Brnu-}C)^)S9pdTL_Cztxhkj^~(ZcZO3Wx9=NScnj%CT zfYx{!{MrOg*mH}3BD;*)MhF34d9|-6EMdktnqT3LC!LOwUO`3);;3ZkRNEc-FUq!S zrz0vF-}{z6VZwTYtgi>^LLcjiHip%FkF5PQ!^MY}gZNw{>C zZMp!by^x|0Ulxj&2O=1>(lSbPGw@J?F7Hm=@+9oVag7o{lLBlLv}T-n^+E~1a)NoT zX6%rhv+&NU{REF9WuY+j@9XQ&_2uIi(ed)TbZ<}B4x-T~yeV$2zpE_x#8D{W6nm^? zm?60aaxe-B`M7#4%Fkadc}2DDaA;_c3iUjp?!KFhqEU785sV+#zSZ#}WXr+VB~!%j zn>uH{T@Lqvx>0uVD-igYuGHAhrr|YVrHx==KIf^O%w&V-ha8XiKtwz1vF_0q|VxwV{@W!}wwQjW?w1 zaB(4DqdQ-FvRR6pIkZ%By4QB^6%eBD4CfL9eTthV0!X!C_;!IX!r^^Gihf2p41*<}cfZXmNgPa;a`;uD7}mKLWk_CMsr zs1rDLSCk7;Sh`7<#;=De4t5Qp_Gqu>IhGd!l~(E2z_Z17)t7p#fR?qDTF!+wHoMd& zM^icGujH{s))AXY=&VYfM0>;?+iS>9aB)^3){7(ys`8=mFYx3q{Jn4vvv&(RxX8r# z!EENp`8US;v-UE3&_;nTP|+qiECC40PM4c33Hfk2fiwi6wc^zlJ_gRc#YQQPESMOF)^2!t zU*s(mkU1XPrwxBg31a)M6FCNt!sNq*UMh{ZbZfj2XJ*yzW8CnPi}g@HZJ&=uM^83+ zR8=!{7Ge9?>UqH>9noFTISUs~z7*posBzDiuq@Y*@tcwfo<)Wm1Vtc;hA4gootAP+ zAN{cME%F|1_0=FK?TzRXtqp2cIl`(_BAY&ZE+P((!c>dV&4!nvNQiC~z(NH>*2vNX za#R7`lUuTo!Oq?X-X7kv-1TYj98o99+#c8aeK6&I4UIWro%L zXD=pBApgtPnyjbd4X*=gHw=3gPdFJ|EXvvZ0ZfpbTQ`T%|{J0dx zN?ox+2lbbOuf>MZQ|h5{o2xC(ewSo@!ES}30MdM7Z?9Otb)8(KBkfuX`h`&P>DVfA zJ(3b{jt3*)lyU9Cy5yqTe`zscoqCP^2O(wsgdeXWpNBz2@U9}J6DSbH%&zBn$(VpV zbnvyMWd7{Kh%0e7&!|9U2&{f%K$&SZ(-AdJr%3?WG3@rb4_vOoo|~i&ee>XkD)1{X z#VM(@M4n7h(Zj@M@~QD#EY-2<+{*&27`CS%2G7V#Li>3BoX$~MU||$5#lQS2l>PYP z>&5_))%~02G(BJJ3+oz^j4V_<3LGaDvGuMfuMyd~}lVy77QtLUOB`lDPBE|hz^Ew3BD`S`Nbf-0RNmqA8Co`Wlh@R`e zDOw(73#R~f`0vSuvFpY6t_ z%pNX~z+Uf%l5{RzQ4AY;(d)iiBB*X^xH&bP_^Q|YPM}@mXZ4F@;w7;|B{*1f1Zils zlQw74S|20tRdfO&3-JJZo~T#+dRriOO>+Sue#(i187LZ!0!wA_XXCf{6Na1#Xs1sM zv*8Yam4jK=knW0$zE!1VB9A$1l*+&luc4ft5H+m%3kT!?KZ-6bOJWgqefxWxMp44t zqH7#LC+Hn@<*TU>*1*9z|ht(+r0bTNOIF^ z>tMqm*7pV0g-=h;(^{p%v-QABw}VYa^dY5c(uscz#OJj;d%Ea!j0x~v)CJvXFCbqj3KxVaOX(IuDW=Z>D zA|^9=1g|vtD_TZ-wkM4gAlL^}$K&yB=a0|&V;{z8Lay4R?8&{|Z3JroE&_}3z;*vJ zR!&0NZ5Y-}?uSE`mct}#E*{jef4TF!`&A`2d>=hT%V5xU*J;ZI2qH3Da7i6a zmFv6X;#^m(e(S`Q8gy_b8X9X;Lh;qXL;W}4IY7m_Z=<-qII!wcr!RyyC9gaal|Ssj zhb$~c;hm#%`i^dzVWOv zveEo1597W)U(j2v9Iam+CR${le_f3I`J?7lHC*Y@)J+r{(NHhU*pJp0P$Gf#4NeLDjhUrB<2!&ryPbVVCSB_<)yNOv`9bua9#n z-w)g4w}?>?1ux7-*g&_l`Lg!3W;88P$*50D2tbda^zAyoIn{2jiR>QU4OKB>rZDyo zZ5NL`Ds<6S&QGq12yUIK2!kemSdjVHpWHL4skf(4xG0nxcU$KaE%8RE(yzoToW3RE zMe1wWK_h47Af2%uZjE8FJAj4xw7Z_DOX^X~<#UVDbA`ckTl_}Zy(CYrX`L)8X}fIc zlDnOwQRmmtyl)tUBg+|B3g>F{SN4pv%@y(A;UbFX=yy}1^xLKr^e_B3X+ej=xb>FT zk_M^>KZ>9J*v0)SrSOG4bVJlvTHOx6UN1R~PNj0@2^V|EI^(MsR))%QOM zc@$h?H{Xo7(Fomhn0Oi1tbl+&6VQ4-{BZON;?PYmV6}t`EBV{B1j`qO0B%ie_r`pZ zy5-?mceSuSJ&M&>0vI>G{SlzSsNWexjX2tS1I*53B}R{3YAS2&1T_NIsGlxw5EIsA zwk=mFDk_wN6jK5KeIJhOD@h?_ND@!kg{QK(g{5=JZH|3pv3ZQ#wB&Sc#$oJW0#%JC`n;o zKGB5@QFgj{0lA+??(^d_!P5>&#&67IX47aGbUqKa&lTI#i*!E6fl^8XGJ;wVE<76aN#wfV*r&{R1))# ztc)=XcnH|zSHwSWN*6j*NfIKy69K<5&3XqxzUE(-+XE|SK&pnDqc#~rh$p!*zf6mh zLY36}WA!81a2b?B2@?9y_+;M}YmFa9BuGL6<|Hq)l<8{Nhn3>{{6R@Q zxYapwvIz)dLTYZ2p4}iX@!8h!{^ttTdFvGGpL84sbABPY$$|G=nLCgvP4llZv`XoN zaDOGU9!3NWx1$$VmOBER>{|cMmj|6@Wq8EXqko=26_l;IpI@EUWBDGc*;PbgjbYR8 z7NvT-_<#x$Xre}$H0sk%*^ES_xj)Cw4`ye1hvmT2g~yap7@I;%&-%{{o9eQ9>f-#+ z0Y7pS@B?y|+_slW zc5g<=>BNxt*N)7*ftxNqx78a3k!$d;n~EMSv7lEQw`_GE6Pl^6Y$P$}>|~FI@l&Ej zV!HPD^SfZy8MPX*vh2b8Eakf7%mmue+dW)i(xb3U>^>|jzFlYKZlziQCg)Of9CEUC z)!8dcM#}Y#rN)p!Cbe9EtT`4$xh1Cxk$I-Wv1+5$v}-vxf6bN;d)*WELcj*~za( z0XE8~7#i-VUvShJU$hv{S}$0!JDm^e)4l9Yw3RBtH+o1&!j(u^y>Nm`@=`fQ9OFGX zdRp}+5bF~v?AY3|q;2Yq*z<$Re~9!a^n+5Ne*=u~HE6V%)avs3_EU9dGD>VnmT)F8k5B%z$6v!qw8Iksg%!qnmDTdyxe)<))aEhy z7;B|!fSwH0(QydrTCp1jXV>G{PfR}B#i_IjVgU_t*OO`?p&yIW1kV`B zUzP|IoSti5AsSkh0YeRa=W2|Z38G+VuSX=y`GvdNEsun83@bblc-VLFB{;{1yedC1 zTbnt#R))Qd>*BnTJpBz1P8@4b7X-F;hE)`%d3{{k&)KM>uDR#kV@P-7we4Z?di^ zYB8Hwl-$G`YDmX43hxa2=aoyITBH^)Zzs2%o|b9j&bSwGn~-TP3H_<^?dWw`(R&l% ziUNg&ceeq$mys8yY6$_H)_&Wm8;EEua# zA~(4Fg_LQQsAqpCdXG`gEdjOTNC>gjnTNprWj*BDUx$pel+4uQqi?sbu-JxXfGLa& z2+1so7P19Y0&0_ZpvWTiJrar6|4a-boFAu>=faE>MnzEuj%i_tgXnIy1AVEbwVG!S zheEDMULeU->*rA4H>p+ut&3#YGFHA31P59=6+n zu{`C@qbMgp{>mMVWDIMBgPer&?6kIi3ksK<$fFQw=FtFVZ;Qwkm>>i30j4Pp-)gko zSSzYU3G~5yU_xn37&aN80PUawWi5W-b70y!OQDJox7xutXdJO>!O2H7K$il+fq*o0 zQrRB4su^PH+P)2Zv+ONC(VM`I;CiXdnId5vnz`5{FfK9M7GDR$w(^`D7%8RIIwvhk zr6A8CdIi*C+_iN}=32W!B-q1Okx;pTFo23g?%7qsV#IMJd-Gj86iu-ofuA93pNCbX7 z!(pC9jU4=3jx}|<{~#x6#)@~_7AxPP#?C|xBAE6wATM=KlX?hf6uetXJ z^bz9cdnitKEadP?%6^{(MIuWWtSCCJQoh8PZk1b--D*@bi2i7asDYzFwxeT7BaA!p zFVansn-fF4H#hb7+kqWPqybyDN>~oCSfCRY1E}NqPQ-Jo3LDiE1GF=@bVhqBXLamQ^{< z5_K=TKm>{1W8wL&VZ0;NglNSjNcvH5)`tj?e90GA^Ww`?j}jds*L3dl5hjtl)-bV; z4m4i#5x08#hg0*j(+vymifJotz3A?${f_D677H>j(FbjvUk8Rn5zKn?^c+&ota>(% zfGXL=xDDeWV;sNIa>Jq%g|qb#{@$uB37ti~uxTj8nyzW)Av#4Wx)sic6;X$TJ((uQ zsvAK%vf?jrt9NY z@`*$WIT(?mEI%bWoqIeYT4LY8>7KE`cfw(?D&_2#se!jRTARisnJYC_2Y1o7* zR)vJQ*WoOqL%2XScoBIl@{v7pTx}u;*GG!&$aU)L^vT84ngfHIiWQV;< z2M1D4`5}5F<{zc{D|lBJBS-V zLRQgV2)nKvY4w?e^+5RLX#=Mw=((0GGp=n)@YNJHz4ohf&vYs}ejIsl4^r)b)+Clo zr^L?kDdNPW87Z>HeA4wLt!6dvb?Mtd;@o* z0UD1reeBdw;5(#%IQ*kUk~ZMW2B;awSWC?!WgT%fg5$02Dz;Mwjbrlj5(W}@({HrF zu~N4R`EYK44qfoPc1|eM_Zy2&hN;Y|<_h3hF0dm$SCg!^lDurF)iUQ57ALuh1(Bh)+gq58l`h}7sHw^J7OG?ftxXb~M`14e)XL1Op8num#v=7O&DEy{ zqo?bt^X|4!G2*!L5IEdHfYz$mM{^^%H=8_Z*AJ~XYA}9EQR?~x`crVOjzgCq_}Ri$ z50*2{Q|F)K!59KR1yM7q>uiZmCy%CIXIjCGdKP7P!gid<;BVE6YwhevxzjPUF~4-= z^iY>|-!2Mrj;#Tpw{-5rcFl9XF&DcN(Vxp>*^fO997)qlX$!1LfG#Y^ugphGhRG`z z(x&@=PU?{?{KNV=C6HaVhc%xQgfze2x77zgSS4#G)k{fC;m~skNNZY>Nm?5(@l%kuU6=Oj{Jkxm?cIIh2R8}{67-vVavE{ZL`tIw6{N5zJ^kVa)Di?=)z<5R!uhgb?2c=eg(U_#7`sOA>y7}>z>u5+q-TSq#CYB%`@#8K%BS~&frgR$fBNT=S8-%?4f8dttwv3 zQnn+~f~DNggBc9xaSHCgrLR*9clAo*pKwlXytbwV7KihzX_d$EPgA#Du|JDm8@tVr zrhVq3rwt^)b#We|j%E4!wrQKHE$|m6aOIEh$ig#F(<*}-eA(w$rFy_G1HQ&*%1ItZ z7|b9p!Hkzwk2}yTC5Poobz&dvHLe@;D!#I7j&?Kso3_<7hAM2jnSY0-VgX!PXx2`dG{(CwAM2NI2MYG^$K>Br|aD3}^fE2^9 z-V)^yyxq1)<0#pjRkM)SfrKZ6Gq7h=S z^*ohduCK3}c@lRH(~_bPEbm;+LmI`+>f6Q*Qcv*|4SP*hhHVe*8de#i950p3R9C^` zaNQ6f_)RTbz>&}``|~c(eQm1%91^tw2)w0R9xiW$7yp@qEo#?dE|<&=E6#ky^-=04 z*$VV3^a;`C@~(^Dh|+6s7@Rh48B7-(59OCzpHH|UHI zMob!LhhFDp<1Ti=`P%8C)}R`}E?0xLbW0>a5j7;?M>J6XaR|nVrDDdkj;3Mc*>&sg z_oAD8b?6m)ZY$v5p>V5uY#R9SOy?suuC@m4Zg+b9;epghT`uGdJEc@x^Rxtmn@?fK zw>ti`5NM=@+w*o-%1&1IA$EaR`V8=tR$6oLgt{-kumLr6wA|`2ti)~6yz%P27>xp0 z`_Z?uOhDBP8&L{=## zwa;Poqb;u>3b&|)>G+ckHpH#c#h&Z1V(alM|m zH6+1^t8%Ud@(Njq?|HV8cQ)8L=+fQx8va5>(oNY1U9!XKfMuACo6kFckG)6_$IM^$ zvYooTE1mD{H3k*6dNd*xf5;uvuNdg_`5|>A^SwlE+ATU9%5~s`g%rRJ%weXVF~fmH zX}0c;){%))r{sO7?L}`|^5dTs+t%!Bo4!f?QV#_R`7)w3H`5qr(4Cr8Oc6-I>7?ez zZo9liIuEzFlRt$Y#>tLXncgs-;h5UJe1LB|(T|EK3O5jWTx-QgRd_y?i!3?46@JHj zY(ba=LuzLzBX`%fCszP|TPn~x%77iLXBgkPi0<+@lff{ek!2Z6z6(VYj<-(hzAYD> z(Kg{ZO3YP4*+juY#DrKiORQ_S7P_&nloyq7nJ4kWPhbwwngrAb)dHSwqU|xnVPk#- zviAYEx1Y_5LwWa}-;~>WZYN%LBtci4w)O9R!hNM}2}W&@xO_mdqq9C3txr8m<`B8- z%ij~bW!=G?@{YmNCxpS3U!QIczZzqYiRn?T@P=YX_=f(B6S$%*%RRKVCm(>!2$F*< zF;54@)KyHhyW{z-EadN1gV`G}K z7qV26w2zIVVV(i->&EeKO~zL{%DdRa954wLzopxf5{zWM#R!lW-CYJc1o~`DfD89& zPv*PbkmYGMlCj5pQEh}6vDegoN5ceh(>|`0MVIF^;PEcl#3)r>m9cbp*Vrh0-~u;_ zo=c)1_+nXTw(SD#yrW;@orw>4N!2K{sy8|^Qd(=`$>##rTMG@gc5wqYQngtlQP{uV zb1t3zj~?@_XckSS&NP24R3H!D*UkgPcoM`S7O*bwLa6`pYoc4%{HAGJK^@8*!IU*1 zvAnolO8p$VS}_431W}1GCYa;k*=oI3#6Z*zpYck~vTfW_vRch5-o7#bZ&aec>XKHF z=IEG-wJ`uV91Yxuq!~I2+F+|vC?ddZ!0t^UxfnLh){D&jQ5#;$nfNR9M5*Y&C*)}Q zjH{tcw&g+<>q@09%Q=?0c3xxJ@vrGG8oZ136O~G#`D;Z){~_NWx())@$lD>3VQam# z`QXN7t>h*B56|bCs@Fz2#oKJTn4Hy{aD?`%))A?|9s&w#i9zW`cT1X zdJhtd6-fACp!DCr-A?oz^;d`!Ywl})13Nr+H;4stb8){w`j zWFLr6>oSkB^rGBEY7xSVFY@p4dRi(7IF@h#H%b?y_xhEyF!GLr5O-Th^5lh#5~h88 ze%?ykdS+_PAxzy*mU%rFZbF92k}ByVuLZ*v5?Zqy)eyh9U5Ap8Han{@xFDvlRbd0X zB|+UPnuM{_1QELgz0Jky9^!8EYkwJe)mLgerXSF(n?bVAPX_)_i}*l}@=sg3U=7g& zqE3uWhh(3Wz-IjXj_(gdl|jBv%w@zBq170_D?IZ8C47;!zYtLTk#9xtppCb3S{ zD;t5kkk5Y)BQVw%x{F>DP8DIhgm>Ko!a0zhnI)^@v;R&W6Fq)XIJZ zcTrOC$XMmYHfl5*@}| z@1!^C}5zD`TAH8!3JJwLY5h%|I^!Uy=}WWHt_R+R@LhNM=-IPazqcvecmHWZyWrm1LOkxw(Nw$73D0m*!8E%Z z1A!yV53rqor^@F*(4}`Z;Ps+&?X4}hOJU3W|kb9)?G*3?ItOk zbd<*GgG$fx_q%2G4xHUCLUeb{X0lrr2dD?yL|-Si47r*2qDK6<$e=Hw4nrHZps8Ev zy2YGXY;wiC1fSEOgA16g!-Z0L5-)iTCS5DVn_+kN)C`WgvW_er;8k->XRK>tvo8=F ztmY9K;-`$ zD2Es-7tMLU;dk_vsdjHtwB{;Dk-ceQl(@G>rFK}`nTXx+Rsrr;QRiSuVXXCO3vQu~ zed|Kv$VLWnExMvUpl&ITZgeA3H-TQJSnsXSp=f^^<4GHCxeUK;4zAnD9-xY&&vrYD zLOVw5&b+Q-$I^^_UfN>M^vStq_Tg1;i0Hch?KPO<_ONo|0^gsJh>NXiokvbdL(0sx^q+gtjbl72j2Y^g4uvUD zXk2szs-K()?_DQZRHGThc(Yb<-1;mvwPoe#9#>Id6{<@Jt9^zw&}Wt`9R{D3OhhmD zxq9Gb@%1np5N653UI=Wp<;1qK!!;1jY>9(YH%-fV&K=5!BW!gg!t;#bV8%*su&-`= z*vChJ-jO4(*9)P`))jO0mWN-TBXv!y1F|2cPLtHI#9?DXR55={_KT8A0^8W6J>_xI zJlW+%1aM+UjvMy`;dI$Q6T3X_;f`e%o`eTxuR8I z2sJ0H;dr+7auBW28i%?f{jP0M97TV!&nyFdkE2pqXA0cOBI9SR*VffJkm<~^DZ%Ok z{Ii|ZW`B;Btmx>r_#i={Z0KHNSmnxQa80d))qr}D!vddZlzP1<+r`mBF8}E|9k8gU zh~KrtmMO!rR5A}^pLra7&a2vKC4c0UM6_}S;>%cRjH>A2!e`3;o zY}!;18N(p6FG?^@C4Vk~!%G zn(ST>#m;>^UUI4;5}BD`U9K|wuN*kbI+q~JSsVh8?ch4`{t$ZjLL&{|KPe{xZB5BF zT)@r=Pzu*fz1U*B?8T~FGGs^OB~a;Q4iw~cR5X)D3ymart^`FNFwU^71Vc*!6p(Br zAt#tGzmigK-8&5C7o%QV8M2oKQ1nt{0>Pgb#F9|Jo6^e?jZ5ptmVz#(w7M~VF8d7A zRTDE!!?SN3155HT;xXwbgO>N z{yVe5p{(`wY4TFW{*{rdvuiMb>}4oRvtJd3OtA~LYZ)S!nPKg9m;^b{Snoy|_ZBq= z-lMFJ?A>h*hSn^?f6^szAlcA+d1kk{QLV~O3?=)btzL-gzEEA^l&r&gQBxc7j*Ap3_&eI|GN2JQA zgbQ2$=WJp=wIwRh7X4ykt!mMjseQ??as3enOgK&M^{Mw*KZ&ukcv1ULrn+n{Xm$^= z@7KsQawj6}g3=0cikx4n-$2zlI8__l{9bfSlV&4UfQ`qnSCk|TVKcPRIU*jW_0r{O z2)>t;%uMI7Nk@#mMcD@cR*EK7kO#|7b**Mt{E-(V7eJt$D;C1~NKn=aMD7TUuBFty z6*b$M!=hAPW}eP`oF?EbFst1h$#bz}pu)sP2+(OHS1OlUUJnD-#gOLGFSs$u5spf<{0uI=l-qEa!7L18NYO9OALG#aG_v2)$ZNj&DIb!OP? z^m&SccvHb=!%%Aa{HDVwq)P4A9@D5spKxfdU^r?(RtaN%`66f;)KkUYm~j-Ng^7qr zmNQxg>Su($Px5se;R8H9D#uWtuV}Z~xS~>LtlNUeze@_pAS>7|ywv1aAJCO1{$mcJ zH*1#aN`IF(Q#@Rri86bw!1wi7Pn}l;d&B)0gjCLMYP`#j6(#t;80}a?)JY z!d*NovB(R+ujr*e`dPQo>i-45tv;WowfMHU7Y6f$#pTl3KkM@F?s&p|sm|I@C1aaF zKVEa2N&)+|@>XKlV2GoWqZlIWJzH@^gXB4*iMRc<|1NWSWmL?_lR`&~%nNg}mj1^~ zXup5o3ue+0oFTP^Isu_vYoT%?0M+=7T z%Ug$%j&rvp-&GsBPi7Dy7e%ay!(kN_d+djR^w&1(y+*}Y5A6isMlEIwy1M+8^?5$^ zZw!+;ArlOhm28HJqttM@mHC)dygY7rByL21 zl3ksi)W4z4!`Upv<9#Og2>QM-#$O`CkSXpV|BL=RF(U?bxnz37{ln`eueUPQI;@_% za(n`{A9Hn)Bek0{75DCi1-DOcPaqy_8sH5GyGPY+nJSizc1~fVS~ z&Y<*GTk?vC)$(eVQT#my5+mAlnNs$M;@jLbTs+q5=+7u3cYh~+ao)`LQ%_i}rugBb zsT&hXSeGgo>p&-2HMN`V3Fn}%$MxD(4&pF+&xxRuaA4^^2kG!N+}n+o5{+tK-W&pe z4YAQ6B!Y=i-R@~;c}!AjAt=XB1a6~>-$G~w;ZW8;wLS`afaQ}}M*l-ub$FhDRWS#- zJqa@EUfp*3@p`S6b`l1}! zuF?NGS^fe3KXD`(dXWE?BYFN4FAAdvu}ArDyoeSrt3Lqq9~(gXfAJzhArJ(>zw)BM z{~s-y*7fckw?tAnmu z0WY>(HZ-8pNLNoOoz zxoe@uAoqS}>e9h&>g{ItG=1_>43BDza=xRM1gMbr0OwTT;CzeAtNvrqzHd-Z0g8sK zlS;^)4^$O3_^8fu=JRC5(^7J*GDL4M7An*u^r-KAe8_vIVN6-b<;Vqa86t_@8RX?l z4F}5e>}@VTS?_9{OOvQ4N)nPv)At_#3Yp3GNA=0NmX^pYEiWZ&26Ue2LQh4@3LPx@ z1Ijv$XrR*@#wG{!^&k-wJ&a6fl~8$dVjrYVGsc!wxG1g&qs&+S4754YM}^!1A)}tD zkSnvHoXd3%!1G~NYCd!vE|60&Y0ZX;h3oH#GZ6$BquEZ=a4>CVSzf8M*ARsDo^?30Xc%f2kCWJ%PF4$?JtU# zNO%+97euFY=m!KxM)0Z_tu zvnkt?2i^J>6eX}3A{ZdO6Tiw)8;XPv5bthG_2%*VG-abTBR4}Dq*O}Klrx|;vNX_O z$$sBR45VWJh&kcZLwB>eQAPK{B=jfuBgOEXdcj{bq48Q824^SAJ)FMBTo=Ed;CLkN zp|f;>0F7>BvxmPAdT{uG^t0G113ZvU145Z5n|!)H-c!|94Tzp`(pD)E zuTV|#5jm;IpPPy)3szygqlDGp%W;u&rf4olhZZ4AamNe`k|S&=3mnPd0PqKhnGNgY zHc31&{vw9XNMA^@vj`b`Ivpsnk3JlSnys3|xDqM3<)S)i;~8UGFsk*v4AZfZ=And39mG}YO~YGA7~0=y#ArZ&cpRWpTb`;xK5`ww~@q6X;tQQt+-7iYNjkX6Gn%c4LsB=tpg4l0jOm-gimbh>1(NknS~ zd?<Zfw|ob>_?$sWjgxR6wbfhpqMK$b>Fn$?%i zKu5xzJ|F83+JYIROCU$J+`b7i0+k6ku9Bhf{jvafBhK`>4&5$l67@%F%y&&Oms(K< zlbJXV6=3}7Q@$v~0kEl$>5)%dVAq+`5<}U0D2t$?F0#q|E-=-X#$HXWrsb3{>q23n zlr3bspp&uA2c65Q$Zj4nkpN$JPF!i#`yHOj$OA7ML1VCkE0vILa~%OS=mfgd*fUiB zj7;N=0A(T(ZN$$OW*BX!dVrz*2S*-^>Dv}|`~_lOiD+j+2e3}W)$N2gZK8~E*><7? z->+ErI8zEYh00uUBqJBK5K2)X5B;U~ns)rSfb2L!S0~KyrFFq$hd4kzaVMJd{jxgy z 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 From 2ef797ae0912232bfa9129c66c8c5c80a21a056a Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 17:03:55 -0400 Subject: [PATCH 104/144] Removing obsolete directory --- soln/chap01soln.ipynb | 849 ----- soln/chap02soln.ipynb | 2078 ------------ soln/chap03soln.ipynb | 1274 -------- soln/chap04soln.ipynb | 1186 ------- soln/chap05soln.ipynb | 1732 ---------- soln/chap06soln.ipynb | 808 ----- soln/chap07soln.ipynb | 779 ----- soln/chap08soln.ipynb | 1067 ------ soln/chap09soln.ipynb | 1147 ------- soln/chap10soln.ipynb | 1208 ------- soln/chap11soln.ipynb | 900 ----- soln/chap12soln.ipynb | 1634 ---------- soln/chap13ode.ipynb | 302 -- soln/chap13soln.ipynb | 963 ------ soln/chap14soln.ipynb | 763 ----- soln/chap15soln.ipynb | 735 ----- soln/chap16soln.ipynb | 1506 --------- soln/chap17soln.ipynb | 642 ---- soln/chap18soln.ipynb | 1981 ----------- soln/chap20soln.ipynb | 1624 --------- soln/chap21soln.ipynb | 1526 --------- soln/chap22soln.ipynb | 2957 ----------------- soln/chap23soln.ipynb | 1311 -------- soln/chap24soln.ipynb | 1319 -------- soln/chap25soln.ipynb | 2577 --------------- soln/data/World_population_estimates2.csv | 68 - soln/data/World_population_estimates3.csv | 46 - soln/diagrams/RC_Divider.png | Bin 1752 -> 0 bytes soln/diagrams/RC_Divider.svg | 193 -- soln/diagrams/queue.png | Bin 8874 -> 0 bytes soln/diagrams/spider-man.png | Bin 35300 -> 0 bytes soln/diagrams/throwingaxe1.png | Bin 27102 -> 0 bytes soln/diagrams/throwingaxe2.png | Bin 34525 -> 0 bytes soln/duck_soln.ipynb | 266 -- soln/filter_soln.ipynb | 1774 ---------- soln/glucose_soln.ipynb | 2104 ------------ soln/insulin_soln.ipynb | 1125 ------- soln/interest.ipynb | 373 --- soln/jump2_soln.ipynb | 1685 ---------- soln/jump_soln.ipynb | 1368 -------- soln/kitten_soln.ipynb | 878 ----- soln/oem_soln.ipynb | 2027 ------------ soln/orbit_soln.ipynb | 767 ----- soln/penny_model_comparison.ipynb | 1177 ------- soln/queue_soln.ipynb | 1331 -------- soln/rabbits2soln.ipynb | 528 --- soln/rabbits3soln.ipynb | 863 ----- soln/salmon_soln.ipynb | 1636 ---------- soln/spiderman_soln.ipynb | 1536 --------- soln/test_deg2rad.ipynb | 146 - soln/test_ediff1d.ipynb | 87 - soln/test_euler.ipynb | 3610 --------------------- soln/test_plot_quantity.ipynb | 387 --- soln/test_timestamp.ipynb | 173 - soln/test_units_off.ipynb | 731 ----- soln/test_vector.ipynb | 211 -- soln/throwingaxe_soln.ipynb | 991 ------ soln/trees_soln.ipynb | 1981 ----------- soln/wall_soln.ipynb | 1879 ----------- soln/yoyo_soln.ipynb | 1168 ------- 60 files changed, 63977 deletions(-) delete mode 100644 soln/chap01soln.ipynb delete mode 100644 soln/chap02soln.ipynb delete mode 100644 soln/chap03soln.ipynb delete mode 100644 soln/chap04soln.ipynb delete mode 100644 soln/chap05soln.ipynb delete mode 100644 soln/chap06soln.ipynb delete mode 100644 soln/chap07soln.ipynb delete mode 100644 soln/chap08soln.ipynb delete mode 100644 soln/chap09soln.ipynb delete mode 100644 soln/chap10soln.ipynb delete mode 100644 soln/chap11soln.ipynb delete mode 100644 soln/chap12soln.ipynb delete mode 100644 soln/chap13ode.ipynb delete mode 100644 soln/chap13soln.ipynb delete mode 100644 soln/chap14soln.ipynb delete mode 100644 soln/chap15soln.ipynb delete mode 100644 soln/chap16soln.ipynb delete mode 100644 soln/chap17soln.ipynb delete mode 100644 soln/chap18soln.ipynb delete mode 100644 soln/chap20soln.ipynb delete mode 100644 soln/chap21soln.ipynb delete mode 100644 soln/chap22soln.ipynb delete mode 100644 soln/chap23soln.ipynb delete mode 100644 soln/chap24soln.ipynb delete mode 100644 soln/chap25soln.ipynb delete mode 100644 soln/data/World_population_estimates2.csv delete mode 100644 soln/data/World_population_estimates3.csv delete mode 100644 soln/diagrams/RC_Divider.png delete mode 100644 soln/diagrams/RC_Divider.svg delete mode 100644 soln/diagrams/queue.png delete mode 100644 soln/diagrams/spider-man.png delete mode 100644 soln/diagrams/throwingaxe1.png delete mode 100644 soln/diagrams/throwingaxe2.png delete mode 100644 soln/duck_soln.ipynb delete mode 100644 soln/filter_soln.ipynb delete mode 100644 soln/glucose_soln.ipynb delete mode 100644 soln/insulin_soln.ipynb delete mode 100644 soln/interest.ipynb delete mode 100644 soln/jump2_soln.ipynb delete mode 100644 soln/jump_soln.ipynb delete mode 100644 soln/kitten_soln.ipynb delete mode 100644 soln/oem_soln.ipynb delete mode 100644 soln/orbit_soln.ipynb delete mode 100644 soln/penny_model_comparison.ipynb delete mode 100644 soln/queue_soln.ipynb delete mode 100644 soln/rabbits2soln.ipynb delete mode 100644 soln/rabbits3soln.ipynb delete mode 100644 soln/salmon_soln.ipynb delete mode 100644 soln/spiderman_soln.ipynb delete mode 100644 soln/test_deg2rad.ipynb delete mode 100644 soln/test_ediff1d.ipynb delete mode 100644 soln/test_euler.ipynb delete mode 100644 soln/test_plot_quantity.ipynb delete mode 100644 soln/test_timestamp.ipynb delete mode 100644 soln/test_units_off.ipynb delete mode 100644 soln/test_vector.ipynb delete mode 100644 soln/throwingaxe_soln.ipynb delete mode 100644 soln/trees_soln.ipynb delete mode 100644 soln/wall_soln.ipynb delete mode 100644 soln/yoyo_soln.ipynb diff --git a/soln/chap01soln.ipynb b/soln/chap01soln.ipynb deleted file mode 100644 index 35756cdb..00000000 --- a/soln/chap01soln.ipynb +++ /dev/null @@ -1,849 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 1\n", - "\n", - "Copyright 2020 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Jupyter\n", - "\n", - "Welcome to *Modeling and Simulation*, welcome to Python, and welcome to Jupyter.\n", - "\n", - "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code.\n", - "\n", - "### Selecting and running cells\n", - "\n", - "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", - "\n", - "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding and removing cells\n", - "\n", - "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", - "\n", - "Try the following exercises:\n", - "\n", - "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", - "\n", - "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", - "\n", - "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", - "\n", - "4. In the new cell, type some text, and then run it.\n", - "\n", - "5. Use the arrow buttons in the toolbar to move cells up and down.\n", - "\n", - "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", - "\n", - "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", - "\n", - "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the notebooks\n", - "\n", - "The notebooks for each chapter contain the code from the chapter along with additional examples, explanatory text, and exercises. I recommend you \n", - "\n", - "1. Read the chapter first to understand the concepts and vocabulary, \n", - "2. Run the notebook to review what you learned and see it in action, and then\n", - "3. Attempt the exercises.\n", - "\n", - "If you try to work through the notebooks without reading the book, you're gonna have a bad time. The notebooks contain some explanatory text, but it is probably not enough to make sense if you have not read the book. If you are working through a notebook and you get stuck, you might want to re-read (or read!) the corresponding section of the book." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing modules\n", - "\n", - "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", - "\n", - "They also use two less common modules: Pint, which provides units, and modsim, which contains code I wrote specifically for this book.\n", - "\n", - "The following cells check whether you have these modules already and tries to install them if you don't." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", - "\n", - "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", - "\n", - "You can find out what version of Python and Jupyter you have by running the following cells." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Python 3.7.5\r\n" - ] - } - ], - "source": [ - "!python --version" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "6.0.2\r\n" - ] - } - ], - "source": [ - "!jupyter-notebook --version" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring Jupyter\n", - "\n", - "The following cell:\n", - "\n", - "1. Uses a Jupyter \"magic command\" to specify whether figures should appear in the notebook, or pop up in a new window.\n", - "\n", - "2. Configures Jupyter to display some values that would otherwise be invisible. \n", - "\n", - "Select the following cell and press SHIFT-ENTER to run it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The penny myth\n", - "\n", - "The following cells contain code from the beginning of Chapter 1.\n", - "\n", - "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", - "\n", - "The following lines create new variables named `meter` and `second`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "meter" - ], - "text/latex": [ - "$\\mathrm{meter}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meter = UNITS.meter" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "second = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a variable named `a` and give it the value of acceleration due to gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.8 meter/second2" - ], - "text/latex": [ - "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "9.8 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a = 9.8 * meter / second**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create `t` and give it the value 4 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "4 second" - ], - "text/latex": [ - "$4\\ \\mathrm{second}$" - ], - "text/plain": [ - "4 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = 4 * second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "78.4 meter" - ], - "text/latex": [ - "$78.4\\ \\mathrm{meter}$" - ], - "text/plain": [ - "78.4 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a * t**2 / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "39.2 meter/second" - ], - "text/latex": [ - "$39.2\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "39.2 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "a * t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# a + t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", - "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", - "\n", - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", - "\n", - "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Falling pennies\n", - "\n", - "Now let's solve the falling penny problem.\n", - "\n", - "Set `h` to the height of the Empire State Building:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "381 meter" - ], - "text/latex": [ - "$381\\ \\mathrm{meter}$" - ], - "text/plain": [ - "381 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the time it would take a penny to fall, assuming constant acceleration.\n", - "\n", - "$ a t^2 / 2 = h $\n", - "\n", - "$ t = \\sqrt{2 h / a}$" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.817885349720552 second" - ], - "text/latex": [ - "$8.817885349720552\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.817885349720552 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = sqrt(2 * h / a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given `t`, we can compute the velocity of the penny when it lands.\n", - "\n", - "$v = a t$" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "86.41527642726142 meter/second" - ], - "text/latex": [ - "$86.41527642726142\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "86.41527642726142 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v = a * t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can convert from one set of units to another like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "hour" - ], - "text/latex": [ - "$\\mathrm{hour}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mile = UNITS.mile\n", - "hour = UNITS.hour" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "193.30546802805438 mile/hour" - ], - "text/latex": [ - "$193.30546802805438\\ \\frac{\\mathrm{mile}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "193.30546802805438 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v.to(mile/hour)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", - "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", - "\n", - "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "384.048 meter" - ], - "text/latex": [ - "$384.048\\ \\mathrm{meter}$" - ], - "text/plain": [ - "384.048 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "foot = UNITS.foot\n", - "pole_height = 10 * foot\n", - "\n", - "h + pole_height" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1260.0 foot" - ], - "text/latex": [ - "$1260.0\\ \\mathrm{foot}$" - ], - "text/plain": [ - "1260.0 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "pole_height + h" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", - "\n", - "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", - "\n", - "You can break this question into three parts:\n", - "\n", - "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", - "2. How far would the penny fall during that time?\n", - "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", - "\n", - "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "18.0 meter/second" - ], - "text/latex": [ - "$18.0\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "18.0 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_terminal = 18 * meter / second " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time to reach terminal velocity 1.8367346938775508 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t1 = v_terminal / a\n", - "print('Time to reach terminal velocity', t1)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Height fallen in t1 16.530612244897956 meter\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "h1 = a * t1**2 / 2\n", - "print('Height fallen in t1', h1)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Time to fall remaining distance 20.24829931972789 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t2 = (h - h1) / v_terminal\n", - "print('Time to fall remaining distance', t2)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total falling time 22.085034013605444 second\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "t_total = t1 + t2\n", - "print('Total falling time', t_total)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Restart and run all\n", - "\n", - "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", - "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", - "\n", - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap02soln.ipynb b/soln/chap02soln.ipynb deleted file mode 100644 index fc263c0c..00000000 --- a/soln/chap02soln.ipynb +++ /dev/null @@ -1,2078 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 2\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)\n", - "\n", - "# If this cell runs successfully, it produces no output." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modeling a bikeshare system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with a `State` object that represents the number of bikes at each station.\n", - "\n", - "When you display a `State` object, it lists the state variables and their values:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the state variables using dot notation." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.olin" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", - "\n", - "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating\n", - "\n", - "We can use the update operators `+=` and `-=` to change state variables." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we display `bikeshare`, we should see the change." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin9
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 9\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin9
    wellesley3
    \n", - "
    " - ], - "text/plain": [ - "olin 9\n", - "wellesley 3\n", - "dtype: int64" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.wellesley += 1\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Functions\n", - "\n", - "We can take the code we've written so far and encapsulate it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin8
    wellesley4
    \n", - "
    " - ], - "text/plain": [ - "olin 8\n", - "wellesley 4\n", - "dtype: int64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bike_to_wellesley()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bike_to_wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def bike_to_olin():\n", - " bikeshare.wellesley -= 1\n", - " bikeshare.olin += 1" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin9
    wellesley3
    \n", - "
    " - ], - "text/plain": [ - "olin 9\n", - "wellesley 3\n", - "dtype: int64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bike_to_olin()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conditionals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", - "\n", - "The Python function `help` looks up a function and displays its documentation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function flip in module modsim.modsim:\n", - "\n", - "flip(p=0.5)\n", - " Flips a coin with the given probability.\n", - " \n", - " p: float 0-1\n", - " \n", - " returns: boolean (True or False)\n", - "\n" - ] - } - ], - "source": [ - "help(flip)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "flip(0.7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "heads\n" - ] - } - ], - "source": [ - "if flip(0.7):\n", - " print('heads')\n", - "else:\n", - " print('tails')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step\n", - "\n", - "Now let's get back to the bikeshare state. Again let's start with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def step():\n", - " if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since this function takes no parameters, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "step()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parameters\n", - "\n", - "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", - "\n", - "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Moving a bike to Wellesley\n", - "Moving a bike to Olin\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "step(0.5, 0.4)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.3 0.2\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "def step(p1, p2):\n", - " print(p1, p2)\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')\n", - " \n", - "step(0.3, 0.2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## For loop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we go on, I'll redefine `step` without the print statements." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's start again with a new `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use a `for` loop to move 4 bikes from Olin to Wellesley." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin6
    wellesley6
    \n", - "
    " - ], - "text/plain": [ - "olin 6\n", - "wellesley 6\n", - "dtype: int64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "for i in range(4):\n", - " bike_to_wellesley()\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can simulate 4 random time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin5
    wellesley7
    \n", - "
    " - ], - "text/plain": [ - "olin 5\n", - "wellesley 7\n", - "dtype: int64" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "for i in range(4):\n", - " step(0.3, 0.2)\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If each step corresponds to a minute, we can simulate an entire hour like this." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin4
    wellesley8
    \n", - "
    " - ], - "text/plain": [ - "olin 4\n", - "wellesley 8\n", - "dtype: int64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "for i in range(60):\n", - " step(0.3, 0.2)\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", - "\n", - "But first, we want to plot the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TimeSeries\n", - "\n", - "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", - "\n", - "We can create a new, empty `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    \n", - "
    " - ], - "text/plain": [ - "Series([], dtype: float64)" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can add a value to the `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    04
    \n", - "
    " - ], - "text/plain": [ - "0 4\n", - "dtype: int64" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results[0] = bikeshare.olin\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", - "\n", - "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a for loop that runs 10 steps and stores the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(10):\n", - " step(0.3, 0.2)\n", - " results[i] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can display the results." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    010
    110
    29
    39
    410
    510
    610
    711
    811
    911
    \n", - "
    " - ], - "text/plain": [ - "0 10\n", - "1 10\n", - "2 9\n", - "3 9\n", - "4 10\n", - "5 10\n", - "6 10\n", - "7 11\n", - "8 11\n", - "9 11\n", - "dtype: int64" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10.1" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 10.000000\n", - "mean 10.100000\n", - "std 0.737865\n", - "min 9.000000\n", - "25% 10.000000\n", - "50% 10.000000\n", - "75% 10.750000\n", - "max 11.000000\n", - "dtype: float64" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "We can also plot the results like this." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap02-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "

    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�jalIpm?64gF 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

    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')\n", - "\n", - "savefig('figs/chap02-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function decorate in module modsim.modsim:\n", - "\n", - "decorate(**options)\n", - " Decorate the current axes.\n", - " \n", - " Call decorate with keyword arguments like\n", - " \n", - " decorate(title='Title',\n", - " xlabel='x',\n", - " ylabel='y')\n", - " \n", - " The keyword arguments can be any of the axis properties\n", - " \n", - " https://matplotlib.org/api/axes_api.html\n", - " \n", - " In addition, you can use `legend=False` to suppress the legend.\n", - " \n", - " And you can use `loc` to indicate the location of the legend\n", - " (the default value is 'best')\n", - "\n" - ] - } - ], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`savefig()` saves a figure in a file." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function savefig in module modsim.modsim:\n", - "\n", - "savefig(filename, **options)\n", - " Save the current figure.\n", - " \n", - " Keyword arguments are passed along to plt.savefig\n", - " \n", - " https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html\n", - " \n", - " filename: string\n", - "\n" - ] - } - ], - "source": [ - "help(savefig)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The suffix of the filename indicates the format you want. This example saves the current figure in a PDF file named `chap01-fig01.pdf`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", - "\n", - "It should:\n", - "\n", - "1. Create a `TimeSeries` object to hold the results.\n", - "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", - "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", - "4. After the for loop, it should plot the results and\n", - "5. Decorate the axes.\n", - "\n", - "To test your function:\n", - "\n", - "1. Create a `State` object with the initial state of the system.\n", - "2. Call `run_simulation` with appropriate parameters.\n", - "3. Save the resulting figure.\n", - "\n", - "Optional:\n", - "\n", - "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_simulation(p1, p2, num_steps):\n", - " olin = TimeSeries()\n", - " wellesley = TimeSeries()\n", - " \n", - " for i in range(num_steps):\n", - " step(p1, p2)\n", - " olin[i] = bikeshare.olin\n", - " wellesley[i] = bikeshare.wellesley\n", - " \n", - " plot(olin, label='Olin')\n", - " plot(wellesley, label='Wellesley')\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ0AAAEYCAYAAACHoivJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXhV1bn48e85OZlHkgABAiQEWIwyhFEgBBWVQUG0vbb2WntbO6ltnXq9tnWqtrU/a+eq1daqtdUqCCIoIiTMCfMMCwIECGEKISfzdM75/bFPQuacJGfI8H6eJ0+SPb4JYb977bXWu00OhwMhhBDCG8y+DkAIIUTPIUlHCCGE10jSEUII4TWSdIQQQniNJB0hhBBeI0lHCCGE11h8HYDonpRSIcBjwFeBBOAKsBZ4QWt9vM522cBLWus/KaWeARZqrSe143y9gUvAYq31ijrLnwN+Bnxba/16neWPAP8LxGmtW5w30CDGfwBhWuu72hpjg2OmAmlAuNa6uCPHauLY/wC+XmdRJXAceF5r/Z5zmwTgFDBWa32w7s/o5lieoZ3/pqJ7kpaOcDtnwkkD/gt4ElDAnUAgsEMpNb2ZXV8CbmnPObXWl4HDwNQGq24EcoC5DZZfD6S3lnC6sE+Afs6PkcCfgXeUUjUX/7POdUd9E57oqaSlIzzhGSAGmKi1LnQuOw1kKKX+hnHxG6m1rqq7k/OOvyN3/enAtJpvlFJhwBTgEeBppZSpTpKZDjzXgXN1dhVa6wt1vn9FKXU/8BVgp9baBlxoelchPEeSjnArpZQZuB94qk7CqetnGC2PWzDuxuvu+wzORzHOx08fYiSM54BewEbgW1rri82cfgNwr1LKrLW2A7OBc8A/gJeBCcBu56Ol/sB653n9gZ8D9wHBQAbwA621duHnneo8djJG6+F1jMdUdqWUBfgt8CUgEtgFPKK13t7EccKB3wB3AQ5nbD/UWucqpX4MPAgMrkmaSqkU4FOgbxsez+XVOV8CdR6vNYhlCLAFWKq1ftC57DHgIYybib3AY1rrDOe60cCfgMlAGbDCGXuJ85B+SqlfA9/EuOa8Bzykta507v8w8D2Mx7DFwCrge1rrYuffxFSMpzLTMP5d3mopHtG5yeM14W7DgSiMC3cjWutc4BhGS6M1UcB3MR7NLca4+Py0he3TgTBgtPP7m4B1WusiYCfXHrFdD+TU6Vt6DliA8ThwKqCBDUqpyJaCU0r1AdYAnwFjgR8ADwA/dm7yEHArcJszpmPAh0opUxOH+yvGY8hbMJKlA1jjTFzvAgOAGXW2/yqwwpWEo5QyKaXmOn/ud1vZNg6j722VM36UUt8Bfgh8HyNxrwbWK6USnbv9C+N3dp3zZ70ReKLOYccD0RhJ47+Bbzg/UEp9BaNl/AgwDCPxLwK+U2f/WzFuOKYBq12IR3Ri0tIR7hbt/JzfwjZXgFgXjuWH0TLYBaCU+id1Hp81pLW+pJQ6gpE4DmBc/H7lXL3e+f2LGBfvmlZOMPAwcKPWeotz2x8opW7BuEC21LH+ALBDa/1z5/fHlVL/B/zBed4EoBTI1lpfdg5emECDmz1ny+JuIF5rfc657L8xWia3aq0/UUptcG6z2dkyu4v6gwUaWqyUqklIAYA/8A6wv4V9ooDPMW4Yvl3nUeSTwBNa61XO73/hbIk+gDFYJAH4GDittT6plLodY/BCjavAd7XW1c7f0UZgnHNdLnCf1rqm1Xva+bOOqrN/GfBLZ+sVpVRr8YhOTJKOcLeaZBPRwjZR1HnU04pjdb4uxLh4opT6FJhVZ90orfUZjEdsU5VSHwNjcCYX5+cfKKX8MO74f+9cnoQxwOFzpVTdQQVBGC2PlowGUutc3MFIKMFKqRiMhLUIyFVKbcW4MP9Da21Tqt6hay6wusHyEGcMn2AkjF8ppX6I0RpyYCSI5qzF2VLB+J2NxBio8Vfgf5rZ56cYCWp1nQt8GDAIeF0p9VqdbQOBCufX/4sxUOF7Sqk1wAda6+V1tj3tTDg1CjAeY6K13qCUmqSUeh4YgfE7VcDbdbY/1cZ4RCcmSUe4WxZwGZgJ7Gm40jm0WdHM47cmVDb4vubR1LdwXriccp2f0zHuzOcAR+p0pm/B+HufgfEorCYZ1fwfmIsx5Lqupvqk6rIAS2n6kZ9Va31FGVlkHjAfeBT4oVJqShPHqcJoBTUcTVeTxJdiXNhTMQYD/KfhQIwGSrTWWXW+P6KUCgTedSaupmwE3gL+oZR6V2t9AKO1CUarquG/ZxmA1vpVpdQnwB0Yj8L+o5R6S2t9v3M7WxPnMgEope4DXgHexOij+jnwbFPncWo1HtG5SZ+OcCvnHe2rwGNKqegmNnkOOIPRD9KR85zTWmfV+ai5k07HuKufC6yrs305sA2jMzvb2SoCI0lWA31qjgWcwOhnaJgcGjoCjKgbh/PcTwF252ixxVrr5Vrrb2P0d/UFUpo4jj8QWuc454H/59wH56CMlRh9W/NopW+mGeYGnxv6WGv9LkZCfs052s+KMcptQIOf80HgFqVUhFLqT4BDa/1HrfUC57p7XIzpAeD/aa2/r7X+G8bjv2Fcu7mop7V4XDyn8CFp6QhPeAGjM3yL8/n7LoyL7UMYj5vmtXKX3m5a64tKqZMY/R8NL3zrgf+jzgXbOULqL8DvlVIVGJMoH8a4uD/dyun+jPHI7g/OrwcCr2F08NuVUlHAz5VS+c7jLsC4U9+LMXquJgbtfBz4tlLqAYyW4gsY/Vd159G8A3wAnNdab20ltkDnoAAwLuDK+fN8qrW2KqV6tbDvQxh9Yt/BuIH4NfCUUuo8sANjEMODwGytdaGzP6W/UqqmxbfYuZ0rrgBzlFKjnHE+jPG48UAL+zQbj4vnFD4kLR3hdlrrCoyWxj+A5zEunMsBOzDJhQtmR6VjPHrb0GD5Oox+kvUNlv8YY3j2mxh32hMxEuOJlk6ita4Z+j0J2IeRFN4HfuTc5GWMvok3MUZ3fQe4U2t9rPHR+DrGCLvlGBfSSGCu1rqgzjafYQxM+FdLcTktxGgtnccYov4vjD6ge1vb0RnfS8AvnYnr987vf40xAffLwF11Bl4swfi9bgUygXKMROCKH2I8UtwJfIHRN/NLjH+D5rQWj+jETPLmUCG6Bmfr5DwwXmstlQRElyRJR4hOzllWaD7GAIIorfWNPg5JiHaTPh0hOj8bxlDny8DtPo5FiA6Rlo4QQgiv6fItHefcg8kYz7qbmg8ghBDCe/wwKpjvcA4qqqfLJx2MhLPJ10EIIYSoZxawueHC7pB0zgO8++67xMXFtbatEEIID7pw4QL33HMPOK/NDXWHpGMDiIuLIz4+3texCCGEMDTZ3SGTQ4UQQniNJB0hhBBeI0lHCCGE10jSEUII4TWSdIQQQniNJB0hhBBeI0lHCCF6IOuO1Zx68SuUnTnk1fNK0hFCiB7GXlnG1Y3v46iu5OqG9716bkk6QgjRwxTtW4+9vBiA8jOHKD/X1HsFPUOSjhBC9CAOWzXWjI8BCIhLAsCascJr55ekI4QQPUjJkW1UF+bhH92fuC/9L/hZKDmaSVV+rlfOL0lHCCF6CIfDQcG25QBETrsdS0QM4WNmAw4KMlZ6JQZJOkII0UOUndpP5aVs/EKjCBs7GzCSD0Dx/jSqiws8HoMkHSGE6CGsGc5WzpQFmC0BAATExhMyfDIOWxWFO1d7PAZJOkII0QNUnD9J2an9mAKCCJ94S711UdMXA1C46zPslWUejUOSjhBC9AAFzlZOxISb8QsKrbcuKH4EgfEjsJeXULR3nUfjkKQjhBDdXFXBRUqObAOzH5FTFja5TU1rpyBzJQ5btcdi6Q5vDhVCdCHVRfk4qisbLbeEx2Cy+HslBntFGebAYK+cy5scDge2oiuNkkbB1o/AYSdsbCqWiJgm9w0Zlox/zACqrpyj+PAWwp0DDdxNko4QwmusOz/lypo3mlznH9Of+Pt/i8nPs5cl647VXPn8b/RZ8hhhI6d79FzeVrD5Q65ufK/Z9VFTFzW7zmQyEzltEXmr/kLRnrWSdIQQXZujuoqCLcsAsETEgvna031bSSFVV3IpPryZ8LGpHovBXlXB1c0fAHB143uEjpiKydQ9ehnsFaUUZBqVBiyRfcBUf33oiGkE9BnU4jHCx6RQdnIPAbEtb9cRknSEEF5RfGgTtuJ8/HsPIv7+lzGZrl0Vi/at5/Inf6Zg2wrCxsyut86tMexPx15aCEBVXg6lx3cROnyyR87lbYV71uKoKCVo0Gj6//dz7TqGyeJP3yWPuTmy+rpHihdCdGoOh50CZ32vqOmLGiWVsNGz8AuLpuryGcpO7PFMDHZbbUsgaNBowLs1xzzJYavCmvkJYPx+OzNJOkIIjys9vouqvBz8ImIJGzWz0XqTxZ/IKQuAa0N73a1Eb6f66gUsUX3p+6X/xRwUSvnZI5TnHPXI+byp+OC1VmRw0kRfh9MiSTpCCI+raVFETlnY7ECBiAlzMQWGUH76EOXnjrv1/A6HA2tNzbGpt+MXFEqEc4Jkwbau3dqp14qc1rgV2dlI0hFCeFR5zlHKzx7BHBRKxPibmt3OHBRKxMSbAfc/9io/c4iK81mYQyIIHzcHgIjJ8zH5+VN6bAeVeTluPZ83lWbtNlqR4TGEjZ7h63BaJUlHCOFRNS2JiIm3tDo3JnLyAjBbKDmaQVX+eTfG4GzlTJqH2T8QAEtYL8KuSwUcWDO9U2HZE6614BZi8vPOPKeOkKQjhPCYyrwcSo/twOTnT8Tk+a1ubwmPJnxsCuCo7fTvqIqL2ZSd2IPJP5CI5Hn11kVOvR0wUXQgneqiq245nzeV52ijFRkYQsT4ub4OxyWSdIQQHmO0IByEXZeKJayXS/tETjNGXxXvc0+pfaszeYWPuxG/kPB66wJi+hOipoCtmsKdqzp8Lm+r6cuJSL61y1RYkKQjhPCI6qKrFB1IB0zOFoVrAmLjCRlWU2r/047FYL1M8aHNYDITOfW2Jre5VmF5DfaK0g6dz5sqr5yjVG8HP4tLrcjOQiaHCiFcZistoqrgokvbFu1bB7ZqQtRUAmL6t+k8UdMXU3p8B4W7PiNk6EQw+7UnXIp2fw52G6GjZ+If1afJbYIGDCdo0CjKzxymYOsyQtS0dp3L26zbjVZk+FjXW5GdgSQdIYRL7JVl5Pz1R9hK2vbIq6Yl0RZBA0cQGK+oyNHkvvVkm/dvFMO0lidMRk1bzIUzhynY+pFRHLPLMNW++bOrkKQjhHBJ0d512EoKMIdE4B/Z26V9ggaPIWjA8HadL+am+8hf93aTFanbInjIeALjhrS8zdAJhE+4mcoLJzp0Lm8LGT6FgJgBvg6jTSTpCCFa5bBVU+AcVtx7wfe9Uq8saMBw+t/7vMfPA0aF5d7zv+OVc/V0MpBACNGq4sNbsBXm4R8bT8iwZF+HI7owSTpCiBY5HA6sznpoRpkVuWyI9pO/HiFEi8pO7qXy0hn8wqIJGz3L1+GILk6SjhCiRbUlZKYs8NrrpEX3JUlHCNGs8twsyk8fxBQYQsSErlFmRXRuknSEEM2q6cuJmHgz5qBQH0cjugNJOkKIJlXln6fkaCaYLUb1ZyHcQJKOEKJJ1syV4LATNiYFS3i0r8MR3YQkHQ86lWulqtrm6zCEaDNbiZWi/WkARHWxMiuic5Ok4yGb9p7jB79J5y8f7vd1KEK0mXXnahzVlYQMm0RA74G+Dkd0I5J0PMDhcPCfL44BsH7XWS7ld51y6ULYK8so3PkZcO3dNkK4iyQdD9itL5F9vhAAu93Bio1dq4ig6NmK9q3HXl5M4ABF0MCRvg5HdDOSdDxgWVoWAKnJ8QCsyTxNYUnHKuUK4Q0OWzXWDONNm1HTF2EymXwckehuJOm42bEzV9mflUdwoIXv3nEdE0f0oaLSxqdbT/k6NCFaVXJkG9WFefhH9yfEC5WkRc8jScfNlqUbrZx50xMIDfZnSepQAFZuPklFlYxkE52Xw+G4VvJGCnsKD5G/KjfKzStm2/5cLH4mbk8xXhp13dBYhsZHYi2uZP2OMz6OUIjmlZ3aR+WlbPxCowgbm+LrcEQ3JUnHjZZvOIHdAakTBxITGQyAyWRiyZxhAHyUfgKb3eHLEIVolrVOYU+zJcDH0YjuSpKOmxQUVbBuu9GSuSM1qd6668f2Iy4mhPNXSsg4cN4X4QnRoorzJyjLPoApIIjwibf4OhzRjfkk6SilpiilLtX5PkAp9VelVL5S6rJS6v98EVdHfLLlJJXVdqaMimNQXES9dX5+ZhbPNvp2lqYdx+GQ1o7oXAoyVgAQMeFm/KSwp/Agl5OOUmqOUqq38+t7lFKfKKWeUkpZ2nAMk1LqW8DnQN32+7OAApKAycDXlVL3unpcXyuvqGb1FmN02pI5Q5vc5sbJA4kIDeD42QIOnrjizfCEaFHV1QuUHNkGZj8ipyz0dTiim3MpYSilHgOeB25USg0C3gQ+AL4OhAOPu3i+Z4EFzmP9tM7yrwP3aa2vAleVUi8B3wHedvG47Wa3O9ifdZmCoop2H+Po6asUlVYxYnAvRiU2XRgxKMDCwplD+NeaoyxNO87YobHtPp8Q7eGorqI0axf26vpzxkqOZhiFPcemYomI8VF0oqdwtZXyPeCrWustSqnfA7u01vcopWZgJB9Xk86rWuunlFKpNQuUUlFAP+Bwne2OAmNdPGaHHD2dz89e2+aWYy2ZM6zFyXQLZiSyNO04u45e4lSulcT+kW45rxCuuLrpPxRsXdbs+qipUvJGeJ6rSac/sMP59QLgLefX54CIJvdogtY6t4nFYc7PdQuUlQIhrh63I4b0j2RRSlKHWjoA/XuHMnV0XIvbRIQGMHfKID7ZfIqP0rN45KvJHTqnEK6yV5Ri3WXUUwsdMR2TX/3/+kEDRxDQZ5AvQhM9jKtJJwvj0VoOMARY4Vz+NYxWSUeUOD8H11kWAhR38LguCQq08K1FY7xxKgAWzx7K6q3ZbNxzjq/NG0mfXl7JraKHK9yzFkdFKUGDRtP3zsd8HY7owVwdSPAU8BqwBvin1nq/Uuo3wJPATzoSgLMf5wLGQIIaI6j/uK3b6Bsdwsxx/bHZHXy88aSvwxE9gMNWhTXzE8CopyaEL7mUdLTWHwEDgWStdc2osreA4VrrNW6I4x3gaaVUrFIqAXjMuaxbqimNsyYjm+JSKQQqPKv44CZsxfn49x5EcNJEX4cjeri2zNPJA/orpR52dv4HAYVuiuMp4CBwCKPvaCnwqpuO3ekkxUcxfnhvyittrN6a7etwRDfmcNhr5+BETZOq0cL3XB0y3Q/j0VoCRn/LCuAJYKpSaq7Wuk2PwrTW6UBUne/LgQecHz3CnXOGsvfYZVZuOsni2UkE+Pv5OiTRDZVm7aYqLwe/8BjCRs/wdThCuNzS+T1GH0tvoMy57GtABvA7D8TV7Y0b1pshAyIpKK5g/c6zvg5HdFO19dSmLsTk5+/jaIRwPencADynta4dV6y1LsUYRDDVE4F1dyaTiTud1Qs+Ss+SQqDC7cpzNOVnj2AODCFi/FxfhyME4HrSMWH04TQUC0hPeDvNuK4/faJDyM0rIfOgFAIV7lVbTy35VsyBwa1sLYR3uJp0lgK/cfbtOACUUtcBf+banB3RRn5+Zu6YbVSklkKgwp0qr5yjVG8HPwsRk+f7Ohwhark6OfQR4HWMCgRg9O/4AyuBRz0QV49x0+RB/GuN5tiZAg6dvMKYJKnJJlxnryyn+NAmHA3qqZVm7QYchI9NxRLWyzfBCdEEl5KO1roY+IpS6klglHO/I1rrY54MricICrSwcGYi//5cszQtS5KOaJOrG/6Ndfsnzaw1ETntdq/GI0RrXB0y/SWt9Qda61PAqTrLRwOvaa1neirAnsAoBJrFziMXOX2hkMFxLpezEz2YrayYwj1fABA+YW6j0WlB8cMJiBngi9CEaJarj9feVkoFaq3/CaCUCgSexqgckOGp4HqKyLBA5k4ZxKotRiHQH90ts8ZF6wp3r8FRVU7wkHH0nv9dX4cjhEtcHUjwX8CrSqn7lVI3Y/Tp/A9wv9Y6xWPR9SCLZydhNsGG3TnkFZS1voPo0ezVlRTuWAVA1LTFPo5GCNe5WnvtY2A+8GtgtfNDaa3fanFH4bK4mFBmjBtAtc3Bx5ukEKhoWfH+dGwlVgLihhCU4JVXTwnhFs0+XlNKjWqwKA94CGMU2yVggFJqAEBby+CIpi1JHcqmvef4bFs2X75pOGHBMoNcNOaw27BmfgxA1PTFUk9NdCkt9ekcxJiTU/MXXTOJxITx2uln6yyXwmFuMHRgFOOGxbLveB6fbcvmrhuG+Tok0QmVHttBVf55LFF9CB0xzdfhCNEmLSWdRK9FIWotSR3GvuN5fLzxBItShuBvkXwurnE4HBTU1lO7HZNZ/j5E19Js0tFan/ZmIMIwQfUmoV8E2ecLSduVw81TB/s6JNGJlJ89TEXucczB4YSPu8HX4QjRZi316VwCRmmt85RSl7n2eK0RrXUfTwTXE9UUAv3Nv3azLC2LmyYPwmyWZ/bCYN3mrKc2aR5m/0AfRyNE27X0eO1xoMj5tbxU3Ytmjh/A258e4dzlYrYfvsC0Mf18HZLoBCovnaE0axcmSwCRybf6Ohwh2qWlx2tvNfW18DyLn5nFKUm8vuIgy9KyXEo6R7Pz2XX0kkfiGdwvnJnjWp/ZfujkFfYeu+yRGJpisZi4ecpgekU0VQC9+ynINFo54eNuwC800sfRCNE+rlYkQCn1FeD7wGiM1xkcBn6ptV7rodh6tLlTB/PvzzVHsvM5dPIKo4fENLttaXkVz7yRQUlZlcfi6fujEIYNbL5wZHFpJc++sY2yCpvHYmjKyXNW/u/rU7x6Tl+oLrxC8cFNYDITOfU2X4cjRLu5WnvtIeBXwGvAXzAmlU4HViilHtJa/81zIfZMwYEWFsxI5P0vjvFRelaLSefzzNOUlFUxOC6cGdf1d2sc+sxVdh29xLK0LP733snNbvfptmzKKmwM6R/JtDFxbo2hKXYHfLj+ONsOnCc3r5j+sWEeP6cvWbd/AnYboaNm4N/L879fITzF1ZbOE8C3tNb/rrPsXaXUToz5OpJ0PGDhzCEsS88i89AFzl4sYmDf8EbbVFXbWbHhBAD3LhjFlFHuvSBdsZbxrRfWsnV/LufzSugXG9pom8oqW20VhW/cNorxw70zruSKtYy128+wPP0E379rnFfO6Qu28hIK93wOQNS0RT6ORoiOcbX2Wjiwp4nlmUDzt+CiQ6LCA7lp8iDAeKV1UzbtzSHPWs7AvuFMGtHX7THERAaTOnEgdgcs39B0DGm7zlJQVMGQAZGMG9bb7TE0545U43XfX+w4w9Wicq+d19uKdq/BUVlOcMJYAvsl+TocITrE1aTzd+BppVRtj61SyoQxwu1dTwQmDItTkzCZjAv7FWv9QqAOh4OlaUYiWJI61GNDq+9INS50X2w/g7W4ot46m91RmxDvnDPUqyVZBvYNZ+roOKqq7azafKr1Hboge3Ul1u1GYc/I6VLYU3R9zSYdpdQOpdR2pdR2YBZGpekcpVSaUuoLjLeI3gsM9E6oPVP/2DCuH9ufapuDlQ0Kge46eokzF4qIjghi9sR4j8UwKC6CKaPiqKy280mDi/v2Q+c5d7mEPtEhbu9PcsWdc4xSQau2nKKsotrr5/e04gMbsZUUENAngeDE7vsIUfQcLbV0PgFWOT8+xui7+SOQDmzCGFTwc4xHbMKDlswxHiN9ui273gi1pWnHAViUkoS/xdVGa8diWLXlJOXOi7vD4WDpeqOVszglCT8/z8bQlJGJ0YxMiKa4rIq1md2riIbDYceaYQyTlsKeortoaZ7Os82tE941fFAvxiTFcPDEFdZkZLNkzjD06XwOnrhCSJCFW6d7vlTOqMRo1OBe6NNXWbv9DLfNGsLhU/noM1cJD/Fn7pRBHo+hOUvmDOWFN7ezfOMJ5s9IxOKD5OcJRmHPXCyRvQkdOd3X4QjhFt3jf2cPUPMYacXGk1RV21nm7EeZNz2BkCDPvwKhpjwPGAMKbDZ7bUtrwYwhBAW6POXL7aaMimNA7zAuXy1j895zPovDneoX9rwNk5/vfr9CuJMknS4ieUQfBseFk19YzntrNdsOnMfiZ+a2WUO8FsOU0f0Y0DuUS1fL+Pfnmh2HLxJgMbNwpm8LkpvNptrHf8vSs3A4mi0T2GVU5Byl4twxzMFhhI+70dfhCOE2knS6CJPp2oX1P18cw+GAOcnxxEQGey0GP7Opdpjy+18cA+CmKYOIDPN94ck5yfH0Cg/kVG4he7xYisdTalo5Ecm3Yg7oGWV+uoMdO3bwzW9+k+TkZCZNmsSXvvQlli9fXrv+hhtu4IsvvgBgwYIFpKWl+SpUn2mpyvQG4Mta64tKqXuB97XWFc1tLzxv1vh43ll9hDyrMSelJgF405zkgfzzs6MUFFVgNsHi2d6PoSn+Fj9uT0nirVWHeWPFQcYNja233mIxc9vMIfSJDmnX8UuOZlB2+mCj5SY/fyKnLMASEdvEXu1Tefkspcd3GoU9J81323GFZ61evZpnnnmGhx9+mN/+9reEhoaSkZHBU089xdGjR3niiSfqbb9q1SofRepbLT0ongL0Ay4CbwKfAl3/FrIL87eYWZw6lDdWHGTamLgmKxR4WoC/H4ucF/cZ4wY0WaHAV26dnsAH645x9mIRZy8WNVp/7nIxT32z7W/arLZe5uJHL4O96bpyVQUXibvrx20+bnMKMoxXUYddlyqFPet49o0Mdh656LXzTRrZl6e/5drfS3l5Oc899xzPPPMM8+dfu1GYMWMGb7zxBgsXLmTRovrVJG644QaefPJJbrrpJm644Qbuvvtuli1bxuXLlxk/fjwvvvgisbHuu5npLFpKOuuArUqpixivqN6plGryf53W2nsdCz3cbTOHEBsV3OhO3pvuSB1Kv5hQJijvVR9wRViwP7/43gwOn8qvt9zhcPDWqsPsOHyRMxcKGRQX0abj1tQ9Cxo8mlBV5yLksHNl/TuU6u1UXsklIKbj85SMwp4bwWQmaurtHT6e8I69e/dSWlrK3LlzG61LTExkwsZQ+MUAACAASURBVIQJtY/VmrN69Wreeust/P39ue+++3jzzTd5/PHHPRWyz7SUdL4MLAZ6YczPeYVr79cRPmI2m3wyCbMuP7OJGeN8G0NzkuKjSIqParQ851Ixn27L5qP0E/zw7gkuH89WVkzhHuNiEXPjfQT2q39/VXn5LEV7v8Ca+TG953+3I6EDYN2xCuzVhI6cjn+0vEepLldbHb5w+fJlIiMj8fdveiRp7969uXy55QdFd999N337GqWs5syZw8mTJ1vcvqtqaZ5OKfAvAKVULPAH5zIhupzFqUl8lpFN+u6zfG3eCJcHYBTuXoOjqpzgxOsaJRyAyGm3U7R3HcX70+mV8l9Ywpp//UNr7OUlFO7+3HlcKXnTlcTGxnLlyhUqKysJCAhotD43N5eZM2e2eowaFosFm827rwnxFpdGrzkniiYppd5RSu1WSu1VSr2nlLrew/EJ4RZ1ywl9vNG1O0h7dSWFO5x1z5pJAgExAwgZPhmHrYrCHas7FGPhnrU4KssIGjyGoP6dY4CGcE1ycjIRERGsWLGi0TqtNQcPHuSGG27wQWSdj0tJRyk1D9iNUVH6Q+ADjMrTG5RSN3suPCHcp7lyQs0p3p+OrcRKQN9EghOva3a7KGchzsLda7BXlDW7XUsc1VVG31Gd44muIyAggJ///Of8+te/5t///jeFhYVUVFSwadMmvv/97/OVr3yF0aNH+zrMTsHVac6/AJ5vWBpHKfVTjPprn7s7MCHcbfigXoxNiuXAibzackLNcdhtWDNXAhA1fVGLdc+C4hVBA0dSfvYIRfvWETllYZtjKz60CVvxVQL6DCJ4yPg27y98b+7cucTGxvLqq6/yu9/9jqqqKpKSknjggQdYsmSJr8PrNFxNOiNo+hUG7wFPui8cITxryZyhHDiRx4qNJ7lt1hD8LX5Nbld6bKez7lkfQke2/hQ5ctoiys8eoSBzJRHJt7apbI3DYafAWdgzcpoU9uzKJkyYwGuvvdbs+vXr17f6NcBDDz3k/uA6CVcrEpwBmhrykwxccl84QnhW8og+JPSLIL+wnA27c5rcxqh79hHgrHtmbjox1RUyLBn/2HhshXkUH97SpphKj++iKi8Hv4hYwkbNaNO+QnQ1riadPwOvKqUeVkpNd348AvwFYyi1EF1C3XJCy9KzsNsb12krP3uEitzjmIPDCR/nWuevyWSufZW0NWN5m+q/1b6+QAp7ih7A1dFrfwBeBv4P2OL8eAR4Wmv9oufCE8L9Zo0fQGxUMGcvFjc5w91aU/ds0rw21T0LGz0Lv7BoKi+doezkXpf2Kc85SvnZI5iDwggfL4U9Rffn8m2V1voF4AWlVB+gTGstE0VFl2TxM7N4dhIHPl3OxeVbSf/82rwKEw4Glh4BvwAik29t03FNFqMOW/76d8j68E/kB7Q+gTaq6iIRQETyLZgDvFe8VQhfaXNbXmstfTiiy7tBBTF64zbMOKCJKc9HAkYzpB11z4oHXU+J/X3CqgsIqy5waZ8Kh4X8/jOIbvPZhOh65AGy6JEq9qzGbHJQ1nsUJf2Ta5c77PDZ9hz25fdjVK6VxP5tSzzLt+ayp3AeqYNtqITWqxOcyLGSdtLB0MzL/Hi4598AK4SvSdIRPY6txErRPmOI6rDF9xPQp/6rtvfbD7Bz00mWpWXx6D3JTR2iSVcLy1m/8yzVjkjmfPkG4vu0XgV8SEEZ77+wlov7znFh/kjiYjpP1W4hPMHVigT/rZSK8XQwQniDdddnOKorCRma3CjhACxKScJsNrFx7zku5btebnDlZuNV4lNHx7mUcABio4KZPTEeuwOWbzjh8rmE6KpcHTL9B6D7vdhB9Dj2ynIKd34KQOT0RU1u0yc6hJTxA7DbHazY6FoiKKuoZvXWbADubKHSQVOWOF/Gt3b7GazF8p5E0b25mnQygTs8GYgQ3lC0bz32siIC+w8jaOCoZrermcuzJvM0hSWVrR7388zTlJRVMSoxmhEJbRsSMLhfBJNG9qWyysbqLafatK/oHL797W/zy1/+st6yRx99FKUUp05d+ze9cuUKI0aMqLesoczMTCZNmtTo6/ZyxzHcydWkYwd+oZQqVkodUEptr/vhyQCFcJf69dRaLjeT2D+SiaoPFZU2Pt3aciKottlrH421tZVT405nklu5+RTlldXtOobwnVmzZrFjx47a7202G5s3b2b8+PGkp6fXLs/MzCQ+Pp7ExEQfRNk5uDqQINP5IUSXVXJkG9XWS/hH9yNk+ORWt18yZyi79SVWbj7J4tShBPo3XQ5n095z5BWUMbBvGJNG9m1XbKOHxKAG9UKfucq67WdYMFNextvQ+fdeoOzEbq+dLzhpIv3u/olL286aNYtf/vKXFBcXExYWxu7du4mNjeVLX/oSK1as4Bvf+AYAGRkZpKSkYLPZeP311/nggw8oLi5m2rRpPP3000RHt9xK3rVrFy+++CInTpxg4MCB/PjHP+b6643agEuXLuWVV17BarUyaNAgfvjDH5KSkuLyMVauXMlvfvMb0tLSam/InnzySSIiInjiiSfa8qtrkcvv02npw23RCOEhRj01o9JA5NTbXaqndt3QWIbGR2ItrmT9jjPNHndZWhZg9M2Yze0r1lm3PM9HG05gs9nbdRzhGwkJCfTv359du3YBkJaWRkpKCikpKezZs4fCwkLASDqzZ8/m7bff5uOPP+bNN99kw4YNREdH8/DDD7d4jvPnz3P//fdz7733kpmZyWOPPcYPfvADzpw5Q35+Pj/72c945ZVX2LFjB3fffTfPP/98o3JMLR3jpptuwmq1snu3kdgrKytZu3YtixY13ffZXi4PmVZKfRl4HBgGTAS+D1zQWr/kjkCUUv8DvAbU7Ul9QGv9ljuOL3q2suz9VF48hV9oJGHXpbq0j5EIhvHrd3byUfoJbp6WgF+DpLJbXyL7fCHREUHMnhjfoRinjulH/9hQcvNK2Lr/PLMmDOjQ8bobV1sdvjJz5kx27NjB7NmzSU9P5+mnn6ZPnz4MGzaMzZs3M3HiRC5cuMCUKVP41a9+xUMPPcSgQcboyccff5xJkyaRnZ3d7PFXrlzJxIkTWbhwYe35UlJSWLp0Kffffz8Wi4UPP/yQhQsXsmTJEu66665Gj5BbOsbDDz/MzTffzOrVq0lOTmbjxo307duXkSNHuvX35OqQ6fswinsuA2pqhhwFnlJKuavdNRH4jdY6rM6HJBzhFtZtRlHNiMkLMFsav064OdeP7UdcTAjnr5SQceB8o/U1rZxFKc2/JsFVfmYTdzhHsi1NP96moqHC92qSztmzZ7l06RLJycYcr5SUFDZv3kxGRgaTJ08mODiY3NxcfvKTnzBp0iQmTZpESkoKFouFc+fONXv83NxcMjIyaveZNGkSaWlpnD9/nrCwMN566y1Onz7Nvffey8yZM3nttdca/Q21dAyARYsW8dlnn2Gz2Vi5ciW33367239PrrZ0HgW+p7X+QCn1JIDW+g2l1FXgJeBXboglGfi9G47TrdlKrFxZ/zYRE28haMBwn8RQXXSV/LR/Ejl5PoH9knwSQ3MKMldSdnJP/YUOB2Wn9mPyDyJi4i1tOp6fn5nFKUm8+tEB/rp8P2sysmvX2R0O9mflERxo4ZZpCR0PHrhh0kDe/ewoJ3Ks7Dt+mfHD+7jluMLzpk+fzuOPP866deuYMWMGFotxeZ09e3Ztn8js2bMB6NOnD0899RSzZs2q3f/YsWMkJCSwZ8+exgd37nPzzTfz8ssv1y7LyckhNDQUq9WKzWbj1Vdfpaqqii1btvDQQw81GrXW0jEApk2bhtlsZuvWrWzcuNGtfTk1XB29lgTsbGL5XiCuo0EopfyA64D/VkrlKqWylFJPKKXkbVYNXN30H4r3p3N51Ss+uxO+uuHfFB9I5/LqxndSvlR55Rz5X7xF2cl99T9O7QeMopp+wWFtPu6NUwYRHRFIfmEFe45drv3YdzwPgIUzEwkN9nfLzxDg78fCWcbIpppWlOgaQkNDGTNmDG+//Tapqam1y8ePH09hYSGbN2+u7dhfvHgxf/7znzl//jw2m42//vWv3HPPPZSXlzd7/Pnz57NhwwY2bNiA3W7nyJEj3HXXXaSlpZGfn883v/lNtm/fjr+/P3379sVkMhEZGenyMQDMZjMLFy7kpZdeYuzYsfTr18/tvydXWzoauAl4vcHyL2M8Zuuo3hhJ7S1gCTASWAEUYjzWE9Qv31J1+QxlJ/YQMnSiV2OoLsqn6OAGACovnKD89EGCE8Z6NYbmWDM+BhyEjpje6DUBJos/QfEj2nXcoAALL/9oNqfPNy6s7m8xMzLRvaU651+fyIfrjrPn2GVOnrMyZEDbC48K35g1axYvv/xyvVFjZrOZGTNmsH//fhISEgBjXk91dTX33HMPBQUFDB8+nL/97W9EREQ0e+yEhAT++Mc/8vLLL/PII48QERHB/fffX/sq7GeffZaf/exnXLp0iV69evHTn/6UYcOGkZmZ6fIxwHjE9ve//50XXnjBzb8dg8mVO1Wl1DzgQ+CfwL3AH4GhwELgLq31x+4OTCn1GDBPa93iS0aUUgnAqXXr1hEf37GO3M4uf8N7FGz+AFNAEI7KcoIGj6b/157zagxX1r+Dddvy2hiCh4yn31d+5tUYmlJdfJUzf/ou2GzEf/cPBMS0/lqBzuz1FQf4eONJZk+I57GvuV7/TYiOys/P58Ybb2TTpk2EhbX9yUBOTg433ngjQKLWOrvheleHTH8KTAECgYPAXKAcmOaOhKOUGq2Uajj0OsB5DoGzfMsuo3xL38WPYAoMofz0IcrPHfdeDBWlFO7+3IhhyWOY/IMoO7mXiovZXouhOYU7VoOtmhA1pcsnHLhW/23TvnNcbEP9NyHay263c+zYMX73u99xyy23tCvhuKItL3E7BNznkSigAHhUKZUD/A2YAPwAeNBD5+tyjPItxQQOGE7w0IlETLwZ67blWDNWEHTnY16JoXDPWhwVpQQNGk1I0gTCJ9xE4fZPsGasoM+iH3olhqbYK8oo3PUZYFQa6A769AohZcIA0nflsGLjCb69uHM8whTdl8lk4t5776VPnz68/nrDnhT3cXUgAUqpryilNiml8pVSF5RS65VSc90RhNb6HHA78B2MfpylwM+11h+64/hdXb3yLdOM8i2RkxeAn4WSoxlU5Tceyuv2GGxVWDM/MWJwFsqMmrIQTGaKD22myuq7d/sV7l2LvaKUoEGjfDaizxNqCoF+7mL9NyE6wmQykZGRwccff0zfvu2rrOEKV+fpPAS8AewAHsAYQn0YWKGU+qY7AtFar9daT3LOz0nQWv/ZHcftDq6Vb+lPyHBjCKQlPJrwMbMBBwWZbu9Sa6T44CZsxfn49x5EcJIxeMES2Zuw0TPBYa9NSN5WNxlGTnPvzGlfS+wfycQRRv231a3UfxOiq3C1pfME8C2t9SNa639rrd/VWj+IUZXgKc+FJ+qVb5lWv3xL5DRj4lbxvjSqi117NXL7YrBTkGFMroyatqjeLOeaC33R3i+wlTYe3eVpxYe2YCu6gn9svNdH8nlDbSHQTSepqLL5OBohOs7VpBMONDVjKROQl7t50LXyLVGEjZ1db11AbDwhwyfjsFXVviPGE0qzdlOVl4NfeAxho2fUWxfYN4HgIRNwVFVQuHuNx2JoisPhoCDDSMhGMnT5aXGXMTYplqEDoygsqWRdM/XfhOhKXP1f+nfgaaVUUM0C58TNx4F3PRGYMFwr3zK/yfItUdOMjvPCXZ9hryzzUAw1hTIXYvJrPAmypo/HumMV9irvvYSs7MRuqi6fxS8smrAxs1rfoQsymUy1rZ2P0rOw2TvPZFwh2qPZ0WtKqR1AzV+4H8aIsrlKqQOADRgF9AE+93SQPVXFhZOUndrXYvmWoIEjCIxXVORoivauI3LKQrfGUJ6jKT97BHNgCBHjmx43EjR4DAFxSVReOEHx/nQikttWaqa9CpwJublk2F1MH9ufuJgQLlwpZduBXGaOk0Kgoutqach0w57hhr3Vm9wci2igph8lYsJNLZZviZq2mIsfvkj+hvcoOrDRrTHYivONGJJvxRwY3OQ2JpOJqOmLuPTRy+Sn/ZPCvevcGkOTHHYqL57CFBhCxAS3DKLstGoKgb6ydD9L1x9nxnX9W3wBnRCdWbNJR96T41tVBRcpObwVzH6ttl5Chk8ioE8ClZeyqbxwwu2xmAJDiJg8v8VtQkdMwz82nqq8HI/E0JzIyQswB4Z47Xy+cuPkQfxrzVGycqwcOJHHdUN7+zokIdrFpcmhSikL8DVgNEZVgnq01j9wc1w9njXzE3DYCRszG0tkyxcYk8lM/68/T1Ve82XRO8IvIhZLWFTLMZj9GHDfr6i64pkYmjynxR//3gO9dj5fCvT3Y+HMIbz72VGWpmVJ0hFdlqsVCd4GFgHbkdI0HmcrLaRo7xeAMSrLFeaAYAL7D/VkWK3HEOj7GLqz+dcn8uH64+w+eolTuVYS+0shUNH1uJp0agp7em5crqhVuOszHNWVBCdNIKDPYF+HIzqJiNAAbp46mJWbTrIsPYtHvyqFQEXX4+qQ6UtAricDEQZ7VQVW55yb7lJHTLhPTSHQjXvOcUkKgYouyNWWzuPAX5RSPwVOAfa6K7XWMmvNTYr2pWEvLSSw31CCBo32dTiik+kbHcKscQPYsCeHFZtOcP8iKQQquhZXWzoWYCzwBXACI/GcArKdn4UbGIU9jZHpkdMXy7BY0aQlzsmin2ecprhUCoGKrsXVpPMy8B9gGsZrpWs+xjo/CzcoOZpBdcFFLL3iCFVTfB2O6KSGDIhkwvDelFfaWL0129fhCNEmrj5e6wU839Rb4IR7GIU9nUU1p9Yv7ClEQ3fOGcaeY5dZuekki2cnEeAvfy+ia3C1pfM+cLcnA+npyk8fpPLCCcwhEYRdl+rrcEQnd92wWJLiIykormD9zrO+DkcIl7na0ikGnlFK3QNkAVV1V2qtv+zuwHqa2tcXTF6A2b/R/Fsh6jGZTNyZOoxf/3MnH6VnMXfqYPzM0gcoOj9Xk04E8G9PBtKTVVzMpuzkXkz+gV4rlim6vuuv60ff6BBy80r41vOfY/ar/+BiVEI0j3x1ogxIEZ2KS0lHa/0NTwfSk1mdhT3Dx9+IX3C4j6MRXYWfn5m75yp+//4e8qyNC4Vcyi8lNTme5BGee/WwEG3lau21Fqs9aq1XuyecnqfKeoniQ5vBZCZy6m2+Dkd0MTdNGUTyiD6N3ir6xY4zvL/2GMvSsiTpiE7F1cdrDV9zUKMcyAEk6bTTtcKeKfhH9vF1OKIL6hUR1GjZ4tlD+XjjSfZn5XH87FWGDezlg8iEaMyl0Wtaa3PdD8AfGAFsAZ73ZIDdma20qLawZ6SLhT2FcEVYsD+3Tk8AYFlalm+DEaKOdr1UXmtt01ofAx4FnnNvSD1H4e41OKoqCB4ynsC+Cb4OR3Qzt88agsXPxNb9uZzPK/F1OEIA7Uw6dUQAse4IpKexV1Vg3bEKkMKewjNio4KZPTEeuwOWb5DWjugcXB1I8OsmFkdiTBiV1x20Q/GBDdhLCwmISyJo8BhfhyO6qSWpQ1m34yxfbD/DV28ZQWSYzAETvuVqS2dyg49JwGDgD8D9ngmt+3LYbRQ4h0lHTV8k8yiExwyKi2DKqDgqq+18sllq8wrfc3WezhxPB9KTlBzbTvXVC1ii+hI6YpqvwxHd3JI5Q9l++AKrtpzkzjlDCQp0ddCqEO7X7F+fUirF1YNorTe6J5zuz+FwYN3qLHkjhT2FF4xKjGbE4F4cPX2VtdvPcNusIb4OSfRgLd3ypLeyr6PO13LldFH5mcNUnM/CHBJB+DhpQArPM5lMLJkzjF/8YzvLN2Qx//oE/Pw6OoZIiPZpKem0VI9lJvAXoC/wjDsD8rYq6yXOv/ssthJrh47jH92P/l97FnNgSIvb1Rb2nDRPCnsKr5k6Oo4BvUM5d7mEu3+6ulE/4ughMfzsf6ZilqKhwsOaTTpa60YD+5VSkcCLwLeANcANWuvTngvP8xxVldhKC3FUlnXoOJUXTlK45wuipt3e/DaXTlN2YjcmSwARybd26HxCtIXZbOKeW0fy0j93Ul5pa7R+55GL7DxykSmj43wQnehJXO5RVEp9GfgdYALu0Vq/77GovCggNp6Eh/+Oo7qq9Y2bUXbqABeX/hrr9pVETp6Hyc+/ye0KMoxXUYePvwm/kIh2n0+I9pg1fgBTRsdhs9nrLf9sWzZvfnKYpWnHJekIj2s16SilBgGvALcCbwA/1lp37FlUJ2Py8282UbgiRE3Bv/cgqi6fofjgJsLH3dBom+rCPIoPbZLCnsKnAv39oMFbRuddn8gH645z+FQ+R07lMzIx2kfRiZ6g2d5EpZRZKfUocAhjTk6K1vo73S3huIPJZCLKWTutIGMFDoe90TbW7Z+A3UboqOvxj5LCnqLzCA60MH9GIgDL0o/7OBrR3bXU0tkBjAeyMVo445RS45raUGv9F/eH1rWEjZ5Bfvq/qMrLoTRrN6HDJtWus5UVU7hnLUBtchKiM1k4M5GP0rPIPHSBsxeLGNhX3uskPKOlpBMDnMFoDf2whe0cGCPZejSTnz+RUxeS/8VbWLctr5d0Cnd/jqOynODEcQTGyRwJ0fn0Cg/ixsmD+GxbNss3nOChL4/3dUiim2pp9FqCF+PoFiLGz6Vg0weUnz1CeY4mKF5hr66k0FnYM3K6tHJE53XH7CTWZGSzfudZ7rl1BNFNvKdHiI6SGWJuZA4Mrh0KXVNbrfjABmwlBQT0TSQ44TpfhidEi/r3DmP62H5U2+ys3HTS1+GIbkqSjptFTJ4PfhZK9XYq83KwOodJR01fLIU9Rae3JHUoAJ9uPUVpefunEQjRHEk6bmYJ60X42FTAwcUPX6QqPxdLZB9CR073dWhCtEoNjmZMUgwl5dWsyejS875FJyVJxwMip90OmKi6kmt8P/U2Kewpuow75wwDYMXGE1RVNx7+L0RHSNLxgICYAYSoKQCYg8OanCwqRGeVPKIPg+PCuWItZ8PuHF+HI7oZSToeEp3yX1giexOdeg/mABkFJLoOk8nEHc6+nY82ZGG3O1rZQwjXSdLxkIA+gxn04KtETLzZ16EI0WYpE+KJiQzizIUidh296OtwRDciSUcI0Yi/xcyilCQAlqZl+Tga0Z1I0hFCNOmWaYMJDbJw6OQVjp7O93U4opuQpCOEaFJIkD/zrncWApXWjnATSTpCiGbdNmsIFj8zGQfPc+5ysa/DEd2AJB0hRLOiI4K4YdJAHA74KF1aO6LjJOkIIVp0R2oSJhOs33mWq4Xlvg5HdHGdJukopcYppbYppUqUUgeUUpN9HZMQAuL7hDN1dBxV1XZWbpZCoKJjOkXSUUoFACuA94Eo4AXgc6VUhE8DE0IA10rjrN6aLYVARYe09BI3b0oF/LXWv3N+/55S6kHgv4DXfRaVEAKAEQnRjEqM5vCpfD7ZfIq5Uwa5tF9EaAB+fu2/ty0urexw/beIsED8zK1XeK+qtlNcWtmhc3lbZFggZhd+ts6ksySdUcCRBsuOAmN9EIsQogl3zhnG4VOZvPPpEd75tOF/16YNjgvnd4+kYmlH4vlsWzZ//nBfm/draMiASF7+0ewWE09ZRTUP/r/1XLpa1uHzedPIhGhefHBml3ptSmdJOmFAaYNlpUCID2IRQjRh0si+TB/bjyPZrk0ULSmr4vSFIjbvPUdq8sA2nauq2s57azVgtJbaezdfUlbFyXNWMg6cZ8a4/s1utzbzNJeulhHg70dIUGe5LLasuLSSI9n57NaXSB7R19fhuKyz/HZLgOAGy0IAmRggRCdhNpt48r4pLm//eeZp/vifvSxNy2L2xPg23Y1v3JPDFWs5g+LC+eOjc9qddFZtOcWry/azNO0411/Xr8kYqm12lm88AcDjX0tm2ph+7TqXty1df5x/rDrMsrSsLpV0OsVAAuAwoBosG+FcLoToguYkx9MrPJDs84Xs0Zdd3s9ud7DMOSdoSerQDvVZ3Dh5IBGhARw/W8DBE1ea3Gbz3nNcvlrGgN5hTBkV1+5zedut0xMIDrSwPyuPY2eu+jocl3WWpJMGmJRSDyul/JVSdwPXAR/5OC4hRDv5W/y4bdYQAJamHXd5v11HL3LmQhExkUGkTIjvUAxBARYWzkhsNgaHw1Fb0HTJnI4lOG8LDfZn3vQEgNok3RV0iqSjta4E5gF3AvnAT4DFWrfh9kgI0enMuz6R4EA/9mflcfysa3fjNUlgUUoS/paOX6Lmz0gkwN+PXUcvkX2+sN66Pccuk32+kF7hgcxJ7liC84XbU4Zg8TOxbX8uuXldozeiUyQdAK31Qa31TK11uNZ6rNZ6va9jEkJ0TFiwP7dMSwBcKxp69HQ+h05eITTIwi3TBrslhsiwQG52DvFuWMpnmbP1c3tKEv6WrvdK+ZjIYFInDsTugOUbTvg6HJd0mqQjhOieFqUk4Wc2sXV/LufzSlrctiYxzbs+kZAgf/fFMDsJswk27M7hsnNYdNbZAvYdzyM40MKtzsdUXdEdqcZ7j9ZtP0NBUYWPo2mdJB0hhEfFRgUze2K88268+dbOucvFZBw8j8XPXNsX5C5xMaHMHDcAm93Bx5uMFkFNP8it0xMIC3ZfgvO2QXERTBkVR2W1nU+2dP4yRZJ0hBAetyR1KABf7DiLtbjpu/HlG07gcMANkwYSHRHk9hjumGPEsCYjm6yzBWzZdw6Ln4nb3ZzgfGGJ82dbveUU5RXVPo6mZZJ0hBAeN7hfBJNG9qWyysaqLacarb9aVM66HWcwma49LnK3ofFRjB/Wm7IKG8++kYHdAbMnxhMb1XCKYNczKjGaEYN7UVRaxdrtZ3wdTosk6QghvOJO5934J5tPcirXyukLhbUfH6w7TlW1namj44jvInqAggAADFBJREFUE+6xGGpaBAXO1tYdzhZYV2cymVjiLMq6fEMWp88X1vv9nr5QSEWVzaVjlZZXUenitu3RWSoSCCG6udFDYlCDeqHPXOUHv0lvcpuaataeMn54b4b0j+RkrpXJo/oyOK77FLKfOjqOAb1DOXe5hAdfSmu0fsiASH77o9ktzkW6WljOgy+lMXRgFM/eP90jcUrSEUJ4hclk4n9uH81flx+gsqpx5ehxw2IZkRDt8Ri+fcdY3v3sKPctGOXRc3mb2Wzi/sVjeXvVEaps9X+/l6+WcvKclR2HLzC1hTI/KzefpLCkkuAAz6UGSTpCCK8ZlRjD7x5O9WkMo4fE8Ivvz/BpDJ6SPKJvk3XYVmw8wRsrDrI0LavZpFNaXsXqrdkALPZQvxpIn44QQnR7N08dTFiwP0ey8zl8qukadJ9nnqGkrIrRQ2IYMdhzLU5JOkII0c0FB1qY76xB11RliGqbnRUbrtWg8yRJOkII0QMsnJmIv8VM5qELnL1YVG/dxj3nyLOWM7BvOJM8/JoESTpCCNED9AoP4sbJjWvQORyO2hp0HX2VhCsk6QghRA9xx+wkTCZI25XDFatRg27X0UucvlBEdEQQsyd6vtK2JB0hhOgh+vcOY/rYflTb7KzcZNRpW+bmV0m0RpKOEEL0IDV18D7dls2+Y5c5cCKPkCALt053z6skWiNJRwghehA1OJoxSTGUllfzy7e2AzBveoJbXyXREkk6QgjRw9SUGyopr/bIqyRaIklHCCF6mOQRfRgcZxRWnZMcT0yk9yptS9IRQogexmQy8cBd45kxrj/33DrCq+eW2mtCCNEDjUyMZmSiZwusNkVaOkIIIbxGko4QQgivkaQjhBDCayTpCCGE8BpJOkIIIbxGko4QQgiv6Q5Dpv0ALly44Os4hBCix6tzLfZran13SDr9AO655x5fxyGEEOKafsCJhgu7Q9LZAcwCzgM2H8cihBA9nR9GwtnR1EqTw+HwbjhCCCF6LBlIIIQQwmsk6QghhPAaSTpCCCG8RpKOEEIIr5GkI4QQwmsk6QghhPAaSTpCCCG8RpKOEEIIr+kOFQnaTSn1/9s782CryzKOf8gtUdQpN3JKEfWrZZIrtkzaMIy5TG60uIXb5IKjkViZo4BKKirpWIRo45pauadmWCHpVCo2oIZ8JzXNFpIJEVFwg/543is/Ducay+Vcf/c8n5k79/ze3/K+33vPOc/ved739zwDgAnATsBzwLG2mz5FWyck7QHcY3vTsr028ENgCJG1YZztC7pxiCuMpMHAhcC2wEvAxbav7CHaDgC+D/QjtI3tKdoAJG0EPAGcY/vaHqTrWOBK4I1K8zDgZmquT1Jf4MfAF4CFwETbZ3fF/65tPZ3yx7sL+BmwETAGmCRpg24d2CogqZek44FJwNqVXaMBAf2B3YGhkr7eDUNcKSR9FLgNOJ/4Xx0GXCBpH+qvrS9wK/Ad232ALwOXSdqFmmurMAHYorLdU3TtAlxqe/3Kz3X0DH13EanFNgP2JDQcThdoa1ujA+wNrGX7Mttv2b4F+Avw1e4d1ioxGjiJ+HKuMhQYY/tl288DlwAntHhsq8JWwE2277C9qHijDwKfpebabP8b2MT2ryR9APgw8DbwKjXXBiBpKLAB8GSlufa6CrsC05q011qfpIHA1sCpthfa/hvxfTmZLtDWzuG1jwNPN7TNBD7ZDWPpKibYPkfS3h0NJbTRF5hROa5WOm0/BDzUsS3pQ0SS1xuouTYA269K6g28QnwmLwJmU3NtkvoBI4HPAPeXttq/HwEkrUGE5Y+SNA54HbiaCLfVXd+uxE3CKElHE+G18cBP6AJt7Wx01ifeKFVeB3p3w1i6BNv/atK8fvld1VpbnZI2BO4GHgEeL809QdtCYD3ii+w+YEFpr6W28qV8IzDC9ixJHbt6yvtxE2AqcB1wCLADEZLqCGvXWV/HTd0UwuPZnrhpmF32r5K2djY6rwHrNrT1BuZ3w1hWJ6+V31WttdQpaTvigz0DOIIlmmqvzfYi4E1gqqSJwG5lV121nQ3Y9u0N7T3i/Wh7FrBXpWmapCuAfct2nfW9AcyzPapsT5d0NRFag1XU1s5zOjOICbEq27O061h7bL8MzGJprbXTKenzhHdzJzCkxJprr03SXpIeb2heB6i7tq8BQyTNlTSXCMGMJxbs1FkXAJI+IWl0Q/PahMdad30zgd5lsVUHa9JF78l29nQmA70kDSeWAB5KhDbu6NZRrR5uAEZKeoIIb4wALu/eIS0/kvoD9wBn2b6iYXettRET0VtI+hYx7oHAccDBxAe8ltpsb1/dljQNuKwsmZ5PTXVVmAucLukfxFzHzsCpwCnEgqQ663uACKVdKul0wsgcRyxSeo5V1Na2no7tNwlX+FBgDnAWcJDt2e95Yj05B3iK+DA8Riw/ntCtI1oxhgF9iGXS8ys/F1FzbbZfAfYj5gXmABOB421Poeba3oPa67L9T+BLxMqteYSG82zfSs312V5IhA63JpZN3088O3YbXaAtK4cmSZIkLaNtPZ0kSZKk9aTRSZIkSVpGGp0kSZKkZaTRSZIkSVpGGp0kSZKkZaTRSZIkSVpGOz8cmvQgJF3LkjQdzRhNZKaeDPSx3a1pSSRtAgy2fdNq7udyYJrta1bi3AeBqbZHLMexQ4D9bR+z4qNM2on0dJKewmlEBty+RBp2gD0qbZcAfyivX2tyfqsZSzwQutqQtBswiEhKuTIcQhjr/0t5KHLHaobzJGlGejpJj6A82f8KgKSNS/PskpixSuN2d9GrBX2MJMpdLFqZk23PWcFTrgBGscToJ8kypNFJ2oZyF/5ueE3SYqIK6ZlEfqmpwJHAGcBRRHqTM23fUM7vA1xKlOpdDPwOOK2TkhJIOhg4D9iGSCcy3vbFkkZRQoGSFtvuJWmtcuzRRBbfPxFFtFyOexB4mMg+vRfwV+B02w900nc/Is3TiZW254mS30cQVR9dXg8hcoYtJsqAj630OdX2iDLmd8u6E5mIfwEMt/1O6eKXwNWSBtie3mxcSZLhtaTduRD4JlGS92PAnwljsztwO3ClpI4aMBMJ47QP8cW/GPi1pGVu3iRtRpRC/0E55wxgjKRBRKjv50QS077llHOB/YnKtQMJgzCl1A/q4Azgj0RyyfuAeyRt24mu/YAZJUdYlTGE4fwUUeP+90Rl1s8B44ALJW3TyTUPIMqFf5rIwTUMOKhjZ8n6/ShL0vsnyTKk0UnanR/Znmx7GmEE5gPfKx7GOMLr6CdpayJd/+G2H7P9FOENbQV8scl1PwKsBbxo+4Uy5zEIeKosYlgAvFEKnK0LDAdOtD3F9kzbpxLhwqMq13zY9uiy/7tE5dvjO9G1G5GUsZFbbN9peyZwC5Ep+KSyPZYwpDt0cs0FwMkOrgKmE1Umq8xgSS2gJFmGDK8l7c4zldevA8/b7siCu7D8XgfYsrx2pQomRBErEQaryjTgp4Qn9BxwL3C97f80GUP/0sekEvLr4IMsXbvkIZbmUWDHTnRtBjzbpL1R7yzbCwBsvyPprTKWZrxQsrN3MI8wrFX+S9RYSZKmpNFJ2p23GrY7m3Rfsxy7M+ENVFlmwr0YriMlXQIcSIS7TpZ0TMccUcO1AQYDLzXsm1d5/XbDvg8QIbJmLKL5YoXl1duMN5u0NfaxxnuMKUkyvJYky8nTxF39erafsf0MsTjgYmC7xoMlDZA0zva0EhIbSMzjHFYOqRquZwiDsmnl2s8SK8H2qBy3S0M3uxMhrmbMAjZZEYFdxMa8f1YIJu9D0tNJkuXAtiXdDVwvaRhRWXEMsQBhZpNT5gAnSXoZuJGY49mTqHQKMXe0o6Qtbb8gaTxwuaQ3iJVpw4lJ+pGVax4o6RRgEjGX0x+4qpMhP048u9RqBhBhxSRpSno6SbL8DCWWVd9JVE3ckMgqMLfxQNsvEg9XHkxM6N9WzhtTDrkW2Bx4WtLmwLeBW4FrgCcIr2Zf29V5mZsJQzSdWD032PbfOxnrfcB25dotoay024ll57eS5F2ycmiS1IAVSUlTOede4Le2x622gS3d3wnAV2wPakV/ST1JTydJei7nAt+QtMbq7khSL+JB1PNXd19JvUmjkyQ9FNuPAL8BWpGEcwjwpO3JLegrqTEZXkuSJElaRno6SZIkSctIo5MkSZK0jDQ6SZIkSctIo5MkSZK0jDQ6SZIkScv4H0SNqxXTpQ57AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(0.3, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Opening the hood\n", - "\n", - "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", - "\n", - "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", - "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pandas\n", - "\n", - "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", - "\n", - "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", - "\n", - "The primary differences between `TimeSeries` and `Series` are:\n", - "\n", - "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", - "\n", - "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", - "\n", - "3. I provide a function called `set` that we'll use later.\n", - "\n", - "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pyplot\n", - "\n", - "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", - "\n", - "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function decorate in module modsim.modsim:\n", - "\n", - "decorate(**options)\n", - " Decorate the current axes.\n", - " \n", - " Call decorate with keyword arguments like\n", - " \n", - " decorate(title='Title',\n", - " xlabel='x',\n", - " ylabel='y')\n", - " \n", - " The keyword arguments can be any of the axis properties\n", - " \n", - " https://matplotlib.org/api/axes_api.html\n", - " \n", - " In addition, you can use `legend=False` to suppress the legend.\n", - " \n", - " And you can use `loc` to indicate the location of the legend\n", - " (the default value is 'best')\n", - "\n" - ] - } - ], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### NumPy\n", - "\n", - "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", - "\n", - "You can get the source code for `flip` by running the following cell." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def flip(p=0.5):\n", - " \"\"\"Flips a coin with the given probability.\n", - "\n", - " p: float 0-1\n", - "\n", - " returns: boolean (True or False)\n", - " \"\"\"\n", - " return np.random.random() < p\n", - "\n" - ] - } - ], - "source": [ - "source_code(flip)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap03soln.ipynb b/soln/chap03soln.ipynb deleted file mode 100644 index d0c36ba3..00000000 --- a/soln/chap03soln.ipynb +++ /dev/null @@ -1,1274 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 3\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More than one State object\n", - "\n", - "Here's the code from the previous chapter, with two changes:\n", - "\n", - "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", - "\n", - "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(state, p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " state: State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " results = TimeSeries() \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " results[i] = state.olin\n", - " \n", - " plot(results, label='Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can create more than one `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare1 = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin2
    wellesley10
    \n", - "
    " - ], - "text/plain": [ - "olin 2\n", - "wellesley 10\n", - "dtype: int64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare2 = State(olin=2, wellesley=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whenever we call a function, we indicate which `State` object to work with:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_olin(bikeshare1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley(bikeshare2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can confirm that the different objects are getting updated independently:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin11
    wellesley1
    \n", - "
    " - ], - "text/plain": [ - "olin 11\n", - "wellesley 1\n", - "dtype: int64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare1" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin1
    wellesley11
    \n", - "
    " - ], - "text/plain": [ - "olin 1\n", - "wellesley 11\n", - "dtype: int64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Negative bikes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", - "\n", - "If you run this simulation a few times, it happens often." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if you run the simulation again, it should behave." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparison operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", - "\n", - "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", - "\n", - "Remember that `=` creates a variable or gives an existing variable a new value." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whereas `==` compares two values and returns `True` if they are equal." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x == 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can use `==` in an `if` statement." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "yes, x is 5\n" - ] - } - ], - "source": [ - "if x == 5:\n", - " print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you use `=` in an `if` statement, you get an error." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# If you remove the # from the if statement and run it, you'll get\n", - "# SyntaxError: invalid syntax\n", - "\n", - "#if x = 5:\n", - "# print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", - "\n", - "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    olin_empty0
    wellesley_empty0
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "olin_empty 0\n", - "wellesley_empty 0\n", - "dtype: int64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now when we run a simulation, it keeps track of unhappy customers." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can print the number of unhappy customers at each location." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.olin_empty" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare.wellesley_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", - "\n", - "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", - "\n", - "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", - "\n", - "Test your code by running the simulation and check the value of `clock` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    olin_empty0
    wellesley_empty0
    clock0
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "olin_empty 0\n", - "wellesley_empty 0\n", - "clock 0\n", - "dtype: int64" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0,\n", - " clock=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " state.clock += 1\n", - " \n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin1
    wellesley11
    olin_empty5
    wellesley_empty0
    clock60
    \n", - "
    " - ], - "text/plain": [ - "olin 1\n", - "wellesley 11\n", - "olin_empty 5\n", - "wellesley_empty 0\n", - "clock 60\n", - "dtype: int64" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", - "\n", - "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", - "\n", - "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", - "\n", - "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    olin_empty0
    wellesley_empty0
    clock0
    t_first_empty-1
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "olin_empty 0\n", - "wellesley_empty 0\n", - "clock 0\n", - "t_first_empty -1\n", - "dtype: int64" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0,\n", - " clock=0, t_first_empty=-1)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " state.clock += 1\n", - " \n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - " if state.t_first_empty != -1:\n", - " return\n", - " \n", - " if state.olin_empty + state.wellesley_empty > 0:\n", - " state.t_first_empty = state.clock" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin0
    wellesley12
    olin_empty8
    wellesley_empty0
    clock60
    t_first_empty30
    \n", - "
    " - ], - "text/plain": [ - "olin 0\n", - "wellesley 12\n", - "olin_empty 8\n", - "wellesley_empty 0\n", - "clock 60\n", - "t_first_empty 30\n", - "dtype: int64" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bikeshare" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap04soln.ipynb b/soln/chap04soln.ipynb deleted file mode 100644 index cd178939..00000000 --- a/soln/chap04soln.ipynb +++ /dev/null @@ -1,1186 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 4\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Returning values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a simple function that returns a value:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def add_five(x):\n", - " return x + 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y = add_five(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you run a function on the last line of a cell, Jupyter displays the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", - "\n", - "In the following example, Jupyter shows the second result, but the first result just disappears." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "add_five(3)\n", - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8 10\n" - ] - } - ], - "source": [ - "y1 = add_five(3)\n", - "y2 = add_five(5)\n", - "\n", - "print(y1, y2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", - "\n", - "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def make_state():\n", - " state = State(olin=10, wellesley=2)\n", - " return state" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin10
    wellesley2
    \n", - "
    " - ], - "text/plain": [ - "olin 10\n", - "wellesley 2\n", - "dtype: int64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "init = make_state()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running simulations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the code from the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " state = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` doesn't plot anything:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    olin1
    wellesley11
    olin_empty2
    wellesley_empty2
    \n", - "
    " - ], - "text/plain": [ - "olin 1\n", - "wellesley 11\n", - "olin_empty 2\n", - "wellesley_empty 2\n", - "dtype: int64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = run_simulation(0.4, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But after the simulation, we can read the metrics from the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = run_simulation(0.2, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When `p1` is large, we probably do." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = run_simulation(0.6, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More for loops" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` creates a NumPy array of equally spaced numbers." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. , 0.25, 0.5 , 0.75, 1. ])" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p1_array = linspace(0, 1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an array in a `for` loop, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0\n", - "0.25\n", - "0.5\n", - "0.75\n", - "1.0\n" - ] - } - ], - "source": [ - "for p1 in p1_array:\n", - " print(p1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will come in handy in the next section.\n", - "\n", - "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function linspace in module modsim.modsim:\n", - "\n", - "linspace(start, stop, num=50, **options)\n", - " Returns an array of evenly-spaced values in the interval [start, stop].\n", - " \n", - " start: first value\n", - " stop: last value\n", - " num: number of values\n", - " \n", - " Also accepts the same keyword arguments as np.linspace. See\n", - " https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html\n", - " \n", - " returns: array or Quantity\n", - "\n" - ] - } - ], - "source": [ - "help(linspace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** \n", - "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "linspace(1, 10, 10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Help on function linrange in module modsim.modsim:\n", - "\n", - "linrange(start=0, stop=None, step=1, endpoint=False, **options)\n", - " Returns an array of evenly-spaced values in an interval.\n", - " \n", - " By default, the last value in the array is `stop-step`\n", - " (at least approximately).\n", - " If you provide the keyword argument `endpoint=True`,\n", - " the last value in the array is `stop`.\n", - " \n", - " This function works best if the space between start and stop\n", - " is divisible by step; otherwise the results might be surprising.\n", - " \n", - " start: first value\n", - " stop: last value\n", - " step: space between values\n", - " \n", - " returns: NumPy array\n", - "\n" - ] - } - ], - "source": [ - "help(linrange)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 1, 3, 5, 7, 9, 11])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "linrange(1, 11, 2, endpoint=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sweeping parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`p1_array` contains a range of values for `p1`." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p2 = 0.2\n", - "num_steps = 60\n", - "p1_array = linspace(0, 1, 11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 0\n", - "0.1 0\n", - "0.2 0\n", - "0.30000000000000004 4\n", - "0.4 0\n", - "0.5 14\n", - "0.6000000000000001 5\n", - "0.7000000000000001 23\n", - "0.8 31\n", - "0.9 32\n", - "1.0 39\n" - ] - } - ], - "source": [ - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " print(p1, state.olin_empty)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "\n", - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(sweep, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", - "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_p1(p1_array):\n", - " p2 = 0.2\n", - " num_steps = 60\n", - " sweep = SweepSeries()\n", - " \n", - " for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p1_array = linspace(0, 1, 101)\n", - "sweep = sweep_p1(p1_array)\n", - "plot(sweep, 'bo', label='Olin')\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_p2(p2_array):\n", - " p1 = 0.5\n", - " num_steps = 60\n", - " sweep = SweepSeries()\n", - " \n", - " for p2 in p2_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p2] = state.olin_empty\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p2_array = linspace(0, 1, 101)\n", - "sweep = sweep_p2(p2_array)\n", - "plot(sweep, 'bo', label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Wellesley (p2 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional Exercises\n", - "\n", - "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", - "\n", - "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", - "\n", - "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", - "`num_runs` specifies how many times it should call `run_simulation`.\n", - "\n", - "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", - "\n", - "Test your function with parameters\n", - "\n", - "```\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "```\n", - "\n", - "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_multiple_simulations(p1, p2, num_steps, num_runs):\n", - " results = TimeSeries()\n", - " \n", - " for i in range(num_runs):\n", - " state = run_simulation(p1, p2, num_steps)\n", - " results[i] = state.olin_empty + state.wellesley_empty\n", - " \n", - " return results" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    00
    10
    20
    30
    44
    52
    60
    74
    84
    90
    \n", - "
    " - ], - "text/plain": [ - "0 0\n", - "1 0\n", - "2 0\n", - "3 0\n", - "4 4\n", - "5 2\n", - "6 0\n", - "7 4\n", - "8 4\n", - "9 0\n", - "dtype: int64" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "run_multiple_simulations(p1, p2, num_steps, num_runs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", - "\n", - "```\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "```\n", - "\n", - "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", - "\n", - "What value of `p1` minimizes the average number of unhappy customers?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "p1_array = linspace(0, 1, 20)\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "\n", - "sweep = SweepSeries()\n", - "for p1 in p1_array:\n", - " results = run_multiple_simulations(p1, p2, num_steps, num_runs)\n", - " sweep[p1] = results.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(sweep, label='total', color='green')\n", - " \n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Average total unhappy customers')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap05soln.ipynb b/soln/chap05soln.ipynb deleted file mode 100644 index 2de345b2..00000000 --- a/soln/chap05soln.ipynb +++ /dev/null @@ -1,1732 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 5\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reading data\n", - "\n", - "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates\n", - "\n", - "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", - "\n", - "`head` selects the header and the first five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    United States Census Bureau (2017)[28]Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2007)[24]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
    19512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
    19522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
    19532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
    19542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " United States Census Bureau (2017)[28] \\\n", - "Year \n", - "1950 2557628654 \n", - "1951 2594939877 \n", - "1952 2636772306 \n", - "1953 2682053389 \n", - "1954 2730228104 \n", - "\n", - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "1950 2.516000e+09 \n", - "1951 NaN \n", - "1952 NaN \n", - "1953 NaN \n", - "1954 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "1950 2.525149e+09 \n", - "1951 2.572851e+09 \n", - "1952 2.619292e+09 \n", - "1953 2.665865e+09 \n", - "1954 2.713172e+09 \n", - "\n", - " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n", - "Year \n", - "1950 2.544000e+09 2.527960e+09 2.400000e+09 \n", - "1951 2.571663e+09 NaN NaN \n", - "1952 2.617949e+09 NaN NaN \n", - "1953 2.665959e+09 NaN NaN \n", - "1954 2.716927e+09 NaN NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "1950 2.527000e+09 2.500000e+09 2.400000e+09 \n", - "1951 NaN NaN NaN \n", - "1952 NaN NaN NaN \n", - "1953 NaN NaN NaN \n", - "1954 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "1950 NaN 2.486000e+09 \n", - "1951 NaN NaN \n", - "1952 NaN NaN \n", - "1953 NaN NaN \n", - "1954 NaN NaN " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2 = tables[2]\n", - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`tail` selects the last five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    United States Census Bureau (2017)[28]Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2007)[24]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    201270138713137.057075e+097.080072e+09NaNNaNNaNNaNNaNNaNNaNNaN
    201370921280947.136796e+097.162119e+09NaNNaNNaNNaNNaNNaNNaNNaN
    201471699681857.238184e+097.243784e+09NaNNaNNaNNaNNaNNaNNaNNaN
    201572478927887.336435e+097.349472e+09NaNNaNNaNNaNNaNNaNNaNNaN
    201673259967097.418152e+09NaNNaNNaNNaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " United States Census Bureau (2017)[28] \\\n", - "Year \n", - "2012 7013871313 \n", - "2013 7092128094 \n", - "2014 7169968185 \n", - "2015 7247892788 \n", - "2016 7325996709 \n", - "\n", - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "2012 7.057075e+09 \n", - "2013 7.136796e+09 \n", - "2014 7.238184e+09 \n", - "2015 7.336435e+09 \n", - "2016 7.418152e+09 \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "2012 7.080072e+09 \n", - "2013 7.162119e+09 \n", - "2014 7.243784e+09 \n", - "2015 7.349472e+09 \n", - "2016 NaN \n", - "\n", - " Maddison (2008)[17] HYDE (2007)[24] Tanton (1994)[18] \\\n", - "Year \n", - "2012 NaN NaN NaN \n", - "2013 NaN NaN NaN \n", - "2014 NaN NaN NaN \n", - "2015 NaN NaN NaN \n", - "2016 NaN NaN NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "2012 NaN NaN NaN \n", - "2013 NaN NaN NaN \n", - "2014 NaN NaN NaN \n", - "2015 NaN NaN NaN \n", - "2016 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "2012 NaN NaN \n", - "2013 NaN NaN \n", - "2014 NaN NaN \n", - "2015 NaN NaN \n", - "2016 NaN NaN " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Long column names are awkard to work with, but we can replace them with abbreviated names." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the DataFrame looks like now. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    censusprbunmaddisonhydetantonbirabenmjthomlinsondurandclark
    Year
    195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
    19512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
    19522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
    19532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
    19542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " census prb un maddison hyde \\\n", - "Year \n", - "1950 2557628654 2.516000e+09 2.525149e+09 2.544000e+09 2.527960e+09 \n", - "1951 2594939877 NaN 2.572851e+09 2.571663e+09 NaN \n", - "1952 2636772306 NaN 2.619292e+09 2.617949e+09 NaN \n", - "1953 2682053389 NaN 2.665865e+09 2.665959e+09 NaN \n", - "1954 2730228104 NaN 2.713172e+09 2.716927e+09 NaN \n", - "\n", - " tanton biraben mj thomlinson durand \\\n", - "Year \n", - "1950 2.400000e+09 2.527000e+09 2.500000e+09 2.400000e+09 NaN \n", - "1951 NaN NaN NaN NaN NaN \n", - "1952 NaN NaN NaN NaN NaN \n", - "1953 NaN NaN NaN NaN NaN \n", - "1954 NaN NaN NaN NaN NaN \n", - "\n", - " clark \n", - "Year \n", - "1950 2.486000e+09 \n", - "1951 NaN \n", - "1952 NaN \n", - "1953 NaN \n", - "1954 NaN " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", - "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", - "\n", - "`NaN` is a special value that indicates missing data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Series\n", - "\n", - "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2557628654\n", - "1951 2594939877\n", - "1952 2636772306\n", - "1953 2682053389\n", - "1954 2730228104\n", - "Name: census, dtype: int64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census = table2.census\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "2012 7013871313\n", - "2013 7092128094\n", - "2014 7169968185\n", - "2015 7247892788\n", - "2016 7325996709\n", - "Name: census, dtype: int64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", - "\n", - "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From here on, we will work in units of billions." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.525149\n", - "1951 2.572851\n", - "1952 2.619292\n", - "1953 2.665865\n", - "1954 2.713172\n", - "Name: un, dtype: float64" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.557629\n", - "1951 2.594940\n", - "1952 2.636772\n", - "1953 2.682053\n", - "1954 2.730228\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what these estimates look like." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap05-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3hU1dbA4d/U9IQ0CFX6pmPoqHRBkGbDBiKKigrqVZFrRb1X7xUsnw07Ina4iKKIioBSVKo0KRuRXkJJAgmQNuX74wwxhBAmkMmZJOt9njzMnLo2k2Tl7LPPXhav14sQQggRbKxmByCEEEIURRKUEEKIoCQJSgghRFCSBCWEECIo2c0OwB9KqRCgPbAfcJscjhBCiNJjA6oDK7TWOQVXlIsEhZGcFpsdhBBCiIDpAiwpuKC8JKj9AJ988glJSUlmxyKEEKKUpKSkMHToUPD9ni+ovCQoN0BSUhK1atUyOxYhhBCl77TbNzJIQgghRFCSBCWEECIoSYISQggRlCRBCSGECEqSoIQQQgQlSVBCCCGCkiQoIYQQxTKrLJMkKCGEEGfkykhl39RHyd775ynL3W5PwBOXJCghhBBFyjmwg70fPEzO3i2kzZ+an5Dcbg//nLSEuct2BfT8kqCEEEIU6ehvX+HOTCO0dlOqDfknFosFAJvNSov68cxesg2PJ3BXUZKgyphSik2bNp22fPDgwcycOTP//TfffMPgwYNJTk6mffv23H777WzYsKHYYy9evJgRI0bQsWNHOnTowE033cTy5ctLvQ1CiMoh4fI7qXLJNSTdOJ7N+3P5a8+R/HU3XNaECWMuwWq1BOz8kqCC0PLly3nmmWcYP348q1atYvHixbRp04abb76ZtLS0IveZMWMG48aNY9iwYSxevJglS5YwaNAg7rjjDlauXFnGLRBClEdeVx5HV8zB48oFwOoMJa7bDSzbdJiHJy3h5c9Xk+fyABDisBEe6ghoPJKggtDatWupW7cubdu2xWq1Ehoayl133UX//v2LTFBZWVk899xz/Pvf/+bSSy/F6XTidDoZMmQIo0aNYvv27QC43W7eeustevXqRceOHbnvvvvyj7ds2TL69+/PxIkT6dixI127duW1117LP8cXX3zBpZdeSvv27bn66qtZtGhR/n7t2rU7JZ6ePXsyb968YvcTQgSXnJTt7J0yjtS5kzk0e9Ip65JVVWpVjaRji7KtJlFhE9TAB2cx8MFZpyz71+SlDHxwFss3pOQv+/63HQx8cBav/29N/rLUo1kMfHAWNz/9/Sn7/+P/fmbgg7PYuvsIgdS9e3e2bNnC8OHD+fDDD9mwYQNut5unn36ahg0bnrb96tWryc3NpVu3bqetu+uuuxgyZAgAH374IV9//TVTpkxh4cKFxMXFcf/99+dvu3XrVhwOB0uWLOE///kPkyZN4q+//iItLY0nnniCN998kxUrVnD99dfzzDPPnHUEz7nuJ4QoO163i/TF09k75Z/kHtyFPTYJa5OefDhnIy63cbUU6rTz6oM9GNa3KQ572aWNCpugyrNGjRrx1Vdf0aRJE6ZNm8ZVV13FxRdfzJtvvlnkL/e0tDRiYmJwOIq/3J4+fTpjxoyhTp06hIaG8tBDD7FixQp27NgBgMVi4e6778bhcHDJJZeQmJjIzp07cTqd2O12ZsyYwfr167nqqqv44Ycf8m+Ynsm57ieEKBu5h3ax94NHSV80DTxuotv1o+bIF/jPd+n8b/6fzFr4V/62ZZmYTiov9aBK7JsXB5+2bPzITqct69u5Ln071z1lWXxMWJH7v3x/9/OOy+l04nK5TlvudrsJCQnJf3/BBRfw6KOPAkYCmjt3LhMmTCA2Npbrr7/+lH0TExM5cuQIeXl5pyWpzMxMQkJCcDqd7Nu3j8cee4zx48fnr7fb7ezduxe73U5kZOQpMTgcDjweD5GRkUydOpW3336b4cOHExoays0338yoUaOKbWtx+0mSEsJceekp7Jn8ELhd2GMSSRwwmrC6LQG46fJmfPnzVi5uXcPUGCtsggpWSUlJ7Nu3j5YtW+Yvc7lc7Nu3L79a8I033kifPn0YMWIEAHFxcVx//fWsX78erfVpx0xOTiY0NJSFCxdy6aWXnrLu+eefZ+fOnUydOpWqVasyfvx4unTpkr9+y5Yt1K1bl9WrV58x5qNHj+bfv8rLy+OXX37hnnvuoV27dthsNvLy8vK39Xq9HD169Kz7Fb5vJYQoW47YJCKbXgR2J8vDumLZE0b/usa6NqoqyY0TTf9DUrr4ylj//v15/fXX+esv49L5yJEjTJw4kcTERFq1agVAv379eOutt5g3bx65ubnk5uaybNkyFi5cSK9evU47ptPpZOzYsYwfP5758+fjcrk4ceIEU6ZM4auvvmL06NEAXHHFFUyaNIn9+/fjdrt55513GDp0KNnZ2cXGnJaWxsiRI1m+fDkOh4Nq1aphsViIiYmhTp065ObmMmfOHNxuN1OnTuX48eNn3U8IUba8Xg9HV8whZ/+2/GWJA8dwoMkQ3v52K+/P3kh65t+/C8xOTiBXUGVu9OjR2Gw2Ro0aRWpqKiEhIXTq1IkPPvggv3vupptuIjQ0lDfeeINx48bh9Xpp0KAB48eP55JLLinyuNdddx1RUVG8/fbbPPLII3i9Xpo1a8bkyZNp3749AHfccQcul4uhQ4dy5MgRGjduzOTJk4mOji425nr16vH000/zxBNPcPDgQWJjY3n88cdp1KgRAI8//jjPP/88Tz75JIMHD6ZNmzZ+7SeEKBt5Rw5yaPYksnf+gSOxNjVHvoDVZsditdGyQQKDuzagZYN4YqNCzQ71FJayGlGllBoKvF1ocRgwX2vd5yz71gW2z58/n1q1agUoQiGEqFi8Xi+Za+aTOm8K3txsrOHR5LQbyru/Oxl3UzuqxoWbHSJ79uw52TNUT2u9o+C6Muvi01p/orWOPPkFdAHSgIfKKgYhhKgsXBmppEx7lsNz3sSbm01Ek07UvuNlZu2ogt6VzrR5W8wO8axM6eJTSjmAT4CntNZrzYhBCCEqKq/bxb4PH8d19CDW0Ehi+4wkukUXLBYLt1/RghqJEQzp1djsMM/KrEESo4Es4A2Tzi+EEBWWxWYntssQnPWS+a7qrbyy3Jm/LjYqlGF9mxLisJkYoX/KPEEppZwY3XpPaa1lSgEhhCgFxzb/RsbqefnvI1v1IKz/gyzcfIw1Ww6x5+AxE6M7N2Z08fUFPMC3JpxbCCEqFPeJTA7PfY/jG5ZgsTtxVWtCbPWaWCwW4mPCeHBoW6onRFCrapTZoZaYGV18g4HpWmuPCecWQogK4/iWFex55x9GcnKEcLDhQO58fQ2/rNuXv037ZknlMjmBOQmqE/CLCecVQogKwZ19nIPfvMaB/z2H+/gRQms3pdbtL5FWvTNZOW7WbDlkdoilwowuvrrAvrNtJIQQomiHZk/ihF6Gxe7A0vZqqve8CovVxmWdvFRPiKB1o0SzQywVZZ6gtNYRZX1OIYSoSOJ6DCXnWCZv7mvFviVRvHGxh8gwG1arhQsbVzU7vFIjc/GVMX9Kvr/22mu0atWKrVu3nrJNUcUBT5o5cyZNmzYlOTmZ5ORkWrduTb9+/Zg8efIpJTp69uxJq1at8rc7+XXZZZflb7Nz505Gjx5N+/btSU5OZsCAAXz88cdFnvfyyy+na9eup0wYK4QoXSe2reXQnLfzf5ad8TWpPfxfuCOrERnuIPVolskRBobMxRekcnJyGDt2LNOnT8fpdJ59B6Bx48bMmmUUafR6vaxevZqxY8eSkZFxSmHCl1566bRZz0/yeDzcfvvtDBgwgBdeeIHQ0FDWrFnD6NGjcTqdXHvttfnbnpwENjExkblz59K/f//zaLEQojBPThap8z8kc/VcAJYfiafrFYOICnditVp4+Ob2xESGYLdVzGuNitmqCqBz586cOHGCl19++Zz2t1gstGnThmeeeYbJkyeTkZHh137p6ens3LmTAQMGEBYWhsViITk5mXHjxp227bRp0+jduzfXXHMNH3300TnFKYQoWtaO9ex5934jOVntrIvuyjurbHz6w+b8beJjwipscoIKfAW17dmrz7guod8ootsY89Nm/D6Xw98VnsP2b/Uf+yL/9Z7JD5Gbsu2M60tTeHg4EydOZNiwYXTr1o2OHTue03E6d+6M1Wpl9erVRZaELyw+Pp4OHTpwyy23MGjQoPxuviuuuOKU7dLS0pg/fz7fffcdUVFRTJw4kfXr159S50oIUXKe3CzSFnxMxqrvAXAm1afqwDHYPLEs/WIdvdrXMTnCsuNXglJK2YC2QDugKuAGUoAVWus1gQuvcrvwwgsZNWoUDz/8cH7XXUmdrL907NjfT5GPHTsWu/3Uj37EiBGMGTMGgMmTJzN9+nR+/PFHPvzwQ1wuF926dWP8+PH5RRW//PJLOnfuTPXq1QEYNGgQH3/8MRMmTDinOIUQhqMrviNj1fd4LTZ2V+9Bt+G3Y7HZuQB4bnTR5XYqqmITlFIqFrgXuAuIB7YBqYANSAAuUErtB94CJmmtjwQ2XP/5e2UT3aZP/tXU2dQa+fz5hAT4X/L9pLvvvpslS5bw9NNPn3L/x19ut5uMjIz8RALwwgsvnPEe1MkYhw0bxrBhw8jNzWXVqlW8/PLL3HfffUybNg2v18v06dM5ePAgF198MWDcM8vJyWHcuHHEx8eXOE4hKjOv15tfILBKx4Fk7PmLCb8nsjs1llr7j9GwVhWTIzTHGROUUmo48C9gPjASmKe1zim0TTRG2YyhwB9Kqce01lMDGG+550/J94JsNhvPP/88gwcPJjy85LVbli9fjtfrpXFj/2YunjZtGp9//jlffvklYCSrzp0743A4uO222wBYunQpR44c4fvvv8dq/bv/e9SoUXz++ef5FXyFEGeXtWM9aQs/I+naR7GFRWKxO7jguofokbCFyDAH9WtU3grUxd1daw+011qP1Fp/Wzg5AWitM3zrbjy5faACrSj8KfleWJ06dXj00UeZPn263+fxeDwsX76cJ554glGjRhEZGenXft26dWPXrl1MmDCB1NRUvF4vu3fvZsqUKfnl5qdNm0bfvn2pVq0aiYmJ+V9XXnkln3/+uQw5F8IPnpwTHJrzNvs/eYqcPZpv3n6LzTvT8tcP6dWYfhfVw2o1v/S6Wc54BaW1vqckB9Ja7wfGnHdEFZw/Jd+LMmTIEBYuXMjSpUvPuM2WLVtITk4GwG63U7NmTW677Tauv/76U7Z74IEHsNlOn2r/+++/JykpiU8//ZTXXnuNAQMGkJWVRWxsLH379uXee+8lNTWVefPm8cEHH5y2/4ABA5gwYQI//PADAwYM8PN/RIjK58S2NRz69k3cGYfBamdntW5M2VAd9fUGJt7TxezwgobfJd+VUlWBVoADOCWla63nlH5op5y7LlLyXQhRzrmzj5M27wMy1y4AIKR6AxIHjMEbW5MPZm/g2l6NiY0ONTnKslVcyXd/R/GNxCguWNSf+F6MQRNCCCGKkbv/LzLXLsBjsbPM0ZFrb7onv+dk1JVFd/FXZv4+B/UQ8C7wiNY6M4DxCCFEheLJy8HqMEbohtVrRXT3Ybzwcx4bUkKov/kwnVtWP8sRKi9/E1Rt4BVJTkII4R+v18vxTb+SOvd94q94gLDaTbHZrCRcfCU3VU8lK8dFu6bVzA4zqPmboOYCvYA/AxiLEEJUCK7MdA7/8C4n9DIA5n36Ge5ON3N1z0YANK8vzwr6w98EtRZ4SSk1CNgC5BZcqbU+faI2IYSoZLxeL5lrF5A2fyqe7ONYnGEcb34l78+3UXf1Hq7o3hBbJR42XlL+JqhuwDIgDGhdaJ1/wwCFEKICc2Wkcmj262RtXwdAWINkEvuNwh6TyLiae+nQLEmSUwn5laC01j0CHYgQQpRnFpudnJTt5FjD+OJ4e0ZeOhJ7jPGA/CWta5ocXfnk92zmSqlqGA/iNseYgWIT8K7WeluxOwohRAWVe2g3jrgkLDYHtogYql0zjvd+OszqjUfZtjeD6gn+zeAiiubvc1AdgB+B3cCvGA/qDgDuUUp111qvDFyIQggRXLyuPNJ/mcGRX7/E0e4KQttdSWJsGGF1mjH86hyu6e+iekKE2WGWe/5eQb0IfAbcpbXOv+eklHodeB6QLkAhRKWQvXszh759g7zUvQAsWLKJbdvr8dTtnYzyNpEhxESeXplAlJy/CaodcFvB5OTzGrCqdEMSQojg48k5QdpPn5Cx6gfAiyOuBiE9RvL9x/toE+Yg1+UhxCGT6pQmfxPUfqAuoAstrw/Iw7tCiArNdfQQe6c+ijszDa/FSpXOVxHb5RqsdieTxjUhrpLNn1dW/E1QHwHvKKX+AZycTrsz8H++dUIIUWHZohNwxNVg73EHU9M7cGNMV7rZnQCSnALI3wT1LFADmI4xgs8C5GF08T0WmNCEEMIcXq+HzDXzCavbEkdsEhaLhWpXjWX92sM4lmyXARBlxN/noHKB25VSYwEFZAFbtdZZgQxOCCHKWu7hPRye8xbZuzeRFdeIjIvvpXOrGtjCo+jdMZJeHS7Abiuu1qsoLcWVfL8c+FFrned7XVhtpRQQ+HpQQggRaF5XHkd++5L0X74AtwtPSBTTdiWx/cBaWjVKJCLMgdVqwYrMBlFWiruCmg0kAQd9r89E6kEJIcq17N2bOTTnTfIO7wEgqnUvqvQYRsj0TYxoUZ3wUL/nNBClqLiS79aiXgshREXiPn6U/Z8+jdeVy1FbLBdcOYY4dSEAj93S0eToKjdJPEKISsfr9eL1Go912iJiqHLJNfwe0oF/Hbqcr/8sqnC4MENx96AO4edM5VrrqqUWkRBCBJAr4zCHv3+XiGYXE96sCzarhdiLr6ZDgwwyV+zm+t7K7BCFT3Edqw8hpTSEEBWE1+MmY+V3pC38DG9uNge3b2XJpijuHpIMQJ2kaG4Z2NzkKEVBxd2D+qAM4xBCiIDJSdnG4TlvkbP/L2NB3ba8uK4+WUf3ckPfpsRGycO2wai4Lr7p/h5Ea31t6YQjhBClx5OXQ/qizzm6bDZ4Pdii4knoezsRjdtzS5PdNK0XL8kpiBXXxXe8tE+mlKoOvIkx+3k28I7W+onSPo8QQgBgsXBiy0q8Xi9LcprSYcjdRDSuAUD3trVNDk6cTXFdfLcE4HyzMGY/rwZUBxYqpTZprT8NwLmEEJWQ69gRLDY7trBIrHYniYPuYc6vO5ixNIvQnZk0bWx2hMJfxXXxTQSe1lof970+E6/W+p9nO5FSqiPG7OcXa63zgO1Kqe4Y0yYJIcR5OTl/XtqCj3A27Ij3opupmRhJaM3G9L+iAartEZrXjzc7TFECxXXxtQccBV6fib8j/doC64GnlFIjMLr43tBav+jn/kIIUaSC8+cBrF/3J9/q33jxgV447FZCHDZJTuVQcV18PYp6fR7igC7AQowrqSbA90qp/dLFJ4Q4F15XHkd+/ZL0X43582wRMUT3vIUvvsmmSlgomSdypRxGOeb3BFNKqQjgeqA5kAtsAKb5Zjr3Rw6QobV+yvd+rVLqPeAqQBKUEKJEPLlZ7J3ycP78eRGte5HQazi2sEierZ1FfEwoVqtM7Fqe+TXVkVKqJbALeAYjQbUFXgC0UqqJn+faDIQrpZwFlskMjEKIc2J1hhFSoxGZ9jhezbiMRWGXYguLBCAxNkySUwXg71x87wJfAXW01pdprXtjlID/FXjbz2P8CBwCXlRKOX1JbyTwWclCFkJUVsc3LyV7j85/n9DnVjwDnyI9vA61qkaZGJkIBH+vYFoDw32j7wDQWmcppf4NrPbnAFrrbKVUN4wqvPsxBklM1Fp/UcKYhRCVjCszjcM/vMcJvQxPdBI7OzxIr471sYaEk9wsnHceTSLEIVV/Khp/E9TvGAMcthRa3g7Y6O/JtNbbgP7+bi+EqNzyh47P/xBPzglwhDIzpQ7LZ/5BswbV8kuvS3KqmIp7DuruAm+XA68rpdoBSwE30Aq4C5gQ0AiFEJVSXtp+Ds15k+ydGwAIb9iWhH53EDJnN4OiQ4iPkdF5Fd3ZZjMvKAXo6/s66TBwK8bgCSGEKBVet4t9nzyFO+MwObZwonqMoFqHnlgsFu69Lh6LRQZAVAbFPQdVrywDEUKIkyw2O3Hdb2TNTwuYtKsZzf6IYHxHIylJcqo8zjiKTyl1c0kOpJSyKKVuPf+QhBCVjdftIn3JDI4snZW/LKplN1re8igtm9dl5KAWJkYnzFJcF1+yUupB4C3gS631/qI2UkpVBW4E7gDmlX6IQoiKLPfgTg5+8zq5KdvwWu18tjWWO4d2wWKxUCUqhMdu6Wh2iMIkxXXx/cM3KGI88LJSaiPG7BGHAQuQiDH8vDHwHTBCa7088CELISoCr8dtTFO0+H/gcWGNTuDdQ+1Ytzqdtm0O0KFZktkhCpMVO8xca70SGKSUqgf0wxhW3hDwYAyaeBWYo7XeFehAhRAVR+7BXb6rJqPCbVRyH+J7Daf3hlQuOpFLuybVTI5QBAO/noPSWm8H3ghwLEKISiJ13hRyU/7iuC2arHY3Uf/SngB0b1PL5MhEMPF3qiMhhDgvXu/flXkS+o3iSK1LePpQf95e5sbt9pgYmQhWMlmrECKgvF4PGSvmkLVzA1Wvfgir1YojNonk4f9g0HebuKxTXWw2+VtZnE6+K4QQAZN39CD7P3mK1B+ncGLLcl544WOOnTAq9FgsFoZf3oxqceEmRymClSQoIUSp83q9ZK77iT3vPED2zg1Yw2P4IXwAiw/E8MPSnWaHJ8qJkhQsTMaoA+XAGGaeT2stAyiEEAC4T2RwaM5bnNDLAAhXHUnsN4rBJ2zU3XqYvp0uMDlCUV74laCUUo8B/wbSgMxCq73ICD8hhE/G6h85oZeRZ3GyqVo/Bl99ExaLhRoRUCMx0uzwRDni7xXUbcATWutnAxmMEKL8q9JpMOkpKUxYHsuxY9F0zcwhLlpmHhcl52+CigemBzIQIUT5lJOyjdT5HxI/6B+ERFXBYrNT/+rRjKi/h8Z1YiU5iXPm7yCJGcDQQAYihChfvF4PR5bOYu+UR8jesZ4vX32ZDdtS89d3Ta5FUnyEiRGK8s7fK6gs4BGl1BDgTyC34Eqt9bWlHZgQIni5MlI5+M1rZO9YD8C+hI5M39KAHUu20bx+vMnRiYrC3wQVDnwayECEEOXDcb2cQ99OwpN1DFtEDIkDRlO7bjK3Lt1B3851zQ5PVCD+zsV3S6ADEUIEv9zDezgwYyLgZaftAjqNeIywKsYV04BL6psbnKhwSvIcVEtgHNAc497VZuBVrfWvAYpNCBFknAm1iOx0BV8vO8DXhxowbmc2l1QxOypRUfn7HFQ/4GvgR4wBExbgImChUqq/1npu4EIUQpjF6/WSuWY+9rjqhNRuhs1qoWqvYXRtlE6rzBw6NJeaTSJw/L2CehZ4Rmv9dMGFSqnHMR7glQQlRAXjyc3i8HfvcOyPRRy3RrE5+QGG9G0FQOM6sSZHJyoDf4eZNwU+KWL550DL0gtHCBEMcg7sYO/74zj2xyK8NiczM1rx9W/7yMpxmR2aqET8vYLaBSQDWwstbwscLNWIhBCmOdmllzp3Ml5XLo7EOlS76kEu+svNmCZVCQuRCj2i7Pj73TYJeEspVQtY6lvWGXgMmBiIwIQQZS917vtkrJwDgFV1pebgO7E6QuidYHJgolLyd5j5q0qpKOAR4OS36j7gSa3164EKTghRtsLrX0jaqnl8ntke54mLeNgRYnZIohLz+3rdN1Hss0qpqkCW1rrwrOZCiHIo9/AenAm1AAhv1JYad75OnV9TuK63MjkyUdmdMUEppe4G3tdaZ/teF16f/1rqQQlR/njycowuvbULWJw0lOEjBmO1WoiMi2fEAJmuSJivuCuoh4BpQLbv9ZlIPSghypm8tH0c+OJFcg/uwOW1sePP7fz8+x56tqttdmhC5DtjgtJa1yvqdWFKKcuZ1gkhgs/xzUs5OHsS3pwT2GOTOHLhCJocj6Zbck2zQxPiFP7OJLENaKe1Tiu0vAawBqgagNiEEKXI63aR+tPHZCz7BoCIJp1I7H83dUIjaGNybEIUpbh7UIOAS3xv6wL/UkqdKLRZw5KcTCl1K/A2kFNg8Wit9dSSHEcIUXLu40c5unoBHq+F73LbM/TSMVhDw8wOS4gzKu4Kai3wD4x598B4ULdgHSgvcAy4uQTnawO8qLV+uCRBCiHOnz06nupXP8gXi3bSvPmFUulWBL3i7kHtBHoCKKWmAPdprTPO83xtgVfO8xhCCD94vR7SFs9g465MWgweSmxUKOH1W3NT/dZmhyaEX/yuB6WUsiulagI232ILEAK01Vp/drZjKKVsQCvgJqXUS8AJ4D1ggtbae07RCyGK5D5+lINfv0LWtrVU81p579PaPDSqj9lhCVEi/g6SGABMAeKKWJ0OnDVBAYnASmAqcBXGBLSzgAxkmLoQpSZ7z2YOzHwRd2YaltAovnZ3p0+PZLPDEqLE/J1J4r8YJTVeAuYDg4Ak4P+AB/05gNY6BehWYNEapdRrwNVIghLivHm9Hg4v+YqMxZ9h8XoIqaWoduWDPBAZh9UqT4OI8sffchuNgH9prVcBvwMRWuvpwBiKf4g3n1KquVLq6UKLnRgPAgshzlPqz5+RuegTLF4PmfV6UGPYv7BHx0tyEuWWv1dQWYDH93oL0Br4DlgFNPbzGEeAB5VSe4DJGKMC78VIckKI81Sl7WUcXr2I790dubrXECw2KY0hyjd/r6AWAU8opapg3Ee6UinlALpj3EM6K631XoyuwVG+fb4A/q21nlHSoIUQ4PW42b7kBzb8dQgAe3QCje+bxOj7R1C7WpTJ0Qlx/vz9E+tB4BvgVuAtjOejMjC66B7z92Ra6wVAuxLGKIQoxJWZxs7pL2FJ2cQSdwdqP3g/0RFOrDa73391ChHs/B1mvhVoqpQK01pnKaU6AD2Aw1rrZQGNUAhxiuNbVnBo9iQsWZlkWcKIrt0Qu03uM4mKp7ipjsLPsvynk++11oWnQBJClDJ3bjbrPnuDmD2/ABBWvzVJfUfTPFZKY4iKqbgrqPI3dXIAAB0ASURBVGMY0xn5w3b2TYQQ58qVmcbGtx8jJucgHqwkXHoTMR0GYLFIh56ouIpLUD3KLAohRLFsETFExkRz+EAOnq530LBjJ7NDEiLgipuLb2FZBiKEONXenbvYsC2dPj1aY7HaqHP9w9S0OQkJjzA7NCHKhL9THa2gmO4+rXWHUotICMHhNYtIn/0mea4ENtd9iib14rFHxfo97FaIisDf7/fZRexXH+gPPFWaAQlRmbmzj5M6dzLH1i8k3AKx0WFUr+IwOywhTOHvMPPCUxQB+QUIBwEvl2ZQQlQ2bo+X+V99R4OdM7GcSMdidxLb62bqtb0Mi0WGkIvK6Xx7DBYAr5VGIEJUVl6vl1Uf/B8N9xvDx53VG1J18L0442uaHJkQ5vL3HlRRz0TFAI8D+0s1IiEqGYvFQt0LqnJ0v5Xc5v2pN+gmLFZ5ckMIf6+gzvRMVDZwS+mFI0TlsGtvKj/9tJKhN/TGbrOS2P06qrTsgrPqBWaHJkTQ8DdBFX4mygvkAhu01pmlG5IQFduJ3ZoDH06klSeH735KYuClrbHYHJKchCjE30ESCwGUUpGAAtzGYp0VwNiEqFA8rlzSF03j6NKvicdDZkg8XZrEmB2WEEHL33tQIRhVb4dizGAOkKWUehd4UGvtDlB8QpR7bo+XH2cv4IK/ZhBy4iBYrMR0voK6Xa/Danee/QBCVFL+dvG9ilH76TpgOUYdqY7AC0AO8M9ABCdERbBlzqc0XDcTqwWssTVIGnwPoTX9rfMpROXlb4K6FhiotV5SYNlMpVQaMB1JUEKcUd3mLdm79iuyGl9K0ytvkasmIfxUkpLveUUsP1qKsQhRIRw+lMr3X3xLn2uvoWpcOGH1WlF3zBvYYxLNDk2IcsXfufofAd5TSl2klLICKKVaYNyXelYpFX7yK1CBClEeHP9zJQfeH8tFqbOY9b/v8pdLchKi5Py9gnoZiAQWA26llAdwABagA/BSgW3lCUNR6WQfTeXogqkc3/gLYUCaszqDe7cyOywhyjV/E9QVAY1CiHIqLSOLHz/5jFbp8wnxZmNxhBDX/Ubqtesns0EIcZ5K+hxUGNAIo2vwL3lIV1R2Oatm0z7tWwCstVpQc/BoHFWqmhyVEBWDv89B2YD/APfxd9derlLqA2CM1toVsAiFCDK7UjKoXS0Ki8VC1Q592LZuAeEdr6RGx94y87gQpcjfQRLPAsOA4UBt39dw4HJgfGBCEyL4fDX9O1a++SSLf98JGKXYG97zOjU79ZHkJEQp8/ce1HDgNq31nALLpiulMoF3kCQlKjh3ViZpCz6m1Z/zwAm7N/8MbUcAyL0mIQLE3wQVCWwtYvk2IKH0whEiuGzbc4TjGxYRtfFLPCcywGrH2vpyuvS5wezQhKjw/E1QK4DRGPegChoDrCrViIQIEnrdBnbMnEQjxwE8QGid5iT0uwNnQi2zQxOiUvA3Qf0T+Fkp1R1Y6lvWCagL9C39sIQwX5LnAA7HAXJt4ST2vpm4Nr3kPpMQZcjfYeYrlVJtgDuAZhhTH30DTNJaS0VdUSFs2ZXOrDnLuHN4T6LCnUS37oH7+BFikntjC48yOzwhKh1/r6DQWm8Bxiql4gG31vpI4MISomy5MtPZNe15BuZs5dvvIrj+6i5YLBbiLr7K7NCEqLT8TlBKqSeAu4Bqvve7gZe11i8HKDYhAsrt9pCT6yLvj3mkLfyM+rkncFsd9Gkk3XhCBAN/H9R9FqN77xlOrQf1uFLKobV+PnAhClH6tu45wmef/kB/62Kq5Bi91OEN2xJ/2W0yE4QQQcLfK6jbgJsLPQf1i1JqKzAJkAQlyhX71kXckPs/rBYv1qh4EvuMJFx1kEEQQgQRf2eSsAO7i1i+FZC7xyLo5bncLN+Qkv++Ros2WOx2Itr1p86oV4ho0lGSkxBBxt8E9TzwhlKq9skFSqk44DmMsu9+U0pVUUrtUkqNKMl+Qpwrt9vD+Jdms/zTd9i0LRUAZ0It6t7zNtUuuxVrSJjJEQohiuJvF991QFNgm29whAuoAziBTkqpe09uqLU+Wwf+W0DNc4hViBLzetxkrpzDre7PsYXn4tq1HOr3A4x59IQQwaskBQvPm1LqZiAaWF8axxOiKHkuD1/+vJUWMRlEr/2c3APbsQFhqjOJbTuaHZ4Qwk/+Pqg79XxPpJSqBzwJXAR8f77HE+JMvl+0iWMLP8MZuplcvNijE4jvezsRjdqZHZoQogT8fg7qfPjqSX0MjNVapyilyuK0ohLxer35gxw6OzeTEboJr8VKTMeBxHa5Dqsz1OQIhRAlVSYJCngC0FrrmWV0PlFJeDxe5i7byc8rd/Lvu7rgsFuJ6zQQ96GdVOl8JSFJ9cwOUQhxjvwdxXe+rgeuUUodUUodAVpijAp8o4zOLyqovDwXO376iivSp/DrKqMijNXupNqVD0hyEqKcK5MrKK11k4LvlVJrMKZJ+qAszi8qluxcFzarFU/qLg7PeYs+3j/BBvHWrUBjs8MTQpSSMyYopdT7/h5Ea31r6YQjRPHW/3WYNz5fwbAaf1I9ZQl43Ngi40i4bCQRTTqZHZ4QohQVdwVVcIYIJzAQ2IxRvDAXaAO0Bj4t6Um11heWdB8hACwpWxjhnkbivkzAQnTbvsR1vxFraITZoQkhStkZE5TWesjJ10qpdzC65B4ouI1S6hmgSeF9hSgtXq+XHfszqFfDeKi2Qc0o9tsycSTWJrH/3YTWlC49ISoqf+9B3YBxxVTYVGBN6YUjxN9y89w8+c6v5OzdwkMPXE/1hAjC6rak2pCHCW+QjMVWVoNQhRBm8PcnPAXoCfxZaPkAYGepRiTESRkpXJE9k8SIXaRuaUb1hM4ARDRub3JgQoiy4G+C+hcwWSnVE/gdsGDUg7ocGFLcjkKUhN6ZRnSYlVA9l/RfviDR7cISFkW9BLlaEqKy8Xeqo4+UUnuAUcBNvsXrgK5a62WBCk5ULj+v2s2s/83hpiorqOJOByCyVU/iew3HFi5VXYSobPz+s1Rr/RPwUwBjEZVc07wN1ImaC26wx9Ug8fJRhF3QwuywhBAmKe45qIn+HkRrPa50whGVSerRLOav2M2QXo2wWCwktOxM1rIZxLTpQ5XOV2KxO8wOUQhhouKuoPy9E+0tjUBE5eJ2e5j4+je0yl7Fwip30b1dXWwRMdS5exJWR4jZ4QkhgkBxz0H1OPlaKXUT8J3W+nCZRCUqNE9eDkd/nckdli+xhLpxZqwA6gJIchJC5PP3HtSrQCdAEpQ4J1k5Lj79YTMtQlOovvVLXOkpWIDIC3sR37mv2eEJIYKQvwlqGXAl8FwAYxEV2IqVm4lZOYXEkB24wJgJot8oQms3NTs0IUSQ8jdBeYD/KKUeB7YDWQVXaq07lHZgovzLc3lw2I2KLhdGHuJwyA68NifxXYcQ03EgFpsMghBCnFlJrqDkeSfhF7fbw4wFf7J42Wb++0A/osKdRLXqjittH1HJvXFUqWp2iEKIcsDfB3WfPvlaKRUNWLXWRwIWlSjXvDnHiFzzGaPZxKrltejevS0Wi4W4HkPNDk0IUY74/aCuUuou4FGghu/9QeAVrbXclxLsP3ycsBAr1r9+Je2nj2mam4HXaqVtXIbZoQkhyim/EpRSaizwBPAssARjLr6LgYeVUlla61cCF6IIdgtW7uKLGQu4JXE1cdl7AAit05yEvrfhTKxjcnRCiPLK3yuo0cCdWuvPCiz7RSm1E3gGkARVidU/tpr7I2djzfZijahC/KU3E9m8CxaLxezQhBDlmNXP7RIxKukWtgqoVXrhiPJg4/ZUpv2o89/XaNEWq8NBdPv+1LnzVaJadJXkJIQ4b/4mqD8ouqzGdRhl4EUlcfRYDu+/O5OcRR+gd6QC4EyoxQX3vE1Cn1ul9LoQotT428U3HvhWKdUZ+M23rDPQF7gqEIGJ4OFye7DbrOSlp5C94CPujlgKQOwxDVwEgC082sQIhRAVkb/DzOcqpXoB92DUg8oCNgHttdZrAxifMNnSP/bz4axV3Kv24Nz6E7hdWOxOqnS+khjV1uzwhBAVWHHlNvoCi7XWxwG01ouARWUVmAgOx9b9xJ2e2Th1DgCRrboT1+1G7NHxJkcmhKjoiruC+hZwKaVWAgt8X79q7ftNJSqk9Mxs0jNyqF8zBoALaznI2J5DSK2mJPS5hZDqDUyOUAhRWRSXoBIwnnXqDFwC3A9YlVJL+TthLdNauwMepSgTW3alM/mdmVSLcHPvuNuw26zEdRpIWLU6hDfuICPzhBBlqrh6UOnAbN8XSikb0AYjYXUGbgUSlFKLtdb9yyBWEUA5B3YQ+eunjApbRTbhZB4ZQmx8LFZnKBGqo9nhCSEqIb+nOtJau5VSe4D9wEFgF1AVqB+g2ESA7Tt8jB9+WErf0LVkbf4VAIsjlOqdBxITFWZydEKIyq7YBKWUigS6A5cCvYEmwG7gJ2AycKPWel+AYxQB4M4+we/v/ZcuLk2WxYvF5iCq7WXEXnQVtogYs8MTQohiR/EtBjoA6cDPGNMZLdBaby2b0ERp83i8uD1eHHYr1pBQVGQmHLXgbNGDpB7XYY9OMDtEIYTIV9wV1MXAHuB9jAERv2mt88okKlHqtm3eyoavPyJb9WHI4IuxWKzUueperGGROGKTzA5PCCFOU1yCqo/RtdcLuAuIUEotAeZjJKzftdbewIcozkdeegpHfpmJd91PNPd6WP2Hm7z+nXHYrYTUaGh2eEIIcUbFjeLbAbzn+0Ip1RroiZGwngDylFI/A/O11m8EPFJRIrs2bybtl5lEH1gNXg8Wi5XjNdvTu88N+WXYhRAimJVkFN9aYK1S6hWgLXALxrRHVwCSoIJIyuKvyF34EdEWwGIlslV3Yi++GkdcDbNDE0IIv501QSmlagEdgU6+f9sALuBXjFpQPwcwPuGHg2knWLtxF5derLBYLMQ2vpDMxZ+xK+ZCmg8aSmJtKRoohCh/ihvF9wVGQqoOZAK/AN8AY4FV5zKDhFJqAPAfoB7Gs1QTtdZvn0PcAvB6PRzbspKN06eAG3Y2mEDd6tGEVKtLvX+8R6PwKLNDFEKIc1bcFVQI8DLGFdLvWmvP+ZxIKVUdmAFcqbX+TinVBqMq7wqt9e/nc+zKwu32MG/FblZv3sddyTlkLPuKvEO7qWOFHHso3uPpgFH2wi7JSQhRzhU3SGJAaZ5Ia71fKZWotc5USlmBeIyuwszSPE9F4/V6/54Dz53Lrvkz6O1eQ+reEwDYouKp0mkQURf2wuqU2R+EEBWH34MkSoMvOYUDR33nnqC1/rMsYygv3G4PMxb8yeI1e3nhvq6EOu1YPG562FZhJQdbfC3iOg8mskUXLDaH2eEKIUSpK9ME5ZMNRACtgDlKqT+11pNNiCOo2WxWtq7fSLuMFSxbW5du7etjDY2gap8R2KLiCG/YBotFhosLISquMk9QvntZucBKpdQ7wGCMef0qtXVbD/HVwr+499oLcR7WHF36DTdkrYZQiLdt5eScvNFt+pgbqBBClJEyS1BKqW7AS1rrgnXCQ4AjZRVDMJv1k4Zty9n97kdEZKUAYLE7iWrdk/B6rUyOTgghyl5ZXkGtAWoqpR7AmHi2IzASuLIMYwgKeS43P6/aQ8uGCSTFRwBwg/V7rJGbIAtsEVWIbteP6DaXYZPReEKISqrMEpTW+qhS6nLgVeBJjLIdt2mtF5ZVDMFiyuyN/P7rSnYlN2TkDV0AqNauJ0eXZxHToT+RzbtgscvAByFE5VbWo/h+xygfX6mkZWSTm+emWpUQjutl9D78DZfG/MkxTzfASFCRLbsR2aqHlFUXQggfM0bxVSq/rNvHW58s5pqa+7jQuxH3sTQALCHh1Kr5d/0li9VmVohCCBGUJEGVMrfHy9FjOcRFhwJQ/9hqnoiagT3TgxtwJNQium0/olp2wxoiD9YKIcSZSIIqRdv3HeX5KUuoEenh8fsGAhBXV5Fl9RLesD3R7fsRVreVdOMJIYQfJEGdp6wcF2EhdnL2bSV01Vzu8S4k5VgiGccvIzrCSUiNhtS5513sUbFmhyqEEOWKJKhzlJ6ZzSsf/0bV9HUMqraH3JRtAIRYoHGdWCKdfxcbluQkhBAlJwmqBI5l5REZZgz/dh7+k+tT38JpcZGbAtawSKJadicquTfOhFomRyqEEOWfJCg/ZOe4mPjez2Qd2M3TTwzH6bARWr0+DrsVR1ITqrS7jIgmnbDanWaHKoQQFYYkqCJ4vV72HDxGraoRZG1fR+baBdxw5DeyHE627epPkwZVsYVGcMGYN7FHVjE7XCGEqJAkQRXicnt47PlZ1Du+nr6Je/FkHgbAhoW4eoqkqn//l0lyEkKIwKn0CepA2gnW/XmI3h0vAMCTuodR7o8hFDyZYK9SlahWPYlq3QN7dMJZjiaEEKK0VOoE5XK5mfB/M6ju3kfzBmOokRCJI7E2toQLCK1Wh+gLexF6QXOpuySEECaoNAkqO9fFR3M28efuIzw7MpkTG5eQuWYeY0K3A+A6chASIrFYLNS5/XmZekgIIUxWaRKU025l97rfaeP6g12vvoHFnQsYw8MjW3SjStWY/G0lOQkhhPkqTYLyZh/nZsccLDYXuCG0bkuiL7yUCNVRSlsIIUQQqjQJyhYeRUybPlidIUS17oUjrrrZIQkhhChGpUlQAAmXjTQ7BCGEEH6S4WlCCCGCkiQoIYQQQUkSlBBCiKAkCUoIIURQkgQlhBAiKEmCEkIIEZQkQQkhhAhK5eU5KBtASkqK2XEIIYQoRQV+r582x1x5SVDVAYYOHWp2HEIIIQKjOvBXwQXlJUGtALoA+wG3ybEIIYQoPTaM5LSi8AqL1+st+3CEEEKIs5BBEkIIIYKSJCghhBBBSRKUEEKIoCQJSgghRFCSBCWEECIoSYISQggRlCRBCSGECEqSoIQQQgSl8jKTxBkppToAs7XWVX3vE4FXgMuAHOB94Emttdu3/kPgWsBV4DCttNbblFJ1gMlAJ+AgcI/Wek6ZNYZzas9FvvVNgX3Ao1rrGb51pranJG1RSr0FDCt0iAjgMa31f8xuC5zTZ3ML8DiQAGwGHtRaL/GtK4/tuQe4H4gHfgVGa623mdkepVRv4Dmgke+8z2ut31ZKOYHXgWswZp95SWv93wL7XQv8B2MGg4XACK31QTPbcj7tKbD//UA3rfUVBZaZ/r12rsrtFZRSyqKUug2YCzgLrJoKVMX4hd0C6AD8q8D6NsAVWuvIAl/bfOs+B9Zh/ADeDnyulKof4KYA59YepVR14FuMb9woYDTwse8bEkxqz7m0RWt9Z8HPBHgI2Ohrm2ltOdf2KKVaAS8Bg4EqwMfAV0qpkz9z5a091wLPArf4Yv4a+FEpFerbt8zbo5SqDXwBPIPxf3wD8F+l1GXA04ACGgDtgZuVUsN9+zXD+IU9whfvn774TzLr5+ac2uPbN1Ip9TzwYhGHNu177XyV2wSF8YHdhfFhAqCUCgf6AvdrrQ9qrdOAJ4DbfT+UYUATYE3hgymlGgPtgPFa61yt9QKMH8KRgW8KcA7tAYYDi7TWU7XWXq31jxi/VNJNbs+5tIUC2zYAJgI3aq0zyuln04i/f74sGH/1Zvn2LY/tuRp4V2u9UGvt0lq/CeQCvUxsT13gU631l1prj9Z6BfAzcDFwM/Cs1jpda70DeAEY5dtvGPCN1nqJ1jobeAS4WCnVyOTP5lzbA8YfqvWAtwseMAi+185LeU5Qb2mt2wIrCyw72Z7jBZa5gUSMv0guxOjae1cpdUgp9btSaoBvu2bALq11wX03Ay0DEv3pzqU9bYEdSqnPlVKHlVKrgSStdSbmtudc2lLQixi/DNf63pfHz+YH4A9gPcYv8gnAdVprD+WzPdZC606ub4xJ7dFaL9Za33nyvVIqDmNS6dUYXXcbzxBPs4LrtNYngN2+9aZ9NufRHoAbtNbXAAcKHdbs77XzUm4TlNZ6XxHLjmF0W0xUSsUppeKB8b7VYRjdYIsx/oKsgdFlMV0p1RqIBE4UOuQJIDwwLTgt9nNpTxzGJfvHGN/A/wW+9F2BmNaec2wLAEqpFkBvjF/oJ5XHzyYU0Bj9/hHAPzG6+JIon+35ArhDKdVOKeVQSt2O0RsRhsntAVBKxWBcGSwDVhWIoah4iovX9LZAidtT5GfqExTtOVflNkEV4yaMv1g3Ydz8/Mq3/IjWeq7WurfWeqXWOk9r/QWwABiE8ddhWKFjhQPHyijuMzljezBuZH+vtZ7ta8904HegH8HZnuLactKtwFda64J/CQZjW6D49jwFpGitl2mtc7TWbwA7gCGUw/ZorT/H+APoc4yrjRbAj0A6JrfH1421FOPq4Rog07eqYEwF4ykuXtM/m3NoT3FMb8/5qIgJqjowSmtdTWvdAtgLbNJan1BKDVRK3VxoeyeQjXH5XMd3n+qkJpx6WW2GM7YH41I9ttD2J0dmBmN7imvLSYM59YY1BGdboPj21AZCCm3vAvIoh+3xDcj5RmvdUGudBDyAkaRWYWJ7lFJdMa4yvgKu0Vpna63TgRSMQQVFxbOx4Drf/bc6vuWmfjbn2J7iBOv3ml/K/TDzIrwE/KGUGovxTTeBv0eC2YBXlFKbMH6wrgMuAm7TWu9SSq0FnlVKPeJbPhjoXNYNKKS49nwIjFFKDQM+xfjrvBVwrdZ6dxC2p7i2nBzmXB/4peBOWmsdhG2B4tszG6O7bDpGIbahQHPg2yD9bKD49vQCnlRKdQEyMLr/9gErtNZeM9rj68qejfEowmuFVn/ki3cdRjfXWIwh9GD8rCxRSnUHfsO4Mlyttd7iO64pn815tOeMgvhnxy8VMUHdDrwLpGF0tbzm615Ba/2VUuox4DMgCeMKZIDWepdv36uBdzCeFTgMjNRa/1HG8RdWXHvWKqUux/hF8gawC7hKa73bt2+wteeMbfGpC+T4RpAVFmxtgeI/m3d99xE+xXgOaiNweRB/NlD85/MJxo31tRi9DvOBQVrrkxVPzWjPaIz7yv9VShV8JmgSRgJ9EdiA0VP0DvAWgNZ6vVLqVt/7mhhXLEMK7G/WZ3NO7fFDMH6v+UUq6gohhAhKFfEelBBCiApAEpQQQoigJAlKCCFEUJIEJYQQIihJghJCCBGUJEEJIYQISpKghAgQ3yS+h3yTfhZe95hS6phSqq4JoQlRLkiCEiJw/oHxMPwpheWUUvWAxzBmDNhhQlxClAuSoIQIEK11CkatoduUUh0LrHoNoyZZ4elshBAFyEwSQgSQr9jfLxjTA7XHmDl/OpCstd7o2+YW4FGMaXc2YVxZfe9bZwf+DdyIUSImFWOqrrFaa7dS6mPAg1EFtwHGVFc/l1kDhQgguYISIoB8c9XdgTGJ7y0YlVCfKZCc+mNM0vqYb5vJGDW9OvgO8QhG6e+bMKr0PgLcCwwocJphGBOH9sIo0yBEhVARJ4sVIqhorf9QSr2EUY57E/BcgdWPAs/5ankBbFVKtcMoZ3E9RkXeEVrrRb71U5RS4zAqpc7yLduotf440O0QoqxJghKibDyNUVX331rrvALLmwFtlVJPFFjmwFevxzcDfy+l1PMY5dVbYcz6biuw/V+BDFwIs0gXnxBlQGud5XuZVWiVHXgIuLDAV3OMmj0opZ4B/ofxs/o/oA9QuFRC4WMKUSHIFZQQ5toMXKC13npyge9qKht4Hrgb+IfW+kPfujCMYoIWE2IVokxJghLCXBOBD5VSGlgA9AaexLj/BEbxwAFKqV+BGIyuwmhOLycvRIUjXXxCmEhr/T/gfmAcxn2n+4FRWusZvk2GY4zeWw/MBLYCHwBtyzxYIcqYPAclhBAiKMkVlBBCiKAkCUoIIURQkgQlhBAiKEmCEkIIEZQkQQkhhAhKkqCEEEIEJUlQQgghgpIkKCGEEEHp/wE3oL3s77dGQwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year',\n", - " ylabel='World population (billion)')\n", - "\n", - "savefig('figs/chap05-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", - "\n", - "So the largest relative error between the estimates is about 1.3%." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.3821293828998855" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max(abs(census - un) / un) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", - "\n", - "1. Compute the elementwise differences, `census - un`\n", - "2. Compute the absolute differences, `abs(census - un)`\n", - "3. Compute the relative differences, `abs(census - un) / un`\n", - "4. Compute the percent differences, `abs(census - un) / un * 100`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 0.032480\n", - "1951 0.022089\n", - "1952 0.017480\n", - "1953 0.016188\n", - "1954 0.017056\n", - "1955 0.020448\n", - "1956 0.023728\n", - "1957 0.028307\n", - "1958 0.032107\n", - "1959 0.030321\n", - "1960 0.016999\n", - "1961 0.001137\n", - "1962 -0.000978\n", - "1963 0.008650\n", - "1964 0.017462\n", - "1965 0.021303\n", - "1966 0.023203\n", - "1967 0.021812\n", - "1968 0.020639\n", - "1969 0.021050\n", - "1970 0.021525\n", - "1971 0.023573\n", - "1972 0.023695\n", - "1973 0.022914\n", - "1974 0.021304\n", - "1975 0.018063\n", - "1976 0.014049\n", - "1977 0.011268\n", - "1978 0.008441\n", - "1979 0.007486\n", - " ... \n", - "1987 -0.018115\n", - "1988 -0.023658\n", - "1989 -0.028560\n", - "1990 -0.031861\n", - "1991 -0.037323\n", - "1992 -0.038763\n", - "1993 -0.040597\n", - "1994 -0.042404\n", - "1995 -0.042619\n", - "1996 -0.041576\n", - "1997 -0.040716\n", - "1998 -0.040090\n", - "1999 -0.039403\n", - "2000 -0.039129\n", - "2001 -0.038928\n", - "2002 -0.038837\n", - "2003 -0.039401\n", - "2004 -0.040006\n", - "2005 -0.041050\n", - "2006 -0.041964\n", - "2007 -0.043192\n", - "2008 -0.044599\n", - "2009 -0.046508\n", - "2010 -0.057599\n", - "2011 -0.061999\n", - "2012 -0.066201\n", - "2013 -0.069991\n", - "2014 -0.073816\n", - "2015 -0.101579\n", - "2016 NaN\n", - "Length: 67, dtype: float64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "census - un" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 0.032480\n", - "1951 0.022089\n", - "1952 0.017480\n", - "1953 0.016188\n", - "1954 0.017056\n", - "1955 0.020448\n", - "1956 0.023728\n", - "1957 0.028307\n", - "1958 0.032107\n", - "1959 0.030321\n", - "1960 0.016999\n", - "1961 0.001137\n", - "1962 0.000978\n", - "1963 0.008650\n", - "1964 0.017462\n", - "1965 0.021303\n", - "1966 0.023203\n", - "1967 0.021812\n", - "1968 0.020639\n", - "1969 0.021050\n", - "1970 0.021525\n", - "1971 0.023573\n", - "1972 0.023695\n", - "1973 0.022914\n", - "1974 0.021304\n", - "1975 0.018063\n", - "1976 0.014049\n", - "1977 0.011268\n", - "1978 0.008441\n", - "1979 0.007486\n", - " ... \n", - "1987 0.018115\n", - "1988 0.023658\n", - "1989 0.028560\n", - "1990 0.031861\n", - "1991 0.037323\n", - "1992 0.038763\n", - "1993 0.040597\n", - "1994 0.042404\n", - "1995 0.042619\n", - "1996 0.041576\n", - "1997 0.040716\n", - "1998 0.040090\n", - "1999 0.039403\n", - "2000 0.039129\n", - "2001 0.038928\n", - "2002 0.038837\n", - "2003 0.039401\n", - "2004 0.040006\n", - "2005 0.041050\n", - "2006 0.041964\n", - "2007 0.043192\n", - "2008 0.044599\n", - "2009 0.046508\n", - "2010 0.057599\n", - "2011 0.061999\n", - "2012 0.066201\n", - "2013 0.069991\n", - "2014 0.073816\n", - "2015 0.101579\n", - "2016 NaN\n", - "Length: 67, dtype: float64" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "abs(census - un)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 0.012862\n", - "1951 0.008585\n", - "1952 0.006674\n", - "1953 0.006072\n", - "1954 0.006286\n", - "1955 0.007404\n", - "1956 0.008439\n", - "1957 0.009887\n", - "1958 0.011011\n", - "1959 0.010208\n", - "1960 0.005617\n", - "1961 0.000369\n", - "1962 0.000311\n", - "1963 0.002702\n", - "1964 0.005350\n", - "1965 0.006399\n", - "1966 0.006829\n", - "1967 0.006289\n", - "1968 0.005827\n", - "1969 0.005821\n", - "1970 0.005832\n", - "1971 0.006258\n", - "1972 0.006166\n", - "1973 0.005847\n", - "1974 0.005332\n", - "1975 0.004437\n", - "1976 0.003388\n", - "1977 0.002670\n", - "1978 0.001965\n", - "1979 0.001712\n", - " ... \n", - "1987 0.003591\n", - "1988 0.004604\n", - "1989 0.005461\n", - "1990 0.005988\n", - "1991 0.006900\n", - "1992 0.007054\n", - "1993 0.007277\n", - "1994 0.007490\n", - "1995 0.007423\n", - "1996 0.007142\n", - "1997 0.006903\n", - "1998 0.006709\n", - "1999 0.006511\n", - "2000 0.006386\n", - "2001 0.006274\n", - "2002 0.006183\n", - "2003 0.006197\n", - "2004 0.006216\n", - "2005 0.006302\n", - "2006 0.006365\n", - "2007 0.006473\n", - "2008 0.006604\n", - "2009 0.006805\n", - "2010 0.008328\n", - "2011 0.008860\n", - "2012 0.009350\n", - "2013 0.009772\n", - "2014 0.010190\n", - "2015 0.013821\n", - "2016 NaN\n", - "Length: 67, dtype: float64" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "abs(census - un) / un" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.4014999251669376" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "max(abs(census - un) / census) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Constant growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select a value from a `Series` using bracket notation. Here's the first element:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.557628654" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census[1950]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the last value." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7.325996709" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census[2016]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1950" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2016" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = get_last_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "66" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "elapsed_time = t_end - t_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can get the first and last values:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.557628654" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "7.325996709" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "p_end = get_last_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can compute the average annual growth in billions of people per year." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.768368055" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total_growth = p_end - p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.07224800083333333" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TimeSeries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's create a `TimeSeries` to contain values generated by a linear growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    \n", - "
    " - ], - "text/plain": [ - "Series([], dtype: float64)" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    19502.557629
    \n", - "
    " - ], - "text/plain": [ - "1950 2.557629\n", - "dtype: float64" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results[t_0] = census[t_0]\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After that, the population in the model grows by a constant amount each year." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "for t in linrange(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results looks like, compared to the actual data." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap05-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')\n", - "\n", - "savefig('figs/chap05-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well after 1990, but not so well before." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", - "\n", - "Hint: \n", - "\n", - "1. Copy the code from above and make a few changes. Test your code after each small change.\n", - "\n", - "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", - "\n", - "3. You might want to add a constant to the starting value to match the data better." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "def compute_annual_growth(t_0, t_end):\n", - " \"\"\"Average annual growth over given period.\n", - " \n", - " t_0: start date\n", - " t_end: end_date\n", - " \n", - " returns: average annual growth\n", - " \"\"\"\n", - " elapsed_time = t_end - t_0\n", - " p_0 = census[t_0]\n", - " p_end = census[t_end]\n", - " total_growth = p_end - p_0\n", - " annual_growth = total_growth / elapsed_time\n", - " return annual_growth\n", - "\n", - "# compute annual growth using data from 1970 to the end\n", - "t_0 = 1970\n", - "t_end = get_last_label(census)\n", - "annual_growth = compute_annual_growth(t_0, t_end)\n", - "\n", - "# Run the simulation over the whole time range.\n", - "# I subtract 0.45 from the initial value to shift\n", - "# the fitted curve down so it fits the data better.\n", - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = get_first_value(census) - 0.45\n", - "\n", - "# initialize the result\n", - "results = TimeSeries()\n", - "results[t_0] = p_0\n", - "\n", - "# run the simulation\n", - "for t in linrange(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth\n", - " \n", - "# plot the results\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "plot(results, '--', color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1960 3.043002\n", - "1961 3.083967\n", - "1962 3.140093\n", - "1963 3.209828\n", - "1964 3.281201\n", - "1965 3.350426\n", - "1966 3.420678\n", - "1967 3.490334\n", - "1968 3.562314\n", - "1969 3.637159\n", - "1970 3.712698\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.loc[1960:1970]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap06soln.ipynb b/soln/chap06soln.ipynb deleted file mode 100644 index f4f35bfe..00000000 --- a/soln/chap06soln.ipynb +++ /dev/null @@ -1,808 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 6\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.525149\n", - "1951 2.572851\n", - "1952 2.619292\n", - "1953 2.665865\n", - "1954 2.713172\n", - "Name: un, dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.557629\n", - "1951 2.594940\n", - "1952 2.636772\n", - "1953 2.682053\n", - "1954 2.730228\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.07224800083333333" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = get_first_value(census)\n", - "p_end = get_last_value(census)\n", - "total_growth = p_end - p_0\n", - "\n", - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### System objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can rewrite the code from the previous chapter using system objects." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    t_01950.000000
    t_end2016.000000
    p_02.557629
    annual_growth0.072248
    \n", - "
    " - ], - "text/plain": [ - "t_0 1950.000000\n", - "t_end 2016.000000\n", - "p_0 2.557629\n", - "annual_growth 0.072248\n", - "dtype: float64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " annual_growth=annual_growth)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can encapsulate the code that runs the model in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation1(system):\n", - " \"\"\"Runs the constant growth model.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = results[t] + system.annual_growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also encapsulate the code that plots the results." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation1(system)\n", - "plot_results(census, un, results, 'Constant growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Proportional growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a more realistic model where the number of births and deaths is proportional to the current population." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation2(system):\n", - " \"\"\"Run a model with proportional birth and death.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " births = system.birth_rate * results[t]\n", - " deaths = system.death_rate * results[t]\n", - " results[t+1] = results[t] + births - deaths\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "system.death_rate = 0.01\n", - "system.birth_rate = 0.027" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap06-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3RVZfbw8e+9uakkARISei8PUgIBkhAIvUOoyoiAiJVX0HHmJzrjODIy4xRQZ5xREQsqFqSIovQmvST0Jjz0EjopJJB2c+95/zhJDJCEC6YQsj9rsVZyznnO2TdLs3Oeti2GYSCEEELca6ylHYAQQgiRH0lQQggh7kmSoIQQQtyTJEEJIYS4J0mCEkIIcU+SBCWEEOKeZCvtAIRwhVLqJFA3zyEHcBaYB/xFa329FMLKl1IqCOiltZ6V/f1aYLvWemIJPPtzwFdr/VBxP6uA5z8HTNRa13Ph2q7AGsBPa32tmEMTZZAkKFGW/An4LPtrN6Ap8DVQCXiqtILKx1TAD5iV/f0wwF564QhRNkmCEmVJitb6Qp7vzyql/gv8gXsrQVnyfqO1TiitQIQoyyRBibIuC8gAUEq9DkRgjq22B34LfAE8DzwH1AEOAX/SWi/JbvN5dntfYChwDnhNa/1NzgOUUiOBPwKNgdPAP7TWM/O0t2Wfawz8DHTMPmdorS03d/Hd5n6vAyHAceCJ7NjmAb/XWjuUUjZgMjAKqAkkALOB/9NaOwr7QWV3qX2b/bN4EwgA5gKvAx8BnYCjwFit9c7sNo2Bt4DOgBP4LvtZKdnnw4B3s2PeBmy+6ZlNgP9lt78MzMn++WYUFqsQIJMkRBmllLIqpcIxk8+CPKf6AusxE9QSzG7BycAkzF+iC4AflVKt8rQZCyQDbYD3gK+yf5mjlBqF2a34QXb7d4GPlVID8rQflX2+O9Af85f+IqB6PnG7cr9ozG7LyOy4JwBDss+9BDwKPIaZ4F666fztVALGZcf5CDAGiAFmAmFAEvBOdqwBwEbM7slOmF2VUcCnec4vA/Zk/+y+AH6f57N6Acsxk21odtx9gf+6GKso5+QNSpQlbyul/pX9tSdgAD9idvHlSAP+qbV2KqUswO+Av2utZ2eff10pFQG8jJlYAE4BE7TWTuBQdnJ6FliL+Qv3Y631B9nXHlFKNcdMfIuzj2mt9ec5ASil0gC3m7ojc7hyvzRgvNY6E9BKqWeBtsB84ADmG8667GtPKqVeAppln78dN+BlrfU+YJ9SSgM780zo+BR4O/vakZh/xD6qtU7LPj8W2Jr9ZtQD8w3vOa21PftnF4aZhMBMgHbMn62R/Vn+H7BBKfWyC7GKck4SlChL/gl8lf11JnAxn66iE9mJBiAYqAJsuemajcDwPN9vztMGIJZfkldz4D/5tH8kz/fHXP4Ert3vVHZyypEMuANorX9USnVTSk0FmmC+hdXDTDyuOprn61TMN5wc6ZjJPyfW3TnJKds2zJ99M6AFsC87OeWI5ZcE1RxoAKQopXLOWzCTXuM7iFeUU5KgRFlyRWt99DbXpBXwdV45vyRzZN103oo5jb2ge9zcvqDn3C6+gu6XWcA1OWNUL2B2s83HfHucnc/1hbl5RqEz36tc+/lZbjqXN3Yb5h8Hj+dzj7OY44VCFEjGoMR9S2udjDnpIfKmUx0wJ0vkaHPT+XDMcRWAgy60v1lhNWzu5n55TQBe1Fq/qLX+EjiJuT7s5kRRFA4CrZRS3nmOtcN8mzsE7M0+75nnfJub2jcG4rTWR7P/uAgA/gV4FEO84j4jb1Difvcv4K9KqThgB/Aw0AfomueaUKXUG5iD/NFAP7Jn4mW3/1YpdQBYhTnu8iTmDLuCXANaKKXqaq1P5RPPnd4vr3hggFJqPeCPOQOvMr90yxWlr4HXgC+z39wqA9OAVVrrn5VSZ4G/YE7y+AdmcnoKc2YhmN2xk4CZSqm/Ya4N+wQ4rbW+mqfbT4h8yRuUuN+9h7lwdiqwDxgMRGutN+S5ZgXmX/p7MBPFUK11LIDWeiEwHvg/YD/mrMGntdZfF/LMz4FqwEGlVLW8J+7yfnmNBepnf5YFmG9QMzAnURQprXUq5niSP+bY03eY42XDss9fBXpivsHtAiaSZ3wte3eP3piJLRZYmH2fkUUdq7g/WaSirijPSntrICFEweQNSgghxD1JEpQQQoh7Uol28Sml2mNue6Iwtz35l9b6kxILQAghRJlRYglKKWUFzmNOkf0qe8X5BiBCa73nNm09MbdhOc8v61OEEEKUfW6Y24Jtu3nhfUlOM6+MubLfkr0FjYG5QDK/RYk3y0lmQggh7k+dMGeJ5iqxBKW1jldKvYe5KeVnmFnzBa31QReanwf4+uuvqVat2u2uFUIIUUZcuHCBUaNGQfbv+bxKLEFld/GlY66BmI+5ev47pdQhrfWK2zR3AFSrVo1atWoVb6BCCCFKwy3DNyXZxTcM6Ki1fin7+3VKqRmYW//fLkEJIYQoZ0pymnltbt2OJQsphS2EECIfJfkGtQL4p1LqGeBjzH27nubeKtUthBDiHlFib1Ba6wOY3XzjMKt2zgL+qLX+oaRiEEIIUXaU6G7mWuslmGW4hRBCiELJVkdCCCHuitNZUK3LoiEJSgghxB0xDIONGzcyZcoUDh50ZSnr3ZGChUIIIVxmGAbLly8nJiYGAE/P4qiVaZIEJYQQwiUOh4MffviBffv24ebmxtChQ2nQoEGxPU8SlBBCiNvKzMxk7ty5HDt2DA8PDx5++OFiTU4gY1AlTimVb5/t4MGD+e6773K/X7hwIYMHDyY0NJSwsDCefvppDhw4UOi9N2zYwNixY4mIiCA8PJxHH32U2NjYIv8MQojyJTU1lS+++IJjx47h4+PDY489VuzJCSRB3ZNiY2N54403mDRpEjt27GDDhg20adOGxx57jISEhHzbfPvtt7z88suMHj2aDRs2sHHjRgYNGsQzzzzD9u3bS/gTCCHuF0lJSXz66aecPXuWihUr8sQTT1CjRo0SebYkqHvQnj17qFevHm3btsVqteLl5cWzzz7LgAED8k1QaWlp/Otf/+Jvf/sbPXv2xMPDAw8PD4YPH864ceM4ceIEYPYfT58+nR49ehAREcELL7yQe7+YmBgGDBjA1KlTiYiIoHPnzrz77ru5z5g/fz49e/YkLCyMBx98kPXr1+e2a9eu3Q3xdO/enVWrVhXaTghx77t48SIzZswgPj6e4OBgnnzySQIDA0vs+fdtghr44g8MfPHGTSr+OmMrA1/8gdgDF3KPLdtykoEv/sB783bnHou/msbAF3/gscnLbmj/u/+sZeCLP3D0TFKxxt61a1cOHz7MmDFj+OKLLzhw4AAOh4PJkyfTqFGjW67ftWsXmZmZdOnS5ZZzzz77LMOHDwfgiy++4Mcff+Szzz5j3bp1BAQE8Pvf/z732qNHj+Lu7s7GjRv5xz/+wfvvv8+xY8dISEjgtdde44MPPmDbtm2MGDGCN954g9sVu7zbdkKI0nfy5Ek+++wzrl27Rt26dXn88cfx8/Mr0Rju2wRVljVu3JgFCxbQtGlT5syZw7Bhw+jYsSMffPBBvr/cExISqFixIu7u7oXed+7cuTz33HPUqVMHLy8vXnrpJbZt28bJkycBsFgsjB8/Hnd3d6KioggKCuLUqVN4eHhgs9n49ttv2bdvH8OGDWP58uVYLJZCn3e37YQQpevAgQN89dVXZGRk0KxZM0aPHo2Xl1eJx3HfzuJb+PbgW45NerL9Lcf6Rtajb2S9G44FVvTOt/07v+/6q+Py8PAgKyvrluMOh+OG9QR169blT3/6E2AmoBUrVjBlyhQqV67MiBEjbmgbFBREUlISdrv9liSVkpKCp6cnHh4enDt3jldffZVJkyblnrfZbJw9exabzYavr+8NMbi7u+N0OvH19WXmzJl8+OGHjBkzBi8vLx577DHGjRtX6GctrJ0kKSHuTTExMSxbZvYehYWF0bdvX6zW0nmXuW8T1L2qWrVqnDt3jpYtW+Yey8rK4ty5c7nVgkeOHEnv3r0ZO3YsAAEBAYwYMYJ9+/ahtb7lnqGhoXh5ebFu3Tp69ux5w7k333yTU6dOMXPmTIKDg5k0aRKdOnXKPX/48GHq1avHrl27Coz56tWrueNXdrudTZs28fzzz9OuXTvc3Nyw23+pmGIYBlevXr1tu5vHrYQQpcswDFauXMmWLVsA6NGjBx07dizVPyali6+EDRgwgPfee49jx44B5gyZqVOnEhQUREhICAD9+vVj+vTprFq1iszMTDIzM4mJiWHdunX06NHjlnt6eHgwceJEJk2axOrVq8nKyiI1NZXPPvuMBQsWMGHCBACGDBnC+++/z/nz53E4HHz00UeMGjWK9PT0QmNOSEjgySefJDY2Fnd3d6pWrYrFYqFixYrUqVOHzMxMlixZgsPhYObMmVy/fv227YQQ946srCzmz5/Pli1bsFqtDBkyhKioqFLv6ZA3qBI2YcIE3NzcGDduHPHx8Xh6etK+fXs+//zz3O65Rx99FC8vL6ZNm8bLL7+MYRg0bNiQSZMmERUVle99H374Yfz8/Pjwww955ZVXMAyDZs2aMWPGDMLCwgB45plnyMrKYtSoUSQlJdGkSRNmzJiBv79/oTHXr1+fyZMn89prr3Hp0iUqV67Mn//8Zxo3bgzAn//8Z958803+8pe/MHjwYNq0aeNSOyFE6UtLS2POnDm5482/+c1vaNiwYWmHBYClLMyoUkrVA06sXr2aWrVqlXY4QghxX7h69Spff/01ly9fxs/Pj5EjR+YONZSUuLi4nJ6h+lrrk3nPyRuUEEKUQ+fPn+ebb74hJSWFoKAgRo0adc91v0uCEkKIcubIkSPMmzcPu91O3bp1efjhh/H29i7tsG4hCUoIIcqR7du3s2TJEgzDICQkhIEDB2KzFZwKnPYMrO63ltQ4d/kaQZV9cLcV31w7mcUnhBDlQM408sWLF2MYBp07d2bIkCEFJifDkUX8T19y9pMXcWak3nBu/k9HGD/1J5ZtOVmsMcsblBBC3OfsdjsLFizg559/xmq1Eh0dTWhoaIHXZ129zMXv/0PGWQ0WK2kn91NBheeerxnsi2EYxF9NK9a4XUpQSik3oC3QDggGHMAFYJvWendhbYUQQpSea9euMXv2bM6ePYunpye/+c1vCiyVYRgG1w9u5srSj3CmX8PNL4Aqg3/Hpgu+ZG0+Qf8O9QGIaF6ND/7YgxpVfIs19kITlFKqMvBb4FkgEDgOxANuQBWgrlLqPDAdeF9rXby7qAohhHDZpUuX+Oabb0hKSqJixYqMHDmS4ODgfK/NuHiS+BUzSD/9MwA+jdoSNPA5Dl2w8+7cjXh72ugYUoOKvp5YLJZiT05QSIJSSo0B/gqsBp4EVmmtM266xh/oBIwC9iulXtVazyzGeIUQQrjg2LFjzJs3j4yMDGrWrMmIESPw9S04qTiuJ5F++mesPv54RTxE1cj+WCwWmjcw9yxt3iAQPx+PEvwEhb9BhQFhWuvLBV2gtU4GFgOLlVLVgVcBSVBCCFGKduzYkTsZolmzZgwZMuSWjaSNLDtpJ/fh08jc+cWnQWsC+v0/Pt/vzYYfk5j+QDpBlc2p5xMealXinwEKmcWntX6+sOSUz/XntdbPFU1Y9y9XSr6/++67hISEcPTo0Ruuya84YI7vvvuOBx54gNDQUEJDQ2nVqhX9+vVjxowZN5To6N69OyEhIbnX5fzr06dP7jWnTp1iwoQJhIWFERoaSnR0NF999VW+z+3fvz+dO3e+YcNYIUTpcDqdLF++nEWLFmEYBlFRUTz00EM3JCfDMLiuYznz0e+4MOcfZJw/nnuuUpteZFq8MAwDfTr/6t0lyeVZfEqpYCAEcAdu2EFQa72kiOMq9zIyMpg4cSJz587Fw8O11+omTZrwww9mkUbDMNi1axcTJ04kOTn5hsKE//73v2/Z9TyH0+nk6aefJjo6mrfeegsvLy92797NhAkTcvfpypGzCWxQUBArVqxgwIABv+ITCyF+jYyMDObPn8+RI0cKnKmXeek08Ss/Je3kPgBsgTX5KfY4LSODqBVsFiN8PLo5Y6ObEVzZp8Q/w81cWgellHoSOAOswOzSW5Tn38Jii64ci4yMJDU1lXfeeeeu2lssFtq0acMbb7zBjBkzSE5OdqldYmIip06dIjo6Gm9vbywWC6Ghobz88su3XDtnzhx69erFQw89xJdffnlXcQohfr2kpCQ+/fRTjhw5gre3N48++ugNycmRmsKVZR8T98mLpJ3ch9XLl8DeT7Kq+pNMW3+dL5b80qsTVNn7nkhO4Pob1EvAx8ArWuuUu3mQUmoU8OFNh72B1Vrr3ndzz8Ic//uDBZ6r0m8c/m3MRybvXMGVpTeH9YsGr87P/TpuxktkXjhe4Pmi5OPjw9SpUxk9ejRdunQhIiLiru4TGRmJ1Wpl165d+ZaEv1lgYCDh4eE8/vjjDBo0KLebb8iQITdcl5CQwOrVq1m6dCl+fn5MnTqVffv23VDnSghR/M6cOcPs2bNJTU2lSpUqPPLIIwQEBNxwTcK6WaTsXAEWKz6t+xDU7RHcfPwYfDWNQ6eTbynaeq9wNUHVBv57t8kJQGv9NfB1zvdKqVDMN7KX7vae97vWrVszbtw4/vjHP+Z23d2pnPpL165dyz02ceLEW1aPjx07lueeM4cQZ8yYwdy5c1m5ciVffPEFWVlZdOnShUmTJuXudPz9998TGRlJ9erVARg0aBBfffUVU6ZMuas4hRB3bs+ePSxcuBCHw0GDBg0YPnx4bml2R/p13LwqAFA5ajipCVeYn9SSxDNV+Ku3OZsvsKI3U5/vVOD9S5urCWoF0AM4UhQPVUq5Yyar17XWe4rinjdz9c3Gv03v3Lep26n15Ju/JiTA9ZLvOcaPH8/GjRuZPHnyDeM/rnI4HCQnJ+cmEoC33nqrwDGonBhHjx7N6NGjyczMZMeOHbzzzju88MILzJkzB8MwmDt3LpcuXaJjx46A2f+dkZHByy+/TGBg4B3HKYRwndPpZPXq1WzevBmAdu3a0a9fP6xWK5nxZ0lYNRP71cvUeuotLFY3bH4BVB7yErH/WIlBIpcT0wgOuDe68QrjaoLaA/xbKTUIOAxk5j2ptb51gKJwE4A0YNodtivzXCn5npebmxtvvvkmgwcPxsfnzv+Dio2NxTAMmjRp4tL1c+bMYfbs2Xz//feAmawiIyNxd3fnqaeeAmDr1q0kJSWxbNkyrNZfhjHHjRvH7Nmzcyv4CiGKXt7JEBaLhX79+hEWFoYj/TrxG+ZydftScDqweHizcvlmevU1K+P6V/DglbHh1KvuT0XfW/8Yvhe5ullsFyAGc8yoFdlrpLL/5T/vuQBKKQ/Mbr3Xtdb3frXEIuZKyfeb1alThz/96U/MnTvX5ec4nU5iY2N57bXXGDduXKEL9PLq0qULp0+fZsqUKcTHx2MYBmfOnOGzzz7LLTc/Z84c+vbtS9WqVQkKCsr9N3ToUGbPni1TzoUoJgkJCcyYMeOGyRDt2rYheecKznzwHFdjF4HTiW+rHrzvfJh3VyWwee/53PatGgeVmeQELr5Baa27FeEz+wJOzNmA5Y4rJd/zM3z4cNatW8fWrVsLvObw4cO5M3dsNhs1a9bkqaeeYsSIETdc93//93+4ubnd0n7ZsmVUq1aNWbNm8e677xIdHU1aWhqVK1emb9++/Pa3vyU+Pp5Vq1bx+eef39I+OjqaKVOmsHz5cqKjo138iQghXHHixAnmzZtHWloaQUFBjBgxgoCAAM7Pmkzaib0AeNZ+gCq9nsCzegN6BJzAY/c5qgXe+115BXG55LtSqirwHNAc883rIPCx1vp4oQ1vvc8MIElr/eIdtKmHlHwXQpRDhmEQGxvL8uXLc7vrhw0bljtmnbxzBZfWf8syexiqUy96ta8HgNNpYLGYE6XuZYWVfHd1HVQ45tjTUOAKcBmIBvYqpe6oiw9oD2y6wzZCCFHuZGVl8eOPP7Js2TIMw6BDRDg9gzJJ27k09xq/1j042/GPLL8QzPKY07k7x1itlns+Od2Oq5Mk3ga+AZ7NO26klHoPeBO4ky7AesC5O7heCCHKnZSUFObMmcPZs2ex2Wz0DqlP0MG5pKQmY9g8OeDego7tGmGxutGpbX3SHVa6tKlV5pNSXq4mqHbAU/lMangX2HEnD9RaV7iT64UQoryJi4tjzpw5XLt2Df8K3nTzuYT/3p04ASOoEW8fbULSD4cJbVEXHy93rFYLfbK79u4nriao85hvPvqm4w2Au168K4QQ4kY7d+5kyZIlOBwOqvtY6Ji+He8MB7aKQQR0fxSfppEEzYihfc2KpR1qsXM1QX0JfKSU+h2QM40sEvhP9jkhhBC/gsPhYOnSpezYYXZKtWvXjpArW0k768byjNY8PPI5fAP8AXj9qfb3VVdeQVxNUH8HagBzMSdWWAA7Zhffq8UTmhBClA8pKSnMnTuXuLg43NzcGDBgAKGhodgT2vDOtz+z8ch1mp9KpnN2gioPyQlcXweVCTytlJoIKMxdII5qrdOKMzghhLjfnT59mrmzZ3E9LQMfMgmvZKVGXQWAe0B1Hn3Qn0ccztxyGOVJYSXf+wMrtdb27K9vVlsp84co9aCEEOLOGIZBzJoVrNywFScQzDXCvZOZH9eCbUsOMnF0WwCqBZbfeWWFvUEtAqoBl7K/LogB3LotgRBCiHylJ8Wz4KtP0PHpADzgnkSPbt2wN+pKwoxYejerWsoR3hsKTFBaa2t+X4t707vvvsvBgweZNq3w/XdzVm1v27YNf3//EopOCJEjMTGROd/M5mJ8Om44qeftzoPPTcbNx/z/cdrLPbBay8cY0+24XPJdCCHE3TEMJ6mHt3POWpnvvvuO9PR0/H28OJ4UxPZrVeiZ5ka17C3zJDn9orAxqMuY3Xe3pbUOLrKI7nNxcXEMGTKEF154genTp2O323n++eexWq1Mnz6dzMxMnn32WcaOHcvmzZt5++23OXHiBDVr1mTChAn07ds39z6vvvoqe/fupUGDBjRo0OCG58ydO5cZM2aQkJBASEgIr7/+OrVr1y6NjyxEuZZ2ch9XVs5kx4Xr7HGaJXWaNGnC0KFD2aETqFfDv1yPMxWmsDeol3AxQd1rZs2axZEjRVJb8bYaN27MyJEj76hNSkoK+/fvZ82aNaxatYqJEycyePBgVq9ezYYNG3j++edp2bIl48aNY8qUKfTu3Ztt27Yxfvx4goKCaNu2LS+88ALNmjXj448/RmvNk08+Sbt25raIK1as4H//+x8ffvghjRs35rPPPuPpp59m0aLChhKFEEUp80ocCau/IPHIbjY6a3POqIZhQJMW7RjxYH8sFgsdW9Uo7TDvaYWNQX1egnGUO+PHj88tBuhwOBgzZgweHh5069YNh8PBp59+SkREBP37mxMoIyMjGThwIN9//z3BwcHs37+fTz75BA8PD1q2bMngwYM5e/YsYL49jRkzhubNmwPwzDPP8OWXXxITE0PdunVL7TMLUR5kXUskcf1cUnav4orTk/XOJlw33HGzeXDe2YiBLdqVm3VMv1ZhXXwuV8fTWt95LfJidKdvNKWhUqVKALl1mfz8zDUOORVq09PTqVmz5g1tatWqRUxMDJcvX8bT05PKlSvfcC4nQZ07d45p06bx0Ucf5Z632+2cO3dOEpQQxezagY0k71yBNgLZ4ayJE6hZsyZDhj5IxYr+uNtk0rOrCuviu15iUZRDt/sLql27dmzfvv2GY2fOnKFKlSpUrVqVjIwM4uPjCQwMBODixYu51wUHBzNmzJgbChUeO3aMGjVqEB8fX4SfQghhOB3Yr8ThEWz+8efdsjtr1u/hbKoDgLCwMHr37o3NJnPS7lRhXXyPl2Qg4kZRUVFMnz6dJUuW0KdPH2JjY1m4cCHvvfceNWvWJDw8nClTpjB58mROnTrFd999R5s2bQAYMmQIH3zwAWFhYTRo0IBFixbxyiuvsGjRIvmfRIgiYhgGqUd3kPDTl2SlJOIY+g/8/TyYN28eV1IdWKxudO/Vl6j2d1oyT+QorItvKjBZa309++uCGFrrPxR9aOWbzWZj2rRpvP3227z66qtUrVqVyZMnExUVBcB//vMfXn31VTp06ECNGjXo2bMnCQkJgJmgkpOTGT9+PJcuXaJOnTq8//771KtXj7i4uNL8WELcF9LPHiHhpy9IP/0zAImGL/O//JEK7olkZWURFBTE8OHDCQoKKuVIy7YCS74rpdYAQ7XWSdlfF8TQWncvluh+iaUeUvJdCFHK7AnnSVg7i+sHNwNg9fbFt/0w3ll7Hne72c3eqlUr+vfvj4eHR2mGWmYUVvK9sC6+bvl9LYQQ5dWlhe+REXeILGz4hfXH2qwb8xYuxt1+CZvNRv/+/WndurXM0isiLg9IKKUqACOA5kAmcACYk73TuRBC3HecmWkY9kzcKpjFAQO6PsL6eXP56mJTIi9WJmn7V9jtdgIDA3nooYeoVq1aKUd8f3EpQSmlWgJrMRPTXsyaUI8Df1VK9dNaHyq2CIUQooQZjixSdq8mccNcLNWb4t//t1Ty88S7bgvqPliV0CVLuHw8FoCWLVsyYMAAPD09Sznq+4+rb1AfAwuA/6e1tgMopbyBT4APgS7FE54QQpQcwzC4fmgLiWtnYU84D8CpQ0c5yD7GP9yOS5cusXrJPFKuXMFms9GvXz9CQ0OlS6+YuJqgWgFjcpITgNY6TSn1N2BXsUQmhBAlKO3kPhJ++oqM80cBcA+ogRE6lP/OT6FjJmzfvp3ly5eTlZVFlSpVGD58OMHBsg1pcXI1Qe0EOgGHbzreDvi5SCMSQogSlpV8hfOz/gqGkwybLzV7jcKvVXcsbjbeq5fIlg2rWLzY/FXXunVr+vXrJ7P0SkBh66DG5/k2FnhPKdUO2Ao4gBDgWWBKsUYohBDFICv5Cm5+gVgsFmz+VfBo3Y8FW86zJlXxVrUI/N1sxMXFMX/+fJKSkvDw8GDAgAGEhISUdujlxu12M8/rAtA3+1+OK8ATwBtFHJcQQhQLx/WrJG78luSdK7B2H0+9CHMIvVb/J6hV4Z8uqV4AACAASURBVCjP+3lRp6ofGzduZM2aNTidTqpXr85DDz1EQEBAKUdfvhS2Dqp+SQYihBDFyZmRRlLMj1yN+REjMx0DWLxwLZ0CmxHSyNzxYUiXRiQnJ/P1119x4sQJwKwk0KNHj9yNnUXJKayL7zGt9UxXb6SUsgCPa60/LZLIhBCiCBhZdpJ3rSBx47c4U5MB8GnUlljvjqzZkkLj+FRCGpnXHjp0iB9//JG0tDR8fHwYMmQIjRs3LsXoy7fCuvhClVIvAtOB77XW5/O7SCkVDIwEngFWFfYwpVR14AOgG5AOfKS1fu1uAhdCCFck71xO/MrPALAHNKDOgMfxrtOM3hlZdOqaRWV/L+x2OytWrMitINCwYUOGDBmCr69vaYZe7hXWxfe77EkRk4B3lFI/Y+4ecQWwAEGY08+bAEuBsVrr2Ns87wdgB1AVqA6sU0od1FrP+tWfRAghMNcyOVLisflXAcCvdU9Ob9vArDO1uWp7gPdqPQCAl6cNL08bFy9eZP78+Vy+fBmr1UrPnj1p3769rG26BxQ6zVxrvR0YpJSqD/TDnFbeCHBiTpr4H7BEa336dg9SSkUADYCO2eupTiilugJpv+oTCCFEtvQ4TcJPX5IZfxb3h6dSs0YQVg8vmo77J8HzdvNkVAOsVjPxGIbB1q1bWb16NQ6Hg8DAQB588EGqV69eyp9C5HBpHZTW+gQw7Vc+qy2wD3hdKTUWs4tvmtb67V95XyFEOZd5+QwJa78m9fA2ANLwZPanS3ntD6PwcHfD3Wbl94+0yb0+JSWFBQsWcPz4cQDatm1L7969ZW3TPaYkq9cFYC72XYf5JtUUWKaUOi9dfEKIu5GVHE/i+tmk7F0LhhOLuyd+YdG8vz2AZLsbFxNSqV3V74Y2Bw8eZOHChbkTIQYOHEjTpk1L5wOIQpVkgsoAkrXWr2d/v0cp9QkwDJAEJYS4Yxfnv0nGuSM4sVChVU+CuozA5leZl0KuE1jRG3ebNffajIwMli1bxu7duwFzIsTgwYPx8/Mr6PailJVkgjoE+CilPPKU6JD640IIlzmzMs3yF97m7LrKUcPZ9P08vrncnF7uYTziVxmAaoEVbmh3+vRpvv/+e5KSknBzc6Nnz55ERETIRIh7XEkmiJXAZeDt7OnrCngSc7skIYQokOF0cG3/BhLWfYN77Rb49/l/+Hq749O4LTWH16Pdzjj6Rta7pZ3D4WDt2rVs2rQJwzCoVq0aw4YNk1LsZcSdFCwMxZzo4I45zTyX1vq2Eyi01ulKqS7Au8B5zEkSU7XW8+8oYiFEuWEYBmnHd5sz8y6dAuDMvn0cMvbz1NBQAJrVD6RZ/cBb2l66dInvv/+eCxcuABAVFUXXrl1lR4gyxNWCha8CfwMSgJSbThu4OMNPa30cGHAnAQohyqeMCydI+OkL0k7sBcDNvwqOkMG8uTCDkItpOJ1G7pTxvJxOJ1u3buWnn37C4XBQqVIlhg4dSp06dUr6I4hfydU3qKeA17TWfy/OYIQQAsydxs9++jIYTrLcvAnu8hD+Yf2x2jx4u2ESDWtWzHf8KDExkR9++IFTp8y3rdDQUPr06SPVbssoVxNUIDC3OAMRQpRvTnsGVnczkdj8q+DxQGdW7LzEyvSW/LNedyrZzDVKjWpVuqWtYRjs2rWL5cuXk5mZSYUKFRg0aBBNmjQp0c8giparCepbYBTwevGFIoQojwyng5S9a0hc+w2VBzyHf2NzbKnmkOewuv9MfzcrwZW9C2yfkpLCwoULOXLkCADNmjVjwIAB+Pj4lEj8ovi4mqDSgFeUUsOBI0Bm3pNa698UdWBCiPtf2sl9xK+aSeZFs7TFim/m0vKxuqi6AVgsFsZGNy+wrWEY7Nu3j6VLl5Keno6Xlxf9+/enRYsWMn38PuFqgvJBFtMKIYqIPeEc8au/yN2ayM2/Cgcqd2PmLi+id8ah6hZeGPDatWssWrQIrTUAjRs3ZuDAgbLo9j7j6l58jxd3IEKI8uH64W1cnP8WOLMwbJ4EdBxGxYiBBDmsVAy5TIeWBW/WahgGBw4cYMmSJaSlpeHp6UmfPn1o3bq1vDXdh+5kHVRL4GWgOWDF3Bnif1rrzcUUmxDiPuRVpxlOdx+2JQez17Mzb3Toj9VqwccdOobUKLDdtWvXWLx4MYcOHQKgQYMGDBo0iIoVK5ZU6KKEWW9/CSil+gE7MWfzfQvMA/ww6zn1Lr7whBBlXdrpn7kw71847RkAuHlVoMa4/7LKsye169XCbncU2t4wDPbu3cu0adM4dOgQHh4eREdHM3r0aElO9zlX36D+DryhtZ6c96BS6s+YC3hXFHVgQoiyLSs5nvjVM7n+8yYAvp32EcOem4DNzYqPnz/vv9QNL4/CfwWlpKSwePHi3LGmhg0bMnDgQElM5YSrCeoBIL+ZerOBPxVdOEKIss7IspMUs5CkTd9i2DOw2NzZkNWKBadrELDjDD3D6wIUmpwMw2D37t2sWLGC9PR0GWsqp1xNUKeBUODoTcfbApeKNCIhRJmVemIPV5Z+RFaiuf9dhabtCej5GM3OGQQmpNKtbe3b3iMpKYmFCxfmFhNs3Lgx0dHR+Pv7F2vs4t7jaoJ6H5iulKoFbM0+Fgm8CkwtjsCEEGWPM/06WYkXuOisRHLzB+kzrD8A7VzokTMMg9jYWFavXo3dbsfb25u+ffvSsmVLeWsqp1ydZv4/pZQf8ApQJfvwOeAvWuv3iis4IcS9zZmVSfqZg/jUbwVAhaaRpEY8wb+WZhJ1PZg+Lt7n8uXLLFy4kDNnzgDQvHlz+vXrR4UKFW7TUtzPXJ5mnr1R7N+VUsFAmtb65l3NhRDlSOrRnVxZMYOsq5e5GPUHIju1xWKx0KLnAN5SiTSuXfm293A4HGzcuJENGzbgcDjw9fVlwIABUoJdAIUkKKXUeODT7DpO4/M5n/u1K/WghBD3h6zkK1xZ8SmpOgaAC45KzF6ylwbNH6BqgLn/nSvJKS4ujh9//JHLly8D5s7jvXr1wtu74H33RPlS2BvUS8AczMKCLxVyncv1oIQQZZfhdHB122IS183BsKdj8fCicqeH+e5IVerb3PF0d60QYEZGBmvWrCEmxkxwAQEBREdHU79+/eIMX5RBBSYorXX9/L6+mVJKRi+FKAfiV31O8rYlAFjrtaPWwGew+Qfy+3ADt3wKB+ZHa82SJUtITk7GYrHQoUMHunTpgru7e3GGLsooVyvqHgfaaa0TbjpeA9gNBBdDbEKIe0jF8GjO7o7lm4QQgiztedHfLLPuSnJKSUlh6dKlHDx4EIDq1aszcOBAqlcveN89IQobgxoERGV/Ww/4q1Iq9abLGhVTXEKIUnb9UAwpP2/Eu/cEKvp64V6pKrXG/YfG647zcE/XCgEahsH27dtZvXo1GRkZuLu70717d8LDw7FaXdppTZRjhb1B7QF+B+T8eRTKjXWgDOAa8FjxhCaEKA1ZKQlcWf5J7iSIxXEBPPH8WCwWC4EVfXhyUAuX7nPhwgUWLVrE2bNnAWjSpAn9+/eXbYqEywobgzoFdAdQSn0GvKC1Ti6pwIQQJcswnKTsWkXCT1/izEgFdy8WXg9lb3J1hqZkEODv5dJ9MjMzcydBGIaBn58fffv25YEHHpAFt+KOuFwPSillU0rVBHKm6lgAT6Ct1vqb4gpQCFH8MuPPcWXJB6Sf/hkAn0ZtqdLvGfomWhlXzR8vT9eWTB46dIilS5fmToIIDw+ne/fueHp6Fmf44j7l6iSJaOAzIL8yl4mAJCghyrBUvZX00z+T4vQis83D1O8/EIvFgnJx+7ukpCSWLl3K4cOHAXMSRHR0NDVqFFzfSYjbcXUniX9iltT4N7AaGARUA/4DvFg8oQkhipMzIw2rp7kotmLEII6cuMSHuipja7V1uSsuKyuLLVu2sH79erKysvDw8KB79+6EhYXJJAjxq7maoBoDD2mttVJqJ1BBaz1XKWUH/oxZdkMIUQY47RkkbZxHwo5VxHd9hYh2CoubjbaPjOOddDu+Ph4u3ef48eMsWbKE+Ph4AFq0aEHv3r3x8/MrzvBFOeJqgkoDnNlfHwZaAUuBHYBr802FEKUu/cxBLi+ahj3hHBiwfvEKmjdvgK+3O1arxaXklJyczMqVK9m/fz8AgYGB9O/fnwYNGhR3+KKccTVBrQdeU0r9FtgOPK2UehvoCrg8s08p9QTwIZCR5/AErfVMV+8hhLhzzsw0EtZ8TfL2ZYCBe5Va/OjogmrZCm8P17YocjgcxMTEsG7dOjIzM7HZbHTu3JnIyEhsNpf3nRbCZa7+V/UisBB4ApiOuT4qGfDArAnlqjbA21rrP95JkEKIu5d2+mfOzn8Ha2o8WN2oFDmUylEPMd7N5vJY04kTJ1i6dGnuxq5NmzalT58+VKpUqThDF+Wcq9PMjwIPKKW8tdZpSqlwoBtwRevs1XyuaQv89y7iFELcLYsVS2o8Z7ICiG/xCMO6dne56dWrV1m5ciUHDhwAzI1d+/XrR6NGsomMKH6FbXXkc5vja3K+11rfvAVSfu3cgBDgUaXUv4FU4BNgitbauNPAhRD5MwyDtLjDWIMb4uVpw7t2U9z6TuTclYo82F3d/gaYs/M2b97Mxo0bsdvt2Gw2OnXqRIcOHaQ7T5SYwv5Lu4a5nZErXOnEDsIcv5oJDAMeAH7A7CqUch1CFIGs5HhO/zANTu8mtuZIRox9EIB6bSOp50J7wzA4fPgwy5cvJzExEYBmzZrRq1cv6c4TJa6wBNWtKB+ktb4AdMlzaLdS6l3gQSRBCfGrGE4HyTuWk7B2FmSmkWa4czbuIqnpdny8XCtlceXKFZYvX87Ro0cBCAoKom/fvjI7T5SawvbiW1eUD1JKNQd+o7X+S57DHpgFEYUQdynt/AnOLHgPW8JJAHyahJHUaCgTmjV0aYui9PR01q1bR2xsLE6nE09PT7p27UpYWBhubq7N8BOiOLi61dE2Cunu01qHu3CbJOBFpVQcMANzd/TfAs+5EoMQ4lYph2K4MP8tbDgxvCtRrf8zVGgaQTUX2jqdTnbv3s3q1atJTTWHkUNDQ+nevTu+vr7FG7gQLnB1tHNRPu0aAAOA1125gdb6bHaNqamYWyRdAf6mtf7WxRiEEDfxqdeCLHdfdtrr0LTvk1RoWseldqdOnWLZsmVcuHABgDp16tC3b18pICjuKa5OM5+c3/HshbeDgHdcvM9PQDuXoxNC3OD65Qvs+X4mfp0fpWXTGrh5VaDe+Hdp4OmNp/vtu+MSExNZuXJlbmVbf39/evXqRfPmzaUUhrjn/Nr5oj8B7xZFIEKIghmOLK7GLuLy2jlUc2aydYFB85f/gNVqwduF7riMjAw2bNjA1q1bcTgcuLu706FDBzp27Ii7u2uTKIQoaa6OQeW3Jqoi5kax54s0IiHEDRKP7Obams+xXz6DG3DaS9Gqz0NYrbd/43E6nezatYs1a9Zw/fp1AEJCQujRowf+/i7W0hCilLj6BlXQmqh04PGiC0cIkSPx4gX2fP0eddLM7jhbpapU6fMUDRq1can90aNHWbFiRe72RLVr16ZPnz7UrFmz2GIWoii5mqBuXhNlAJnAAa11StGGJIQAcIs/QZ20g9gNN6ytoqnXbwRW2+13G7906RIrVqzg2LFjAFSqVImePXvSrFkzGWcSZYqrkyTWASilfAEFOMzDOq0YYxOiXLFnOVm3dhudu7TDw90Nvwfac+nEEAJCuhBU+/az81JSUli7di27du3CMAw8PT3p3Lkz4eHhsj2RKJNcHYPyxNztYRTm4lqANKXUx8CLWmtHMcUnRLlgTzjH1k/foW76cZalvsCgQZ2wWCw0GvDobdtmZmayefNmNm/ejN1ux2KxEBYWRteuXfHxyXdLTSHKBFf/rPofZu2nh4FYwApEAG9h1nb6Q3EEJ8T9zpF+naRN87kau5iaziwyLO7Uq3DdpbY5EyDWrl3LtWvXALMMRo8ePahSpUpxhi1EiXA1Qf0GGKi13pjn2HdKqQRgLpKghLgjCVdTWT9vDk3j1+KRdQ2w4NeqO7W6jMTDr3KhbQ3DQGvN6tWruXLlCgA1a9akd+/e1Knj2kJdIcqCOyn5bs/n+NUijEWIciN+9VeEXFwOgHuNJgT3eRLPGrevsXT69GlWrVrFmTNnAKhcuTI9evSQCRDivuRqgnoF+EQpNQ7YqrV2KqVaYI5L/T3vOilXakMJUd4YhsHxM4k0rBMAQL3ugzlycicV2j9Ercget00uly9fZvXq1WitAfDx8aFz5860a9dONnQV9y1XE9Q7gC+wAXAopZyAO2ABwoF/57lW/m8RIo/0lKssn/4/fFPP4vnsVGoF++NeqSoP/H4aFou10LZXr15l7dq17NmzB8MwcHd3JzIykg4dOuDp6VlCn0CI0uFqghpSrFEIcR8ysuxc3b6EpI3f0jIzFacbJBw5QK3gSIBCk1NqaiobN24kNjYWh8OBxWKhbdu2dOnSBT8/v5L6CEKUqjtdB+UNNMacxXdMFukKcSt7loONCxZQ9+wKuGZOYnCv0xL/rqOpWLvwcabMzEy2bt3K5s2bycjIAKB58+Z069aNwMDAYo9diHuJq+ug3IB/AC/wS9deplLqc+A5rXVWsUUoRBmzf/qfqXv1MADuQXUI7DEGn4ahhbbJyspi+/btbNiwIbc2U8OGDenRo4eUwBDllqtdfH8HRgNjgI2YCaoj5jqoSdn/hCiXHE6DpJR0Ait6A1A9JIzLG+Og9VBa9B2MxVrwsGxO0cB169aRnJwMQK1atejevTv169cvkfiFuFe5mqDGAE9prZfkOTZXKZUCfIQkKFFOnTx2kt1zPibFPYjRE1/AYrFQtcNAgtv3w+rhXWA7wzDYv38/a9euJSEhAYDg4GC6d+9OkyZNZMq4ELieoHyBo/kcPw7IknVR7jjSUkja/D3O7UsIMexczzxJQtI1Aiv7YbG5YyH/GkuGYXDo0CHWrl3LpUuXAAgICKBr1660aNFCEpMQebiaoLYBEzDHoPJ6DthRpBEJcQ87cPgcJ1bNp3lqLEZG9pK/eu1o1HsM3pULnl1nGAZHjx5lzZo1nD9vllDz9/enS5cutGrVStYyCZEPVxPUH4C1SqmuwNbsY+2BekDfog9LiHtPRvwFHPP+QDNSMQDv+q0I6Dqy0B0gDMPg+PHjrF27lri4OAB8fX3p1KkTbdq0kV3GhSiEq9PMtyul2gDPAM0wtz5aCLyvtZaKuuK+dfR0IrWr++Pp7oZHQFU8Klbhmt1B7f5jqawKLhxoGAYnTpxg7dq1udsS+fj4EBUVRbt27aTMuhAucPnPN631YWCiUioQcGitk4ovLCFKl2EYLJo1H/+jyzna/mn69gnHYrHQ+PHXsfr4FzhWZBgGJ0+eZN26dZw6dQoAb29vOnToQHh4OB4ety84KIQwuZyglFKvAc8CVbO/PwO8o7V+p5hiE6LEGYZB+qn9JKydRfOzh8EGl86sx9zRC9wqVCyw3c2JycvLKzcxybZEQtw5Vxfq/h2ze+8NbqwH9WellLvW+s3iC1GI4hd3KYVFC1YTnr6ZSilmqXSrT0W8wgYT0b5/ge1yuvLWrVvH6dOnATMxtW/fnoiICLy8vEokfiHuR66+QT0FPHbTOqhNSqmjwPuAJChRpl3fvojel78FwOLpQ6XIIVQM61/gWibDMDh27Bjr16/PHWPy8vIiMjKS8PBwSUxCFAFXE5QNOJPP8aOA7FwpypxT55M5fCqeXu3N3Rrqh3fi1N6F+LTqTbWuD+Lmnf9/1oZhcOTIEdavX8/Zs2cBc4wp541JuvKEKDquJqg3gWlKqZFa6zMASqkA4F+Y2x0JUWZcPneOtdPfo7rbVS41eZPgAB88qtSi4e9nYPUs+I3p0KFDrF+/ngsXLgDmrLzIyEjCwsIkMQlRDFxNUA8DDwDHsydHZAF1AA+gvVLqtzkXaq2DizxKIX6l+KtpVPJ0cnXLAq5tW0wnzwwMwJp0BgIUQL7Jyel0sn//fjZu3Mjly5cBcx1Thw4daNu2rczKE6IY3UnBwiKhlKoE7AUmaa0/L6r7CpEfwzB4/5ttOH9eSXTFQ5Bp7v7g0yScgK6P4BFUJ992WVlZ7Nmzh02bNpGYmAiYOz907NiR0NBQWcckRAlwdaHuzCJ85nSgZhHeT4iCGU46n52Br/cVyASvui0I6DYKr5pN8r08MzOTHTt2sGXLFlJSzHJnAQEBREVFERISIlsSCVGCSnSfFaXUY4A/sK8knyvKj/iracxZoenetiZNGwRhsboR1KYrGUe3E9xrDN71Q/JdZJuWlkZsbCwxMTGkpaUB5u7iUVFRNG/eHKu18NLsQoiiV2IJSilVH/gL0AFYVlLPFeXL5uWraH7wR3bEtaLp758DoFrXh6D7w/mWWE9OTmbr1q3s2LGDzMxMwKzHFBUVJWUvhChlJZKgsivyfgVM1FpfUEqVxGNFOZCabichOZ0qWRdJXPMVzU/uAxvU9j6OYRhYLBYsbreOF125coVNmzaxd+9enE4nYFawjYqKom7dupKYhLgHlNQb1GuA1lp/V0LPE+XA0TNJ/O+TZQzw2kVjp1muzOrpQ6UOQ/EPG5BvkomLi2PTpk0cOnQIAIvFQrNmzejYsSM1atQo0fiFEIUrMEEppT519SZa6yduc8kIoIZSalj2936Y66rCtdbjXX2OEHlVdZ7nt+7fYnUa4OZOxbD+VOow9JZFtoZhcPjwYTZv3py7HZGbmxutW7emQ4cOBAQElEb4QojbKOwNKu//5R7AQOAQZvHCTKAN0AqYdbuHaK2b5v1eKbUbc6PZz+8wXlFOGYbB1v0XWB1zkj8+HoHNzYpv7SbEB9XBp1YjAjo9jM0/8IY2WVlZ7N27ly1btnDlyhUAPD09CQsLIyIiAl9f39L4KEIIFxWYoLTWw3O+Vkp9hJlQ/i/vNUqpN4CmN7cVoqg5MjP4eeHX9HfsYcOmCnTrHILF6kbdp6bcMsaUlpbG9u3biY2N5dq1a4C5hql9+/a0adNGdn0QooxwdQzqEcw3ppvNBHbf6UO11q3vtI0of06eT6ZqZU/shzaSuH4O3Yx4sEJdt2NACMANySkhIYGtW7eye/du7HY7AFWrVqVDhw40b95c1jAJUca4mqAuAN2BIzcdjwZOFWlEQgBzVhxi75qVjAz6Ge+0SwB4BNcjoPtovBv88veNYRjExcWxZcsWDh48mHu8YcOGREZG0qBBA5mRJ0QZ5WqC+iswQynVHdgJWDDrQfUHhhfWUIi7EZL0E2G+ayENbJWCCegykgrNO+auZXI4HBw8eJCtW7fm7iputVoJCQmhffv2VK1atRSjF0IUBVe3OvpSKRUHjAMezT68F+istY4pruBE+ZBpd7B40wmMLDvDej4AQIPOfTl3djsBUQ/h36ZXbldeeno6O3bsIDY2luTkZMAsd9G2bVvCw8Px85PqL0LcL1xeB6W1XgOsKcZYRDl1Uh/G8dPH+LrZSYp4i0p+nnhWa0C9336Ym5iuXLlCTEwMe/bsyR1fCgwMpH379rRq1Uo2bxXiPlTYOqiprt5Ea/1y0YQjygPDMDhxLpk6fnYS18/FtncNbTydGFYbPvZEoJp5odXG0aNHiYmJ4ejRo7nt69evT2RkJI0aNZLxJSHuY4W9QYW5eA+jKAIR5UOWw8nkd1dQP34TXSscAYcdLFb8Wvekcqfh2PyrkJmZyZ49e4iNjc1dv2Sz2QgJCSEiIoLgYCk5JkR5UNg6qG45XyulHgWWaq2vlEhU4r7lZjh4JH0WXl7XwQEVmnWkcucReATWICEhgdhly9i9ezcZGRkA+Pn5ERYWRtu2bfHx8Snl6IUQJcnVMaj/Ae0BSVDijpw8n8w3S/bycO9mNKgdgMXmTqXW3TESzlCl+yg8qtbn2LFjxC6fxZEjv6xiqF27NhERETRt2lTWLwlRTrmaoGKAocC/ijEWcZ8xHHYOLv2WPud+IubHrjSY8BQA1Xs/SkamnV27d7Nt3mISEhIAc3+8li1bEh4eTvXq1UszdCHEPcDVBOUE/qGU+jNwAkjLe1JrHV7UgYmy6dzla6RnZBIUv5vEDfNQVy+BFaICLgNw8eJFtm3bxt69e3Nn4/n7+9OuXTvatGlDhQoVSjN8IcQ95E7eoGS9kyhU7IFzLP16LgP99oEzCQD3KrXwi/oNpx1+rPz0U86cOZN7ff369QkP///t3Xl4XNV5x/HvaGzJlrzK+4qX2K8s20KLjcFAQ3BY44QsQJpASEggS2n6hJSkBZqQNBASaGhJ2jSEkibEBR6WQsFAAk+MwWZxwBte5BdsI2zwLhvLu2XN9I9zZU8EHmQJ6Y6s3+d55sG6Z+bO+3Jn5p1z5t5zTmL8+PFasVZE3qW5F+r+sPHfZtYLyHP3d9osKukwDtY3kN81/EY09qDzhaJ5kIJkn0Ekqz7Bql1JFj/xAnv37gXCbOJlZWVMnTqVAQMGxBm6iOS4Zl+oa2bfAK4DhkZ/bwFud3f9LtUJ1e05yB0PLWXXxhpu+M6FJPMSFJedzp5Xn6F24ERW1taz+o9HOt2DBg1i6tSpTJ48mfz8/PgCF5EOo1kFysyuIayKexMwnzAX36nAP5rZPne/ve1ClFyTTqeg5mVOX/dbelPH2jXTGDy4L4sWLWLR9r7U1YTVapPJJKWlpUydOpXhw4froloROSbN7UFdBXzd3e/N2Pa8mb0J3AioQB3nVq9/hyfmr+Gy0t3sWvAw9VvX0x/Y1G0o6+Y/xer1G0inwzXbxcXFVFVVUV5ermuXRKTFmlugBhBW0m1qITD8gwtHclEqlWLOPbOYduAVtq/dxd50F9bmj2I1/dm15yDseZu8vDxKSkqYMmUKo0ePVm9JRFqtuQVqOWFZjZubbP8sYRl4Oc6sWFvLCYN70qMwn7y8PE7rvYGtW+GZhPH2aasMtAAAEKBJREFUoQLS+wAO0rdvXyorKykvL9cS6iLygWpugfo+8LiZnQK8GG07BTgX+HRbBCbx+f3DC9i98EmGV53OaWdUsnjxYhbv6sPuVAGkwrpLJWZUVVVpQUARaTPNPc38KTObAXyTsB7UPqAamOruS9swPmkH6XSaQw0pqNvMOy89xrTqZ1hfUMSqVfP4+avzD9+vX79+VFRUUF5ergtqRaTNZVtu41xgnrvvAXD354Dn2iswaR+r1+3g0QefZHqX5XSpW8fqVF/eSI/jIF3gYJhFvLS0lMrKSkaOHKnekoi0m2w9qMeBQ2b2CjAnur3g7gfaJTJpF/XLnsT2zOXPqWJ2MO7w9iFDhlBRUcHkyZPp1q1bjBGKSGeVrUD1J1zrdApwGnA1kGdmL3GkYC1w94Y2j1I+EOl0moWLX2NDzTomTB7FkiVLWLVqDanUMAC6dSugrOxEKioqGDx4cMzRikhnl209qB3A7OiGmSWBSkLBOgX4MtDfzOa5+8faIVZpoXQ6zYG3VvHa3EdZ+8Z61qb7snjZCwAkEgnGjh1LRUUFZkaXLs2eXEREpE01+9PI3RvM7C1gI7AFWAcMBMa0UWzSSvv27GHZ04/xTs0SXtuZppZCwiVt0KdPHyorKznxxBPp1atXvIGKiLyHrAXKzHoAZwAfBc4CSoD1wDPAXcDn3X1DG8cox6ihoYGVf57HgqdnszFdRIruAOQn8yidUELlSSdr6iERyXnZzuKbB5wE7ADmEqYzmuPuq9snNDkWGzZt55X580l278KKFcvZt28f0BNIM7hPL6af8RFKSifStWvXuEMVEWmWbD2oU4G3gN8QToh40d3rW/NkZjYT+DEwmjBMeIu739GafXZWDQ0pksk8tqytZtHcP7Ji/VZ2c2SW8IEDBzKxZDwVU06iZ8+eMUYqItIy2QrUGMLQ3gzgG0CRmc0H/kQoWIvcPd3cJzKzIcCDwKfc/UkzqyRMOPuyuy9qcQadTDqd5tbfPMvBdX+mX/c9bDnQuNBfPgU0MGL0eGac/VEGDRqkITwR6dCyncVXA/xXdMPMTgTOJBSs7wH1ZjYX+JO7//L9nsjdN5rZAHffZWZ5QD/gELCrtUkczzZu28OiVZs5e9oI3J1Xlyxm/1trSOcl2HIgjy6kGF1cSMW06diUU7UyrYgcN47lLL6lwFIzux2oAi4nTHv0SeB9C1S0j11mVgjsjJ77p+7++jFH3UnsO1DPD/71AYYkN7D0OaivDyOsCWBowSEmTyih/MyZdOvZO95ARUTawPsWKDMbDkwDTo7+W0no+bxAWAtq7jE+536gCCgDnjCz1939rmPcx3EnlUrz6uqtvLR8I+dV9Wbpi/OoXvMGQ/PDKGp9PQwbNozJkyczYfxYevXtH3PEIiJtK9tZfA8RCtIQwjDc88BjwDXAwpbOIOHuKeAg8IqZ/Rq4gHDKeqeVTqfZsHED997zMD2o5bfLjrT1Yj/jiguonPFxhpZWxRekiEg7y9aDKgD+jdBDWhQVlhYzsw8Dt7l75qdsAfBOa/bbEaXTaRb7Vp5ZUE358Aaqq1dSW1tLYQJSQCEHGdPtIJMmTWL09HPI76tph0Sk88l2ksTMD/i5lgDDzOzbhGuqpgFfAT71AT9PTqutrWX5smU8+9wLpNP1zK8J24uKihjTK8mYwgbGTb+AwtFlJBI64UFEOq92m3jN3Xea2fnAz4EbCDNSXOHuz7ZXDHGZ85Lz/EsLKU5uY9v2HYe353OIMcOGMPXMcxk1apTOwBMRydCuM4NG1zud1p7PGZft27ezYsUKVq5cyaZNmwDYBnSlgRGJnYzpmcf4imn0KT+Trn0GxhusiEgO0tTVH6Da2loefvJ51q11kum9h7d3SaQZzjuMLjiATa6gd9klFAwbrwtpRUSyUIFqhXQ6zVtvb2LNaqd65Qq2bN0GQBLIy0sycWIpEydOZEjeHpLpBgrHlpNIai48EZHmUIE6Rul0mo0bN1JdXc2ClxdTf2DP4bbG4bsRebuYeNbFDJh2boyRioh0bCpQzZBKpah5cx3zX1pE7aY3qaurO9xWwCFGJOoYmVfHqFEn0Lv0YxSVnEyyUGssiYi0hgrUURw6dIi1a9eyatUq3J29e4/8ptSzZ09KSkoornUGHNhC//JzKSo5mS49+sYYsYjI8UUFKsP+/ft5/fXXeX7BEjZveBPSRybL6MEBRibqKC6ZzpkXfY5EIkE6fa6uVRIRaSOdvkDt3LmTBQtfZfPbNdTU1JBKHZkwoy/7GJm3kxGJOgYNH03PiedTNOGUw2ffqTiJiLSdTleg0uk0mzdvxt1xdzZu3Hi4LZFIcMIJJ9C39jVG7XuDPiPG0XfSBRTaNA3fiYi0s05ToDZt3sKsB59i9/a3SaT2H96eJMXQxC4GTPwrZpx3NoWFhRzcso5kUW+SRVrGQkQkLp2mQD0++1H2bHubBNCdeoYn6hieqGNwlwP0HFtG8fQyCgoLAcgfODLeYEVEpPMUqDM/8hGW3ns7Q9Pb6Zesp+hDFfSYcBGF46rIKyiMOzwREWmi0xSo0WPGUnzOeeR1K6Jo3BQVJRGRHNdpChRA7ynnxR2CiIg0k86TFhGRnKQCJSIiOUkFSkREcpIKlIiI5CQVKBERyUkqUCIikpM6ymnmSYBNmzbFHYeIiHyAMj7Xk03bOkqBGgJwySWXxB2HiIi0jSHAmswNHaVAvQycDmwEGt7nviIi0nEkCcXp5aYNiXQ63f7hiIiIvA+dJCEiIjlJBUpERHKSCpSIiOQkFSgREclJKlAiIpKTVKBERCQnqUCJiEhOUoESEZGc1FFmkjgqMzsJmO3uA6O/BwC3A+cAB4DfADe4e0PUfjdwMXAoYzdl7r7WzEYCdwEnA1uAb7r7E+2WDC3KZ3rUPgHYAFzn7g9GbbHmcyy5mNmvgEub7KIIuN7dfxx3LtCiY3M58E9Af2AV8PfuPj9q64j5fBO4GugHvABc5e5r48zHzM4CfgKMi573Vne/w8zygX8HLiTMPnObu9+c8biLgR8TZjB4FviSu2+JM5fW5JPx+KuBD7v7JzO2xf5aa6kO24Mys4SZXQE8BeRnNP0OGEj4wJ4EnAT8c0Z7JfBJd++RcVsbtd0HvEp4A14J3GdmY9o4FaBl+ZjZEOBxwgu3J3AVMCt6QUJM+bQkF3f/euYxAb4DrIxyiy2XluZjZmXAbcAFQB9gFvCImTW+5zpaPhcDNwGXRzE/CjxtZt2ix7Z7PmY2AngIuJHw//hzwM1mdg7wQ8CAscBU4Itmdln0uFLCB/aXonhfj+JvFNf7pkX5RI/tYWa3Aj97j13H9lprrQ5boAgH7BuEgwmAmRUC5wJXu/sWd98OfA+4MnpTdgdKgCVNd2Zm44EpwPfd/aC7zyG8Cb/S9qkALcgHuAx4zt1/5+5pd3+a8KGyI+Z8WpILGfcdC9wCfN7d6zrosRnHkfdXgvCtd1/02I6Yz2eAO939WXc/5O7/CRwEZsSYzyjgHnd/2N1T7v4yMBc4FfgicJO773D3GuBfgK9Fj7sUeMzd57v7fuBa4FQzGxfzsWlpPhC+qI4G7sjcYQ681lqlIxeoX7l7FfBKxrbGfPZkbGsABhC+kZQThvbuNLOtZrbIzGZG9ysF1rl75mNXAZPbJPp3a0k+VUCNmd1nZtvMbDEw2N13EW8+Lckl088IH4ZLo7874rH5I7AcWEb4IP8p8Fl3T9Ex88lr0tbYPp6Y8nH3ee7+9ca/zayYMKn0YsLQ3cqjxFOa2ebue4H1UXtsx6YV+QB8zt0vBDY32W3cr7VW6bAFyt03vMe23YRhi1vMrNjM+gHfj5q7E4bB5hG+QQ4lDFncb2YnAj2AvU12uRcobJsM3hV7S/IpJnTZZxFewDcDD0c9kNjyaWEuAJjZJOAswgd6o454bLoBThj3LwL+gTDEN5iOmc9DwFfNbIqZdTWzKwmjEd2JOR8AM+tN6BksABZmxPBe8WSLN/Zc4Jjzec9jGsmJfFqqwxaoLL5A+MZaTfjx85Fo+zvu/pS7n+Xur7h7vbs/BMwBPkH4dti9yb4Kgd3tFPfRHDUfwg/Zf3D32VE+9wOLgPPIzXyy5dLoy8Aj7p75TTAXc4Hs+fwA2OTuC9z9gLv/EqgBLqID5uPu9xG+AN1H6G1MAp4GdhBzPtEw1kuE3sOFwK6oKTOmzHiyxRv7sWlBPtnEnk9rHI8FagjwNXcf5O6TgLeBanffa2YfN7MvNrl/PrCf0H0eGf1O1aiEv+xWx+Go+RC66n2b3L/xzMxczCdbLo0u4C9/sIbczAWy5zMCKGhy/0NAPR0wn+iEnMfc/UPuPhj4NqFILSTGfMzsrwi9jEeAC919v7vvADYRTip4r3hWZrZFv7+NjLbHemxamE82ufpaa5YOf5r5e7gNWG5m1xBedD/lyJlgSeB2M6smvLE+C0wHrnD3dWa2FLjJzK6Ntl8AnNLeCTSRLZ+7gb81s0uBewjfzsuAi919fQ7mky2XxtOcxwDPZz7I3T0Hc4Hs+cwmDJfdT1iI7RJgIvB4jh4byJ7PDOAGMzsdqCMM/20AXnb3dBz5REPZswmXIvyiSfPvo3hfJQxzXUM4hR7Ce2W+mZ0BvEjoGS5299ei/cZybFqRz1Hl8HunWY7HAnUlcCewnTDU8otoeAV3f8TMrgfuBQYTeiAz3X1d9NjPAL8mXCuwDfiKuy9v5/ibypbPUjM7n/BB8ktgHfBpd18fPTbX8jlqLpFRwIHoDLKmci0XyH5s7ox+R7iHcB3USuD8HD42kP34/A/hh/WlhFGHPwGfcPfGFU/jyOcqwu/KN5tZ5jVB/0EooD8DVhBGin4N/ArA3ZeZ2Zejv4cReiwXZTw+rmPTonyaIRdfa82iFXVFRCQnHY+/QYmIyHFABUpERHKSCpSIiOQkFSgREclJKlAiIpKTVKBERCQnqUCJtJFoEt+t0aSfTduuN7PdZjYqhtBEOgQVKJG28y3CxfB/sbCcmY0GrifMGFATQ1wiHYIKlEgbcfdNhLWGrjCzaRlNvyCsSdZ0OhsRyaCZJETaULTY3/OE6YGmEmbOvx+ocPeV0X0uB64jTLtTTehZ/SFq6wL8CPg8YYmYWsJUXde4e4OZzQJShFVwxxKmuprbbgmKtCH1oETaUDRX3VcJk/heTlgJ9caM4vQxwiSt10f3uYuwptdJ0S6uJSz9/QXCKr3XAn8HzMx4mksJE4fOICzTIHJcOB4nixXJKe6+3MxuIyzHXQ38JKP5OuAn0VpeAKvNbAphOYu/JqzI+yV3fy5q/28z+y5hpdT/i7atdPdZbZ2HSHtTgRJpHz8krKr7I3evz9heClSZ2fcytnUlWq8nmoF/hpndSlhevYww63sy4/5r2jJwkbhoiE+kHbj7vuif+5o0dQG+A5Rn3CYS1uzBzG4EHiC8Vx8AzgaaLpXQdJ8ixwX1oETitQo4wd1XN26IelP7gVuBvwG+5e53R23dCYsJJmKIVaRdqUCJxOsW4G4zc2AOcBZwA+H3JwiLB840sxeA3oShwl68ezl5keOOhvhEYuTuDwBXA98l/O50NfA1d38wustlhLP3lgH/C6wGfgtUtXuwIu1M10GJiEhOUg9KRERykgqUiIjkJBUoERHJSSpQIiKSk1SgREQkJ6lAiYhITlKBEhGRnKQCJSIiOen/AWXrYO6zoENgAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation2(system)\n", - "plot_results(census, un, results, 'Proportional model')\n", - "savefig('figs/chap06-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well for the first 20 years, but not so well after that." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Factoring out the update function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func1(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " births = system.birth_rate * pop\n", - " deaths = system.death_rate * pop\n", - " return pop + births - deaths" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The name `update_func` refers to a function object." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update_func1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which we can confirm by checking its type." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "function" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(update_func1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation` takes the update function as a parameter and calls it just like any other function." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    t_01950.000000
    t_end2016.000000
    p_02.557629
    birth_rate0.027000
    death_rate0.010000
    \n", - "
    " - ], - "text/plain": [ - "t_0 1950.000000\n", - "t_end 2016.000000\n", - "p_0 2.557629\n", - "birth_rate 0.027000\n", - "death_rate 0.010000\n", - "dtype: float64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " birth_rate=0.027,\n", - " death_rate=0.01)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation(system, update_func1)\n", - "plot_results(census, un, results, 'Proportional model, factored')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Remember not to put parentheses after `update_func1`. What happens if you try?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining birth and death" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func2(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system.alpha = system.birth_rate - system.death_rate\n", - "\n", - "results = run_simulation(system, update_func2)\n", - "plot_results(census, un, results, 'Proportional model, combined birth and death')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", - "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", - "\n", - "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func3(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " if t < 1980:\n", - " net_growth = system.alpha1 * pop\n", - " else:\n", - " net_growth = system.alpha2 * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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14ZBgQn429Mvm85ud2B3yHNQN5zIyEi+//57br75ZubMmcPtt99Oly5dmDZtWqEn96SkJIKDg7HZbMUud+7cuTz55JPUr18fPz8/nn32WbZu3crx48cBsFgsjB07FpvNRteuXalRowaxsbH4+Pjg7e3NvHnz2LNnD7fffjs//fQTFoul2PVd7XxCCM84deoUM2bM4MCBA/j6+nL74H40P7qIrMPbSfzpk8um/XqZZsWW2DKNp9K24lv49ojfDXvpkc6/GzYwuiEDoxteNiwsuEqh87/3157XHJePjw+5ubm/G2632/H19c3/u0GDBjz//POAkYCWLVvGG2+8QUhICKNGjbps3ho1apCcnExOTs7vklRaWhq+vr74+PgQHx/PxIkTeemll/LHe3t7c+rUKby9vQkICLgsBpvNhsPhICAggNmzZzNjxgweeOAB/Pz8ePDBBxkzZkyx21rcfJKkhCg/nE4nmzdvZvny5TgcDiIiIrjjjjsIqRbM6QNLsYWEU2PYn3E6nfnH7uAujXjnq+3079SgzI7nSpugyqtatWoRHx9Py5Yt84fl5uYSHx+f31vwvffeS//+/XnooYcACA0NZdSoUezZswet9e+W2bZtW/z8/Fi7di19+/a9bNybb75JbGwss2fPpmbNmrz00kt069Ytf/zBgwdp2LAhv/zyS5Exp6Sk5Ndf5eTksGHDBp566ik6dOiAl5cXOTk5+dM6nU5SUlKuOF/BeishhGdkZGTwww8/5J9botq3p0+PLvgGhgAQfscEspzefLXmKLGnD/LCHztisVgIDfLj1TG3lunFphTxXWdDhgxhypQpHDlyBIDk5GQmT55MjRo1aNWqFQCDBg1i+vTprFixguzsbLKzs9m8eTNr166lT58+v1umj48P48eP56WXXmLlypXk5uZy6dIlZs2axffff8+4ceMAGDlyJB9++CGnT5/Gbrfz0Ucfcd9995GZmVlszElJSTzyyCNs2bIFm81GeHg4FouF4OBg6tevT3Z2NosXL8ZutzN79mzS09OvOJ8QwvNOnjzJjBkz0Frj6+vLiG7tueXEEpIWfoDTYXRw61UlgByHhcUbj7Pl1zMcOZWSP39Zl4TIHdR1Nm7cOLy8vBgzZgyJiYn4+vrSuXNnPvvss/ziufvvvx8/Pz+mTp3KhAkTcDqd3HTTTbz00kt07dq10OXefffdBAYGMmPGDJ577jmcTifNmzdn5syZREVFAfD444+Tm5vLfffdR3JyMk2bNmXmzJkEBQUVG3OjRo2YNGkSL774IgkJCYSEhPDCCy8QGRkJwAsvvMCbb77JP/7xD0aMGEG7du3cmk8I4RkFH7yNCK9Jz8BkvH+eRS5g8bZx9PBJGkcaxXfBAb48dWcbqlfzo0ndatctTktFaFGllGoIHFu5ciV169b1dDhCCFFhXbx4ke+//z6/FKdNvTBaJGzAas/G4uNHSLe7mXuqHgs3nmDC/R3o1qZOmcYTFxeXVzLUSGt93HWc3EEJIcQN4ujRo3z33Xekp6fj7+9PF78Eap3eDUDV5l0I6/Mg3kFh1P/5OD7ecSSnZXk0XklQQghRydntdtasWcP69esBaNiwIbfddhv2nUu5+GsWcY1H4AhvRnhQGAD9OjWg/c3h1Aip4smwJUEJIURlduHCBebPn8+pU6ewANHNG9HnD6OxWq04b72NQyG38s/PthMSuJt2N9ekiq83XlaLx5MTXMcEpZS6D5hRYHAVYKXWuv/1ikMIIW4Ue/bsYdGiRWRnZ1PVaqeL5RgRccfJzboDnyr+WLxtdGhRh863nKJTiwh8bV6eDvky1y1Baa2/BL7M+1sp1RZYBjx7vWIQQogbQVZWFkuWLGHXrl0A1Lck09lyiqqhNdlXcwCvvr2e//ytJwH+PlitFiY+3MnDERfOrQSllPIC2gMdgJqAHTgDbNVa7yxu3iKWZ8NIVi9rrXeVdH4hhBCFi4+PZ/78+SQlJeGFgw7WeJraLhLS9S6COw1n2sdbSLiQyMY9p+nfqew6GywNxSYopVQI8GfgCSAMOAokAl5AdaCBUuo0MB34UGvt7ltUxwEZwNSrjFsIIYQLh8PBxo0bWb16NQ6HgxDvXLo6jxBcvxnV+jxESJ16APzptlakpGfRqkkNzwbshiITlFLqAeAVYCXwCLBCa51VYJogoBtwH7BXKTVRaz27uBUqpXwwivX+pLUu/w9hCSFEOZeamsp3874l9mQcAB07dqTrzXXZsSuWl9fbGeCfxLg7jATVIKL4B/PLk+LuoKKAKK31uaIm0FqnAv8D/qeUigAmAsUmKGAg4DDnE0IIcQ1+3bePH39YQFaOnSreFm676578t7U09m+IbdNaqvh6X/ai14qiyHfxaa2fKi45FTL9aa31k25MOgKYq7V2uLvsysSdLt8/+OADWrVqxeHDhy+bprDOAfN89913NGvWjLZt29K2bVtat27NoEGDmDlz5mVddPTu3ZtWrVrlT5f3b8CAAfnTxMbGMm7cOKKiomjbti1Dhw7lv//9b6HrHTx4MN27d7/shbFCiLKXnZ3Ngq+/4Nt588jKsVPbkkq/sBx+PvjbuzXrhQcy68X+/HFYiwqXnKAErfiUUjWBVoANuGxLtdaLS7DOzsCLJZj+hpSVlcX48eOZO3cuPj4+bs3TtGlTfvjB6KTR6XTyyy+/MH78eFJTUy/rmPCdd9753VvP8zgcDh577DGGDh3KW2+9hZ+fHzt37mTcuHH4+Phw11135U+b9xLYGjVqsGzZMoYMGXINWyyEcNeJwweYP+9bUrMcWHEQ5Z9G694jGDsnhdxDR7m1VT2a1DPemRdU1b3zR3nkbiu+RzAaNBTWI54To9GEuxoC8SWY/oYUHR1NfHw87733HhMmTCjx/BaLhXbt2vHaa6/x+OOP88gjj1zxpbBgPNQXGxvL0KFDqVLFeFCvbdu2TJgwgezs7MumnTNnDv369SMsLIwvvvhCEpQQZczhcLB21QpiNmzEiYUQSyaD2kVyU/97sfr4cW/yQfx9vWlUu+LUMxXH3TuoZ4GPgee01mnXskKtddVrmd9dR1//Q5Hjqg8aQ1A749ng1B3LOL+k4PPDv2k8cX7+57iZz5J95miR40uTv78/kydPZvTo0fTo0YNOna7uOYXo6GisViu//PJLoV3CFxQWFkbHjh15+OGHGT58eH4x38iRIy+bLikpiZUrV7JkyRICAwOZPHkye/bsuayfKyFE6blw4QLfffcdcXFxgIWb/HKISW5Oz5sHYvXxA+DOPk09G2Qpc7c/qHrAf641OYmSadOmDWPGjOHvf/87qampV7WMvP6XLl68mD9s/Pjx+Z0G5v2bMmVK/viZM2fy2GOPsXv3bp566ik6d+7M2LFjOXPmTP40CxYsIDo6moiICAICAhg+fHiR9VRCiKuXezGZNbPeZtrUD4mLiyMwMJDR996Dre1o4rOD2HM40dMhlhl376CWAX2AQ2UYS6ly984mqF3//LupK6n7yJvXEhLgfpfvecaOHcv69euZNGnSZfU/7rLb7aSmphIREZE/7K233iqyDiovxtGjRzN69Giys7PZvn077733Hk8//TRz5szB6XQyd+5cEhIS6NKlC2DUmWVlZTFhwgTCwsJKHKcQ4nJOh53TGxexZM0G4uxGwVNE3cbcf+8dVKlShYh6ObRrFk5kvRAPR1p23E1Qu4B3lFLDgYPAZZURWuuSV5LcoNzp8t2Vl5cXb775JiNGjMDf37/E69uyZQtOp5OmTd279Z8zZw7ffPMNCxYsAIxkFR0djc1m49FHHwVg06ZNJCcns3TpUqzW327Cx4wZwzfffJPfg68Q4upknjzA9gWziLngQxZVsVmcxGeEc/Z8bR7xNYrz/P1slTo5gftFfD2AzRgvd22N+YyU+a/wds+iUO50+V5Q/fr1ef7555k7d67b63E4HGzZsoUXX3yRMWPGEBAQ4NZ8PXr04MSJE7zxxhskJibidDo5efIks2bNyu9ufs6cOQwcOJDw8HBq1KiR/++2227jm2++kSbnQlwl+6VU4ha8z/xZ01hxwZ8svKlfM5THx/2ZGje15eFhLbBWvNbiV82tOyitda+yDuRG4U6X74W58847Wbt2LZs2bSpymoMHD9K2bVsAvL29qVOnDo8++iijRo26bLq//e1veHn9vuHl0qVLqVWrFl999RUffPABQ4cOJSMjg5CQEAYOHMif//xnEhMTWbFiBZ999tnv5h86dChvvPEGP/30E0OHDnVzjwgh8hw/eYoFexJId4ZiAXr16kXXbt2wWCz849HOng7vunO7y3elVDjwJNAC485rP/Cx1vposTOWAunyXQhRWWXE7sNasyFr1q3PvwB1WKrwa1p9xj/Yg063RFxhCRXbNXf5rpTqCCwHTgIbMR7UHQo8pZTqqbXeVqoRCyFEJZebco7EFbM5sX8n623NSc3MwWKx0K1bN2o1vAWr1QvVINTTYXqUu40k3ga+Bp5wfcGrUmoK8CYgRYBCCOEGR04WKZt+IHHDAnZnh7DX2QSnPQebXyAPjr6bOnXqeDrEcsPdBNUBeLSQt49/AGwv3ZCEEKLycTqdXDq4hcTln3EuOZUN9gZcwHhbS0JOTTp16CrJqQB3E9RpjFcU6QLDGwPy8K4QQlxBZuxeTn87mX3OmuxyROLEQrVq1Rg5ciRBIeGEBPl5OsRyx90E9QXwkVLqL0BeM7Jo4F1znBBCiAKc9lwsXsZpNs0/nJ+8W3M+yyiIataiNSOHD3b7ZdA3IncT1OtAbWAuRgs+C5CDUcQ3sWxCE0KIisnpsJO2axUX1s0l7K6J7DwSx5o1a7DbnVhtVWjYLJrbhnXB5u3uo6g3Jnefg8oGHlNKjQcURnfth7XWGWUZnBBCVDQZJ34lcdmnZJ89RorTl68+mp3/6p22bdvSv39//PykOM8dxXX5PhhYrrXOMT8XVE8pBZS4PyghhKh0clISSFr5Ben7N+JwwgGfhuzICMaJEy9bFUbddTtNmjTxdJgVSnF3UIuAWkCC+bkoJe0PSgghKpWLv27g3MIpOHOzuWAJYGuV5pxNywSc1G6gGH33iPz+1YT7ikxQWmtrYZ9F+fTBBx+wf9iaHkwAACAASURBVP9+pk6dWux0eU9tb9261a0ODIUQV+YbcRO5dgcrshUJVj/IySQoKIhhw4bJXdM1cLvLdyGEEIbMUwdJ272a6gMfx2KxcD7TyfLgbpw7nwg4adO2LQMHDCi0Cx3hvuLqoM5hFN9dkda6ZqlFVMnFxcUxcuRInn76aaZPn05OTg5PPfUUVquV6dOnk52dzRNPPMFDDz3Exo0befvttzl27Bh16tRh3LhxDBw4MH85EydOZPfu3TRu3JjGjRtftp65c+cyc+ZMkpKSaNWqFS+//DL16tXzxCYLUWnkpiaStPq/XNy7DoDlsb7UjKzHzxs34nA4CA6uxogRw2nUqJGHI60ciruDehY3E1R589VXX3Ho0PXpWzEyMpJ77723RPOkpaWxd+9eVq9ezYoVKxg/fjwjRoxg5cqVxMTE8NRTT9GyZUvGjBnDG2+8Qf/+/dm6dStjx46lRo0atG/fnqeffprmzZvz8ccfo7XmkUceoUMHo+eTZcuW8f777zNjxgwiIyOZNWsWjz32GIsWFVeVKIQoiiM7k+RNP5Dy8/c4c7PBy8aK7OYciz+N39lYADp27EifPn3kuaZSVFwd1GfXMY4bztixY/M7A7Tb7TzwwAP4+PjQq1cv7HY7n376KZ06dWLwYKMBZXR0NMOGDWPBggXUrFmTvXv38sknn+Dj40PLli0ZMWIEp06dAoy7pwceeIAWLVoA8Pjjj/PFF1+wefNmGjRo4LFtFqIiurh/I4nLZ2FPSwLAJ7ITu3xu4vSuvfh5ZRMWFsbw4cOpX7++hyOtfIor4nO7dzytdcn7Ii9DJb2j8YRq1aoB5PfLFBgYCJDfQ21mZubv3stVt25dNm/ezLlz5/D19SUkJOSycXkJKj4+nqlTp/LRRx/lj8/JySE+Pl4SlBAllJucgD0tiVOOMBJu6sfJ+FOkpOzFarXSpUsXunfvjre3VOeXheL2avp1i+IGZLEU3y1mhw4d2Lbt8l5MTp48SfXq1QkPDycrK4vExETCwsIAOHv2bP50NWvW5IEHHriso8IjR45Qu3ZtEhMTS3ErhKh8cpITyDkfh3+TdgAERw3hwDkH326OI+zQrwBEREQwfPhwatWq5clQK73iivgevp6BiMt17dqV6dOns3jxYgYMGMCWLVtYuHAhU6ZMoU6dOnTs2JE33niDSZMmERsby3fffUe7dsYBNXLkSKZNm0ZUVBSNGzdm0aJFPPfccyxatEiu9IQogiPrEskbvyNl8yKcXjZO93yRWztEsufX/cToI4T5XMLb25uePXsSHR2dX9ohyk5xRXyTgUla63Tzc1GcWuv/K/3Qbmze3t5MnTqVt99+m4kTJxIeHs6kSZPo2rUrAO+++y4TJ07k1ltvpXbt2vTt25ekJKOMfOTIkaSmpjJ27FgSEhKoX78+H374IQ0bNiQuLs6TmyVEueN02EnbuZIL677Bnp4CwLZLdVm+YBuH9m0iNvYYAI0aNWLo0KGEht7YnQheT0V2+a6UWg3cprVONj8Xxam17l0m0f0WS0Oky3chRCm7dHQXSSs/IzvhBAC+dRUhvR/krfm/QNphnA47fn5+9O/fnzZt2lyxaF6U3FV1+a617lXYZyGEqAycTgdJq/9LdsIJkgkkov+DOGo35YtFi3CmnAGgRYsWDBw4kICAAA9He2Nyu0JCKVUVGAW0ALKBfcAc803nQghR7tnTU3A6HHgHhmCxWKne/48s/X4FXxyvRdftp0lbEoPT6SQ4OJghQ4YQGRnp6ZBvaG4lKKVUS2ANRmLajdEn1MPAK0qpQVrrA2UWoRBCXCNnbg4p2xaTvH4elnqtqNJ/HDVD/PGr14xa0dl0uLSc1LPpWCwWoqOj6dmzpzxwWw64ewf1MfA98CetdQ6AUqoK8AkwA+hRNuEJIcTVczqdpB/4maRVX5CbnADA/v0n2XNpF0/c3pylS5dy4IBxfR0REcGwYcOIiIjwZMjChbsJqjXwQF5yAtBaZyilXgV+cXdlSqkIYBrQC8gEPtJav1iCeIUQwi2Zpw6SuGI2WXFGArLVqIet8z189nUC7dLjmDp1DdnZ2flvcOnYsaM0HS9n3E1QO4BuwMECwzsAv5ZgfT8A24FwIAJYq5Tar7X+qgTLEEKIYuWmJhL/+QvgsJPlVZU6/UcT2KYP8afP0Kv+L5xLMB5sb9asGQMHDpSuZ8qp4p6DGuvy5xZgilKqA7AJsAOtgCeAN9xZkVKqE9AY6GLeiR1TSvXE6D5eCCGuiSM7E4vNF4vFgndQGP5t+rN48ykWJzVnvK0ZiUuW5r+dJTg4mMGDB9O0aVMPRy2Kc6W3mbs6Aww0/+U5D/wReM2NdbUH9gAvK6Uewijim6q1ftvtaIUQogDXB20D+j5OaItOWCwWag16lPCgoww8eZiYpXO4dCkdq9VK586d6dGjhzSCqACKew6qtDs0CcUoJlyLcSd1M7BUKXVaiviEEFfj0tGdJK6YTc4540Hb1fMXEOGoT5dWtTl37hznD8dw6vhxAOrXr8+QIUOoWVO6r6soiivie1BrPdvdBSmlLMDDWutPi5gkC0jVWr9s/r1LKfUJcDsgCUoI4bbs83EkrphNxpEdAHgH1yS27gBmx0Dffae4dHYfmzZtwuFw4O/vT79+/WjdurW8CaKCKa6Ir61S6hlgOrBAa326sImUUjWBe4HHgRXFLO8A4K+U8nF5uFfeXCqEKJH0Q9s4++0b4HTg9PYjrPudBEUNpjZe/ClgCwf3rGfjwVQA2rVrR58+ffD39/dw1OJqFFfE9xezUcRLwHtKqV8x3h5xHrAANTCanzcFlgAPaa23FLOu5cA54G0z8SngEYyGFkII4ZYqDVrg9K/GxqTqbMztxLvthpKcmsqSJUs4fPgwYDzTNGTIkN/1qSYqlmLvYLTW24DhSqlGwCCMZuVNAAdGo4n3gcVa6xNXWpHWOlMp1QP4ADiN0UhistZ6/rVtghCiMrt0eAfJm36g1p1/x+pbBatPFRr86X2mfbSVVrUDWLNmNdu2bsZuN17s2rt3b9q3by/PNFUCbhWxaa2PAVOvdWVa66PAkGtdjhCi8stOPEXi8llkHDHeBTBnynSGj32SqlVsePn68VDvMJYvX8bmVKM4r3Xr1vTr14+qVat6MmxRiqQOSAhRrjiyLnFh/bekbPkfOOxYfP3ZaGnPt/H1sW44Sp82YSxZsoSjR48CUKtWLQYPHky9evU8HLkobZKghBDlRrrezPklH2FPTwYsBLbpS2jPe7FfcOKnT1M15zjTps3F4XDg5+dHnz59aNeunRTnVVKSoIQQ5YbF6o09PZmTzprENRrOfUMG4XQ6uXhoF8d+WUF6ejogrfNuFJKghBAeY7+USsaxXQS06AaAf2R7rAPG886cBJomVqXbyTiWL/uJuLg4AOrVq8egQYPkjeM3iJJ0WNgW43VFNoxm5vm01tfcgEIIceNwOuyk7ljOhbVf48hKZ9c5G116dgagYYdoXgmI47jezqxPZwIQEBBA3759adWqlTxsewNxt8PCicCrQBKQVmC0k1Jo4SeEuDFkxmnOL/2Y7LPHADjiqMPXiw9Ro7HipjpBbN68mbVr15KdnY3VaqVTp0706NEDX19fD0curjd376AeBV7UWr9elsEIISov+6VUklZ9QdquVQB4B9cgrO/DrDtUlfCTyZw/c4JlP8aQmJgIQNOmTenfvz9hYWGeDFt4kLsJKgyYW5aBCCEqt7zk5MCKo8VAGg4ZjdXmS//gs3in7GT5kiMAVK9enQEDBtCkSRMPRyw8zd0ENQ+4D3i57EIRQlQ2TnsuFi/jNBPSfRSxsaeZdrwpIbENmZSdy9rlK9m2bRtOpxNfX1969OhBx44d8fLy8mzgolxwN0FlAM8ppe4EDgHZriO11neVdmBCiIrLkZVB0tqvyYrThNzzCv5VfPEOCuOWx16mxbydtKiZzpQpU8jMzMRisdChQwd69eolzcbFZdxNUP5IlxhCiCtwOp2k600kLvsUe1oSTiz85/1veXb8vXhZLZw4fhSfpE1sOmTUMzVu3JgBAwZIH02iUO6+i+/hsg5ECFGx5SQncH7px/l9NNkimjD9dBsOJAWwbfchDu7ZzLFjRsu90NBQ+vfvT9OmTaXZuChSSZ6DaglMAFoAVoz+nd7XWm8so9iEEBVE6valJK78HGdOFhZff8J63Udg237coeM5uHcrP/34DQB+fn706NGDqKgoqWcSV+Tuc1CDgB8x+nSah/Gg7q3AWqXUEK31srILUQhR3jmdTpw5WezIaoCt/WgGtbyFdTHr2bBhAzk5OVitVqKioujRowdVqlTxdLiignD3Dup14DWt9STXgUqpFzAe4JUEJcQNxJGdSfbZY/jVawZAULv+xGYE8uXCJAYlJjBlyhTS0oxn+pVS9O3bl+rVq3syZFEBuZugmgGFtdT7Bni+9MIRQpR3Gcd2c27xNHLTUznT/Tlu7XwLFqsXAXVq07fBHk4fTgCMXm379+9Pw4YNPRuwqLDcTVAngLbA4QLD2wMJpRqREKJcsmemk7RiNmm7VgJwyh7CVz/uJDgkgJ3bNuR3tx4UFESfPn1o2bKlNIAQ18TdBPUhMF0pVRfYZA6LBiYCk8siMCFE+ZGuN3N+6cfYL14AL29Cut3FPF2deilHmPfNbAB8fX3p0qULnTt3xmazeThiURm428z8faVUIPAckFeQHA/8Q2s9payCE0J4XtKar0neMA8Aa3gkoYMeZ+uBY+ScXk9ubi5Wq5UOHTrQvXt36W5dlCq3m5mbL4p9XSlVE8jQWhd8q7kQohKq2iyahJ8X8UPaLeRcaozPl/PIyMgAoHnz5vTp04fQ0FAPRykqoyITlFJqLPCp1jrT/FxwfP5n6Q9KiMrDfimVi/vWE9RhEBaLBZ+aDUjq/hRZa9bhvHCADKBBgwb07duXunXrejpcUYkVdwf1LDAHyDQ/F0X6gxKikkg/sJlzS2bguJTC91sSiO53K6tWreLs2bMA1KxZkz59+hAZGSkNIESZKzJBaa0bFfa5IKWU/EqFqODsGWkkLvuUi3vXAbArty4Hzp7l+NdfA0bLvJ49e9K6dWusVqsnQxU3EHffJHEU6KC1TiowvDawE5A3PQpRQV06vJ2ERdNwpF8gxRrAvpB2HDmbjJ9XJn5+fnTr1o2oqChpmSeuu+LqoIYDXc0/GwKvKKUuFZhMehQTogK7uDeGhB/e46LTxi/ezYjN9sF5NhmbzUanTp3o0qULfn5+ng5T3KCKu4PaBfwF4717YDyo69oPlBO4CDxYNqEJIcqao05zfrY24XCWP9jBarXQvn17unfvTmBgoKfDEze44uqgYoHeAEqpWcDTWuvU6xWYEKL0OXKySN64gIuNe3D40H42bdpETo4/WOCWW1rSq1dPaTIuyg23+4NSSnkrpeoAee/ItwC+QHut9ddlFaAQonRknjpI3Pfvsy8pl91rDuAwC0eUUvTq1Yvw8HAPRyjE5dxtJDEUmAUUdml1AXArQSml/gjMALJcBo/TWs92Z34hRMk57TmcWzuHrRvWs9dRnUyMxg41a9Vl6OD+1KtXz8MRClE4d98k8S+MLjXeAVYCw4FawLvAMyVYXzvgba3130sSpBDi6lyKP8K6b2awJ83GJSIAqFkznK7de9GyhbrC3EJ4lrsJKhK4Q2utlVI7gKpa67lKqRzgBYxuN9zRHvjPVcQphCgBh8PBjo3rWLNyOekY78erGRpMnwGD5SFbUWG4m6AyAIf5+SDQGlgCbAeaurMApZQX0Aq4Xyn1DnAJ+AR4Q2vtLEnQQojCORwO9u3bx5o1a0hKSgJ8sDmdBNRvx5iHhspDtqJCcTdBrQNeVEr9GdgGPKaUehvoCbjbsq+GOe9s4HaMThB/MOeXVyUJcQ2cTif79u5h1dLFXLhkVPGGhobSvVs3ajeIpEaIvGVcVDzuJqhngIXAH4HpGM9HpQI+GH1CXZHW+gzQw2XQTqXUB8AfkAQlxFVxOp3s37+fNStXcC7pAgB+5HJL534M6tdV7phEheZuM/PDQDOlVBWtdYZSqiPQCzivtd7szjKUUi2Au7TW/3AZ7IPxMlohRAk4nU4OHDjA2jVrOJtgdGpdlWxutqVy3K8Drdq0leQkKrziXnXkf4Xhq/P+1loXfAVSYZKBZ5RSccBMjDdT/Bl4skQRC3EDy7tjWrduXf4bxv3JpqU1gTatWxPS++/Y/AOwWqURhKj4iruDuojxOiN3eF1pAq31KfP9fpMxmqefB17VWs9zcx1C3LDyEtPatWtJMO+YqlhyaWk5S7gli6Z3P01AZDsPRylE6SouQfUq7ZVprVcBHUp7uUJUVg6Hg19//ZWYmJj8xBQUFETXrl1p6Exie8wmbIP/SECkPGwrKp/i3sW39noGIoT4jcPhYO/evcTExHD+/HkA/LwsBFh9eWTsOPx8fQAY2HGAJ8MUoky5+6qjrRRT3Ke17lhqEQlxA7Pb7ezevZv169ebzzFBUNUq3OKMp2FWHNl2b3b9Gkento09HKkQZc/dZuaLCpmvMTAEeLk0AxLiRpSbm8vOnTtZv349KSkpAAQFBtI2MIO6ZzdjtYA9tAE57UdLchI3DHebmU8qbLj58tfhwHulGZQQN4rs7Gx27NjBxo0bSUtLA6B6WBjhNgs3J6zDPyMXi68foT3vJaj9QCzWK7ZHEqLScPcOqiirgA9KIxAhbiSZmZls3bqVTZs2cemS8ZRGeHg43bp14+abFUc+fh5vay5nA28m6qG/4R0U5uGIhbj+3K2DKuyZqGCMF8WeLtWIhKjE0tPT2bRpE1u3biUry3glUZ06dYhs2gKLNYAWLVoA0PAPT3Hm+DGio7p7MlwhPMrdO6iinonKBB4uvXCEqJxSUlL4+eef2b59O7m5uQA0bNiQrl274nPmEEmrphDnqM6ZZv+kVlhVfGrUo34NaToubmzuJqiCz0Q5gWxgn9Y6rXRDEqLyOH/+PBs2bGD37t04HEaHAE2bNqVr166E+zo5/9PHZJ74lUAr1Kpqxd8r18MRC1F+uNtIYi2AUioAUIDdGKwzyjA2ISqsU6dOsWHDBvbv3w+AxWLhlltuoWvXrqRezGXHnFm0zN4FTgdW/yBCez9Ao1Y9pZ8mIVy4Wwfli/HG8fswXvAKkKGU+hh4RmttL6P4hKhQ0tLSWLJkSX5i8vLyok2bNtx6662EhobiyM3m3KwxtLSn4sRCcPuBhPS4B68qAR6OXIjyx90ivvcx+n66G9gCWIFOwFtAFvB/ZRGcEBWF0+nkl19+YdmyZWRlZWGz2YiKiqJz5874Vw3gUmYOAFZvH0Lb9ODsgV00vn0swfUjPRy5EOWXuwnqLmCY1nq9y7DvlFJJwFwkQYkbWFJSEgsXLuT48eMAREZGMmTIEIKDgzl1Ip41U9/kfJUGPPTUH7FYLET0u4+IAQ9KcZ4QV1CSLt9zChmeUoqxCFGh2O12Nm3axJo1a8jNzcXf359BgwYZTcUddlK2LCJ77Rxa5F7iQuoJEpPvpnpIABYvm6dDF6JCcDdBPQd8opQaA2zSWjuUUrdg1Eu97vqclJt9QwlRoZ06dYqFCxfm98nUqlUrBgwYgK9fFbavXEX44R/JSYwDwBFxC5EDHiYoROqZhCgJdxPUe0AAEAPYlVIOwAZYgI7AOy7TyrtYRKWVlZXFqlWr2LJlCwDVqlVjyJAhNGnSBHt6Cuvf+gf1co6SA3iH1CKs38P4N2kvxXlCXAV3E9TIMo1CiApAa83ixYtJTU3FYrEQHR1Nz5498fY2DiOrnz/h3qlkZdvIaTGYlsPuweItxXlCXK2SPgdVBYjEaMV3RB7SFTeClJQUli5dyoEDBwCoXbs2w4YNI9vpy7xpn1C9TXf6dW+BxctG/bvHYw0IxS9Y3p0nxLVy9zkoL+CfwNP8VrSXrZT6DHhSay2Pv4tKx+FwsHnzZlavXk1OTg4+Pj707t2bDh06kHlkB3GLP6VTegI71p/B2e1lLBYL/nWk2bgQpcXdIr7XgdHAA8B6jATVBeM5qJfMf0JUGnFxcSxatCi/EUTz5s3p0asPF06e4OzXr5AZuxcbkOkXRvc+/aWOSYgy4G6CegB4VGu92GXYXKVUGvARkqBEJZGRkcGKFSvYsWMHYDSCGDx4MNX8/YmZNplWlkNkWsDqF0BItzsJaj9Amo0LUUbcTVABwOFChh8FqpdeOEJ4htPpZOfOnaxYsYJLly5htVqJjo6mR48e2Gw2Mk7up431EHaseLXsR91+9+BVJdDTYQtRqbmboLYC4zDqoFw9CWwv1YiEuM7OnDnD4sWLOXnyJGB0g1G/aQf2/ryN9h3thNhsVKnXjKo97iekWUd8wmp7OGIhbgzuJqj/A9YopXoCm8xhnYGGwMDSD0uIspeZmcnq1avZunUrTqeTgIAA+vXrR2OfSxz+/l2G2C+wZklNbrt7EADhXeVpCyGuJ3ebmW9TSrUDHgeaY7z6aCHwodZaetQVFUrB4jyLxcLNLdrQObIutp1zSTi5nyAgyy+MPu3lbkkIT3H3Dgqt9UFgvFIqDLBrrZPLLiwhykZ8fDxLliwhLs54DVH9+vWpXr0B2dsWYdex2AGrfxAhXe8kqF1/LF5uHyJCiFLm9tGnlHoReAIIN/8+CbyntX6vjGITotSkp6ezatWq/NZ5ecV5LVu25OTCj8j1icVu8SY0ehgh0bdh9avq4YiFEO4+qPs6RvHea1zeH9QLSimb1vrNsgtRiKvncDjYunUra9asITMzE6vVSkBYI7y9q9GqVSsA6vS9hwSLnRo97sI7SBqlClFeuHsH9SjwYIHnoDYopQ4DHwKSoES5c/ToUZYuXcq5c+cAaNy4MR3rhZIWMxe708KJ+C7Urx2Cl38QEcPGejhaIURB7iYob+BkIcMPAyV6GEQpVQ3YDbyktf6sJPMK4Y4LFy6wfPny/G7X/fwDGRTditCDK8jecIhQKzir1SHCP9vDkQohiuNugnoTmKqUuldrfRJAKRUK/BvjdUclMR2oU8J5hLiirKwsYmJi2LRpE3a7HZvNRo61Ojdd3E/A2g1kA15VqxHS8x4CW/XCYpWeYYQoz9xNUHcDzYCjZuOIXKA+4AN0Vkr9OW9CrXXNohailHoQCAL2XHXEQhTgcDjYuXMnq1atIj09HYDWrVvTu1dPTn3yLL72JJxeNkKiR1ItegRWnyoejlgI4Y6SdFh4TZRSjYB/ALcCS691eUIAHDt2jGXLlnHmzBljgC2Y9lG3MrRfRwCcfe8jM3YPYT3vxTtIusAQoiJx90Hd2deyErO7jv8C47XWZ5RS17I4IUhMTGT58uVorQEICgqifmgodY6vJnZ7Os6+UVgsFoJb9yS4dU/PBiuEuCrX6ynEFwGttf7uOq1PVFKXLl1i7dq1bNu2DYfDgbe3jVvbNOem89vJjVsP3hARkghOB1ikjkmIiux6JahRQG2l1O3m34EYjS46aq2lfa+4otzcXLZs2UJMTAyZmZkAZDir0dZ+mgY7vyAXsFYJJKT73QS17ScNIISoBK5LgtJa3+z6t1JqJ8ZbKD67HusXFZfT6WTv3r2sWrWK5GTj7VqNGjWiV+f2XPr2FWzkgtWb4I6DqdblDrzkDRBCVBryojFRbsXGxrJs2TLi4+MBsNgCGDl8MC1b3IzFYuFkgxb4VPEntPdobCG1PBytEKK0FZmglFKfursQrfUfS7JSrXWbkkwvbiwJCQmsXLmSgwcPAsZ783BUpd2l7ehfW9PqlmYA1B31HBZv6c1WiMqquDso1zdE+ADDgAMYnRdmA+2A1sBXZRaduKGkpKSwZs0adu3ahdPpxGbzoXPbW4hM3k3O0Y3gDZGWXUBfAElOQlRyRSYorfWdeZ+VUh9h1Bn9zXUapdRrwM0F5xWiJDIyMli/fj1btmwhNzcXi8VKhiWMTgEpNPzlc3KcDiw+flS79XaCOw71dLhCiOvE3TqoezDumAqaDewsvXDEjSQ7O5vNmzezYcMGsrKyAGjRogWqRjDWmJlUScsBi4XAtv0I6T4K74BqHo5YCHE9uZugzgC9gUMFhg8FYks1IlHp2e12duzYwbp167h48SIAwWER3HnbEOrUqUNuaiKxP3+KX/02VO/7ID4163s4YiGEJ7iboF4BZiqlegM7AAtGf1CDgTuLm1GIPA6Hg71797JmzRouXLgAQK1aEZw4ZadWwiHSsn0B8A4Ko/6Yd6VlnhA3OHdfdfSFUioOGAPcbw7eDXTXWm8uq+BE5eB0Ojlw4ACrV6/O75spLCyM7lFtqXFiPRnntwBgi98GjQYanyU5CXHDc/s5KK31amB1GcYiKhmn08nRo0dZtWpV/rNMVfwDSM6tTu/qKfit+g8ZDjsWmy/BnUdQLaqHhyMWQpQnxT0HNdndhWitJ5ROOKKyOH78OGvWrCE21qiirFq1Kt26dSPt0AEiji3B70gOWKwEtulLSPe78Q4M9XDEQojyprg7qCg3l+EsjUBE5XDy5ElWr17NsWPHAPD19aNZy/b/3969x0dVngkc/80kkzvhjgRQSLg8EJAA4RaDF7SotXitl613W23tut1Pbe3uqrVuW2/Vra1127W1tlu1rcXa6lZ70Wq5iUASkoAIj0BJAwgCIULIhdxm/3hPwhhhDIHkzCTP9/PJh+ScOWeehzMzz7znvOd9+eSCM0hKSqKKKvb/o4nknOkMPed66wBhjDmqaPdBzW/7XUSuA/6kqnt7JCoTd3bs2MHixYvZvHkzAMnJyUzInUbRqq1sL99I8PyzARg081zShp9C6ugpfoZrjIkDnb0G9QNgLmAFynzIjh07WLJkCZs2uTsQkpKSmDNnDvk5WdS+uYhpaWtpIkTtvivpP3QYgYREK07GmE7pbIFaBVwKPNSNsZg48t5777F48eL2whQKhRgyUthZFWBS1Dq6TAAAE+VJREFUdSlVv/whAIHkNE4q/DT9BtpNtsaYY9PZAtUKPCAiXwe2AvWRK1V19okOzMSmHTt2sHTp0vaBXEOhELNnz2b2zJn89YnvM7/5beo3hgkkhMic9UkGnHYZCan9PmavxhjzUcfSgrL7nfqwbdu2sWTJErZs2QK4wjRizCQuOG8+wwYPIBwOc+qgeoJ7IOPU+Qw68yoS+w/1OWpjTDzr7I2632z7XUQygaCqftBtUZmYUVFRwdKlS9t75SUlJTFr1ize3Z3KB+sXszx1EJddeiaBQIDRl7jJkZOGjfYzZGNML9HpG3VF5IvAXcAI7+/dwGOqateleplwOMyWLVtYtmwZlZWVgOuVN3PWbApm5dP87gqyy39JIO0AtXsaAXeDrRUmY8yJ1KkCJSJ3APcA9wPLcWPxFQL/ISL1qvpY94VoekrbkETLli1j586dAKSkpDBx8nRWbw1yqGIre9c/R0tNFQEgNHwsY+df6m/Qxpheq7MtqNuAW1X11xHL3hSRfwD3AVag4ljbIK7Lly9vHysvPT2dgoICZs6cyc715YwqfZyBB+poAUJDT2HQGVeRJnMIBAL+Bm+M6bU6W6CG4mbS7agEGHXiwjE9qampibKyMlasWMEHH7hLipmZmcjkGRwKDaewUAAYmTOGloQGEgaNYvCZV5E+cS6BQNDP0I0xfUBnC9TbuGk1Huyw/CrcNPAmjjQ0NFBcXMzKlSupra0F3OjihYWFjD55DM889gQTEnZQMfE+xmQNIDRgGKNufJCkrBwrTMaYHtPZAvUN4BURKQDe8pYVAOcDl3VHYObEq6mpYeXKlZSUlLTPYJuVlcW0GbOZPimHg6Wvsv/px7gwpQaAtKp3Icvd4pY8YpxvcRtj+qbOdjN/VUTOAb6Emw+qHtgAzFLV8m6Mz5wAe/fuZcWKFaxdu5aWlhYAxowZw7x583irdBdvv/QCg1/fQqDZFa3kkRMYWHg5qeNm+Bm2MaaPizbdxvnAMlWtBVDVpcDSngrMHL/KykreeustNm48fBZ20qRJFBYWMnLkSMLhVhp/dz/JKfuhGVKzpzLgtMtIGT3FOj8YY3wXrQX1CtAsIsXAG97PClU91CORmS5pbW1FVVmxYgXbt28HICEhgby8PKbNmMXaN4t4v+oQI0dCIBBk8NwLqd2+iRFnXU5yVo7P0RtjzGHRCtQQ3L1OBcA84HYgKCIrOVywVqlqS7dHaT5WY2Mj5eXlrFy5kn379gHuHqZZs2Yxc8Y0qFjD9kXfYlLd+7y5tYDpp36VQCDAsNPtPiZjTGyKNh9UNfCy94OIJAAzcAWrAPgsMERElqnqp3ogVnMENTU1rF69mpKSEurr3Ri+AwYMoKCggNFZWRwo/Sv7fv4MrXUHSAHqgxnMmpZjp/CMMTGv00MdqWqLiGwHdgK7gUpgGGDnhXywa9cuVq5cybp162htbQVg5MiRFBQUMGnSJCpeW8SBVx8mIRCmFUgankP/2QvJyD2NQELI3+CNMaYTohYoEckAzgI+ASwAJgLbgL8BTwFXq+p73Ryj8bS2tvLuu++yatUqKioqAAgEAuTm5jJeptDSksjkyeMBGJo9jveLoTJlAlMWXsXgCXnWajLGxJVovfiWAbOBamAxbjijN1R1c1efTEQWAg8A2bhW2MOq+uOu7q+vOHToEKWlpaxevZrq6mrAjSo+ffp08nPHcWj9cqpeuo/K1iymnvowocQgGeNnELz1h4wbfJLP0RtjTNdEa0EVAtuBn+E6RLylqk1dfSIRyQJ+C1yqqn8SkRm48fyKVHVNV/fbm1VVVbF69WrKyspobGwEIDOzP80poxgSbGFaTTk1zz4F4Vb6BWFUSgM1tfUM6p9OIBAk3YqTMSaORStQObhTe+cAXwTSRWQ58DquYK1R1XBnn0hVd4rIUFWtEZEgMBhoBmq6HH0v1DbVxapVq9i8+XBjdfTo0cydO5fBHGLLou8xLKGGur1AMJH03NPIzD+f7FET7TSeMabXiNaLrwL4qfeDiOQBZ+MK1j1Ak4gsBl5X1R915sm84pQG7Pee+zuquul4EugtGhoaKC8vp6ioiKqqKsDdv7S3cQCp/YZz442XA9D0wW6GJhyE9IEMyD+XzOkLSMwY6GfoxhjTLY6lF185UC4ijwH5wE24YY8uATpVoDwNQDowFfijiGxS1aeOYfteZffu3RQVFVFeXk5TkzuDmpmZyczpeWQn1vCPv71MSnMZhxovITkpkdCAYYy84X6SR4wjEEzwOXpjjOk+H1ugRGQUMAeY6/07A3dqbgVuLqjFx/KEqtoKNALFIvIT4GJcj8A+o6WlBVWlqKiovTcewMGWDFJDaXxmbAv1q39KY9MhsoIQTMkkWFcFSe6aUsoo8SlyY4zpOdF68b2AK0hZuOtEbwJ/AO4ASo51BAkRORN4VFXzIxYnAx8ca9Dx6sCBA6xZs4aSkhIOHjwIQCgUIi8vj7zx2Wx//nsMYx9169zjU0ZPIXPGuaRPmE0g0e5dMsb0LdFaUMnA93EtpDVey+d4lAEjReQruC7rc4DPAb16rJ1wOMzWrVspLi5m48aNhMOuX0ljOIXG1n58/cvX079/BuGWJprTWoBM+k09i37TFpA0eIS/wRtjjI+idZJYeCKfSFX3i8gFwA+Ae3E3/N6sqktO5PPEitraWsrKylizZk372HjBYBAZl0NuRhNN65aSQS37919G//4ZBBJCjLjmXkKDR9hID8YYwzF0kjgRvPud5vXkc/akcDhMZWUlxcXFbNiwoX3upRaSSGwOcEV2HUlbXwRcKyqh32CGJdQAwwFIGjbap8iNMSb29GiB6q3q6uraW0ttXcQBxo8fz/SpUwi/9BApiYdgJwQSQqRNnEO/qWeTOmaK9cQzxpijsALVReFwmIqKCkpKSti4cWN7aylMIknNrVx83Y1MnnAyAJXF2QRbm8nMm0967jwSUjP8DN0YY+KCFahjVFNTQ1lZGaWlpe3j4gFkD+3PuPBuhlWvJZgI9dXvA65Ajbr6HoJJKT5FbIwx8ckKVCe0tLSwadMmSktL2bRpU3tPvCBBTgofZG5oGxnVbqLhQFIK6RPnMGrs8PbtrTgZY8yxswIVxZ49eygtLWXt2rXU1tYCrifepEmTmJY3leYX7iO5tY5wIEja2HwyppxB2oRZBEPJPkdujDHxzwpUBw0NDaxfv57S0lJ27NjRvjwlECaHvQyefytnz5sCQPX8KwgmhsjILSQhLdOvkI0xpleyAoWbCHDr1q2Ul5ezYcMGmpubAQgFA2QnHCCndRdDqCcQgFDS3vbtBs69yK+QjTGm1+vTBaqqqoqSkjWUlpXTUF/bvnxIoB4J7OHkwH5C4TChwVmk536KjMmnkzRklI8RG2NM39HnClRdXR3r16+nvLz8Q6fwMvplMjN/Bnl5eez9zQME6oP0P/Ui+k2eR9JJ2TbPkjHG9LA+U6C2bd/BM795hcaDuwh4IzkkBsKMppqxwWoGnnk7E/OnA9Dv2rsJpmVaUTLGGB/1mQL12l/+TNPBnQQIMyJwkJxANScH9pOUlkH6pEIGZB+eHj0hvb+PkRpjjIE+VKDOPfcTrH3mYU5p3Ut6UiLpMpuMyaeTmj2VQEKf+W8wxpi40Wc+mUedPJrM8y4kmNqPtHH5dvOsMcbEuD5ToAAy88/3OwRjjDGdFPQ7AGOMMeZIrEAZY4yJSVagjDHGxCQrUMYYY2KSFShjjDExyQqUMcaYmBQv3cwTAHbt2uV3HMYYY06giM/1hI7r4qVAZQFcc801fsdhjDGme2QBWyIXxEuBKgJOB3YCLT7HYowx5sRJwBWnoo4rAuFwuOfDMcYYYz6GdZIwxhgTk6xAGWOMiUlWoIwxxsQkK1DGGGNikhUoY4wxMckKlDHGmJhkBcoYY0xMsgJljDEmJsXLSBJHJSKzgZdVdZj391DgMeA84BDwM+BeVW3x1j8NXAk0R+xmqqr+XUROAZ4C5gK7gS+p6h97LBm6lM9p3vpJwHvAXar6W2+dr/kcSy4i8gRwbYddpAN3q+oDfucCXTo2NwFfB4YAG4Gvqupyb1085vMl4HZgMLACuE1V/+5nPiKyAHgIGO897yOq+mMRSQL+G7gcN/rMo6r6YMR2VwIP4EYwWALcqKq7/czlePKJ2P524ExVvSRime+vta6K2xaUiARE5GbgVSApYtUvgGG4D+wpwGzgWxHrZwCXqGpGxM/fvXXPAWtxb8BbgOdEJKebUwG6lo+IZAGv4F64/YDbgGe9FyT4lE9XclHVWyOPCfA14B0vN99y6Wo+IjIVeBS4GBgAPAu8KCJt77l4y+dK4H7gJi/m/wNeE5EUb9sez0dETgZeAO7D/R9/BnhQRM4DvgkIMBaYBdwgItd72+XiPrBv9OLd5MXfxq/3TZfy8bbNEJFHgO8eYde+vdaOV9wWKNwB+yLuYAIgImnA+cDtqrpbVfcB9wC3eG/KVGAiUNZxZyIyAZgJfENVG1X1Ddyb8HPdnwrQhXyA64GlqvoLVQ2r6mu4D5Vqn/PpSi5EPHYs8DBwtaoeiNNjM57D768A7ltvvbdtPObzaeBJVV2iqs2q+j9AI3COj/mMAX6lqr9X1VZVLQIWA4XADcD9qlqtqhXAfwFf8La7FviDqi5X1QbgTqBQRMb7fGy6mg+4L6rZwI8jdxgDr7XjEs8F6glVzQeKI5a15VMbsawFGIr7RjINd2rvSRHZIyJrRGSh97hcoFJVI7fdCJzaLdF/VFfyyQcqROQ5EdkrIqXAcFWtwd98upJLpO/iPgzLvb/j8dj8BXgbWIf7IP8OcJWqthKf+QQ7rGtbPwGf8lHVZap6a9vfIjIIN6h0Ke7U3TtHiSc3cp2q1gHbvPW+HZvjyAfgM6p6OfB+h936/Vo7LnFboFT1vSMsO4g7bfGwiAwSkcHAN7zVqbjTYMtw3yBH4E5ZLBKRPCADqOuwyzogrXsy+EjsXclnEK7J/izuBfwg8HuvBeJbPl3MBQARmQIswH2gt4nHY5MCKO68fzrw77hTfMOJz3xeAD4vIjNFJCQit+DORqTicz4AItIf1zJYBZRExHCkeKLF63sucMz5HPGYemIin66K2wIVxXW4b6wbcBc/X/SWf6Cqr6rqAlUtVtUmVX0BeAO4CPftMLXDvtKAgz0U99EcNR/chew/q+rLXj6LgDXAJ4nNfKLl0uazwIuqGvlNMBZzgej5/CewS1VXqeohVf0RUAFcQRzmo6rP4b4APYdrbUwBXgOq8Tkf7zTWSlzr4XKgxlsVGVNkPNHi9f3YdCGfaHzP53j0xgKVBXxBVU9S1SnADmCDqtaJyIUickOHxycBDbjm8ynedao2E/lws9oPR80H11Qf2OHxbT0zYzGfaLm0uZgPX7CG2MwFoudzMpDc4fHNQBNxmI/XIecPqjpOVYcDX8EVqRJ8zEdEzsC1Ml4ELlfVBlWtBnbhOhUcKZ53Itd5199O8Zb7emy6mE80sfpa65S472Z+BI8Cb4vIHbgX3Xc43BMsAXhMRDbg3lhXAacBN6tqpYiUA/eLyJ3e8ouBgp5OoINo+TwN/IuIXAv8CvftfCpwpapui8F8ouXS1s05B3gzciNV1RjMBaLn8zLudNki3ERs1wCTgVdi9NhA9HzOAe4VkdOBA7jTf+8BRaoa9iMf71T2y7hbER7vsPoZL961uNNcd+C60IN7rywXkbOAt3Atw1JVfdfbry/H5jjyOaoYfu90Sm8sULcATwL7cKdaHvdOr6CqL4rI3cCvgeG4FshCVa30tv008BPcvQJ7gc+p6ts9HH9H0fIpF5ELcB8kPwIqgctUdZu3bazlc9RcPGOAQ14Pso5iLReIfmye9K4j/Ap3H9Q7wAUxfGwg+vH5Je7CejnurMPrwEWq2jbjqR/53Ia7rvygiETeE/RDXAH9LrAed6boJ8ATAKq6TkQ+6/09EtdiuSJie7+OTZfy6YRYfK11is2oa4wxJib1xmtQxhhjegErUMYYY2KSFShjjDExyQqUMcaYmGQFyhhjTEyyAmWMMSYmWYEyppt4g/ju8Qb97LjubhE5KCJjfAjNmLhgBcqY7vNl3M3wH5pYTkSygbtxIwZU+BCXMXHBCpQx3URVd+HmGrpZROZErHocNydZx+FsjDERbCQJY7qRN9nfm7jhgWbhRs5fBExX1Xe8x9wE3IUbdmcDrmX1Z29dIvBt4GrcFDFVuKG67lDVFhF5FmjFzYI7FjfU1eIeS9CYbmQtKGO6kTdW3edxg/jehJsJ9b6I4vQp3CCtd3uPeQo3p9dsbxd34qb+vg43S++dwL8CCyOe5lrcwKHn4KZpMKZX6I2DxRoTU1T1bRF5FDcd9wbgoYjVdwEPeXN5AWwWkZm46Sz+CTcj742qutRb/3MR+TfcTKkvecveUdVnuzsPY3qaFShjesY3cbPqfltVmyKW5wL5InJPxLIQ3nw93gj854jII7jp1afiRn1PiHj8lu4M3Bi/2Ck+Y3qAqtZ7v9Z3WJUIfA2YFvEzGTdnDyJyH/A87r36PHAu0HGqhI77NKZXsBaUMf7aCIxW1c1tC7zWVAPwCPDPwJdV9WlvXSpuMsGAD7Ea06OsQBnjr4eBp0VEgTeABcC9uOtP4CYPXCgiK4D+uFOFmXx0Onljeh07xWeMj1T1eeB24N9w151uB76gqr/1HnI9rvfeOuB3wGbgf4H8Hg/WmB5m90EZY4yJSdaCMsYYE5OsQBljjIlJVqCMMcbEJCtQxhhjYpIVKGOMMTHJCpQxxpiYZAXKGGNMTLICZYwxJib9P1DdBIyhWFgqAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "system.alpha1 = 0.0195\n", - "system.alpha2 = 0.014\n", - "\n", - "results = run_simulation(system, update_func3)\n", - "plot_results(census, un, results, 'Proportional model, parameter changes over time')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap07soln.ipynb b/soln/chap07soln.ipynb deleted file mode 100644 index ab58bf90..00000000 --- a/soln/chap07soln.ipynb +++ /dev/null @@ -1,779 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 7\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.525149\n", - "1951 2.572851\n", - "1952 2.619292\n", - "1953 2.665865\n", - "1954 2.713172\n", - "Name: un, dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Year\n", - "1950 2.557629\n", - "1951 2.594940\n", - "1952 2.636772\n", - "1953 2.682053\n", - "1954 2.730228\n", - "Name: census, dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Quadratic growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the implementation of the quadratic growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Compute the population next year with a quadratic model.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `System` object with the parameters `alpha` and `beta`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    t_01950.000000
    t_end2016.000000
    p_02.557629
    alpha0.025000
    beta-0.001800
    \n", - "
    " - ], - "text/plain": [ - "t_0 1950.000000\n", - "t_end 2016.000000\n", - "p_0 2.557629\n", - "alpha 0.025000\n", - "beta -0.001800\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap07-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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CfDRRx/RtGnTq50rhBCiljh16hR33HEHuP/Ol1ZbEpQToGnTpkRFRXk7FiGEEJXvR903MkhCCCFEjSQJSgghRI0kCUoIIUSNJAlKCCFEjSQJSgghRI0kCUoIIcQ1qeql8iRBCSGEqJDCwkK+/vpr/vrXv6J12b08K09tmQclhBCiBtBa8/XXX5OdnY3VasXHp7y9Oq+PJCghhBBXlZOTw/Lly9mzZw8ALVq0YNKkSURGRlbZMyVBCSGEuCLDMNixYwcrVqygoKAAHx8fRowYQb9+/bBaq7aXSPqgqplSir179/6ofPLkyXz++ecl7xcvXszkyZOJjo6mb9++3H///SX/crmSdevWcc899xAbG0u/fv2466672LRpU6V/BiFE/XDhwgX+85//8NVXX1FQUEC7du2YOXMm/fv3r/LkBFKDqpE2bdrE888/z+zZs4mOjqaoqIj58+dz9913s3LlSho1avSjaz777DNeeeUV/vKXvzBkyBAAvvrqKx544AHeeecd+vTpU90fQwhRS7lcLpKTk1mzZg3FxcX4222MGTOaXn36YbFYqi0OqUHVQDt27KB169b07t0bq9WKv78/Dz74IBMmTOD8+fM/Oj8/P5+//e1v/OUvf2HUqFH4+vri6+vL1KlTmTFjBocPHwbA6XQyZ84cRo4cSWxsLA8//HDJ/ZKTk5kwYQIvvfQSsbGxDBkyhNdee63kGf/73/8YNWoUffv25Sc/+Qlr164tua5s8hsxYgSrVq0q9zohRM105swZ3n33XVauXElxcTHtglxMNHbS7EhCSXLKyC7ktYXb2b7vTJXGUmcT1E2PfMVNj3x1Sdmf523kpke+YtOeUyVlyzcc4aZHvuL1/24vKUvPzOemR77i7ueWX3L9b/6ZwE2PfMWBYxlVGvuwYcPYt28f06dP54MPPmDPnj04nU6ee+452rdv/6Pzt23bRlFREUOHDv3RsQcffJCpU6cC8MEHH7Bo0SLmz59PYmIijRo14re//W3JuQcOHMDHx4f169fz17/+lTfeeIODBw9y/vx5nn76ad58801SUlKYNm0azz///FXnQFzrdUKI6udwOFizZg1z587lxIkThISEMLpRHgMKdxMcHELD/pNKzs3MLWRVylHeXbynSn+f62yCqs06dOjAl19+SadOnViwYAG33HILAwcO5M0337zs/wznz58nNDT0qsM9Fy5cyK9+9StatmyJv78/jz32GCkpKRw5cgQAi8XCzJkz8fHxYdCgQURERJCamoqvry92u53PPvuMXbt2ccstt7BixYqrVvWv9TohRPU6duwYc+fOZe3atbhcLvr06cOsWbPoNeFn+LfsQov7/s5pe4uS81s1bcDMn/Tg8bv6VOnvc53tg1r8yuQflT1zX/8flY2La824uNaXlDUODbjs9a/+dth1x+Xr64vD4fhRudPpxM/Pr+R9q1at+OMf/wiYCWjlypW8+OKLhIWFMW3atEuujYiIICMjg+Li4h8lqezsbPz8/PD19SUtLY0nn3ySZ555puS43W7nxIkT2O12goODL4nBx8cHl8tFcHAw77//PnPnzmX69On4+/tz9913M2PGjHI/a3nXSZISwvuKioqIj48vGUzVKKwho7q1ovOICeYJbXvh37oHL364mQ27TvLKw0PocEMYAGP7t67y+OpsgqqpmjZtSlpaGt27dy8pczgcpKWllewWfPvttzNmzBjuueceABo1asS0adPYtWvXZWdtR0dH4+/vT2JiIqNGjbrk2Msvv0xqairvv/8+kZGRPPPMMwwePLjk+L59+2jdujXbtm27YsyZmZkl/VfFxcV8++23PPTQQ/Tp0webzUZxcXHJuYZhkJmZedXrZNCGEN514MABlixZQmZmJhaLhT5tm9Lx5HqsG9ZR2Kkbfs3N7gSr1UrTRkH4+9o5eS63JEFVB2niq2YTJkzg9ddf5+DBgwBkZGTw0ksvERERQY8ePQC48cYbmTNnDqtWraKoqIiioiKSk5NJTExk5MiRP7qnr68vjz76KM888wzx8fE4HA7y8vKYP38+X375JbNmzQJgypQpvPHGG5w8eRKn08lbb73FHXfcQUFBQbkxnz9/nvvuu49Nmzbh4+NDkyZNsFgshIaG0rJlS4qKili6dClOp5P333+f3Nzcq14nhPCOvLw8vvjiCz766CMyMzNp0jiMyeE5dEpdgbUol4B20WzYn8X3R34YkHXb6I7M/cNIhkRX747mUoOqZrNmzcJmszFjxgzS09Px8/Ojf//+vPfeeyXNc3fddRf+/v7Mnj2bxx9/HMMwaNeuHc888wyDBg267H1vu+02QkJCmDt3Lk888QSGYdClSxfmzZtH3759AXjggQdwOBzccccdZGRk0LFjR+bNm0eDBg3KjblNmzY899xzPP3005w5c4awsDCeeuopOnToAMBTTz3Fyy+/zJ/+9CcmT55MTEyMR9cJIaqPYRjs3r2b5cuXk5eXh91uo2/TANqeXIvVYmBrEE74mJ+TcDaCOV/sol1UFv94eChWq4VAfx8C/atuSaMrsdSGEVVKqdbA4fj4eKKiqjeDCyFEbZeZmcnSpUvZt28fAK1bt2ZgSDbWvWvAaiM0dhJhg36K1defgkIHT81NYuLANgyNiary/uLjx49fbBlqo7U+UvqY1KCEEKKOMgyDzZs3l3QX+Pn5MXr0aGJiYnDmZnCmOIuUgEGs2wUvDvUFwN/PzssPDa4RA5kkQQkhRB2Unp7OokWLOHr0KABtGgUQ65dOx+heWCwW7MFhhN/ye5a8vJpT6Xls1Wfo28UcqFUTkhNUY4JSSt0BzC1THADEa63HVFccQghRlzmdTjZs2EBCQgJOp5NAP1/62U8SlXkCi8VC6vYUWvToh4/diq+PjV/9tBcWK/RoH+Ht0H+k2hKU1voj4KOL75VS0cBK4LHqikEIIeqykydPsmjRIk6dMlfL6djAQq/cbfg5nfg1b8fOiBuZ88kZ7s48yC3DzcFKPTvWvMR0kVea+JRSPpjJ6lmt9Q5vxCCEEHVFcXExiYmJJCUlYRgGDQJ86ec4QLO8DKz+gTQafgch0aM5vS8dEjeQlVvk7ZA94lGCUkrZgN5AHyAScAKngBSt9fbyrr2CWUA+MPsarhVCCOF25MgRFi9eXLLwc2xsLH0aGWR9s5niVrEcbzme1r27ARDTKZK5T4yiaeMgb4bssXITlFIqDPg18CDQGDgEpAM2IBxopZQ6CcwB3tBaX3UVVaWUL2az3i+11jV/jLsQQtRABQUFrFq1ii1btgDQODSYKT+9jaioKAzDRY5fUx794Ci+u4/Qo3s7IsICAGpNcoJyEpRSajrwZyAeuA9YpbUuLHNOA2AwcAewWyn1pNb6/as8cxzgAr6+nsCFEKK+0lrz9ddfk52djdVioZvtHN0LNRFBdwFgsVhp3TOakX0NmoUHERrs6+WIr015Nai+QF+t9dkrnaC1zsJMNF8rpZoBTwJXS1CTgYVaa1dFgxVCiPosNzeXZcuWleyuHeHjoL/rIA0pJK9xD34/+1v+8MsxJbWk30yL8Wa41+2Ka/FprR8qLzld5vyTWutfeXBqf+BbT+9b13iy5ftrr71Gjx49OHDgwCXnXG5zwIs+//xzOnfuTHR0NNHR0fTs2ZMbb7yRefPmXbJFx4gRI+jRo0fJeRe/xo4dW3JOamoqs2bNom/fvkRHRzNx4kT+85//XPa548ePZ8iQIZcsGCuEqFyGYbBjxw7eeOMN9uzZg90KfaxpjHF9R3hYKE1v/SMrAydy8LyV5RuOeDvcSuPxKD6lVCTQA/ABLpnFpbVeWoFntgbSKnB+vVRYWMijjz7KwoUL8fX1rHresWNHvvrK3KTRMAy2bdvGo48+SlZW1iUbE/7jH//40arnF7lcLu6//34mTpzI3//+d/z9/dm+fTuzZs3C19eXW2+9teTci4vARkREsHLlSiZMmHAdn1gIcTkZGRksWbKkZIHpFoEW+hZ+R4jdwNZzClGjbsXq48fdkfn07BDB8N43eDniyuPpKL77MEfcXW61QANz0IRHtNa1p4fOi+Li4khLS+PVV1/l8ccfr/D1FouFmJgYnn/+eR544AHuu+++qy4KC3DhwgVSU1OZOHEiAQFmp2p0dDSPP/44RUWXDk1dsGABo0ePpnHjxnz44YeSoISoRC6Xi5SUFOLj4ykuLsbf358xY8bQuVlDDi2azwsHOtDyRAf+5GPu4dY4NICRfVt6OerK5WkN6jHgbeAJrXV2FcZTaQ698JMrHgu/cQYNYszFK7K2ruTcsrILXPyg7ZP/K3l9fN5jFJ06dMXjlSkwMJCXXnqJO++8k6FDhxIbG3tN94mLi8NqtbJt27bLbglfVuPGjenXrx/33nsvkyZNKmnmmzJlyiXnnT9/nvj4eJYtW0ZISAgvvfQSu3btumSfKyHEtTl79iyLFi3i+PHjALQNsTDl/pmEhIQA0OL2J8n7WzyNQ/1xOF3YbXVz5yRPP9UNwL9qS3KqK3r16sWMGTP4wx/+QFZW1jXd4+L+Szk5OSVljz76aMmmgRe/Xn/99ZLj8+bN4/7772fnzp089NBD9O/fn5kzZ5bMTgf44osviIuLo1mzZgQHBzNp0qQr9lMJITzjdDpJTExk7ty5HD9+nACLg6HWI8QV7Gb+x+tK+pNDg/2Y99RofjW1V51NTuB5DWolMBLYX4WxVCpPazYNYsaU1KauJuq+l68nJMDzLd8vmjlzJuvXr+e55567pP/HU06nk6ysLJo1a1ZS9ve///2KfVAXY7zzzju58847KSoqYsuWLbz66qs8/PDDLFiwAMMwWLhwIWfOnGHgwIGA2WdWWFjI448/TuPGjSscpxD13YkTJ1i0aBFnzpwBoL0lnd7WkwS17MzLBzpzeF8xww6eK1kzzxv7M1U3TxPUDuAfSqlJwD7gks4IrXXFO0nqKU+2fC/NZrPx8ssvM3nyZAIDAyv8vE2bNmEYBh07dvTo/AULFvDpp5/yxRdfAGayiouLw8fHh1/84hcAbNy4kYyMDJYvX47V+sO/3mbMmMGnn35asoOvEOLqioqKWLNmDcnJyRiGQQiF9Lcep0UDPxqP/g1BnQdw6840fO02urcL93a41crTuuFQIBlz9fGeuOdIub8uP+5ZXJYnW76X1bJlS/74xz+ycOFCj5/jcrnYtGkTTz/9NDNmzCA4ONij64YOHcrRo0d58cUXSU9PxzAMjh07xvz580u2m1+wYAHjxo2jSZMmRERElHzdfPPNfPrppzLkXAgPHTp0iDfffJONGzcCEBPVkAn2A3zvaMOh2McI7jIQi8XCoJ4t6Ne1aY3ZBqO6eFSD0loPr+pA6gtPtny/nKlTp5KYmFjyP/Ll7Nu3j+joaADsdjstWrTgF7/4BdOmTbvkvN/97nfYbD8eeLl8+XKaNm3Kxx9/zGuvvcbEiRPJz88nLCyMcePG8etf/5r09HRWrVrFe++996PrJ06cyIsvvsiKFSuYOHGihz8RIeqf/Px8Vq5cyfbt5lKmTZo0YdKkSTQNb8T6b+P4YslJJp4soL7/4fV4y3elVBPgV0BXzJrXXuBtrfWhci+sBLLluxCiLjAMg++++45lS5eSm5eHFRc9/LJofuOv6duzDQAul8GB4xl0bBnm5WirR3lbvnvUxKeU6ofZ93QzcA44C0wEdiqlpIlPCCGuIisriwULFvDZZ5+Rm5dHJDlM9DnImdwGvPG/XeTkmV37Vqul3iSnq/F0kMQrwCfAg6VXIFdKvQ68DPW+JiqEEJdlGAZbt25l5YrlFBU78MFJjPUkPdpF0XjM3/jsv6n0bhyEbO3wY54mqD7ALy6zPcZrwJbKDUkIIeqG9PR0Fi9eTGpqKgAtLFl0s2fQdvy9RPQ0B0A890DzOj2X6Xp4mqBOYq6hp8uUtwVk8q4QQpTidDpJ+nY9iWvX4XQ6CQwMZGR0Jw7v/J6XTgxgwtGG3NfLHJEnyenKPE1QHwJvKaV+A1wcRhYH/NN9TAghBJCWlsZXny3gzAVz9ZcuXbszYfw4AgMDieg+jJzNx5g6soOXo6wdPE1QLwDNgYWYAyssQDFmE9+TVROaEELUHsXFxcQvW8KmbTsxgCCK6GTN5GBhVMkk+xuahHD3hC7eDbQW8XQeVBFwv1LqUUAB+cABrXV+VQYnhBC1wUG9l8Vffk5mgQMLBp3tmfTpN4DHvvGlyYlsCgod+Pt5vLuRcCtvy/fxwDda62L367JuUEoBFd4PSggh6oT8/HxWLlvK9l27AWhIPiM7NaPzxN9iCwrlL+3T6dgyTPqZrlF5KX0J0BQ44359JRXaD0oIIWo7wzDYu3cvS5cuJTc3F6sFWpLDxpxOjOwzGVtQKABd2sjCydfjiglKa2293GtRM7322mvs3buX2bNnl3vexVnbKSkpHm1gKIS41Pm0VBYv+A9HssxdCVq2bMmEcaOJ35FN2KHzhAR5tgO2uDppFBVCCA84iwr49vP3Wa9PUIwNGy669B7GzROGYbFYuDXSxTSrpd4t6FqVyuuDOgueTW7WWkdWWkR13PHjx5kyZQoPP/wwc+bMobi4mIceegir1cqcOXMoKiriwQcf5J577iEpKYlXXnmFw4cP06JFC2bNmsW4ceNK7vPkk0+yc+dO2rZtS9u2bS95zsKFC5k3bx7nz5+nR48ePPvss9xwww3e+MhC1GqGYXA0+RuWxSdw2uEH2Gjia7DpQhsyDtq4xZ2QbNLPVOnKq0E9hocJqqb5+OOP2b+/evZW7NChA7fffnuFrsnOzmb37t2sWbOGVatW8eijjzJ58mTi4+NZt24dDz30EN27d2fGjBm8+OKLjBkzhpSUFGbOnElERAS9e/fm4YcfpkuXLrz99ttorbnvvvvo08dcFnHlypX8+9//Zu7cuXTo0IH58+dz//33s2RJeV2JQoiyCs6dYNVHc9mWYcGFHwFWF6MH96frwNH4LddMHtrO2yHWaeX1Qb1XjXHUOzNnzizZDNDpdDJ9+nR8fX0ZPnw4TqeTd999l9jYWMaPNwdQxsXFcdNNN/HFF18QGRnJ7t27eeedd/D19aV79+5MnjyZEydOAGbtafr06XTt2hWABx54gA8//JDk5GRatWrltc8sRG1y/PhxFn31JWczzDFgfhZfZvx6FqGhZt/tvTd19WZ49UJ5TXwe746nta74XuRVqKI1Gm9o2LAhQMm+TCEhIQAlO9QWFBTQokWLS66JiooiOTmZs2fP4ufnR1hY2CXHLiaotLQ0Zs+ezVtvvVVyvLi4mLS0NElQQpTD5SgiPWU5my/Y2JSyGYCGIUEcK7iBo64wsgoshIZ6Och6pLwmvtxqi6IeulpHap8+fdi8efMlZceOHSM8PJwmTZpQWFhIeno6jRubw1hPnz5dcl5kZCTTp0+/ZKPCgwcP0rx5c9LT0yvxUwhRNxiGQe73G9ixbAFJ2cHk4YvFYmHAgAEMHTqUs5mFhIcG4OsjM2qqU3lNfPdWZyDiUoMGDWLOnDksXbqUsWPHsmnTJhYvXszrr79OixYt6NevHy+++CLPPfccqampfP7558TExAAwZcoU3nzzTfr27Uvbtm1ZsmQJTzzxBEuWLMFul4GbQpRWePIgx5fPZ/2xXI4YjQBwOO207TWCUaPiAGgefuXdrkXVKa+J7yXgOa11rvv1lRha699Xfmj1m91uZ/bs2bzyyis8+eSTNGnShOeee45BgwYB8M9//pMnn3ySAQMG0Lx5c0aNGsX58+cBM0FlZWUxc+ZMzpw5Q8uWLXnjjTdo3bo1x48f9+bHEqLGcGSfJ33Nf9ixYydbXM0ooiF2m5UuPfuTnOrH4H6dvR1ivXfFLd+VUmuAm7XWGe7XV2JorUdUSXQ/xNIa2fJdCFGJjm5czrKVqzhlmP2/bVu3ZuKkSYSFhWEYhsxnqiblbfleXhPf8Mu9FkKI2sgwDIrOpGIPv4ENGzaQmLgFhxGC07ByxtWax2+bRoC/2ZQnyalm8LhDQikVBEwDugJFwB5ggXulcyGEqLEKTuwj/Zv5nEhLIykgmsysTAB69OiBX3gX+vdsVZKcRM3hUYJSSnUHEjAT007MPaHuBf6slLpRa/29h/dpBrwJDAcKgLe01k9fQ9xCCHFVjsyzpK/5Dxm7k9juasL3RhsoziQ4JJQpk2+iXTuZaFuTeVqDehv4Evil1roYQCkVALwDzAWGenifr4AtQBOgGZColNqrtf64QlELIUQ5XEX5ZCR9SWbyIo4V+ZHsUuThA1jIsjRjyoSbaNeuqbfDFFfhaYLqCUy/mJwAtNb5Sqm/ANs8uYFSKhZoCwx03+ewUmoY5uaHQghRac4tf5uzO78lxdWcVMOcFN+sWTNGj72RFs2by3ymWsLTBLUVGAzsK1PeB/jOw3v0BnYBzyql7sFs4puttX7Fw+uFEOKKXMWFWH38MAyDI6FdWOVMpxgrBlbGjhlFbGxsyUotonYobx7UzFJvNwGvK6X6ABsBJ9ADeBB40cNnNcJMcomYNalOwHKl1Elp4hNCXKviC6dIj/8AV34OjuG/JP6bFRw9ehSwYgmI4JbJE+muWno7THENrraaeWmngHHur4vOAT8HnvfgWYVAltb6Wff7HUqpd4BbAElQQogKcRXkcuHb/5GZ8jVOh5OdRlN2z3sHMAgKCmLcuHF07dpVhozXYuXNg2pTyc/6HghUSvmWGpou6+4IIWYHxWkAACAASURBVCrEcDnJ3h7P+cRPcOVlcdoIYpO9AxmFLsCgY6duTJk0noCAAG+HKq5TeU18d2ut3/f0RkopC3Cv1vrdK5zyDXAWeEUp9QiggPswmwmFEOKqDMNF2odPU3hcU2jY2B7QlX05NnC6CGnQkNFjb6R7l47eDlNUkvJqMNHuRDIH+EJrffJyJymlIoHbgQeAVVe6mda6QCk1FHgNOIk5SOIlrfX/rjV4IUT9YrFYCWgbzY5jWWxyRGLJMbDZbAwaNIhBgwbJYsh1THlNfL9xD4p4BnhVKfUd5uoR5wALEIE5/LwjsAy4R2u9qbyHaa0PARMqKXYhRB1nzmf6Ap+wpoT0HMGFCxdYeqSAg84ILBaDsPBm3H7bLYSHh3s7VFEFyv3nhtZ6MzBJKdUGuBFzWHl7wIU5aOLfwFKt9dGqDlQIUX8YhkHud+tJj/8AZ/Z5Cm1BJO3K4lTqHhwOB/7+/owYMZI+fXrLIIg6zKP6sNb6MDC7imMRQggKTx8hfeU8Co6aUyxPBbVh2YUw7Ad3ANC9e3fGjBlDcHCwN8MU1UAabIUQNYKrqIDzqz8ka+tKMFw4AkL5rnEsO46cwm51EBTcgJunTJL18+oRSVBCiBrBYvch/+h3uFywytmVbGcIeUdOYbVaiYuLY+jQofj4yIrj9YkkKCGE1xSePIQtpBH24IZYrDZ8h97Nh1+sodiZBXl5REVFMXHiRJo0aeLtUIUXSIISQlQ7Z342FxI+IWvrSiwdBhA06gH2791BQkICDocDH19fxoweTe/eMgiiPqvIhoXRmAu+mmvWl6K1lgEUQoirMgyDnJ1rSF/9Ia68LAyLleW7LnDuwFsYxdkAdOvWjbFjx8ogCOHxhoVPAn8BzgPZZQ4byAg/IcRVFJ05yrnlb1FwbC8AlhZd2ezTkbMHDkJxNg3Dwpgwfjzt27f3cqSipvC0BvUL4Gmt9QtVGYwQom5yZKVzfN5j4HJQaAsiu/tE1u49Sm7uQaxWKwMGDGDIkCEyCEJcwtME1RhYWJWBCCHqLnuDxgR2H87yLcfZU9CQ4M1mLaply5ZMnDiRiIgIL0coaiJPd+/6DLijKgMRQtQdjqxznPrsJfIOmZNrHQ4H3wd34qjVj2B7Lv7+/kyaNIl77rlHkpO4Ik9rUPnAE0qpqcB+oKj0Qa31rZUdmBCi9jFcTrI2L+N84icYRQWkHjhMet+fc2hvMunp6QD06tWL0aNHExgY6OVoRU3naYIKRDYVFEKUo/DkIc4unUPRqYMAnG7Yjc9OhtJg/VIAwsPDmTBhAq1bt/ZilKI28XQtvnurOhAhRO3kKi7kwrqFZG5cBIYLa0g4J9qNZt2uAzTwycZmtzN0yBAGDBiAzWbzdriiFqnIPKjuwONAV8y+q++Bf2utk6ooNiFELWA4isjesQaXYbDO1Z0i32ac2rwHgPbt2zN+/HjCwsK8HKWojTwaJKGUuhHYijma7zPgv0AIkKiUGlN14QkhaiJnfjYuh9kVbQsIIWTMDD5hMKlOC6dOnyIkJISpU6dy++23S3IS18zTGtQLwPNa6+dKFyqlnsKcwLuysgMTQtRMud9v5Nzyt3G2H0zTUXdw6IBmxYr1uBw5WK0WYmNjGTZsGH5+ft4OVdRyniaozsDlRup9Cvyx8sIRQtRUztxMzq14m9y9GwDYsXkbC3UehTlnAYiKimLChAk0bdrUm2GKOsTTBHUUiAYOlCnvDZyp1IiEEDWKYRjk7lnPuZXzcOVn47QHsDN8IDuPncWac5aAgABGjRpFdHS0LOwqKpWnCeoNYI5SKgrY6C6LA54EXqqKwIQQ3ucqyufMl/8ib38KAGcje7AxJ4SM42ewWmROk6hang4z/7dSKgR4Agh3F6cBf9Jav15VwQkhvMvi409xYSHnXIEsL1YYaU4gm8jISCZMmEDLli29HaKowzweZu5eKPYFpVQkkK+1LruquRCiDnDmZmI4irCHRuByuTjcPI6Ew1YMmxMfH1+GDx9GbGwsVqunK6UJcW2umKCUUjOBd7XWBe7XZY+XvJb9oISoG3K/T+bssjlcsIaRF3cP2zatLVmiqFu3bowZM4aQkBAvRynqi/JqUI8BC4AC9+srkf2ghKjlnPk5pK+cR87uteQZdtY7mnJ+2RcANG7cmPHjx9O2bVsvRynqmysmKK11m8u9LkspJcN2hKjF8g5u4+zXsynOOo+2NGEHzSi2uLDZ7AwdOoS4uDjsdo97A4SoNJ7uqHsI6KO1Pl+mvDmwHYisgtiEEFXs3Mp3yUr5mlOuIDbbunGh2Aq46NSpE2PHjqVhw4beDlHUY+X1QU0CBrnftgb+rJTKK3Oa7M0sRC2WawtkrbMlqUZDcEFYWBg33ngjHTp08HZoQpRbg9oB/Aa42IQXzaX7QBlADnB31YQmhKhshqOYwnPHsIe3JCUlhYRNhykyGmKx2hgyeBCDBg2S5jxRY5TXB5UKjABQSs0HHtZaZ1VXYEKIylV05ihpX/yT1LPZJPt1IT/PnCmilGLs2LGyqKuocTzeD0opZVdKtQAubuhiAfyA3lrrTzy5j1Lq58BcoLBU8Syt9fsViFkIUQGG4SIzeQnH1ixga3EkR4wbIC+bhg0bcuONN9KxY0dvhyjEZXk6SGIiMB9odJnDFwCPEhQQA7yitf6Dh+cLIa5DccZp0r58jZ3HzrHT1Q4HNixWG337xTF65FBpzhM1mqf/d/4f5pYa/wDigUlAU+CfwCMVeF5v4F8VCVAIcW1yvkti65fz2FIcSRbNAGR0nqhVPE1QHYCfaq21UmorEKS1XqiUKgaewtx2o1xKKRvQA7hLKfUPIA94B3hRa21cW/hCiMvJyMhg6aa97C8218rz8w/mpz+ZTPv2MvBW1B6eJqh8wOV+vQ/oCSwDtgCeNmBHAJuB94FbMPeY+grIQlaiEOK6GYZBxqHdpBw6Q8qmjTgcDnzsdtp27s3UyaOx2WxXv4kQNYinCWot8LRS6teYSeZ+pdQrwDDMBHNVWutTwNBSRduVUq8BP0ESlBDXpTj7At9+9DqbTxeQiy8A3bt3Z/To0bJ2nqi1PE1QjwCLgZ8DczDnR2UBvph7Ql2VUqorcKvW+k+lin0x1/oTQlwDwzA4unEFK+LXcNIZCPhixc5Pp91GZyXNeaJ283SY+QGgs1IqQGudr5TqBwwHzmmtkz18VgbwiFLqODAPc+Lvr4FfXUPcQtR7OedOseSDt9iX7cIgED8rdOvZh9HjxuDn6+Pt8IS4buUtdXTZLTJLla+5+F5rXXYJpB/RWp9wL5/0Eubov3PAX7TWn1U4aiHqMcMwSFmznNXrkih0/wr3aNWEMVPvIigoyMvRCVF5yqtB5WAuZ+QJj3pftdargT4e3lMIUcaxY8dYvnw5aWlpgJ0QiukWN44xYwZd9VohapvyEtTwaotCCFGurKxMPvvgPY6lZwAQEhLC8AH9adM1hoYh/l6OToiqUd5afInVGYgQ4sccDgfr41fwbXIKDsOCBeg/YCDDhg7B19fX2+EJUaU8XeoohXKa+7TW/SotIiEEhmGwd88eVny9iKyCYsBCc0sOUR37MHLECGw2q7dDFKLKeTrMfMllrmsLTACercyAhKjvTp8+zcJPPuV8ptmc15B8hnRsRvfJv8MeKHOaRP3h6TDz5y5X7l6dfBLwamUGJUR9lJeXx5o1a9iyZQuGYeCLg65+eYycdi9Brbt5Ozwhqt31LmW8GnitMgIRor5yOp0kbdjIt+vXU1hYgMVioWMDKy0jWtD/1p9jk74mUU952gd1uTlRoZgLxZ6s1IiEqEf279/Poq8WkZObA0Dbtm0ZO3YsERERWCyWq1wtRN3maQ3qSnOiCoB7Ky8cIeqHs2fPsmL5Mg4eOgxACIXc4OPi5p/djt0ui7oKAZ4nqLJzogygCNijtc6u3JCEqLvy8vJYFb+a7Vu3YAA+OOlhPUP7jp1pN/HnkpyEKMXTQRKJAEqpYEABTrNY51dhbELUGU6nk5SUFBIS1lBYWIQFg46W8/Rp6scNE36HfwvZdl2Isjztg/LD3BLjDuBij22+Uupt4BGttbOK4hOiVjMMg3379rFy5UrOnz8PQBNLDj2tZ2k68GZaD52IxSq1JiEux9Mmvn9j7v10G7AJsAKxwN+BQuD3VRGcELXZqVOnWLZsOUePpgLQuHFjxowZQxNXFoFR7fEJlm3XhSiPpwnqVuAmrfX6UmWfK6XOAwuRBCVEiezsbFavXs327dsB8MVBoE8DfvnLX2K3X+/MDiHqj4ps+V58mfLMSoxFiFqtqKiIDRs28O2331JcXIwFA2U5h7JlETRgmiQnISrI09+YJ4B3lFIzgI1aa5dSqhtmv9QLpedJebI3lBB1iWEY7Nixg/j4eHJyzPlMUZZMettOE9V7GGFDp2ELkCWKhKgoTxPUq0AwsA5wKqVcgA9gAfoB/yh1rvT4inrj8OHDrFy5klOnTgHQiDx6W08S0aQ5LSe/gF+T1t4NUIhazNMENaVKoxCiljl79izffPMN+/fvB6BBgwaMGD4Mv62LsHecTruBI2UlCCGuU0XnQQUAHTBH8R2USbqivsnJySEhIYGtW7diGAZ2nDRp2ZW777wFHx8f6BXt7RCFqDM8nQdlA/4KPMwPTXtFSqn3gF9prR1VFqEQNUBxcXHJAIiioh8m2vawnqY4vLuZnIQQlcrTJr4XgDuB6cB6zAQ1EHMe1DPuLyHqHJfL5R4AsZpc94KuLSxZxFhP0uSGNoSOmEXwDcrLUQpRN3maoKYDv9BaLy1VtlAplQ28hSQoUccYhsGBAwdYtWoVZ86cAX4YANEiLIjGIx8iqFN/6WcSogp5mqCCgQOXKT8EhFdeOEJ4X1paGiu/+YbUI0cACA0NZUjv7gStn49/30m0HHYzFrs06QlR1TxNUCnALMw+qNJ+BWyp1IiE8JILFy6wevVqdu/eDYDNMOg3eDgjhg7Ebrfjih2I1dffy1EKUX94mqB+DyQopYYBG91l/YHWwLjKD0uI6pOXl8fatWtJSUnB5XJhxaCT5RzdbGfwi7ilZAUISU5CVC9Ph5lvVkrFAA8AXTCXPloMvKG1lh11Ra1UVFREcnIya9etx1FcBBi0tVygp/U0DZveQPioPxHYuqu3wxSi3vJ4cTCt9T7gUaVUY8Cptc6ourCEqDoul4tt27aRkJBQsjRRc0s20daTRIYG02j4LIK6DsRisXo5UiHqN48TlFLqaeBBoIn7/THgVa31q1UUmxCVyjAM9u7dy8pvVpGZcQGA5s2b07OBg4aHNWEDf0LjuJuw2n2vcichRHXwdKLuC5jNe89z6X5QTymlfLTWL1ddiEJcv8OHDxMfH8+JEycAsFvtTLllCl26dMEoysdw3I4tKNTLUQohSvO0BvUL4O4y86C+VUodAN4APE5QSqmGwE7gGa31e55eJ8S1OHnyJPHx8Rw8eBAAf4uTHpaTRPk46NC+PRaLBYtfIPh5OVAhxI94mqDswLHLlB8AKrqPwBygRQWvEaJC0tPTiV+9mr3ffQeAj8Wgq+UUnSznCIhsRcSYe/D1k6wkRE3maYJ6GZitlLpda30MQCnVCPgb5nJHHlFK3Q00AHZVNFAhPJGVlUViYiLbtm3DMAwsGHS2nKOb9QyBIQ1oNGwmwd2HYrHKrjBC1HSeJqjbgM7AIffgCAfQEvAF+iulfn3xRK115OVuoJRqA/wJGAAsv56ghSgrLy+P9evXk5y8CZfLicViIbpnT244uIIGxRcIi7uFhnFTZC6TELVIRTYsvGbu1dD/AzyqtT6llCyuKSpHYWEhGzduJCkpiaKiIgAaR0Qx7dbJhIeHU3CiK/aQRtgbNPZypEKIivJ0ou771/mcp83b6M+v8z5CAOb2FykpKaxfv578/HwAmtoLiTGOYgkMITzcXCLSv0UHb4YphLgOHs+Duk7TgOZKqVvc70Mw+7T6aa1nVlMMog5wOp1s27aNxMS15OSY+2U28YceRQdpSi7W0Agi+g/wcpRCiMpQLQlKa92p9Hul1HbMSb7vVcfzRe3ncrnYtWsXiYmJXLhgTrL1MVwMsB3lhuIsrP4BhA26iwZ9x8tEWyHqiOqqQQlxTQzDYM+ePSQmJnLu3DkAwsPDGdCtPQ3WvQUWCw2ix9Bo6DSZaCtEHeOVBKW17uWN54rawzAMtNYkJCRw+vRpAJyGnXHjxtK/XwxWq5UL9lyCOvTGN7KVl6MVQlSFKyYopdS7nt5Ea/3zyglH1HcXd7JNSEggLS0NgJCgQKKKzxHjPEBG4VCsVnMR17CBt5R3KyFELVdeDar0ChG+wE3A95ibFxYBMUBP4OMqi07UG4ZhcOjQIRISEjh+/DgAAQEBxITbaHUyGRtO8A+iU6SsMC5EfXHFBKW1nnrxtVLqLcxBDb8rfY5S6nmgU9lrhaiII0eOsGbNGo4ePQqA1e6Lb0ExE4q3E3CyEKw2GvSeQNjgqdgCKrqylhCitvK0D+pnmDWmst4HtldeOKI+SU1NJSEhgSNHjgDg7+/PgAEDaJGxH3Z+DUBg+940GnU3vo1l+UYh6htPE9QpYASwv0z5RCC1UiMSdd7Ro0dJSEjg8OHDAFhtPviE3MDDM6bi7++PM7cHpy4cImzwVALb9PRytEIIb/E0Qf0ZmKeUGgFsBSyY+0GNB6aWd6EQF5VNTH5+fvTo0pm8bWtpkbmftDPjadvSH1tQKC2mP+/laIUQ3ubpUkcfKqWOAzOAu9zFO4EhWuvkqgpO1A2pqakkJiaWJCYfH19i+8TQyXWCwu0fg92BYfOhufUcIGvmCSFMHs+D0lqvAdZUYSyijimbmPz8/LAEt4S0VFrt+IjColwAgrsPo9Gw22VBVyHEJcqbB/WSpzfRWj9eOeGI2s4wDI4cOUJiYiKpqWb3pJ+fH/379yc2Npb9854lOOgAFIF/q640HnkPfs3aejdoIUSNVF4Nqq+H9zAqIxBRu12cx5SYmMixY+bmy/7+/jSI7EDX7r0Y0sdMQi0HjiUjKYeI0fcQ2KEPFovFm2ELIWqw8uZBDb/4Wil1F7BMa32uWqIStYZhGOzfv5+1a9dy4sQJwJxg279/f5yuQM6t/oTUE3so7vUkPnYrob2GEdpjCBabLAMphCifp38l/g30ByRBCcBMTHv37mXdunWcOnUKgMDAQHr06svgvt3IS1lM1ubltPJz4PIJwOYqBAKwWKxgk9UghBBX52mCSgZuBv5WhbGIWsDlcrFnzx7WrVvH2bNnAQgODqZ3n1i+2VlAatJGOm5/B6MoH7C4B0D8DKtvgHcDF0LUOp4mKBfwV6XUU8BhIL/0Qa11v8oOTNQsTqeTHTt2sH79+pL9mBo0aMDAgQOJiYmBghwaffswwfYcjCIIaNuLRiPuwq9Ja+8GLoSotSpSg5L5TvVQcXExW7duJSkpiaysLADCwsLo0r0324/7oLr0xG63Q3BDGrRog7Uom/BR02UFCCHEdfN0ou5zF18rpRoAVq11RpVFJbyuoKCAlJQUNm7cSF5eHgAREREMHjyYLl26MG/Of+l9bjUrv57K1NtGA3DDrY9g9Q8y+5mEEOI6eTyUSin1IPBHoLn7/RngX1pr6ZeqQ3Jycti4cSObN2+msLAQgObNm9MrJpZ27TsQmJXK6U/+zKiM3WCH9tadgJmgZKVxIURl8ihBKaUeBZ4GXgDWY67FNxD4g1IqX2v9r6oLUVSHjIwMkpKS2LZtGw6HA4DWrVszePBgjl7w4eP/reS28A+JzD8EgNU/iIZxN9Og73hvhi2EqMM8rUHNAn6ptf6kVNm3SqlU4HlAElQtdfr0aZKSkti1axeGYc65VkoxaNAgoqKiALAnfMVDQUshHyy+AYT2m0ho7E3Y/IO8GboQoo7zNEFFYO6kW9YWIKrywhHV5ejRo6xfv579+80dVCwWCz169KBP31g26hwWrzvOgz8z/9M2jxnEsS2fExozhtD+k6QpTwhRLTxNULsxt9X4vzLlt2FuAy9qAcMw0FqTlJRUshyR3W4nJiaGuLg4GjZsyJm922iwfh5RllyOnuxMy2ah2Bs0ptXDb2O1+3r5Ewgh6hNPE9QzwNdKqThgg7ssDhgH3FIVgYnK43A42LVrF0lJSZw7Zy4G4u/vT79+/ejduw/fH8vB99wh0hZ9TsGxvXSwg2H3p4k1AwgFkOQkhKh2ng4zX6mUGgk8hLkfVD6wF+irtd5RhfGJ61BQUMCWLVvYuHEjOTk5gDm5Ni4ujpiYGOw2K++8+i6dczZxym5OvrX6BxPabwIN+ozHFhDszfCFEPVcedttjAPWaa1zAbTWa4G11RWYuHaZmZls3LiRrVu3UlRUBEBkZCQDBw6kS5cu2Gw2LBYLhrOYIa6N+NozcfmHEj5gEg1ixmD1C/TyJxBCiPJrUF8DDqXUZmC1+ytJa11YLZGJCjt16hRJSUns2bMHl8sFmEPFBwwYQPv27dn3/WG++tcrNBtyMwP6dsRi86HJ6LvA6aBhz2FY7D5e/gRCCPGD8hJUOOZcpzhgEPBbwKqU2sgPCStZa+2s8ijFFRmGwYEDB9iwYUPJzrUWi4Vu3boRFxdH8+bNKTx9hLNLXse+ax3RhpNNiTYG9H0UgLBew8u7vRBCeE15+0FdAJa4v1BK2YAYzIQVB/wcCFdKrdNaT6iGWEUpDoeDnTt3snHjxpJVxX18fIiOjiYuLo6QkBB2J64mc/Fr+J3bB4AFCxmNujJ2rEyuFULUfB4vdaS1diqljgMngTPAUSASkP26q1Fubi6bN28mJSWF3NxcAEJCQtwj8noTEGBua/H9R68QciQJAIuPPyE9RxDabwJtw5p6LXYhhKiIchOUUioYGAaMwlxwrRNwDFgDzANu11qnVXGMAjh79iwbNmxg586dOJ1mq2qTJk2Ii4ujfYdO7Nz2HevX72T06FgAovoN4+DR3WREDaLflKkEhDTwZvhCCFFh5Y3iWwf0Ay4ACZjLGa3WWh+41ocppSYCfwXaYNbCXtJaz73W+9V1hmFw8OBBkpOTOXDghx97x44d6dO3L+3atCb/0HbO/vf/aHJ8F2ccrSke3hcfu5Wg9tH0+P07WKw2730AIYS4DuXVoAYCx4F3MQdEbNBaF1/rg5RSzYDPgJu11suUUjGY6/mlaK23Xut966Li4mJ27NhBcnJyycRau91Oz549iWrblQXLv8e2ZCl+Pt/jyDgNgMNip1mLpjgcTnzsVnPLC4s3P4UQQlyf8hJUW8ymvZHAg0CQUmo9EI+ZsLZqrQ1PH6S1PqmUitBaZyulrEBjwAFkX3P0dUxmZiYpKSls3bqV/Hxz0+LAwCBad+jGhDFDCAwM5My2tdyT9y4+FhcOwN4wkga9bySk53BZI08IUaeUN4rvCPCO+wulVE9gBGbCehooVkolAPFa69mePMydnAKBTPezX9Ra77+eD1DbGYbBsWPHSE5OZu/evSUrirdo0YLIlp15f0Ua+dY8pgaak2fD2nYi2wp+baJp2Hssge1jpBlPCFEnVWQU3w5gh1LqX0Bv4F7MZY+mAB4lKLcCIAjoASxVSu3XWs+rwPV1gsPhYPfu3WzatImTJ08CYLFYaXZDW8aPGUakr4sLW1bQPmw1DmcIDucU7DYrPqGRtPr129iDG3r5EwghRNW6aoJSSkUBsUB/9/cYzKa5JMy9oBIq8kCttQsoAjYrpd4CJmOOCKwXsrKySprxLm6lHhgYyP+3d/9RVpT3Hcffd3+wLHsXEPzBAiKC8EVYV8svE1E0h4OklqppjGmCPwPGtDY9ITXpEao2jcZflZPUNjHx2DaEWqqhodX0WG08MWpsXHZdQMGvBYsL2M0iYABhWZa9/eOZxesVbuDC7szd/bzO4Rx3npm5z9eZud/7PDPzPKPPmsgTL+0hvXUbqZ99jy1bwiDx/VNQcepQUm27oSoM3KrkJCJ9Qb6n+FYQElIN4T7RS8CTwK1Aw7GOIGFmFwNL3H1K1uIK4L1jrXSxyWQyNDc388orr3yoG2/g4KFcMnMGtbW1HNy+lUnrFtGf/ezfEiYGrK6dSfXkS6k4bXS8AYiIxCBfC6oC+DahhdQYtXyORxMwwsy+Snhk/XxgPvCp49xvYrW3t7NmzRrq6+tpbW0FwjBEY8cZ/7WmnWEd+5kw8RzKy8soO2UkVVWVlFaPZODk2aQnXUhJv8qYIxARiU++hyTmnsgPcvffmNllwN8AdxJe+F3g7s+fyM9Jgu3bt1NfX09TUxP794exdftVVHL+9KmcM3wwbHiZadUvkCLD7h2forLmZFKlZYxY8KC670REIkf9kMSJEL3vdGFPfmZP6ezs5M0332TVqlVs3Ljx0PIRI0aytjnDmD0tjFm/gt0vtwBQDlSMnMDg8rZD6yo5iYh8oEcTVG+0Z88eGhsbaWhoYNeuXQCUlJZybl0d06ZN49SBA/jfb8+nhAyd70Fp+iSq6y4hXfcJ+g0dEXPtRUSSSwmqAJlMhrfffptVq1axfv36Q3MvDRkyhG07MpzctoO6qRdTUxOeuqs8o5bS/gMYeO4sKseep/eWRESOghLUMdi3bx9NTU00NDSwffv2sDCVYvyY0ZydPsBJWxs4WNYKZdDeshGGTwZg+Lw7wtBDIiJy1JSgfotMJsOWLVtoaGjg9ddfp6OjA4DqdJrOve1M6mzGmlcDcBAoTQ8hXXsRg8aefmgfSk4iIsdOCeoI2traWL16NY2NjYceEQc488wxTJ8+jXFjx7BhyXzKO/aSKaugeuIFVNfOpP8Zk9SFJyJyAihBZTlSa2lART8Gd7xPbWczByfMY8KEswComX0tJRWVDBg/nZLyijirLiLS6yhBAXv37mXNmjU0NjYemj4dYHi6jLMObGZkx7uUpjJQCpXlrUBIUAMnXxpTjUVEer8+m6AymQybNm3ilfpVuL9BJnoSr6pqACP3xaNlEwAACfBJREFUbWVC6tcMbGsHoF/NGNITZ5CedCFlA0+Os9oiIn1Gn0tQu3btoqmpiaamJnbu3BkWZmDEqNHM+Ph0xo8fz6ZHF5FqH8LgupmkJ12o95VERGLQZxJU8+Yt/OhfnuTA+62HJpqtKjnI2My7jC3dQf/JVzL+7LMBGH3t7ZT0ryKV0pS0IiJx6TMJ6tlnnqbj/VZKyHB66jeMS+1gWGoPZelBpCfOZtAZpx1at7QyHWNNRUQE+lCC+uScS1m79D5GdW6jsqKcKvsY6dqLqBx9jh4LFxFJoD6ToEaMHEX1nMspqUwzYNxUPRYuIpJwfSZBAQycMifuKoiIyFHSGDwiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJIxfKYeSlAS0tL3PUQEZETKOt7/SMjJhRLgqoBmDdvXtz1EBGR7lEDbMxeUCwJqh64CPg/wszqIiLSO5QSklN9bkEqk8n0fHVERER+Cz0kISIiiaQEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiVQsI0kckZlNB55y91Ojv08BvgPMAfYDfw/c6e4Ho/KlwNVAR9Zu6tz9LTMbBTwKfAxoBb7s7v/RY8FQUDwXROVnA+8Ai9z9x1FZrPEcSyxm9jBwTc4uqoDF7v6tuGOBgo7NjcBfACcDbwB/5u4vRmXFGM+XgYXAUOCXwC3u/lac8ZjZbOBeYFz0uQ+4+/fNrB/wt8BVhNFnlrj7PVnbXQ18izCCwfPADe7eGmcsxxNP1vYLgYvd/cqsZbGfa4Uq2haUmaXMbAHwDNAvq+iHwKmEL+xaYDrwV1nlk4Er3T2d9e+tqGw5sIZwAd4ELDezMd0cClBYPGZWA/yUcOJWA7cAy6ITEmKKp5BY3P1L2ccE+BqwLoottlgKjcfM6oAlwBXAYGAZsNLMuq65YovnauBu4Maozv8OPGtm/aNtezweMzsdWAHcRfh//DngHjObA3wDMGAsMA243syui7abSPjCviGq7/9E9e8S13VTUDzRtmkzewB48DC7ju1cO15Fm6AIB+yPCAcTADMbAHwSWOjure6+A7gduCm6KCuBCUBT7s7MbDwwFbjD3dvd/TnCRTi/+0MBCogHuA74hbv/0N0z7v4s4UtlZ8zxFBILWeuOBe4HPu/uu4r02Izjg+srRfjVuy/athjj+TTwiLs/7+4d7v49oB2YFWM8o4HH3P0n7t7p7vXAz4EZwPXA3e6+0903AX8N3Bxtdw3wpLu/6O5twG3ADDMbF/OxKTQeCD9UzwS+n73DBJxrx6WYE9TD7j4FWJW1rCue97OWHQROIfwiOY/QtfeImW0zs0YzmxutNxFodvfsbd8AzumW2n9UIfFMATaZ2XIze9fMXgWGuftu4o2nkFiyPUj4Mlwd/V2Mx+Y/gdeAtYQv8vuAz7p7J8UZT0lOWVf5eGKKx91fcPcvdf1tZkMIg0q/Sui6W3eE+kzMLnP3vcDmqDy2Y3Mc8QB8zt2vAn6ds9u4z7XjUrQJyt3fOcyyPYRui/vNbIiZDQXuiIorCd1gLxB+QQ4ndFk8bmbnAmlgb84u9wIDuieCj9S9kHiGEJrsywgn8D3AT6IWSGzxFBgLAGZWC8wmfKF3KcZj0x9wQr9/FfDnhC6+YRRnPCuAL5rZVDMrN7ObCL0RlcQcD4CZDSK0DH4FNGTV4XD1yVff2GOBY47nsMc0koh4ClW0CSqPawm/WNcTbn6ujJa/5+7PuPtsd1/l7gfcfQXwHHA54ddhZc6+BgB7eqjeR3LEeAg3sp9296eieB4HGoHfJZnx5IulyxeAle6e/UswibFA/nj+Emhx91+5+353/y6wCfgMRRiPuy8n/ABaTmht1ALPAjuJOZ6oG+u/Ca2Hq4DdUVF2nbLrk6++sR+bAuLJJ/Z4jkdvTFA1wM3ufpq71wJbgfXuvtfMft/Mrs9Zvx/QRmg+j4ruU3WZwIeb1XE4YjyEpvpJOet3PZmZxHjyxdLlCj58wxqSGQvkj+d0oCJn/Q7gAEUYT/RAzpPufpa7DwO+SkhSDcQYj5nNJLQyVgJXuXubu+8EWggPFRyuPuuyy6L7b6Oi5bEemwLjySep59pRKfrHzA9jCfCamd1KOOnu44MnwUqB75jZesKF9VngAmCBuzeb2WrgbjO7LVp+BfDxng4gR754lgJ/YmbXAI8Rfp3XAVe7++YExpMvlq7HnMcAL2Vv5O6ewFggfzxPEbrLHidMxDYPmAT8NKHHBvLHMwu408wuAnYRuv/eAerdPRNHPFFX9lOEVxEeyin+UVTfNYRurlsJj9BDuFZeNLNLgJcJLcNX3f3NaL+xHJvjiOeIEnztHJXemKBuAh4BdhC6Wh6Kuldw95Vmthj4Z2AYoQUy192bo20/DfyA8K7Au8B8d3+th+ufK188q83sMsIXyXeBZuAP3H1ztG3S4jliLJHRwP7oCbJcSYsF8h+bR6L7CI8R3oNaB1yW4GMD+Y/PPxFurK8m9Dr8DLjc3btmPI0jnlsI95XvMbPsd4L+jpBAHwReJ/QU/QB4GMDd15rZF6K/RxBaLJ/J2j6uY1NQPEchiefaUdGMuiIikki98R6UiIj0AkpQIiKSSEpQIiKSSEpQIiKSSEpQIiKSSEpQIiKSSEpQIt0kGsR3WzToZ27ZYjPbY2ajY6iaSFFQghLpPl8hvAz/oYnlzOxMYDFhxIBNMdRLpCgoQYl0E3dvIcw1tMDMzs8qeogwJ1nucDYikkUjSYh0o2iyv5cIwwNNI4yc/zjwO+6+LlrnRmARYdid9YSW1dNRWRnwTeDzhClithOG6rrV3Q+a2TKgkzAL7ljCUFc/77EARbqRWlAi3Sgaq+6LhEF8byTMhHpXVnL6PcIgrYujdR4lzOk1PdrFbYSpv68lzNJ7G/CnwNysj7mGMHDoLMI0DSK9Qm8cLFYkUdz9NTNbQpiOez1wb1bxIuDeaC4vgA1mNpUwncUfEmbkvcHdfxGV/4OZfZ0wU+q/RcvWufuy7o5DpKcpQYn0jG8QZtX9prsfyFo+EZhiZrdnLSsnmq8nGoF/lpk9QJhevY4w6ntp1vobu7PiInFRF59ID3D3fdF/7sspKgO+BpyX9W8SYc4ezOwu4AnCtfoEcCmQO1VC7j5FegW1oETi9QZwhrtv6FoQtabagAeAPwa+4u5Lo7JKwmSCqRjqKtKjlKBE4nU/sNTMHHgOmA3cSbj/BGHywLlm9ktgEKGrcCAfnU5epNdRF59IjNz9CWAh8HXCfaeFwM3u/uNolesIT++tBf4V2AD8IzClxysr0sP0HpSIiCSSWlAiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJISlAiIpJI/w8B+6o23M9/UwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')\n", - "savefig('figs/chap07-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Can you find values for the parameters that make the model fit better?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Equilibrium\n", - "\n", - "To understand the quadratic model better, let's plot net growth as a function of population." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "pop_array = linspace(0, 15, 100)\n", - "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap07-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "sns.set_style('whitegrid')\n", - "\n", - "plot(pop_array, net_growth_array)\n", - "decorate(xlabel='Population (billions)',\n", - " ylabel='Net growth (billions)')\n", - "\n", - "sns.set_style('white')\n", - "\n", - "savefig('figs/chap07-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like. Remember that the x axis is population now, not time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", - "\n", - "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13.88888888888889" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the equilibrium the population tends toward." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dysfunctions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", - "\n", - "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see all the ways that can go wrong.\n", - "\n", - "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "def carrying_capacity():\n", - " K = -sys1.alpha / sys1.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity()\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", - "\n", - "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "def carrying_capacity(system):\n", - " system = System(alpha=0.025, beta=-0.0018)\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", - "\n", - "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", - "\n", - "\n", - "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "None\n" - ] - } - ], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", - "\n", - "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13.88888888888889" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys2 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys2)\n", - "\n", - "# print(K) This line won't work because K only exists inside the function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", - "\n", - "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", - "\n", - "For example, you could eliminate the temporary variable `pop` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "13.88888888888889\n" - ] - } - ], - "source": [ - "print(carrying_capacity(sys1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or if you had more than one system, you could compute the total carrying capacity like this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "27.77777777777778" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", - "\n", - "$ \\Delta p = r p (1 - p / K) $\n", - "\n", - "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.025, 13.88888888888889)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)\n", - "\n", - "system.r = system.alpha\n", - "system.K = -system.alpha/system.beta\n", - "\n", - "system.r, system.K" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func_quad2(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.r * pop * (1 - pop / system.K)\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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oUePHvj7+9O0aVOGDRtm+sulKDt27GDIkCE0b96cZs2aMXDgQKKjox/5exBCPBlu3rzJ4sWLWbVqFTk5OdSoUYORI0cSFBRU7OEEcgVVIkVHRzNlyhTmzJmDv78/eXl5LFiwgMGDB7Np0ybKly9/xz7Lly/n888/56OPPqJVq1YArFq1ipdeeonvvvvujlGChRCiKEajkb1797J161b0ej02Wg0dO3agcZNmqFSqx1aHXEGVQEeOHMHb25vAwEDUajU2NjaMGDGCsLAwUlJS7tj+1q1bfPrpp3z00Ue0b98ea2trrK2t6dOnD8OHD+f8+fNAwbwr8+bNo127djRv3pwxY8aYjrd3717CwsKYPn06zZs3p1WrVsycOdN0jt9++4327dvTtGlTnn76abZv327a75/h17ZtWzZv3nzP/YQQJVNSUhLff/89mzZtQq/XU8PeSLhylErx20zhlJqRy8xlhzl8KqlYaymzAdXtzVV0e3NVoWUfRuyh25uriI69alq2cXc83d5cxaxfD5uWJafdotubqxg8eWOh/V/7chvd3lzFmcTUYq29devWnDp1ikGDBvHjjz8SGxuLwWBg8uTJ1KxZ847tDx06RF5eHqGhoXesGzFiBH369AHgxx9/ZPXq1SxYsICoqCjKly/P66+/btr2zJkzWFlZsXPnTj755BNmz57N2bNnSUlJYcKECcydO5d9+/bRr18/pkyZct8+EP92PyHE45efn8/WrVuZP38+ly5dwtHRkQ7lswnJPYaDgyPlgrqbtk3LymXzvgt8vya2WH+fy2xAlWa1atXi999/p27duixdupTevXvTokUL5s6de9cfhpSUFJydne/b3HPZsmWMGjUKLy8vbGxseOutt9i3bx/x8fEAqFQqRo4ciZWVFS1btsTd3Z2EhASsra3RarUsX76cmJgYevfuzR9//HHfS/1/u58Q4vFKTExk/vz5bN++HaPRSJMmTXjllVdoHPYfbLzqU2Xof7mmrWLavpqHEyOf9uPtgU2K9fe5zD6DWvN5jzuWTRwadMeyzsHedA72LrTM1dn2rvt/9Xrrh67L2tqa/Pz8O5YbDAZ0Op3pdbVq1XjvvfeAggDatGkT06ZNw8XFhX79+hXa193dndTUVPR6/R0hlZGRgU6nw9ramsuXLzN+/HgmTpxoWq/Varl06RJarRYHB4dCNVhZ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OTnato6Y5/PPPycuLo7w8HCSkpK01w3YL88PP/zAxIkTCQsLY/To0fz9738HoLm5meXLlxMZGUl0dDQbNmxo87ivv/6a0aNHExoayqxZszh//rzds9xOnmv+9re/MXfu3DZtjnCttZvqoGw2m0pNTVXh4eEqPDxca09KSlIzZsxQ586dUxcuXFAvvPCCWrt2rbZ93Lhx6vvvv//dYz733HPqzTffVFevXlUZGRnKbDar8vLyu55FqfblOXv2rIqIiFDbt29XNptN7d+/XwUFBalTp07ZNU97z82vbdmyRY0dO1ZdvnzZrlnam6eoqEhFRESokpISZbPZ1GeffaYiIyOV1WrtkHl27typzGazOnjwoGppaVFbtmxRcXFxqqmpyW55qqqqlNlsVt98842yWq0qPz9fDRkyRO3du1etXr1aJSYmqrq6OlVRUaHi4+PVv/71L6WUUj///LMKDQ1V2dnZqqmpSf35z39W06ZN045rr3PT3jxKKXXlyhW1atUqNWjQIDVnzpw2x7XntXa7OmyBevfdd1VCQoLauHGj9iJraGhQgwYNUsXFxdp+eXl5Kjo6WtlsNtXY2KgCAwNVdXX1b45XVlamTCaTqq+v19oWL1583TfQO609eTZs2KBeeumlNscpKipSly9ftmue9mT5tZMnT6rQ0FBVVFSklOqY52bXrl0qLCxMlZSUKKvVqjZv3qyGDx+urFZrh8zzyiuvqDfffLPNccaMGaP27NljtzzZ2dlq+fLlbdrmzZun3n33XTV06FC1b98+rT01NVU999xzSiml1qxZoxYtWqRta2hoUCaTSR0/ftyu56a9eZRSKjExUc2fP1+9/vrrbQqUva+129Vhb/FNnTqV7du3ExQUpLXZbDYA3NzctDYnJydqa2u5dOkSRUVF6PV6li9fTnR0NAkJCezZsweAY8eO4e3t3eaxfn5+lJSUOGyewsJCfHx8ePXVV4mKimLChAmcO3cOo9Fo1zztyfJrq1atYsqUKQQEBAAd89wMGzaMAQMG8OyzzxIUFMTq1atJTk7GycmpQ+ax2Wy4urq2OY5er+fEiRN2yxMREcGKFSu03+vq6sjJyWHw4MHU1NTQv39/bVu/fv0oLS0F4OjRo/j7+2vbXF1d8fb2prS01K7npr15ANasWcO6devo0aNHm2Pa+1q7XR22QPXq1es3be7u7gwd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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results = run_simulation(system, update_func_quad2)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap08soln.ipynb b/soln/chap08soln.ipynb deleted file mode 100644 index 4ce822af..00000000 --- a/soln/chap08soln.ipynb +++ /dev/null @@ -1,1067 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 8\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install modsimpy\n", - "# https://pypi.org/project/modsimpy/\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install pint\n", - " !pip install modsimpy\n", - " !mkdir figs" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Functions from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates2.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates2.csv\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table2(filename):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table2 = tables[2]\n", - " table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - " return table2" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "#table2 = read_table2()\n", - "#table2.to_csv('data/World_population_estimates2.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Yearcensusprbunmaddisonhydetantonbirabenmjthomlinsondurandclark
    Year
    1950195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
    195119512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
    195219522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
    195319532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
    195419542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " Year census prb un maddison \\\n", - "Year \n", - "1950 1950 2557628654 2.516000e+09 2.525149e+09 2.544000e+09 \n", - "1951 1951 2594939877 NaN 2.572851e+09 2.571663e+09 \n", - "1952 1952 2636772306 NaN 2.619292e+09 2.617949e+09 \n", - "1953 1953 2682053389 NaN 2.665865e+09 2.665959e+09 \n", - "1954 1954 2730228104 NaN 2.713172e+09 2.716927e+09 \n", - "\n", - " hyde tanton biraben mj thomlinson \\\n", - "Year \n", - "1950 2.527960e+09 2.400000e+09 2.527000e+09 2.500000e+09 2.400000e+09 \n", - "1951 NaN NaN NaN NaN NaN \n", - "1952 NaN NaN NaN NaN NaN \n", - "1953 NaN NaN NaN NaN NaN \n", - "1954 NaN NaN NaN NaN NaN \n", - "\n", - " durand clark \n", - "Year \n", - "1950 NaN 2.486000e+09 \n", - "1951 NaN NaN \n", - "1952 NaN NaN \n", - "1953 NaN NaN \n", - "1954 NaN NaN " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2 = pd.read_csv('World_population_estimates2.csv')\n", - "table2.index = table2.Year\n", - "table2.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Estimated world population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Running the quadratic model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Update population based on a quadratic model.\n", - " \n", - " pop: current population in billions\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the starting time and population." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the system object." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model and plot results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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CfDRRx/RtGnTq50rhBCiljh16hR33HEHuP/Ol1ZbEpQToGnTpkRFRXk7FiGEEJXvR903MkhCCCFEjSQJSgghRI0kCUoIIUSNJAlKCCFEjSQJSgghRI0kCUoIIcQ1qeql8iRBCSGEqJDCwkK+/vpr/vrXv6J12b08K09tmQclhBCiBtBa8/XXX5OdnY3VasXHp7y9Oq+PJCghhBBXlZOTw/Lly9mzZw8ALVq0YNKkSURGRlbZMyVBCSGEuCLDMNixYwcrVqygoKAAHx8fRowYQb9+/bBaq7aXSPqgqplSir179/6ofPLkyXz++ecl7xcvXszkyZOJjo6mb9++3H///SX/crmSdevWcc899xAbG0u/fv2466672LRpU6V/BiFE/XDhwgX+85//8NVXX1FQUEC7du2YOXMm/fv3r/LkBFKDqpE2bdrE888/z+zZs4mOjqaoqIj58+dz9913s3LlSho1avSjaz777DNeeeUV/vKXvzBkyBAAvvrqKx544AHeeecd+vTpU90fQwhRS7lcLpKTk1mzZg3FxcX4222MGTOaXn36YbFYqi0OqUHVQDt27KB169b07t0bq9WKv78/Dz74IBMmTOD8+fM/Oj8/P5+//e1v/OUvf2HUqFH4+vri6+vL1KlTmTFjBocPHwbA6XQyZ84cRo4cSWxsLA8//HDJ/ZKTk5kwYQIvvfQSsbGxDBkyhNdee63kGf/73/8YNWoUffv25Sc/+Qlr164tua5s8hsxYgSrVq0q9zohRM105swZ3n33XVauXElxcTHtglxMNHbS7EhCSXLKyC7ktYXb2b7vTJXGUmcT1E2PfMVNj3x1Sdmf523kpke+YtOeUyVlyzcc4aZHvuL1/24vKUvPzOemR77i7ueWX3L9b/6ZwE2PfMWBYxlVGvuwYcPYt28f06dP54MPPmDPnj04nU6ee+452rdv/6Pzt23bRlFREUOHDv3RsQcffJCpU6cC8MEHH7Bo0SLmz59PYmIijRo14re//W3JuQcOHMDHx4f169fz17/+lTfeeIODBw9y/vx5nn76ad58801SUlKYNm0azz///FXnQFzrdUKI6udwOFizZg1z587lxIkThISEMLpRHgMKdxMcHELD/pNKzs3MLWRVylHeXbynSn+f62yCqs06dOjAl19+SadOnViwYAG33HILAwcO5M0337zs/wznz58nNDT0qsM9Fy5cyK9+9StatmyJv78/jz32GCkpKRw5cgQAi8XCzJkz8fHxYdCgQURERJCamoqvry92u53PPvuMXbt2ccstt7BixYqrVvWv9TohRPU6duwYc+fOZe3atbhcLvr06cOsWbPoNeFn+LfsQov7/s5pe4uS81s1bcDMn/Tg8bv6VOnvc53tg1r8yuQflT1zX/8flY2La824uNaXlDUODbjs9a/+dth1x+Xr64vD4fhRudPpxM/Pr+R9q1at+OMf/wiYCWjlypW8+OKLhIWFMW3atEuujYiIICMjg+Li4h8lqezsbPz8/PD19SUtLY0nn3ySZ555puS43W7nxIkT2O12goODL4nBx8cHl8tFcHAw77//PnPnzmX69On4+/tz9913M2PGjHI/a3nXSZISwvuKioqIj48vGUzVKKwho7q1ovOICeYJbXvh37oHL364mQ27TvLKw0PocEMYAGP7t67y+OpsgqqpmjZtSlpaGt27dy8pczgcpKWllewWfPvttzNmzBjuueceABo1asS0adPYtWvXZWdtR0dH4+/vT2JiIqNGjbrk2Msvv0xqairvv/8+kZGRPPPMMwwePLjk+L59+2jdujXbtm27YsyZmZkl/VfFxcV8++23PPTQQ/Tp0webzUZxcXHJuYZhkJmZedXrZNCGEN514MABlixZQmZmJhaLhT5tm9Lx5HqsG9ZR2Kkbfs3N7gSr1UrTRkH4+9o5eS63JEFVB2niq2YTJkzg9ddf5+DBgwBkZGTw0ksvERERQY8ePQC48cYbmTNnDqtWraKoqIiioiKSk5NJTExk5MiRP7qnr68vjz76KM888wzx8fE4HA7y8vKYP38+X375JbNmzQJgypQpvPHGG5w8eRKn08lbb73FHXfcQUFBQbkxnz9/nvvuu49Nmzbh4+NDkyZNsFgshIaG0rJlS4qKili6dClOp5P333+f3Nzcq14nhPCOvLw8vvjiCz766CMyMzNp0jiMyeE5dEpdgbUol4B20WzYn8X3R34YkHXb6I7M/cNIhkRX747mUoOqZrNmzcJmszFjxgzS09Px8/Ojf//+vPfeeyXNc3fddRf+/v7Mnj2bxx9/HMMwaNeuHc888wyDBg267H1vu+02QkJCmDt3Lk888QSGYdClSxfmzZtH3759AXjggQdwOBzccccdZGRk0LFjR+bNm0eDBg3K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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To generate projections, all we have to do is change `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap08-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system.t_end = 2250\n", - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'World population projection')\n", - "savefig('figs/chap08-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The population in the model converges on the equilibrium population, `-alpha/beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13.856665141368708" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results[system.t_end]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "13.88888888888889" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "p0_array = linspace(1, 25, 11)\n", - "\n", - "for system.p_0 in p0_array:\n", - " results = run_simulation(system, update_func_quad)\n", - " plot(results)\n", - "\n", - "decorate(xlabel='Year',\n", - " ylabel='Population (billions)',\n", - " title='Projections with hypothetical starting populations')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare the projection from our model with projections produced by people who know what they are doing." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates3.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/notebooks/data/World_population_estimates3.csv\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table3(filename = 'data/World_population_estimates.html'):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table3 = tables[3]\n", - " table3.columns = ['census', 'prb', 'un']\n", - " return table3" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "#table3 = read_table3()\n", - "#table3.to_csv('data/World_population_estimates3.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Yearcensusprbun
    Year
    201620167.334772e+09NaN7.432663e+09
    201720177.412779e+09NaNNaN
    201820187.490428e+09NaNNaN
    201920197.567403e+09NaNNaN
    202020207.643402e+09NaN7.758157e+09
    \n", - "
    " - ], - "text/plain": [ - " Year census prb un\n", - "Year \n", - "2016 2016 7.334772e+09 NaN 7.432663e+09\n", - "2017 2017 7.412779e+09 NaN NaN\n", - "2018 2018 7.490428e+09 NaN NaN\n", - "2019 2019 7.567403e+09 NaN NaN\n", - "2020 2020 7.643402e+09 NaN 7.758157e+09" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table3 = pd.read_csv('World_population_estimates3.csv')\n", - "table3.index = table3.Year\n", - "table3.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projections(table):\n", - " \"\"\"Plot world population projections.\n", - " \n", - " table: DataFrame with columns 'un' and 'census'\n", - " \"\"\"\n", - " census_proj = table.census / 1e9\n", - " un_proj = table.un / 1e9\n", - " \n", - " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", - " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model until 2100, which is as far as the other projections go." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=2100,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap08-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "\n", - "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", - "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)\n", - "savefig('figs/chap08-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "People who know what they are doing expect the growth rate to decline more sharply than our model projects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", - "\n", - "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", - "\n", - "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3xUVfr48c/UTJJJ74XQufRIB+nFBihIUVfsiqy6ruuuulZcV9m17O6PXVlX/cpaUcCGZVUQkKoQeqgXEkp67236749JQggBJiEkAzzv1ysv4d5z7z0XYZ455zznHI3L5UIIIYTwNtr2roAQQgjRFAlQQgghvJIEKCGEEF5JApQQQgivpG/vCrQGRVF8gCFANuBo5+oIIYTwnA6IAbapqmppeOKSCFC4g9PG9q6EEEKIFhsNbGp44FIJUNkAS5YsITo6ur3rIoQQwkM5OTnMmTMHaj/HG7pUApQDIDo6mvj4+PauixBCiOY7bXhGkiSEEEJ4JQlQQgghvJIEKCGEEF5JApQQQgivJAFKCCGEV5IAJYQQwitdKmnmogVsdgeV1XaqLSd/nC4XvTuHodNq2rt6QojLnASoy9S6nRks/GQnDufp+4Hddm1Pbr5KaYdaCSHESdLFd5lK2p+Dw+nC36QnKtSPTjGBKAkhAKxYn0pVja2dayiEuNxJC+oylV1YCcD8+4bTu3NY/fE/LtrIgWNF/PDLcWaM795OtRNCCGlBXbZyCtwBKibM/5Tjsyf2AODL9alYbLIwvBDNoSgKBw8ePO34tGnT+OKLL+p//8033zBt2jQGDBjAkCFDmDt3Lvv37z/rvTdu3Mhdd93FsGHDGDp0KLfffjtJSUmt/g7eRALUZaiiykpFtQ2TUUdwgM8p5wb1jKRrfBAl5RZWbz3RTjUU4tKVlJTESy+9xPz589mxYwcbN25k4MCB3HnnnRQVFTV5zWeffcYTTzzBbbfdxsaNG9m0aRM33HAD999/P9u3b2/jN2g7EqAuQzmFVQBEh/mj0ZyarafRaOpbUZ+vS8HucLZ5/YS4lO3Zs4dOnToxaNAgtFotJpOJBx54gClTpjQZoKqrq3n55Zd58cUXmTRpEkajEaPRyOzZs5k3bx7Hjh0DwOFw8OabbzJx4kSGDRvGI488Un+/rVu3MmXKFF599VWGDRvGmDFjeP311+uf8fnnnzNp0iSGDBnCzJkz2bBhQ/11gwcPPqU+EyZMYPXq1We9rrXIGNRlqG78KSrUr8nzI/rG0CHKTHpuBet2ZDBpaEJbVk+Is3rhnS1sP5jbJs8a3CuK5+8b3qr3HDduHG+88QZ33HEHkyZNYtCgQfTs2ZMXXnihyfK7du3CarUyduzY08498MAD9b/+4IMP+Prrr3n33XeJjIzklVde4dFHH+X9998HICUlhUmTJrFp0ya2bt3Kfffdx+TJkwkJCeG5557jq6++onv37nz66ae89NJLrFy58qzvUVRUdMbrGn/xbSlpQV2GcmoDVEy4f5PntVoNsya4W1GfrT3cZCq6EKJlunfvzooVK+jZsyfLli1jxowZjBw5kv/85z+4XKf/WysqKiIoKAiDwXDW+y5fvpzf/OY3JCQkYDKZePzxx9m2bRvHjx8H3L0jDz74IAaDgVGjRhEREcGJEycwGo3o9Xo+++wz9u7dy4wZMzwKMi29rjmkBXUZyq5NkIgOazpAAYwZEMeSlYfIzK/k5+QsRl8R11bVE+KsWrtF05qMRiN2u/204w6HAx+fk+O9HTt25OmnnwbcAWjVqlW88sorhISEcMstt5xybUREBCUlJdhsttOCVHl5OT4+PhiNRrKysnjmmWeYP39+/Xm9Xk9mZiZ6vR6z2XxKHQwGA06nE7PZzPvvv89bb73FHXfcgclk4s4772TevHlnfdezXSctKNFidWNQjTP4GtLrtMwa3w2AT9ccbvKbnRDiVNHR0WRlZZ1yzG63k5WVVb/b96233sp7771Xfz40NJRbbrmFyZMno6rqafccMGAAJpOJ9evXn3butddeY+7cuQBERkbyr3/9i+3bt9f/fPbZZwwZMuSsdS4tLa0fv0pKSuKvf/0r//73v9mxYwc6nQ6b7eScSJfLRWlp6Tmvay0SoC5DdWNQ0eFNj0HVmTgkgdBAH45llfGfL5LZdiCHiiqrR89w2q1Uqknkf/cmBSsXU5r0LZWHt2HNT8dps5z3OwjhjaZMmcKiRYtITU0FoKSkhFdffZWIiAj69+8PwHXXXcebb77J6tWrsVqtWK1Wtm7dyvr165k4ceJp9zQajTz22GPMnz+fNWvWYLfbqaqq4t1332XFihU89NBDAEyfPp1///vfZGdn43A4ePvtt5kzZw41NTVnrXNRURH33nsvSUlJGAwGoqKi0Gg0BAUFkZCQgNVq5bvvvsPhcPD+++9TWVl5zutai3TxXWZsdgeFpdVoNRAZcvYAZTTouGmSwptfJPP9z8f5/ufjaDTQMTqQ3p1DuXFct1O6CZ02C9Wpu6g4+DNVKTtwWc/8DyPXEI956DT6jBmHVivfk8Sl4aGHHkKn0zFv3jwKCwvx8fFh+PDhvPfee/Xdc7fffjsmk4k33niDJ554ApfLRdeuXZk/fz6jRo1q8r4333wzAQEBvPXWWzz11FO4XC569+7N4sWL61tI999/P3a7nTlz5lBSUkKPHj1YvHgxgYGBZ61z586deeGFF3juuefIy8sjJCSEZ599lu7d3RP1n332WV577TWef/55pk2bxsCBAz26rjVoLoWuG0VROgHH1qxZQ3x8fHtXx6tl5JXzwCtriQz1Y/EzV3l0zZ7D+ew+ks+BY4UcTiupTz0PDzLx2m/HEBZkonz3agrXfIDLUlV/nTG6K/49h6HRGbAWZZORegxbcQ6h2gp0GvffuzxNOM4+1zHo2in4+BjIKaxkb0oBySkF7DtaSKeYQJ69eyg6nQQxIS5FGRkZdS3HzqqqHm94TlpQl5mT409nbz01lNgjgsQeEQBYbQ6OpJfw/v8OcPB4Ea+8vYZH4vdgPbYTAJ+Ybvj3vhL/nsMxBEcB7qSMv3+8A/VENBoNzB4dT0LpLoLT1hFJAez7kOS9X/GLZiBriuJxNuh5Liip5rOfjnDzJFm8VojLjQSoy4wnGXxnYzTo6NMljOfuHcb//esDJlnWYj1mQePjT8R1czH3GV1f1ul0sXZ7Gm+v2Eu1xUF4kInf3zqIft3CgUFYa25j9/cr0B9cSRhlTGUdw4MDORI2lqB+o/A1GVm4dBefrFQZ3DOKrvHBrfFHIIS4SEiAuszUz4FqYYAC91hTzdp3mO5YC1pQbdEciLyR3/UcCYDd4WTDrkw+W3uE9NxyAEYlxvLQrETMfsb6+xhNJobeeAvOG2ZxdNOPaPZ8TXh5HuHF32A4uJvQMb9i6shOfLv5OP/4ZCf/73djMRp05/H2QoiLiQSoy8zJDL6WBShHdTk5y/+KJUNFozeiGTyLD38yUX6oEuPnyXSND+Lzn1LIK3J3JYYH+3L7db0YPyj+jHMjtDo93cZeh2v01ZQnr6Nk43Js+enkfv4qkyM7UR7ekw05Lj764RD3XN+nZS8uhLjoSIC6zHgyB+pM7GWFZC99EVt+OvrAcKJvfgZjZALPdSni2Tc3s2rrCdjqLhsX4c+sCd0ZO7ADBr1nCQ4arY7AKyYS0HcMZbvXULL5M2x5x5nBcYYHhbDy537s6xVB326Rza67EOLi41GAUhQlEXgT6A8cBe5RVXVbE+USgMXAcCAPeFhV1e9qz/kB/wCmAT7AxtrzabXnxwP/BLoCe4DbVVVNPa+3E6dwOl3k1rWgmpEkAWAtzCTn4z9jLyvAENGBmFueQx/o3keqV+dQnrh9MK9+tIP4SDM3TezB8H4xLd42XqM3EDT4WgISx1O+ew0lv3xJbHkRd5s3kL9sL0VT7ySk/6hWXVJFCOF9zvnVVlEUI/AVsAwIBhYAqxRFaSq5fimQDIQBc4GliqJ0qT33MtAN6AvEAbm15VEUJRxYAbxQ+4wvgZWKokhucSsqLq/BancS6G/Ez3T2db0aqslKIeuDZ7GXFeATpxB7+4v1wanOsL4xLH1pMv/8/ThGJsa2ODg1pDX4EDRkMgkPvkHI1XMp0wQQQTEl3y4kZ9lfsJfmn/czhBDey5MAMA4wqKq6UFVVm6qqS4H9wM0NCymK0gMYDMxXVdWqqupa4Gvg3toiJuBPqqoWqqpaDSwChimKogdmAPtVVf289hmv4W5lnT6tWrRY9hk2KTybqqO7yf7oeZxVZfh2HUjMnOfR+QY0WdbTrrzm0ugNhAy5lpA7/8Hn1cOpchqoTt1J+tu/o3Tbd7hcsiWIEJciTz5RegONt4g8BPRrolyaqqqVTZVTVfV+VVU3NTg3Hdinqqq99toDje6nNvEMcR5yCpuXYl6+dz05y/6Cy1aDue8Yomf/Ea3B59wXXiAd40IZPutWXi6bxm5rAi5rDYWrFpP1wbNY89PbrV5CiAvDkwBlBqoaHasCGg9ieFoORVFuAZ4AHm7utZeao5mlbNmXTXH52dfLag3ZdRsVnmMNPpfLRcmWr8j/+l/gdBA0fBoRNzyMRtf+OTWjr4jj9plX8m7FOBaXj8PuE4glQyXzv09Qvndde1dPXOY82fL99ddfp3///qSkpJxSpqnNAet88cUX9OrViwEDBjBgwAASExO57rrrWLx48SkLOU+YMIH+/fvXl6v7ueaaa+rLnDhxgoceeoghQ4YwYMAApk6dykcffdTkcydPnsyYMWNOWTC2LXnyiVMJ+DY65gdUNLecoiga4DngUWC6qqobGlzb+FOzqWdcUg6dKOLpNzZjs7u7qGLD/endOYzenUMZoEQSHtz4j/P8eDIHyuVyUrT6fUqTvgUgdNJdBA+7vlXrcb6uGd6Rqhob//0GnsuNZn6/o/imJ5H/9etYslMJm3inVwRTIc7EYrHw2GOPsXz5coxG47kvAHr06MFXX30FuL9E7tq1i8cee4yysjIeffTR+nL/+Mc/mDRpUpP3cDqdzJ07l6lTp/K3v/0Nk8nE7t27eeihhzAajdx00031ZesWgY2IiGDVqlVMmTLlPN64ZTxpQR0AGq8z05PTu+QOAAmKovg2VU5RFAPwCXAnMEpV1dUteMYlI6+oigX/TcJmdxIfacbHqCOroJLV29L41/LdPPDKGsoqPVs53FPn6uJz2W3krVjoDk5aPZHTH/W64FTnxnHduPmqHlQ5jTy7rzfVg24FrZ6ybd+R/fEL2CtK2ruKQpzRiBEjqKqqYuHChS26XqPRMHDgQF566SUWL15MWVmZR9cVFxdz4sQJpk6diq+vLxqNhgEDBvDEE0+cVnbZsmVcddVVzJo1iw8//LBF9TxfnnzN/AnQKIryKO7Ehpm4082/bFhIVVVVUZQ9wAJFUZ4CrsSdUj6itshCIBEYrqpq4/SrL4FXFUW5qfbXjwBOYF1LXsrbVdXYePG/WympsJDYPZw/zXX/ER3LKuXAsSK+23yMrIJKth/MYcLg1ttuPbugdg5UE5N0bSW55H3xDyzZKWiMvkTPegLfzv1b7dkXwpxrelJZbePbTcf403of/jr7cQwb36Qm7QCZ/32cqJlPYIprvZWVhXfIXrqA6tSdbfIs364DibnlmVa/r5+fH6+++iq33XYbY8eOZdiwYS26z4gRI9BqtezatavJLeEbCwsLY+jQodx9993ccMMN9d1806dPP6VcUVERa9as4fvvvycgIIBXX32VvXv30q9f26YFnLMFpaqqFbgOd2AqAp7B3T2XryjKHEVRGnbDzQR64Z4D9Q5wr6qq+xRFCQZ+DXQBjimKUtHgJ0hV1TzgeuCp2mfMAq6vffYlxeF08dpHOzieXUZchJkn7xiCXqdFr9PSvUMI08Z05frR7sz8rftzWu25ldU2yqusGA06QgJOTXSoOPQLme88hiU7BX1QBLG3/9nrgxO4v0XOndaPcYPiqbE6ePGbAkwz/4xPfE8c5UVkffgsFfs3nftGQrSDK664gnnz5vHkk0963AJqrG7/pYqKkx/Djz32GIMHDz7lZ9GiRfXnFy9ezNy5c0lOTubhhx9m+PDhPPjgg+TknPy8+fLLLxkxYgQxMTGYzWZuuOGGM45TXUgeddSrqroPOG2jElVVlwBLGvw+HXcwa1yuBDjrImq141EDPKnPxey/3+xj+8FcAvyMPH/f8FPWpqsztHc0b325l11qHja7A4P+/Nefy24wQbdugqvTbqVo9fuU7fgBAL8eQ4mY+hA6X/N5P6+taLUafnvTAApLatibWsBLS1VefuBZqtZ/QPmuVeSt+H/YSvIIvvJGmdh7ibgQLZrW4umW73UefPBBNm3axAsvvHDK+I+nHA4HZWVlxMTE1B/729/+dsYxqLo63nbbbdx2221YrVZ27NjBwoULeeSRR1i2bBkul4vly5eTl5fHyJHu9TUtFgsWi4UnnniCsLCwM967tclE2DZSVFbD8tWH+XrDUfQ6DU/fNaTJrjaAyFA/OsUEUm1xsDelsFWe3zhBoibzCFnvP+MOTlo9YVffQ9SsJy6q4FTHoNfy9F1DiI80czy7jFc+2kXw1fcROulOQEPxuiUU/O8/uBynf3AI0Zo82fK9IZ1Ox2uvvcbatWv59ttvm/28pKQkXC4XPXr08Kj8smXLuPHGG+t/bzQaGTFiBI8//nj9dvNbtmyhpKSEH374gRUrVrBixQq+//57unfvztKlS5tdx/MhAeoCySuu4n+bj/H3JTu4d8GP3PnCSj783p1++tCsK+jbNfys1w/r4/7LnHSgdbr5sgsq0eCkryGNrA+eJeu9J7HmHEUfHEXcnQsIGjLlom5hmGtbpEFmI7sO5/PmF3sJGno9UTMfQ6M3Ur5nDTnL/oKzpvLcNxOihTzZ8r2xhIQEnn76aZYvX+7xc5xOJ0lJSTz33HPMmzcPs9mzL5Zjx44lLS2NV155hcLCQlwuF+np6bz77rv1280vW7aMa6+9lqioKCIiIup/brzxRpYuXdqmKeeSi1vLWpiJISQajfb8u9Pyiqt4+G8/UVVz8hu7r48epWMI4wfFe5T4MLRPNMtWHybpQA7zbuzX4uDhcrlwlBdiSl3Hs0GbCU+roAbQ+vgRMPBqQq6cgdbU8q03vEl0mD/P3TOMp99wL1wbHebH7InDiQkIJWf5X6k+tofMD54l5pZnT1uqSYjW4MmW702ZPXs269evZ8uWLWcsc/jwYQYMcI+C6PV64uLiuO+++7jllltOKff73/8ene70z7EffviB6OhoPv74Y15//XWmTp1KdXU1ISEhXHvttfz2t7+lsLCQ1atX89577512/dSpU3nllVdYuXIlU6dO9fBP5PzIlu+AJSuFzHf/iJ8yjKiZj593S+KfS3exelsaPRKCmTQkgZ6dQkmIDmzW+nROp4u7/ryS4nIL//rDODrHBp37GpsFe1kh9uJsLFmpWLJTsGSn4KgsrS/j8A8ncuQ0AhLHozW27jwrb7E5OYtXPtiGywUvPzSKPl3CsJXkkrN0AbbCTPdK7Lc+jzEstr2rKsRlT7Z8Pwd9UARaHz+q1K1UHtiMuc9p+SAeS88tZ+32NHRaDX+YM4jY8JaN6Wi1Gob0jmbV1hMk7c+hc2wQTrsVe0ketqJsbMU52ItzsJXk4igvxF5WhLOm6XnNWpOZw9UhrK/owgP33UVQVFPr/F46RvaPZfbEHixffZhFn+7mX38YhyE4itg7FpCz/C9YMg+T9cEzxNz8DD6x3dqkTg6nq1UW0BXiciIBCtD5BxE68U4KvvsPBasW49u5Pzq/ln2IL/nhEE4XXDu8Y4uDU51hXf3I3XkCn527ST9WjC0/AzhLi1enRx8Qij4oAp/orvjEdMUnthsucwSPPOUegI0Ku/iSIFri5kk92Lwni4y8Cj5dc4Rbr+mJzi+AmFufJ/fzv1F9dBdZS54netYfL3hK/b7UAp5982fuub4PN4zpekGf1ZDL5cJemo/W4IPO/9wtcCG8jQSoWgFXTKRi/0ZqTuyj8Md3iZz2SLPvkZJewubkLIx6Lbdc5VlWTWPWvBOU711PVepOwvPTuScAsIMtH9Bo0QdHYQiJdv+ExqAPjkIfGIY+IAytX2CT3ZOZ+RU4XRAZ4nvBVhz3NkaDjt/MTuSpNzbz6ZrDjEqMJSE6EK3RRPRNfyTvm0VU7t9E9rIFRE77HeZeI8590xZatzMDh9PFB98fZGRiLGFBF6Zr1VqYiSVDxZJ7DGvucSy5x3FZ3JOzjZEd8e2ciG+XREwderXror9CeEoCVC2NRkPElAfIePtRKvZtwNx7FH7dBzXrHh98516ZacqoLs36ELJXlFCxfyMVe9djzT12sk56I1naGHaWhNB/9EjGTBqNRu/5Pk516rbZ8HQV80tF367hXDO8Iyu3nGDRp3t4+aFRaLUaNDoDkdMeodA3kLLt35H3xd+xj7+VoBEXZq5U8pECACxWB0t+OMRvb2696X6OylIqDmyiPHk91pzT9/fU+QfhtFRjzTuBNe8EpVu/RqMz4N9rBOGTfy2BSng1CVANGEKiCRn3K4pWv0/+92/SIeGfaH08W1B9b0oBuw7n42fSM2vCuZfXcbmcVB9Lpmz791Sl7ITaPY20JjPm3iPx7zMSU1wP1KRMVn22h5JMf8a2IDgB9bvonmne1aXsrql9SNqfw8HjRfyw5TiTr+wMgEajJezqe9CZgyle9zFFPy3BknOMiKkPoTWaWu35ecVVZBdW4mPUYbc7Wb0tjetHd/Eo6eVMnNZqqlJ2UrFvA1Wpu8DpANyZmb5dEvGJ7oIxqjPGqE7ozSG47DZqMg5RfWwPVUeTseYcpWLfBhyVJUTNflKClPBaEqAaCRoyhcoDP2PJOkLh2g+JuG7eOa9xuVz1racbx3Uj0P/MqxM7ayop37uOsu0/YCuqndCn1eHXbQjm/mPx7zb4lFbSkN5RAOw+kk+N1Y7J2Pz/ZfXbbFxmLSgAs6+BeTf25+UPtvHetwcY1ie6vnWr0WgIGTkTY0QCeV/9k8qDP2MrzCRq1hMYQk6fVNkSe1PcrafEbhFEhvry7aZj/Peb/fz5/hHNaq05aiqpOrKNykNbqD66B5e9dhUwjRa/boMw9x+HX/fBaPWn/93T6A34duqHb6d+hI4Ha34a2Uv+RPWxZHI/fYWodt7nS4gzkQDViEarI2LKg2Qsfpzynavw7z4Ev24Dz3rNtgO5HDpRTJDZyA2ju5x23uVyYclOpXz3Gir2bcBlc+/9pAsII3DQNQQkTkRvDm7y3mFBvnTrEExKegnJRwoY2qf5H5x5xe4AFRV6yW+v1aQr+8cwrE80W/fn8OYXyTxz96kLc/r3GELc3S+T++nLWPNOkPnuH4m88ff4dU4872cn1waoft3CGT8onp+2p7P7cD47DuUxuFfUWa+1leRSdWQHVSk7qD6+D5wn59X5xCuYe12Juc/oZidAGCMSiJnzAlkfzaf62B5yP3vVHaSaCG5CtCcJUE0wRiYQMnImxRuXkbNsAX7dBhE8anaTK2M7nK76FSJmT+yBn+lk68dRWUr5vvWU71mLrcGOr6aOfQkafB1+PYZ4NDF4aO9oUtJLSDqQ06IAlV8boCJCLs15T+ei0Wj49Yz+JKcUsGVfDv/bfIwpIzufUsYYHk/s3a+Qt2Ih1ak7yfnkJcx9RxMy+qYWt6ZcLhd7U90Bqn+3cILMPtw0SeHdb/fz32/2M6BHBDrdyaQVR3U51tzjVB3dTdWR7dgKMhq8hBZTx7749xyOvzIMfUBoi+pU/74RHYid8wJZS56n+uhucj99lajZT0iQEl5FAtQZBI+cgdNuqR0jcn+L9e0ygJDRszHFn9y6asW6FI5nlxEe7Ms1g6KpPr6XmszD1KQfpPpY8snxAb9AAvqNJSBxAsaI5m2hMaxPNB+vPETS/hycM11omzmfpqDE3WKLaOUNEC8m4cG+PDizP3//eCdvr9hLXIQ/V/SIPKWMzuRP9E1PUrxxOSU/f0nF3vVU7NtIQP/xBI+ehSEo8gx3b1pOYRX5xdUE+emI97dizUvj6s5WDoYWUFN0nKQvc+kRVIM1Px1rfhqOiuJTrtf4+OHXJRG/boPw6zqw1VPFjZEJxM75E1lL/kT10V3ultTMx6W7T3gNWUniHByVpZRs/Zqy7T/Ud81pfQPQmvyx63xRsy1UOQ30i3SiL8usT3YAascHBhLQfwJ+3Qei0bUsycHlcnHPi6soKK1h0WPj6Rjj+Rwtq83BzCe/RafV8Pkr11/2k0Xf/98BPlt7BH9fA39/ZAxxEU3PC7MV51C86TMq9q53/z/V6gnoPw5TvFKb6h+FzhyCRqvD5XS4V/AoycVWnIu9JBd7aT75GRnUFOUSpKtGe7b5a7U0Bh+M4fGYEvrg120gpg692mRnYEvucbKX/AlndTmmDr2IuukpdJfI8lfC+8lKEudB5x9E2ITbCR4+jdKt31C64wec1eU4q8sBUOpiTimg0WKM7oIpXnH/dOyL3hxy3nXQaDR0jguioLSGjPyKZgWogtJqAMKCfS/74ARw+3W9yMgrZ8u+HF5cvIW//XZMk1ueGEKiibz+NwRfOYOSTZ9SsW8j5btXU767wUbQOj06vyAclSX1LeWGfAFfHbjQoDOHoPU1ozX6ojX6sje9koJKqNSHoAmJwyc6gYi4DnSIDqJXp9Bmt5LPh09UJ2Jvf5HsT16kJv0g2R8+S/Qt89EHnP/fXSHOhwQoD+n8AgkdP4eQMTfjqK7g8x/2sDHpCHHBWuZN7opvcCg+sd1bNUW5IfeqFLlk5Te9nNGZ5Be7A9Tl3L3XkFar4fe3DuKPizZyLKuMVz7YzvNzh6PXNT2B2RgWS+S0Rwi+cgYVBzaf0kpyVJbgKHdvh6ILCMUQHIU+JApDUBS6oHD+tuI4aRVGXvjdZDrGnTpmVJlRwof/t4WSUov7y83xEsC9Tf2IfjE8deeQ856TdSK7jJ92pONwuhigRNK3SxhGQ9NjnsaIDsTduYDsT/6MNS+NrPefJubW5zCEynqFov1IgGomjU6PmudgyZYSNETwmzmjCe14fgPWnoiLcHe5ZOU3b3HAmXIAACAASURBVLuIghIJUI35+uh59p5h/GHhBnYfyefNL5K59ZqehAae+cuFMaIDoWNPXTW6qLCE/QeOMXRQT3z8Tv3zTc8tZ1dZOcEBPiTEnt4S6RYfzHvzryanqIr03HLSc8vJyKtgy75sftmbzY9JaVw9rGOz363GYmfj7kxWbj2BeuLkmNaK9an4GHUkdotgcK9IhvWNOe199UER7vUKly7Akp1C5vvPEHPLc/jEnJ6ZKkRbkADVTFU1Nv7fJztxuWD2pB70bIPgBNSv65dV0MwWVG2ACpcAdYrIED+euXsoT72xmZVbTrByywmCA3zoGhdEl7gglIQQBveKOiXLrqEt+7J5ffluyiqtXJXFaatD1KWX9+8afsaWkE6nJS7CTFyEmeF93TuirtuZwd+X7OCdr/aS2D3Co6kBFpuD5CP5bNmXw8bdmVRb3OnofiY9YwfGY/Y1sONgHkezSkk6kEPSgRwWf7OfudP6cvWwjqfUT+cXSMxtfyL389eoPrqHrI/mE3/vaxhCY870eCEuGAlQzfTOV/vILaqiS1wQt1ylnPuCVhJT14IqaGEL6jJNMT+bnp1CeebuoXzxUwpHM0soKbew41AeOw7lAe55Y7MndmfC4A4Y9O6usRqLnXe+3sfKLSfq7/NjUhoThyTQp8vJPaaSU/IB9/yn5hg7II4te7PZnJzFP5fu4qVfX9nkeFRphYVtB3JJOpDDTjUPi/XkGFivTqFcPawjoxJjMfm4/4nfMbk3haXV7DiUx+bkLHYeymPRp3vYcSiP38y+4pTJ5VqjL9E3PUXu53+n6sg28r/9NzG3vdAqe6UJ0RwSoJphb2oBPyalYdBr+cOtA9t04dXwIF+Mei0l5RaqamynzLc6m7oxKGlBNW1wrygG94rC5XKRW1RFamYpqRkl/JycRWZ+JYs+3cPSVSozxnenS1wQ/1q2i6yCSgx6LXdO6U1ZpZXlqw/zxud7+Ofvx6HXaXE6XexNcY9N9e/evACl0Wh4YGZ/9h8tZG9qAd9uPsoNo0+ugO5wuvh201E++O4gVtvJoNQ1PohhfWIY2T+GhOimk2jCgny5elhHrh7WkXU70vnPF8n8sjebw2nFPPqrgSR2jzhZD52BiOsfIuOt31GTfpDSbf8jeNgNzXoXIc6XBCgPuVwuPvyudkLuhO5n/BC4ULRaDTHh/pzIKScrv5JuHZpeeaKxfBmD8ohGoyE6zJ/oMH9G9o9lzrW92Lwnk+WrD3Mip5y3V+ytL9sxOoDHbhtMp5hALDYHG3dlkpZTzor1qcya0J0TOWWUV1kJDzIR04LlpYLMPjw4K5G/vJfE+98eYKASSXxkAFn5FSxcuouDx4sASOwezpX9YxnaO7rZX0DGDepAz06h/OPjnRw8XsRzb/3MdSM6MX5QB7onhKDTatD5BhA+5QFyl/+V4p8+xq/rQIzhrTuNQ4izkQDloR2H8jh4vIgAPyPTxrbdnj4NxUaY3QGqoMKjAOVyuSgoqV1FQgJUs+i0GsYMiGdUYhxb9+ewbLXK0cxSrh/dhTsn967PhvMx6Pj1zP48//YvfLJKZfQVcSfHn7pHtDgTb0S/GCYM7sDa7eks/GQXo66I48PvDmC1OwkJ8OGhWYkM63t+40LRYf789cGRLF9zhKU/qnz383G++/k4gf5GBvWMZEjvaAYqiZj7j6ci+Sfyv1lE7J0LpKtPtBkJUB5wuVx89IO79TRrQnePu9daW2x488ahKmvsVFsc+Pro8Pdtnzpf7LRaDSP6xTC8bzTVFnuT/+8HKpGMuSKODbszefOLZLS1Qalf1+Z17zU2d3o/ko/ko6YVo6a5M/LGD4pn7vR+BDQxd6sldDotv7paYWjvKNZuTyfpQA45hVX8tCODn3ZkEBpo4h8P3oruWDKWrCOUbvmK4CtntMqzhTiXy2P3uvP0895sUjNKCQ30Ycqozue+4AKJrV31INPDuVB1a/CFB/tekH2OLicajeasX0zundYXP5Oe7Qdz2X4oF3Cvv3c+zL4GfnvzALRaDSEBPjx3zzB+f+ugVgtODXWND2bu9H68/dQk3nhiAndP7UN8pJmishq+TcohYuqDABRtWIY1L63Vny9EUyRAnYPD6WJJbevppkkKPmeY6NgW6lpQ2R7OhTo5B+ryXMW8LYUGmrhjcm8AnE4X0WF+RLbC6vEDlEj+76lJvP3UpBYtFNxcGo2GDlEBzBjfjUducafOf//LcYjtQ8CAq8FhJ+/rf+Fy2C54XYSQAHUOG3ZlkJ5bQWSIb4smTramunXjPJ0LJXOg2ta1IzrRvXZs8Hy79xqKDPWrTxdvSz07htK7cyiV1TZWJ6URNvEO9EGRWHOPUfDDO1wK63gK7yYB6izsDicfrzwEwK+uVto0rbwpwQE++ProKK+yUVZpPWd5mQPVtnRaDY/dNogJgzsw04NdlS8GN47rBsBXG1Jx6X2ImvEHNHoj5btXU7btf+1cO3GpkwB1FquT0sgprCIuwsz4QR3auzpoNBpimrGiRP0cqCAJUG0lNtzMo78aeMZV0i82Q3tHExvuT15xNZuTs/CJ7UbE9b8BoHD1++4t54W4QCRAnYHV5mDZjyoAc67pecYlb9pafTefB+NQ+dKCEudJq9UwvbYV9cW6FFwuF+beIwkeNQtcTvK+/AfWhhsrCtGKvONT1wttTs6ioLSGTjGBjEz0nhWd61PNPcjkk0m6ojVMGNyBILOR1IxS9qW6V8gIGXMz/j2H47RUkbP8rzhqt58RojVJgDqDdTvd3wqvu7JTm+7Ncy6xHq7J53C6KGqwF5QQLeVj0DFlpHtF8y/WpQCg0WiJuP5hjFGdsRfnkPvF33E57O1ZTXEJkgDVhOLyGnYfzken1TAqMa69q3OKWA8z+UrKa7A7XASZje2aGi8uDZOv7IRRr2X7wVzScsoA0BpNRM/+Izr/YGqO7yX/u7cks0+0KglQTdi4OxOn08WgnlGnrPLsDeq33civOOuHgewDJVpTkNmHiUMTAPh07RH2pRbwxU9HeG3FMd4uG4fVpaMieS3FG5e3c03FpUSWOmrC+truvXEDvW9hzEB/I2ZfAxXVNkrKLYScYZM9mQMlWtv0MV354ZfjrNuRwbodDRMjAnnPMIb7zOso2bgcfWAYgVdMaq9qikuItKAaycqv4HBaCb4+Oob0iWrv6jTp5ITdM49DnZwDJatIiNYRG2Hm6mEd0Wk1dIkL4roRnXjk5gEsemw8dLiCT6uGAVDw3VtUpexs59qKS4G0oBqpaz2N6BeLyeidfzwxEf6oacVk5lecskleQzIHSlwIv5l9BQ/OTDwtceiPtw/md/+vklXVlVztu5fcL/5O7G0v4BPbrZ1qKi4FHn0CK4qSCLwJ9AeOAveoqrqtiXIJwGJgOJAHPKyq6neNymiBz4H1qqoubHD8z8CTQMMlEqaqqrquOS90PlwuV332njd279VpOA51JjIHSlwoTWW1hgSaeOquITz1bwvB2kqGcpSc5X8h9o6XMIR6zzQNcXE5ZxefoihG4CtgGRAMLABWKYrS1I59S4FkIAyYCyxVFKVLg3t1Ar4Bpjdx7UDgt6qqmhv8rGve65yfI+klZBVUEhLgQ/8Gu4t6mzgPUs1lDpRoaz07hvLrGf1ZWjmCw/YYHJWlZH34PLairPaumrhIeTIGNQ4wqKq6UFVVm6qqS4H9wM0NCymK0gMYDMxXVdWqqupa4Gvg3trzZmAHsAf4uYnnDAJ2t/RFWkNd62n0gDh0XjT3qTFPWlCyDp9oD9cM78Sk4V34v7JxnHDF4KgoIuvD+VgLJUiJ5vMkQPUGDjY6dgjo10S5NFVVK89Qrgboparq08Apa/UrihIDRANPKoqSqyjKAUVR7vbwHVqFw+Fk465MwLu79+DkZN3sgkqcztNTzW12ByXlFnRaDcEBTWf5CXGhzLuxH50TIllUPI40TSyOimKyP5qPtTCzvasmLjKeBCgzUNXoWBXQOD3srOVUVbWrqpp3hmdEAuuBRUA88ACwUFGUKR7Ur1XsOVJASYWFuAgz3eLPvZ16e/IzGQgO8MFqd1JYWnPa+YIS97GwIJNXtwTFpcmg1/HcvcOIjQnj9cKxnKA2SH04X9btE83iSYCqBBr3E/kBjfuXPC13GlVV96iqOk5V1dW13YjrgQ+BNttbet3OdADGDYq/KHafPduafPklJ3fSFaI9BJl9WPDASOLjwnm9aBzHicNRWUL2R89jzTvR3tUTFwlPAtQBQGl0rGft8cblEhRF8T1HudMoijJKUZTfNTpsxN0teMHVWOz8sjcbgLEDvLt7r07sWbbdkJ10hTcI9Dey4NdX0qlDOIuKxnLM5Q5SmR88S/Wx5PaunjiLmvRDOKrafwFgTwLUT4BGUZRHFUUxKIpyC+508y8bFlJVVcWdALFAURQfRVHGA9OAjz14RjXwsqIoUxRF0SqKMgm4FXi/OS/TUofTi6mxOlA6hhBT2zLxdmdbNLZ+DlSwjD+J9mX2M/LivCvp2jGCRcXj2O/sgstSRfbSlyhP/qm9qyeaYMk5RtYHz1Dw/VvtXZVzByhVVa3AdcBMoAh4Bpiuqmq+oihzFEVp+BV+JtAL9xyod4B7VVXd58EzdgC3A68C5cDrwF2qqiY1831apFt8MDeO68avZ/Rvi8e1itiz7AuVL6tICC/i72vghftHoHSJ5P9KRrKmujc4HeR/s4idy96hqsZ27puINmPJPAyAxujTzjXxcKJubZAZ1cTxJcCSBr9Pxx3MznW/cU0c+xT41JP6tDY/k4F7ru/THo9usboxqMwmx6BkDpTwLn4mAy/OG8H6nRms3xXJZ2lmZvhuIzjle755+QhFfW9m+jjlounBuJRZC9zj8caIhHauiSx1dNGq+4ecW1SJw+E8ZcdfmQMlvJFBr2PS0I5MGtqR4vKBJK/5kej9HzHEkIK6bzG/2zqOAf06MXN8N7p3CGnv6l62rPlpABjDO7RzTWSx2IuWyagnPMiE3eEit+jU7P6TY1ASoIR3CgkwMXb69XS8ewH4BqIYcngk4HsO7lX5/cINPPOfzfX7Tom243K5sObVBqjI9m9BSYC6iHXr4J6v9e/P9mCzOwGorLZRbbFjMuow+xras3pCnJMpthsd7n0FQ0QHonWlPBW+ih6+RSSnFPDEok3sP1rY3lW8rDgqS3FWl6Px8UMX0PRC1G1JAtRFbO70foQE+JCcUsDry3fhcrlO2QfqYpjPJYQhKJK4Oxbg2zkRo72Sh8wrmd2tjMpqG8+99XP9FBBx4dnquvciOnjF54cEqItYZIgf8+8bjsmo46cdGXyySpWddMVFSWvyJ/rmpwm4YhI4bIwqWsGDPTKw2R28/H4S3/98rL2reFmoH3/yggQJkAB10esWH8zjtw9Gq4FPVql8uS4FkPEncfHR6PSET/41oeNvA0ApWMtz3ZPRuey88XkyS344hMt1+tqTovVY8+sy+No/QQIkQF0ShvaO5v4b3XO4klMKAJkDJS5OGo2G4CtvJGrWH9EYTIQX7uGljhsJ0Vax9EeVv320Q+ZNXUAnA5S0oEQrmjKyM9PHdq3/fYSsIiEuYv7KUOLu+gv6oEhM5ek8F7WKbqYiNuzO5Hf/WE9Kekl7V/GS43K5pItPXDh3T+3DuIHxGPVaenVu/wwcIc6HMbIjcXe/jCmhNzpLGQ8HrGRaZBo5hRU8/voGvtqQKl1+rchRVoDLWo3WLxCdf1B7VweQAHVJ0Wo1/GHOIJYumExc7VJIQlzMdP5BxNw6n4ABV4PDxgT7Op6P30CIq5R3vtrHi//dSnFZm6wpfcnzttYTyEoSlySDXtfeVRCi1Wh0BiImz8O3c38KV/4fIZUneCY0ix8sV7DqgJN7Xspn9BWx3DC6a/3cQNF83jb+BBKghBAXCXOvEfh27Evh6veo2LuO6wzbGBaVzkeFify0w8FPOzLo1SmU60d1YUT/GPQ66SBqDm/L4AMJUEKIi4jOL4DIGx7G3Hsk+d+/RWhZDr8NzKHMN5bvS7uz9biDV48XERrowzXDO3HN8I6EBcmUC09IF58QQrQCv24D6XD/Qkp+WUHZzpUEVmdxszGLGdGB/GLvxerCDnyyysKy1YcZ3jeayVd2pn+3cK9YHcEbuZwObAUZABikBSWEEOdH6+NL6LhfETxyBhX7NlCa9C0UZDCGrYwJ2UqJIYKd5ZEcPBDL88kZBAT40bdLGH27htOvaxgdogIkYNWyl+TislvRBYShM3nPlicSoIQQFzWtwYfAAVcRcMUkqo/toWzHD1QfSybYls8EUz4TTPuxuvQcs0dw/HA4Gw5E8IE9HIN/IH26hNGnSxh9u4TTMSYQnfbyDFjemCABEqCEEJcIjUaDX5cr8OtyBS67jZqMQ1Sl7qL66G7IO4FiyEYxnFx4Ns8RwInUCA6rYfzoCKNEH0m3zlEMVCIZlRhLSODlM9m9PkBFek/3HkiAEkJcgjR6A76d+uHbqR9MvAN7RTGWDJWazMNYMg9jyU4lknIideUM8TkKgMOlISczmKy0EJasDMQnIp5uvXsyaGhfAoMC2vmNLixv2qSwIQlQQohLnt4cgr7ncPx7DgfA5bBjzTuBJSsFS3YqluwUrPnpxGmKidMXuy+q2A1J31KQBCc0/lgMgThNwegCQjAGhRMYEUFYZCR6/0B0foHofAPQ+PhdlONa3pjBBxKghBCXIY1Oj09MV3xiTq5f6bRZsOYew5qfQVVuOvlpx7AVZRFgL8GfSvytlWDNhjIgExxAXqP7ujRaNAZfMPq6g5WPH3qTP0Z/M1off7Q+fmhN/mhNfuj8gtyBzd/9X42xffZwczls2AqzAA2G8Pg2f/7ZSIASQgjcyRam+J6Y4nsSCETXHi8prSTjeCal+TlUFuZhLS3EWVGEo7IUg70Kf20N/hoLZq0FEzawVoK1ElcFuABr7c+5aPRG9IHh6IPC0QdGoA+KQB8cgSE0DmNYLNoLlF1nK8wGpwN9SDRao3eNu0mAEkKIswgO8ic4sQfQ47RzxWU1pGSUkJJeQkpGKUXFFeicNegdFgxOC3pXDViq0Npr8NXY8NVYMWmt+GmsmDU1mLU1BGhrMGstGO1WbEVZ2IqymqyHzhyCISwOY3i8+78RHTCEx6PzDz6vlpe1wPtWkKgjAUoIIVooJNDEkN7RDOkdfcYyLpeLkgoLWfmVZBdUkFVQSVpBJfnF1eQWVVFSZgHAByshuipCtRVEGKrpFuKgg18NkbpS7EXZOCqKcVQUU3Ni3yn315rMGMLj8YnsiDGqk/snsiNag49H72DN884ECZAAJYQQF5RGoyEkwERIgIk+XU7fBqfGaie/uJrj2WXsTS1gX2oBB3IrWF/lPj93Wl+uH9UJe1kBtoJMrAUZ2AoysBZmYMtPx1lTgSXjEJaMQw2fiiEsBlN8L3w79cPUsS/6gJAm61efIBHpXQkSIAFKCCHalcmop0NUAB2iAhh9RRwAxeU1rNp6go++P8SPSWlcP7oLhuAoDMFR+HUbWH+ty+XCUVGCNT8Na94JrLnHsOQex1aQga0wC1thFuV71gBgCIvDt1M//LoPxrdTPzQ698e/t2bwgQQoIYTwOiEBJmaM685X649yPLuM1IzSJrcS0Wg06ANC0AeE4Nclsf64027FmnuCmrT9VB/fR036QWyFmdgKMynb8QNa3wD8ew7HXxmGvTgXtDoMYbFt+YoekQAlhBBeyKDXMn5QPF9vPMrqbWnN2utKqzdiiuuOKa47wSOm43LYsWSnUJW6m8qDP2MrzKR814+U7/rR/azQGDQ6w4V6lRaTACWEEF5q0tAEvt54lHU7M7jn+j4YDadvRpqeW86H3x/Ez6QnPNiX8CBfwoN9CQsyERXqh5/JgEanr0+hDxlzM9a8E1Qe2EzFgc3YS3Lx7dy/Hd7u3CRACSGEl+ocG0TX+CBSM0rZui+H0QPiTjnvdLpYuHQnh9NKzniPAD8DkaF+RIX6ER3qT79u4SR2TyB0fCdCxt2Ko6wAnbnpBIr2JgFKCCG82KQhCaRm7OXHpBOnBag129I4nFZCaKCJX12tUFhaQ2FpNQUl1eSXVJNXXE15lY3yqlJSM0oB+GJdCmZfA8P7xjAyMZbE7hFovHT3YQlQQgjhxcYOjGfx1/vZfSSf/OJqIkLcOwRXVFl5/7sDANxzfR/GDjx9maK6OVi5RVXkFlaRnlvOL/uyScspZ/W2NFZvS8Psa6BPlzC6xgXRtUMwXeOCCA00ecWaghKghBDCiwX4GRneN5pNe7JYuz2Nm69SAFiy8hClFVb6dAljTKOWVZ2Gc7B6dgwF4LbrepGWU8bmPVlsSs4iLaecrftz2Lo/p/664AAfOsUEkhAdQMdo938TogLwM7VtIoUEKCGE8HJXDe3Ipj1ZrN6WxuyJPTiRU8Z3m4+h1cC8G/s1u7WTEB1IQnQgv7qmJ1kFFRxJKyE1s5TUjBJSM0ooKbewuzyf3YfzT7lu+tiu3HtD39Z8tbOSACWEEF4usUcE4UEmcgqr2H+0kCUrD+F0wdRRnekcG3Re944NNxMbbq7vInS5XOQUVnEip4y0nHLScso5ll1KWk45SftzJEAJIYQ4SafVMH5wBz5dc4R/LttFblEVQWYjc67t1erP0mg0xIT7ExPuz/C+MQAUllZz159XUW2xt/rzzsY7UzeEEEKcYtJQ91JEuUXuRfrumNwbs2/bjAn5+rjbMhKghBBCnCY23Fy/2Gz3DsFMGtJ2a+eZjO4AVWN14HS62uy5HnXxKYqSCLwJ9AeOAveoqrqtiXIJwGJgOO7NJh9WVfW7RmW0wOfAelVVFzY4Ph74J9AV2APcrqpqakteSgghLkV3TO7FJ6tU7pvWF6227dLAtVoNJqOOGquDGqu9zbL5ztmCUhTFCHwFLAOCgQXAKkVRApsovhRIBsKAucBSRVG6NLhXJ+AbYHqjZ4QDK4AXap/xJbCyNpgJIYQAencO48V5V9IxuqmP3wurPbr5PAkA4wCDqqoLVVW1qaq6FNgP3NywkKIoPYDBwHxVVa2qqq4FvgburT1vBnbgbh393OgZM4D9qqp+XvuM1wAfYGLLX00IIURrqQtQVTXeFaB6AwcbHTsE9GuiXJqqqpVnKFcD9FJV9WnA1sS1BxodU5t4hhBCiHbga2r7FpQnY1BmoKrRsSrArznlVFW14x6XOp9nCCGEaAfe2sVXCfg2OuYHVLSw3Pk8QwghRDvw1gB1AFAaHevJ6V1yB4AERVF8z1HufJ4hhBCiHdQFqBov6+L7CdAoivIosAiYiTvd/MuGhVRVVRVF2QMsUBTlKeBKYBowwoNnfAm8qijKTbW/fgRwAus8fA8hhBAXkFe2oFRVtQLX4Q5MRcAzwHRVVfMVRZmjKErDbriZQC/cY03vAPeqqrrPg2fkAdcDT9U+YxZwfe2zhRBCtLP2CFAeTdStDTKjmji+BFjS4PfpuIPZue43roljG4ABntRHCCFE2/KrSzP3phaUEEII0R5p5hKghBBCnFN9F5+XTdQVQghxmfPKJAkhhBBCApQQQgivJAFKCCGEV5IAJYQQwitJFp8QQgiv5GuUACWEEMILSZq5EEIIr+Rj1KHVgNXuxOFwtskzJUAJIYQ4J41Gg6mNEyUkQAkhhPCIbxuvxycBSgghhEfaOtVcApQQQgiPSIASQgjhldo6k08ClBBCCI9IC0oIIYRXauvVJCRACSGE8Ii0oIQQQnglPwlQQgghvJG0oIQQQnglyeITQgjhlWQlCSGEEF5JsviEEEJ4JRmDEkII4ZXqAlSNBCghhBDeRFpQQgghvJIEKCGEEF5JApQQQgiv5CdZfEIIIbyRQa9Dr9Ngd7iw2R0X/HkSoIQQQnisfrJuG6wmIQFKCCGEx9pyHEoClBBCCI9JgBJCCOGVJEAJIYTwShKghBBCeKW2XDBW70khRVESgTeB/sBR4B5VVbc1US4BWAwMB/KAh1VV/a72nAZ4EbgfMALvAo+rqmqvPf9n4EnA2uCWU1VVXdeiNxNCCNHq2nJPqHO2oBRFMQJfAcuAYGABsEpRlMAmii8FkoEwYC6wVFGULrXn7gdmAAOB7sAQ4OkG1w4EfquqqrnBz7oWvZUQQogLwtu6+MYBBlVVF6qqalNVdSmwH7i5YSFFUXoAg4H5qqpaVVVdC3wN3Ftb5E5goaqqGaqq5gN/AuY1uMUgYPf5vIwQQogLqy0DlCddfL2Bg42OHQL6NVEuTVXVykblhjY4f6DRuVhFUUIBHyAaeFJRlBFAIfCaqqrvevQWQggh2oS3taDMQFWjY1WAXzPLNT5f92s/IBJYDywC4oEHgIWKokzxoH5CCCHaSFtu++5JC6oS8G10zA+oaGa5xufrAleFqqoZuLsS66xXFOVD3GNW//OgjkIIIdqAt7WgDgBKo2M9ObW7rq5cgqIovmco1/g+PYFsVVVLFEUZpSjK7xrdzwjUeFA/IYQQbaQts/g8aUH9BGgURXkUdxfcTNzp5l82LKSqqqooyh5ggaIoTwFXAtOAEbVFPgQeUxRlDe7W1J9qjwFUAy8rinIE+B6YANxa+18hhBBewqtaUKqqWoHrcAemIuAZYLqqqvmKosxRFKVhV99MoBfuOVDvAPeqqrqv9tybwKfAz8AR3C2q+bXP2AHcDrzK/2/v7oPlqMo8jn+TGwK5soqgLHExC0R4MGJ05UXF9WUrha8gFkRYDe8QcJdlNbvgVsjKixBBIpQUvkQRXzBgJLJERUuhgqj4tqhsICT8VmSpwGIWFCwJIQlJ7v5xzpSdYXK9M9eZPnPz+1Tdqkyfnu7zpLvnmXO65xx4ErgKOEnSf446QjMz+7Mp7oe6Ocn8bYvl1wHXVV4/REpmrbaxBTg//7UqX0JKYGZmVqiiWlBmZmYNTlBmZlakQScoMzMrUaMFtX7DJoaGhrq6LycoMzMb1YrYogAAC+VJREFUsYGB8UycMJ4tQ7Bh4+au7ssJyszM2tKrJ/mcoMzMrC29elDCCcrMzNriBGVmZkVygjIzsyI5QZmZWZGcoMzMrEhOUGZmViQ/Zm5mZkXq1ZxQTlBmZtaWwR5N++4EZWZmbfE9KDMzK5ITlJmZFckJyszMiuSn+MzMrEhuQZmZWZH8mLmZmRXJLSgzMyuSE5SZmRVpp4kpQa3fuJktW4a6th8nKDMza8v48eOYtOMAAOs3dq8V5QRlZmZt60U3nxOUmZm1rZGg1nXxST4nKDMza9tObkGZmVmJ3MVnZmZFcoIyM7MiOUGZmVmRnKDMzKxIvRiPzwnKzMzaNugWlJmZlagXc0I5QZmZWdt8D8rMzIrUiwQ1YSQrRcQrgIXAdOAB4BRJd7ZYbwpwDfAa4FHgLEnfzmXjgIuA04GJwBeAcyRtyuV/B1wJTAWWA8dL+vWoojMzs64oogUVEROBrwNfBXYB5gO3RMRzW6y+GLgb2A2YDSyOiH1y2enAUcCrgH2Bg4Fz8z5eACwFLsz7uAn4bkS4hWdmVqAiEhTwJmAHSR+X9IykxcC9wLHVlSJiP+Ag4DxJGyXdBnwDODWvciLwcUkPS3oMuAA4I5cdBdwr6ca8jwXAjsCM0YVnZmbdUEqCmgasalp2H/DyFuutlvTUNtabBqxsKntRROzaogxALfZhZmYF6MVTfCO5B7UzsK5p2TpgsM31mssb/x5sYx9mZlaA3Z8/yH5TdmHqnrt0bR8jSVBPAZOalg0Ca9tcr7m8kXzW5rLmZNRqH2ZmVoAJA+O5/P1v7Oo+RtLFtxKIpmX78+wuuZXAlIiYtI31mrezP/AbSb9vYx9mZradGEkL6nvAuIiYA3wCOJr0uPlN1ZUkKSKWA/MjYi5wKHAk8Nq8ypeBsyNiGanFdEFeRt7WZRFxTP73+4EtwO0dR2ZmZn3tT7agJG0E3kZKTI8D84B3SXosImZFRLUb7mjgpaTfQH0OOFXSily2EFgC/Bj4Fal1dF7ex6PAEcDcvI+ZwBF532Zmth0aNzQ0VHcdRi0i9gL+Z9myZey55551V8fMzEbo4YcfZsaMGQB7S3qwWuYfwpqZWZGcoMzMrEhOUGZmVqQRDRbbBwYA1qxZU3c9zMysDZXP7YHmsrGSoCYDzJo1q+56mJlZZyYDW81gMVYS1J3A64HfAJtrrouZmY3cACk5PWsKpzHxmLmZmY09fkjCzMyK5ARlZmZFcoIyM7MiOUGZmVmRnKDMzKxITlBmZlYkJygzMyuSE5SZmRVprIwk0VJEHALcLGn3/PqFwJXAW4ANwOeB8yVtzuXXAscAmyqbmS7pgYiYAlwDvIY0IeNZkr5dcCyH5vKXAo8A50r6Wi7rm1giYiFwXNMmngPMk/SROmPp4JicDPw78ALgPuBfJd2Ry/rmmOTys4A5wG6kSUjPlPRAXbFExGHApcC+eZ8LJH0mIiaSZgKfSRpl5gpJl1TedwzwEdJIBt8HTsoTqNZ2TDqNpfL+OcAbJb2rsqzW86tTY7IFFRHjIuI04BZgYqXoS8DupA/tA4BDgA9Xyl9Fmi1458rfA7lsMXA36YKcDSyOiH26HEpHsUTEZOBbpJP5L4AzgUX5JO2rWCS9r3o8gHNIszF/oq5YOjwm04ErgCOBXYBFwNKIaFyDfXNM8of6fODkXN9vALdGxE51xBIRLwZuBC4m/d++B7gkIt4CXAgEMBU4GDgxIk7I75tG+tA+Kdf1V7nuDXWcWx3Fkt+7c0QsAC5vselazq/RGpMJinQg/4F0kAGIiEHgrcAcSY9Kehz4EDA7X6STgP2B/2reWETsBxwEnCdpo6TbSBflqd0Ppf1YgBOAH0j6kqQhSbeSPmCe6MNYqKw7FbgMeK+kP9QYSydx7Msfr7dxpG/AT+f39tsxORq4WtL3JW2S9GlgIzCjplj2Aq6XdJOkLZLuBG4HXgecCMyX9ESerfVjwBn5fccB35R0h6T1wFzgdRGxb43HpNNYIH0p3Rv4THWDNZ9fozJWE9RCSQcCP68sa8T6VGXZZuCFpG8qryR17V0dEY9FxC8j4vC83jRgtaTqe+8DXt6V2m+tk1gOBB6MiMUR8duIuAvYQ9KT9F8sVZeTPhiX59d1xdJJHN8FVgD3kD7MPwocK2kL/XdMxjeVNcr3o4ZYJP1Q0vsaryNiV9Lg0XeRuu5WbqMu06plktYBD+XyWo7JKGIBeI+kmcD/NW22zvNrVMZkgpL0SItla0ndGJdFxK4RsRtwXi6eROoK+yHpG+WLSF0YN0TEK4CdgXVNm1wHDHYngq3q3Uksu5Ka8YtIJ/UlwE25BdJvsQAQEQcAh5E+2BtqiaXDOHYCRLoH8Bzg30hdfHvQf8fkRuD0iDgoInaIiNmk3odJ1BgLQEQ8j9Q6+Bnwi8r+W9VluLrWGge0HUvLY5nVHkunxmSCGsbxpG+vq0g3RJfm5b+XdIukwyT9XNIzkm4EbgPeSfq2OKlpW4PA2h7Vu5VtxkK6qf0dSTfnWG4Afgm8jf6LpeEUYKmk6rfD0mIZLo4LgDWSfiZpg6RPAQ8C76a8OGD4a2Ux6UvPYlKL4wDgVuAJaowld2X9lNSCmAk8mYuq9anWZbi61npMOohlOCWeXyOyvSWoycAZkv5S0gHA/wKrJK2LiCMi4sSm9ScC60nN6in5PlXD/mzd3O61bcZCar4/v2n9xhOb/RZLw5FsfQMbyotluDheDOzYtP4m4BnKiwOGv1Ymk+7dvETSHsC/kJLUL6gploh4A6mlsRSYKWm9pCeANaQHC1rVZWW1LN97m5KX13ZMOoxlOCWeXyMyph8zb+EKYEVEnE06ET/KH58GGwCujIhVpAvtWOBQ4DRJqyNiOTA/Iubm5UcCr+11ABXDxXIt8E8RcRxwPelb+nTgGEkP9VksjUee9wF+VH2TJBUWy3Bx3EzqMruBNDHbLOBlwLf68JjMAM6PiNcDfyB1/z0C3ClpqNex5K7rm0k/PbiqqfjLua53k7q6ziY9Pg/p2rgjIt4E/ITUKrxL0n/n7fb8mIwilm0q8DoZse0tQc0GrgYeJ3W7XJW7WpC0NCLmAV8B9iC1Qg6XtDq/92jgs6TfEPwWOFXSih7Xv2q4WJZHxNtJHyqfAlYDR0l6KL+3b2LJ9gI25KfJmpUUy3DH5Op8T+F60u+gVgJv79Njch3pBvtyUi/DMuCdkhqzn/Y6ljNJ95AviYjq74I+SUqelwP3knqMPgssBJB0T0Sckl//FanV8u7K++s4Jh3FMgKlnV8j4hl1zcysSNvbPSgzM+sTTlBmZlYkJygzMyuSE5SZmRXJCcrMzIrkBGVmZkVygjLrkTx472N5ANDmsnkRsTYi9qqhamZFcoIy650PkH4cv9UkcxGxNzCPNHrAgzXUy6xITlBmPSJpDWnOodMi4tWVoqtI85A1D21jtl3zSBJmPZQn/PsRaYigg0mj5d8A/I2klXmdk4FzScPvrCK1rL6TyyYAFwHvJU0L8zvS8FxnS9ocEYuALaSZcKeShri6vWcBmv0ZuQVl1kN5vLrTSYP3nkyaFfXiSnJ6B2mg1nl5nWtIc3kdkjcxlzQN+PGkWXrnAv8MHF7ZzXGkQURnkKZsMOtL29tgsWa1k7QiIq4gTc29Cri0UnwucGmewwvg/og4iDSlxd+TZuQ9SdIPcvkXIuKDpFlTv56XrZS0qNtxmHWbE5RZPS4kzap7kaRnKsunAQdGxIcqy3Ygz92TR92fERELSFOsTyeN9j5QWf/X3ay4Wa+4i8+sBpKezv98uqloAnAO8MrK38tI8/cQERcDS0jX7hLgzUDztAnN2zTrS25BmZXlPuCvJd3fWJBbU+uBBcA/Ah+QdG0um0SaUHBcDXU16yonKLOyXAZcGxECbgMOA84n3X+CNIHg4RHxY+B5pK7C5/Ls6eTN+p67+MwKImkJMAf4IOm+0xzgDElfy6ucQHp67x7gP4D7gS8CB/a8smZd5t9BmZlZkdyCMjOzIjlBmZlZkZygzMysSE5QZmZWJCcoMzMrkhOUmZkVyQnKzMyK5ARlZmZF+n9gG/EcRiJvAwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "alpha_census = compute_rel_diff(census)\n", - "plot(alpha_census, label='US Census')\n", - "\n", - "alpha_un = compute_rel_diff(un)\n", - "plot(alpha_un, label='UN DESA')\n", - "\n", - "decorate(xlabel='Year', label='Net growth rate')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", - "\n", - "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", - "\n", - "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", - "\n", - "3. Create a `System` object that includes `alpha_func` as a system variable.\n", - "\n", - "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", - "\n", - "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", - "\n", - "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", - "\n", - "7. Compare your projections with those from the US Census and UN." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def alpha_func(t):\n", - " intercept = 0.02\n", - " slope = -0.00021\n", - " return intercept + slope * (t - 1970)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "ts = linrange(1960, 2020)\n", - "alpha_model = TimeSeries(alpha_func(ts), ts)\n", - "plot(alpha_model, color='gray', label='model')\n", - "plot(alpha_census)\n", - "plot(alpha_un)\n", - "\n", - "decorate(xlabel='Year', ylabel='Net growth rate')" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "t_0 = 1960\n", - "t_end = 2100\n", - "p_0 = census[t_0]" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha_func=alpha_func)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func_alpha(pop, t, system):\n", - " \"\"\"Update population based on a quadratic model.\n", - " \n", - " pop: current population in billions\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " net_growth = system.alpha_func(t) * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.1102518413268" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "update_func_alpha(p_0, t_0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results = run_simulation(system, update_func_alpha);" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap09soln.ipynb b/soln/chap09soln.ipynb deleted file mode 100644 index aa6929e0..00000000 --- a/soln/chap09soln.ipynb +++ /dev/null @@ -1,1147 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 9\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# import everything from SymPy.\n", - "from sympy import *\n", - "\n", - "# Set up Jupyter notebook to display math.\n", - "init_printing() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following displays SymPy expressions and provides the option of showing results in LaTeX format." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy.printing import latex\n", - "\n", - "def show(expr, show_latex=False):\n", - " \"\"\"Display a SymPy expression.\n", - " \n", - " expr: SymPy expression\n", - " show_latex: boolean\n", - " \"\"\"\n", - " if show_latex:\n", - " print(latex(expr))\n", - " return expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis with SymPy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a symbol for time." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAnElEQVQYGV2QCxHCMBAFGxSgIRqQQB3UAzIaG2ABCcUBQyWgAQdhNyRAmpnX++xd7tKQcx7aSSnt8R9oxH/uGqj2iI0C4y0cya0CzxbaeSuET5jn2cQJOa/BF/59cCFF0YRwP7H2/9puHp0dbFeaL6d01vdFMkvN/yDewYii76Y2tJndPMBEbWzQZ5S/YocAuwZXxnHeGV2R8UX7Bq+TPY8f0jS0AAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle t$" - ], - "text/plain": [ - "t" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = symbols('t')\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you combine symbols and numbers, you get symbolic expressions." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACoAAAAQCAYAAABgIu2QAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABRklEQVRIDdWV4Q0BQRCFEQWIDihBlEAHRAd0wN/7SweiBDpABUIJShAdnO8ds1mXFVxwZ5LJzs7M7ry83dktx3Fc+gep+iCjKKox36Nd7KMf+6VN7R71FmgD+6zad0CZd9BmVpC3Alo/0+bvCGtEksCd0DqquZM00C6Rg4v+0AComOurJPaYQaw6qTjraojRTcpXiGkV9AI3QkV1E23hWzLuGN8+QtZ9RQRUDG4YRXWHUcdfOPGPPrf7+QorfjPpCqxeWQTrU/KUnxZdnzrxQTrA/Ig/aZZA7KkrAcoGdj/XT1eQQP4klIdf1yfT8xTaz/fZ0bflpJDreGyBL4wY0Lv7acwUBiVADKjYS77MG5M6vlwe/kfkWDOpOeaAGyqRMZf3k7pzyuv7tEbd4hOBa2smTXJ/PwGljycoxmgwmMGpZhQjH5cLLsJavFyXYl4AAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle t + 1$" - ], - "text/plain": [ - "t + 1" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr = t + 1\n", - "expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `Add` object, which just represents the sum without trying to compute it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sympy.core.add.Add" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(expr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA3UlEQVQoFXWR0RGCQAxEwbEALUFKsAZKkBagBH/5cygBW5ASKAHpAFvQDvBtuDDHjGYmbLLZy11COs9zIqvrOgMqS5bPGWjhO6WphEF0BVch8YX6A6+I7zupMZFlKBpBbJ1IriJcOBJ/gotPEB4sWPhkH8gePIaCQx6CVmhv9Ipj6PYk74jtausYCXxyvVm33Lz2s6OKdGqAEi+I+7/CIH4LsZNNzYlMvnCb70Cm6XNfz0QyIfaVbNRKfBjtcEAojM1vGV1oK4gVHNLkEurXvtZhSLTgIhJL1MBrTckXilpU0lDNGcIAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle 3$" - ], - "text/plain": [ - "3" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`f` is a special class of symbol that represents a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "f" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f = Function('f')\n", - "f" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The type of `f` is `UndefinedFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sympy.core.function.UndefinedFunction" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACPElEQVRIDaWW0VEbMRCGDUMBnpRw6YBAB6YDSAfgDsKj/cZAB5AKMqQDTAVAOsDpgKED833H6aKTJdmQnVmvdrW7+rWrkzxarVaj/+HZbNbAZ9vk0E//2HdHJUfz+XyM/RJ+hr86xrZE9oTeoFwjj3rjhgG+t7ich1x7Ff+fzLmgLJC7bozoyWQnvRYNWMANPMFHYbFu+hR5D39T3/UnpS74GLuLLmCT/I790M/QH5PkscsEpUnn0V+xL5A/dC5VwOARTi4uBfmuvf+eI2qld+5PHBCNLxj/ha+yFWDiEB70G70ngNl7ARZ9mHYTOeDGWYUlcjKoAAbLKnKDX9DtsXKKjMn2rCXHzzh97b8g97scD8gr9JiMP0kB3GC8wdlP4yITFBIIUnADwt+k9leAE2StRX5d07UWENSW10RwifR5KU1ir/U/hBk/XgOAcV8PgJQOkNNfYPtYIltR24Bxnp8mB6B6AI2sEcBD//2EN1IOgBWo7d6kbfkK2Q+0A6SvQAcqdbeKyxwAEzyk3olu+UyQo0H/WdwD2WQctb0OAHRILeGmCjjfXqWZxMa390OXz9swl8/4xQAAhrZ8yEe4RvbXg5Yj340xi3qnfEem33+Ica1fg6eYp/ISvoufy9IYv+f0aS35pnbjjNe+C8JjOFwq7iqMA9KSdKe+B58hb8trA3dEgrRnPqtPgPHt34rwtRVTZNvzbYLw9YzcI/vnOLz1ytrVmcvf7yQ3WbBZ4X//IdL+fFTv+vnpv2RvdG+7fm50SvMAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)}$" - ], - "text/plain": [ - "f(t)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`diff` returns a `Derivative` object that represents the time derivative of `f`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAADcAAAArCAYAAADczxCmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRoBdWZ7VEXMRCH/zAWoNIBdoDaAXQAWoHQgX6Eb452AFSA2oFYAWIHYgU6dIDPc5Pc5N5yOYXj2Jmd3CWbZH/ZlyR3azc3N6tSOjo62kL2A/wC/sT7QWnf+5BbmwIuKggoV2SP8kusW2K5PlUpAG2HPudT+84tPxkcCu7AV4C8nlvZqfP9Czgtt3iruRCPcquBdTZpfwdrpd+woEwq7+HF0yC4EFufQfCc5yuRUH4NiB6E5XrdEhCPASGwdxFYACXIH9QtPt7Utxcc9e5lAvwEp/Rg4k2lh8C9ou08tVCwpjEYXdP+i6YOuABCq/1oaa7VVrQ/iHhT1w44KwNdxIdQetSqAANwF9aKi6YOOJQ2WQiiVp66/fBeZU2eX1IXn3ldJvWeLVFctzyFtd4GfAYL2kRjnRnzzt2TOVzgbcoTyiwhowHME/Wi94LLjvKfjUzuwrlIP+FnPqcK8V4RdQI7pvS4V0TINravwU28aLR/E9IjXF1ZkGbferV5jqSie/ElLQHhAl3COzynfd9Q9w1+DmcTiu23SkGpXQYVkG6tcp1rE3W62PeW4lTVZObebLfzbujomm+VnNty7e1kKG49z+bc0bb2ViUeyXPvL/jjum8z0kvmSt2oMzWrbqytKHNyLlLvwtBP63kl257Fckykm7naKvWHd+PJsu8zhW7bURxZ+ypvvLkAW2GcC8qPvKdk/725wJnKT1DCzxPve5RJFXMRBN8g+qiw8SR4t4ec25qJD2ZzS5Sp3E0F4Rwp9ycjkIu32M3+j2cDx2RecleAHEoENktPYeNmiHTPsQUyXjcfMVn5t72h6UI9Y61lREaTSaZv1cT4Md7cSkZJcDmFRgeYIKDlxqzmcJVLDYzr99IVOteWEzDctrTWv5rTLVXsQuVGSJdSuT5qxBugTC7GaJusu54FnKvLZHKJ5ZSpjk+UbXKMav8LY3pK6RvT/uezgGOiyp0ov8NjZDyZNPrIs6hu6L75irK9v8U+zne28nP6XfPh4eEH+GvpPMj+hDdL5VM5+9nfuuwmzsqYBFwtV2LSjw/6Gg+vKT3Za4ljuJSc0/Nl3wlmbAz7VHMV3edQsPPjgzr9v+/aUU1Ou6cE40Nwl7x7dysm5HXPA8oqxko6IqtO3yjLrjwIRv+v02+YyPrOtSNRIt7VLHNHpaRL47G2QKM2/9K8A6b+2veM/xovlQ+n7dQdw5dp3W0/M77xs18yrnLKp7LZmAuLpIXaVrPJ+s5F04bbouCSo99PnA/ZjlwDHAJufoM/PmgXUOm1wznvleqEEhTXZ9s/PgT0hPbrqCnPZsLPlHMd3eLUk8pqE0dJs4zASn98NI5Bk2acUTieUMxoAiz98aE1++JwRtXHp4rgin98BCsbm0XXjnEV7k5iPSir1doHUK2zor1tIU8rjfowhtWLomg5lWpfR8yKFWCUT398NOLNNuS05OJIy5kFBVErSJ2nbt/j0Sf98aGVS64diN0vVVsBYFT4FNZ6G/AZLGgTjXX1jw9kBe3B1Oy64r2zeVq/BPoLCcnP8gO03jYAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)}$" - ], - "text/plain": [ - "d \n", - "──(f(t))\n", - "dt " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dfdt = diff(f(t), t)\n", - "dfdt" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sympy.core.function.Derivative" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(dfdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a symbol for `alpha`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAJCAYAAADpeqZqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAxElEQVQYGXWQ2w2CQBREhViAiR1gB2gLdmAsQUvwd/+MdqAtSAfSgY8OwApI7GA9s+4lG6KTDHOfc4HMez9K4Zw7kHexNkMv1Op0JrMlGgWNK9zaEDohf8E5cRtnypyC4UFQ2YKKxG/kDnfKwQrWYYnmiUSuezhES2ERi1MZ2aU1xTo6D5d0raCnbw2mOYkuiE/4D+rfzFRLchKar/x+MldZZxyDM7qE0h4Mbkh0JYC8JGjTX653FvqLDAUTVD9Kb9QRHz9smkzvIogUTAAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle \\alpha$" - ], - "text/plain": [ - "α" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = symbols('alpha')\n", - "alpha" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation for proportional growth." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)}$" - ], - "text/plain": [ - "d \n", - "──(f(t)) = α⋅f(t)\n", - "dt " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq1 = Eq(dfdt, alpha*f(t))\n", - "eq1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And use `dsolve` to solve it. The result is the general solution." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHIAAAAYCAYAAAAmsqlBAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFVklEQVRoBe2ab1IUOxDAF8oD+OcE4g2eegO8AeoJwBtAvU/wjYIboCdQvAF6AoEbqCd4ljfg/X4hmZrJJjOzC7K7JV3Vm6TT6XS6O+nMzK5dXV1N7mE1LXBwcHCB5tuUl+uruYR7rXHeQ6zwD/hDa9w7UiusJmyi9g8c+lv11+6P1uXyIo45QqP/wCfgQ9rv1JDS+m9wg+YeqCN14jl4MtGRN8H9/f0NcGeMDPnkH8P7N/Jgm+/gZlo79VNw1zblUaLH9gW0rUR7gDeLYATQYXR8B59ZhxbOY+oBYnScUL5KtL4SvvfgKbgHdmT1jbvrPnRz7Tug6wpHV9ThjD7X4K54R+nOuBVA1gmCPCq/tASeUXeeS0rrbTA/Sg9QdSS9H0CNLepQBeXGP4X2GpwCJtcY3qpeUW+P24b2FXwOLh2g6y5K/QsabJ0Apb0FavA39oO3CcrUNm3QbgbNa+YNR6yd1MOxStnYtXjZgUEnbIE6zwjRGZ8pG6BtxJ63hTWd1xUn28j7aRvhXyg12NIA+piDXK8Ge0r9fa4ctGQD7dPeOTnrPG1lNjssCvhFKT0PGndjmD/qvVHbkTphAlNSNpWSEyi8E7GpI5b25YollkMqP8HjRFiC0lNCAz1i3QZbDTyF3sDT7IYa44x0beXuC3KRrwPfKkN9bFvaBkx130KN0wP6XnFHwvASrCrKQCecUFZ56DYYSgHgOBUyH4SAob5QQA+PS53oEZaMVdPJXfKp1nkDuinK+XdBT7sdSjeLOdnU1raVwfRSXsqPYPfxIwpwJzlIhY2SX9Cb85n2JAp4VqA7Tl6jybqO1DDf4O3sPtoqZ5R1ZEO7U2B+g9ILnYFlpPcCPK7tMWVfEE/JiOPMvT5aCMUL5HXX7L8P2kOYzLxgBPje7pCyY/wWr842KjoAv44z/5lfNyn7jl6NN9qJyMqjsjN3pWEOH5oj9bsrBwF5BqbYADR38wfK4gUOukGt/ObiB80Acu48/0GaHTqOdHicwGrxWLQDUAl3bA368mMa43ijexSg160suDCZQSf0rfeaI/tFJx2oMx6DxbVEexr0vhNt5z/XMyp44BuEKUcyQuUmTOqxWgMV70RlxmgEphte1tU0XZQBsWhwLcKooxK7NJeOaCOf8wyGYLcgqfvjSSJ4HKeburbz8abPhmHQ2J+SI3svOkOCUc7I1EFe5VcBwskwxqjw6DAd3hfk+Zod85mxU48zOeNN2iVHGllDiobFVyZ+IR3Fm6OKehPFrTHuhFG7IMozsjXKLHDJ3MUXFi0h6rkD39Qzb4snVc1xKacm2phy9DrHCCvxlBypIw5LzC2aiqUjqUUO1U5+ZOEavxTF7trRRwtyzCl/Ik8aIF73ey8ezC/fPPNX14hMHzVqF0qmGw/rbVaEeiyKQzvS/uINLY4PERjlGekleY5vdi31hQC6qau7Nj2/dfSgP72W8xZfdUpnULfhpvDO0AByPKG86AzdI5oxQ5V8R4ZjkUHnAwPNf7Ubl5Hri3SjfEJZizjn2pZn0YCO5rBH6OGHAdeWHGYK8SX/PMdpWBZjj8EJqL185Aqyac8tMwjOf9JnkPhp5IhPI2dtWq0On59c5vok5TjH12SvGp21bC16PetEhkdHerj3CEj13Od5e96coRyjsbaj83lWpV27M9yJ/mtGEjOlPHGBUwdfUyXN4A1fCyhDTkz0vhJec/BXylqO7Ru+VH2swQubFyA3gHVz3tTrSGh/HMyR7iyNa9n3So3uKUg7a5Zx7vihR4KpiZaREAP4dnPdnAu98X92YlRuUg4+8MLjBch3saN38Jzr+uuG/Q++SmmKe4mwdAAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{\\alpha t}$" - ], - "text/plain": [ - " α⋅t\n", - "f(t) = C₁⋅ℯ " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution_eq = dsolve(eq1)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", - "\n", - "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "C1, p_0 = symbols('C1 p_0')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAG0AAAAYCAYAAADwF3MkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFU0lEQVRoBe2a61HVQBSAA0MBjHaAHfioQOwAtQKwAxh/wT8GO0ArcLADtQIeHagV+OgAv2/JZk5CNsnFK5cBzszh7G7O7p73bnJZOj8/r+7h5ltgb2/vFCk3oWfLN1/cewlx1CpWeAx+1xr3TtMKNx/WEfE7zvujqEv35XFxHsMJB+z+E3wIrtJ/ozRQ23/ANbo7oE7TYSfgYaXT/gV3d3fXwK0pa8gn/xTe286DHb6B61lP2kfgtn3oQR6v+6eMbeSxFTzXC3qbB0bCN/CRbcZSTaWdoI6EQ+iLPDZE4XsPHoE7YGutoXm37Rm6H6KT5e5L0O0z7TeMnUFtR/A8czxB0Wk8/QBqWFHnuVDX0EeMvQQvAZvrdG88L2jHeZuMfQWfgHcVXqG4doigjSyHL7FXKpM+pJ1KY7Rh70UEBg2+Aeooo0HDf4I2QH+LzklcrHl40XCzte5z+tbmL9DtDv9d6mrfJnNqxX9BHfcMi2CWpYzEZp51a6VM0+AVDDl9M42LufhQWfRZV7A8f5/GD/BdHrhjVLuYVakC6Qzar7UBbS8g6SJiH/BoOk6tqnrLs53eTIPhGRhLWj3ngjDRDStokYfHOr7P2c4z26zpKTho3zXwSLEMboNWrC2oSeCZ71EU7eIR9Exe6EewfeWvFzBDnGS6GhG/GG9qLP2qXuBRz7jz5DVybOs0HXQMbyur6CucEdVam7FrBfZXTnW2DEXZlcPg9SuEOkwG+NX/Leh1Xui9yF08mv3vSpzCZu/p622/be1DW4YOvCppBLQAfp3keeV5uA6VrwTeSic7jLW6EVhaN4575o7t4XntbVZ9PMNtJ72h7ul40oO+0e47VXq3ot89fyrGDAJvh80FjDErk3Jc4mdsZmg5zdn1BjZ7S5sPAIUwE0ugkmbpEDjfiJwEyDUXheNmta7H9Zg6nTEWL1wGVrowMW4Ze5jlgG6Avr40t2farqGTzc54Xim7jpwLLPesYpmo2HTI6A9gGSoZRtuQ091CpVRykWDpz05S73RmBIEsa9rC4NLwZmKCep6Oi4FnZgoPGPe80uGvQLN3yJ7OmQyXMo2Zg5eQsZVrJXRGo+DYnEU9R9YUeFCDTOgGmo7MwalOVocIPnNudrzHwifW85j5b9DnNAUdiwqFjxEWBXxqB8EbA9COV9jMa7YO3T4zX6KsYRRrlFnActeUr4GJlvPmg6x8ygzRITogV4TsQIYSaAf1iDBZpzhplnaf0zT6/sgiCtYVNk9pnWcor6Hl7waChugaIa9xibKO5Wnu51q9kc5pgqwes6wpn3tmp+mkLujcDEV9kN9yWbrY5fmT6HLkYlEFELsGjmy2fV76DOX8FG31en4V6VvP+V1DMbQQsLpkx1TIa9/Mfk47OqIbqN2+wW4ANMB8q4yXkFxCm2dXbXQzLZU2FjsZWdDzqnQbUlk/InvbqqCl6HKvTXkWCciXjewH8XRTRB4vIE/o51KXqQEZoRXg6gpWoLbx5pkcTn/stSOuOd7On/vrnwAO+AngcxwrteHzp4Ur/cziPOeX1r7OceRQ51FZ5AGbn1KUkf45uHqd8rrXMlGQ3jdq9xp1vmdMATPqqmeMkVfK1Cl7z5NHnaeUaeVtLjXajb43xVg+5ylXca0lIsU0Nv0V6BQh0rtJcUZ4AK9l0t+AcvkIT/ub8FpSvkJLZ2L/xP8wWsvym6X9Djh65sBjoCq/jpL6/mX7WmGF3bIgUm9+s0DOmFnmmclNxM6y2Tx5MbaZos6CX8+9MJXO38TE86tWljR/Xn/++X9EVBZh1qGjL5TweDnx2+TkzJyXordpnb9mDj0S0kloMwAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = p_{0} e^{\\alpha t}$" - ], - "text/plain": [ - " α⋅t\n", - "f(t) = p₀⋅ℯ " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = solution_eq.subs(C1, p_0)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next example, we have to work a little harder to find the particular solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the quadratic growth equation \n", - "\n", - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r, K = symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = r \\left(1 - \\frac{f{\\left(t \\right)}}{K}\\right) f{\\left(t \\right)}$" - ], - "text/plain": [ - "d ⎛ f(t)⎞ \n", - "──(f(t)) = r⋅⎜1 - ────⎟⋅f(t)\n", - "dt ⎝ K ⎠ " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", - "eq2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" - ], - "text/plain": [ - " C₁⋅K + r⋅t \n", - " K⋅ℯ \n", - "f(t) = ───────────────\n", - " C₁⋅K + r⋅t \n", - " ℯ - 1" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution_eq = dsolve(eq2)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$" - ], - "text/plain": [ - " C₁⋅K + r⋅t \n", - " K⋅ℯ \n", - "───────────────\n", - " C₁⋅K + r⋅t \n", - "ℯ - 1" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{K e^{C_{1} K}}{e^{C_{1} K} - 1}$" - ], - "text/plain": [ - " C₁⋅K \n", - " K⋅ℯ \n", - "─────────\n", - " C₁⋅K \n", - "ℯ - 1" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "at_0 = general.subs(t, 0)\n", - "at_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", - "\n", - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(list, 1)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solutions = solve(Eq(at_0, p_0), C1)\n", - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\log{\\left(- \\frac{p_{0}}{K - p_{0}} \\right)}}{K}$" - ], - "text/plain": [ - " ⎛ -p₀ ⎞\n", - "log⎜──────⎟\n", - " ⎝K - p₀⎠\n", - "───────────\n", - " K " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle - \\frac{K p_{0} e^{r t}}{\\left(K - p_{0}\\right) \\left(- \\frac{p_{0} e^{r t}}{K - p_{0}} - 1\\right)}$" - ], - "text/plain": [ - " r⋅t \n", - " -K⋅p₀⋅ℯ \n", - "────────────────────────\n", - " ⎛ r⋅t ⎞\n", - " ⎜ p₀⋅ℯ ⎟\n", - "(K - p₀)⋅⎜- ─────── - 1⎟\n", - " ⎝ K - p₀ ⎠" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = general.subs(C1, value_of_C1)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a method that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{K p_{0} e^{r t}}{K + p_{0} e^{r t} - p_{0}}$" - ], - "text/plain": [ - " r⋅t \n", - " K⋅p₀⋅ℯ \n", - "────────────────\n", - " r⋅t \n", - "K + p₀⋅ℯ - p₀" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = simplify(particular)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", - "\n", - "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAABMAAAANCAYAAABLjFUnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABWUlEQVQoFZWTzU3DQBBGY5QCUOgAOgBRAUkHgQ6ADsjRvoYOKCGQDqCDoHRAOiCkA/PeeNdaLDgw0uw3/zM79lZt246kpmmmwAw+h+/hY1ibdAnfEnMI7Y9jXNhnBC/gF2yvsPKjfnAJaLeZ+gNwAn+K6AtwdOSBcgpslCHlLbZ1aN3xAcSU2O+QowCyzTagjbpi4L5I9pornQWdKRPj1Z3CyYNS3lxfnix2gSHv6C0HJ7RB3peT7wd+fdMoVjjcyY6iOXFkRwPhZ9hCUu/v1Cg+GRYzaTjVTUqOJRfJSeyhu2avdr9F7u5UXs8veYVcTjMpchRDH2cjwXlfS2Q/veTiL9B3obGChF69JPVtXwwl78trDq8aiU6XCg8n0/9e7uy3fUWRwfGEfp1tFJ8jr21U+ZwQHPPLIOTyZ805P5AY92jOIaGv5VDVdW1lnS5+C69wxDNC/hd9A8sSejeLNWH7AAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle p_{0}$" - ], - "text/plain": [ - "p₀" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", - "\n", - "In some places you'll see it written in a different form:\n", - "\n", - "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", - "\n", - "where $A = (K - p_0) / p_0$.\n", - "\n", - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEEAAAAuCAYAAAB3VXTKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEJklEQVRoBe2Z7VEbMRCGz4wL8JAOnA5gUkGgAyAVJOkAJr/sf5nQAaQCIB2EVECGDkIHEHfgvI+s1dyJuzMMp8OX0c5odrX6OO2r1crWjpbLZVGm+Xx+rPo7lQOvvxW/U/motoXXFZKvJJf70E7fwdEoBsEskEGgcyu+a7oylx4APlMkA9JgaVy3chm15/XXDe2fpH9Qv/269qHpakGQEWbcz7JBMnqi+heVs6HvftmuJhCcJ8jQ4AmSdzTwg/hJeYL/QW4CAYNDkJPhuP+uODFgI0hrYaPwWNbKuvBSt3niBPZKIFe9kR6B4CdngPMC1b9J5sbYtOC3r7WdqHBLcWyRT8ULcdaM3h1r1Vn/G5V7uOoVb96SMiaLB/dM5gecq9NUsl2J8Zhe61rHVB+88R9F5hb7UVrEH8nOK6THi53hkgHpRhyAAj3yBLWYSy38IDqDLJMRFMsfU3U9aR5c9ZcK/Cm0UKe23x3cTLYOjsPXaNK31P132fVwjBmnckWbCt8p6kBg0mt1YPcdSb5T4Xjsie+ohHjhu7Qy9edjtb83Wgc2NPr5CnHbsBDA/RBscAaK4ykPXm+MNsY6ILdMCy9NWrkafR+8AcIbNoU4umyQGYwNE+kw8FIFAKDQvqo6ULa9XFRAkNLiQYwsk6MjOB74D9kcr8kxNl7rkXQYXQ5+sSewZsByFIPgAp+MbHL3Mz9uU7wBt7fdZqOo47HvJZd3P+y6X3+lPlZnEPmuwmRuQumInkRRd+VILiRzzViAOVadD77a/wZ93+IBNxhrgwiI/J6x69x42HXXa+UFYaMBAcQOfWMjUz8ACaA0duyvweIBxyE+Em4V2OYBqey8X+JvW2p8HEw/BF4XD+rWzREOmyxQOPJck+G4NP6VrpttU3QyAPf+q3Io2X4vNC5PfYgTjMFwOL8ukR0NDgQtnp3EKOIX5/pCuhcd08GBIKM7pyHHhM7AyCAIygyCQBjNZrPqc3NnTjaciXJgzMdh5a05JmRPyJ6wQiB7QvaE7AkBgXwc8nEIzjAOUiJB//V5AeIpzL1JivOoYe+Dz8oZalwS6uPHkssZavW85JDPIJ136h9CeAitpMRU752SeoIMncqidTlDeyku1B+5MXGaCp3UnhDnDC8iQ0LOUACsTZxGYzurJgVBhrnHTHGLAfHTOHGCZ3H6kTEK6T/peEDtJduVFAQZYWQ5AgcKShk5EQOcSy9zdOJ0Gf0NQIlpqC8QMCT2giPpzAMAAAograrVxKnXdc76AgG3N0PxAup1OcPYEzAYj0lK46Sza3IZbO7cljO0ZWxLKHsD9eSUHARZYPGgMWeoPk9KnKZCo4/jUBcPKvbIW9h9gKjb+ZA4rQzqsJIUBBnHeeb8h6uvZe1rE6ctY1/UlOy1WQA8O2eoMa2J0xdZ2jL4HwrefShVXkI5AAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle \\frac{K - p_{0}}{p_{0}}$" - ], - "text/plain": [ - "K - p₀\n", - "──────\n", - " p₀ " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A = (K - p_0) / p_0\n", - "A" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{K}{1 + \\frac{\\left(K - p_{0}\\right) e^{- r t}}{p_{0}}}$" - ], - "text/plain": [ - " K \n", - "──────────────────\n", - " -r⋅t\n", - " (K - p₀)⋅ℯ \n", - "1 + ──────────────\n", - " p₀ " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "logistic = K / (1 + A * exp(-r*t))\n", - "logistic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAOCAYAAAAWo42rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA3ElEQVQoFW2S3Q2CQBCEkVgA0Q7ODvypQEpQO9AWjG+8GVuwA4MdCBWY0IF2ILED/AZvyYWwyTKze7M75GDUNE2kyLIsAS7kl3yRM/JGvwKjWA8fJfjg4Ehe4Wcyhzudt0KKA9yBdzUVcG1Wnau2jVt4oUYvntRzhhITpj2BldqqSGOp/zyqPQ6B08aJP7HpUGjDU7PWoW0OhR2X0Ka6ZkDM7aN3NEtrBrrO5W3WupohaxsuTKhLXYarPF+AlVxbIUSfrAY3JobLYUfu1Rvr4UPTJwTO1ytwTd3+FD9d+zu+IBCKGAAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle 0$" - ], - "text/plain": [ - "0" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simplify(particular - logistic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "alpha, beta = symbols('alpha beta')" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)} + \\beta f^{2}{\\left(t \\right)}$" - ], - "text/plain": [ - "d 2 \n", - "──(f(t)) = α⋅f(t) + β⋅f (t)\n", - "dt " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "eq3 = Eq(diff(f(t), t), alpha*f(t) + beta*f(t)**2)\n", - "eq3" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle f{\\left(t \\right)} = \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" - ], - "text/plain": [ - " α⋅(C₁ + t) \n", - " α⋅ℯ \n", - "f(t) = ───────────────────\n", - " ⎛ α⋅(C₁ + t)⎞\n", - " β⋅⎝1 - ℯ ⎠" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "solution_eq = dsolve(eq3)\n", - "solution_eq" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$" - ], - "text/plain": [ - " α⋅(C₁ + t) \n", - " α⋅ℯ \n", - "───────────────────\n", - " ⎛ α⋅(C₁ + t)⎞\n", - "β⋅⎝1 - ℯ ⎠" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "at_0 = general.subs(t, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\log{\\left(\\frac{\\beta p_{0}}{\\alpha + \\beta p_{0}} \\right)}}{\\alpha}$" - ], - "text/plain": [ - " ⎛ β⋅p₀ ⎞\n", - "log⎜────────⎟\n", - " ⎝α + β⋅p₀⎠\n", - "─────────────\n", - " α " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "solutions = solve(Eq(at_0, p_0), C1)\n", - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\alpha p_{0} e^{\\alpha t}}{\\alpha - \\beta p_{0} e^{\\alpha t} + \\beta p_{0}}$" - ], - "text/plain": [ - " α⋅t \n", - " α⋅p₀⋅ℯ \n", - "────────────────────\n", - " α⋅t \n", - "α - β⋅p₀⋅ℯ + β⋅p₀" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "particular = general.subs(C1, value_of_C1)\n", - "particular.simplify()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap10soln.ipynb b/soln/chap10soln.ipynb deleted file mode 100644 index 912b67ac..00000000 --- a/soln/chap10soln.ipynb +++ /dev/null @@ -1,1208 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 10\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", - "\n", - "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(67, 11)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - "table2.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(67,)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census = table2.census / 1e9\n", - "census.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(67,)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "un = table2.un / 1e9\n", - "un.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Int64Index([1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,\n", - " 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,\n", - " 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,\n", - " 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,\n", - " 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n", - " 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,\n", - " 2016],\n", - " dtype='int64', name='Year')" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `columns`, which labels the columns." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['census', 'prb', 'un', 'maddison', 'hyde', 'tanton', 'biraben', 'mj',\n", - " 'thomlinson', 'durand', 'clark'],\n", - " dtype='object')" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `values`, which is an array of values." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[2557628654, 2516000000.0, 2525149000.0, 2544000000.0,\n", - " 2527960000.0, 2400000000.0, 2527000000.0, 2500000000.0,\n", - " 2400000000.0, nan, 2486000000.0],\n", - " [2594939877, nan, 2572850917.0, 2571663000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2636772306, nan, 2619292068.0, 2617949000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2682053389, nan, 2665865392.0, 2665959000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2730228104, nan, 2713172027.0, 2716927000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2782098943, nan, 2761650981.0, 2769074000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2835299673, nan, 2811572031.0, 2822502000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2891349717, nan, 2863042795.0, 2879934000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [2948137248, nan, 2916030167.0, 2939254000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3000716593, nan, 2970395814.0, 2995909000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3043001508, nan, 3026002942.0, 3041507000.0, 3042000000.0, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [3083966929, nan, 3082830266.0, 3082161000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3140093217, nan, 3141071531.0, 3135787000.0, nan, nan, nan, nan,\n", - " nan, nan, 3036000000.0],\n", - " [3209827882, nan, 3201178277.0, 3201354000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3281201306, nan, 3263738832.0, 3266477000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3350425793, nan, 3329122479.0, 3333138000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3420677923, nan, 3397475247.0, 3402224000.0, nan, nan, nan, nan,\n", - " nan, nan, 3288000000.0],\n", - " [3490333715, nan, 3468521724.0, 3471464000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3562313822, nan, 3541674891.0, 3543086000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3637159050, nan, 3616108749.0, 3615743000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3712697742, nan, 3691172616.0, 3691157000.0, 3710000000.0, nan,\n", - " 3637000000.0, nan, 3600000000.0, '3,600,000,000– 3,700,000,000',\n", - " 3632000000.0],\n", - " [3790326948, nan, 3766754345.0, 3769818000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3866568653, nan, 3842873611.0, 3846499000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [3942096442, nan, 3919182332.0, 3922793000.0, 3923000000.0, nan,\n", - " nan, nan, nan, nan, 3860000000.0],\n", - " [4016608813, nan, 3995304922.0, 3997677000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4089083233, nan, 4071020434.0, 4070671000.0, nan, nan, nan,\n", - " 3900000000.0, 4000000000.0, nan, nan],\n", - " [4160185010, nan, 4146135850.0, 4141445000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4232084578, nan, 4220816737.0, 4213539000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4304105753, nan, 4295664825.0, 4286317000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4379013942, nan, 4371527871.0, 4363144000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4451362735, nan, 4449048798.0, 4439529000.0, 4461000000.0, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [4534410125, nan, 4528234634.0, 4514838000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4614566561, nan, 4608962418.0, 4587307000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4695736743, nan, 4691559840.0, 4676388000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4774569391, nan, 4776392828.0, 4756521000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [4856462699, nan, 4863601517.0, 4837719000.0, nan, 5000000000.0,\n", - " nan, nan, nan, nan, nan],\n", - " [4940571232, nan, 4953376710.0, 4920968000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5027200492, nan, 5045315871.0, 5006672000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5114557167, nan, 5138214688.0, 5093306000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5201440110, nan, 5230000000.0, 5180540000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5288955934, nan, 5320816667.0, 5269029000.0, 5308000000.0, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [5371585922, nan, 5408908724.0, 5351922000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5456136278, nan, 5494899570.0, 5435722000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5538268316, nan, 5578865109.0, 5518127000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5618682132, nan, 5661086346.0, 5599396000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5699202985, 5760000000.0, 5741822412.0, 5681575000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [5779440593, nan, 5821016750.0, 5762212000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [5857972543, 5840000000.0, 5898688337.0, 5842122000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [5935213248, nan, 5975303657.0, 5921366000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [6012074922, nan, 6051478010.0, 5999622000.0, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [6088571383, 6067000000.0, 6127700428.0, 6076558000.0,\n", - " 6145000000.0, nan, nan, 5750000000.0, nan, nan, nan],\n", - " [6165219247, 6137000000.0, 6204147026.0, 6154791000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6242016348, 6215000000.0, 6280853817.0, 6231704000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6318590956, 6314000000.0, 6357991749.0, 6308364000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6395699509, 6396000000.0, 6435705595.0, 6374056000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6473044732, 6477000000.0, 6514094605.0, 6462987000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6551263534, 6555000000.0, 6593227977.0, 6540214000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6629913759, 6625000000.0, 6673105937.0, 6616689000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6709049780, 6705000000.0, 6753649228.0, 6694832000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6788214394, 6809972000.0, 6834721933.0, 6764086000.0, nan, nan,\n", - " nan, nan, nan, nan, nan],\n", - " [6858584755, 6892319000.0, 6916183482.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [6935999491, 6986951000.0, 6997998760.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [7013871313, 7057075000.0, 7080072417.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [7092128094, 7136796000.0, 7162119434.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [7169968185, 7238184000.0, 7243784000.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [7247892788, 7336435000.0, 7349472000.0, nan, nan, nan, nan, nan,\n", - " nan, nan, nan],\n", - " [7325996709, 7418151841.0, nan, nan, nan, nan, nan, nan, nan, nan,\n", - " nan]], dtype=object)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table2.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Series` does not have `columns`, but it does have `name`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'census'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It contains `values`, which is an array." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([2.55762865, 2.59493988, 2.63677231, 2.68205339, 2.7302281 ,\n", - " 2.78209894, 2.83529967, 2.89134972, 2.94813725, 3.00071659,\n", - " 3.04300151, 3.08396693, 3.14009322, 3.20982788, 3.28120131,\n", - " 3.35042579, 3.42067792, 3.49033371, 3.56231382, 3.63715905,\n", - " 3.71269774, 3.79032695, 3.86656865, 3.94209644, 4.01660881,\n", - " 4.08908323, 4.16018501, 4.23208458, 4.30410575, 4.37901394,\n", - " 4.45136274, 4.53441012, 4.61456656, 4.69573674, 4.77456939,\n", - " 4.8564627 , 4.94057123, 5.02720049, 5.11455717, 5.20144011,\n", - " 5.28895593, 5.37158592, 5.45613628, 5.53826832, 5.61868213,\n", - " 5.69920299, 5.77944059, 5.85797254, 5.93521325, 6.01207492,\n", - " 6.08857138, 6.16521925, 6.24201635, 6.31859096, 6.39569951,\n", - " 6.47304473, 6.55126353, 6.62991376, 6.70904978, 6.78821439,\n", - " 6.85858475, 6.93599949, 7.01387131, 7.09212809, 7.16996819,\n", - " 7.24789279, 7.32599671])" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And it contains `index`:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Int64Index([1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,\n", - " 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,\n", - " 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,\n", - " 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,\n", - " 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n", - " 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,\n", - " 2016],\n", - " dtype='int64', name='Year')" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "census.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", - "\n", - "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", - "\n", - "`ndarray` is defined by NumPy." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.frame.DataFrame" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(table2)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.indexes.numeric.Int64Index" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(table2.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.indexes.base.Index" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(table2.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.ndarray" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(table2.values)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.series.Series" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.indexes.numeric.Int64Index" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(census.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.ndarray" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(census.values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional exercise\n", - "\n", - "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", - "\n", - "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Select `tables[1]`, which is the second table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    -10000NaNNaNNaN2M[24]NaNNaN4.01–10MNaNNaN
    -9000NaNNaNNaN4.NaNNaNNaNNaNNaNNaN
    -80005.NaNNaN5.NaNNaNNaNNaN5–10MNaN
    -7000NaNNaNNaN8.NaNNaNNaNNaNNaNNaN
    -6000NaNNaNNaN11.NaNNaNNaNNaNNaNNaN
    \n", - "
    " - ], - "text/plain": [ - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "-10000 NaN \n", - "-9000 NaN \n", - "-8000 5. \n", - "-7000 NaN \n", - "-6000 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "-10000 NaN \n", - "-9000 NaN \n", - "-8000 NaN \n", - "-7000 NaN \n", - "-6000 NaN \n", - "\n", - " Maddison (2008)[17] HYDE (2010)[citation needed] Tanton (1994)[18] \\\n", - "Year \n", - "-10000 NaN 2M[24] NaN \n", - "-9000 NaN 4. NaN \n", - "-8000 NaN 5. NaN \n", - "-7000 NaN 8. NaN \n", - "-6000 NaN 11. NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "-10000 NaN 4.0 1–10M \n", - "-9000 NaN NaN NaN \n", - "-8000 NaN NaN NaN \n", - "-7000 NaN NaN NaN \n", - "-6000 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "-10000 NaN NaN \n", - "-9000 NaN NaN \n", - "-8000 5–10M NaN \n", - "-7000 NaN NaN \n", - "-6000 NaN NaN " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table1 = tables[1]\n", - "table1.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
    Year
    1913NaNNaN1793.NaNNaNNaNNaNNaNNaNNaN
    1920NaN1860.01863.1912.NaNNaNNaNNaNNaN1968.
    1925NaNNaNNaNNaNNaNNaN2000.0NaNNaNNaN
    1930NaN2070.0NaN2092.NaNNaNNaNNaNNaN2145.
    1940NaN2300.02299.2307.NaNNaNNaNNaNNaN2340.
    \n", - "
    " - ], - "text/plain": [ - " Population Reference Bureau (1973–2016)[15] \\\n", - "Year \n", - "1913 NaN \n", - "1920 NaN \n", - "1925 NaN \n", - "1930 NaN \n", - "1940 NaN \n", - "\n", - " United Nations Department of Economic and Social Affairs (2015)[16] \\\n", - "Year \n", - "1913 NaN \n", - "1920 1860.0 \n", - "1925 NaN \n", - "1930 2070.0 \n", - "1940 2300.0 \n", - "\n", - " Maddison (2008)[17] HYDE (2010)[citation needed] Tanton (1994)[18] \\\n", - "Year \n", - "1913 1793. NaN NaN \n", - "1920 1863. 1912. NaN \n", - "1925 NaN NaN NaN \n", - "1930 NaN 2092. NaN \n", - "1940 2299. 2307. NaN \n", - "\n", - " Biraben (1980)[19] McEvedy & Jones (1978)[20] Thomlinson (1975)[21] \\\n", - "Year \n", - "1913 NaN NaN NaN \n", - "1920 NaN NaN NaN \n", - "1925 NaN 2000.0 NaN \n", - "1930 NaN NaN NaN \n", - "1940 NaN NaN NaN \n", - "\n", - " Durand (1974)[22] Clark (1967)[23] \n", - "Year \n", - "1913 NaN NaN \n", - "1920 NaN 1968. \n", - "1925 NaN NaN \n", - "1930 NaN 2145. \n", - "1940 NaN 2340. " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "table1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Again, we'll replace the long column names with more convenient abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", - " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "for col in table1.columns:\n", - " table1[col] = pd.to_numeric(table1[col], errors='coerce')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results. Notice that we are working in millions now, not billions." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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4E/H4lNKqTqkujpJBFqDuga4X0QeC2YwSimlar/93cyD20s40PTXCHgnmIEopZQ6NlRXL75AS3+XSq4RqSOTkZFBz5498Xjsh+12u+nZsycLFiw4aN8FCxbQr18/0tPTSx9FRUUH7Xeo82VkZFS6z86dOxkyZAgDBgxg/fr1Fe6Xnp5+WOdWSh0/alsTXz5wjzHmMmAtB446johcXtWB1RX169dn6dKldOnShSVLlhAZGVnhvpdccgmjR48Oajzffvst55xzDs2aNeO///0vbdq0Cer5lFLHnupq4gs0QUUDbwUzkNooZ8V2cpYd3VSFafAAACAASURBVPh1cSc3Ji6tcYXb+/Tpw/z58+nSpQvz58+nb9++AGzcuJG7776bgoIC0tPTSUlJOejYbdu28eSTTzJx4kT+97//8fXXX9OrVy+efvppAO688066du3KXXfdxbZt2wgNDeUvf/kLN9xwA4888giNGjVixIgRTJkyhdDQUABOPfVUbrjhBlJSUrj33nsP+frmzJnDjBkzCA8P54EHHmDFihUHDVC7cOHCA2Lq0KEDo0ePJi8vj+7du3Pbbbcd4ixKqdqktImvNtSgROTvQY2iDjv55JP5/PPPAcjKyqJp06YATJ8+nTFjxtChQwdefvllUlJSeO+991i40I7J26pVKx5++GF2795NUVERX375JRdccAETJkxg6tSpuFwuRo8ezc0330xsbCxPPvkkTz75JADnnXcec+fOpVevXqSkpJQmJ4BFixYRFRVFTEwMMTEx7N69m/j4eMrj8Xj417/+xcyZM8nMzOSRRx7hvPPOo1mzZjzzzDOMGDGC7du38/zzzx8Q05133knjxo15+OGH+fjjj4P59iqlgqA23gd1MnAX9kbZEOyo4c+JyPdBiq3GxaVVXvupCi6Xi/j4eFavXk3jxvvP9fvvv9OuXTvCwsIYNWoUCxYsKLeJr1evXixYsAAR4c4772TdunVcf/31AOzevZvNmzdjjB0pKi0tjYKCAs455xzuvfde8vPzOe+880rL2rdvH++++y4zZ87klltu4frrr2fkyJGlg9N6PB7y8/OpX78+YK9XpaamEhYWRkpKSukYgmUHqC0bU7t27TjxxBMZMWIEaWlpeL1eHTNQqWOI12Ob+EJqQycJY8yfgZ+xvfneBf4NxALzjDF/Cl54dUPv3r2ZMGFC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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "table1.plot()\n", - "decorate(xlim=[-10000, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='Prehistoric population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `xlim` to zoom in on everything after Year 0." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3hUVfrA8e+kJyQhCQmQhBaKBwhNWlB6W1gVd0WKgBFXXPSnYi/Y1g4iYkNdxYKCCroSFDsqCtgoKh0OvYWEJCQhvc78/rg3cQhJuECSSXk/z5OHmXvOvfPORPPOKfccm8PhQAghhKht3FwdgBBCCFEeSVBCCCFqJUlQQgghaiVJUEIIIWolSVBCCCFqJUlQQgghaiUPVwcgGh6lVCNgJjARaAkkAnHAE1rrdLPOo8AjFVwiXmvdogZCPWtKKQcwRmv9uYW6/sBErfVb5vN3AH+t9bjqjfLsKaWuADZqrY8opYYAPwABWuusanitNkB3rfWnVX1tUbdIC0rUKKVUIPAbMAK4FegM3AiMAlYqpXydqm8Gwsv5ubAmY65GdwH/5/T8NuB6F8VSIaVUa4wvEI3NQ79g/B6yq+klFwIDq+naog6RFpSoaU9jfDEaprXONY8dUErtAPYC/wJeNY8Xaa0TXRBjTbE5P9Fan3RVIGdQNs4CjFZvjbyeaLgkQYkao5TyBqYA9zklJwDMrqOhgD6P67cBDgCTgaeAMOAb4Aat9QmzTjjwDEaLzQf4GrhNa51gljuAfwO3A1HAz+b5B5zKS7vwKuvuMrsy5wL/NGNJBF7XWj+plLoWswvTvGYU8ChOXXxKqb8BTwBdgBTgZeBZrbXDPP8W4CPgDsDTfC83aK3Lbdkopf4OzAYUsN+81kKzLAB4DRhtfi5rgRla6z3mZwqwVSn1GPCj83s2458E3G9eeyNwNXAPEAtkAPdrrRebr9UBmAcMAnyBPcADWusVZjfnYGCwUmqc1rqNGds8YBzgAFaZv7Nj5vWuMD+n9kAC8KrWem55n4GoW6SLT9SktkAgsKG8Qq31LyWJ5DzNxug6G4Lxh/9/AEopT+B7oBVwCTAMiAQ+UUo5f2t/GuMPXgxgB742zz1bzwEXYSQoBbwEPKGU6gV8iPFHt6Qb84jziUqpQcCXwGcYXZoPAA8DNzlV64bRFTYCI6mOxeguPY1SKhpYhpGEugCPA/OUUleZVZ7E+P0MAXqa7/tts6yv+e8Q4NkK3uvTGEm9H8bn+wdGYuqD0T34ulLK3/ycPwMyzbo9gK3AQqWUF0Y356/Af81zARaYn98ojOTlAL5RSnkopZphfJbPm3XuAZ5SSg2vIE5Rh0gLStSkYPNfq11ZFyqlyhuEn6W1nlXJeQ9rrb8BUEpNA/5USnUC2mF8yx7h9O17IkYLYQTwrXn+i1rrD83yqcBhs/wri3GX+BmjxfSH+XyuUuo/QGet9e/meyvtxlRKOZ97K/C11vpJ8/lupVQLjET1innME/i3ef52pdTXQK8KYrkXeF9r/Zr5fJ9Sqh1wN7AUaIORNA6YraLrzWMAyea/J8yy8q7/itb6B/N9fA5chtEqciilngNmYHxZ2Ae8CbyttU416z8LXAU0M1vSBUCO1jpZKdXWLGuhtY4368ditChHA/Hm53BEa30IOKSUOg7sruBzEHWIJChRk1LMf4MrrfWXHcAV5RxPPcN5a50ebwbyMVoNbYFDJckJQGt9VCl1EIjmrwS11qn8uFLqkHn+2Sao94DLzD+oF2C0FvwBdwvnRpvnO/sJeFopFWQ+zywzRpcBNKrkel2VUpOcjnkAhebj2cAXQLJSajXwCbDYQpwl9jo9zgEOaq1LVqLOM//11lrnKKX+C0xWSvXG+Fx6muXlfS6dzX91mcToh9Fi+gJ4H6NFtd98vkhrffwsYhe1lCQoUZP2Aicwum5O6+Yzv2knOI0f5Gut95atZ0FRmec2oBjILaduSblzd3fZ893M88tT2f9Db2O0vBaZP/+HkTCtKC/Wkm7IklgLKqlTlgcwH6OL7zRa69/MMbwxwN+BWcBNSqm+5dUvR2GZ5/byKpnjcusw3t9yYAWQhTGuVVHchRjdnGW3Xkg1k+DVZivsHxhdtzcppf5VMuYl6i4ZgxI1Rmttx/hWPkMp5eNcZv5xvAGjtXO+ejo9vhDwwkgMO4HW5kSJkteNAFoDu8o7XynVHGNMpSSxFPDXdGswWmWnMQf2Y4FrtNYPmF2GJeeWJJHK9rrZiTF+5exiIAlIq+S8yq7XXmu9t+QHY0zpJjPe+4EYrfUHWutYjPGhrhjjXFW5J88QoAMwUGs9S2v9BdDMLCvvc9mJ0YXXyCnuBIzJJxcopborpZ7TWm/SWj+mtY7BmDji3FIUdZS0oERNewK4FPhBKfUIxgyu7hgz67ZgDIiX8DATRHmStdYVtWrmKaVSMZLd68DnWut9ZhfQZmCpUupOs+5zGOMV3zmd/5BSai/GxIV5wHb++oa/AbhLKfUHxuSGuyuIIQ/jPqGxSqkDQATGH1Ub4G3WyQKam+Msh8ucPxfYqJR6CGMSQE+MWXIls/gqeNkKPQusU0o9gPEHvDvGxIKSMa4WQKw59pQAXIvRZbibv7reeiilTpnMcQ5OYHxhmKiU+hHjfb1gljl/Lu2VUpFaa62UWgEsUkrdjDEe9hRGAt0FBAD/p5RKw+gSjTDLpPVUD0gLStQoc2B8AMZU5NcxxpnmYYx5jNZa5zlV747xx7K8n5aVvMxCYAlG0tmMMe0cszvonxh/5H7EmNF3DBhu3ttTYgHGH+9fMZLMJU7J8BaMLsBNZtwzK3ifhebrjjDf4yJgJcbMvJKJDB9jTEzYQZmbj7XWmzBm5Y0HtmF0uT1h/nvWtNa/Y0zTnoiRcJ/DmHn3jFnlXoxJHcsxWi3DzPedbs6sfAtjcsNj5/L6TnH8BjxovvYO4D8YST6Nvz6X/wL9gc1KKTdgKsZ/L59gfEFoDIw0YzuC8TldYb6vZWa9p84nTlE72GRHXVFfON0H1VVrve0cr2F5qSIhRPWSFpQQQohaSRKUEEKIWkm6+IQQQtRKDXoWn7k2XB+MQfeKZoQJIYSonDvGrNYNWuuquFUEaOAJCiM5rT1jLSGEEFYMxFjxpEo09ASVAPD+++/TvHlFt9sIIYSoTGJiIlOmTAHzb2pVaegJqhigefPmtGhRKzdoFUKIuqRKh0pkFp8QQohaSRKUEEKIWqmhd/GdJj09nZSUFAoLyy7OLGqCp6cnoaGhBAUFnbmyEKJekwRVRkJCAm3atMHHxwebraKdC0R1cDgc5OXlcfDgQUlQQghJUOXx9fV1dQgNks1mk89eCFFKxqCEEELUStKCcrG4uDgWLFhAWFgYhYWFDBo0iBUrVhAWFgbAyZMnufnmmxk1ahSjR48mLCyM4uJiwsLCmDt3Ll5eXi5+B0KI+sjucPDOlkOMiGpKq0A/l8QgCaoWmD59OmPHjgUgNjYWPz8/Fi829lvLysritttuY9SoUYSFhZUef+GFF1i3bh0DBw50WdxCiPorNbeAX+NT6RDiLwmqNlq18TDfri+70enZGdm3FcN6t7JUt6CgALvdjofHX7+W9PR07Hb7aXVzcnJo3LjxaceFEKIqpOcZM5mDfTxdFoMkqFpgwYIFLF++HDc3NyZPnsz8+fOJjY0lKSmJ0NBQHn30UQCSk5OJjY0lLy+PgoIC7rrrLtcGLoSot05k5QDg2PInDB/ikhgkQVViWG/rrZ/z4dzFB7B06VIWL17MoUOHuPXWWwkPDwc4pYvvs88+47XXXuO2226r9viEEA1P8vEkADyP7gSGuCQGmcVXi7Vu3ZoJEyYwf/7808pKJksIIUR1OJGegXthIYHBwS6LQVpQtdzEiRMZO3Ysx44dK+3ic3Mzvlc888wzLo5OCFFfpeUW4JdThE/bZi6LQRKUizl37ZUo6cYD8PDwYMWKFQB8/fXXNRaXEKJhO1nsoFFWBj7Nu7osBuniE0IIcZoMPPDLycS7abjLYpAEJYQQ4hQOh4MsTx8a5WXi5tPIZXFIghJCCHGKrIIi7G7uBBTkuHTRbElQQgghTpFm3qQbYM91aRySoIQQQpyiJEE1thW5NA5Ls/iUUk2A4UBvoCnGvvOJwAbgW611drVFWM/FxcUBf83mmz9/PuvXrycqKorHH3+89Fjfvn2JiYlxWZxCiIYjLcdoOQV5unZPvEpbUEqp9kqphUA8MA/oDngB/kA/4A0gRSn1hlKqQ3UH25B8++237Ny509VhCCEaoBPpmdjsdoL8fVwaR4UtKKXUf4BrgHeBXlrr7RXUiwamAN8qpd7RWj9aHYG6QuaWH8ncvOq8rhHQfRgB3Yac9Xk33ngjs2fPZtGiRef1+kIIcbZOnMzENzcbnyYhLo2jsi6+bKCz1rqgsguYiesBpdQTwM1VGVxD1rFjR/bt28eXX37p6lCEEA3Mydx8/LIz8Y4Ic2kcFSYorfW8s7mQ1joXePa8I6pFAroNOafWz9nw9vYmKyur9Hlubm7pJoS33347//rXvxgwYEC1xiCEEM56nzxK8oZ1eE+/0qVxWJrFp5RyU0r9SynV0nw+Uym1TSn1tlIqoHpDrN/atWvHb7/9BoDdbmfr1q1ERUUBEBISwtixY/n4449dGaIQooFpcfwAkUcP4N0swqVxWJ1mPhujddRUKTUUeAL4FOgCPF9NsTUIHTt2JDIykrFjxzJx4kRGjx59ykaEU6ZMITQ01IURCiEamsLUNNw8wLNxE5fGYXWx2KuB8Vrr35VSC4A1WusHlVLLgJXA9dUWYQNw9913V1jm4eHBF198UYPRCCEausKMDNy8cOkyR2C9BRUM7DEfXwKUjNyfxJh2LoQQop7wCvTGN8zXpcscgfUW1FbgGqVUIhABfKqU8gTuAjZVV3BCCCFqXlCnEIqzXb8bk9UI7gaWAyHALK31XqXUq8A44NLqCk4IIUTN848eCA6Hq8OwlqC01muVUk2BxlrrNPPwbOBOrXVetUUnhBCixgV0HezqEICz21E3FOhmdu2VdkwqpdBaW7qbVCk1Enga6AAkAXO11q8rpbyAlzFaZMXAc1rr2U7nTQBmAeHAauBarXWSWdYKeAtj6aUkYIbVeIQQQtReVu+DmgYcwZix9wXwudPPZxav0RJYBjwJBAGTgNlKqVHAY4AC2gF9gKlKqWvM8zpjJKBrgSYYkzWWOl16KbDFLPs3sFQp1dZKTLVBXFwcMTEx2O12AIqLi4mJiWHdunUVnrNu3Trmz59/yrGZM2dy9OhRnnrqqWqNVwghaorVFtQ9GAvD3q+1zjzH12oDfKC1Xm4+36CU+hHoD0zFaBWlAWlKqWeBG4BFGFPcP9Na/wSglLrfrNMBoyXXGxhpLsm0Sim1ApgGPHiOcda4Ro0asWXLFnr06MGmTZvw9vY+52s9+GCdedtCCFEpqwmqJfDieSQntNZrgbUlz5VSIcBAYDFG190Op+q7gK7m487ARqfr5CiljpjlduBwme0+dgF9zzVOZ6sP/MYPB345r2sMjbqYwVH9Kq0zaNAg1qxZQ48ePVizZg2DBw/m999/59VXXyUvL48RI0bw73//m3nz5rFhwwaCgoKIjo4mNTWVW2+9FQ8PDzIyMgCIjY1l8eLFPPnkk+zatQt/f39eeuklNm7cyAsvvIDNZuOOO+7AZrPx7rvvkptrLKv/+uuvly6xJIQQtYHV+6BWYuwHVSWUUo2BFcA64HfzcI5TlRzAz3zsX6bMubyysjqja9eubN9uLBafnJxM06ZNCQ8P5+WXX+b999/nu+++48SJE+zZs4elS5cyaNAgAJYtW8bVV1/NwoUL8fT0POWaO3bs4PXXX+eaa64hMzOTV155hbfffpu33nqrtHvQ29ubhQsX0rJlS7Zt21azb1oIIc7AagtqM/CcUupyYDdwygrnWut7rb6gUuoCjGWSdmBs0+FrFvk6VfMDSlZQzS5T5lxuq6TsvA2O6nfG1k9VsNlsBAUFsWvXLpo1awZA06ZN+c9//kNAQAAFBQXEx8dzwQUXABAdHc2aNWs4duwYI0aMwGaz0bFjx1OuecMNN3DHHXfg7+/Pww8/jJubG/7+/qWvB5Su+RcWFkZhYWG1v08hhDgbVltQgzFaO74Ymxb2cfrpbfXFlFKDzOt8AozTWueZ406JGJMkSnTkry6/Hc5lSik/oJV5fAfQSinlW8G5dcaAAQOYM2cOgwcb0zuff/555syZw6233kpOTg6tWrVi165dAOzevRuA1q1bs2OH8Vb37NlTeq2CggK2bt3KggUL6NmzJ6tXr6a4uJisrCyysrIoKDC+X7j6LnEhhKiM1fughp7vCyml2mHM+ntQaz2/TPFi4BGl1BaMbru7gRfNsg+An5RSQ4BfMe6/+lNrvdu87mbgKXPyxMXAP4CLzjfemjZgwACefvppunXrxtq1a/H19WXcuHEEBQXRqFEj/P396du3LxMnTqRZs2Z06NCBiRMnctNNN/Hhhx+WzgIE8PLyIiMjo/T8OXPmEBoaynXXXUdxcTEzZ848pb4QQtRGNofFu4WVUs2AW4BojJbXTuANrfV+i+c/B9yB0WXn7BXgEYwt5ceZ114APKS1dpjnXgk8BURitMCu01ofNstamvUvBlIwZhp+ZDGmNsCB77//nhYtWgCwc+dOOnXqZOV0UU3kdyBE3XL06FGGDx8OEKW1PlhV17XUglJK9QW+xbgX6heMsZ/LgBlKqSFa642VnQ+gtb4TuLOSKjdTwY68WutlGPdQlVd2BPj7mV5fCCFE3WJ1ksQ8YAnwfyWtGgCl1MvAXOC8uwCFEEIIZ1YTVG/geufkZJrPX9PEhRBCiCpjdRZfAsZKEGW1Bc755l0hhBCiIlZbUIuBBUqp24HfzGMXYWz3vrg6AhNCCNGwWU1QT2FsVPgRRqvLBhRidPHJ4m/nIS4uDoCxY8cCMH/+fNatW8eDDz5Ip06dsNvtTJkyhXnz5nHdddcRFhZGcXExgYGBzJo1i5CQEEaPHk1YWFjpNa+99tqSGTVCCGHZ7pT9fL77e+646PpacZ+k1fugCoB/K6XuxrhpNhfYq7XOrc7gGqphw4bxzDPPsHDhQpYvX86AAQOIiIggLCyMxYuNBuvGjRuZP38+jzzyyCnHhRDiXK0++BubE3fgwIGNWpyglFKXAN9qrQvNx2W1VMpY4KG+7r+UtOpHjn+/6ryu0Wz4MJoOG3JW50RHR7N7925WrVpFXFwcb7/99ml1evfuzeuvv35esQkhhLN9qYdoF9waN5vV6QnVq7IW1OdAc4xNAD+vpJ4DcK/KoBqaBQsWsHy5sQtJfHw8ffv25c477+SKK67gscceq3D7jfz8fMBYYDY2Nrb0+KxZs2jZsmX1By6EqDcKiws5dDKeyy6oPcMDFSYorbVbeY8bkqbDhpx16+dcTJ8+/ZQxKDAWi23bti0jRoyo8LyS5Yqki08Icb4OpcdTbC+mXUhrV4dSqkEmnvrgt99+o127dq4OQwhRT+xNPQhA+5A2Lo3DWWVjUMkY3XdnpLVuWmURiQqVdOXZ7XYCAwOZPXv2KcdLXHbZZUycONFVYQoh6qCkrBRCfINo4hfs6lBKVTYGdQ8WE5Q4dyVdeyVmzJhR+rhst93XX39d7jUqOi6EEFZd3nEkw9sNqBXTy0tUNgb1Tg3GIYQQwoWCfBsT5NvY1WGcorIuPktbVgBorSdUTThCCCFqmsNezMl1nxHQfRjufoGuDqdUZV18ZfdtEkIIUQ/lx+8mddVivJq2xq/dha4Op1RlXXz/qslAhBBCuEbesb0AeDVr49pAyqisi+8Z4DGtdbb5uCIOrfV9VR+aEEKImpCfsBf3gCZ4+NeeGXxQeRdfH8DT6bGoYvfeey8JCQmlW5yHh4fzzDOVfReAgoIC1qxZU+kNvEIIcTbyj+3FO6K9q8M4TWVdfEPLeyyqTkkyio2NtbwSRFJSEt99950kKCFElSjOzaIoLZGA7rVniaMSVrfbQCnVFugElF0YzqG1Xl6lUTVQ+/btY9asWeTl5dGpUyceeughpk2bRuPGjdmzZw+PPPIIa9asYe3atfz888/s3LmTb7/9Fl9fX55++mn+97//cezYMQ4ePEiPHj247z7peRVCVC4/YR8A3hG1b2UaSwlKKXUP8DTGjbuFZYodgF8Vx1UrbN54lE3rD5/XNXr0bUX33i0s1T18+DCPPvooLVq0YPz48YCxeOzzzz/Pvn37iIuL44YbbiApKQmlFAsXLuTDDz/kjz/+4PXXXyckJIRu3boxe/ZsxowZIwlKCHFG+QnGBAnv8DrUxVfGPRgbEz6jtbZXYzwNWtOmTXn++efx8fEhNTUVgNDQUAIDAwkLC6Ow8K/vBvHx8XTq1AmALl268MorrxASEkJUVBQAQUFBNf8GhBB1Tv6xvXiGhOPu08jVoZzGaoKyAXENLTl1793CcuunKrz88ss8+OCDpbvkOhyO05YdsdlsOBwOwsPD2blzJwBbtmwhIiKitFwIIayyeXjid0HtnAdnNUG9AsxUSt1o7q4rqsGwYcO44YYbCAoKIjQ0lJSUlNPqhISEoLVm+/bt9O3bl6uuugp3d3deeOEFli5d6oKohRB1WdDAG7B51s4t/WwOx5nXg1VKRQNrgEZAInBKS0pr3bZaoqtmSqk2wIHvv/+eFi2MllLJlG/hOvI7EKLmHHxzI76tg2g28tzHoI4ePcrw4cMBorTWB6sqNqstqPeAg8BSIKeqXlwIIYTr2AuKKEzPI7BL+bt2u5rVBNUR6K613l2dwQghhKg5+SlGe8MrtHZOxLa6o+4GQFVnIEIIIWpWgZmgvENr3ww+sN6Ceh94Wym1BNhHmXuhtNavVnVgQgghqldBSg42Tzc8GtftLr6ZQBYwppwyByAJSggh6pj8lGy8mvjV2ttTLCUorXVUdQcihBCiZhWk5NCobYirw6hQZdttTNVav2v1QkopG/AvrfXbFur2BT7XWjc1n3sDmYDzPVa/aK3/ZpZPAGYB4cBq4FqtdZJZ1gp4C+gHJAEztNZfWo3b1eLi4liwYAFhYWFkZ2dz5513snr1ah588MFKz5s5cya33HJL6fR4IYQ4G0U5hRTnFNbaCRJQeQvqQqXUXcBrwHKtdUJ5lZRSTYHJwHTgu8pezExi04BnyxR1BVK11s3LOaczRgL6O7ARmIMx3X2YWWUp8CtwKTAA+EQp1UNrvb+yWGqT6dOnM3bsWLKysrj55pt5913L3wuEEOKcFKQYm6bXyQSltb5dKdUb+A/wglJqB7AdSMFY+igM6A5cAHyF0apZf4bXewwjkTwJPOR0vBewqYJzrgY+01r/BKCUuh9IU0p1MOPoDYw0V7hYpZRagZEEK2+CWLDrj5/ZsXHteV2jc++BdOzZ31LdvLw8AgICSrffuPTSSwkMDOTuu+/m3XffJSMjA4DXXnsNMLbrSEpKYty4cYwbN4533nmHb775Bj8/P+bMmVO68vmJEydo0qQJzz///Hm9FyFE/VE6gy+sds7ggzNMM9dab9RaX44xxXwBkA+0B6IwJk28BLTVWo+xkJwAXtNa98JoCTnrCTRVSm1RSh1XSv1PKRVplnUGdjjFlAMcwWh1dQYOa62zna61yyyrMxYsWEBsbCz//Oc/GTVqVOnx7Oxs3n//fYKDgxk/fjzvvPMOF1xwAdu2bQNg3LhxvP/++yxbtoyUlBR+/fVXlixZwq233spbb70FQGRkJIsWLSIjI4Pjx4+75P0JIWqf/JQc3Hw9cPfzPHNlF7E6SeIAVTBTT2t9rIKibOBn4HGMKewvAcuBvoA/p69ekcNfW3xUVnZeOvbsb7n1cz5Kuvjy8/OJjY2luLgYMJKLm5sbISEhvPHGG3z55ZccOHCgZEkRunTpgru7O+Hh4cTHx7N7925iY2NxOBxERhr5vWR187KroQshGraClGy8a/EMPjiLDQurk9b6TufnSqk7gWSlVEuM5OVb5hQ/jBacrZKyOsfb2xs/Pz8yMzMBcHMzGriffPIJffr0YezYsdx8882UrJ+otaZv374kJCTQvHlzevToUbp31I4dOygsLKzV//EJIVzD4XBQkJJDQOemrg6lUlZXkqhWSqnHlVLOq4N6mf/mYXTvKae6fkAr8/gOoJVSyjlJdcSpS7AuKOnimzJlCgMHDsTP79QGYO/evXnzzTeZNGkSOTk5nDhxAoBly5YxadIkJk2aRLNmzejSpQuTJ0/mnnvuoW3bOrl+rxCiBhRl5mMvKMY7rPZOkACLq5lXNaXUEOATrXWQ+fwTjKQ02azyBuCrtb5MKdUV+An4B8ZsvWeAflrrGPPc9Wb5/cDFwArgIq31NgtxtEFWM6915HcgRPXK3p/KsbgdtJjUDd/IwPO+XnWtZl4rWlAYs+7SgL0Yq6YXALEAWuutwHUY091TgGhgvNO5VwKdMO6BehOYZiU5CSFEQ5WfbC4S26R2t6Asj0EppS7EmA7uiTH2U+ps1+LTWv8IBDk9PwFMqaT+MmBZBWVHMO6REkIIYUHBiWw8Arxw96kV0xAqZCk6pdSDwBNAKsaKD85kLT4hhKhDClJy8KqlK5g7s5o+rwce1lo/VZ3BCCGEqF4Ou4OCEzkEtQ46c2UXszoG1QT4qDoDEUIIUf0K03JxFDtq9RJHJawmqI+pZIxInJu4uDhiYmKw2+0AFBcXExMTw7p1606ru27dOoYNG0ZsbGzpT0FBwWn1zvR6cXFxldZJTU1l8uTJjB07ln379lVYLzY29qxeWwhRO/y1i2796eLLBe5XSo0H9nDqquNorSdUdWANRaNGjdiyZQs9evRg06ZNeHtXvHHYFVdcwYwZM6o1np9++onhw4cTGRnJDz/8QLt27ar19YQQNasgJRts4BVSdo2D2sdqgvIDPqjOQGqjjO3Hydh6fuvXBXZtRmB0swrLBw0axJo1a+jRowdr1qxh8ODBABw5coT77ruPvLw8YmNjiYiIOO3cxMRE5s6dy7x58/jzzz/58ccf6d+/P8899xwA99xzDz179uTee+8lMTERd3d3Lr/8cm666SaeeOIJmjRpwrRp01iwYAHu7u4A9ObxaMkAACAASURBVOrVi5tuuomIiAgeeOCBM76/FStWsHjxYjw9PXnkkUfYvn37aQvUrl+//pSYOnfuzIwZM8jOzqZPnz7ceeedZ3gVIURVKUjJwTPIFzdPd1eHckZW1+L7V3UH0lB17dqVlStXApCcnEx4eDgA7777LjNnzqRz5868/vrrREREsHz5ctavN9bkjYqK4vHHHyc9PZ2CggK+++47LrnkEubMmcNbb72FzWZjxowZ3HbbbQQEBDB37lzmzp0LwMiRI1m1ahX9+/cnIiKiNDkBbNiwAV9fX/z9/fH39yc9PZ2goPIHU+12O++99x5LliwhKSmJJ554gpEjRxIZGcnzzz/PtGnTOH78OC+//PIpMd1zzz00a9aMxx9/nC+++KI6P14hRBn5KTl1YvwJzu4+qK7AvRg3yrphrBr+ktb6l2qKzeUCoytv/VQFm81GUFAQu3btolmzv17r0KFDdOzYEQ8PD26++WbWrVtXbhdf//79WbduHVpr7rnnHvbu3cuNN94IQHp6OvHx8ShlrBQVHR1NXl4ew4cP54EHHiA3N5eRI0eWXisnJ4ePP/6YJUuWcPvtt3PjjTcyffr00sVp7XY7ubm5NGpk9F2npqbSokULPDw8iIiIKF1DsOwCtWVj6tixI+3bt2fatGlER0fjcDhkzUAhaoDD7qAwPZcAFerqUCyxNElCKfV34A+M2XwfA/8DAoDVSqm/VV94DcOAAQOYM2dOafceQEREBFprHA4Hd999d4Xnjho1ikWLFtGhQwcAOnXqxFtvvcUbb7zBZZddRps2bdi+fTtgLC4LEBgYiM1mY/369Vx00UWl17Lb7aUrqU+dOpVNmzadsmOv1ppnnzX2mnQ4HAQHB3PkyBGKioqIj4/Hx8cH4LRkUzYmrTVhYWG88847HDlyhISEcvfCFEJUMZubjbChbWncI9zVoVhitQX1FPCk1vox54NKqYcwbuBdWdWBNSQDBgzg6aefplu3bqxda2yQeP311/PAAw9QUFDApEmTAE7p4gOYM2cOkZGRpKWl8be//a30vGuvvZbs7GyuvfZaOnXqhJeXF1OmTKFRo0a0bt0agMGDB7N+/Xo8Pf/aC8bf35/Ro0dz1VVX4enpybPPPsvbb7/NnDlzAOjYsSNJSUlMmTKFSy65BHd3d6ZMmcLkyZNxOBw8/fTTbN68+bT3VzamVq1aMWfOHJYsWUKrVq3KHV8TQlSPoJ515/83S4vFKqVyga5a671ljrcHtmit60aHZhkNebHYpUuX0qxZM4YOHerqUE7TUH4HQtQXrl4s9jBwYTnHe2Es0irqkA8++IDvv/+eQYMGuToUIYSokNUuvleA15RSLYDfzGMXAQ9ibH8h6pDJkyczefLkM1cUQggXsjrN/CWlVADGnksl0z+OAY9orV+uruCEEEI0XJanmZsLxT6llGoK5Gqty65qLoQQQlSZChOUUuom4G2tdZ75uGx56eOz3Q9KCCGEOJPKWlD3AB8Ceebjish+UOfo3nvvJSEhoXTWWnh4OFdeeSUxMTHndL2ZM2dyyy238O677/Lggw9WcbRCCFGzKkxQWuuo8h6XpZSSJQDO0TPPGPNLYmNjWbx4MfPnz6+S60pyEkLUB1Z31N0P9NZap5Y5HgFsAppWQ2wut337drZt23Ze1+jSpQvR0dGW67/zzju8+OKL9OrVi7vuuqvcxVhXr15NSkoKvXv35ujRo+zevZs333yz9BolCW/atGk0btyYPXv28Mgjj9CqVSvuuusuCgsLGTNmDFOmTOHJJ59kx44dBAYG8uyzz/Lkk0/i5+fHli1bGDNmDFOnTj2v9y+EEOeqsjGoy4EB5tM2wONKqZwy1dpXU1wN1oABA5gyZQpXXnkld9xxR7mLsbZs2ZIXXniBgQMHsnLlSj7++GM2bNhw2rXi4+N5/vnn2bdvH3FxcQwePJiYmBhuuukmvvjiC7Zu3UpeXh4ffPABn332GUuXLgVgyJAhzJw5k6uuukoSlBDCZSprQW0GbgdKuvAu5NR9oBxAFlBv/4JFR0efVeunKpTsv+Tn51fpYqw2m42oqCj8/Pzw9/cvd/PC0NBQAgMDSxdtHTx4MNu2bWPq1KkMGzYMd3d3unTpAhjvtSTJRUVF4eXlVboorBBCuEJlY1CHgGEASqmFwG1a64yaCqyhcl5o1Xkx1uPHj1e4GKuVawFs3LiRvn37cvvtt3PVVVdx//3388svxmL0W7duJSIigoMHD8rK4kKIWsHyflBKKQ+lVCRQsnmQDfAGemmtl1RXgA2Z1cVYrWrfvj233HIL//3vf+nTpw/du3dnxYoVTJo0iYCAAF544QUef/zxKnwHQghx7qwuFnsZsBAIKac4TWtdNzYXKaMhLxZbm8nvQIi6xdWLxc7G2FKjL5AJDAUmAYnALVUVjBBCCFHCaoLqADyutf4dY+PCRlrrjzCSU2U38QohhBDnxGqCygXs5uPdQHfz8e/ABVUdlBBCCGE1Qa0BHlZKBQEbgSuUUp7AEEBm9gkhhKhyVhPUXUAf4DrgA6ARRmJaCFTN+jxCCCGEE0sJSmu9V2vdCfiv1joHY7LEOOBirfXT1RlgfRcXF8fo0aOJjY1l/PjxxMXFVen1jx49ysyZM6v0mkIIURMqW+rI7wzHfyh5biYtcY6mT5/O2LFjKS4u5pZbbqFfv35ERES4OiwhhHCpym7UzcJYzsgK9zNX+YtSqi/wuda6qfncC3gZo1VWDDyntZ7tVH8CMAsIB1YD12qtk8yyVsBbQD8gCZihtf7ybOKpyIljG0mJP32Nu7MRGtmHJhG9LdV1d3fn0ksv5ZprruGpp54iJiamdOHXq6++GpvNxrRp01i5ciUJCQnk5eXx4osv8uGHH3Ls2DEOHjxIjx49uO+++3jvvff45JNPaNGiRekKFEIIUZdU1sU3FGOpIys/liilbEqp6zHuqfJyKnoMUEA7jLGuqUqpa8xzOmMkoGuBJsAeYKnTuUuBLWbZv4GlSqm2VmOqbYKCgkhKSjrteHJyMgsWLKBbt25cfPHFLFy4kNGjR/Prr78C0K1bN5YsWcJPP/2Ew+Hg888/56OPPuKKK66o6bcghBBVorK1+FZXw+s9BlwKPAk85HR8KkarKA1IU0o9C9wALAKuBj7TWv8EoJS636zTAWO5pd7ASK11AbBKKbUCmAac96ZITSJ6W279VJXk5GSaNGlS+rxkpY/Q0FB8fX1xd3fn999/5+effyYpKYlLL70UMBZ4BSPBpaWlERkZiZubG9HR0Xz11Vc1+h6EEKIqWN0PagOVdPdprftafL3XtNb/UUoNcbp2EEbX3Q6neruArubjzhhT20teK0cpdcQstwOHtdbZZc61Gk+tUlxczOeff86ECRNITU2loKCAI0eOAODmZjR2V69eTUhICDNmzGDWrFmlCazsIrMJCQkUFxeze/fumn8jQghRBSwlKODzcs5ri9EaetTqi2mtj5Vz2N/813miRQ7g51RedhKGc3llZXXCggULWL58OYWFhUycOJHu3btzxx138OmnnxIeHn5K3ejoaObPn88vv/xCYGAgoaGnL4Nos9mYNGkSEyZMoG3btri7n9UQoRCijsg9uBWbuyc+LTu6OpRqYXU188fKO66Uug64HHjhPGIoaf34Oh3zw5ikUVLuy6lKym2VlNUJY8eOZezYsacd//TTT095vnjxYgAiIiJYsWJFhdcrqTdmzBjGjBlThZEKIWqToqw0Ej96moCug+ttgrJ6o25FVgEjz+cC5rhTIsYkiRId+avLb4dzmTnNvZV5fAfQSinlW8G5QghRL6Wt+ZDjeXaywju7OpRqY3UMqrwus8YYEx0SqiCOxcAjSqktGF16dwMvmmUfAD+Z41a/Yqys/qfWercZ22bgKXPyxMXAP4CLqiAmIYSolQqSD5P0xyr+zA+g8+GDtOkxwNUhVQurY1AV3ROVB/yrCuL4DzAP2I7RqlsAvAagtd5qdiW+BkQC64DxTudeadZPAlKAaVrrbVUQkxBC1Eonvl/M7kJfsLlx4cDRrg6n2lhNUEPLPHcABcB2rXXm2b6o1vpHIMjpeR5ws/lTXv1lwLIKyo4Afz/bGIQQoi7KObCZhN2biC/wp9eQUQQG18n9Yi2xOkliNYBSyh9jPKjYOKxzqzE2IYQQThwOOye+W8Su4gB8G/nTLWYkhfmFeHp7ujq0amF1DMobeBWYwl8rQOQqpd4A7tJaF1dTfPXesmXLiIuLo6ioiJiYGJKSkrjllltKt6AvT8mCsuXN/hNC1F9ZW9dw+NhRUgv8GPz3K1j0/nKCGwVy1bX182+B1Vl8L2Hs/TQRYxyoJRCLMcV8VrVE1gBs376dn3/+mcWLF/Phhx+SnJzMjz/+6OqwhBC1kL0wn+Qf3md3sT8hzSI5merN5pYdiQ9v5erQqo3VMagJwJiS5YZMcUqpVOAj4L4qj6wW+OXoCX4+euK8rtG/RRMubtGk3LKVK1cyfvz40lUiHn74YQoLCwH45ptveP/998nOzmbq1Kn07NmTGTNm4O3tzbBhwwgNDeWbb75h7dq1PPnkk+cVoxCi9ju5/nP2p2aRXejDkOHjeW1bIvbAJozv18nVoVUbqwkqFygs5/jJKoylwUlNTaVp06alz/38/PDwMH4lKSkpLFy4kOzsbG677TZ69uyJj48PS5YsIS4ujq1bt5KUlMSLL75Y0eWFEPVEUVY6ST/Fsa/Yj9aqC+t3nyS1cRj9GrnRqnEjV4dXbawmqPuBN5VSNwC/aa3tSqkuGONSTznfJ1Wf9oa6uJLWT1UICwsjISGBdu3aAcbmgtnZxsIaAQEB3HvvvQQEBFBcbAzxtWzZsvTcTZs2ERQUVJrQhBD1V/raj9idDUV26NL7MubuS8GvIJdrRvVzdWjVyuoY1AsYKzSsBfKUUnnAZiAGeA7IdPoRFo0YMYKPP/4Yh8OBw+Fg/vz5rF+/HoA333yTefPmcdVVV2G324G/FowFiI2NpVu3bnz22WcuiV0IUTMKUo5ybON3HC70okvfIXy06ziFHl6MjwrFs56vs2n16/c/qzWKBqpz58706dOHSZMmUVxcTP/+/Rk61LjlLDo6miuvvJKQkJAKz58+fTpTp05lxIgR+PqWXZJQCFEfpK56j12Fvnh6++Ad0Y+9KZm0yEqhf7eerg6t2tlKtmuwwlzzrgNGy2vfudykW5sopdoAB77//vvSad07d+6kU6f6O+hYF8jvQAhD7qFtbHnncTbkNaLP3yawJCOEAkchd/doSds2rV0dXqmjR48yfPhwgCit9cGquq6lLj6llLtSag6QBvwJ/AEkK6VeU0rJIIgQQlQxh8NOyrfvsqvIn8DgUHYUtyTb05NuuSdqVXKqTlbHoJ7C2Nn2Gox7oFqajy/BWEdPCCFEFSrOOMG+o0fILHLQeuB4fsnPJygtnn8OjXF1aDXGauvnGuB6rfWXTsc+UkplYizUWq+SlMPhOGWHWlFzzqbLWYj6rNDDh30eYTQLj+DrVE88ivLo41VE8+bNXR1ajbHagvIH9pZzfD9Qr1Yq9PHx4cSJE/KH0gUcDgcnTpzAx8fH1aEI4VInU5NY9tosCvLzyI++jBSbg+YJuxg2dKCrQ6tRVltQGzBWGr+tzPFbgN+rNCIXa9GiBUePHiU5OdnVoTRIPj4+la5DKER9d/zIfj5f9CL24mL6Tr6DBftzaZyRRK+IMEJD61V74IysJqj7gB/NTQN/M4/1A9oA9WozEk9PT6KiolwdhhCiATqwcxPfLPkvfv6NueT623llWyoexcU0Pb6H/lNjXR1ejbPUxae13gj0BL7FmCARCnwGdNRa/1p94QkhRMOwbd0PfLn4JUKaRnDZv+9n8cEsjuYX0DRR072TIjg42NUh1jjLU8TNLdbvVko1AYq11unVF5YQQjQMDrudX1cu44/VX9KmY3f6XnE9L206zLHMPKIT4nFkp3DRRf9wdZguYTlBKaUeBv4PaGY+PwK8oLV+oZpiE0KIeq24qJDvP36b3Zt/o0vMUKIGj2XuhgPk5hUy+nA6B3P30KNHDwIDA10dqktY3bDwKWA68CSwHqNrMAZ4SCnlqbWeW30hCiFE/ZOfm8OX780nfv8uLho1Dq/OA5i7fi/exQ4u2X+CvcU7CAwMpF+/+r0gbGWstqCuB6aWuQ/qZ6XUXuAVQBKUEEKchfXff0rCoT2MnDid4yEdWPD7PprhzqDdCWx3aAKDGjNu3Dj8/PzOfLF6ymqC8gCOlHN8LxBQdeEIIUTDcOHAUXTuO5jVqQ6+2nYY5eFJr22H2cRuQpqEMG7cOBo1qr97PVlh9UbducCrSqnSDYmUUiHA08Cz1RGYEELUZ97+QSyLz+er/cfp5+tL7y0H2OTQhIaFMmHChAafnMB6C2oi0AnYb06OKAJaAV5AP6XUrSUVtdZNy7+EEEIIgGK7g1f/2M+25AwubRxI41+384dtH83DmzN27FhZTcVkNUHJTD0hhKgi/9t1lG3JGYwPDcZ9zSb+sO0nMjKSsWPH4uXl5erwag1LCUpr/W51ByKEEA3BmsMpfH8wmcFBAdjW/skm2wFatWzFP6/4J56enq4Or1aRvZyEEKKG6BOZvL/9MO0dbjT5ZRNbbIeJahPF5f+4HA8P+XNclnwiQghRA5Ky83h1w16C8+10PLifHbbDtG/fnssuuwx3d3dXh1crSYISQoizkJeTxepP38PDy4vhV15n6Zz0xAxe2LAXu8NBrxMJ7C0+RKdOnRg9ejRublYnUzc8kqCEEMKihEN7Wbn0NbIz0xl6xbVnrG8vLCbl18O8lZjCiUZuDCpI43D6brp27cqIESMkOZ1BhQlKKfW21Ytora19jRBCiDrIYbfz59qv+XXlMrz8AzjatRk/JGvaJvWo8JzCk/mk/HiAld7F7A/1pJcti8T9m+nRowfDhg2TXbstqKwF5bxChBcwBtiFsXlhAcb2G92BD6otOiGEcLHcrAy++9+bHNq9lcLmwfwUlsOluRcSc6Qdh7dtqvTcHRE+bAjypJ0tl+wdG+jduzeDBg2S5GRRhQlKaz2+5LFSagHGyuV3OtdRSj0JdKyKQJRS1wGvA/lOh28GlgAvA+OAYuA5rfVsp/MmALOAcGA1cK3WOqkqYhJCNGzx+3fxzdLXyMnOZG8LT9Ka25kUfSWjWg2gMD4HcFR47oG8Ar4+epwwRx4eO9bRr18/Lr74YklOZ8HqGNQkjBZTWe8ClX+FsK4nME9rPdP5oFJqNqCAdkBj4GulVLzWepFSqjPwFvB3YCMwB1gKDKuimIQQDZDdbmfDqhVsWLWCPC8bOzp4clGXQUzochmNfYytL7w7+JbWdzgcpOYVciwzl6OZuRzLzGNL0km87QUE7V7PwAH9iYmJcdXbqbOsJqhEjD/6e8ocvww4VEWx9AJeLOf4VIxWURqQppR6FrgBWARcDXymtf4JQCl1v1mng9a6bKxCCHFGWRnpLF/8PCePHuZ4sBtePaN5tPdEWgVFAkYyis/MZXdqFvGZecRn5XIsM5fcInvpNYJ9PPEvyMT/wBaGDxpAr169XPV26jSrCepx4C2l1DDgD8CGsR/UJcD4yk60QinlDnQDYpVSzwE5wJsYXX7hwA6n6ruArubjzhgtJwC01jnmWoFdOT2ZCiFEpX7fvIaf4xbjKCwipUMI/xg1lV4RXbHZbCRm5bEhIY0NCWkkZOUB4OfpTosAX2IiQogM8DV/fPBw2HnvvffoNag/3bt3d/G7qrusLnW0WCl1FKPlEmse3gIM0lqvq4I4wjASzbvAWIyFaT/FmJwBRsLC6XHJBin+ZcrKlgshxBml55xkyf9epGjXAfJ93Gh/+WXc3OcfpOcX8/X+42xISONIRi42oEOIP0OjW9K9aWOCfTwrHFO67jqZ3Hy+LN8HpbX+AfihOoLQWicCg50ObVJKzccYWwLwdSrzA7LMx9llysqWCyFEhYqKi/h885fs/OozArKK8GgTybgrb2VfJjyzbi8H0o3vv1FBfkzs1IJe4UEE+8hirjWlsvugnrF6Ea31vecThFIqGpigtX7E6bAXkIcx/qWAePN4R/7q8tthlpVcxw9jGxDnLkEhhDiFw+Hg92NbWLbqPZrqFHw8/PAbOZkTfpHMXn8UB9Ay0JexKoLe4cGE+Xm7OuQGqbIWVB+L16h4nqV16cBdZjfiW8CFwK3ALcB24BGl1BaMLr27+WsyxQfAT0qpIcCvwGzgT6317iqISQhRxex2O9kZaZxMTSYjNYmM1GTzcTK+jQKIGXkFYRGtqzWGEzlpvPrbQjK27MOf1sR3G0qmf3PseRDuUcSYDuH0CQ+mub/syeRqld0HNbTksVIqFvhKa51SHUForeOVUpcDzwDPAynAE1rrj5VSnwPzMBKVG7AAeM08b6t5/9RrQCSwjiqYtCGEOD95udmkJyeSlpxAWnKC8TglkZMnjmMvLi6tZ3NzI6BxEwJDQkk8vI8PX34M1eMiLhp1Jf6NQ6o8ruKiQlZu/JGU423IbT+QdDd3wny9GB0RTJ/wECIDfOQ+pVrE6hjUS0A/jMRRLbTWq4De5RzPw7hh9+YKzlsGLKuuuIQQ5bPb7WSmpZQmobTkRNKTE0hLSSQ3K6O0npu7O42bNCM4tDlRnXrQOKQpgSFhNA4Jw79xCG7mSt75uTn8/uPnbP7lW/Zu3cCFA0fRc9AlePmUHWa2rqiwgMTD+4g/oDl2QJN4eB8pwW2wt+5H78Y2/tZV0bqxnySlWspqgloHXAE8XY2xCCFqqfy8HA7u3ERqktkiSkkkPeU49uKi0jo+fv4Eh4UT1bE7QWHhBIeFExzWnMDgsNIkVBlvXz8u/vsEuvQbxm/fLGPjD5+zfcMaYkb8k869B1m6RmFBPgmH9nLswC7iD2iOHzmAvbgIm81GaHgrusQMJTJKEdm2I96+Mtm3trOaoOzALKXUQ8ABINe5UGvdt6oDE0K4VnFeHik7trPl1+/YF7+HIkcxbm7uBDYJIzi0OW1UN4LCmhMcFk5QaDi+jfyr5HUDg0P521U30L3/SH7+8kN+/GQRm3/+lov/PoE2Hbuf0topyMsl4dAe4g9o4vdrkuMPYrcXY3Nzo2lEG7r3H0lklCK8TQe8fSQh1TVn04KqivudhBC1UGFmJtn7D5C9/wBZ+/eTemAfhwvTSAnyxGGD4FwbHZq348I77sLzPLrczkazlm25YvpMDuz8k1+++h9fLHqRyLYd6dxnEMnHDnFsvyb52CEcDgdu7u40bRHFhYNGExGlCG/dHi/vmolTVB+rN+o+VvJYKRUIuGmt06stKiFEtXA4HBSkppG9f7+RjPbtJ/vAAfKTkgHI83IjJTKQlAA74E2bVorewy4nrIPChg2bW82O1dhsNtp27klr1Y3t61ez/vtP+PbDBbh7eNCsZTt6Dx1DRJSieat2eHrJVPD6xvKNukqp/wMeACLM50nAi1prGZcSohazFxYSH/cJGbs02fv2U3jypFFgs+ETHk7ABRfgO/gi9mcc4/DRPbi5u9G92wguaBuDW7Yb+VuyOPjdehx2B1H/F4ObR81vsufu7kG3i4ajLryI9OREmjRviYenZ43HIWqWpQSllLobeBh4CvgJYy2+/sBMpVSu1rq8RV6FELVAfsoJEr74Cq+QYIJ79aRRu7b4t43Cr00bko4fZfuqVWTujSfIqylDWvTFu9AXxyE7Jw8dAzcb3qF+NGrXBL/WQdjcXTvbzdvHj2Yt27o0BlFzrLagbgZu1FovcTr2s1LqEPAk5a9CLoSoBXzDm9N30dvYC4spSMkhLzGTlO1HyfzmR7yLfGljiwZ/sHm44R3UCO+m/ng3M/8N9cPmLtuSC9ewmqDCMHbSLet3oEXVhSOEqCrFeUXkHjlJzqF0co+cpCA1p3Tdl0J7PgXk4hHpTbOuUTSKDMYz2LfGx5iEqIzVBLUNY4WG2WWOT8TY/kII4WL2Ijt5xzLIOXyS3EPp5CVmgsNoGdkD7RxjL0mZB7H7O+gyeCg9e43B3UPGcUTtZTVB/Qf4Qil1EcaadwAXAaMxtscQQtQwh8NBflI2uYfSyTmcTu7RDBxFdrCBIwAyGqdyLHMPR47vwHHcTkizSHpdcSkduva1dNOrEK5mdZr5SqXUcGAGxn5QucBOoI/WenM1xieEcFKYnkfO4XRyzKRkzzVWcij2KSbDM4X47N0kZh+gOKUQbx8/mrdqR9/u/yC8zQVEtrkAm5uMJ4m6o7LtNkYDa7XW2QBa6zXAmpoKTIi6xuFwUJSZRV5CAnmJx8lNSKAoK4uW46/Es3Hjs76WPbeIwox8CtNzS7vtCk8aO7kWexSR7kgmIXsPKfnx5DtyCAprTrhqzwWtLya8VXuCw8IlIYk6rbIW1BdAkVJqI7DK/PlFa51fI5EJUQs5HA4K09LJS0wkNyGBvIRE4ycxkdyERIqzs/+qbLPh07wZ4ZdeclqCctgdFGUVUJSRR2FGPkWZ+ca/J/NLjzmK7KX17bZi0oqPk5R7iBP/396dB8lRnncc/3b3zOyujpWQ0CJxSCIYHhABxGEBwcYqCJQN2KYCNomxg8FOsEPsWDY+sMomBIhwSAgUiQvK5MIHCoQAMY4xCaCEw7hscxgQPC6JIpxC2AjQzt4zkz/eXtEaVou8u9Mzu/v7VE3NzNs9s8+809tP9zvd/Qy+QH/cS9eee7No2X4sX3wSCxfvQ8fM2Xl1g0guRktQuxLOdToaeBewCojN7EHeTFg/cffKjt9CZPKoVatUenoZKncz1F1maOtW+jZvTpPQS/S+tIm+TS9T7et780VxTHtXF+2LFrJg331pX7SQ9oW7UZq/G4WZc6j21xj4VT89G/8vJKDhhNQ9ANXtS6lV4goD9NJTeYOt/a/SV+mmt9pNb6Wb2qwai5a8gyWLl3PkktPZddFeJMlOb0rWigAADfdJREFUn2cvMimNVg9qC3B7esPMEuAwQsI6GjgH2NXM7nX3k3OIVeRt1Wo1Kr29VMrlkGS6uzO38o4fl7sZKvdAtfqW94wKBdoX7kbbwoXMXrac0i5dFGbPJWmfDVEb1d4hKj0DDJWH6H9pkJ6Ng1B9DnjuzbioUS1UGYj76B3ayta+X9M9sIW+akhCfZUybbNmpGUouuictxt7zT8oPJ+/GzNn/2ZDhCJTwU5vgrl7Ja14+xKwGXgW6AJ0WrdMqOrgIIOvvc5QucxQuRySTbnMULkn83i4vect84yUZABIitRKbdA5l2jWTGifCZ1dVOeXIC5SixMgplaLoRYTVSOKUTttUQeluINi1E5ta0T/VuhnCNgCwEC1l/5ttx76az1pWw/91V56q930V8tESczsubsyZ94C5szvYsm8pcyZt4DO+Qvo3GUBpTZVcBXJGjVBmdksYCXwu8AJwP6EzcJ7CKXZP+LuLzY4ximnVqlQHRhIb4PhfmiIWqVCrVKBapVatbrt+ZuPq1CtjDAtPJ97yEF07L77mON68Zlf8vzGJyfwk47Ny3f+NwOvvk4SF4njIlFc3PY4joskxXaSQhtJoYOkOId4fhtJV4lCVKQtLhJHBeKoQERCVIuJSUh2fluMKlVqcZVaArVClWqhSq1Yo7fUQ61YgxLUSul9EeJCTBK1MzOawaxoAVEcEUUxURwRxwmz5uxC57yuUJxPBy2I7LTRjuK7F1hB2ExcR7ic0d3uviGf0CaH7o1Ps+mHP6LS309tMCSdSv8AtcHBzOPtk1Gt0pif7Rae9F72OfePxvx6/9kDPPvIY+OOI44SkqhIISqSUKQQFd58vu2+MPJjiszd9UNEC3ZuRV6tVakwSKU2RIUhKtUhBuinUitTS2pEhYiolJCUCiTtRYodbRQ72inN7KBt1gzaZ8+kvXM2xRkdJG0F4mKsS/uItIjRNiuPAZ4H/pFwQMSP3X0wl6gmkZ7nnmfLQw8TF4vEpSJxqURcKpF0dFCcMyd9HtqjYomkrZQ+LmYel4iLBaIkIYrjcJ8kEIeVZRQnddNiiJO3TCvOHd/vFJasYM+575ignhlZVEqIizFxMSEuJUTpfVwKbWH6cFshtGfny9xHpYQoiVSuW2SKGi1B/RZhaO944NPATDO7D7iLkLAecvfaKK+fNGq1sX+MrpXH0rXy2AmMpnkWHL8Pnb/dNe73iZI4TTDbJ5aoGCuZiMhOG+0ovmeA69IbZnYIcBwhYX0NGDSzdcBd7v7NhkcqDVfsbKPYqaJvItIadnqw3d0fdfe/BT5ASFL/CpwIXN2g2HKjrXoRkdbztoc2mdmewJHAUen9YcAQ8AChFtS6BsYnIiLT1GhH8d1MSEiLgK3A/cD3gfOBn+sKEiIi0kij7UG1AVcS9pAecvcdnP0oIiIy8UY7SOKUPAMRERHJ0hmJIiLSkpSgRESkJSlBiYhIS1KCEhGRljQlKp6lV7m4BjgYeBo4x91/2tyoRERkPCb9HpSZlYDbCFe2mAtcCtxpZp1NDUxERMZl0icoQr2qortf6e6D7r4WeAI4o7lhiYjIeEyFBLUMqK+y9xRwUBNiERGRCTIVEtQsoKeurQeY0YRYRERkgkyFBFUGOuraZgDdTYhFREQmyFRIUOsBq2vbP20XEZFJaiocZn4PEJnZKuDvgNMIh5vf0tSoRERkXCb9HpS7DwDvIySmV4HVwKnu/kpTAxMRkXGZCntQuPvjwLuaHYeIiEycSb8HJSIiU5MSlIiItKQpMcQ3DgnApk2bmh2HiMiklVmHJhP5vtM9QS0COPPMM5sdh4jIVLAI2DhRbzbdE9RPgXcDLwGVJsciIjJZJYTkNKFVJKJarTaR7yciIjIhdJCEiIi0JCUoERFpSUpQIiLSkpSgRESkJSlBiYhIS1KCEhGRlqQEJSIiLUkJSkREWtK0vZKEmR0CXEMobvg0cI67T+hZ0L9BLCcAlwH7ApuBy939WjNrA7YCA5nZH3D3E9PXfRj4S8IZ3P8DfNzdNzcwznOAa4H+TPN5wA2EYpGnE67IcYW7r8m8Lu84z0zjzOoA7gLeTwv0qZmtAG539670eYkx9qGZLQb+ATiKsPx8xt3/s4GxdgFXAccDEfBD4M/cfUs6/Xrgw8BQ5m0OdvenGxnrCHGO+f8n5zi762YpAG3AHu7+Yt79Ocr6KPdldFomqLSjbwOuBI4lFDu808yWuPsbOceyF3AzcFYa0+HAj8zsGeDXwKvuvnCE1y0jfOHvA34GfANYCxzXwHAPA/7G3b9SF8sawIB9gDnAHWb2grtf34w43f27wHcz8R0K3Al8ETiIJvapmUXAJ4C/rpt0EWPvw7XAj4GTCXXRbjWz5e7+dINivQ54HdgbKALfBv4e+Eg6/TBC0dA7RnjbCY91lDjH813nFqe7z8rMUyBUCV/n7i+mzbn159usj1aS8zI6XYf4VgJFd7/S3QfdfS3wBHBGE2JZCnzP3W9x92q6F7cOOIawcDyyg9d9FPi+u9/n7n3ABcAxZrZvA2PdUTxnAZe6+xZ3f4bwD3huE+PcxsyKhGT15+7+KM3v04uATwOX1LWPqQ/NbD/gCODr7j7g7ncD/0FYEU54rGYWA1XgIncvu/trwLdIC4aaWQewPyP0cQNj3VGfjum7bkKcWV8mJP0LoSn9uZQdr49yX0ana4JaBjxZ1/YUYYsrV+5+r7t/avi5mc0jXMD2YcKWU5eZ/cLMXjazm8xsj3TWZcD6zPv0AM/RoM9gZglhOPRjZvaimW0ws6+Y2S6EXfr1mdmzfZlrnCM4D+gFvpk+b3afXuPuhxO2MgEws7mMvQ+XAc+6e3kHr53QWNOV1qnuviEz36mE5RVgOWEo6ltm9oqZPWRmp2Q+RyNifUucqbF+13nHCYCZ7Q58FfiUu1fT5lz7823WR7kvo9M1Qc0CeuraeoAZTYhlGzObQ9iy+Alh97oM3E8Y6zfCivaWdPa8P8MCwj/WvxCGdk4nbA1+JvO3R4qjaX2dDuV+kbD3NHxV5Kb2aWbYJmt4iGcsfdiwmHcQ63bM7HxCgvpy2jQbuJewt7A7cClwY/qbb0NiHSXOsX7Xecc5bBVwh7tn95Zy789hdeujn2fef6S/1ZD+nJa/QREW3I66thlA/Y+VuUl3g28jbIWcmW5Bfb5uns8Dr6TjxLl+BnffBLwn0/SImV1NGHOmLpZsHM3s6/cShqN+MNzg7i3TpxnDW5Zj6cNolGkNkw6dXk046OQ4d38KwN3vJPzeN+xmMzsb+ADweJ6xjuO7zr1P0xGKs4DtitM1qz/r10eZv5PrMjpd96DWE7aosvZn+93X3JjZsYStlFuB09MxXMzsL8zsgMyspfS+j7rPYGYzgMU06DOY2YFmdlFdcymNZRPb92e2L3ONs84HgRszwyUt1afD0qPfxtqH64HF6W8VI712wpnZbOC/gHcCK7Jb/Gb2fjM7q+4lw8tJrrGO47vOvU+B30nv78o2NqM/R1ofNWsZna57UPcAkZmtIhw2eRrh95VbRn1VA5jZPsDtwGp3v7pu8sHAEWY2fHTUVcAP3P0VM/secJ+ZrSQcHbMGeNjdf9mgUF8DvmBmzxOO1jkU+Czwp4QDTC40s18QdufPT2MFyDvOrKOAr9W1tVKfZn2bMfahmT0KXGpmFxBWdB8Ejm5grGsJG7fvTn9ryEqAq8zsScKw0BlpTJ9092dzjnXM33UT+vQo4MHsxlQq1/58m/VR7svotNyDcvcBwtDUacCrwGrCYZyvNCGc8wjjzGvMrDtz+wbhKJctwAbgGcL5HB8DcPfHgHMI53L9CjgQ+FCjgnT3FwjDCucCbxAORb3Y3f8N+DphuOEJQkXNm9O4co+zzlKgfty/Zfq0znj68DTgAML5JdcBn3D3xxsRpJkdDJwErAA2Z5bX59NYbyX8P91AWE6+AJzi7s/mHSvj+67zjBNGXlab0Z+jrY9yX0ZVUVdERFrStNyDEhGR1qcEJSIiLUkJSkREWpISlIiItCQlKBERaUlKUCIi0pKUoERyYGZr04t9zhth2ur0XJOlTQhNpGUpQYnk43OEK7esyTaa2d6EEzFXpyUMRCSlBCWSg/RiuxcAnzSzIzOTribU+qm/rIzItKcrSYjkxEJF1fsJF/t8J+HSUTcCh7r7+nSeswk1gfYg1CxbPVxJ1UK11YsJlWt3J1RcvgE4390rZvYdwtXbDyBUPf09d1+X2wcUmWDagxLJSVqT6o8JFzE9m1CR9JJMcjoZuIIw5Hcw4aK8t5jZivQtLgD+gHA9uX3T558FTsn8mY8SLuB5PPBggz+SSENN16uZizSFuz9uZlcA1xL2kC7LTP4qcJm735g+32BmRxDqgv0+8BjwcXf/33T6P5nZlwgVS29L29a7+3ca/TlE8qAEJZK/iwgVaC9298FM+zLgcDPLlggpktbNcfdbzex4M7sc2I+wl7WUUJJh2MZGBi6SJw3xieTM3XvTh711kwqEEvXLM7cDCbVzMLNLgJsI/7c3AScSyh9k1b+nyKSlPSiR1vEUsMTdNww3pHtTfcDlwJ8An3P369NpHYSqpVETYhVpOCUokdbxV8D1ZubA3cAJwIWE358gFNc8xcweAOYQhgo7gbYmxCrScBriE2kR7n4TsAr4EuF3p1XAuWnVYoA/JBy99xjw74RKsf8MHJ57sCI50HlQIiLSkrQHJSIiLUkJSkREWpISlIiItCQlKBERaUlKUCIi0pKUoEREpCUpQYmISEtSghIRkZb0/6gleO90zM4BAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "table1.plot()\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "# The function I found that best matches the data has the form\n", - "# a + b / (c - x)\n", - "\n", - "# This function is hard to explain physically; that is, it doesn't\n", - "# correspond to a growth model that makes sense in terms of human behavior.\n", - "\n", - "# And it implies that the population goes to infinity in 2040.\n", - "\n", - "xs = linspace(100, 1950)\n", - "ys = 110 + 200000 / (2040 - xs)\n", - "table1.plot()\n", - "plot(xs, ys, color='gray', label='model')\n", - "\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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zz33XJ5++mnWrFnD+eefz9KlS5k9ezYPPvhgv8dv374dj8fDOeec02ffLbfcEvz9V7/6FX/605944YUXSE1N5eGHH+ab3/wmL730EgBFRUWcf/75fPTRR2zatIkbb7yRiy++mMTERO6//35ef/118vPz+Z//+R8eeugh3n777UGfR0NDw4DnSacIIQSMgRJUwAPAbmAPsAX4PfDMqEY0RuXn5/PHP/6R2bNn8+qrr3LllVdyxhln8LOf/QzDMPoc39DQQHx8PBEREYNed8OGDXz9618nJycHl8vFt7/9bbZs2UJZWRlg9qRbt24dERERnHnmmaSkpHDw4EEcDgd2u53f/e537Nq1iyuvvDKsJHOy5wkhJo9RKUFprf8OJPR63AXcGviZtBwOR7/jfXw+H06nM/h42rRp3HPPPYCZgN555x0efvhhEhMTueaaa0LOTUlJoampie7u7j5JqrW1FafTicPhoLKyknvvvZcHHngguN9ut1NRUYHdbicmJiYkhoiICPx+PzExMbz00ks8++yzrFmzBpfLxfXXX8/atYOPEhjsPElSQggYO1V8p9SKeX2r9Xo7c2EWZy7MGnD/eUunct7SqQPuv2DlNC5YOe2E40pPT6eyspL584/2sPd6vVRWVgZXC/7Sl77EZz/7WW644QYApkyZwjXXXMOuXbvQWve55uLFi3G5XLz//vucf/75IfseeeQRDh48yEsvvURqaioPPPAAZ511VnB/YWEh06dPZ/v27QPG3NzcHGy/6u7u5h//+Ae33XYby5Ytw2azhcx/aBhGcEaIwc47tt1KCDE5jZUqPgFccsklPPXUUxQXFwPQ1NTE+vXrSUlJYcGCBQBcdNFFPPPMM7z77rt4PB48Hg+bNm3i/fff59Of/nSfazocDu68804eeOAB3nvvPbxeLx0dHbzwwgv88Y9/5NZbzULrFVdcwU9/+lOqqqrw+Xw899xzXHvttXR1dQ0ac0NDA1/72tfYvHkzERERpKWlYbFYiI+PJycnB4/Hw5tvvonP5+Oll16ivb39uOcJIQRM0hLUWHXrrbdis9lYu3Yt9fX1OJ1OVq5cyYsvvhisnvvyl7+My+Xi6aef5q677sIwDGbMmMEDDzzAmWee2e91v/jFLxIbG8uzzz7L3XffjWEYzJ07l+eff57ly5cDcPPNN+P1ern22mtpampi1qxZ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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "# And it doesn't do a particularly good job of predicting\n", - "# actual growth from 1940 to the present.\n", - "\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "\n", - "xs = linspace(1940, 2020)\n", - "ys = 110 + 200000 / (2040 - xs)\n", - "plot(xs, ys/1000, color='gray', label='model')\n", - "\n", - "decorate(xlim=[1950, 2016], xlabel='Year', \n", - " ylabel='World population (billions)',\n", - " title='Prehistoric population estimates')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap11soln.ipynb b/soln/chap11soln.ipynb deleted file mode 100644 index 11bb3039..00000000 --- a/soln/chap11soln.ipynb +++ /dev/null @@ -1,900 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 11\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SIR implementation\n", - "\n", - "We'll use a `State` object to represent the number (or fraction) of people in each compartment." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    S89
    I1
    R0
    \n", - "
    " - ], - "text/plain": [ - "S 89\n", - "I 1\n", - "R 0\n", - "dtype: int64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(S=89, I=1, R=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To convert from number of people to fractions, we divide through by the total." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    S0.988889
    I0.011111
    R0.000000
    \n", - "
    " - ], - "text/plain": [ - "S 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init /= sum(init)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates a `System` object with the given parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example with hypothetical values for `beta` and `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initS 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtyp...
    t00
    t_end98
    beta0.333333
    gamma0.25
    \n", - "
    " - ], - "text/plain": [ - "init S 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtyp...\n", - "t0 0\n", - "t_end 98\n", - "beta 0.333333\n", - "gamma 0.25\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function takes the state during the current time step and returns the state during the next time step." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run a single time step, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    S0.985226
    I0.011996
    R0.002778
    \n", - "
    " - ], - "text/plain": [ - "S 0.985226\n", - "I 0.011996\n", - "R 0.002778\n", - "dtype: float64" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = update_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run a simulation by calling the update function for each time step." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: State object for final state\n", - " \"\"\"\n", - " state = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the state of the system at `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    S0.520568
    I0.000666
    R0.478766
    \n", - "
    " - ], - "text/plain": [ - "S 0.520568\n", - "I 0.000666\n", - "R 0.478766\n", - "dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", - "\n", - "Hint: what is the change in `S` between the beginning and the end of the simulation?" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.3787177442414792" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "tc = 4 # time between contacts in days \n", - "tr = 5 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "s0 = system.init.S\n", - "\n", - "final = run_simulation(system, update_func)\n", - "s_end = final.S\n", - "s0 - s_end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using TimeSeries objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add three Series objects to the System: S, I, R\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " S = TimeSeries()\n", - " I = TimeSeries()\n", - " R = TimeSeries()\n", - "\n", - " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " S[t+1], I[t+1], R[t+1] = state\n", - " \n", - " return S, I, R" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what they look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap11-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(S, I, R)\n", - "savefig('figs/chap11-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a DataFrame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", - "\n", - "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it, and what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    SIR
    00.9888890.0111110.000000
    10.9852260.0119960.002778
    20.9812870.0129360.005777
    30.9770550.0139340.009011
    40.9725170.0149880.012494
    \n", - "
    " - ], - "text/plain": [ - " S I R\n", - "0 0.988889 0.011111 0.000000\n", - "1 0.985226 0.011996 0.002778\n", - "2 0.981287 0.012936 0.005777\n", - "3 0.977055 0.013934 0.009011\n", - "4 0.972517 0.014988 0.012494" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)\n", - "results.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can extract the results and plot them." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3hUVfrA8e/MZNJ7J5AQCOHQJRCI9C4iCtgLP8vau8vaUbBjW1wbirou6i6ugmUVFUERwYKAShcONZSEkN7rZOb3x51MCgEGTAPez/Pkmbnnnpn7zoh5c849xeRwOBBCCCHaGnNrByCEEEI0RhKUEEKINkkSlBBCiDZJEpQQQog2yaO1A2hqSikvYABwEKhu5XCEEEI0zgK0A9ZqrSsaq3DKJSiM5PRDawchhBDCLcOAHxs7cSomqIMA8+fPJzo6urVjEUII0YiMjAymTp0Kzt/ZjTkVE1Q1QHR0NB06dGjtWIQQQhzdEW/FyCAJIYQQbZIkKCGEEG1Sq3TxKaUGAl9orSOPcD4OeBs4E8gE7tBaf9WCIQohhGhlLdqCUkqZlFLXA0sBz6NU/QDYCIQBNwAfKKU6t0CIQggh2oiW7uJ7DLgFePJIFZRSXYFkYKbWulJr/R3wOXBdy4QohBCiLWjpBDVXa90f+PUodXoA+7TWJXXKtgG9mzUyIYQQbUqLJiitdbob1fyB0gZlpYBv00fUuNLyKvZlFGKrtrfUJYUQQjTQFudBlQA+Dcp8geKWCmDL7hwef3s1HhYTHSIDiIsOIL5doPMniPBgb0wmU0uFI4QQp6W2mKD+AOKUUj5a6zJnWTdneYuorLITFerLodxSUg8WknqwkJXr0lznP3zqHHy9rQBs2JFFkL8XsZH+WCwyal8IIZpKm0tQWmutlNoAPKWUehAYDEwGBrVUDEPOiGHIGTGUVdjYl1HI3owi9joTVVmFzZWcAF78YB3Z+WV4epiJjwmkS4dg4yc2mLioAElaQog25cCBAyfNKjttIkEppaYCb2it/Z1FFwJvYsyBygau01pvbum4fLw8UB1DUR1DGz1fZbPTNS4YD4uJjJxStu/LZ/u+fNf5qyf24KLRiQDkF1VQaasmIthHugeFOIVkZ2fz3HPP8cMPP1BWVkZkZCSTJk3i5ptvxsOjTfyKdXnuueeoqqrioYceIj09nYkTJ7Jy5UoKCgoYM2YMa9euJTAw8LDXXXnllYwZM4ZrrrmmReNtlW9Pa/09EFzneD4wv87xfmBCy0d2fKweZh68eiAAxaWV7EorYNeBfHbsN34SY10fkW/W7OW9r7YSEuCF6hhC9/hQuseHkdAhCE+rpbU+ghDiT/rb3/5GXFwcS5YsITAwkB07dnDHHXdQVVXFtGnTWju8enJzcwkICAAgJiaGdevWAVBQUNCaYR2R9D81EX9fT85IjOCCUYncf9UA/vnQOPp0CXedt1U78PexkldUwS+bM5j3xR/c9+oPXPrQV8x6Z00rRi6E+DM2bNjA+PHjXS2PxMREpk+fjo+PD6tXryY5Oble/dGjR/Ptt98C8PHHHzN27FgGDBjAhRdeyMqVK131li9fzqRJk0hKSmLKlCmsXbsWgOrqaubOncuYMWNISUnhrrvuIjc3F4DVq1czfvx4Zs2aRb9+/Rg1ahQff/wxAPPmzWPRokX897//5eabb+bAgQMopSgsLHRd87333mP48OGMHj2af/7zn41+3oqKCp5++mlGjBjBkCFDmDlzJqWlDQdeN4221f48xdTtyrv8LMVl47qSllWM3pvH1tRctqXmsu9QEeY69UrKqpj++k/06BRKr4RwenUOI8jfqzXCF6LNOO/uz4547raLzuDsQfEAfL0qlTkfbThi3UWzJ7ue//Uf37PrQMERz7trwoQJ3HPPPUyaNImUlBT69evH8OHDGT58OKtXrz7i63Jzc5kxYwafffYZiYmJLFy4kCeffJIlS5awc+dO7rzzTv7xj38wevRoPv/8c2699VZWrlzJBx98wOeff868efOIjIzk2WefZdq0abz77rsApKamMnjwYFatWsXGjRu5/vrr6dy5M3/5y1/QWhMQEMBDDz3EgQMHDotpx44dLF68mLS0NK655hpiY2MZP358vTrPP/88W7du5eOPP8bLy4sHHniAJ598klmzZh33d3cskqBakMlkDFvvEBnAmAFxABSXVVFaVuWqszU1l91pBexOK+CLH/cAEN8ukN5dwunTJZwkFYmXdAkK0WbMmjWLzz77jK+//ppPPvmEkpISBg4cyIwZM476Ok9PTzw8PPjoo48499xzueCCC7joooswmUwsXryYQYMGMXbsWACmTJlCx44dsVgsLFiwgDvuuIO4OON3yL333ktycjKp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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "tc = 4 # time between contacts in days \n", - "tr = 5 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)\n", - "\n", - "plot_results(results.S, results.I, results.R)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap12soln.ipynb b/soln/chap12soln.ipynb deleted file mode 100644 index 24817afc..00000000 --- a/soln/chap12soln.ipynb +++ /dev/null @@ -1,1634 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 12\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code\n", - "\n", - "Here's the code from the previous notebook that we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example.|" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.333 0.25 0.46716293183605073\n" - ] - } - ], - "source": [ - "beta = 0.333\n", - "gamma = 0.25\n", - "system = make_system(beta, gamma)\n", - "\n", - "results = run_simulation(system, update_func)\n", - "print(beta, gamma, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", - "\n", - "1. The fraction of students who are sick at the peak of the outbreak.\n", - "\n", - "2. The day the outbreak peaks.\n", - "\n", - "3. The fraction of students who are sick at the end of the semester.\n", - "\n", - "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", - "\n", - "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", - "\n", - " I.max()\n", - "\n", - "And the index of the largest value like this:\n", - "\n", - " I.idxmax()\n", - "\n", - "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.043536202687592354" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "def fraction_sick_at_peak(results):\n", - " return results.I.max()\n", - "\n", - "fraction_sick_at_peak(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "30" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "def time_of_peak(results):\n", - " return results.I.idxmax()\n", - "\n", - "time_of_peak(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0006741943156034474" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "def sick_at_end(results):\n", - " return get_last_value(results.I)\n", - "\n", - "sick_at_end(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What if?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def add_immunization(system, fraction):\n", - " \"\"\"Immunize a fraction of the population.\n", - " \n", - " Moves the given fraction from S to R.\n", - " \n", - " system: System object\n", - " fraction: number from 0 to 1\n", - " \"\"\"\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start again with the system we used in the previous sections." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initS 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtyp...
    t00
    t_end98
    beta0.333333
    gamma0.25
    \n", - "
    " - ], - "text/plain": [ - "init S 0.988889\n", - "I 0.011111\n", - "R 0.000000\n", - "dtyp...\n", - "t0 0\n", - "t_end 98\n", - "beta 0.333333\n", - "gamma 0.25\n", - "dtype: object" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run the model without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.468320811028781" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = run_simulation(system, update_func)\n", - "calc_total_infected(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now with 10% immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.30650802853979753" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", - "results2 = run_simulation(system2, update_func)\n", - "calc_total_infected(results2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "10% immunization leads to a drop in infections of 16 percentage points.\n", - "\n", - "Here's what the time series looks like for S, with and without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap12-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.S, '-', label='No immunization')\n", - "plot(results2.S, '--', label='10% immunization')\n", - "\n", - "decorate(xlabel='Time (days)',\n", - " ylabel='Fraction susceptible')\n", - "\n", - "savefig('figs/chap12-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep through a range of values for the fraction of the population who are immunized." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 0.468320811028781\n", - "0.1 0.30650802853979753\n", - "0.2 0.16136545700638427\n", - "0.30000000000000004 0.0728155898425179\n", - "0.4 0.03552021675299155\n", - "0.5 0.019688715782459176\n", - "0.6000000000000001 0.011622057998337987\n", - "0.7000000000000001 0.006838737800619332\n", - "0.8 0.003696496253713877\n", - "0.9 0.0014815326722661948\n", - "1.0 -0.00016121210941239666\n" - ] - } - ], - "source": [ - "immunize_array = linspace(0, 1, 11)\n", - "for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " print(fraction, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function does the same thing and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_immunity(immunize_array):\n", - " \"\"\"Sweeps a range of values for immunity.\n", - " \n", - " immunize_array: array of fraction immunized\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " sweep[fraction] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0.000.468321
    0.050.387288
    0.100.306508
    0.150.229234
    0.200.161365
    0.250.108791
    0.300.072816
    0.350.049938
    0.400.035520
    0.450.026121
    0.500.019689
    0.550.015072
    0.600.011622
    0.650.008956
    0.700.006839
    0.750.005119
    0.800.003696
    0.850.002500
    0.900.001482
    0.950.000603
    1.00-0.000161
    \n", - "
    " - ], - "text/plain": [ - "0.00 0.468321\n", - "0.05 0.387288\n", - "0.10 0.306508\n", - "0.15 0.229234\n", - "0.20 0.161365\n", - "0.25 0.108791\n", - "0.30 0.072816\n", - "0.35 0.049938\n", - "0.40 0.035520\n", - "0.45 0.026121\n", - "0.50 0.019689\n", - "0.55 0.015072\n", - "0.60 0.011622\n", - "0.65 0.008956\n", - "0.70 0.006839\n", - "0.75 0.005119\n", - "0.80 0.003696\n", - "0.85 0.002500\n", - "0.90 0.001482\n", - "0.95 0.000603\n", - "1.00 -0.000161\n", - "dtype: float64" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap12-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Fraction immunized',\n", - " ylabel='Total fraction infected',\n", - " title='Fraction infected vs. immunization rate',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If 40% of the population is immunized, less than 4% of the population gets sick." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Logistic function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0., 60., 120., 180., 240., 300., 360., 420., 480.,\n", - " 540., 600., 660., 720., 780., 840., 900., 960., 1020.,\n", - " 1080., 1140., 1200.])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", - "\n", - "`M` is chosen so the transition happens around \\$500.\n", - "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", - "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "plot(spending, percent_reduction)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hand washing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can model the effect of a hand-washing campaign by modifying `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " \"\"\"Modifies system to model the effect of hand washing.\n", - " \n", - " system: System object\n", - " spending: campaign spending in USD\n", - " \"\"\"\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start with the same values of `beta` and `gamma` we've been using." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.3333333333333333, 0.25)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "beta, gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep different levels of campaign spending." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 0.3328871432717143 0.4667702312363652\n", - "100.0 0.3321342526691939 0.46414165040064037\n", - "200.0 0.33017160845482885 0.4572170063132055\n", - "300.0 0.32538647186519215 0.4398872029120663\n", - "400.0 0.3154039052420003 0.40163064627138245\n", - "500.0 0.3 0.3370342594898199\n", - "600.0 0.28459609475799963 0.26731703056804546\n", - "700.0 0.2746135281348078 0.22184699045990752\n", - "800.0 0.26982839154517113 0.20079159841614402\n", - "900.0 0.2678657473308061 0.1923921833925878\n", - "1000.0 0.26711285672828566 0.18921320781833872\n", - "1100.0 0.26683150821044227 0.18803175228016467\n", - "1200.0 0.26672740341296003 0.1875955039953746\n" - ] - } - ], - "source": [ - "spending_array = linspace(0, 1200, 13)\n", - "\n", - "for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " print(spending, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " \"\"\"Run simulations with a range of spending.\n", - " \n", - " spending_array: array of dollars from 0 to 1200\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0.0000000.466770
    63.1578950.465418
    126.3157890.462905
    189.4736840.458291
    252.6315790.449980
    315.7894740.435540
    378.9473680.411960
    442.1052630.377183
    505.2631580.333171
    568.4210530.287633
    631.5789470.249745
    694.7368420.223529
    757.8947370.207480
    821.0526320.198306
    884.2105260.193244
    947.3684210.190500
    1010.5263160.189027
    1073.6842110.188239
    1136.8421050.187819
    1200.0000000.187596
    \n", - "
    " - ], - "text/plain": [ - "0.000000 0.466770\n", - "63.157895 0.465418\n", - "126.315789 0.462905\n", - "189.473684 0.458291\n", - "252.631579 0.449980\n", - "315.789474 0.435540\n", - "378.947368 0.411960\n", - "442.105263 0.377183\n", - "505.263158 0.333171\n", - "568.421053 0.287633\n", - "631.578947 0.249745\n", - "694.736842 0.223529\n", - "757.894737 0.207480\n", - "821.052632 0.198306\n", - "884.210526 0.193244\n", - "947.368421 0.190500\n", - "1010.526316 0.189027\n", - "1073.684211 0.188239\n", - "1136.842105 0.187819\n", - "1200.000000 0.187596\n", - "dtype: float64" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap12-fig03.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig03.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's put it all together to make some public health spending decisions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)\n", - "dose_array = linrange(max_doses, endpoint=True)\n", - "max_doses" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", - "\n", - "For each scenario, we compute the fraction of students who get sick." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 0.9888888888888889 0.26672740341296003 0.1875955039953746\n", - "1 0.9777777777777779 0.26683150821044227 0.17458071882622528\n", - "2 0.9666666666666667 0.26711285672828566 0.16290983834857686\n", - "3 0.9555555555555556 0.2678657473308061 0.15350834947768177\n", - "4 0.9444444444444445 0.26982839154517113 0.1485650923152827\n", - "5 0.9333333333333333 0.2746135281348078 0.15294595061102179\n", - "6 0.9222222222222223 0.28459609475799963 0.1749644150235239\n", - "7 0.9111111111111112 0.3 0.21734316168444845\n", - "8 0.9 0.3154039052420003 0.2590710444883414\n", - "9 0.888888888888889 0.32538647186519215 0.27840288410342784\n", - "10 0.8777777777777778 0.33017160845482885 0.2779145346228302\n", - "11 0.8666666666666667 0.3321342526691939 0.2673574966927026\n", - "12 0.8555555555555556 0.3328871432717143 0.25279694563572175\n" - ] - } - ], - "source": [ - "for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " print(doses, system.init.S, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function wraps that loop and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " \"\"\"Runs simulations with different doses and campaign spending.\n", - " \n", - " dose_array: range of values for number of vaccinations\n", - " \n", - " return: Sweep object with total number of infections \n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compute the number of infected students for each possible allocation of the budget." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    00.187596
    10.174581
    20.162910
    30.153508
    40.148565
    50.152946
    60.174964
    70.217343
    80.259071
    90.278403
    100.277915
    110.267357
    120.252797
    \n", - "
    " - ], - "text/plain": [ - "0 0.187596\n", - "1 0.174581\n", - "2 0.162910\n", - "3 0.153508\n", - "4 0.148565\n", - "5 0.152946\n", - "6 0.174964\n", - "7 0.217343\n", - "8 0.259071\n", - "9 0.278403\n", - "10 0.277915\n", - "11 0.267357\n", - "12 0.252797\n", - "dtype: float64" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "infected_sweep = sweep_doses(dose_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap12-fig04.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig04.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "\"\"\"There is no unique best answer to this question,\n", - "but one simple option is to model quarantine as an\n", - "effective reduction in gamma, on the assumption that\n", - "quarantine reduces the number of infectious contacts\n", - "per infected student.\n", - "\n", - "Another option would be to add a fourth compartment\n", - "to the model to track the fraction of the population\n", - "in quarantine at each point in time. This approach\n", - "would be more complex, and it is not obvious that it\n", - "is substantially better.\n", - "\n", - "The following function could be used, like \n", - "add_immunization and add_hand_washing, to adjust the\n", - "parameters in order to model various interventions.\n", - "\n", - "In this example, `high` is the highest duration of\n", - "the infection period, with no quarantine. `low` is\n", - "the lowest duration, on the assumption that it takes\n", - "some time to identify infectious students.\n", - "\n", - "`fraction` is the fraction of infected students who \n", - "are quarantined as soon as they are identified.\n", - "\"\"\"\n", - "\n", - "def add_quarantine(system, fraction):\n", - " \"\"\"Model the effect of quarantine by adjusting gamma.\n", - " \n", - " system: System object\n", - " fraction: fraction of students quarantined\n", - " \"\"\"\n", - " # `low` represents the number of days a student \n", - " # is infectious if quarantined.\n", - " # `high` is the number of days they are infectious\n", - " # if not quarantined\n", - " low = 1\n", - " high = 4\n", - " tr = high - fraction * (high-low)\n", - " system.gamma = 1 / tr" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap13ode.ipynb b/soln/chap13ode.ipynb deleted file mode 100644 index e8bc0731..00000000 --- a/soln/chap13ode.ipynb +++ /dev/null @@ -1,302 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 13\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a slope function for the SIR model and test it with `run_ode_solver`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " dSdt = -infected\n", - " dIdt = infected - recovered\n", - " dRdt = recovered\n", - " \n", - " return dSdt, dIdt, dRdt" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.003658888888888889, 0.0008811111111111112, 0.002777777777777778)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(0.333, 0.25)\n", - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    solNone
    t_events[]
    nfev212
    njev0
    nlu0
    status0
    messageThe solver successfully reached the end of the...
    successTrue
    \n", - "
    " - ], - "text/plain": [ - "sol None\n", - "t_events []\n", - "nfev 212\n", - "njev 0\n", - "nlu 0\n", - "status 0\n", - "message The solver successfully reached the end of the...\n", - "success True\n", - "dtype: object" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, max_step=3)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tUYp1Ro6ryZ03qVALbABeBz42Wl+bWIYuWxuEUtmF4a3nZumyTZdw+/+JqU8xKm9dex9Htu6lse2ruWtY+9HHd989O3w8fereu7Fgk2HtoSP7zq+N+r4y/tf7/O9T4ff7+fFF19k//79zJ07F4Ann3ySF154gccff5zXXnuNjIwMrr/emkzau3cv3/zmN/nmN7/J22+/zec+9zmuu+46Ojo6uOOOO9i7dy9/+tOf2LBhAx6PhxtvvBGbzcaKFStYt25d+HPXrVvHZZddRmJiIvfddx87duzgueee469//St1dXXcdddd4XO3bdvGddddx8svv4xSiu9973u0tbWxfv16nn32Wd58801++ctfAvDb3/6WP//5zzz77LOsX7+enTt3ntX353TFfKGuUupa4BYgP/S8BnhQa31vrO+htd4BLOylfS3WtU9dz/8FXBzr+4rhr6swYmFuMq+8dZSj1daIqqGlk9+/spdZKoe5U3Kx22VtSowsn/70p7Hb7Xi9Xvx+P/Pnz+fnP/85559vbVB+5pln+MY3vkFRUREAN954I7Nnz+bQoUO89NJLzJ8/n2XLlgFWKY5x48bh9/tZv349a9euJSsrC4Dbb7+dhQsXUl1dzapVq7jyyitpbW0lMTGRv/zlL9x9993hUvBPPvlk+HU33HADH/nIR/j+978PQHp6enjqsba2lo0bN/LGG2+QlJREUlISX/va17jlllv42te+xosvvshnPvOZcN//4z/+g1dffXWwvrUxX6j7HeB2rK3fr2Ndn3QRcJNSqkNr/eDAdVGMJskJLlZcPJ6dB+p44/0KfP4gpmny9u5qDlU0sXROETkZvW3sFGJ4euqpp5g8eTI1NTXccMMNuN1uFixYED5eUVHBrbfeyh133BFu616avWeJ97KyMmpqavD5fOTn54fbs7OzcblcVFZWMnPmTJRS/P3vf2fs2LEEg0EuvPDCU5aCB6uib/e+AVx++eXhNtM08fl8eDweamtrycvLCx8b7BJGsY6gvgZ8VWvdfR3oDaXUYawLeCVAiZgZhsG0CVkU5iaz8e2jlNdYGznrmjt5f18ty+YWDXEPxXAze+x0Zo+d3ufx+YUXML/wgj6PLyqex6LieX0eXzphIUsnRE3unJacnBx+9rOfsXLlSu65555wQMrJyeGOO+7g4otPTArt2bOH4uJi3n33XbZv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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap13soln.ipynb b/soln/chap13soln.ipynb deleted file mode 100644 index 0e09644f..00000000 --- a/soln/chap13soln.ipynb +++ /dev/null @@ -1,963 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 13\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " beta, gamma = system.beta, system.gamma\n", - " s, i, r = state\n", - "\n", - " infected = beta * i * s \n", - " recovered = gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a range of values for `beta`, with constant `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.2" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma = 0.2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the simulation once for each value of `beta` and print total infections." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 0.010756340768063644\n", - "0.2 0.11898421353185373\n", - "0.3 0.5890954199973404\n", - "0.4 0.8013385277185551\n", - "0.5 0.8965769637207062\n", - "0.6 0.942929291399791\n", - "0.7 0.966299311298026\n", - "0.8 0.9781518959989762\n", - "0.9 0.9840568957948106\n", - "1.0 0.9868823507202488\n", - "1.1 0.988148177093735\n" - ] - } - ], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wrap that loop in a function and return a `SweepSeries` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0.10.010756
    0.20.118984
    0.30.589095
    0.40.801339
    0.50.896577
    0.60.942929
    0.70.966299
    0.80.978152
    0.90.984057
    1.00.986882
    1.10.988148
    \n", - "
    " - ], - "text/plain": [ - "0.1 0.010756\n", - "0.2 0.118984\n", - "0.3 0.589095\n", - "0.4 0.801339\n", - "0.5 0.896577\n", - "0.6 0.942929\n", - "0.7 0.966299\n", - "0.8 0.978152\n", - "0.9 0.984057\n", - "1.0 0.986882\n", - "1.1 0.988148\n", - "dtype: float64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap13-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "label = 'gamma = ' + str(gamma)\n", - "plot(infected_sweep, label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap13-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the same array of values for `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "beta_array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now an array of values for `gamma`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.2, 0.4, 0.6, 0.8]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gamma_array = [0.2, 0.4, 0.6, 0.8]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each value of `gamma`, sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap13-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "for gamma in gamma_array:\n", - " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(infected_sweep, label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " loc='upper left')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0.10.002736
    0.20.007235
    0.30.015929
    0.40.038603
    0.50.132438
    0.60.346765
    0.70.530585
    0.80.661553
    0.90.754595
    1.00.821534
    1.10.870219
    \n", - "
    " - ], - "text/plain": [ - "0.1 0.002736\n", - "0.2 0.007235\n", - "0.3 0.015929\n", - "0.4 0.038603\n", - "0.5 0.132438\n", - "0.6 0.346765\n", - "0.7 0.530585\n", - "0.8 0.661553\n", - "0.9 0.754595\n", - "1.0 0.821534\n", - "1.1 0.870219\n", - "dtype: float64" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Sweep beta with fixed gamma\n", - "gamma = 1/2\n", - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.62548698])" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Interpolating by eye, we can see that the infection rate passes through 0.4\n", - "# when beta is between 0.6 and 0.7\n", - "# We can use the `crossings` function to interpolate more precisely\n", - "# (although we don't know about it yet :)\n", - "beta_estimate = crossings(infected_sweep, 0.4)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1.59875429])" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Time between contacts is 1/beta\n", - "time_between_contacts = 1/beta_estimate" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SweepFrame\n", - "\n", - "The following sweeps two parameters and stores the results in a `SweepFrame`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the `SweepFrame` look like." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    0.20.40.60.8
    0.10.0107560.0036420.0021910.001567
    0.20.1189840.0107630.0054470.003644
    0.30.5890950.0301850.0107710.006526
    0.40.8013390.1315630.0209170.010780
    0.50.8965770.3964090.0461400.017640
    \n", - "
    " - ], - "text/plain": [ - " 0.2 0.4 0.6 0.8\n", - "0.1 0.010756 0.003642 0.002191 0.001567\n", - "0.2 0.118984 0.010763 0.005447 0.003644\n", - "0.3 0.589095 0.030185 0.010771 0.006526\n", - "0.4 0.801339 0.131563 0.020917 0.010780\n", - "0.5 0.896577 0.396409 0.046140 0.017640" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "for gamma in gamma_array:\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(frame[gamma], label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " title='',\n", - " loc='upper left')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also plot one line for each value of `beta`, although there are a lot of them." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap13-fig03.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "\n", - "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", - " label = 'beta = ' + str(beta)\n", - " plot(frame.row[beta], label=label)\n", - " \n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig03.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", - "\n", - "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap13-fig04.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "contour(frame)\n", - "\n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')\n", - "\n", - "savefig('figs/chap13-fig04.pdf')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap14soln.ipynb b/soln/chap14soln.ipynb deleted file mode 100644 index c284087c..00000000 --- a/soln/chap14soln.ipynb +++ /dev/null @@ -1,763 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 14\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Contact number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    0.20.40.60.8
    0.10.0107560.0036420.0021910.001567
    0.20.1189840.0107630.0054470.003644
    0.30.5890950.0301850.0107710.006526
    0.40.8013390.1315630.0209170.010780
    0.50.8965770.3964090.0461400.017640
    \n", - "
    " - ], - "text/plain": [ - " 0.2 0.4 0.6 0.8\n", - "0.1 0.010756 0.003642 0.002191 0.001567\n", - "0.2 0.118984 0.010763 0.005447 0.003644\n", - "0.3 0.589095 0.030185 0.010771 0.006526\n", - "0.4 0.801339 0.131563 0.020917 0.010780\n", - "0.5 0.896577 0.396409 0.046140 0.017640" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(11, 4)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frame.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 0.2 0.010756340768063644\n", - "0.2 0.2 0.11898421353185373\n", - "0.3 0.2 0.5890954199973404\n", - "0.4 0.2 0.8013385277185551\n", - "0.5 0.2 0.8965769637207062\n", - "0.6 0.2 0.942929291399791\n", - "0.7 0.2 0.966299311298026\n", - "0.8 0.2 0.9781518959989762\n", - "0.9 0.2 0.9840568957948106\n", - "1.0 0.2 0.9868823507202488\n", - "1.1 0.2 0.988148177093735\n", - "0.1 0.4 0.0036416926514175607\n", - "0.2 0.4 0.010763463373360094\n", - "0.3 0.4 0.030184952469116566\n", - "0.4 0.4 0.131562924303259\n", - "0.5 0.4 0.3964094037932606\n", - "0.6 0.4 0.5979016626615987\n", - "0.7 0.4 0.7284704154876106\n", - "0.8 0.4 0.8144604459153759\n", - "0.9 0.4 0.8722697237137128\n", - "1.0 0.4 0.9116692168795855\n", - "1.1 0.4 0.9386802509510287\n", - "0.1 0.6 0.002190722188881611\n", - "0.2 0.6 0.005446688837466351\n", - "0.3 0.6 0.010771139974975585\n", - "0.4 0.6 0.020916599304195316\n", - "0.5 0.6 0.04614035896610047\n", - "0.6 0.6 0.13288938996079536\n", - "0.7 0.6 0.3118432512847451\n", - "0.8 0.6 0.47832565854255393\n", - "0.9 0.6 0.605687582114665\n", - "1.0 0.6 0.7014254793376209\n", - "1.1 0.6 0.7738176405451065\n", - "0.1 0.8 0.0015665254038139675\n", - "0.2 0.8 0.003643953969662994\n", - "0.3 0.8 0.006526163529085194\n", - "0.4 0.8 0.010779807499500693\n", - "0.5 0.8 0.017639902596349066\n", - "0.6 0.8 0.030291868201986594\n", - "0.7 0.8 0.05882382948158804\n", - "0.8 0.8 0.13358889291095588\n", - "0.9 0.8 0.2668895539427739\n", - "1.0 0.8 0.40375121210421994\n", - "1.1 0.8 0.519583469821867\n" - ] - } - ], - "source": [ - "for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_sweep_frame(frame):\n", - " \"\"\"Plot the values from a SweepFrame.\n", - " \n", - " For each (beta, gamma), compute the contact number,\n", - " beta/gamma\n", - " \n", - " frame: SweepFrame with one row per beta, one column per gamma\n", - " \"\"\"\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta/gamma, frac_infected, 'ro')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap14-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_sweep_frame(frame)\n", - "\n", - "decorate(xlabel='Contact number (beta/gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", - "\n", - "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "s_inf_array = linspace(0.0001, 0.9999, 101);" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "c_array = log(s_inf_array) / (s_inf_array - 1);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`total_infected` is the change in $s$ from the beginning to the end." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "frac_infected = 1 - s_inf_array\n", - "frac_infected_series = Series(frac_infected, index=c_array);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot the analytic results and compare them to the simulations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap14-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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OWz0W096/iSS22644QZGjx7NkiVLOuR811xzDTfddNMeH//kk09yzjnndEgsyVCCyoCKefNpqq5O+F5j1frWARJ91L0nkrNqa2t59tlnOfPMM5k9e3amwwHg9NNP56GHHkrb9ZSgMqB89pw23wuX9GOjn6D0/Ekkd/3tb39jzJgxXHzxxTz11FNs3rwZgEcffZQLLriAa6+9lnHjxvH5z39+h6Tx5ptvct5553HMMcdw2GGHcfnll1Md94F47dq1jBkzhvLy8tayxx9/nK9+9asA3H333UyYMIGjjjqKKVOm8MEHH7Re+4wzzgBgw4YNXHrppRx55JFMmjSJa6+9loa4TVf3lp5BZUBj1fo23xs2dQrL1MUnklLT7n2dtxavS9v1jhjTn59ffPRuHTN37lwuuOACRo0axYEHHsjDDz/MRRddBMCrr77KtGnTuPHGG3nssceYPn06p556Knl5eVx++eVMmzaNU089lYqKCr71rW8xd+5cLr744tZzDxgwgPHjx/P0009z2WWXAV5CPP3001m4cCH33XcfTzzxBGVlZdx5553ceuutPPDAAzvEN3PmTIqLi3n11Vepra3l/PPP57nnnmPy5Ml798eKoRZUGn06625eOfPrEI0mfD9UXETZxAlsqmkZwacEJZKLPvzwQ9asWcMpp5wCwLnnnsucOXOIRCIAlJaWcs4555CXl8fkyZPZunUra9asIRwO8/DDD3PqqadSV1dHZWUlffv2paKiYqdrnH766TzzzDOA1xp68803Oe200+jRowe1tbU8+uijLF26lCuvvHKn5ARQVFTEwoULeeGFF4hGozz++OMdmpxALai0+XTW3ax79vk23w+Gw4y8xPt0tFHPoERSandbM+k2d+5cqqurOfHEEwGIRCJs2LCBf/7znwD069evtW5+fn5rnVAoxPz587n//vuJRCKMHj2aLVu2EE3wofiUU05h+vTpLFmyhDfffJPx48dTUlJCSUkJM2fO5P777+cPf/gD/fr14/LLL+frX//6DsdffvnlBINBZsyYwdVXX824ceOYPn06I0eO7LC/gxJUirTOcaqsgmAQ/E8+iYRLS1rnQAGto/j0DEok99TU1PD0009zzz33sO+++7aWz5o1i9mzZ7c+A0rk3Xff5fbbb+evf/1ra6Jo6cKLV1RUxEknncTzzz/PggULOOusswCo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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_sweep_frame(frame)\n", - "plot(frac_infected_series, label='Analysis')\n", - "\n", - "decorate(xlabel='Contact number (c)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The agreement is generally good, except for values of `c` less than 1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", - "\n", - "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", - "\n", - "What do the results look like, and what does that imply? " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def plot_sweep_frame_difference(frame):\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta - gamma, frac_infected, 'ro')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_sweep_frame_difference(frame)\n", - "\n", - "decorate(xlabel='Excess infection rate (infections-recoveries per day)',\n", - " ylabel='Fraction infected',\n", - " legend=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# The results don't fall on a line, which means that if we know the difference between\n", - "# `beta` and `gamma`, but not their ratio, that's not enough to predict the fraction infected." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", - "\n", - "What is your best estimate of `c`?\n", - "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "9.211261 0.999900\n", - "4.642296 0.989902\n", - "3.987365 0.979904\n", - "3.612133 0.969906\n", - "3.350924 0.959908\n", - "3.151808 0.949910\n", - "2.991711 0.939912\n", - "2.858363 0.929914\n", - "2.744467 0.919916\n", - "2.645332 0.909918\n", - "2.557767 0.899920\n", - "2.479505 0.889922\n", - "2.408879 0.879924\n", - "2.344627 0.869926\n", - "2.285771 0.859928\n", - "2.231541 0.849930\n", - "2.181315 0.839932\n", - "2.134590 0.829934\n", - "2.090947 0.819936\n", - "2.050040 0.809938\n", - "2.011573 0.799940\n", - "1.975299 0.789942\n", - "1.941002 0.779944\n", - "1.908499 0.769946\n", - "1.877628 0.759948\n", - "1.848249 0.749950\n", - "1.820238 0.739952\n", - "1.793487 0.729954\n", - "1.767898 0.719956\n", - "1.743384 0.709958\n", - " ... \n", - "1.181034 0.290042\n", - "1.173263 0.280044\n", - "1.165630 0.270046\n", - "1.158132 0.260048\n", - "1.150765 0.250050\n", - "1.143524 0.240052\n", - "1.136407 0.230054\n", - "1.129409 0.220056\n", - "1.122527 0.210058\n", - "1.115758 0.200060\n", - "1.109099 0.190062\n", - "1.102547 0.180064\n", - "1.096099 0.170066\n", - "1.089751 0.160068\n", - "1.083503 0.150070\n", - "1.077350 0.140072\n", - "1.071291 0.130074\n", - "1.065323 0.120076\n", - "1.059444 0.110078\n", - "1.053651 0.100080\n", - "1.047943 0.090082\n", - "1.042317 0.080084\n", - "1.036772 0.070086\n", - "1.031305 0.060088\n", - "1.025914 0.050090\n", - "1.020598 0.040092\n", - "1.015356 0.030094\n", - "1.010185 0.020096\n", - "1.005083 0.010098\n", - "1.000050 0.000100\n", - "Length: 101, dtype: float64" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "frac_infected_series" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# It looks like the fraction infected is 0.26 when the contact number is about 1.16" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap15soln.ipynb b/soln/chap15soln.ipynb deleted file mode 100644 index f3a0031b..00000000 --- a/soln/chap15soln.ipynb +++ /dev/null @@ -1,735 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 15\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The coffee cooling problem\n", - "\n", - "I'll use a `State` object to store the initial temperature.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    T90
    \n", - "
    " - ], - "text/plain": [ - "T 90\n", - "dtype: int64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(T=90)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a `System` object to contain the system parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initT 90\n", - "dtype: int64
    volume300
    r0.01
    T_env22
    t_00
    t_end30
    dt1
    \n", - "
    " - ], - "text/plain": [ - "init T 90\n", - "dtype: int64\n", - "volume 300\n", - "r 0.01\n", - "T_env 22\n", - "t_0 0\n", - "t_end 30\n", - "dt 1\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = System(init=init,\n", - " volume=300,\n", - " r=0.01,\n", - " T_env=22,\n", - " t_0=0,\n", - " t_end=30,\n", - " dt=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function implements Newton's law of cooling." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    T89.32
    \n", - "
    " - ], - "text/plain": [ - "T 89.32\n", - "dtype: float64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update_func(init, 0, coffee)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `run_simulation` that uses `linrange` to make an array of time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    T
    090
    189.32
    288.6468
    387.9803
    487.3205
    586.6673
    686.0207
    785.3804
    884.7466
    984.1192
    1083.498
    1182.883
    1282.2742
    1381.6714
    1481.0747
    1580.484
    1679.8991
    1779.3201
    1878.7469
    1978.1795
    2077.6177
    2177.0615
    2276.5109
    2375.9658
    2475.4261
    2574.8919
    2674.3629
    2773.8393
    2873.3209
    2972.8077
    3072.2996
    \n", - "
    " - ], - "text/plain": [ - " T\n", - "0 90\n", - "1 89.32\n", - "2 88.6468\n", - "3 87.9803\n", - "4 87.3205\n", - "5 86.6673\n", - "6 86.0207\n", - "7 85.3804\n", - "8 84.7466\n", - "9 84.1192\n", - "10 83.498\n", - "11 82.883\n", - "12 82.2742\n", - "13 81.6714\n", - "14 81.0747\n", - "15 80.484\n", - "16 79.8991\n", - "17 79.3201\n", - "18 78.7469\n", - "19 78.1795\n", - "20 77.6177\n", - "21 77.0615\n", - "22 76.5109\n", - "23 75.9658\n", - "24 75.4261\n", - "25 74.8919\n", - "26 74.3629\n", - "27 73.8393\n", - "28 73.3209\n", - "29 72.8077\n", - "30 72.2996" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = run_simulation(coffee, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.T, label='coffee')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the final temperature:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "72.2996253904031" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee.T_final = get_last_value(results.T)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Encapsulation\n", - "\n", - "Before we go on, let's define a function to initialize `System` objects with relevant parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "72.2996253904031" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = make_system(T_init=90, r=0.01, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", - "\n", - "By trial and error, find a value for `r` that makes the final temperature close to 20 C." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.00135627897414" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "milk = make_system(T_init=5, t_end=15, r=0.133, volume=50)\n", - "results = run_simulation(milk, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.T, label='milk')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap16soln.ipynb b/soln/chap16soln.ipynb deleted file mode 100644 index b49cc932..00000000 --- a/soln/chap16soln.ipynb +++ /dev/null @@ -1,1506 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 16\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code from previous notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using `root_bisect`\n", - "\n", - "As a simple example, let's find the roots of this function; that is, the values of `x` that make the result 0." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def func(x):\n", - " return (x-1) * (x-2) * (x-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `root_bisect`, which searches for a root by bisection. The first argument is the function whose roots we want. The second argument is an interval that contains a root." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root1
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 1\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_bisect(func, [0.5, 1.5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an object that contains the root that was found and other information." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.0" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we provide a different interval, we find a different root." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root2
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 2\n", - "dtype: object" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_bisect(func, [1.5, 2.5])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.0" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the interval doesn't contain a root, the results explain the error." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedFalse
    flag4.000000 and 5.000000 do not bracket a root
    \n", - "
    " - ], - "text/plain": [ - "converged False\n", - "flag 4.000000 and 5.000000 do not bracket a root\n", - "dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_bisect(func, [4, 5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to find the value of `r` that makes the final temperature 70, so we define an \"error function\" that takes `r` as a parameter and returns the difference between the final temperature and the goal." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(r):\n", - " \"\"\"Runs a simulation and returns the `error`.\n", - " \n", - " r: heat transfer rate, in 1/min\n", - " \n", - " returns: difference between final temp and 70 C\n", - " \"\"\"\n", - " system = make_system(T_init=90, r=r, volume=300, t_end=30)\n", - " results = run_simulation(system, update_func)\n", - " T_final = get_last_value(results.T)\n", - " return T_final - 70" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.01`, we end up a little too warm." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.2996253904030937" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func1(r=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.02`, we end up too cold." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-10.907066281994297" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func1(r=0.02)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `root_bisect` is an array with a single element, the estimated value of `r`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root0.0115431
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 0.0115431\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_bisect(error_func1, [0.01, 0.02])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.011543084681034089" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we run the simulation with the estimated value of `r`, the final temperature is 70 C, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "69.99999985860761" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you call `root_bisect`, it calls `error_func1` several times. To see how this works, add a print statement to `error_func1` and run `root_bisect` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Repeat this process to estimate `r_milk`, given that it starts at 5 C and reaches 20 C after 15 minutes. \n", - "\n", - "Before you use `root_bisect`, you might want to try a few values for `r_milk` and see how close you can get by trial and error. Here's an initial guess to get you started:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "18.499850754390966" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_milk = 0.1\n", - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=15)\n", - "results = run_simulation(milk, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func2(r):\n", - " \"\"\"Runs a simulation and returns the `error`.\n", - " \n", - " r: heat transfer rate, in 1/min\n", - " \n", - " returns: difference between final temp and 20C\n", - " \"\"\"\n", - " system = make_system(T_init=5, r=r, volume=50, t_end=15)\n", - " results = run_simulation(system, update_func)\n", - " T_final = get_last_value(results.T)\n", - " return T_final - 20" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-1.500149245609034" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func2(r=0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.4018656744898585" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func2(r=0.2)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root0.132961
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 0.132961\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_bisect(error_func2, [0.1, 0.2])" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.13296079039573666" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "r_milk = res.root" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "20.00000003602163" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=15)\n", - "results = run_simulation(milk, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mixing liquids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `System` objects that represent two liquids, computes the temperature of the mixture, and returns a new `System` object that represents the mixture." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def mix(system1, system2):\n", - " \"\"\"Simulates the mixture of two liquids.\n", - " \n", - " system1: System representing coffee\n", - " system2: System representing milk\n", - " \n", - " returns: System representing the mixture\n", - " \"\"\"\n", - " assert system1.t_end == system2.t_end\n", - " \n", - " V1, V2 = system1.volume, system2.volume\n", - " T1, T2 = system1.temp, system2.temp\n", - " \n", - " V_mix = V1 + V2\n", - " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", - " \n", - " return make_system(T_init=T_mix,\n", - " r=system1.r,\n", - " volume=V_mix,\n", - " t_end=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`mix` requires the `System` objects to have `temp` as a system variable. `make_system` initializes this variable;\n", - "the following function makes sure it gets updated when we run a simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_set(system):\n", - " \"\"\"Run a simulation and set the final temperature.\n", - " \n", - " system: System\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " results = run_simulation(system, update_func)\n", - " system.temp = get_last_value(results.T)\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing immediately\n", - "\n", - "Next here's what we get if we add the milk immediately." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "90" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=30)\n", - "milk.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "77.85714285714286" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mix_first = mix(coffee, milk)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "61.4285713124277" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mix_results = run_and_set(mix_first)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing at the end\n", - "\n", - "First we'll see what happens if we add the milk at the end. We'll simulate the coffee and the milk separately." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "69.99999985860761" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee_results = run_and_set(coffee)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "21.76470589082862" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "milk_results = run_and_set(milk)\n", - "milk.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap16-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deZhcVYH38W8tXb3ve/YActghYQkIEWQRERdU3kGJgnsQVERxGRiDyCjIpqIoRHnZlGFwgIFHXxFhQIEBjBBkCTkBQkjS6X3fu2t5/zi3qqs73Z1K0l29/T7PU09V3Xvr1rl9Sf045557ji8WiyEiIjLd+Ke6ACIiIqNRQImIyLSkgBIRkWlJASUiItNScKoLsLeMMZnA0UAtEJni4oiIyO4JANXAOmttf/KKGR9QuHB6aqoLISIie2Ul8HTygtkQULUAv/vd76iqqprqsoiIyG6oq6tj1apV4P2WJ5sNARUBqKqqYsGCBVNdFhER2TM7XaJRJwkREZmWFFAiIjItKaBERGRaUkCJiMi0pIASEZFpSQElIiLTkgIK6Ood5PW3W2jv6t/1xiIikhaz4T6ovfbT/3iR51+rA6AoL5NFVfksri5gcVU+iyoLWFSVT252xhSXUkRkblFAAScftZDWzj621XfS1tVP25v9vPxm07BtyoqyXWBVecFVlc/CinyyMvUnFBGZDPp1Bd592Dzefdg8otEYTW29vFPXwTt1nbxT18HWuk621XfS1NZLU1svL2xsSHzO54PKkpxELWtRVT6LKvNZUJlPZkZgCo9IRGTmU0Al8ft9VJTkUFGSw9EHDY3rF4nGqGvu5p3aDrbWdyaeaxq6qGvuoa65h79vqBvajw+qSnO90CpgUaULr/nleYQUXCIiKVFApSDg9zG/PI/55Xm8O2n5YDjKjqYuttZ1uke9q3HtaOpOPJ57dXhwVZflsqiqgIWV+QouEZFxKKD2QkbQz+KqAhZXFQxbPhiOsL3BC676TrbWdbCtvpPapm5qGt3j2VeGBu5VcImI7EwBNQkyggGWzitk6bzCYcsHBiPUNO5ecFWW5iYCa2GleyyoyCMrpFMnIrObfuXSKJQxfnC9U9fJ9vp4eHVS29xNbZN7xLvBw1DnjIWVrifhQi/AFlTkkZOl7vAiMjsooKaBsYJrMBxhR2N3IrC2eeG1o3Goc8a6DfXDPlNWlM3CijwWej0K47Wu/JxQOg9JRGSvKaCmsYxgwN0wXD38Glc4EmVHYxfbGrrYVt/JNq/JsKaxK9Edfv2mxmGfKcrPZGFFPgsq81hYEe8On0dJQRY+ny+dhyUikhIF1AwUDPhd9/URnTMi0Rj1Ld2JwNre0OWe6ztp6+ynrbOfV94afgNyTlYw0Uy4sDKPBV6zYUVJDgG/gktEpo4CahYJ+H3MK8tjXlkeKw6pTiyP34C8raGTbfVdbG9wzYXb6jvp7BnEbm3Fbm0dtq9Q0M+88jwWVOQlrnUtqMxjXnmebkIWkbRQQM0ByTcgH3lAZWJ5LBajvWuAbQ1DnTO213exraGT5vY+ttR2sKW2Y9i+4h00FlTkJ8Ir/qzrXCIykRRQc5jP56MoP5Oi/EwO3bds2LqevkG2N8RrW+5a1/aGTmq9zhl1zT384/XhHTQK80KJ4FpQ4TUZVuRTXpSNX82FIrKbFFAyqpysDPZfVMz+i4qHLR8MR6ltch00tte78KppdNe72rsGaO9q5rXNzcM+E8oIsMBrLoyH1/yKPOaV5+p+LhEZk34dZLdkBEfvoBGNxmhu73M1rgYXWDVeL8PWzn4272hn8472nfZXUZydqHXNTwqw4vxM9S4UmeMUUDIh/H4f5cXZlBdns8xUDFvX1TtITUO8tuWaDbc3dFHb1E1Day8Nrb28aBuGfSYnK+jGP4yHVrkLseqyXA3/JDJHKKBk0uVlZ2AWl2AWlwxbHo5EqW/pYbvXJT5+zWt7QxddvYO8sa2NN7a1DfuMzwcVxTlDNa7yoSZD1bpEZhcFlEyZYMCfGCV+RdLyeO9CV9saqnXVNHRR19JDvfdInpsLIDszyPyKPOaXDYWXrnWJzFz6VyvTTnLvwoP3KR22bjAcpa65O1Hbqml017pqGrvo7BnkzW1tvDmi1gVuCKh4YMVDcX5FHmVF2bohWWSaUkDJjJIR9CfGF4TqYevau/qHBVa89lXb1J0YAuqlNxp32t+8stzETcnJ4aX7ukSmVloDyhhzLHATYIBG4Bpr7W+MMSHgF8DZQAS40Vp7dTrLJjNfYV4mhXmZHLR0eK0rEr/WlRReNY1d7GjsoqWjn3fqOnmnrnOn/eXnhFjgNRHOL3ejaMwvdx01NJqGyORLW0AZY/zAQ8A3rbW/NcYcDTxljFkHfAIXWvsChcAjxpgaa+1d6SqfzF6BgBu2aV55Hhw0fF1P3yA7GrvZ7gVWTUMXNU3udWfPAK9vaeH1LS077bO8OJv5ZTuHV0VxNoGAP01HJjK7pbMGVQxUAD5jjA+IAWFgADgf+Iy1thVoNcZcD6wGFFAyqXKyMthvYRH7LSwatjwWi9HS0ceOxu6kGpd7XdfcTWNrL42tOzcZBgM+KktyhwXXvDL3uqQgSyNqiOyGtAWUtbbZGPML4E7gdiAAXAzU4i4mbEjafCNwaLrKJjKSz+ejtDCb0sJsDt1v+DBQkUiU+taeEeHlal9N7X2JZesYPhRUKCPgXe/ywqssl2qvFlaUpy7yIiOlu4mvDzgXuB94N/AAEO9y1ZO0eQ+Qk66yieyOQMCfGDX+qAMrh63rGwhT19yTCK14iO1ockNBjTYAL7gu8vPKc7395npNku59Qa46a8jclM4mvo8Bx1trv+W9/6sx5jZc8x5AdtK2OUBXGssmMiGyQkGWVBewZMQkk+BG1NgRD66mbnY0drPDu97V3Rfmre3tvLV95+Gg8rIzmFeeS3VpPLRyE02HeeppKLNYOgNqIZA5YlkY15uvDtdJosZbfgDDm/xEZry87NEH4I3FYnR0DwwFVlN3IsRqm9yoGpu2trFp6873d+XnZDCvLI9qr7ZVXeYFmMJLZoF0BtSjwNXGmC8BvwaWA18EvgBsBa4wxrwM5AGXAj9LY9lEpozP50t0kT9w6fDhoGKxGG2d/SNCywVZbVP3mBNOgusm765z5Saeq73rXmo2lJkgnZ0kXjPGfAy4CrgOV2v6rrX2IWPMn4EbgNcAP7AWuCVdZROZrnw+H8UFWRQXZO00qka8p6ELrOEBVtvcTWfPAHbrwKjhlZedkRRYXoCVuhpYYV5IHTZkWvDFYrGpLsNeMcYsAd5+/PHHWbBgwVQXR2RaiMVitHb2u/Bq7KK22YVYbWM3tc1d9PZHxvxsdmaQ6tLcYQFWXZZLdWmuusrLhNu+fTunnHIKwFJr7ZbkdRrqSGQW8vl8lBRkUTJGzautq58djd3UNXs1rqZudjR3U+t12Bhr/q5Q0E9lqatxVZUOBVd1Wa5uUpYJp4ASmWN8Ph/F+VkU548eXp09g9TFa1xeR40dTS7M2rsG2Fbfybb6nYeG8vt9VBbnUFWak6h1VZW6AKsszdGI8rLb9F+MiCT4fD4KckMU5IZ26m0Ibmio2qZu6pp72NHURV1zT+KaV1NbL7XN7vX6TY07fbakIJOq0qGalwuvHKpKcynI1XUv2ZkCSkRSlpOVwb4Lith3QdFO6wYGI9S3DAVWXfy5uZv6lh5aOvpp6ehnw9s7j22YkxWkqiSXqrIcr8Y1FF7lRWo6nKsUUCIyIUIZgaSpUIaLRGM0ezWs+HWvuuYeV+Nq6qZnnOteAb+PiuIcKktdeFV5wVXlvc7JykjH4ckUUECJyKQL+H1UlORQUZLD4e8qH7YufqNyXbMLrbrmeM3LvW5u70s0Hb7Ezk2H+TkhqstyqCpx17qSr3uVFmpCyplMASUiUyr5RmWzuGSn9f2DERpaehLNhnUtPYkwq/fu9+rcOjDqSBvBgKt9VXmBVVWSQ2VpLlUlbllutmpf05kCSkSmtcxxmg6j0RitnX0urFqGmg3rvefEKBxN3aPuOz8nIxFYlV5oxZ/Li7MJ6trXlFJAiciM5fcPTYsysss8QF9/mPrWHuq95sK6Fu+1F2adPYN09rTx5rada19+H5QWZbumwxLXfT45xIryNUXKZFNAicislZUZZHFVAYurdh5dPj7OYZ0XWPVe06F77qG5vTcxMeUrb+2871BGgMqSbCq9ABv2KM0lT82He00BJSJzUvI4hyMH6QUYDEdobO11ta4Wd72rznuub3G1r231XWyrH31moNzsjGGhFb/+VVGcTUWJblxOhf5CIiKjyAgGvIkj80Zd39M3mKhtDQsw79HdO8jmmnY21+zcdR6gKD/ThZfXhb6yJCfRnb68KIeMoK5/KaBERPZATlYGS+cVsnRe4U7r4uMd1nvXvBpaexKv61t7aGztoa2zn7bOfuw7O4827/NBaUEWFV7tqyIpyCqKcygrmhsdOBRQIiITLHm8wwNG6ToficZoae+jvqXbhVdzT6L21djaQ1NbL03tfTS194068obf76Os0AVYRXG89pWdeD9bAkwBJSKSZgG/j/LibMqLs0ddH45EaWrrpb6lh4YWV+uKv25o6aG5o4+G1l4aWnuB5p0+H++BOBReOwfYTGhCVECJiEwzwYA/MZzTaOIdOFzToXtuaB0eYPEeiK9t3jnA4k2I5V6AlRdne8/e+6JsQhmByT7MXVJAiYjMMLvqwDEYdjWwYbWv1h4aW12trKV9qAnx9S07NyGC68RRUZzt1b5cDaw8qTaWjjEQFVAiIrNMRtCfmJNrNPEmxHhgNbbGO2+4901tvYlOHKMNIQWQl51BRXEOHzxhKaetWDwpx6GAEhGZY5KbEA8dZX28E0dD6/DwamjpoaG1l8bWHrp6B+nqbedv62sUUCIikh7DO3HsPIRUvBt9c1sf88pHr6VNBAWUiIjsluRu9JNp+vczFBGROSmlGpQx5gzgDOAooAKIAHXAOuAP1tonJ6uAIiIyN40bUMaYTwLfB0qAx4A/4e4KCwBlwOHAfcaYRuCH1tp7JrW0IiIyZ4wZUMaYPwPdwAXAX6210TG28+NqV182xnzWWnvapJRURETmlPFqUGustc/vagdecP0R+KMx5tgJK5mIiMxpY3aSSCWcRvnMc3tXHBEREWdX16D2Ba4ELrfWvpO0/A4gC/hO8nIREZGJMmYNyhjzLuBZXEeIkXdiPQEcCDxvjFk6ecUTEZG5arz7oK7CBdQya+2G5BXW2juBo4FXgB9MXvFERGSuGi+g3gP8wFobHm2ltXYAF07vnYyCiYjI3DZeQOUDO89FPNx2YOf5jkVERPbSeAH1OrCrbuPHAVsmrDQiIiKe8QLqN8CPjDFLRltpjNkHuAa4axLKJSIic9yY3cyttWuNMScBG4wx/4Ubd68dKMZ1kPgYbuijG9NQThERmWPGvQ/KWnuuMeZc4HPAFUARbiy+54FPWWsfmPwiiojIXLTL0cy9AWA1CKyIiKTVeDfqXm6MyU51R8aYXGPMmokploiIzHXjdZLoB141xvzIGHPUWBsZY5YZY27A9frrm+gCiojI3DReJ4nrjTG/B74DPGmM6QU2AE2ADygHDgFCuJ5877HWbhnvy4wx1cCvcDf39gFrrbXfM8aEgF8AZ+MmQ7zRWnv1Xh6biIjMYLvqJPEOcKEx5jvAycCRQCUQBf4J/Bh43Frbm+L3PQS84O2jGvirMeZ14FDAAPvibvx9xBhTY61VF3YRkTkqpSnfrbWduHB5aE+/yBizAtgHON5aOwi87XVj7wWuBz5jrW0FWo0x1wOr0T1WIiJz1njXoCbakbjBZb9vjKkxxrwFfBQXUNW45sO4jbhalYiIzFEp1aAmSAmwEvgrriZ1APAI0Oit70natgfISWPZRERkmklnQPUDHdba73vv/2mM+Q1wvvc+uUt7DtCVxrKJiMg0k84mvo1AjtdjLy6IGzG9DtdJIu4Ahjf5iYjIHJNyDcq7F+obwP7AWcA5wGZr7YMp7uIvuOa8G4wx38QF0ueBLwObgSuMMS8DecClwM9SLZuIiMw+KdWgjDGn464d9QIH4+59ygH+0xjzmVT2Ya3tA07EXX+qxV1/utZaez+wBngVeA03KO39wC27cyAiIjK7pFqD+nfgm9baW4wx/wJgrb3KGNOIu5H3jlR2Yq3dDJw5yvI+4CLvISIikvI1qIOAR0dZ/iiwZMJKIyIi4kk1oGqAZaMsPxnYOnHFERERcVJt4rsaWOvNohsA3u/NtHsRcMkklU1EROawlGpQ1trbgfOAj+AGeb0GOAk431q7dtJKJyIic1ZKNShjzLeB31lrT5jk8oiIiACpX4O6HMiazIKIiIgkSzWg/gh81RhTPJmFERERiUu1k8R+wCdwIdWBu2E3wVo7b6ILJiIic1uqAXWr9xAREUmLVCcsvG2yCyJ77uqrr+a+++6joqKCu+++m9WrV7NlyxY++9nP8rWvfW2qiyciskdS7cV3z3jrrbXnTkxxZE/89re/5bbbbuPYY4/l4YcfprOzk3Xr1hEMpnM2FRGRiZVqJ4nIiIcP2Bc3qrlGkphA69ev55xzzmHZsmWcfvrpPProo4TDYW666SZOPPFEVqxYwQUXXMD27duJRCIsW7aMcDjM6tWrOfnkk7n88supqanh6KOP5u2336auro6LLrqIFStWcOqpp3LHHXckvisSiXDLLbdwyimnsGLFCi6++GJaWlqm7uBFRJKk2sT36dGWG2MuwwXVjHHlb57jH6/Xp+37jjqwkiu+cGxK27a0tPDFL36RSy65hHPOOYd169axevVqzjzzTF555RV++9vfUlFRwXXXXccFF1zAgw8+yPr16zHGcO+993LggQfywAMPcOedd/LQQw8RiUT4+Mc/zlFHHcXf/vY3amtrWb16NUVFRZx11lncddddPPzww9x+++1UVFTw4x//mEsuuYQ777xzkv8qIiK7trcTFt4D/J+JKIjAE088QWVlJatWrSIYDHLcccdxzz338Nhjj3HhhReycOFCMjMz+fa3v82OHTt4+eWXx93fq6++ytatW/nud79LZmYmS5Ys4bOf/Sz33nsvAPfddx9f+cpXWLRoEVlZWXzrW99i3bp1bNmyJQ1HKyIyvr29SPEZoHMCypE2qdZmpkJzczPV1dXDlh1yyCH09vYyb95QT/5QKERFRQV1dXXj7q+mpobe3l6OPXbomKPRKEVFRQDs2LGDyy+/nDVr1iTWB4NBampqWLJkyQQckYjInku1k0QtEBuxOM97fHOiCzVXVVRUUF8/vPnxjjvuIBaLUVNTwxFHHAHAwMAA9fX1lJaW7nJ/paWlPP3004llLS0t9PX1JdavWbOGlStXJtZv2rRJ4SQi00KqTXz/Bnwv6fFvwIXAgdban0xS2eacE088kfr6en7/+98TiUR49tlnuemmm7jwwgv51a9+xbZt2+jv7+faa6+luLiY5cuXj7u/ww47jLy8PH75y18yMDBAS0sLF154ITfddBMAZ511FjfffDO1tbVEIhHWrl3LqlWrEgEmIjKVUm3iqwR+Yq0dNoKEMabAGHOttfbbE1+0uae4uJi1a9dy9dVXc80111BZWckNN9zACSecwODgIOeddx7t7e0sX76c22+/nVAoNO7+QqEQa9eu5Uc/+hErV67E5/Nx6qmnctlllwHwpS99iXA4zKpVq2hra2P//ffntttuo6CgIB2HKyIyLl8sNrLlzjHGVAP53tvXgROA5hGbLQPusNZmT1oJd8Gbl+rtxx9/nAULFkxVMUREZA9s376dU045BWCptXZL8rrxalDvBn7P0LWnZ5LWxXD3QgHcMSGlFBERSTJmQFlr7zfG7Ie7TrUJOA5oStokBnRZaxsmt4giIjIXjXsNylq7GcAYk2GtjYy2jbducDIKJyIic1eqnSRKjDHfBQ4CAt4yH5AJHAKUTELZRERkDku1m/la4F+At4H3Am8AUVzHiR9OTtFERGQuSzWgTgbOt9ZeCLwG/F9r7enAtbjOFCIiIhMq1YDKxNWawHU5P9J7/X+B4ye6UCIiIqkG1CaGguh1YIX3Osd7iIiITKhUO0lcD9xhjAkA/wn80xgTA44FnpqswomIyNyVUg3KWnsXcCrwurXWAh/B9dx7Fvj85BVPRrNjxw6WLVtGZ2cn27dvxxhDR0fHsNciIjNdqqOZPwR8x1q7EcBa+2fgz5NZMBnbvHnzWL9+PQDt7e1TXBoRkcmR6jWoE4CBySyIuDGpjjrqKO6++26OP/54jjnmGO6++25+97vfsXLlSlasWMEdd9yRUk0pEolwySWXsGrVKrq7u9N4FCIiEyPVa1A3AncaY24ENgPDRjW31m6a6IJNps0//PiY68rOWE3B8vcB0PHiozT96dYxt93n8vsTr7ff9i0G6jaPu00qOjs7efXVV3niiSd47LHHuPTSS/nIRz7C448/zlNPPcVXv/pVjjnmmHH3EY1Gueyyy2hsbOTXv/41OTnqxyIiM0+qAXWV9xzvyRcfQNbnvQ7s9AnZYxdeeCGhUIjjjjuOSCTCeeedRygU4r3vfS+RSAS/f/yK75VXXsmLL77In/70J4WTiMxYqQbUuya1FGmWaq2mYPn7ErWpXVnw+ev2pkjDxKdkDwRc7ufnu1lP4sE01hQpcbW1tXR2drJu3TpOPPHECSuXiEg6pdqL7y1r7Vu4mtJBQC0wmLRcJpDP59v1RuO4+eab+frXv86aNWvo6uqaoFKJiKRXSgFljMn3evJtBB4EqoCfGWPWG2PmTWYBZfdlZGTwqU99ivLycq699tqpLo6IyB5JtRff9UAhsIShDhLfALqAn058sWRv+f1+rrrqKh544AGee+65qS6OiMhuG3PK92TGmBrgw9baF4wxncDh1trNxphlwGPW2tLJLug4ZVuCpnwXEZmR9nTK92T5QM8Y61LdBwDGmCLgZWCNtfYOY0wI+AVwNhABbrTWXr07+xQRkdkn1Sa+PwNrvLH4AGLGmFLgOuAvu/mdtwDzk95fCRhgX+Bo4HxjzHm7uU8REZllUg2orwFLgSbc6OWPAFuBMuDrqX6ZMeZ8oAB4JWnx+cAPrbWtXvXuemB1qvsUEZHZKaXmOWttLXCsMeY0XDfzIG7ajUestdFU9mGMWQpcgZvg8BFvWRFQDWxI2nQjcGiqByAiIrNTqjWouM3AFsACr+5GOAWA3wKXWmvrklblec/J17d60BxTIiJzXqqjmRcB9wGn4Doy+AC/MeZB4Dxr7VgdKOK+B1hr7QMjlsdHMc1OWpaD674uIiJzWKo1qFtx15uOAbJwU8Afh+vYkMp9UJ8AzjbGtBlj2nBNeL8EfgjU4TpJxB3A8CY/ERGZg1LtIn4GcJK19sWkZX83xqzGXU/60ngfttYekPzeGPMS8FOvm3kXcIUx5mVck9+lwM9SPQAREZmdUq1BNQHFoywPMtRMt6fWAK8CrwHrgPtxXdFFRGQOS7UG9a/AWmPMvwJPA2FgOfAT4OfGmP3jG6YyN5S19oik133ARd5DREQESD2g/sN7vpfhc0EBXANcjeaGEhGRCTQn54MSEZHpL9UbdTXnk4iIpFWq90EdBtwIHIzrYj6MtbZkgsslIiJzXKpNfHfieuv9G9A3ecURERFxUg2o/YGjrbW6gVZERNIi1fugnsE174mIiKRFqjWoLwLPGGPOwA0YO2yQWGvtjya6YCIiMrelGlDfw02LcTywbMS6GKCAEhGRCZVqQH0C+Ji19qHJLIyIiEhcqtegWoFdDmEkIiIyUVKtQX0HuMkY803gLWAweaW1dmCiCyYiInNbqgF1A1AKrB9jvcbfExGRCZVqQH1qUkshIiIyQqpj8T0ef22MyQe6rLWxcT4iIiKyV1KtQWGM+QbwLaAc2N8Y8z2gHbjUWhuepPKJiMgclVIvPq9zxMXAt4F+b/FDwDnoHigREZkEqXYz/yJwgbX2brxRJKy1/w2cD5w7SWUTEZE5LNWAWgRsHGX5FkBTbYiIyIRLNaDWA/+S9D7eQeICxu56LiIissdS7SRxKfCIMeY9uAkLrzTGHAAcBJwxWYUTEZG5K6UalLX2WdycUOuBPwLFwJPAgdbapyatdCIiMmeNWYMyxqwBrrfW9gBYa+txM+qKiIhMuvFqUFcAeekqiIiISLLxAsqXtlKIiIiMsKtOEguMMVm72om1dusElUdERATYdUCt28V6H67LuUYzFxGRCbWrgHov0JyOgoiIiCQbL6BiwEZrbUO6CiMiIhKnThIiIjItjRdQdwK96SqIiIhIsjGb+Ky1n01nQURERJKlOlisiIhIWimgRERkWlJAiYjItKSAEhGRaUkBJSIi01KqExaKiMgYYrEYxKLEohGIRohFIhCLEcjJT2wz2NZALDzgbReFqLd9LEogv5iMwgoAIt3t9Ne+6baJRYnF3Lbxz+WaFfhDbojUnrfWM9haB7EoxGJDn4lGySiqIO/gEwCIDvTR9sz9QHwbr7zec/7hp5BZtRSA7jf+QffG54H4djGvnDH8oSzKP3hR4phanryHkpPOnbS/qwJKRKad6GA/sfAAsXCYWGSAWHiQWCRMLDxIMK+IYGE5AOGuVvq2bnDrImGIhIlFBhPvC486A39WLgAdLz3GQO1mty4aIRYZ9MIkTKhiCSUnfRKASF83dfdcSSwaJRYNQyRCLBp2P+yRMOVnXkjOu44EoO1/H6Dlyf9wATGCPzufJd+4I/F+x93fI9LRNOrxFr37Y5S8dxUA/XWbqfvPH435t8m66FeJgOpY/xd67POjbpe99PBEQMXCg7T97wNj73PxwYmAGmh4h66X/2fU7fzZeZQzFFB92+2Y+5wIaQ0oY8xpwDXAu4AG4Dpr7a3GmBDwC+BsIALcaK29Op1lE5GdxWJRYoP9RAf6iYX7iQ0O4AsEySipduvDg3RvfM4LFLd+KFwGyD/8ZDKr9gGga8MzdK7/C9GwFzjeNrHwIL6MTBZdeHPie7ffejHh9sZRy1R43FmUnvxpAAYattLw4I1jlj/v4BMSAdX71kt0b3x29OMc7E8+aPpr3xpzn9HBvqR3vqFw8vnx+QPgDyJP0v4AABRfSURBVODz+/Fn5gz7XEZxJf5gCPx+fH4/+Nx2+AME8ksT2wVyCsneZ5m3jd9tn/Tsz8hMbJuzzxEEc4vA29bn8yVex88RgC8jRPGJnxyxjc/t1+cjs2LJ0D73O5JAbpHbzjd8O18wY9gxlZz4yTH/ThMhbQFljFkI3A+cDzwEHAn82RizBTgJMMC+QCHwiDGmxlp7V7rKJzLTxWJRYgN9RPt7iQ70Eh3oI5CdR0ZxFQDhjia6Xnua6ECv226gz70e7Cc62E/Fh75KsMD9UDb+4Wa6Njwz/Ifbk7X4EOZ96kr3neEBGh766ZhlylpgEgEV7miid8sro27nyxg+q48/Mxd/Vg++QAa+QBBfMIQvGMQXyCCYX5LYLphXTO4Bx+ELBCEQHNreeySHRP7hJ5O1+BB8gYBb7/c+4w8QyCtK+u5s5n3mGnz+AL6AFziBoBcsQfzZQ/O4Fh77YQpXfMht4xt/dLh5n/rBuOvjMqv3ofqTqU1eXrD8fSlt58/IpPiEs1P7/solZFYuSWnbrIUHpLTdnkpnDWoJcI+19kHv/TpjzJPA8bjQ+oy1thVoNcZcD6wGFFAyZ8RiscSPXLijmYGGd4j2dRPp6yLa3+MefT3EImEqPjTUzLLj7jUM1L9NtL8XN8bzkIKjz6TsfZ9z+2xvpOV/7h7z+6N9XeAFVCwaTYSTLxjCF8rC7z0HC8sSn/FlZJJ70PH4MzLxeQ9/MBNfMANfRoiQF04AuQccR6hyidtPMOS2CYZcqARDw8qy4Is3pPQ3C1UsovLjl6a0bc5+y1PazucPkDX/XSlvK5MnbQFlrX0KeCr+3hhTAqwE7gaqgQ1Jm28EDk1X2UQmUiwWdcHS0wnRMKHyRW55NELLk/cQ7ekk0ttJtK+baF8nkd5uon3dlJ3+efIPPxmA7k1/p/nPvxnzO8rPvCDx4xgd6CPa3wO4mog/Mxt/KBtfKHt4baOwnMIVH/bWZeEPZbnXGZn4QpkEvYv0AGWnf4Gy07+ALyM07o+wLxCk8qPfSOnvklFUQUZRxa43FPFMSScJY0wh8DDwPPCCt7gnaZMeIGfk50SmSnSgl0h3u/doI2vhQYkeWh0vPELXa08T6elwwdPblbguEapYxIIv/sTtxOen/e9/gEh41O+I9HYlXmeUVJO9z+H4s/LwZ+USyMrFF8rBn5mDP2v4P42qcy7zmrOyxw2TYEEZpaeen9Lx+jOzU9pOZDKlPaCMMfvjrkFtAFYB8X8Jyf8icoAuRCZRLBYj1t9DuKuVSGcLvoxMshYYwDWH1T/4EyLdrUS623e6FlN97hVkLz3MbdvRRN+214et92fm4M8pIFhQnljm8/koPfnT+IIh/Dn5BLzw8WfluQBKCoWcfY4gZ58jUjqOYNL1E5HZJN29+N6DC6dbgMustTGgzxhTh+skUeNtegDDm/xEdlu0v5dwRyMZJfPcRW6g9ZkH6N38EpGuFsKdLcOCJ3vf5VR/4nLANZX11wx1ofUFQwRyCwnkFhHILcQXGrqon3fYyWQvPZxAbiH+7AIC2XmJ7xup8JgPTsahisxK6ezFty/wB+Bya+3PR6y+G7jCGPMykAdcCvwsXWWTmS3c2ULXq38j3N7oHh1NhDuaiPZ1A7DggpsIlc4HYLClhr6tryU+68vIJJhfQiCvZFjPJX92HtWfvopgXrHrchvKGrOXVqh0HpTOm7wDFJmj0lmDugjIB642xiTf43QzsAa4AXgNN/zSWlwtS+awWDRCpLOFwdY6BlvrCbe558HWerKXHELpKecBEOnpGLV3mi8YIlhYRmxg6L6VwqM/SN4h7yGYX0owvwRfKHvU4PH5fGQvOmjyDk5Edimdvfi+AYzX3eci7yFzTKSvm8HmGgabtpN3yEp8AXczYN29/07v2y+P+plA0r0oGUUVFB7zQYKF5QQLygkWlhEsKMOfU7BT+MTvlheR6U9DHUlahbta6d7wDAPNNV4o1RDpbkusz5z3LkLlCwEIFlYQyC0iWFxJRnEVGUVVQ6+9m0/BdUgoPU0TQIvMNgoomXDRgT4GGrcyUL+FgYZ3yCidR+HRZ7p1PZ00/+X2Ydv7giEySueTUToPkmo8ZWd8Cd+ZX05r2UVk+lBAyYTofPkJujetY6DhHcKt9SSPaJC16KBEQGWUVJO/7DRCZQtcKJXNJ1hQ5sb6GkF36YvMbQooSVm4s5X+HW/QX/sm/TvepOyMLyWa2vpr3hgaVdkfJFQ2n1DlEkIVi8ms3i+xD18wg/IPXDAVxReRGUYBJWOK9vfS/o8/eYH0BpHOlmHr+2o2JQIq79ATyVxgyKxcQkbpvERHBxGRPaWAEmKxGOHWOnq3biDa30PRig8Bbpy11r/9J0Td0Dy+zBwyq/cls3pfsua9i6yFByb2kbXAJEZhEBGZCAqoOSgWizLQsJW+ba/Tt3UDfVs3JHrS+TJzKDz6A26qgWAGJSd9kkBeEZnV+7ma0SjXikREJoMCag5wM5EOJObG6XzxUZoe+fWwbfw5BWQtPJDsRQcRi4QTHRSKjjsr7eUVEQEF1Kw12FpH7+aX6HnrJXrfeYXCo86g5L2fAiBzwQEECsrIXnQQWQsPJGvRQWSUzt/lhGsiIumkgJpFere8QvfG5+jZ/BLh1rph6wbbGhKvQxWLWfzVW9NdPBGR3aKAmqFisRgD9VvIKKrAn5ULQNerT9H5z8cB8Gflkr3kMLL3OYKcfY8gWJA0C6pqSiIyAyigZpBYJEzv1tfo2fg83Zv+TqSrlYqPfJ28Q1YCkHfISgIFpeTscwSZ8/bTja4iMqMpoGaA7k3r6LbP0bPpH0T7huZxDOSXEA0nzWe05FCylxw6FUUUEZlwCqhpKNrfO2z+obZn7qd/xxsAZJQtINccS+4BKwhVLlVznYjMWgqoaSLa103Xxufosc/T8/Y/WfC5awlVLAag4KgzCHccQ645hlDZgikuqYhIeiigplAsGqF38z/pfOVJejatIxYe8Nb46NvxRiKg8g89ceoKKSIyRRRQUyQWi7L91q8z2LIjsSxr8SHkHXQ8OfsfQzCvaApLJyIy9RRQaRLpbqdrw9PkH3Eq/oxMfD4/mQsOAGLkHXoSeYe+h4zCiqkupojItKGAmkSxyCDdb/yDrpefpOet9RCNEMgpJO/gEwAoO/1z+DKy1NFBRGQUCqhJEO5qpXP9X+h44c9D05n7/OTsdySB/JLEdv5Q9hSVUERk+lNATYK6e3/IQP3bgOsWnn/EqeQdvFLXlUREdoMCai/FwoN0vf6MG3DVu4ZUsPx99Ly1nsKjP0DW4kPUhCcisgcUUHso3NFMx4uP0vnSX4h0t1N47EcoPeU8wAVUwfL3TXEJRURmNgXUburf8SZtzz9M98bnIBoB3OjgmVVLp7hkIiKziwJqN7Q+dZ+bAh3A5yf3gOMoOPoMshYepGY8EZEJpoDahehAH/5QFgDZ+xxB27MPUXDk6RQe/YFhU1iIiMjEUkCNIhaL0ffOq7Q+/Xt8gRDVn/w3ALLm78/ii3+dmDpdREQmjwIqSSwWo/ftl2l7+vf0bXsdcBP/hbvaEl3EFU4iIumhgMILprfW0/r07+mv2QSAPyuPwhUfovCoMxIz1oqISPoooIBoTwf1919HLDyAP6eAohUfpuDI9+PP1EgPIiJTRQEFBHILKXr3R/FlZFGw/H2JThEiIjJ1FFCe4pX/MtVFEBGRJP6pLoCIiMhoFFAiIjItKaBERGRaUkCJiMi0pIASEZFpSQElIiLTkgJKRESmpdlwH1QAoK6ubqrLISIiuynptzswct1sCKhqgFWrVk11OUREZM9VA28lL5gNAbUOWAnUApEpLouIiOyeAC6c1o1c4YvFYukvjoiIyC6ok4SIiExLCigREZmWFFAiIjItKaBERGRaUkCJiMi0pIASEZFpSQElIiLTkgJKRESmpdkwksReMcYcDtwCHAZsBj5nrd3pjuaZyhjzOeBWoD9p8UXW2junqEgTwhhzDPAHa22F9z4E/AI4GzeiyI3W2qunsIh7ZZTjywQ6gYGkzf7XWvu+qSjfnjDGnAZcA7wLaACus9beOlvO3TjHN+PPHYAx5oPAj4CluOO7drLP35wOKO8P+xDwU+A9wMeBR40xi621HVNauImzHLjBWvvdqS7IRDDG+IDPA9ePWHUlYIB9gULgEWNMjbX2rjQXca+Mc3yHAi3W2qr0l2rvGWMWAvcD5+P+zR0J/NkYswU4iRl+7nZxfM3M4HMHYIypBv4L+Ki19k/GmOXAM8aYdcD/YZLO31xv4jsJyLDW/tRaO2itvRd4DThnaos1oY4EXprqQkygK4EvA/8+Yvn5wA+tta3W2i24H/jVaS7bRBjr+Gb6eVwC3GOtfdBaG/VaKZ4Ejmd2nLsljH18M/3cYa2tBcq9cPIDpUAYVzOctPM3p2tQwEHA6yOWbcT93+qMZ4wJ4JouP22MuRHoAX4D/NhaO1MHYbzFWrvGGHNSfIExpgg32OSGpO1m6nnc6fg8y4EKY8zLQCXwN+Dr1tqadBdwT1hrnwKeir83xpTgBnm+m1lw7nZxfO9nBp+7OGttpzEmB2jHZcePgUYm8fzN9RpUHu5HO1kPkDMFZZkM5cA/gDtx7cZn4/7v/MtTWai9Ya3dMcriPO85+VzOyPM4xvEBdAPPAKfgmlN6gQfTVa6JZIwpBB4Gngde8BbP+HMXN+L4HmIWnTugD8gFjgY+B1zsLZ+U8zfXa1DdQPaIZTlA1xSUZcJZa+uAE5MWvWSM+TnuWtsvp6ZUk6Lbe04+l7PmPAJYa7+R/N4Y8w2g0Riz0Fq7bYqKtduMMfvjfrQ3AKsYOmez4tyNPD5rbRSYFecOwDueAeAfxpi1wFHeqkk5f3O9BrUB9380yQ5geHV1xjLGHGyMuXLE4hDu/4JmDWttK1DH8HM5a84jgDHmB8aYA5MWhbznGXMujTHvwdUq/hs421rbN5vO3WjH5y2fDefuRGPMCyMWZwKTev7meg3qCcBnjLkE103y47hrNjO1+j1SG/BNY8x24DZgGfA14CtTWqrJcTdwhdfOnwdcCvxsaos0oQ4DjjLGnOu9/xnwR2tt4xSWKWXGmH2BPwCXW2t/PmL1jD93uzi+GX3uPC8B873a38+AFbjeph/FBdSknL85XYOy1g4AZ+CCqQW4HDhrhv2HMybvIuyHcT1qOnDdYK+y1v7XlBZscqwBXsX1wlyHO9ZbprREE+vzuP9bfRPYgmtm+fRUFmg3XQTkA1cbY7qSHj9mdpy78Y5vpp87rLXtwAeAj+F+K9cCX7DW/pVJPH+aUVdERKalOV2DEhGR6UsBJSIi05ICSkREpiUFlIiITEsKKBERmZYUUCIiMi3N9Rt1ZQ4wxtyBG3F5LFfiRp5+Asi31qZlmB1vMN9ngPOstZv24PMx4EPW2j9MQFnKgdOstfdMwL4uBXKttSNHMRHZLapByVxwMW7E5WrcFCsAxyQtux74X+919yifnyxfA/65J+HkqQb+MkFluRZ3E+ZE+DlwnjcuncgeUw1KZj3vLvh2AGNMmbe40RtMN9nI95PGGJMF/Ctw8p7uY5Ty7w3fRO3IWttvjLkTuAz4zETtV+YeBZQI4M2/lGji85rPPokLEYObtuRTwLdww9R0AP9qrb3b+3w+cANuSpMY8D/AxeNMn/EJoM1a+6r3+SXA27ihqW4EFgCP4aZGuR74EFALXGitfdT7TKKJzxjzJPBX4HDgfcA23JTjv/G23QJcb639xYjvO9Qr8/nxfVprfcaYDOAqXMBkA88BX7PWWm+7ld7xHoobxue33t8j4h3fA8ALxphvzZahwyT91MQnMrZrgK8DxwKLgBdxwXQ07gf4VmNMfC6qtbggOx03xUkMN+X3WP8TeCbwyCjLrwLOBU7DNUe+jGt+PBJYj5twcizfwTX5LcOF26+MMalMM349cB9usNNqb9kPvDKegxsY1AJ/NcYUetfO/tvb/kDgPOCLJNWWvOBtxM2BJLJHFFAiY7vZWvuEtfYl3I9xF3CZV4u4EVezWGqM2QdXIzrXWrvO+3H+NG4a8PePse+jcINrjvRDbx9P42Zo3WCtvclauxG4GVjo1dZG86S19mavfP+KayE5bFcH6XUK6QX6rbV1xphs4BLgAmvtX621G621X8M1k34aKARKgFpr7RZr7WO4WttjI3a9gaH5gkR2m5r4RMb2ZtLrHmCLtTY+unJ8Lp9MYLH32hozbHqxHFytarRedpVAUwrfmbxN8nd2jvLZRGcLa22HV5aMUbbblX2973jUa0aMywKMtbbFGHM1sNYY833g/wH/Ya1dN2I/zUDFHny/CKCAEhnP4Ij30TG2C3rbLsM17SVrGeMzUUbvmJDqd45mYJRl8e8YWa7x/u3H150GNIxY1wFgrb3M677/Edw0DH8xxnzPWvujpG0DzKBJ+WT6UROfyN57HVdTybXWvmmtfRPXoeE6YKyu1nVAeZrKBy68CpPe7zNifXKAvQmEgYqk43kL+D5wjDFmkTHmV8A71trrrLXvBX6M60SSrIw09oyU2Uc1KJG9ZK21xpiHgbuMMRfhOgf8ENe5YuMYH3sB1+MuXdYBq40x/w835fi/MzyUuoBDjDGLrbXvGGN+CfzMGNMPvIG7JnUWcAXu+M4GMMbcABTgalsjm/gOw81ULbJHVIMSmRjn47qi/zfuh7oQNzJD2xjb/xHX2y9dLsddo3oWuAtXG0puPrwDqAJe93r+fRv4L+B2XE/C5cAZ1tq3rLW9wAdxXcxfwnWOeBV34zEAxpiDcTPMTtSNxDIHaUZdkSlgjMnBTf/9fmvti1NcnAnndaKosNZ+fqrLIjOXalAiU8Ba24O7RnXRVJdlonnd1M/FDZ8ksscUUCJT5yfAYWZE3/RZ4CvAnfFRJ0T2lJr4RERkWlINSkREpiUFlIiITEsKKBERmZYUUCIiMi0poEREZFr6/xFdT1eslqPpAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(coffee_results.T, label='coffee')\n", - "plot(milk_results.T, '--', label='milk')\n", - "\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)',\n", - " loc='center left')\n", - "\n", - "savefig('figs/chap16-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what happens when we mix them." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "63.10924357749633" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mix_last = mix(coffee, milk)\n", - "mix_last.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.6806722650686297" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mix_last.temp - mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `t_add`, which is the time when the milk is added, and returns the final temperature." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_mix(t_add, t_total):\n", - " \"\"\"Simulates two liquids and them mixes them at t_add.\n", - " \n", - " t_add: time in minutes\n", - " t_total: total time to simulate, min\n", - " \n", - " returns: final temperature\n", - " \"\"\"\n", - " coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=t_add)\n", - " coffee_results = run_and_set(coffee)\n", - " \n", - " milk = make_system(T_init=5, r=r_milk, volume=50, t_end=t_add)\n", - " milk_results = run_and_set(milk)\n", - " \n", - " mixture = mix(coffee, milk)\n", - " mixture.t_end = t_total - t_add\n", - " results = run_and_set(mixture)\n", - "\n", - " return mixture.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can try it out with a few values." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "61.4285713124277" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_and_mix(t_add=0, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "62.9028090119359" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_and_mix(t_add=15, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "63.10924357749633" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_and_mix(t_add=30, t_total=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then sweep a range of values for `t_add`" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "for t_add in linspace(0, 30, 11):\n", - " sweep[t_add] = run_and_mix(t_add, 30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap16-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXxV1bXA8V8SEkIIMwTCIJOwEAUFBJwQBByqOFetItXaqrXWoQ6t9qlF7OtzHqqCoq1aFW3VKgqKCgrOgiiIDAtkhgQIQ4DMw73vj30SLyHDDST33Jus7+eTT+6Z9lmHo3dl77PP3nHBYBBjjDEm2sT7HYAxxhhTGUtQxhhjopIlKGOMMVHJEpQxxpio1MTvAKKJiDQFhgKZQKnP4RhjTGOQAKQDC1S1MHSDJah9DQU+9TsIY4xphEYAn4WusAS1r0yAl19+mU6dOvkdizHGNHhbtmxh/Pjx4H3/hrIEta9SgE6dOtG1a1e/YzHGmMZkv8cq1knCGGNMVLIEZYwxJipZgjLGGBOVLEEZY4yJSpagjDHGRCVLUMYYY6KSdTM3xhgTtuLSYnKL88kryiO3OJ/CkiL6tOtJ0yZJdX4uS1DGGNOIVEwwuUX55BXnkVuUT25xHnnF+eR62/LKf7ttucX5FJcW71fmqYeO5NdDflHnsVqCMsaYGBMIBsgpzCW7YA/ZBXvIKco9qARTGwlx8TRPSqF5YgopSc1ITWrOsd0G19GV7csSlKkTBQUF5OTk0L59e79DMSYmBYNB8orzy5PObu/3Psv53ufCvQSCgQM6T8UEE/q7eVIzUhJDP7vfofskJSQSFxdXx1dfOUtQDdQ///lPJk+eTEJCAhMmTGDNmjU8/PDDB1XmhAkTGDNmDJdffvl+2y699FJ++9vfMnbs2IM6hzENTUFJoUsy+XvYXRiSZCpJQMWBkrDLbZ6UQuvklrRObkmLpqlRmWAOliWoBurVV1/l9ttv5/zzz4/I+Xbu3BmR8xgTLUoCpWTl7mBrThbb83ZVmXQKSgprLsyT3KRpedJp5f3eb7lZS1o1bUFiQmI9Xl10sATVAJ166qls2LCBu+++mwULFtClSxeWL1/O5MmTefzxx1m3bh15eXl89dVXpKenc9NNN5XXfN5//32mTp3Kxo0bCQaDjB07lkmTJpGYWPX/DNdeey0ZGRncdNNNXHfddVx55ZXMmTOHxx57jIyMDA499FDuuusu+vfvD4CIcM899zBlyhSys7O59NJLGTBgAPfddx/Z2dlceOGF/OlPfyrf99Zbb+X555+nsLCQ8847j1tvvZUmTew/XVP/CooL2JKzna25WWzNyXKfc7LKk1I4zWyJ8U1+SjLNWtG6aQtaN9s/CbVKbklyk6YRuKrYYf+XH4T/++RJvsv8ISLnGpR+BLefeG1Y+77//vuMHj2aP//5z4wdO5bHH398n+3vvfcekydP5u9//ztTpkxh4sSJjBkzhoyMDP74xz/yj3/8g6OPPpr169dz0UUXMXv2bH72s59Veb4nn3xyn/MtWbKEW265hcmTJzN06FBmzpzJFVdcwQcffEDLli3LY5g5cyY//vgjF1xwASeeeCLTp09n/fr1XHDBBZxzzjmICACzZ89m+vTpFBQU8Jvf/IZ27dpx1VVXHeC/pDE/CQaD7C3MYUtOFlu8xLPVS0Jbcrezu2BPlcfGEUf7lLZ0TG1Ph5R25Uln359WNEtMjpkmtWhjCaoRGjBgAKNGjQLgrLPO4sknnyQ3N5cOHTowY8YMunXrxt69e9m5cydt2rRh27ZttSr/9ddf56yzzuLYY48F4Oyzz2batGnMmjWLCy+8EIArr7ySlJQUBg4cSEpKChdddBGpqakcfvjhpKWlsWnTpvIEddNNN9GuXTsArrjiCl588UVLUCZsgUCAHfm7yhNQaC1oa8528ksKqjy2SXwTOjZvT8fU9nRM7UDH1PZ0Su1Ax9QOpDVv1yia2fxkCeoghFujiTZlX/ZAeVNZIBAgMTGRN954g9dff53k5GT69+9PYWEhwWCwVuVnZGTw9ddfM3PmzPJ1JSUlZGRklC+3bt26/HNCQgItWrQoX46Pj9/nnN27dy//3LFjR7Zv316reEzDV1RazLbc7WzZG1ILynW1om25OygN7DfVULmUxGblCahTagcvIbnPbZu1Jj7eBtzxiyUoU27mzJm88847vPHGG3Ts2BFwNazaSktL47LLLuPmm28uX7du3bp9uqDXpslj69at5fFkZGTYbMeNXEFJIet2bWLNrvWs3rmeNTs3kLF3K0Gq/kOqTXKrkFpQBzqFfG6R1Nya4KJURBOUiKQDU4CTgAJgqqreKSKdvPWjgCAwA7hOVXdXUkYccA9wFZAEPAfcqqol3vaTgMeA3sBiYIKqrq7nS2sQ9u7dS0JCAklJSRQXF/Pqq6+iqhQX1/xiX2JiInv37gXgnHPO4frrr2fs2LEMHDiQr776iquvvpqpU6dyzDHH1Dquxx57jEcffZTs7Gyee+45Lr300lqXYWJTUWkx67M3lSei1bvWs2lP5n61+vi4eNKat3eJp3mHfZrj0lLbW+eDGBXpGtR0YCHQEUgH5onIcuASYBvQGUgE3sAloesrKeMq4DxgMFAIvAn8GZgkIu2Bt4ArgLeBG4H3RaSvqh7YW22NyLnnnsvXX3/N2LFjSUpKYvDgwYwbN45Vq1bVeOx5553H3Xffzdq1a7npppu44447uOOOO9i0aRNpaWlMmjTpgJITQI8ePTjzzDMpLCxk/PjxjB8//oDKMdGtpLSEDbs3s9pLRGt2rmfj7gxKK/SUi4+Lp3vrLvRq253ebbrTu+0hdGvV2Z4HNUBxtX2+cKBEZDgwE0hX1WJvXS8gH9gBoKpFItIN+DcwS1UnVVLOF8DzqjrVWx4LvKCqXUTkKuByVT0uZP+NwBWq+mEYMfYA1s6ZM4euXbse3AWbOiEivPXWWxx22GF+h2LqUGmglE17Mlm9cwNrdq5n9a71rM/eTEmFF1Xj4uLo2qKTS0beT/dWXUiqh4FJjT82bdrEmDFjAHqq6rrQbZGsQQ0BlgATReRyXBPfZFV9qGwHEXkFuAhYBkyuopz+3vYyK4DOItK2km0ACgwAakxQxpi6FwgEyNi7ldVeIlqzcwNrszdWOiZc5xYdvZrRIfRu250erbuSnJjsQ9QmGkQyQbUFRgDzgF5AP2CWiGSq6jRvn18B1wD/BP4LnFhJOalAXshy2eeUSraVbU+piwswxlQvEAywJSfL1Yp2bmDNrvWs2bWRwkpGU+iY2oHebQ4prx31bNONlMRmPkRtolUkE1QhsEdVJ3rLi0XkWdzzpGkAqloAFIjIH4FVItJWVSuOoZMLhP5XXJZ8crxtFZNRirfNxCBV9TsEU42SQCkrsn5k0ZZlrN65jjW7NpBfvP97RR1S2pYnol5tDqFXm0NIbdrch4hNLIlkgloBpIhIkqoWhZ5fRBYAf1TVj731TYESXMKpaBkgwOfecj8gU1WzRWQZUPEJej/g/rq7DGMat5yiXBZlLuWbjCUsylxKXnH+PtvbNmu9TzNdrzaH0DK5RRWlGVO1SCaoD4Es4CERuRmXZH6Na9I7GbhbRBYDccCDwL9UtbJRFl8EbhGRObgENtFbB65H3/0icqH3+QYgAMytp2syplHI3LuNbzZ/z8KM71mxffU+Y9B1admJIZ0HcliHQ+nV5hDaNGvlY6SmIYlYglLVAhEZCTwOZOI6Sdyvqm+IyCzgIVwtqwR4Dbi97FgRyQGuVtWXgadw3dS/wDXfvQbc5Z1jm4iciXsP6h/AUuDMkBqbMSYMpYFSdPsaFmZ8z8KMJWTs3Vq+LSEuniPShCGdBzCky0A6pXbwMVLTkEWsm3kssG7mpjHLK8pn0Zafmu5yin5qYW+elMKg9CM4uvMAjuzUn+ZJ1u/I1I1o6WZujIkyW3OyWJixhIUZ37Ns26p9XopNb5HGkM4DObrzAKR9bxLiE3yM1DRGlqCMaUQCgQCrdq71nictYdOezPJt8XHx9O/QhyGdBzKkywA6t+joY6TGWIIypsHLLy5g8ZZlLMxYwreZP7C38Ke3LlISm3FUp/4M6TyQQemHW9dvE1UsQRnTAGXl7ihvulu6bdU+Qwh1TO3AkM4DOLrzAPp16EMTa7ozUcoSlDENQCAYYPXO9a7X3eYlrN+9uXxbXFwc0r63l5QG0qVlJ5tewsQES1DGxLC9hTl8uPpT3v9xHrvyf5qdplmTZI7s1J8hnQcwqPMRtGya6mOUxhwYS1DGxKCMvVt5Vz9i7rovKfIGXe2Q0ra8g0P/Dn1s+gkT8yxBGRMjgsEgy7NW8Y7O5tuMH8pnkB2Ufjhn9B3DgI79rOnONCiWoIyJciWBUr7csJAZK2ezdtdGABLjmzCix3DG9R1D11bpPkdoTP2wBGVMlMopymXO6s95b9XH7MzPBqBl01ROPXQkpxx6Iq2SW/ocoTH1yxKUMVFma04W7678mI/WflE+j1KXlp0Y13cMI7oPs9lkTaNhCcqYKBAMBtHta5ixcjYLNi+mbIzMAR37MU7GcGSn/sTHxfscpTGRZQnKGB+VBkr5etMiZupsVu1cB0BCfAIndB/KOBlD99Y2aLFpvCxBGeODvOJ8PlrzBe+t/IisPDdpdGpSc045dASnHjrK5lQyBktQxkRUVu4O3lv5MXPWfE5+iZsaPT01jTNkNCN7HEtTe75kTDlLUMZEwI871jFDZ/PVpu/KZ6Pt36EP42QsgzsfYc+XjKmEJShj6kkgEOCbjO+ZobNZsX014GajPaH7MMb1HU2vtt19jtCY6BZ2ghKReKAfkAaUAluAH1XVpuQ1JkRBcQEfr/2Sd1d+xNbc7YCb1mJs7xH8rM8o2qW08TlCY2JDjQlKRE4EbgDGAi1CNgWBXSIyC5isql/UT4jGxIYdebuYtWous1d/Sm5xPgBpzdtxet/RjO55HMmJyT5HaExsqTJBiUgf4GngEOBN4DxgGbADiAc6AEcCJwKvishq4GpVXVnfQRsTTXIKc3lp8X+Zt+6r8inTpX1vxskYhnY+kvh4e75kzIGorgb1EjBJVWdWsX2j9zNDRP4EnOMdM6xuQzQmes3ftIhnFr7C7oI9xMXFcWy3IYyTMfRp19Pv0IyJedUlqGPCfb7k7femiLxV3X4ikg5MAU4CCoCpqnqniKQBjwFjgDjgPeAGVd1VSRlLgdCnywlAMnC8qn4hIpOA24CikH3GqerccK7FmHDsKdjLP7/9N19sXAjAYR0O5eqhl9K5RUefIzOm4agyQZUlJxFpC2SraqBsm4gMBtar6o7KjqnGdGAh0BFIB+aJyHLgF8BuoCeQCLwIPAlcUklch4cui8irQHHIM7DBwPWq+lQNsRhzQL7cuJB/LHyVPYU5NE1IYvyR53LKoSdaV3Fj6li1/0eJyM3ABmB4hU0PAptE5PfhnkhEhgO9cMmjQFXXAqOAeUAAuFtVc1U1G3gGOCGMMsd7sf02ZPUQYFG4cRkTrt0Fe3j482d45Itn2VOYw+FpfXnwtDs4rc8oS07G1IPqOklcDPwNuBP4vsLmc3BJ4UERyVTVN8I41xBgCTBRRC7HNfFNVtWHvPIqlv9ddYWJSDNcorxaVXO9delAJ+A2ETkW16HjAVV9Loz4jKlUMBjk8w3f8Ny3/2ZvUS7JTZpy6ZHnMbb3CZaYjKlH1T2D+gPwR1V9rOIGVd0D3C8iicAtQDgJqi0wAldj6oV7p2qWl+Cmle0kIrfgEtRxNZR3BZChqm+HrEvzyn8CuMAr420R2VZNZw9jqpSdv5tnFr7Cgs2LATe6+G+HXkqH5u18jsyYhq+6BNUPmFHD8W8AfwzzXIXAHlWd6C0vFpFncd3Xp3nJ7nHgTGC0qq6oobxf4zpclFPVxbhmwzLzRORF7xyWoEzYgsEgn66fz3Pf/YfcojyaNUnml0edz+hex9u06sZESHUJKg9IDeP4gjDPtQJIEZEkVS3rYdcEQERaAO/gXgQepqqbqytIRLoBA4HXKqw/AThaVR8NWZ1UixiNYWdeNlMXTuPbjCUAHNWpP1cNHU/7lLY+R2ZM41JdgvoEuBRYXM0+lwHfhnmuD4Es4CGv84XgakHXAK/iOmyMUNW8MMo6BljmdagIlQ/cKyKrcF3VR+N6Ao4OM0bTiAWDQeau/ZIXFr1OXnE+KYnNuHzQBYzscYzVmozxQXUJ6v+Az0RkN/BIWUcEABFJBW4GrgNOCedEqlogIiNxzXiZuFrN/cAq4HRcE+A2ESk7JFtVu3rny8F1hnjZ29YDyKjkHAtFZIJX7n9wPRAvV9X54cRoGq/teTuZuuBlFm1ZBsDgzgO4asgltE1p7XNkxjRecWVTS1dGRE4HngNaAYp7V6kNrvazDbhWVadHIM6IEJEewNo5c+bQtavNZNoYBINB5qz5nBcXvUF+SQHNk1L41aALGdF9mNWajImATZs2MWbMGICeqroudFu1g8Wq6rsi0gs4CzfuXhtgO/A18IGq2rMdE7Oycnfw9IKX+X7rcgCGdjmS3wy52GazNSZKVPceVIKqlnpNe694P9UqO6YuAzSmrgWCAWav/pSXFr9JQUkhLZKac8WQiziu29FWazImilRXg1ogIvcCr9U0hJGINMENV3QzMKgO4zOmTm3NyeKpBS+xdJsbdP+YroO5YshFtE5u6XNkxpiKqktQZ+M6NDwmItOBWcBSXBNfHD9NtzES+Dkwn/1HhDAmKgSCAd5fNY9p379FYWkRLZum8ushv+DYbkP8Ds0YU4XqBovdCJzjDQx7HfAUbqSG0NrUVlx37jNU9Zv6DNSYA7Vl7zamLHiJ5VmrADjukKO5YtCFtExuUcORxhg/1Tijrqp+C/wKQEQOwY1EHgC21PRCrTF+CgQCvLvqY15dMp2i0mJaJbfkyiEXM6zrUX6HZowJQ40JKpSqbsC9W2RMVMvYs4Up819Ed6wBYET3YVw+6AJaNK1pcBRjTLSoVYIyJtoFAgFmrJzNv3+YQXFpMW2SW3Hl0ZdwdJeBfodmjKklS1Cmwdi0O5Mp8//Fqp3rABjV41h+Oeh8UpOa+xuYMeaAWIIyDcKsVXP516I3KAmU0LZZa64eOp5B6Uf4HZYx5iDUKkF5Y/D1AZYBSaq6t16iMqYW3lr+PtO+fwuA0b2O55dHnk9KUjOfozLGHKywEpSIJAGPAld5q/oC93mz2o5X1d31FJ8x1Xp96bv854d3iCOOq4deyuheNc1zaYyJFeHOV30PbnbaEfw0t9IDuFHFH677sIypXjAY5D8/vOOSU1wc1w6/zJKTMQ1MuAnqQuD3qvol3ou63hQWV+JmwDUmYoLBIK8smc7rS98lPi6e64b/ihN7DPc7LGNMHQv3GVQasKWS9XuAlLoLx5jqBYNBXlz8X2bobBLi4rn+2CtsuCJjGqhwa1CfADeELAe951J3Ap/VeVTGVCIYDPLCd6+55BSfwB+Ou9KSkzENWLg1qBuAWSJyMpAMPI/rzVdKmDPqGnMwAsEA//z233zw4yc0iW/CTcddaS/fGtPAhZugVgGHARcDh3vHvQy8pKp59RSbMYBLTs988wpz1nxGYnwTbjnhanvHyZhGINwE9S1wmao+X4+xGLOfQCDAUwteYu66L0lMSORPJ1zDwE6H+R2WMSYCwk1Q6UBRfQZiTEWlgVImz/8Xn66fT9OEJP404ncc0VH8DssYEyHhJqipwAwReRpYA+SHblTVd+s6MNO4lQZKefzr5/liwzc0bdKU20dcS/+0Pn6HZYyJoHAT1B3e7/sq2RYEEsIpRETSgSnASbgXfqeq6p0ikgY8BozBzdb7HnCDqu6qopwNQDt+mjxxs6qKt+0kr6zewGJggqquDic+Ex1KAqU89uU/+HrTdzRrksyfR/4ead/b77CMMREWVoJS1XC7o9dkOrAQN+lhOjBPRJYDvwB2Az2BROBF4EngkooFiEh7oAvQUlVzK9n2FnAF8DZwI/C+iPRV1UAdXYOpRyWlJTzy5bMs2LyYlMRm/M/I6+jTrqffYRljfBDuWHzVvowbTk8+ERkO9AKOV9ViYK2IjAIKcSNV3F2WcETkGeCJKooaAqyqmJw85wFLVfUNb/kBEbkeVzP7sKYYjb+KSot5+POpfJv5A82TUrhz5PX0atvd77CMMT4Jt4kvh5+a0yoTThPfEGAJMFFELsc18U1W1YeAcyrsew7wXRXlDAbiRWQ+rsb1LXCjqi4H+uNGWg+lwAAsQUW1opIiHvj8aRZvWUaLpObcOeoGerTp5ndYxhgfhZugTqrkuN7AzcCfwiyjLW6w2Xm4mlQ/3Mu/mao6rWwnEbkFl6CqGvmzFJgP3AbsBO4C3hOR/kAqULE2l4cNxxTVCkuKuP+zKSzZuoKWTVO5a9SNHNK6i99hGWN8Fu4zqHmVrJ4jIj/iRjV/K4xiCoE9qjrRW14sIs/imuWmiUgi8Dhu8NnRqrqiiljuD10WkduB3+FqaLnsn4xScDVAE4UKigu477MpLN22klbJLfnLqBvp2ird77CMMVHgYDs/ZOCa1cKxAkjxxvAr0wRARFrgmuCGAsNUdVFVhYjIjSJyQsiqBK+cAlzzXsUXZfqxf7OfiQL5xQX87ZMnWLptJW2SWzHxpD9YcjLGlAu3k8TplaxuhWviWxzmuT4EsoCHRORmXCL5NXAN8CouWY4Io8NFD2CCiIwDsnFd31fhnkWtB+4XkQuBN3FjCAaAuWHGaCIkryifv33yBCt3rKFdszbcddKNpLdI8zssY0wUCfcZ1IxK1hUBC4Dfh1OAqhaIyEhcM14mrsZzPy65nI5rAtwmUl4BylbVrgAikgNcraov4549PYTrRNEc90zrTFUt9Y4/E/ce1D+Apd42GwUjiuQU5fK/8x5n9c71tE9py19OupGOqR38DssYE2XigsHqOuc1LiLSA1g7Z84cunbt6nc4DdLewhz+Ou/vrN21kbTm7fjLSX+gQ/N2fodljPHJpk2bGDNmDEBPVV0Xui2sZ1AiskZE2layvrOIbKuTKE2Dt6dgL5PmPsbaXRvplNqBiaNvsuRkjKlSlU18InIWUNYZoQcwSUQqPh86tJ7iMg3M7oI9TJr7GBt3Z5DeIo2/jPoDbVNa+x2WMSaKVfcMajFuqKA4b3kQ+45oHsR1376sfkIzDcWu/N1Mmvsom/dsoWvLdO4adQOtm7XyOyxjTJSrMkGp6npgNICIPIcbvHVPpAIzDcPOvGzunvsImXu3cUirLtw56npaJbf0OyxjTAwI90XdX4lIExHpwk/DGsUBTYEhqvpKfQVoYtf23J3cPfdRtuZk0aN1V+4YdQMtm6b6HZYxJkaE+x7UOOA53HBFFe0CLEGZfWzL3cHdHz9CVu4OerU5hDtGXk9q0+Z+h2WMiSHhjiTxf8AHwDBgL25svouBLYT5HpRpPLbkZDHxo4fJyt3BoW17cOeoGyw5GWNqLdwE1QeYpKoLcSM2NFfV/+CS0631FZyJPZl7tzHxo4fZnrcTadeLO0ZeT/MkG6vXGFN74SaofNyQQQArgSO9zwuBvnUdlIlNm/dsYeJHD7MzP5vDOhzKn0deR0pSM7/DMsbEqHAT1CfAnSLSGvgGONcbfXwUYD37jEtOHz/CroLdHJ7Wl9tP/D3NEpP9DssYE8PCTVA340YavwKYhhsDbw+u48Tj9ROaiRVFpcU8/MUz7C7Yw8COh3HbiGtJbtLU77CMMTEu3ASVoKqHAVO80caHAecDx6nqvfUWnYkJ/17ythshIjWNW064mqZNkmo+yBhjahDuaObzRGScqn4D4CWpd+svLBMrlm1bxQydQ3xcPL8/5nKrORlj6ky4NaidgA2cZvaRX1zAk/NfIEiQcw87jT7tevodkjGmAQm3BvUxMENEPgJW43r1lVPVP9Z1YCb6vbDodbJyd9CzTTfO7/8zv8MxxjQw4Sao/sCXQDPgiArbbEKpRuibzd/z0ZrPSYxvwu+HX06ThHD/UzLGmPCEOxbfSfUdiIkdewr28vSClwC4eODZdGvV2eeIjDENUdh/9opId+Ba3Iu51wCnAitU9at6is1EoWAwyNSF09hduJf+Hfpwet/RfodkjGmgwp1RdziwFDeCxM9wTX1HAZ+IyJn1F56JNp+un8/8TYto1iSZ3w2/jPi4cPvZGGNM7YT77fIA8FdVPRVv0kJVvRGYBNxTT7GZKLM9byf/+PZVAC4fdAFpNl27MaYehdvENwj4VSXrXwb+HO7JRCQdmIIbDb0AmKqqd4pIGvAYMAY3z9R7uAkSd1VSRgrwMHA2bj6qT4HrVHWDt30ScBv7zv47TlXnhhun2V8gGGDK/H+RX1zA0V2OZFTPY/0OyRjTwIWboHbgRjRfXWH9UGBrLc43HTfAbEcgHfcC8HLgF8BuoCeQCLwIPAlcUkkZ9wKH4noT5uES26vAcd72wcD1qvpULeIyNXh/1TyWbFVaNk3l6qMvIS4uzu+QjDENXLhNfE8AT4vIxbgazlEicj0wGXg6nAK851i9cMmjQFXX4gabnYcbKf1uVc1V1WzgGeCEKopKBiaq6g5VzfdiGy4iZcl2CLAozOsyYdi8Zwsvff8mAFcdPd6mbDfGRES43cwfFJG9uIkLU4DXcZMV/hVXgwnHEGAJMFFELsc18U1W1YeAcyrsew7wXRWxXFXJvj+oaonXhNgJuE1EjsXV/B5Q1efCjNFUUBIo5Ymvnqe4tJiRPY5hWNej/A7JGNNIhN3NXFWfxtWimuMGj63tNBttgRG4GlMvoB8wS0QyVXVa2U4icgsu6RxXaSkhROQXwB+B071VaV75TwAXeGW8LSLbVHVmLeM1wFvLZ7F613rap7TlV4Mu9DscY0wjUpv3oHoDv8E9+ykVkUXAs6q6KcwiCoE9qjrRW14sIs8C5wHTvPmlHgfOBEar6opqYokD7gT+AJyjqp8AqOpiXLNhmXki8qJ3DktQtbR653peX+rGBP7dsF/a5IPGmIgK9z2osbj3oE4DMoAsXC1nmYgMC/NcK4AUEQmdi6GJV34L4ENcp4thqlrlMyQvkb0CXAacoKqzQ7adICI3VjgkCdecaGqhqKSIJ756nmJ5DlwAABuLSURBVEAwwOl9R3NER/E7JGNMIxNuDepB4BFVvT10pYjcj3sGFU6f4w9xie0hEbkZEODXuFEpXsUlyxHeVB7VeRT3wvAxqppVYVs+cK+IrMJ1VR+N6wlowx3U0rQl09m8dwtdWnbikgFn+x2OMaYRCjdB9QUqewDxDG74oxqpaoGIjMQ142XiajX3A6twz5AKgW0i5X+pZ6tqVwARyQGuxjXT/RYoAdaG7AvQRVUXisgEr9z/ABuAy1V1fpjXaYAftirvrvyIhLh4rht+OUk2AaExxgdhT1iIS1B/rbD+ZODzcE+mqmuAMyrZVO1LNaqaGrKYUMO+rwGvhRuT2VdeUT5Pzn8BgPMPP51ebbv7HJExprEKN0F9A/yPVwP6FFeDGYwbzeEVr6kPsLmhYt1z3/2HHXm76N22O+ccdprf4RhjGrFwE9QJwFfe/qFTb3wGdPN+wOaGimnzNy1i3rqvSExIdHM8xVdbWTXGmHpl80EZALIL9vD0Ny8DcOnAc+nSspPPERljGrvavAfVCzgMN0BrqKCqvlmnUZmICgaDPL3gJfYW5jCgo3Bqn5F+h2SMMeElKBG5FTdIaxAorrA5iBv+yMSouWu/ZGHGElISm3HNsF/aHE/GmKgQbg3qVuB/gPtVNVCP8ZgI25a7g+e/c50erxh8Ee1T2vockTHGOOH+qRwH/NeSU8MSCAaY/PUL5JcUMLzrIEZ0D3dQEGOMqX/hJqgncSOE2xubDci7Kz9iWdYqWiW35MohF9scT8aYqBJuE99rwCfAJSKyBTd/UzlV7VXXgZn6tXF3Bq98Px2A3w69lJbJLXyOyBhj9hVugnoJWIcbM6+msfJMlCspLXFzPAVKGN3reIZ0HuB3SMYYs59wE1Q/4EhVXVmfwZjIeH3Zu6zN3kiH5u247Kif+x2OMcZUKtxnUAtwo4+bGLdy+xreXD6LOOK4dthlNEtM9jskY4ypVLg1qJeBf4rIK8BqKrwLpaqT6zowU/cKS4p48usXCAaDnClj6Z/Wx++QjDGmSuEmqNuAHNxstxUFAUtQMeClxf8lM2cb3Vp15qIBZ/kdjjHGVCvcsfh61ncgpn4t3rKM93+cR0J8gpvjKSHR75CMMaZatRmLLx435Xtf4Hnv9wpV3VM/oZm6klOUy5T5LwJwweFn0KNNtxqOMMYY/4XVSUJE0oFFuG7mDwJtcc1+y0Wkf/2FZ+rCP7/9Dzvzs+nTridn9zvF73CMMSYs4fbiewxYBnQA8r11l+LmiHq0HuIydeTLjQv5bP18miYk8fvhl5NgczwZY2JEuAlqNDBJVQvLVqhqHm4A2eH1EZg5eLvyd/PMN68AMOGo80hvkeZzRMYYE77aDBZb2Qsz7YGiugvH1JVgMMhTC14ipyiXIzv15+TeJ/odkjHG1Eq4CeoN4CHvWVQQQEQG4gaRnV5PsZmDMGfNZ3yX+QPNk1K4ZugEGwjWGBNzwu3FdxPwDLDZW14GJALvADeHezIvwU0BTgIKgKmqeqeIpOGec43B1dbeA25Q1V2VlBEH3ANcBSQBzwG3qmqJt/0kr6zewGJggqquDjfGhmBLThYvLHoDgN8M+QVtU1r7HJExxtReWDUoVc1R1YuBQ3Ev614EHKaq56jq7lqcbzqQCXQEjgEuE5FLgGeBEqAn0Adog6udVeYq4DxgsLfvUODPACLSHngLuBtoDbwJvO91kW8UAoEAT379AoUlhRzXbQjHHzLU75CMMeaAhDvl+xrgaFVdA6wJWd8ZWKSqNT59F5HhQC/geFUtBtaKyCigELgQuFtVc719nwGeqKKoy4BHVXWTt+9E4AVgEi5xLVXVN7x9HxCR63E1sw/DudZY947ORrevpk1yK34z5GK/wzHGmANWZYISkbOAE7zFHsAkEak41cahtTjXEGAJMFFELsc18U1W1YeAcyrsew7wXRXl9Mc1MZZZAXQWkbaVbANQYACNIEGtz97Ev394B4Brhk0gtWlznyMyxpgDV10NajFwI+6ZEMAg9u2xF8SNz3dZmOdqC4wA5uFqUv2AWSKSqarTynYSkVtwCeq4KspJZd85qco+p1SyrWx7Spgxxqzi0mKe+Op5SgIlnNx7BEelH+53SMYYc1CqTFCquh73/hMi8hyu08LBDGtUCOxR1Yne8mIReRbXLDdNRBKBx3HPuEar6ooqyskFmoUslyWfHG9bxWSU4m1r0D5c/Snrd2+mY2oHJhx5nt/hGGPMQQu3k8Sv6mDMvRVAiogkhaxrAiAiLXBNcEOBYaq6qJpylrHv3FT9gExVza5kW9n2is1+DUpJoJR3dDYAvzzqfJJtjidjTAMQ9mCxdeBDIAv3PtXNuETya+Aa3Bh/8cAIb4SK6rwI3CIic3A1poneOnC99u4XkQu9zzcAAWBunV5JlPl8/QJ25O2iS8tONn27MabBiFj3a1UtAEbinj9lArOA+4FVwOnAMGCbiOR4P5vKjvWWx3uLTwGvAV94xy4D7vLOsQ3XRHg7sBP4OXCmqjbY0S4CwQBvr/gAgLPkZOLjGk2PemNMAxfJGhReN/UzKtlU7TAHqpoa8jkA/MX7qWzfT3AdOhqF7zKXsnFPJm2btWZE92F+h2OMMXWmum7mYfd8C6NZztST6cvfB+CMvmNokhDRvzeMMaZeVfeNloM37l4YbA4HH+j21azYvprmic0Y2/uEmg8wxpgYUl2COiliUZgDMn25e/Z0yqEjaWY994wxDUx170HNC6cAb7gjE2GbdmfyTcb3JMY34Wd97W8JY0zDE+5YfH2BB3BDCZU158UBTYG0cMsxdeftFW7kplE9j6V1ckufozHGmLoXbp/kKcAh3u/OwGTclBjtgSvrJzRTlR15u/h0w3zi4uI4s9/JfodjjDH1ItwEdQxwtao+jBuj7ytV/R3wJ+CS+grOVG7myo8oDZRyTNfBdErt4Hc4xhhTL2oz5fsW7/MKfnrP6C3cvEwmQnKKcpm9+lMAzu53is/RGGNM/Qk3QS3GDeoKsBQ3IgRAF2p4ydbUrQ9+/ISCkkIGdOxHr7aH+B2OMcbUm3A7N0wEpotIMfAScIeIzMUNxPpu/YRmKioqKeK9lR8DVnsyxjR84Y5m/j7QF3hPVTNwczXNBx7BOklEzNx1X7G7cC8923RjQMd+fodjjDH1Kuzu4aq6IeTzD8Af6yUiU6lAIFA+pcbZ/U4lLs5aVo0xDVu470H1AR7ETdueSIXnTqqaVvehmVBfbfqOrTlZdEztwDFdG81YuMaYRizcGtTTQDpwH3CwExeaWgoGg0xf4QaFPVPGEh9vU2oYYxq+cBPUUGCUqi6sz2BM5ZZsXcHaXRtp1bQFo3oc43c4xhgTEeH+Kb4RsNFIfTLdm5DwZ31PIqlJks/RGGNMZIRbg7oTmCIi9+Bmsd1nhlpVXVbXgRlnzc71LNm6guQmTTnl0BP9DscYYyIm3AT1mvf73yHrgrjOEkFsPqh6M90bFHZs7xGkJjX3ORpjjImccBNUz3qNwlRqS04WX236loT4BMb1HeN3OMYYE1FhJShVXV/fgZj9vbPiQ4LBICN6DKNtSmu/wzHGmIiqMkGJyDagv6puF5Esqpn+3d6DqnvZBXuYu/ZLAM6yKTWMMY1QdTWoW4G93udb6uJkIpKOm1PqJKAAmKqqd4ZsTwbmAveq6ltVlLEU6B6yKgHXw/B4Vf1CRCYBt7FvR45xqjq3Lq4hUt5b+THFgRKO7nIkXVum+x2OMcZEXHUJ6kVVDQCo6gt1dL7pwEKgI+7F33kislxVp4nIQGAqMLy6AlT18NBlEXkVKFbVL7xVg4HrVfWpOoo54vKLC/jgx3kAnG21J2NMI1Xde1DFIrJP052InCgiTQ/kRCIyHOiFSx4FqroWGAV87E0pPwfXS3BD1aXsV+Z4XEL7bcjqIcCiA4kxWsxe/Rm5xfn0a98bad/b73CMMcYX1SWoykYjnYGbA+pADAGWABNFZLOIrAbOVdVMIAPopaqPUM2zrlAi0gw3PuANqprrrUsHOgG3ichWEVkmIr86wHh9UVJawsyVcwA4+7BTfY7GGGP8E/Zo5p6DGUK7LTACmIerSfUDZolIpqpOO4DyrgAyVPXtkHVpXvlPABfgpgV5W0S2qerMg4g9Yj5dP5+d+dl0a5nOoPTDaz7AGGMaqNomqINRCOxR1Yne8mIReRY3U++BJKhf4zpclFPVxbhmwzLzRORF7xxRn6ACwQBvey/mntXvFOLjbFBYY0zjFclvwBVAioiEDiZ3QAlSRLoBA/lphIuy9SeIyI0Vdk/C9RiMegszlrB57xbapbTh+O5D/Q7HGGN8VVOCuFxEcirsf6mIbA/dSVUnh3GuD4Es4CERuRkQXC3omlrEW+YYYJmqZldYnw/cKyKrgPeA0cAl3u+oFgwGmb7cDQo7ru8YmsTb6FHGmMatugS1gf2TxxagYqeDIFBjglLVAhEZCTwOZOJqNfer6hs1HeslyatV9WVvVQ9cx4qK51goIhOA+4H/eNdwuarOr+kcflux/UdW7lhD86QUxvQ63u9wjDHGd1UmKFXtUdcnU9U1wBk17LPfeVU1tcLyA8ADVRz/GhWa/mJB2aCwpx06iuREm9nEGGPsKXwU2JC9mW8zlpCUkMjP+ozyOxxjjIkKlqCiwNvqak8n9TyOlsktfI7GGGOigyUon23P3cnn6xcQHxfPmTLW73CMMSZqWILy2YyVcygNBji222DSUtv7HY4xxkQNS1A+yinMZc6azwE4u98pPkdjjDHRxRKUj2b9OI/CkkKO7NSfHm26+R2OMcZEFUtQPiksKeK9VR8DVnsyxpjKWILyycdrv2BvYQ6923bn8LS+fodjjDFRxxKUD0oDpbyjswFXe4qLO5hB4o0xpmGyBOWDLzd+S1buDtJT0xjW5Si/wzHGmKhkCSrCgsEg01e4QWHP7Hcy8fF2C4wxpjL27Rhhi7csZ332Jlont+TEHsP9DscYY6KWJagIm77ifQBO7zuapIREn6MxxpjoZQkqgn7csY6l21bSLDGZU3qf6Hc4xhgT1SxBRVDZs6eTe59ISlIzn6MxxpjoZgkqQjL2bmX+pkU0iW/CGX2jfoJfY4zxnSWoCHlnxWyCBDmxx3DaNGvldzjGGBP1LEFFwK783cxb9xVxxHFWv5P9DscYY2KCJagIeHflR5QEShja9Ug6t+jodzjGGBMTLEHVs7yifD5Y/QkA5/Q71edojDEmdliCqmcfrv6U/OICDk/ry6HtevgdjjHGxIwmkTyZiKQDU4CTgAJgqqreGbI9GZgL3Kuqb1VTzgagHRD0Vm1WVfG2nQQ8BvQGFgMTVHV13V9NzYpLi3l35UeATalhjDG1Feka1HQgE+gIHANcJiKXAIjIQFxyqnb8HxFpD3QB0lQ11fuRkG1vAXcDrYE3gfdFxJea4ifrvmZXwW66t+rCkZ36+xGCMcbErIjVoERkONALOF5Vi4G1IjIKyBeRvsAc4G9Aeg1FDQFWqWpuJdvOA5aq6hve8gMicj0wBviwDi4jbIFggLfVnfIsm1LDGGNqLZI1iyHAEmCiiGwWkdXAuaqaCWQAvVT1EX5qtqvKYCBeROaLSJaIvC8ih3nb+gPLKuyvwIC6u4zwfLP5ezL3bqNDSluOO2RIpE9vjDExL5LPoNoCI4B5uJpUP2CWiGSq6rRalFMKzAduA3YCdwHviUh/IBXIq7B/HpBykLHXSjAYZPpyNyjsOBlLQnxCJE9vjDENQiQTVCGwR1UnesuLReRZXLNc2AlKVe8PXRaR24Hf4WpoueyfjFKAnAOM+YAsz1rFqp3raJHUnJN6HRfJUxtjTIMRySa+FUCKiCSFrKt1ghSRG0XkhJBVCV45BbjmPalwSD/2b/arV2WDwp7WZxTJTZpG8tTGGNNgRLIG9SGQBTwkIjfjEsmvgWtqWU4PYIKIjAOygfuAVcC3wHrgfhG5ENeD7wYggOsdGBHrszfxXeZSmiYkcVqfUZE6rTHGNDgRq0GpagEwEvf8KROYBdwf0uOuSiKSIyLjvcXbgK+A74BtXnlnqmqpqm4DzgRuxz2f+rm3raiur6cq01e4nnujex1Pi6apkTqtMcY0OBF9UVdV1wBn1LBPj0rWpYZ8LgCu9X4qO/4TYNBBBXqAtuXu4IsN3xAfF884GeNHCMYY02DYUEd1aIbOJhAMcPwhR9OheTu/wzHGmJhmCaqOFJYU8dGazwEb1sgYY+pCRJv4GrouLTrRp11PDmndxe9QjDEm5lmCqiNNmyRx36l/9jsMY4xpMKyJzxhjTFSyBGWMMSYqWYIyxhgTlSxBGWOMiUqWoIwxxkQlS1DGGGOikiUoY4wxUcneg9pXAsCWLVv8jsMYYxqFkO/b/WZ2tQS1r3SA8ePH17SfMcaYupUOrA5dYQlqXwtw09Jn4qaWN8YYU78ScMlpQcUNccFgMPLhGGOMMTWwThLGGGOikiUoY4wxUckSlDHGmKhkCcoYY0xUsgRljDEmKlmCMsYYE5UsQRljjIlKlqCMMcZEJRtJoo6IyJHAU8BAYA1wharu92Z0LBGRK4CngcKQ1deq6gs+hXTARGQYMENV07zlJOAJ4Oe4UUMeVtX/8zHEWqvkmpoCe4GikN2+UNVT/IivNkTkZOBeoA+wDXhAVZ+O5ftUzTXF8n0aB/wN6Im7pvvr8z5ZgqoD3s2ZDjwKnAicD3wgIt1VdY+vwR2cwcBDqnqb34EcKBGJA34NPFhh092AAL2BVsAsEdmsqv+KcIi1Vs01DQB2qmqnyEd14ESkG/AGcBnu/6MhwPsisg4YRQzepxquaQexeZ/SgdeBc1X1PREZDHwuIguAC6iH+2RNfHVjFJCoqo+qarGqvgosBS7yN6yDNgRY5HcQB+lu4BrgrxXWXwb8r6ruUtV1uC/7qyMc24Gq6ppi9X71AKap6puqGvBaHuYCxxO796kHVV9TTN4nVc0EOnjJKR5oB5TgaoP1cp+sBlU3+gPLK6xbgfuLNiaJSAKuuXKCiDwM5AHPAvepaiwN4PiUqt4lIqPKVohIa9zglMtC9oul+7XfNXkGA2ki8j3QEfgEuFFVN0c6wNpQ1U+BT8uWRaQtbtDmF4nR+1TDNZ1GDN4nAFXdKyIpwG5c/rgPyKKe7pPVoOpGKu4LPFQekOJDLHWlA/AN8AKuvfnnuL/ar/EzqNpS1YxKVqd6v0PvWczcryquCSAX+BwYg2tuyQfejFRcdUFEWgFvA18DC73VMXmfylS4punE/n0qAJoDQ4ErgBu89XV+n6wGVTdygWYV1qUAOT7EUidUdQswMmTVIhF5HPd8bbI/UdWZXO936D2L6fsFoKo3hS6LyE1Aloh0U9WNPoUVNhHpi/sCXwaM56f7E7P3qeI1qWoAiOn75F1DEfCNiEwFjvY21fl9shpU3ViG+0soVD/2rfLGFBE5XETurrA6CffXU0xT1V3AFva9ZzF9vwBEZJKIHBayKsn7HfX3TEROxNUw3gJ+rqoFsX6fKrsmb31M3icRGSkiCyusbgrU232yGlTd+BiIE5E/4Lpano97fhNL1faKsoGbRWQT8A9gEHA98Htfo6o7LwJ/8Z4DpAK3AI/5G9JBGwgcLSKXeMuPATNVNcvHmGokIr2BGcD/qOrjFTbH5H2q4Zpi8j7hOnZ08Wp8jwHDcb1Jz8UlqDq/T1aDqgOqWgT8DJeYdgL/A5wTA//BVcl7YHsWrifOHlyX2XtU9XVfA6s7dwE/4HpbLsBd31O+RnTwfo37a/ZHYB2uGWaCnwGF6VqgBfB/IpIT8nMfsXufqrummLxPqrobOB04D/c9NxX4jarOo57uk82oa4wxJipZDcoYY0xUsgRljDEmKlmCMsYYE5UsQRljjIlKlqCMMcZEJUtQxhhjopK9qGsaBRF5HjficlXuxo02/THQQlWjbjgdETkCWAL09EaMrtX2gy3f2ycBN47cL1V15QGcIwicqaozwtj3CWBBLM4/ZuqG1aBMY3EDbsTldNz0KADDQtY9CHzhfc6t5HjjXA8sPpDk5EkHPgxz30nAJBFpd4DnMjHOalCmUfDegt8NICLtvdVZ3qC4oSouG4+IJAO3A6MPtIxK/r2r23ebiMwBrgMmHug5TeyyBGWMx5tfqbyJz2uOuhj3pSy46UcuBW7FDU2zB7hdVV/0jm8BPISbmiQIfATcUNX0GCLSx9v/RNxI0KuAP6vq2972DsDTwClAJvBIheNr2l5tPDUdX4lfANmq+oN3fA9gLW5IrIeBrsBs3JQsDwJneuX+TlU/8I4pb+ITkbnAPOBIL4aNuGnRnw0553+Bf4jI/6pqcQ3xmQbGmviMqd69wI3AMcAhwLe4xDQU9+X5tIiUzS81FZfITsVNVRLETfO93x+C3rTt7+BmIz0GOAr3/Oc5ESkb3fo1oBNwAu5L/08Viqlpe03x1HR8RWcAsypZfw9wCXAyrvn0e1xz6RDgO9xEl1X5E67JbxAuuU0RkdCp0GfjZm4dUkNspgGyBGVM9Z5U1Y9VdRFudOocXC1HcbWGZkBPEemFq2FcoqoLvFrGBNzU36dVUm4z3Bf3daq6QlWX42odbYGO3nQMI4ErVXWRqs4mJIGEsb3aeGo6vgpH4wYDreh/vXN8hptFdpmq/l1VVwBPAt282lxl5qrqk96/5+24Vp2BZRu9KSrW8NOcQ6YRsSY+Y6r3Y8jnPGBdyJT3ZfP3NAW6e59VZJ+pwVJwtZh9eq2pap6ITAEuEZGjgb64KdsBEoAjgEJVDU0I80M+17S9fw3xNKvh+Mp0BLZXsr7iv1HoPqH/RnsrOba8s4Wq7vFiTaywzw4grYbYTANkCcqY6lV87hGoYr8m3r6DcE1poXZW3FlEmuMmsyub7vttXO1sboX94kISYlEl5VS1vaZ4xoRTfgUBIK6S9eH+G1WmsnNWPEcCUFqLMk0DYU18xtSN5bi//Jur6o+q+iOug8ADuNpRRaOAPsAIVf2bqs7E1VDAfUF/j6t1HBVyzOCQzzVtrymemo6vzBagQw371If2WO/KRslqUMbUAVVVEXkb+JeIXAtkAf+L6wCxopJDduCm+r7I6802GHjU29ZUVVeIyLu4HmxX45LJ/RXOV9P2KuNR1ezqjq/CQlyPu4gRkVa45tMFkTyviQ5WgzKm7lyG64r+Fu4LtRVwsqpmV9xRVb/Czbx8L7AMNyPpLbiZVst6rF3sbfsIeAX4e4ViatpeUzw1HV/RTFzHikg6AVd7+i7C5zVRwGbUNcaERURScFOUn6aq30bonK/gegXeE4nzmehiNShjTFhUNQ/3DOvaSJxPRNJxNbYnI3E+E30sQRljauMRYKBU6LteT+4A7lDV/XpBmsbBmviMMcZEJatBGWOMiUqWoIwxxkQlS1DGGGOikiUoY4wxUckSlDHGmKj0/4fu0+Ly6g9IAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(sweep, label='final temp', color='C2')\n", - "decorate(xlabel='Time added (min)',\n", - " ylabel='Final temperature (C)')\n", - "\n", - "savefig('figs/chap16-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the analytic result to compute temperature as a function of time. The following function is similar to `run_simulation`." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "def run_analysis(system):\n", - " \"\"\"Computes temperature using the analytic solution.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " T_env, r = system.T_env, system.r\n", - " \n", - " T_init = system.init.T \n", - " ts = linspace(0, system.t_end)\n", - " \n", - " T_array = T_env + (T_init - T_env) * exp(-r * ts)\n", - " \n", - " # to be consistent with run_simulation,\n", - " # we put the array into a TimeFrame\n", - " return TimeFrame(T_array, index=ts, columns=['T'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it. From the analysis (see `chap16sympy.ipynb`), we have the computed value of `r_coffee2`" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initT 90\n", - "dtype: int64
    r0.0116102
    volume300
    temp90
    t_00
    t_end30
    dt1
    T_env22
    \n", - "
    " - ], - "text/plain": [ - "init T 90\n", - "dtype: int64\n", - "r 0.0116102\n", - "volume 300\n", - "temp 90\n", - "t_0 0\n", - "t_end 30\n", - "dt 1\n", - "T_env 22\n", - "dtype: object" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee2 = 0.011610223142273859\n", - "coffee2 = make_system(T_init=90, r=r_coffee2, volume=300, t_end=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "70.0" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = run_analysis(coffee2)\n", - "T_final_analysis = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can compare to the results from simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "69.99999985860761" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final_simulation = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "They are identical except for a small roundoff error." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.4139239112864743e-07" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T_final_analysis - T_final_simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "## A refrigerator keeps the milk at a constant temperature,\n", - "## so it is like a container with r = 0.\n", - "\n", - "## With r_milk = 0, it is best to add the milk at the beginning." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap17soln.ipynb b/soln/chap17soln.ipynb deleted file mode 100644 index ee8707e9..00000000 --- a/soln/chap17soln.ipynb +++ /dev/null @@ -1,642 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 17\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data\n", - "\n", - "We have data from Pacini and Bergman (1986), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122.." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    glucoseinsulin
    time
    09211
    235026
    4287130
    625185
    824051
    1021649
    1221145
    1420541
    1619635
    1919230
    2217230
    2716327
    3214230
    4212422
    5210515
    629215
    728411
    827710
    92828
    1028111
    122827
    142828
    162858
    182907
    \n", - "
    " - ], - "text/plain": [ - " glucose insulin\n", - "time \n", - "0 92 11\n", - "2 350 26\n", - "4 287 130\n", - "6 251 85\n", - "8 240 51\n", - "10 216 49\n", - "12 211 45\n", - "14 205 41\n", - "16 196 35\n", - "19 192 30\n", - "22 172 30\n", - "27 163 27\n", - "32 142 30\n", - "42 124 22\n", - "52 105 15\n", - "62 92 15\n", - "72 84 11\n", - "82 77 10\n", - "92 82 8\n", - "102 81 11\n", - "122 82 7\n", - "142 82 8\n", - "162 85 8\n", - "182 90 7" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the glucose time series looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de5wU1Zn/8c+AAz8I/pQIAioGNfoEjGgEMYsaWbyS1awJQuINEV0lQjaJYlTU4AUlXhcUIxI1itHlpSHGKD8i0RUj3n6KihrwEeMNFQRkvDEDCMz+caqxppluaqAvNdPf9+s1r5k+Vd31TDH00+fUqfNU1dfXIyIikjatyh2AiIhIY5SgREQklZSgREQklZSgREQklbYpdwDFZmZtgQOAJcD6MocjIiINtQa6Ac+7+5r4hhafoAjJ6clyByEiInkdAsyNN1RCgloCcM8999C1a9dyxyIiIjFLly7lpJNOgui9Oq4SEtR6gK5du7LLLruUOxYREWncJpdgNElCRERSSQlKRERSSQlKRERSSQlKRERSqaSTJMzsGOAqYDdgGXCNu98a3av0ObA2tvvT7n5k9Lyh0fO6AU8Aw919WSljFxGR0ipZgjKzbsAfgR+6+ywz2x94ysyeJ/TkVrr7JvPAzawXcDswCHgBuBqYDgwsVewZc+YtZtqshayoqaNTx3YMG9STAX26lzoMEZGKULIhPndfAnSOklMrYAdgHaHn1Ad4OcdTTwYecve57r4auBA4yMz2LEXcGXPmLWby/fNZXlNHPbC8po7J989nzrzFpQxDRKRilPQalLt/bmbtgTXAbOBmd18E7A/saGavmNlHZna/me0cPa0XsCD2GrXAYmCfUsY+bdZC1nzZcJr+mi/XM23WwlKGISJSMcoxSWI18DXCEkQjzOx0YBXwFHAYYEAd8EC0fwegNus1aoH2JYk2sqKmrkntIiKydUq+koS7byBMhnjBzKYC/+7uP4jvY2bnAMvNrDshebXLepn2wBeliDejU8d2LG8kGXXqmB2aiIgUQsl6UGZ2qJnNy2puC3xiZpebWc9Ye5vo+2rC8J7FXqc9sCuxYb9SGDaoJ22rWzdoa1vdmmGDeuZ4hohIcQ0cOJBHH3203GEUTSl7UC8DO0e9o0nAgcDpwA+BXwJ9zezEaN9JwEx3X25m9wJzzWwA8AwwAXjJ3d8oYewbZ+tpFp+IaEZvaZRyFt+nwPeBHwErganAGe7+BCFR1QBvAu8QhgBPiZ73KjACmAKsAPYGhpQq7rgBfbpzx8VH8pfr/507Lj5Sf5AiFagcM3pnz57NUUcdxYEHHsjYsWP5yU9+wp/+9KcG+2T3pm666SbOPvtsAOrr6/nd737HgAED6NOnD2eccQZLly4F4N1332XkyJH069ePgQMHMnnyZNatWwfA/PnzGTx4MH379uXoo4/mtttu2/j6S5cuZdSoURx44IEcfvjh3HnnnQX/vUt6DcrdXwQObqT9Y+CkPM+bAcwoYmgiIonkm9FbjA+tb7/9NmPGjOGmm26if//+3H777cyYMYOhQ4cmfo377ruPe+65h6lTp7LbbrtxxRVXMHbsWKZMmcKIESM4/PDDmTRpEh999BEjR46kurqas846i4svvpgTTjiBE088EXfnhBNO4KijjmKnnXZi5MiR9O3bl7///e8sWbKEs846i+23357jjjuuYL+7ljoSEWmCUs/onTlzJv379+fQQw/dmDi6dOnSpNd46KGHOPnkk9lrr72orq7mvPPO47zzzmPevHl88sknjBkzhrZt27LrrrsyatQoZswI/YEOHTowZ84c5s6dS48ePXjhhRfo3r07r732Gu+99x4XXHABbdu2pUePHpx22mlMnz69oL97JdSDEhEpmFLP6F22bFmDhFRVVdXk4qsrVqxgp5122vh42223pWfPnjz88MN07tyZ6urqjdt23nlnliwJtQMnTpzIxIkTueCCC/jss88YNGgQl1xyCR988AF1dXV897vf3fi8DRs2sP3222/pr9koJSgRkSYYNqgnk++f32CYr5gzert27cr8+fM3Pq6vr+ejjz7aZL9WrVqxdu1Xy5l+8sknG3/u0qXLxmtOEBLWXXfdxYABA1i2bBlr166lTZsweXrx4sV06tSJdevW8dZbb3H55ZdTXV3NggULGDNmDNOmTaNfv37ssMMOzJ37VYX2lStXsnr16oL+7hriExFpggF9ujN6yL507tiOKqBzx3aMHrJv0SZNHXvssTz77LM8+eSTrFu3jrvuuqtBssno0aMHs2bNoq6ujjfeeINHHnmkwWv84Q9/4O2332bt2rVMnjyZBQsW0Lt3b7p06cL111/PmjVreO+997jllls49thjad26NWPH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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the insulin time series." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the book, I put them in a single figure, using `subplot`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap17-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "subplot(2, 1, 1)\n", - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interpolation\n", - "\n", - "We have measurements of insulin concentration at discrete points in time, but we need to estimate it at intervening points. We'll use `interpolate`, which takes a `Series` and returns a function:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `interpolate` is a function." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ".wrapper(x)>" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the result, `I`, to estimate the insulin level at any point in time." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/plain": [ - "68.0" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`I` can also take an array of time and return an array of estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.ndarray" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)\n", - "ts = linrange(t_0, t_end, endpoint=True)\n", - "I(ts)\n", - "type(ts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the interpolated values look like." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap17-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXxU1fn48c9kmUAWCEmAsEhYxEdRIoggalEBEZQKaN0QFevXFpWq/bm8SitVoSK2irsoautWROsGCgoIguIKyibbAWVfAiSBkJBlsszvjzszTEKWmeQmMyHP+/XKK8m9d+59chny5Jzz3HMcbrcbpZRSKtxEhDoApZRSqjKaoJRSSoUlTVBKKaXCkiYopZRSYSkq1AE0NBGJAfoC+4DSEIejlFJNXSTQDlhhjCny39HkEhRWcloW6iCUUkqVMwD42n9DU0xQ+wBmzpxJampqqGNRSqkmLSMjgzFjxoDnd7O/ppigSgFSU1Pp2LFjqGNRSillOW7IRYsklFJKhSVNUEoppcKSJiillFJhSROUUkqpsKQJSimlVFhqilV89WLZjuXMWjuHrPxskmOTGJ0+kgFp/UIdllJKNVqaoGywbMdyZqyYSZ4rl6LSAtzAjBUzATRJKaVULWkXnw1mrZ2Dq9TFd3sWsmDr/ygsycdV6mLW2jmhDk0ppRotTVA2yMrPBiC/JA83ZeQX55XbrpRSKniaoGyQHJsEgNtdBkBJWXG57Uop1ViVlpayb99xsxA1CE1QNhidPhJnpJMyvwTljHQyOn1kiCNTStWnvXv30rt3b3Jzc+vtGjfeeCOvv/46ALfeeiszZ86s8zk//PBDRo4M7PfTPffcw4IFC+p8zdrQIgkbeAshPjSvAtA8OoZxfcdogYRSIdJQVbXt27dn1apVtp+3Kq+++mqDXcsrOzt0QxXagrLJgLR+NIuKAeCaM4ZrclIqRLxVtZn52biBzPxsZqyYybIdy22/1u7duxERjhw5wu7du+nduzevvfYav/nNbzj33HN56KGHKCuzelaWLl3K8OHDOfvss7n88suZPXv2cefw8m81+fPffuONN/LUU09xxRVXcNZZZ3H99dfz66+/Vhrn4cOHufPOOznrrLMYNmwY69at8+1zu908//zzXHrppfTu3ZsLLrjAd40pU6bw448/8sQTTzB58mQA3n77bS6//HL69OnDueeey+OPP17X21glbUHZqNgz9pTnygtxJEo1Xd6qWn/eqtr6/sMxPz8fYwyLFi1i69atjBkzhkGDBjFgwADuu+8+pk2bxoUXXsi3337LXXfdxZAhQ+p0vdmzZ/P666/TunVr7r77bp577jmefvrp44578MEHcblcfPXVV2RlZXHLLbcQHx8PwNy5c5kzZw7//e9/adOmDV988QV33nknl112GQ888ACbNm1i8ODB3HzzzaxcuZKnn36aWbNm0a1bN9auXcv111/P0KFDSU9Pr9PPUhltQdmouFQTlFKhVlX1bENV1f7xj3+kWbNm9OjRAxFh586dREREEBcXx7x58/jxxx/p168fy5cvJy4urk7XGjFiBF26dCE+Pp6hQ4eyc+fO444pKiryJZ34+HjS0tK48cYbffsHDhzIzJkzadu2LZmZmURHR1NaWlpp195pp53G7Nmz6datG4cOHaKwsJC4uDgOHDhQp5+jKtqCspH3rzZNUEqFTnJsEpmVJKOGqqpNSUnxfe39ZQ/wn//8h+eee4477riD0tJSfve733H//ffX6VrJycm+r6OionzX8nf48GGKi4vLLdDqvxZeSUkJU6dO5dtvv6VNmza+lpDb7T7uXJGRkcyYMYMFCxbQqlUrevTo4evCrA+aoGxSWlaKG+sfVBOUUqEzOn0kM1bMLNfNF+qq2oKCAg4cOMDTTz9NWVkZK1eu5K677uL000+nXz+r27G4uNh3/OHDh227dqtWrXA6nezdu9eXPPfv3+/b/+STT1JUVMSXX35Js2bNyMnJ4f3336/0XK+99hobNmxg4cKFtGjRArfbTd++fW2LtSLt4rOJd/wJINdVfyWnSqnqDUjrx7i+Y0iJTcIBpMQmhbyqtrS0lNtvv5158+bhcDhITU3F4XCQmJhIcnIyCQkJzJ49m9LSUj777LMqix1qw+l08tvf/pann36anJwcdu/ezZtvvunbn5ubS0xMDJGRkeTk5PDoo48CxxKm0+kkLy/Pd2x0dDRRUVEUFBTw5JNPkpubi8vlOv7CNtAWlE2840+gLSilQm1AWr+wqqSNj4/n2Wef5YknnmDixInEx8czZswYLrzwQgAeffRRpk2bxgsvvMDAgQPrXDxR0cSJE3n44YcZOHAgiYmJXHzxxfzwww8A3H333UyYMIF+/fqRkJDAZZddhoiwefNm0tPTufzyy5k8eTLbtm3jgQceYOPGjZx//vnExsZywQUXcP7557NlyxZb4/VyVNbPeCITkc7AtsWLF5frh62rrPwsUh63ms9Dug5h4Y0LbTu3UkqdqHbv3s3gwYMBuhhjtvvv0y4+m/h38WkLSiml6i4suvhEpB8w1xjTxvN9G+AZYDDgAD4D7jbGHPLsvwZ4FGgHfAncbIypnzrHAGkXn1JK2SukLSgRcYjIrcBCwOm361WgBOgCdAdaAS94XtMD+DdwM5AMbAHeabioK6ctKKWUsleou/gmAbcDj3g3iEgEUAZMMsYcNcYcBl4BfuM55AbgE2PM18aYQuCvwPki0r1hQy/Pv6RVE5RSStVdqBPUS8aYPsCP3g3GmDJjzChjzC9+x40CvDMy9gA2+B2fD+wCejZAvFXSLj6llLJXSMegjDF7azpGRO7DSlDneTbFA/kVDssHYu2NLjj+XXwFJQWUlpUSGREZwoiUUqpxC4siicqISDTwHHA5MMgYs8mz6yjQvMLhsUBImy3+LSiAo8VHaRHTIkTRKKVU4xeWCUpEEoBPgASgnzFmj9/uDYD4HRsLdMKv2y8U/FtQALlFuZqglFKqDkI9BlWVd7BiG1AhOQG8DYwUkYtEJAaYCqwyxmxu6CD9VZzeX8ehlFIV7dq1K9QhVKuwsJDMzMxQh+ETdglKRNKBy4B+wAERyfN87AYwxvwM3AK8BGQCpwNXhyper4pdfJqglGoaAl32febMmTz22GMNFNUx3hnUA3HDDTewevXqWl1nwoQJTJkypVavrUpYdPEZY5YCiZ6v12I9nFvd8R8AH9R/ZIGr2MWnCUqppiHQZd+zs7MrXcIinIRyeffKhF0LqrHSFpRSTZN3yfaNGzdWueT7ggULmDFjBkuXLmXEiBEAZGRkMH78eM455xwuvvjicku8T5gwgT//+c8MGjSIoUOHsn37dnr27Mkrr7zCOeecw3nnncfLL7/sOz4zM5P77ruP/v37M2DAAB555BEKCgqOi9XlcvHII49wySWX0KtXL4YMGcK8efMAGD9+PHv37uWee+7hlVdeAWDx4sWMGDGCs88+m+uuu44NG44N9W/YsIGrr76aXr16ccstt9RLcguLFtSJQMeglKo/w98ezqdbPm2w613W/TLmXT8v6NdVteT70KFD2bx5Mxs3bmT69OmUlpZy2223cfbZZ/PVV1+xb98+xo0bR2JiIqNGjQLg+++/56OPPiI+Pp6cnBxcLherV69m8eLF7Nmzh9///vd06NCB4cOH86c//YnU1FQWLVpEYWEhd999N1OnTmXy5Mnl4vvPf/7DunXreO+990hISGDmzJk8+OCDDB06lBdeeIFBgwbxt7/9jYsvvpiff/6Z++67j+nTp9O3b1/mzZvHLbfcwsKFC2nWrBm3334711xzDW+//Tbff/89t912G2lpabbcfy9tQdlEu/iUUlD5ku8VrVu3jp07dzJhwgRiYmLo3Lkzv//973nnnWOztvXr14927dqRkJDg2/a3v/2N+Ph4RISrr76auXPnsnPnTlatWuVbxiMlJYX777+fjz766LjVbq+77jqmT59OixYtOHDgAM2bNycvL6/S1tb777/PiBEjOPfcc4mKimLkyJGkpaUxf/58fvrpJ/Lz87ntttuIjo5mwIABvqVD7KQtKJtoF59S9ac2rZlQqWrJd3979uyhoKCA/v37+7aVlZWRmJjo+75NmzblXhMVFUWHDh1836empvLtt9+SlZWF0+ksd90OHTrgcrnIysoqd468vDwmT57MmjVr6NChA126dAEqX9597969/PDDD74uQLCWh9+7dy/NmzcnJSWFyMhjkxF07NjR9jE2TVA20RaUUipQbdq0ITk5ma+//tq3LTs7m8LCQt/3Dkf5WrGSkhKysrJITk4GrATSrl072rdvj8vl4uDBg7Ru3Rqwytmjo6Np2bJluXM89NBDpKWlMX36dKKiotiwYQNz586tMsaxY8dy7733+rZt376dlJQU1q9fz4EDBygpKSEqykoj+/fvPy6p1pV28dlEx6CUUtVxOp2+UvT09HTi4+OZPn06LpeL7Oxs7rjjDp599tlqz/HEE09QVFTExo0bee+99xg1ahRt27bl3HPP5dFHHyUvL4/MzEymTZvG0KFDcTqd5V7vXd49IiKCAwcOMG3aNODY8u7R0dG+GEeNGsX777/PmjVrcLvdfPfdd4wYMYJ169bRp08fkpOTefbZZ3G5XHz//fcsXrzY7lumCcou3i6+SIfV5M11Vf9MhFKqabnooovYsWMHF154IU6nk5dffpm1a9cyYMAALrvsMk4++WQefPDBas+RmJjIoEGDuP3227n77rsZNGgQYCWuiIgIhgwZwvDh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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(data.insulin, 'go', label='insulin data')\n", - "plot(ts, I(ts), color='green', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** [Read the documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html) of `scipy.interpolate.interp1d`. Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "I = interpolate(data.insulin, kind='cubic')\n", - "plot(data.insulin, 'go', label='insulin data')\n", - "plot(ts, I(ts), color='green', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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QZnPqSpLUFXgm6CsBWVMaCQnxZNRRjIKxIza9PR0WrRoUfw4IiKiWoVPMzMzadWqVfHjBg0a0KVLyQlWu3fvplmzZsTExBRva926NTt2uDp+Tz/9NE8//TR33nkn+/fvZ+jQodx3331s27aNnJwc+vTpU/y8wsJCGjduXGYcycnJREVFFW9r06YNRUVFxb/vI488wg8//ECHDh1ITk4u3lfawYMHmTRpEqtWraJ169Z07NgRoNzjq8MWi60Ca0EZE3qjhnYhLiaqxLZAzaht2bJl8VgRuA/fXbt2lXlsZGQkeXlHlxPdu3dv8f0WLVqUeJ3MzEyefPJJCgsLi7elpKSQnp5e4jW2bNlCcnIyR44cYf369UyaNIkFCxYwc+ZM1qxZw/Tp02nevDlNmzZl6dKlxbcvvviCN99885gYmzdvTnp6eoluON/f549//CMDBw7km2++4Z///OcxLTBfEydOpE2bNixcuJD33nuP6667rtxjq8sSVBXYGJQxoTcotS3jhp9Js6R4IoBmSfGMG35mQCYtXXTRRSxatIj58+dz5MgR3njjjRKJxleHDh2YM2cOOTk5rFu3js8++6zE67z55pts2LCBvLw8pkyZwtq1a4mMPPoRfMYZZ9CiRQuefPJJcnNz2bx5M3/729+46KKLiIqK4u677+b111+noKCAli1bEhkZSaNGjTjjjDNITEzkhRdeIC8vjz179nDLLbfw7LPPHhNjamoqTZs25dlnnyUvL49FixYxd+7c4v0HDx6kXr16REZGsmnTJl544QXyfb6Zx8TEcODAAQAOHDhAXFwckZGRpKen8+STTwKUOP54WYKqAuviMyY8DEpty6v3DuHDJy/h1XuHBGxGbdu2bZk8eTITJ06kX79+/PTTT7Rq1apEN5zXHXfcQUZGBv369eP+++/n8ssvL953+eWXc9VVV3HdddfRr18/du7cyeTJk0s8PyYmhqlTp7JhwwYGDBjAb37zG84//3x+//vfExERwTPPPMMXX3xBr169GDZsGH369OHKK68kNjaWadOmsXr1agYMGMCwYcM4+eSTuf/++4+JMTo6mqlTp7Js2TJ69+7NX//6V84777zi/Q8//DBvvvkmPXr04IYbbuDiiy8mPz+fLVvcDMkrrriC3/3ud7z11lvcc889LFiwgNTUVK666ip69epFUlIS69bV3BVAETXZXxiORKQDsGHu3Lm0adPmuF7rpZfghhvc/SFDwOcLkjGmFtq+fTvZ2dmcfPLJxdv69evHX/7yF/r37x/CyGqPrVu3epNkR1Xd6LvPWlBVYF18xtQt6enpjBo1ii1btlBUVMTMmTPJy8uje/fuoQ6tTrBZfFVgXXzG1C3du3fnhhtu4Le//S379u3jpJNO4sUXXyQxMTHUodUJlqCqwGbxGVP3jB49mtGjR4c6jDrJuviqwDdBHTwIubmhi8UYY2o7S1BVUHoFD+vmM8aYwLEEVQWlp/dbgjLGmMCxBFUFlqCMMSZ4LEFVQekEZRMljDEmcCxBVYGNQRljKuJdcSFcHT58mMwT6Ju1Jagq8Lag6td3P0+gf2djTDVt376dHj16FK9BV54ZM2bw6KOPBimqo3wLI1Zm5MiRrFy5slrvU5XS8DXFElQVeBOUd7V9a0EZU/u1atWKFStWVFrjaM+ePTVaaiIQgl2y/XhZgqoCb4JKSXE/LUEZU/tt3boVESEtLY0ePXrw2muv0b9/f/r27cvEiRMpLCzks88+Y+rUqcybN4+LL74YqLgM+5133skf/vAHBg8ezAUXXMDGjRs5/fTTeemllzj77LPp168f06ZNKz4+MzOTCRMm0KdPHwYMGMBDDz1ETs6xNbEqKsM+duxYtm/fzvjx43nppZcAmDt3LhdffDFnnXUWV111FWvXri1+rYpKwweLJagq8I5BeVtQ1sVnTM248EKIiAjO7cILqx9ndnY2qsoXX3zBK6+8wocffsj8+fO54IILuPHGGxk0aBAffvihX2XYFy1axIwZM4or4ebl5bFy5Urmzp3La6+9xuuvv16cXMaNG8eRI0f44osveP/990lLSztmNXSgwjLszz//PK1ateKpp57id7/7HWvWrGHChAncddddLFq0iF//+teMGTOG/fv3V1oaPlgsQVWBdfEZY2644Qbq1atH165dERE2b958zDHffvstmzdv5s477yQuLq5EGXav3r17k5KSUqLr8O677yYxMRERYfjw4Xz88cds3ryZFStWcO+995KYmEhycjK3334777//fomCh+DKsL/wwgvFpdp9y7CX9s4773DxxRfTt29foqOjueSSS2jfvj2ffvppidLwMTExx5SGDxZbi68KLEEZExiehsIJITk5ufh+TEwMBQUFxxzjTxn25s2bl3hO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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "G = interpolate(data.glucose)\n", - "plot(data.glucose, 'bo', label='gluciose data')\n", - "plot(ts, G(ts), color='blue', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def interpolate(series, **options):\n", - " \"\"\"Creates an interpolation function.\n", - "\n", - " series: Series object\n", - " options: any legal options to scipy.interpolate.interp1d\n", - "\n", - " returns: function that maps from the index of the series to values\n", - " \"\"\"\n", - " if has_nan(series.index):\n", - " msg = \"\"\"The Series you passed to interpolate contains\n", - " NaN values in the index, which would result in\n", - " undefined behavior. So I'm putting a stop to that.\"\"\"\n", - " raise ValueError(msg)\n", - "\n", - " if not is_strictly_increasing(series.index):\n", - " msg = \"\"\"The Series you passed to interpolate has an index\n", - " that is not strictly increasing, which would result in\n", - " undefined behavior. So I'm putting a stop to that.\"\"\"\n", - " raise ValueError(msg)\n", - "\n", - " # make the interpolate function extrapolate past the ends of\n", - " # the range, unless `options` already specifies a value for `fill_value`\n", - " underride(options, fill_value='extrapolate')\n", - "\n", - " # call interp1d, which returns a new function object\n", - " x = magnitudes(series.index)\n", - " y = magnitudes(series.values)\n", - " interp_func = interp1d(x, y, **options)\n", - " units = get_units(series.values[0])\n", - "\n", - " def wrapper(x):\n", - " return interp_func(magnitudes(x)) * units\n", - " return wrapper\n", - "\n" - ] - } - ], - "source": [ - "source_code(interpolate)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap18soln.ipynb b/soln/chap18soln.ipynb deleted file mode 100644 index 85d815f1..00000000 --- a/soln/chap18soln.ipynb +++ /dev/null @@ -1,1981 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 18\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ".wrapper(x)>" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The glucose minimal model\n", - "\n", - "I'll cheat by starting with parameters that fit the data roughly; then we'll see how to improve them." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290.00000
    k10.03000
    k20.02000
    k30.00001
    \n", - "
    " - ], - "text/plain": [ - "G0 290.00000\n", - "k1 0.03000\n", - "k2 0.02000\n", - "k3 0.00001\n", - "dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(G0 = 290,\n", - " k1 = 0.03,\n", - " k2 = 0.02,\n", - " k3 = 1e-05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `make_system` that takes the parameters and data:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object with the given parameters.\n", - " \n", - " params: sequence of G0, k1, k2, k3\n", - " data: DataFrame with `glucose` and `insulin`\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " G0, k1, k2, k3 = params\n", - " \n", - " Gb = data.glucose[0]\n", - " Ib = data.insulin[0]\n", - " I = interpolate(data.insulin)\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " init = State(G=G0, X=0)\n", - " \n", - " return System(params,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290
    k10.03
    k20.02
    k31e-05
    initG 290.0\n", - "X 0.0\n", - "dtype: float64
    Gb92
    Ib11
    I<function interpolate.<locals>.wrapper at 0x7f...
    t_00
    t_end182
    dt2
    \n", - "
    " - ], - "text/plain": [ - "G0 290\n", - "k1 0.03\n", - "k2 0.02\n", - "k3 1e-05\n", - "init G 290.0\n", - "X 0.0\n", - "dtype: float64\n", - "Gb 92\n", - "Ib 11\n", - "I .wrapper at 0x7f...\n", - "t_0 0\n", - "t_end 182\n", - "dt 2\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the update function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Updates the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " dt = system.dt\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " G += dGdt * dt\n", - " X += dXdt * dt\n", - "\n", - " return State(G=G, X=X)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before running the simulation, it is always a good idea to test the update function using the initial conditions. In this case we can veryify that the results are at least qualitatively correct." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G278.12
    X0.00
    \n", - "
    " - ], - "text/plain": [ - "G 278.12\n", - "X 0.00\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update_func(system.init, system.t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` is pretty much the same as it always is." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are in a `TimeFrame` object with one column per state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    0290.0000000.000000
    2278.1200000.000000
    4266.9528000.000300
    6256.2954600.002668
    8245.0701400.004041
    10233.9051380.004680
    12223.2016510.005252
    14212.9848440.005722
    16203.2882070.006093
    18194.1334610.006330
    20185.5478350.006490
    22177.5266060.006610
    24170.0480140.006726
    26163.0776970.006813
    28156.5909970.006872
    30150.5632550.006929
    32144.9628290.007008
    34139.7531910.007108
    36134.9012940.007172
    38130.3923020.007201
    40126.2109250.007197
    42122.3416650.007161
    44118.7690290.007094
    46115.4776980.007003
    48112.4517430.006887
    50109.6758360.006747
    52107.1353080.006585
    54104.8161800.006402
    56102.7051920.006226
    58100.7840580.006057
    .........
    12486.3906940.001095
    12686.5381020.000973
    12886.6974210.000858
    13086.8667970.000750
    13287.0445390.000648
    13487.2291050.000552
    13687.4190900.000462
    13887.6132150.000377
    14087.8103140.000298
    14288.0093280.000224
    14488.2092960.000155
    14688.4093430.000089
    14888.6090330.000026
    15088.807970-0.000036
    15289.005799-0.000094
    15489.202200-0.000150
    15689.396887-0.000204
    15889.589604-0.000256
    16089.780123-0.000306
    16289.968242-0.000354
    16490.153784-0.000400
    16690.336592-0.000446
    16890.516892-0.000492
    17090.694895-0.000538
    17290.870797-0.000585
    17491.044781-0.000631
    17691.217018-0.000678
    17891.387668-0.000725
    18091.556880-0.000772
    18291.724792-0.000819
    \n", - "

    92 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " G X\n", - "0 290.000000 0.000000\n", - "2 278.120000 0.000000\n", - "4 266.952800 0.000300\n", - "6 256.295460 0.002668\n", - "8 245.070140 0.004041\n", - "10 233.905138 0.004680\n", - "12 223.201651 0.005252\n", - "14 212.984844 0.005722\n", - "16 203.288207 0.006093\n", - "18 194.133461 0.006330\n", - "20 185.547835 0.006490\n", - "22 177.526606 0.006610\n", - "24 170.048014 0.006726\n", - "26 163.077697 0.006813\n", - "28 156.590997 0.006872\n", - "30 150.563255 0.006929\n", - "32 144.962829 0.007008\n", - "34 139.753191 0.007108\n", - "36 134.901294 0.007172\n", - "38 130.392302 0.007201\n", - "40 126.210925 0.007197\n", - "42 122.341665 0.007161\n", - "44 118.769029 0.007094\n", - "46 115.477698 0.007003\n", - "48 112.451743 0.006887\n", - "50 109.675836 0.006747\n", - "52 107.135308 0.006585\n", - "54 104.816180 0.006402\n", - "56 102.705192 0.006226\n", - "58 100.784058 0.006057\n", - ".. ... ...\n", - "124 86.390694 0.001095\n", - "126 86.538102 0.000973\n", - "128 86.697421 0.000858\n", - "130 86.866797 0.000750\n", - "132 87.044539 0.000648\n", - "134 87.229105 0.000552\n", - "136 87.419090 0.000462\n", - "138 87.613215 0.000377\n", - "140 87.810314 0.000298\n", - "142 88.009328 0.000224\n", - "144 88.209296 0.000155\n", - "146 88.409343 0.000089\n", - "148 88.609033 0.000026\n", - "150 88.807970 -0.000036\n", - "152 89.005799 -0.000094\n", - "154 89.202200 -0.000150\n", - "156 89.396887 -0.000204\n", - "158 89.589604 -0.000256\n", - "160 89.780123 -0.000306\n", - "162 89.968242 -0.000354\n", - "164 90.153784 -0.000400\n", - "166 90.336592 -0.000446\n", - "168 90.516892 -0.000492\n", - "170 90.694895 -0.000538\n", - "172 90.870797 -0.000585\n", - "174 91.044781 -0.000631\n", - "176 91.217018 -0.000678\n", - "178 91.387668 -0.000725\n", - "180 91.556880 -0.000772\n", - "182 91.724792 -0.000819\n", - "\n", - "[92 rows x 2 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following plot shows the results of the simulation along with the actual glucose data." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap18-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "subplot(2, 1, 1)\n", - "\n", - "plot(results.G, 'b-', label='simulation')\n", - "plot(data.glucose, 'bo', label='glucose data')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "\n", - "plot(results.X, 'C1', label='remote insulin')\n", - "\n", - "decorate(xlabel='Time (min)', \n", - " ylabel='Concentration (arbitrary units)')\n", - "\n", - "savefig('figs/chap18-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Numerical solution\n", - "\n", - "Now let's solve the differential equation numerically using `run_ode_solver`, which is an implementation of Ralston's method.\n", - "\n", - "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations.\n", - "\n", - "We don't have to do the update part; the solver does it for us." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: derivatives of G and X\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-5.9399999999999995, 0.0)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run the ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details = run_ode_solver(system, slope_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`details` is a `ModSimSeries` object with information about how the solver worked." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    0290.0000000.000000
    2278.4764000.000150
    4267.4644650.001478
    6255.8989560.003303
    8244.4239820.004284
    10233.4209320.004880
    12222.9053050.005393
    14212.9094460.005808
    16203.4541110.006108
    18194.5660030.006306
    20186.2402560.006439
    22178.4587570.006559
    24171.1850700.006662
    26164.3959330.006738
    28158.0677720.006793
    30152.1717310.006864
    32146.6703660.006956
    34141.5317250.007040
    36136.7418330.007089
    38132.2857740.007105
    40128.1484000.007088
    42124.3145280.007042
    44120.7691070.006967
    46117.4964270.006868
    48114.4813550.006746
    50111.7093520.006601
    52109.1665240.006434
    54106.8396400.006260
    56104.7104080.006093
    58102.7623180.005932
    .........
    12486.9661710.001074
    12687.0883350.000957
    12887.2224280.000846
    13087.3667040.000741
    13287.5195690.000642
    13487.6795640.000549
    13687.8453550.000462
    13888.0157220.000381
    14088.1895500.000304
    14288.3658240.000232
    14488.5436160.000164
    14688.7224280.000099
    14888.9017960.000036
    15089.081302-0.000024
    15289.260563-0.000082
    15489.439233-0.000137
    15689.617001-0.000191
    15889.793584-0.000242
    16089.968729-0.000291
    16290.142209-0.000339
    16490.313821-0.000385
    16690.483737-0.000432
    16890.652108-0.000479
    17090.819076-0.000526
    17290.984773-0.000573
    17491.149324-0.000620
    17691.312844-0.000667
    17891.475442-0.000714
    18091.637217-0.000762
    18291.798265-0.000809
    \n", - "

    92 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " G X\n", - "0 290.000000 0.000000\n", - "2 278.476400 0.000150\n", - "4 267.464465 0.001478\n", - "6 255.898956 0.003303\n", - "8 244.423982 0.004284\n", - "10 233.420932 0.004880\n", - "12 222.905305 0.005393\n", - "14 212.909446 0.005808\n", - "16 203.454111 0.006108\n", - "18 194.566003 0.006306\n", - "20 186.240256 0.006439\n", - "22 178.458757 0.006559\n", - "24 171.185070 0.006662\n", - "26 164.395933 0.006738\n", - "28 158.067772 0.006793\n", - "30 152.171731 0.006864\n", - "32 146.670366 0.006956\n", - "34 141.531725 0.007040\n", - "36 136.741833 0.007089\n", - "38 132.285774 0.007105\n", - "40 128.148400 0.007088\n", - "42 124.314528 0.007042\n", - "44 120.769107 0.006967\n", - "46 117.496427 0.006868\n", - "48 114.481355 0.006746\n", - "50 111.709352 0.006601\n", - "52 109.166524 0.006434\n", - "54 106.839640 0.006260\n", - "56 104.710408 0.006093\n", - "58 102.762318 0.005932\n", - ".. ... ...\n", - "124 86.966171 0.001074\n", - "126 87.088335 0.000957\n", - "128 87.222428 0.000846\n", - "130 87.366704 0.000741\n", - "132 87.519569 0.000642\n", - "134 87.679564 0.000549\n", - "136 87.845355 0.000462\n", - "138 88.015722 0.000381\n", - "140 88.189550 0.000304\n", - "142 88.365824 0.000232\n", - "144 88.543616 0.000164\n", - "146 88.722428 0.000099\n", - "148 88.901796 0.000036\n", - "150 89.081302 -0.000024\n", - "152 89.260563 -0.000082\n", - "154 89.439233 -0.000137\n", - "156 89.617001 -0.000191\n", - "158 89.793584 -0.000242\n", - "160 89.968729 -0.000291\n", - "162 90.142209 -0.000339\n", - "164 90.313821 -0.000385\n", - "166 90.483737 -0.000432\n", - "168 90.652108 -0.000479\n", - "170 90.819076 -0.000526\n", - "172 90.984773 -0.000573\n", - "174 91.149324 -0.000620\n", - "176 91.312844 -0.000667\n", - "178 91.475442 -0.000714\n", - "180 91.637217 -0.000762\n", - "182 91.798265 -0.000809\n", - "\n", - "[92 rows x 2 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap18-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXxU1d3H8c/s2QmEBAhbEMiByL6vSkFFxK11qYoFq60LLvXx6aK1dWlV1FYe11Zt1boh1WpVpIKKrLLLKsthh4SQkITsyWQyM/f54w5pQEgGSHIn4fd+veblzF2/GSQ/zr3nnmMzDAMhhBAi0titDiCEEEKciBQoIYQQEUkKlBBCiIgkBUoIIUREkgIlhBAiIkmBEkIIEZGcTXkypdSlwBNAN+Aw8LTW+hWllBt4EbgaCAAztdYzau13bWi/DsBi4Cat9eGmzC6EEKJpNVkLSinVAfgX8ButdTxwDfCsUmoQ8CiggO7AUGCaUmpqaL8M4DXgJiAJ2AnMbqrcQgghrNFkBUprfQhI1lp/rpSyYxYbP1AKTAMe11oXaq33AX8GbgvteiMwR2u9TGvtBR4ARiulejZVdiGEEE2vSS/xaa1LlVIxQHHo3E8BeZiX7rbW2nQ70Df0PgNYW+sYFUqpzND6nfWdUynlwWyVHcK8fCiEECJyODBrwBqtdVXtFU1aoEK8QCzQD/gPUBlaXlFrmwogJvQ+7rh1x6+vz1Bg6WklFUII0VTGAstqL2jyAqW1DgI+YK1S6lVgSGhVdK3NYoCy0Pvy49Ydv74+hwDeffdd2rdvf1qZhRBCNI6cnBymTJkCod/VtTVZgVJKnY/ZO29wrcUeoBDIwewkcTC0vBf/veS3NbTu6HFigC4ce0mwLgGA9u3b06lTp9POL4QQolF97xZMU7agNgAdlVL3Ac8Bw4FbgB9iFqiHlVKbMC/p/TK0DcAsYJlSahywApgBrNda72jC7EIIIZpYU/biKwYuAX4EHAFeBX6mtV4MPAR8B2wB1gAfAi+H9tsM3Bz6nA+ci9lFXQghRAvW1L341gFjTrDcC9wZep1ovw8xi5YQQoizhAx1JIQQIiJJgRJCCBGRpEDVo9ofpLisqv4NhRBCNCgpUPV46cN13Pzsu3x3INPqKEIIcVaRAlWPPSzH0XMN/9qw0OooQghxVpECVY8RXfoDsLNku8VJhBDi7CIFqh6XDhiGEXBQ7SpkR0621XGEEOK0eb1e8vPzrY4RNilQ9UiIjiYx2BmAORu/sTiNEKI5mzx5MgsXNuztghdeeIHp06eHte2NN97Ihg0bAPj000+57rrrGjRLQ7NiNPNmZ1CHfizM38fm/C3IIBZCiNM1d+5cS89/5MiRmveXX345l19+uYVp6icFKgxXDBzB1/PnUO7IJbekkHYJra2OJEREevTvK1m7LbfJzjekdzse/tmIsLbNysrisssuY/LkycybN4+oqCgmTZrEgw8+CMCqVau48847Wbt2LatWreIPf/gD559/Ph9++CEej4drrrmGu+++u97z7N+/nwcffJDt27eTmJjIhRdeyK9+9Svsdjvjx4/nt7/9LRdccAHjx49n2rRpzJo1i9zcXCZOnMhVV13Fo48+SnZ2NuPHj+fpp5/G4XAcsx+YraZt27bxl7/85Zhz+3w+nn76aZYsWcLhw4dJTk7m3nvvZfLkydx5551kZ2dz3333cffdd5OUlMSbb77JJ598AsDbb7/Nm2++SVFREb179+bBBx+kV69eNd/bPffcw2uvvUYgEOCiiy7i4Ycfxm5v3ItwcokvDKltWhNd3Q6jKobl23dbHUcIcZoqKipo06YNy5cvZ9CgQXVuu2vXLlwuF8uWLeOJJ57gpZdeYvfu+v/+z5gxg4EDB7J69Wrefvtt5s6dy9q1a0+47b/+9S/ee+895s6dy7x583jyySd58803+eyzz1i6dCmLFy8+pZ/v9ddf57vvvuODDz5g3bp1TJ06lYceegi/389LL71EamoqM2fO5Oc///kx+73//vu88sorPP/886xYsYJx48Zxyy23UFJSApjfm9aar776itdee41PP/2UpUsbf5o9aUGF6eIOV/HevF3s99hhmNVphIhM4bZmrHTZZZfhdruJial7zlObzcb06dNxuVyMGTOG5ORk9u/fT/fu3evcLy4ujtWrV/P1118zYsQIFi1adNKWxtSpU2nTpg0AXbp04fLLL6dt27YA9OzZk6ysrFP62a677jquvfZaEhISyM3NJTo6mrKyMiorK4mPjz/pfh9//DFTp04lIyMDgFtuuYUPPviARYsW1RTyW2+9laioKDIyMlBKceDAgVPKdjqkBRWmMX27ADbWbM0lEDSsjiOEOE0pKSlhbRcXF4fH46n57HK5CAaD9e73yCOP0LdvX5544gmGDx/O9OnTOXz48Am3TUxMrHlvt9tJSEg45nM456utrKyM+++/nxEjRjB9+nRWrFgBgGHU/TuroKCAjh07HrOsY8eO5OTk1Hw+WjjB/C4Cge9N39TgpECFqXO7eDq0jaW0upjl23daHUcIcZpsNhtgFoDq6uqa5UVFRQ1y/O3bt3PPPffw9ddfM2fOHEpLS3nuuedOuO3RLPWx2+34fL56sz788MN06tSJb775ho8++ohbbrklrOOnpqZy8ODBY5ZlZWWRlJQU1v6NRQpUmGw2G51UIVEDFvOvrZ9ZHUcIcYbS0tJYsmQJeXl5FBYW8s477zTIcWfOnMnzzz+Pz+ejXbt2uFwuWrVqdcZZP//8cyorK9mxYwfz588/4XalpaV4PB7sdjuHDx/mmWeeAagpxC6Xi9LS0u/td+WVV/LWW2+xbds2qquree211zhy5Ajjxo07o9xnSgrUKThfmaNKHKreS5XfV8/WQohIdv3119OvXz8mTZrEj3/8Yy6++OIGOe6TTz7J7t27GTVqFOPGjSM5OTns55RO5je/+Q15eXmMGjWKhx56iKuuuuqE2z344IMsW7aMwYMHc9111zF06FBat27Njh3mBOQ/+tGPePTRR5k5c+Yx+11xxRX87Gc/45577mHYsGE1nSGsbkHZ6rs22dwppdKAvQsWLKBTp05ndKxAIMgNbz+AEV3CTedO45I+kX9DWAghIllWVhYTJkwA6Ka13ld7nbSgToHDYadrjALgqx2rLE4jhBAtm3QzP0UXqRG8un0NB6t2Ux2oxuVwWR1JCNGERo8eTUVFxQnXDR8+nJdffrmJE7VcUqBO0bg+vXh1fQJGdAlf6/VMzJCHooQ4m3zzjYzJ2VTkEt8pcjrsdPb0xAjaWLN7j9VxhBCixZICdRqu6DMB77oJ5O1sb3UUIYRosaRAnYaRvbsQ7Ypiz8FicgrKrY4jhBAtkhSo0+ByOhiW0R5sQT5ft9nqOEII0SJJgTpN/TPiiRqwkPn57+EPNv6YVEIIcbaRAnWaxvY5BwIegnYfy3dLK0oIIRqaFKjTFOV20sHZA4B521danEYIIVoeKVBnYFz3IQDsKdUEjVMbFl8IIQDGjx/PV199Zcm5V61axZAhQyw5dzjkQd0zMGlAP97bGU3QXcnqvdsZcU6G1ZGEsNy1/7zjpOtuHXIDF3QfC8BXu5fy6tpZJ932/R//teb9b754gr2FmXVuI1oeaUGdgegoF+0d5wDwn+9WWJxGCFGXrKwsBg4cyO9+9zuGDBnCmDFjePzxx2vW125NrFq1ismTJ/P0008zfPhwzjvvPF544YWwzuP3+3n++ec5//zzGT58OLfffvsxM+N+9tlnXHDBBQwaNIjHHnvsmIn/iouLeeCBBxg9ejTnn38+M2fOxO/313vOYDDIE088wahRoxg5ciS33HJLzYy39eU56rrrruMf//hHzefCwkL69OlDZmYmgUCAl19+mQkTJjB8+HB+8YtfcOTIkZrvauLEidx+++0MHTr0lKepr5NhGC36lZ6enpaenm5kZmYajeH9FcuNa2bfbkx58+FGOb4QomFkZmYa6enpxjPPPGNUVVUZd999t/HYY4/VrF+5cqUxePDgmvfp6enGzJkzDZ/PZyxdutRQShm7du2q9zwzZ840Jk+ebBw4cMDwer3GH//4R2Py5MmGz+cztm3bZvTp08dYunSp4fP5jBdeeMFIT083vvzyS8MwDOO2224z7r77bqO0tNTIzc01fvzjHxsvvvhiveecN2+eMXHiRKOoqMjw+XzG/fffb/z2t7+tN0/tn3n27NnGVVddVXPMWbNmGTfccINhGIbx+uuvG5MmTTL2799vVFZWGo888ogxderUY76r9957z6isrDSqqqrC+eOocfTPJT09Pc047ve3tKDO0KUDB8OOsRRvHEB2XpnVcYQQ9bjssstwu93ExMTUuZ3NZmP69Om4XC7GjBlDcnIy+/fvr/f4H3/8MdOnT6dz5854PB5+/etfk52dzaZNm5g/fz6jR49mzJgxuFwu7rjjjppp3/Pz81m4cCEPPfQQcXFxpKSkcOeddzJ79ux6zxkfH8/hw4f55JNPyMnJ4fHHH69pHdaVp7ZLLrmEHTt21PyMc+bM4corrwTg/fff56677qJLly5ERUXxq1/9ijVr1rBv375jvteoqCjcbne9ecMlBeoMRXvcjOzRC7CxdMPBercXQlgrJSUlrO3i4uLweDw1n10uF8Fg/Z2hCgoKSE1NrfnsdrtJSUkhJyeH/Px82rVrV7PO4XDQoUMHALKzswG4+OKLGTJkCEOGDOHee++luLiYqqqqOs95dCLD//znP0ycOJFJkybx9ddf15un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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.G, 'C0', label='run_simulation')\n", - "plot(results2.G, 'C2--', label='run_ode_solver')\n", - "\n", - "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n", - "\n", - "savefig('figs/chap18-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The differences in `G` are less than 2%." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.000000\n", - "2 -0.127982\n", - "4 -0.191302\n", - "6 0.154946\n", - "8 0.264360\n", - "10 0.207439\n", - "12 0.132947\n", - "14 0.035413\n", - "16 -0.081544\n", - "18 -0.222312\n", - "20 -0.371789\n", - "22 -0.522334\n", - "24 -0.664226\n", - "26 -0.801867\n", - "28 -0.934267\n", - "30 -1.057014\n", - "32 -1.164200\n", - "34 -1.256633\n", - "36 -1.345996\n", - "38 -1.431350\n", - "40 -1.511900\n", - "42 -1.586993\n", - "44 -1.656117\n", - "46 -1.718120\n", - "48 -1.772875\n", - "50 -1.820363\n", - "52 -1.860658\n", - "54 -1.893922\n", - "56 -1.915011\n", - "58 -1.925084\n", - " ... \n", - "124 -0.661724\n", - "126 -0.631811\n", - "128 -0.601917\n", - "130 -0.572193\n", - "132 -0.542770\n", - "134 -0.513756\n", - "136 -0.485244\n", - "138 -0.457312\n", - "140 -0.430024\n", - "142 -0.403431\n", - "144 -0.377577\n", - "146 -0.352881\n", - "148 -0.329311\n", - "150 -0.306834\n", - "152 -0.285416\n", - "154 -0.265021\n", - "156 -0.245616\n", - "158 -0.227165\n", - "160 -0.209635\n", - "162 -0.192991\n", - "164 -0.177201\n", - "166 -0.162620\n", - "168 -0.149158\n", - "170 -0.136734\n", - "172 -0.125270\n", - "174 -0.114695\n", - "176 -0.104943\n", - "178 -0.095953\n", - "180 -0.087669\n", - "182 -0.080037\n", - "Name: G, Length: 92, dtype: float64" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "percent_diff" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.9252541088148694" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max(abs(percent_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", - "\n", - "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system3 = System(system, dt=1)\n", - "results3, details = run_ode_solver(system3, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3hUVf7H8Xcy6aTRQpEqmoOI9CJNumIBVBRFXHVtWHdX113XsrpWWHX9Ydu1rOuubbGgq6IURQVBCUUQNHIQJFJDSyGF9Pn9cSdhEgghkMwdwuf1PHmYuffOnU9uhvnOPXPuOSFerxcREZFgE+p2ABERkYNRgRIRkaCkAiUiIkFJBUpERIKSCpSIiAQlFSgREQlKYYF8MmPMecCjQEdgJ/CYtfYFY0wE8CxwEVAKPGmtner3uIm+x7UCFgBXWWt3BjK7iIgEVsDOoIwxrYB3gTuttXHAxcB0Y0wv4AHAAJ2AvsCVxpgrfI/rArwMXAU0BX4CZgQqt4iIuCNgBcpaux1obq2dbYwJxSk2JUAOcCXwiLU201qbBjwBTPE99HLgI2vtImttAXAXMMgYc3KgsouISOAFtInPWptjjIkBsn3P/VdgF07TXarfpmuB03y3uwDL/faRb4zZ7Fv/U03PaYyJxDkr247TfCgiIsHDg1MDlllrC/1XBLRA+RQAjYBuwCfAPt/yfL9t8oEY3+3YKuuqrq9JX+CrI0oqIiKBMgRY5L8g4AXKWlsGFAHLjTEvAn18q6L9NosBcn2386qsq7q+JtsB3njjDVq2bHlEmUVEpH6kp6czefJk8L1X+wtYgTLGDMXpndfbb3EkkAmk43SS2Opb3pn9TX6pvnXl+4kB2lG5SfBQSgFatmxJmzZtjji/iIjUqwO+ggnkGdQq4ARjzO3AU0B/4BrgApwCdb8xZjVOk94dvm0A3gQWGWOGAd8AU4GV1tp1AcwuIiIBFshefNnAOcCFQAbwInCttXYBcB/wPfADsAyYCTzve9wa4Grf/d3AqThd1EVEpAELdC++b4HBB1leANzs+znY42biFC0RETlOaKgjEREJSipQIiISlFSgREQkKKlA1aC0uJjVi+eRvnmD21FERI4rKlA1mD31bnIee4FVH77tdhQRkeOKClQNmvfpS1ash7QCze4hIhJIKlA16D5qHP89vwWftylgd36G23FEROrMjh07KC4udjtGtVSgahAVEUWPVl0BWL51tctpRORIjRgxgs8++8yV505JSaFPnz41b1gH5s+fz0MPPXTQde+99x7jx48HYPfu3YwZM4Z9+/YddNuqNm3axHXXXUe/fv0YPHgwDz/8MEVFRQB888033HPPPXXzC/hRgToMfU/oTliJl3UpC9yOIiJSrdzcXB577DFuueWWGrctKCggP7/qRBHVu/nmm0lOTmbRokW89957fPfddzz77LMADBgwgD179rB48eIjzn4wbky3cczp2TSZa9/fTVjJLrLO2UlikyS3I4kw8a0bq113fZ/LGNVpCACfbfiKF5e/We22b1/yj4rbd857lI2Zm6tdX5MtW7YwduxYzj33XObMmcMdd9zBqlWriIuLq/iEnZKSws0338zy5ctJSUnhwQcfZOjQocycOZPIyEguvvhibr311hqfq6SkhL///e/MnDmTgoICevbsyb333lsxKPSsWbOYPn06GRkZXHjhhZSW7h+LNDs7m2nTprFw4ULCwsIYP348v/nNbwgLO/RbYllZGdOmTWPWrFl4vV66dOnC/fffT7t27WrMU+7SSy9lzJgxXHXVVQBkZmYyZMgQZs+eTevWrXnppZd45513yM3N5fTTT+f++++nSZMmpKSkcN9999GxY0dWrFjBE088wdChQyvt+6233qJ37940btwYgKysLP785z+zePFikpKSGDhwYMW2EyZMAGDo0KH861//4rnnnmPFihUH/M5Tpkxh0qRJJCUlcdNNNxEREUFSUhJjx45l7ty5FdtNnDiRZ555hkGDBtX0pztsOoM6DPHxTchrmUBmsyjSt/zsdhyRoJafn0+TJk34+uuvGTduXI3br1+/nvDwcBYtWsSjjz7Kc889x4YNNV/W8cwzzzBv3jxef/11Fi5cSJs2bbjhhhsoLi5m7dq13HXXXfzlL38hJSWFxMRE0tPTKx575513kpeXx9y5c3nnnXdYunQpL7zwQo3P+emnn7Jw4UJmz57NwoULSUpKqnjcofL4u+CCC5g1a1bF/Tlz5tC9e3fatm3Lq6++yocffsgrr7zCggULaNKkCbfddlvFtmlpaQwbNoyvvvqKAQMGHJDvnXfe4eyzz664f99991FUVMTChQt54YUXWLBgfyvQzJnO6HELFiygZ8+e/POf/2Tl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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(results2.G, 'C2--', label='run_ode_solver (dt=2)')\n", - "plot(results3.G, 'C3:', label='run_ode_solver (dt=1)')\n", - "\n", - "decorate(xlabel='Time (m)', ylabel='mg/dL')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.000000\n", - "2 0.009372\n", - "4 0.061820\n", - "6 0.031912\n", - "8 0.012039\n", - "10 0.011405\n", - "12 0.010124\n", - "14 0.009322\n", - "16 0.007946\n", - "18 0.008430\n", - "20 0.009144\n", - "22 0.011609\n", - "24 0.013346\n", - "26 0.015050\n", - "28 0.016702\n", - "30 0.019412\n", - "32 0.021838\n", - "34 0.022601\n", - "36 0.023359\n", - "38 0.024093\n", - "40 0.024789\n", - "42 0.025433\n", - "44 0.026113\n", - "46 0.026703\n", - "48 0.027200\n", - "50 0.027601\n", - "52 0.027907\n", - "54 0.028811\n", - "56 0.029488\n", - "58 0.029959\n", - " ... \n", - "124 0.010964\n", - "126 0.010626\n", - "128 0.010277\n", - "130 0.009921\n", - "132 0.009561\n", - "134 0.009198\n", - "136 0.008834\n", - "138 0.008472\n", - "140 0.008113\n", - "142 0.007758\n", - "144 0.007359\n", - "146 0.006976\n", - "148 0.006608\n", - "150 0.006255\n", - "152 0.005917\n", - "154 0.005594\n", - "156 0.005284\n", - "158 0.004988\n", - "160 0.004705\n", - "162 0.004434\n", - "164 0.004127\n", - "166 0.003841\n", - "168 0.003574\n", - "170 0.003326\n", - "172 0.003096\n", - "174 0.002881\n", - "176 0.002681\n", - "178 0.002495\n", - "180 0.002322\n", - "182 0.002161\n", - "Name: G, Length: 92, dtype: float64" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "diff = (results2.G - results3.G).dropna()\n", - "percent_diff = diff / results2.G * 100" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.061819954534205544" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "max(abs(percent_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Here's the source code for `run_ode_solver` if you'd like to know how it works.\n", - "\n", - "Notice that `run_ode_solver` is another name for `run_ralston`, which implements [Ralston's method](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def run_ralston(system, slope_func, **options):\n", - " \"\"\"Computes a numerical solution to a differential equation.\n", - "\n", - " `system` must contain `init` with initial conditions,\n", - " and `t_end` with the end time.\n", - "\n", - " `system` may contain `t_0` to override the default, 0\n", - "\n", - " It can contain any other parameters required by the slope function.\n", - "\n", - " `options` can be ...\n", - "\n", - " system: System object\n", - " slope_func: function that computes slopes\n", - "\n", - " returns: TimeFrame\n", - " \"\"\"\n", - " # the default message if nothing changes\n", - " msg = \"The solver successfully reached the end of the integration interval.\"\n", - "\n", - " # get parameters from system\n", - " init, t_0, t_end, dt = check_system(system, slope_func)\n", - "\n", - " # make the TimeFrame\n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt) * get_units(t_end)\n", - "\n", - " event_func = options.get('events', None)\n", - " z1 = np.nan\n", - "\n", - " def project(y1, t1, slopes, dt):\n", - " t2 = t1 + dt\n", - " y2 = [y + slope * dt for y, slope in zip(y1, slopes)]\n", - " return y2, t2\n", - "\n", - " # run the solver\n", - " for t1 in ts:\n", - " y1 = frame.row[t1]\n", - "\n", - " # evaluate the slopes at the start of the time step\n", - " slopes1 = slope_func(y1, t1, system)\n", - "\n", - " # evaluate the slopes at the two-thirds point\n", - " y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3)\n", - " slopes2 = slope_func(y_mid, t_mid, system)\n", - "\n", - " # compute the weighted sum of the slopes\n", - " slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)]\n", - "\n", - " # compute the next time stamp\n", - " y2, t2 = project(y1, t1, slopes, dt)\n", - "\n", - " # check for a terminating event\n", - " if event_func:\n", - " z2 = event_func(y2, t2, system)\n", - " if z1 * z2 < 0:\n", - " scale = magnitude(z1 / (z1 - z2))\n", - " y2, t2 = project(y1, t1, slopes, scale * dt)\n", - " frame.row[t2] = y2\n", - " msg = \"A termination event occurred.\"\n", - " break\n", - " else:\n", - " z1 = z2\n", - "\n", - " # store the results\n", - " frame.row[t2] = y2\n", - "\n", - " details = ModSimSeries(dict(success=True, message=msg))\n", - " return frame, details\n", - "\n" - ] - } - ], - "source": [ - "source_code(run_ode_solver)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap20soln.ipynb b/soln/chap20soln.ipynb deleted file mode 100644 index 1c6cb450..00000000 --- a/soln/chap20soln.ipynb +++ /dev/null @@ -1,1624 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 20\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dropping pennies\n", - "\n", - "I'll start by getting the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And defining the initial state." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    y381 meter
    v0.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "y 381 meter\n", - "v 0.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(y=381 * m, \n", - " v=0 * m/s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Acceleration due to gravity is about 9.8 m / s$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.8 meter/second2" - ], - "text/latex": [ - "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "9.8 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = 9.8 * m/s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start with a duration of 10 seconds and step size 0.1 second." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "10 second" - ], - "text/latex": [ - "$10\\ \\mathrm{second}$" - ], - "text/plain": [ - "10 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = 10 * s" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.1 second" - ], - "text/latex": [ - "$0.1\\ \\mathrm{second}$" - ], - "text/plain": [ - "0.1 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dt = 0.1 * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    inity 381 meter\n", - "v 0.0 meter / secon...
    g9.8 meter / second ** 2
    t_end10 second
    dt0.1 second
    \n", - "
    " - ], - "text/plain": [ - "init y 381 meter\n", - "v 0.0 meter / secon...\n", - "g 9.8 meter / second ** 2\n", - "t_end 10 second\n", - "dt 0.1 second\n", - "dtype: object" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(init=init, g=g, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And define the slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `g`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " g = system.g \n", - "\n", - " dydt = v\n", - " dvdt = -g\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's always a good idea to test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 meter / second\n", - "-9.8 meter / second ** 2\n" - ] - } - ], - "source": [ - "dydt, dvdt = slope_func(system.init, 0, system)\n", - "print(dydt)\n", - "print(dvdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.0381 meter0.0 meter / second
    0.1380.951 meter-0.9800000000000001 meter / second
    0.2380.80400000000003 meter-1.9600000000000002 meter / second
    0.3380.559 meter-2.9400000000000004 meter / second
    0.4380.216 meter-3.9200000000000004 meter / second
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.0 381 meter 0.0 meter / second\n", - "0.1 380.951 meter -0.9800000000000001 meter / second\n", - "0.2 380.80400000000003 meter -1.9600000000000002 meter / second\n", - "0.3 380.559 meter -2.9400000000000004 meter / second\n", - "0.4 380.216 meter -3.9200000000000004 meter / second" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    9.6-70.58399999999979 meter-94.08000000000003 meter / second
    9.7-80.0409999999998 meter-95.06000000000003 meter / second
    9.8-89.5959999999998 meter-96.04000000000003 meter / second
    9.9-99.24899999999981 meter-97.02000000000004 meter / second
    10.0-108.99999999999982 meter-98.00000000000004 meter / second
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "9.6 -70.58399999999979 meter -94.08000000000003 meter / second\n", - "9.7 -80.0409999999998 meter -95.06000000000003 meter / second\n", - "9.8 -89.5959999999998 meter -96.04000000000003 meter / second\n", - "9.9 -99.24899999999981 meter -97.02000000000004 meter / second\n", - "10.0 -108.99999999999982 meter -98.00000000000004 meter / second" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's position as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap20-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3hUVf7H8ffMpEMKnUCoAQ7Se1HpltXdBUV07WDvq65lRVesiIq9IjZWXdfd/SEW7IuA0qsECBxqgNADoYZU8vvjDjhkKREycyfJ5/U882TmlplvdnE+Oeeee46nuLgYERGRcON1uwAREZGjUUCJiEhYUkCJiEhYUkCJiEhYUkCJiEhYUkCJiEhYinC7gJKMMUlAGjDCWjvOGBMFvAYMAYqAF6y1owKOvwR4CkgGpgLDrLXbQl+5iIiUpbALKGAMUD/g9WOAAVKBROBbY8xGa+0HxphWwLvAecA84BngE6B/aT/MGBMNdAU24wSgiIiEjg+ngTHXWpsXuCOsAsoYMxRIABYHbB6K0yrKBrKNMc8BNwEfAFcCX1prp/nPH+4/prm1dmUpP7Yr8HNZ/Q4iInJSegHTAjeETUAZY5oAjwCnA9/6tyXhJGt6wKHLgbb+561wWk4AWGtzjDEb/PtLG1CbAf7xj39Qt27dU/kVRETkN9qyZQtXXHEF+L+LA4VFQBljfMBHwL3W2i3GmEO7qvp/5gQcngPEBewP3Fdyf2kUAdStW5eUlJTfUraIiJSd/7nEEi6j+B4GrLX20xLb9/t/xgZsiwP2BeyP5UiB+0VEpJwKixYUcClQzxgz2P86HngD6AZswRkksdG/ryW/dvml+/cBYIyJAxpyZJegiIiUQ2ERUNbaloGvjTG/AC/5h5nvAx4xxqThdOndC7zsP/RjYJoxpi8wExgFLLTWrghZ8SIiEhTh0sV3PCOAJcBSYC4wHmcoOtbaxcC1/tdZQGvgYnfKFBGRshQWLaiSrLUdAp7nArf5H0c7djxOaImISAUSlgFVnuw/UEBufiEAXo8Hr9eDz+clwushMsKLz1ceGqkiIuFHAXUKVqzP5q+v/Uxh0bFXJfZ6PURFeImK9BET5SMmOoLYqAhiYyKIi4mgSkwkVWIjiY+LIj4ukoQq0SRUjSKxShSJVaNJqBKFx+MJ4W8lIhIeFFCnIKFKFA3qxLN7Xz7FxcUUF0PRwWKKDh6ksKiYwsIiDh4sJje/iNz8IvbsP/F7lhTh85BUNZpqCTHUTIqlRkIMNZJiqZUUS+1qcdSuHku1+Bi8XoWYiFQsCqhTULdGFV65p98x9xcXF1N0sJj8giLyCw6Sm1/ohFVeITm5hezPLSAnt4B9OQXszclnb04Be/bnsXtfPnv257FrXz77DxSQtTuXrN25rNyw66ifExnhpU71OOrWqEJyzSrUq1mFerWqUr9WVWolxSq8RKRcUkAFkcfjIcLnIcLnJS4GIPo3v0d+QRHZe/PYuTuXHXsOkLUrl6xdB9i+K4dt2QfYtjOHPfvzydy2j8xt/3t/clSkj5RaVUmpU5VGdRNoVDeeRskJ1K4Wp+ASkbCmgApzUZE+6lSPo071Y8/elJNbwNadOWzZsZ/NWfvZlLWfjdv3sXHbPrL35rFm027WbNrNr/c6Q2x0BI2TE2hSL4Gm9ZNolpJIw7oJREZoUIeIhAcFVAUQFxNJk3qJNKmX+D/79h0oIHPbXtZvcR7rtuxh3eY9ZO/NY1nGTpZl7Dx8bITPS+N6CbRokESLhtVo0bAa9WtVVUtLRFyhgKrgqsZG0rJRdVo2qn7E9l1781i7aTdrN+1m9cbdrM7cxcbt+1m1YRerNuzi6xkZAFSJjcQ0rEbLRtVo1aQGLRpVIzZa/2xEQuWxd2Yxb9nWkH1el9Pq8Mj1PU543MMPP0xubi6jR48+vO3ss89m+PDh9O9f6iX5jkvfNJVUUnw0HU1tOprah7fl5BawOnM3K9Zns2JDNivWZZO1O5cFdhsL/IsUe70emtZPpE3TGrRNrUmrpjWoGhvp1q8hIi4ZNGgQN954I3l5eURHR7No0SL27t1Lr169yuwzFFByWFxMJG2b1aRts5qHt2XtOsDydU5XYPranazZuPtwK+uzqavxeCC1fiLtm9eiXbNatGpanZgo/bMSKSulac24oXPnziQlJTFlyhTOPfdcJk6cyPnnn09kZNn9wapvEjmumkmxnJlUnzPb1wecVpZdl82SNTtYsjqLFeuzWZW5m1WZuxk/eRURPi+tmlSnk7911qRegm40FqmAPB4Pf/zjH/nqq684++yz+eabb3j99dfL9DMUUPKbxMVEHtE1mJtfSPranaSt3M6ildtZvXE3aauySFuVxbiv0qmeEE0nU4fOp9WmY4vaVFF3oEiFMWjQIAYPHsyMGTOIi4ujffv2Zfr+Cig5JTFREXQytenkD6zd+/JIW5l1+LrVzj25/Hfuev47dz0+r4c2qTXo2qou3VvXpW6NKi5XLyKnomnTpqSmpjJ69GgGDhxY5u+vgJIylVg1ml4d69OrY32Ki4vJ2LyH+cu3MW/ZVpat3cGilVksWpnFO58voXFyAt3b1KVnm2Sa1k9UV6BIOTRo0CBGjhzJq6++WubvrYCSoPF4PIfvzxrSvzl7c/KZv2wrc9K3Mm/ZVjI27yFj8x7+9cMK6lSP4/R29TijXTItGlZTWImUE8nJyXTq1ImGDRuW+XsroCRk4uOi6Nu5AX07N6CgsIjFq3Ywc8lmZi3ZzNadOUyYsooJU1ZRu1osZ7avz5kd6tEsJUlhJRKG9u7dy8aNGxk7diyXXXZZUD5DASWuiIzw0allbTq1rM3Ng9uxPGMnM9I2MT1tE9uyD/DplFV8OmUVyTWr0Ltjffp0TKFBnXi3yxYRv7Vr13L11VfTu3dvBg0aFJTP8BQXH3sto8rAGNMYWDtp0iRSUlLcLqfSO3iwmGUZO5n2y0ampW1i1968w/uapSTSt3MDenesT7X4GBerFJGykpmZyYABAwCaWGszAvepBSVhxev10LppDVo3rcH1g9qweHUWUxdsZMbiTYfvt3rvy6V0MrU5q2tDurWuQ2SEz+2yRSQIFFAStnw+Lx1a1KZDi9rcfFE75izdwuT5G1jgHxU4b9lW4uMi6dMxhXN6NDrqZLkiUn4poKRciI700atDfXp1qM+uvXlMXZjJpLnrWbtpDxOnr2Xi9LU0S0nknO6N6NMphbgY3RAsUt4poKTcSYqPZlDvVAb1TmV15i7+O2c9kxdk+rsA03jvy6X07pjCuT0a0aJhNbfLFZGTpICSci01JYnUlCSG/bE1Mxdv5rtZGSxZvYPvZ6/j+9nraNYgid+f3pgzO9TXJLYi5Yz+i5UKITrSR99OKfTtlELmtr18N2sdk+auZ9WGXbz8r19494ulnNWtIb8/o4mmWBIpJxRQUuGk1I7nuoFtuPK805j2y0a+nrGWFeud5UE+/2k1XU+ryx97NaF981q6CVgkjCmgpMKKjvQxoGtDBnRtyMoN2UyctpafFm5kTvoW5qRvoVHdeAb2TqVvpxSiIjVUXSTceN0uQCQUmjeoxt2XdeL9h8/hyt+1pFp8NOu27OXVf//CtU9+zz+/t+zel3fiNxKRkFELSiqVpPho/nS2YXC/5vz8y0Y+/2k1azbu5uPvlvN/k1YwoGtDLuibSr2aVd0uVaTSU0BJpRQZ4aV/lwb065zC4tVZTJiymnnLtvLNzAy+m5VBz3b1GNKvOc0aJLldqkilpYCSSs3j8dCuWS3aNavF+i17mDBlNVMWbGD6ok1MX7SJji1qcfFZLWjTtIYGVIiEmAJKxK9h3QTuvLQjV/yuJZ//tJrvZmWwcMV2Fq7YzmmNq3PJWS3o3LK2gkokRBRQIiXUTIrluoFtuOSsFkyctpYvf17NsoydPPbOLJo1SOLSs1rQrXVdBZVIkIVVQBlj/gA8BTQBtgHPWmvfMsZEAa8BQ4Ai4AVr7aiA8y7xn5cMTAWGWWu3hbp+qVji46K47BzDBX1S+WZGBhOmrGLVhl08+f4cmtZL5LJzDd0VVCJBEzbDzI0xycD/AX+11sYDFwMvGWM6AY8BBkgFugJDjTFX+89rBbwLDANqACuBT0L+C0iFFRsdweB+zXj7obO4YVAbqifEsGbTbka+P4e7XpzKnKVbqOzrqokEQ9gElLV2M1DLWvuNMcaLEzaFwF5gKDDSWpvtX9DqOeAm/6lXAl9aa6dZa3OB4cAZxpjmIf8lpEKLiYpgYO9U3n7wLG64oA3VE6JZs3E3T7w3m3tf+YkFdpuCSqQMhU1AAVhr9xpj4oA84HvgdWA7TtddesChy4G2/uetAvdZa3OADQH7RcpUVKSPgb1SGfvg2dwwqA1JVaNZsX4Xj4ydyfA3ppO+dofbJYpUCGF1DcovF6gCtAO+Bg74t+cEHJMDxPmfVy2xr+R+kaCIjvQxsHcq53RvxMTpaxn/40qWrtnBX1+bRpfT6nD1+adpEUWRUxB2AWWtPQjkA/OMMWOBLv5dsQGHxQH7/M/3l9hXcr9IUMVERzCkf3PO69nYPyHtKuYt28r85Vvp0ymFK393GnWq6+8lkd8qbLr4jDF9jDHzS2yOBrKBLTiDJA5pya/deumB+/xdhA05sktQJOiqxEZyxe9aMnb42Qzs3RSf18uU+Znc/PQk3v58MXv257tdoki5Ek4tqF+A+saYvwAvA92B64ALcQLqEWNMGk6X3r3+YwA+BqYZY/oCM4FRwEJr7YrQli/iSIqP5oZBbRnYK5WPvl3G1AWZfPHTGibNWc8lZ7XgD2c21ezpIqUQNi0oa+1u4HxgMLATGAtcb62dCowAlgBLgbnAeGCM/7zFwLX+11lAa5wh6iKuqlM9jnsu78xLd/elQ4ta7M8t5P2J6dzyzCSmLsjUiD+RE/BU9v9IjDGNgbWTJk0iJSXF7XKkAluwfBvvT1xKxuY9AJhG1bh+UBtaNqrucmUi7snMzGTAgAEATfy3ER0WTl18IhVap5a1ad+iFpPmrufDb5Zh12Vz3ys/07tjfYb9vjW1qpUc6yNSuYVNF59IZeDzejineyPeemAAFw9oTmSEl58WbuTmZybxz+8teQVFbpcoEjYUUCIuiIuJ5OrzWzHmrwM4s3098guK+Pi75dz6zCRmpG3S9SkRFFAirqpdPY6/Xt2VUbeeQdN6iWzLPsCov89lxFsz2bB1r9vlibhKASUSBtqk1uSFu/tw60XtiI+L5JeV27njucm89+VScnIL3C5PxBUKKJEw4fN6OO/0Jox54Cx+17MxB4uLmTBlFbc++yM//7JR3X5S6SigRMJMQpUobhvSnufv7E3zBkns2J3Lsx/OY8TYmWzK0gxeUnkooETCVPMG1Rj9597cOqQ9VWMj+WXFdm4fPZl/fm8pKNRoP6n4FFAiYczn9XBez8a8+dcB9O/SgILCg3z83XLueG4yi1dnuV2eSFApoETKgaT4aO6+rBNP3XIG9WtVZeP2/Tz4xnRe+ddC9uZoElqpmBRQIuVI22Y1efXevlx+jiHC5+WHOeu55ZlJ/LRQc/tJxaOAEilnIiN8XHZuS165py+tm9Zg9758Rn80nyfem03WrgMnfgORckIBJVJONagTz1O3nMHtF7cnLiaCuelbufXZH/lmxloOHlRrSso/BZRIOeb1eji3R2PeuL8/PdrU5UBeIW+MT+NvY2awOWu/2+WJnBIFlEgFUCMxlgeHdeOvV3chsWoUi1dncftzk/nip9VqTUm5pYASqSA8Hg9ntq/P6/f1p0/HFPILinj78yU8+OZ03eAr5ZICSqSCSawazb1Xduaha7qRFB/N0jU7uOO5KXz58xq1pqRcUUCJVFA92iTzxv396dvJaU2N/WwxD781g207c9wuTaRUFFAiFVh8XBT3XNGZB4d1JbFqFGmrnGtTP8xep/umJOwpoEQqgZ5t6/H6ff3p2TaZA3mFvPLvXxj5/hx27c1zuzSRY1JAiVQSiVWjGT60K3+5vBNVYiKYvXQLdzw3mdlLNrtdmshRKaBEKhGPx0O/zg149d7+tGtWk1378njy/Tm89p9fyM0rdLs8kSMooEQqoVrVYnniptO5bmAbIiO8fDdrHXe+MIUV67PdLk3kMAWUSCXl9Xq4oE8qL9zVh0Z149mUtZ/7X/2Z/0xaQZGGo0sYUECJVHKNkxN44a4+DOzdlKKDxXzw9TIeHjNDE8+K6yJKe6Axpg7QGagNFAFbgAXW2h1Bqk1EQiQq0scNg9rSydTmpU8Wsnh1Fnc8N5k//6kjPdsmu12eVFLHDShjTARwOXAX0B7IB7IBH1Ddf8xs4A3gE2vtwaBWKyJB1bllHV69px8v/2sh85Zt5alxczj/9MZcN7ANUZE+t8uTSuaYXXzGmD5AGnA18C7QAoiz1taz1tYBooCOwMfA7cByY0zfoFcsIkGVFB/NiOu6c8OgNkT4PHw9I4N7Xv6JDVv3ul2aVDLHa0HdA/zJWrv4aDuttcXAEv/jDWNMR+BxYEpZFykioeXxeBjYO5VWTWsw+sN5ZGzew90vTeWWwe0Y0LWh2+VJJeGp7NOdGGMaA2snTZpESkqK2+WIhJ2c3ALe/DSNKfMzAejfpQG3DG5HTHSpL2GLHFNmZiYDBgwAaGKtzQjc91sGScQBTYDokvustQtOsUYRCVNxMZH85bJOtG9Wkzc/XcyP8zawYn02DwztSqO6CW6XJxVYqYaZG2OuBLbhXJOaV+IxN2jViUhY8Hg8nNWtES/c1ZsGdeLJ3LaPe17+iUlz17tdmlRgpW1BjcIZKPECkBuMQowxZwNPA81xwnC0tfYtY0wU8BowBGd4+wvW2lEB510CPAUkA1OBYdbabcGoUaSya1Q3gRfu7M0b4xcxeX4mL32ykKVrdnDT4HZEa5SflLHSBlQC8Jq1dl0wijDGNADGA0OBz3Hut/rOGJMB9AUMkAokAt8aYzZaaz8wxrTCCc7zcFpzzwCfAP2DUaeIQEx0BHdf1ok2qTV569M0fpiznlWZu3hgaFfq1azqdnlSgZR2JokPgWFBrKMx8LG1doK19qC1di7OaMAzcEJrpLU2238B7TngJv95VwJfWmunWWtzgeHAGcaY5kGsVaTS83g8nNO9Ec/d2ZvkmlVYu2kPf3lxKjMXa2Z0KTulbUGNBhYYY64AMoAjbsi11p5Si8Va+zPw86HXxpjqQC+cYEwG0gMOXw609T9vhdNyOvQ+OcaYDf79K0+lJhE5sSb1Ennxrj68/K+FzFy8mafGzeGifs246rzT8Pk0k5qcmtIG1IfAPuArIKjrRRtjEoEvgNnAfP/mwM/MAeL8z6sepZ7A/SISZFViIxk+tCsTpqzm71+nM37yKlZl7uK+K7uQWPV/Bv2KlFppA6or0N1amxbMYowxLXCuQaUDVwCx/l2xAYfF4YQlwP4S+0ruF5EQ8Hg8DO7XjOYNknj2w3ksWpnFXS9OZfjQrrRoWM3t8qScKm0b3AJJwSzEGNMbp9X0GTDEWptrrc3GmZTWBBzakl+7/NID9/nv1WrIkV2CIhIibZvV5MW7+2AaVSNr1wEeeH0aP8wOytgqqQR+yzDzccaY14DVQEHgTmvt16dShDEmFZgIPGStfbXE7g+BR4wxaThdevcCL/v3fQxM888BONNf50Jr7YpTqUdETl7NpFhG3Xomb3++mG9mZPDKv39hZeYubhjUlsgIXZeS0ittQP3T//O5o+wrxpnd/FTcBsQDo4wxowK2vw6MAJ4HluK0+MYCYwCstYuNMdf6X9fHaYFdfIq1iMgpiozwcutF7WmeksQb49P4ZkYGGZv2MHxoV6olxLhdnpQTmotPc/GJBNWK9dmMGjeHrN251EiM4cFh3XRdSg473lx8J1pu4zcxxugGWRE5QouG1Xjh7j60alKdHbtzeeD1afw4T1MkyYkdr0P4bmPMN8aY84wxkcc6yBgTYYy5wBjzX5yFDUVEjlAtPoYnbz6D83o2pqDwIC/+cyHvfrGEooOVuwdHju+Y16CstRcYYy7EmR+vkTFmCs51oCzAA9TCWWW3J7AeeMJa+39Br1hEyqXICC+3DmlPk/qJvPVpGp9NXc36rXu578ouVI095t/AUokdd0iNf+qh9sAFwAqcMLoeuAbogjO7+UBrbXuFk4iUxnk9G/PkzaeTUCWKBcu3ce/LP7Fpu25dlP9VqlF81topaKVcESkjbVJr8sJdfXjyvdlkbN7DPS//xANXd6V9i1pulyZhRDcliIgr6lSP49k7etG9dV32HShgxNsz+XrGWrfLkjCigBIR18RGR/DgsG5c1K8ZBw8W8+b4NN6akEZR0cETnywVngJKRFzl9XoY9ofW3H1ZRyJ8XiZOW8sT780mJ7fgxCdLhaaAEpGw0L9LQ568+XTi46KYv3wb97/6M9t2BnXxBAlzpZ3qCGNMbaAdEIkzzPywU52LT0QEoHXTGjx/Z28ef3cW67bs5Z5XfuLha7tr5olKqlQtKGPMdcAG4HucNaEmBjy+DFp1IlLpJNeswug/96ZD81rs2pvH8DemMyNtk9tliQtK28V3H/A2kGit9ZZ4nOpEsSIiR6gaG8kjN/Tg7G4NyS8o4ukP5vLp5FVU9rlDK5vSBlQD4GVr7d5gFiMickiEz8sdl3Tg6vNPo7gY3p+4lDGfaoRfZVLagPoeGBDMQkRESvJ4PFw8oAX3X9mFCJ+Xr2dkMHLcHHLzCt0uTUKgtIMkFgEvGGMG4kx5lB+401p7f1kXJiJySK+O9ameGMPI92czN30rw9+czojrulMtXmtLVWSlbUH1wVkMMBZngtiuAY8uwSlNRORXrZvW4Nk7elG3RhyrNuzivld+ZqPm8KvQSjsXX79gFyIiciIpteMZfYczDH2lP6RGXNedlo2ru12aBMFvuQ+qDnA70Bqn5bUMeNtauyZItYmI/I+k+GieuuUMnvlwHvOWbeWhN6dz31Vd6NEm2e3SpIyV9j6objjXni7EWQ9qO/AHIM0Yoy4+EQmpmOgI/nZNN87t0Yj8woOMGjeHb2dmuF2WlLHStqCeB/4J3GKtPXwjgjHmNWA0oC5AEQkpn8/LbUPaUyMhho+/t7z+f4vYuSeXy84xeDyeE7+BhL3SDpLoArwYGE5+r+IMlBARCTmPx8Nl57bk9ovb4/XAP/1BpaXkK4bSBtRmoPFRtjcFdPOuiLjq3B6NeXBYN6IivHw3ax3PfDCX/IIit8uSU1TagPoQGGuMudAYk+x/DAbG+PeJiLiqe5tkHr/pdKrERjJz8WYeeXsm+w9oyY7yrLQBNRJnNol/A5nARpxrUv8BHgpOaSIiv03rpjV4+rYzqZ4Qw5LVO3jwjelk7811uyw5SaUKKGttvrX2BqAm0BPnZt0ka+291lr9iSIiYaNxcgLP3tGLejWrsGbTbv762jS2al2pcumYAWWMOd8YExnw/HzgDJyQagD0C9guIhI26lSP45nbe5GaksjmrP3c/+rPrNu8x+2y5Dc6XgtqIlAt4PmxHloPSkTCzqEbetuk1mDnnlweeH0adt1Ot8uS3+CY90FZa71Hey4iUl7ExUTy2A09efbDecxeuoW/jZnB367pTvsWtdwuTUqhtDNJ/GiMSTrK9lrGmPllX5aISNmIivQxfGhX+nVOITe/iEffmcXMxZvdLktK4ZgtKGNMX6CV/2Uf4CZjTMl7nk4DUoNTmohI2fD5vNx1aSeqxEQycfpanv5gLndd2pF+nRu4XZocx/GmOtoB3At4/I/bgMA734qBfcA9QatORKSMeL0ebrywLVViI/nXf1fw4j8XkJtXyHmnN3G7NDmG412DWowzUwTGmMnAYGttdrAL8k9MO9FaW9v/Ogp4DRiCE5AvWGtHBRx/CfAUkAxMBYZZa7cFu04RKX88Hg9XnncasdERjPsqnTfGp3Egr5DB/Zq7XZocxfG6+OKstYduHvj9oW1HOzbguJNmjPEA1wHPldj1GGBwuhITgW+NMRuttR8YY1oB7wLnAfOAZ4BPgP6nWo+IVFwX9W9ObEwEb45P4/2J6eTmF2mS2TB0vEESe40xtf3P9+HMuVfycWh7WXgMuAV4ssT2ocBIa222tTYDJ8Bu8u+7EvjSWjvNWpsLDAfOMMbozyEROa7zT2/C3Zd1OjzJ7PsT0yku1iSz4eR416D6A4duGgjFchpjrLUj/IMzAPCPHEwG0gOOWw609T9vhdNyApyWnDFmg3//yqBXLCLlWv8uDYiK9PLcR/OZMGUVefmF3HRhO7xetaTCwfGuQU092nM4fF2oHbDCWlsmt2dbazcdZXNV/8/ALsQcIC5gf8nuxcD9IiLHdWb7+kRF+nj673P5ekYGBYUHue3iDvgUUq4r7X1QzYwxU40xPfzXoeb4H+uMMT2CWN9+/8/YgG1xOF2Lh/bHcqTA/SIiJ9StVV1GXNedqEgfP8xZz8ufLKCo6KDbZVV6pZ0h4lWca00ZwFVACs7AhTeBF4JSGeAfNbjF/1mHtOTXLr/0wH3+8GzIkV2CIiIn1KFFbR69oQcxUT4mz8/k+Y8XUKiQclVpA6oXcLe1dgtwAfCVtXYl8DbQIVjF+X0IPGKMqWmMaYxzb9ahNag+BgYZY/oaY6KBUcBCa+2KINckIhVQ29SaPHZjT2KjI/j5l408++E8CgoVUm4pbUDlApHGmCo4s0p8499eF9gdjMICjACWAEuBucB4nIUSD92rda3/dRbQGrg4yPWISAXWqkkNnrz514UPn/lgrkLKJZ7SDKs0xvwDZ8n3vUAXoBHQA3gZmG6tvenYZ4c3f6ts7aRJk0hJSXG7HBEJE6s27OLht2aw70ABXVvVYfjQrkRG+Nwuq8LJzMxkwIABAE38txIdVtoW1E04w7lzgd9ba/cDXYEpwF1lVqmISJho1iCJJ28+nfi4SOamb+WpcXPJLyg68YlSZkrVggpkjEkAvNbaXcEpKbTUghKR41m7aTd/GzODPfvz6XKa05KKilRLqqyURQsKY8wt/ptgs4EdxpjNxpgHyrRSEZEw06ReIk/efDoJVaKYt2wrT42bo5ZUiJT2Pqh7gadxhpv3AnoDLwL3G2PuDF55IiLua1IvkZG3nEFClbThf1kAABJqSURBVCjmL9/GSIVUSJS2BXUbcLO19llr7Qxr7XRr7bM4c+fdHrzyRETCQ+PkhMMhtWD5Nkb9fS4FhQqpYCptQNXCGeJd0nycm3ZFRCq8wJCat2wrT/9d90kFU2kDaglHv7/oTziTt4qIVAqNkxMOj+6bk75F90kF0fFmMw80AvjKGNMTmOnf1hP4HTA4GIWJiISrJvUSeeKm0/nbmBnMXrqF0R/N4/6ruhDhK/W4MymFUv2vaa39HhgA5OHMxTcE2AN0tdZODF55IiLhKTUliSduOp0qMRHMXLyZFz/WBLNlrbQtKKy1PwE/BbEWEZFypVmDJB67sScPvzWTn37ZiM/n4c5LO2mpjjJy3CXfgZdwWkt5wATggbJa/0lEpCIwjarz6A09eGTsTCbPzyTC5+X2izto0cMycLwuvseAPwLP4iyp8Xuc2ctFRCRAqyY1GHF9j8PrSb392WItH18GjhdQQ4DLrbVPW2tH44ziG2SMiQxNaSIi5Ufb1Jo8dE03InxeJk5fy7iJ6QqpU3S8gErhyCHkc/3H1wlqRSIi5VQnU5vhQ7vi83r4dMoqPv7Oul1SuXa8gPIBh2+TttYW41yLigp2USIi5VW31nW578oueD3wyQ+W8T+udLukckuD9kVEytgZ7etx56WdABj3VTpfTV/rckXl04mGmQ8zxuwrcfyVxpiswIOstW+UeWUiIuVY/y4NyMsv5I3xaYz5NI3oSB9ndWvodlnlyvECaj3OZLCBtgDXlNhWDCigRERKOO/0JuTmF/Hel0t59d8LiY2J4Ix29dwuq9w4ZkBZaxuHsA4RkQrpwr7NOJBXyD+/tzz30Txir+1Bp5a13S6rXNA1KBGRILvsHMPA3k0pLCpm5Lg5LF2zw+2SygUFlIhIkHk8Hq4f2IazuzUkv6CIx9+dxerMXW6XFfYUUCIiIeDxeLjt4g6c0b4eObmFPPL2TDZu33fiEysxBZSISIj4vB7uubwTHVvUYve+fB5+awbbsw+4XVbYUkCJiIRQZISPB4d1o2WjamzPPsCIsTPYvS/P7bLCkgJKRCTEYqIjeOT6HjROTiBz2z4efWcWObkFbpcVdhRQIiIuqBoXxWM39qRujThWbdjFU+PmUFBYdOITKxEFlIiIS6onxPD4jaeTFB/NopVZPP+PBRQd1AzohyigRERclFyzCo/f2JMqMRFMT9vEmE/TtEyHnwJKRMRlTeol8vB1PYiK8PLtzAwt0+GngBIRCQOtm9bgvqt+XaZDM6AroEREwkaPNsncOqQDAG9NSGPaoo0uV+QuBZSISBg5t0cjrjrvNIqL4fl/LCBt1Xa3S3JNhQgoY0x7Y8xMY8x+Y8xiY0xXt2sSETlZFw9ozh/ObEJh0UFGvj+HtZt2u12SK8p9QBljooDPgX8BScBI4HtjTIKrhYmInCSPx8P1g9oenrfv0bdnsnVnjttlhVy5DyigLxBprX3JWltgrf0EWAr8yd2yREROns/r4S+XdaJtak127snjkbEz2bM/3+2yQqoiBFQrYFmJbcuBti7UIiJSZqIifTx0TTcaJyewcfs+nnh3FnkFlWe2iYoQUFWBkm3fHCDOhVpERMpUldhIHr2hBzWTYlm+LpvnPppXaWabqAgBtR+ILbEtDtBCKyJSIdRIjOXRG3pQJTaSWUu28PZniyvFbBMVIaDSAVNiW0v/dhGRCqFR3QQeuqYbET4vX01fy6eTV7ldUtBVhICaDHiMMXcbYyKNMZcC7YAJLtclIlKm2qbW5C+XdwJg3FfpTF2Q6XJFwVXuA8pamw+cB1wE7AQeAi6w1lbeu9tEpMLq1aE+1/6xNQAvfbKQxauzXK4oeCLcLqAsWGuXAGe6XYeISChc0CeVbdk5TJy2lpHvz+HZ28+kYd2Kd+tnuW9BiYhUNodu5O3ZNpn9Bwp47J1ZZO/JdbusMqeAEhEph3xeD3+5vBOmYTW2ZR/g8fdmk5tX6HZZZUoBJSJSTsVERfC3a7sfXjb+uX/Mr1D3SCmgRETKsaT4aB65vgdVYyOZvXQL736xxO2SyowCSkSknEupHc/fru1OhM/Llz+v4YufV7tdUplQQImIVACtm9bgzj85ix2++/kS5izd4nJFp04BJSJSQfTt3IDLz23JwWJ49qN5rMrc5XZJp0QBJSJSgVx6dgv6dU4hL7+IJ96dRdauA26XdNIUUCIiFYjH4+GOSzrQumkNdu7J44l3Z3OgnA4/V0CJiFQwkRE+HhzWjeSaVVizaTfPl9Ph5wooEZEKKKFKFCOu6354+Pm4iUvdLuk3U0CJiFRQKbXjGT6sKz6vh8+mrua7WRlul/SbKKBERCqwds1qcduQ9gC8OT6NtFXlZ6EHBZSISAV3dvdGXNi3GUUHixk1bi4bt5ePBccVUCIilcDQ37eie+u67DtQwOPvzGJvTr7bJZ2QAkpEpBLweT3cc0VnmtRLYFPWfp75YC6FRQfdLuu4FFAiIpVEbLQz+3lS1WgWrczinc/De2JZBZSISCVSu1ocD13TjQifl6+mr+XrGWvdLumYFFAiIpVMy8bVueMSZ2LZtyYsZtGK8BzZp4ASEamE+ndpwEX9mnHwYDFPfzCXzVn73S7pfyigREQqqavOb0XXVnXYd6CAJ96bRU5ugdslHUEBJSJSSfm8Hu69ojMN6sSzYes+Rn8UXnP2KaBERCqxuJhIHr62O/FxkcxbtpUPv053u6TDFFAiIpVccs0q/PXqrni9HsZPXsXUBZlulwQooEREBGjfvBY3DGoDwCv/WsiqDe6vxquAEhERAH5/RhPO7taQ/MKDjHx/Ntl7cl2tRwElIiKAsxrvLRe147TG1cnancuov8+loNC96ZAUUCIiclhkhI/hQ7tSMzGGZRk7GfvZYtdqUUCJiMgRqiXE8OA13YiM8PLtzAy+mZnhSh0KKBER+R/NG1Tj9oudhQ7HTkgjfe2OkNeggBIRkaPq36UhA3s3pbComFF/n8uO3QdC+vkKKBEROaZr/9Cads1qsmtvHqPGzaWgsChknx12AWWMudsY81mJbQ2NMT8YY/YaY1YbY84P2OcxxjxpjNlmjNlljHnRGBMR+spFRCoen8/L/Vd1oXa1WOz6bN4cn0ZxcWimQwqbgDLGVDXGjAaeP8ruT4A0oAZwA/CJMaapf9+NwGCgE9Ac6Ao8GPyKRUQqh8Sq0Tw4rBtREV5+mLOeb2etC8nnhk1AAV8BTYC3AjcaY1oAXYAR1tp8a+2PwBfAdf5DhgIvWWszrbXbgUeBm0JWtYhIJZCaksTt/jWkxk5IY9nanUH/zJAFlDEmyhhT9yiPOv5DLrPWDgG2lji1FbDeWhu4WMlyoG3A/vQS++oZY6oH4/cQEams+nVucHjQxNMfzGFnkGeaCGUL6nRg81EeGwGstZuOcV5VIKfEthwg7hj7Dz2PQ0REytQ1f2hNm9Qa7NyTx9NBnmkiZIMJrLVTAM9JnLofiC2xLQ7Yd4z9h4JpHyIiUqYi/IMm7n5xKssydvLeF0u4aXC7oHxWOF2DOpZ0oKExJjCEWvJrt146YErs22ytdX8qXhGRCqhafAzDh3Ylwudl4vS1zEnfEpTPCfuAstZaYBEw0hgTbYzpBwwCPvYf8iFwrzGmkTGmJs4giQ9dKVZEpJIwjapz25B2REZ4ycktDMpnlJf7hS4CxgLbgCzgOmvtEv++MUAdYAZO995/gBFuFCkiUpmc1a0RfTs3IMIXnLZO2AWUtfbRo2zbAJx3jOMPAo/4HyIiEkLBCicoB118IiJSOSmgREQkLCmgREQkLCmgREQkLCmgREQkLCmgREQkLIXdMHMX+AC2bAnOndAiInJsAd+9vpL7FFCQDHDFFVe4XYeISGWWDKwO3KCAgrlAL5yZ1UO3lrGIiIDTckrG+S4+gidUS/eKiIj8FhokISIiYUkBJSIiYUkBJSIiYUkBJSIiYUkBJSIiYUkBJSIiYUkBJSIiYUkBJSIiYUkzSZwkY0x7YAzQDlgDXGut/Z87oSsqY8zZwNNAc2AbMNpa+5a7VYWeMSYJSANGWGvHuVxOSBljkoE3gX5ALjDWWvuwu1WFjjGmB/AKYIDtwNPW2nfcrSo0jDHdgInW2tr+11HAa8AQnBl5XrDWjjrVz1EL6iT4/8/4HPgXkASMBL43xiS4WliIGGMaAOOBJ3F+/8uAUcaYc10tzB1jgPpuF+GSz3GmCKsD9ACGGmMud7ek0DDGeHF+/1estYk4/w285v/DtcIyxniMMdcD3wNRAbsewwnqVKArzr+Fq0/18xRQJ6cvEGmtfclaW2Ct/QRYCvzJ3bJCpjHwsbV2grX2oL/lOAU4w9WqQswYMxRIABa7XUuoGWO6A02BP1trc621a3H+u5jsamGhUw2oDXiMMR6gGCgE8l2tKvgeA27B+eM00FBgpLU221qbATwH3HSqH6aAOjmtgGUlti0H2rpQS8hZa3+21t586LUxpjrOhLsL3asqtIwxTYBHgGvdrsUlnXGC+VFjzEZjzGrgQmvtZpfrCglr7Q6cLq2/AwU4E50+aK0t+b1Q0Yyx1nYG5h3a4O/mTgbSA44rk+9DBdTJqQrklNiWA8S5UIurjDGJwBfAbJwujwrPGOMDPgLutdZW1oXEDv1RUoDTkhoM3FvJuvhygcuBWJzW4yPGmHPcrCvYrLWbjrK5qv9n4HdimXwfapDEydmP848yUBywz4VaXGOMaYETSunAFdbagy6XFCoPA9Za+6nbhbgoD9hjrX3U/3qRMeYdnKD62LWqQmcwcIa19j7/66nGmHdxurW+d68sV+z3/wz8TiyT70O1oE5OOs4FwUAtObKJW6EZY3rjtJo+A4ZYa3NdLimULgWGGGN2GWN24XRlvGGMecPlukJpORDnHzB0SGX6g7cBEF1iWyFOi7JSsdZmA1s48juxTL4PK9M/qLI0Gefi6N04/dAX4Qw3n+BqVSFijEkFJgIPWWtfdbueULPWtgx8bYz5BXipkg0z/wFnaPXzxph7cL6crsO5gF4ZfI8zcvVG4G2gE3ADcL2rVbnnQ5wuzjScLr97gZdP9U3VgjoJ1tp84DycYNoJPARcYK3d7mphoXMbEI/zH+i+gMczbhcmoeFvMffBuf60GfgWeNZaO97VwkLEWrsUp5vvJmAXTrfmA9baSnEd9ihGAEtwRjPPxbkNZcypvqlW1BURkbCkFpSIiIQlBZSIiIQlBZSIiIQlBZSIiIQlBZSIiIQlBZSIiIQl3agrEiTGmHE4szwfy2M4s8BPBuKttSGZKss/l+B04Gpr7YrjHOcFZgFXWWttKGoTCaQWlEjw3Ikzy3MyzmSiAN0Ctj0HzPA/33+U84Plz8Ci44UTgH9uxccpgxsuRU6GbtQVCQFjTBuc5Sma+NfLcauOGGA90N9au6SU56wGrrPWTglmbSIlqYtPxEXGmL4EdPEZY4pxVmcdjjO/3TzgSuA+4CpgDzDcWvuh//x44HmcpbaLgR+BO4+xLAI4E93uCgwnY8zDwI1ALZx1zh601n4TcM4EnNbglDL4lUVKTV18IuHnaeAunGXUGwILcIKpK/Ap8JYx5tAaPGNxguxcnLnxioHvjDHH+uPz9zjz5gFgjLnQ/1lX4sxA/RXwH2NMQsA53wJnHec9RYJCASUSfl631k621v6CM2v8PpxWjQVewFl3p4kxpilOi+hya+1cf6voKqAx8LtjvHcXnAk9D2mMs7bTOn/X4+M4k6AGLhuRjjND9RGzuIsEm/4iEgk/qwKe5wAZ1tpDF4sPrbsVDTTyP7fGHLE8WRxOq2riUd67DpAV8PojnJGGa4wx83FWR37fWnsg4Jgd/p+1f+PvIXJK1IISCT8lF7071krFEf5jOwIdAh4tgPePcc5BwHPohX+JmM44La4ZwDAgzT+o45BD3xNFpf4NRMqAAkqk/FoGRAJVrLWrrLWrcNZmGo0TUkezBWcwBADGmMHATdba7621d+K0vPYC5wecUyvgXJGQURefSDllrbXGmC+AD4wxt+GscDsSZ3DF8mOcNh9oH/DaB4w2xmzFGTHYA6jrf35IeyCbI7seRYJOLSiR8m0oTph8hrOSaSJwtrV21zGO/wpntB8A1tr/AI/gtLpWAE8Ct1trfww4pzfwrbVWXXwSUrpRV6QSMcbEARnA76y1C0pxvBdYhzNS8OcglydyBLWgRCoRa20OTmvptlKeMghYo3ASNyigRCqfF4F2psTY9JL8raeHgJtDUpVICeriExGRsKQWlIiIhCUFlIiIhCUFlIiIhCUFlIiIhCUFlIiIhKX/BwPw1Gwt0IAeAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results):\n", - " plot(results.y, label='y')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "plot_position(results)\n", - "savefig('figs/chap20-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Onto the sidewalk\n", - "\n", - "To figure out when the penny hit the sidewalk, we can use `crossings`, which finds the times where a `Series` passes through a given value." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([8.81788535])" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this example there should be just one crossing, the time when the penny hits the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.81788534972054 second" - ], - "text/latex": [ - "$8.81788534972054\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.81788534972054 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = t_crossings[0] * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare that to the exact result. Without air resistance, we have\n", - "\n", - "$v = -g t$\n", - "\n", - "and\n", - "\n", - "$y = 381 - g t^2 / 2$\n", - "\n", - "Setting $y=0$ and solving for $t$ yields\n", - "\n", - "$t = \\sqrt{\\frac{2 y_{init}}{g}}$" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.817885349720552 second" - ], - "text/latex": [ - "$8.817885349720552\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.817885349720552 " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sqrt(2 * init.y / g)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The estimate is accurate to about 9 decimal places." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Events\n", - "\n", - "Instead of running the simulation until the penny goes through the sidewalk, it would be better to detect the point where the penny hits the sidewalk and stop. `run_ode_solver` provides exactly the tool we need, **event functions**.\n", - "\n", - "Here's an event function that returns the height of the penny above the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we pass it to `run_ode_solver`. The solver should run until the event function returns 0, and then terminate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The message from the solver indicates the solver stopped because the event we wanted to detect happened.\n", - "\n", - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    8.50000026.97500000000022 meter-83.29999999999998 meter / second
    8.60000018.596000000000224 meter-84.27999999999999 meter / second
    8.70000010.119000000000225 meter-85.25999999999999 meter / second
    8.8000001.5440000000002243 meter-86.24 meter / second
    8.817802-4.440892098500626e-16 meter-86.41446327683617 meter / second
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "8.500000 26.97500000000022 meter -83.29999999999998 meter / second\n", - "8.600000 18.596000000000224 meter -84.27999999999999 meter / second\n", - "8.700000 10.119000000000225 meter -85.25999999999999 meter / second\n", - "8.800000 1.5440000000002243 meter -86.24 meter / second\n", - "8.817802 -4.440892098500626e-16 meter -86.41446327683617 meter / second" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the `events` option, the solver returns the actual time steps it computed, which are not necessarily equally spaced. \n", - "\n", - "The last time step is when the event occurred:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.81780237518735 second" - ], - "text/latex": [ - "$8.81780237518735\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.81780237518735 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is accurate to about 4 decimal places.\n", - "\n", - "We can also check the velocity of the penny when it hits the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-86.41446327683617 meter/second" - ], - "text/latex": [ - "$-86.41446327683617\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "-86.41446327683617 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v_sidewalk = get_last_value(results.v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And convert to kilometers per hour." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-311.09206779661025 kilometer/hour" - ], - "text/latex": [ - "$-311.09206779661025\\ \\frac{\\mathrm{kilometer}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "-311.09206779661025 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "km = UNITS.kilometer\n", - "h = UNITS.hour\n", - "v_sidewalk.to(km / h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "Here is the source code for `crossings` so you can see what's happening under the hood:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def crossings(series, value):\n", - " \"\"\"Find the labels where the series passes through value.\n", - "\n", - " The labels in series must be increasing numerical values.\n", - "\n", - " series: Series\n", - " value: number\n", - "\n", - " returns: sequence of labels\n", - " \"\"\"\n", - " values = magnitudes(series - value)\n", - " interp = InterpolatedUnivariateSpline(series.index, values)\n", - " return interp.roots()\n", - "\n" - ] - } - ], - "source": [ - "source_code(crossings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", - "\n", - "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", - "\n", - "Use `run_ode_solver` to answer this question.\n", - "\n", - "Here are some suggestions about how to proceed:\n", - "\n", - "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", - "\n", - "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", - "\n", - "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", - "\n", - "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", - "\n", - "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "astronomical_unit" - ], - "text/latex": [ - "$\\mathrm{astronomical_unit}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "N = UNITS.newton\n", - "kg = UNITS.kilogram\n", - "m = UNITS.meter\n", - "AU = UNITS.astronomical_unit" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    r149597870691.0 meter
    v0.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "r 149597870691.0 meter\n", - "v 0.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "r_0 = (1 * AU).to_base_units()\n", - "v_0 = 0 * m / s\n", - "init = State(r=r_0,\n", - " v=v_0)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initr 149597870691.0 meter\n", - "v 0.0 meter / s...
    G6.674e-11 meter ** 2 * newton / kilogram ** 2
    m11.989e+30 kilogram
    r_final701879000.0 meter
    m25.972e+24 kilogram
    t_end10000000.0 second
    dt100000.0 second
    \n", - "
    " - ], - "text/plain": [ - "init r 149597870691.0 meter\n", - "v 0.0 meter / s...\n", - "G 6.674e-11 meter ** 2 * newton / kilogram ** 2\n", - "m1 1.989e+30 kilogram\n", - "r_final 701879000.0 meter\n", - "m2 5.972e+24 kilogram\n", - "t_end 10000000.0 second\n", - "dt 100000.0 second\n", - "dtype: object" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "radius_earth = 6.371e6 * m\n", - "radius_sun = 695.508e6 * m\n", - "\n", - "t_end = 1e7 * s\n", - "dt = t_end / 100\n", - "\n", - "system = System(init=init,\n", - " G=6.674e-11 * N / kg**2 * m**2,\n", - " m1=1.989e30 * kg,\n", - " r_final=radius_sun + radius_earth,\n", - " m2=5.972e24 * kg,\n", - " t_end=t_end,\n", - " dt=dt)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def universal_gravitation(state, system):\n", - " \"\"\"Computes gravitational force.\n", - " \n", - " state: State object with distance r\n", - " system: System object with m1, m2, and G\n", - " \"\"\"\n", - " r, v = state\n", - " G, m1, m2 = system.G, system.m1, system.m2\n", - " \n", - " force = G * m1 * m2 / r**2\n", - " return force" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "3.5423376937972604×1022 newton" - ], - "text/latex": [ - "$3.5423376937972604\\times 10^{22}\\ \\mathrm{newton}$" - ], - "text/plain": [ - "3.5423376937972604e+22 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "universal_gravitation(init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `m2`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " m2 = system.m2 \n", - "\n", - " force = universal_gravitation(state, system)\n", - " dydt = v\n", - " dvdt = -force / m2\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 ,\n", - " -0.005931576848287442 )" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def event_func(state, t, system):\n", - " r, v = state\n", - " return r - system.r_final" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "148895991691.0 meter" - ], - "text/latex": [ - "$148895991691.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "148895991691.0 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "event_func(init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5600110.3392641265" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t_event = get_last_label(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "64.81609188963108 day" - ], - "text/latex": [ - "$64.81609188963108\\ \\mathrm{day}$" - ], - "text/plain": [ - "64.81609188963108 " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "seconds = t_event * s\n", - "days = seconds.to(UNITS.day)" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results.index /= 60 * 60 * 24" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "results.r /= 1e9" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(results.r, label='r')\n", - "\n", - "decorate(xlabel='Time (day)',\n", - " ylabel='Distance from sun (million km)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap21soln.ipynb b/soln/chap21soln.ipynb deleted file mode 100644 index e1678e07..00000000 --- a/soln/chap21soln.ipynb +++ /dev/null @@ -1,1526 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 21\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### With air resistance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we'll add air resistance using the [drag equation](https://en.wikipedia.org/wiki/Drag_equation)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start by getting the units we'll need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "kilogram" - ], - "text/latex": [ - "$\\mathrm{kilogram}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.0025 kilogram
    diameter0.019 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.0025 kilogram\n", - "diameter 0.019 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(height = 381 * m,\n", - " v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " mass = 2.5e-3 * kg,\n", - " diameter = 19e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 18 * m / s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " diameter, mass = params.diameter, params.mass\n", - " g, rho = params.g, params.rho, \n", - " v_init, v_term = params.v_init, params.v_term\n", - " height = params.height\n", - " \n", - " area = np.pi * (diameter/2)**2\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " init = State(y=height, v=v_init)\n", - " t_end = 30 * s\n", - " dt = t_end / 100\n", - " \n", - " return System(params, area=area, C_d=C_d, \n", - " init=init, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.0025 kilogram
    diameter0.019 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    area0.0002835287369864788 meter ** 2
    C_d0.4445009981135434 dimensionless
    inity 381 meter\n", - "v 0.0 meter / secon...
    t_end30 second
    dt0.3 second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.0025 kilogram\n", - "diameter 0.019 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "area 0.0002835287369864788 meter ** 2\n", - "C_d 0.4445009981135434 dimensionless\n", - "init y 381 meter\n", - "v 0.0 meter / secon...\n", - "t_end 30 second\n", - "dt 0.3 second\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function, including acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " rho, C_d, g = system.rho, system.C_d, system.g\n", - " area, mass = system.area, system.mass\n", - " \n", - " f_drag = rho * v**2 * C_d * area / 2\n", - " a_drag = f_drag / mass\n", - " \n", - " dydt = v\n", - " dvdt = -g + a_drag\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 , -9.8 )" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the same event function as in the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.0381 meter0.0 meter / second
    0.3380.559 meter-2.913855777777778 meter / second
    0.6379.2553998560887 meter-5.676321799192868 meter / second
    0.9377.15535917269835 meter-8.166374221525693 meter / second
    1.2374.35521895425103 meter-10.311720070623485 meter / second
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.0 381 meter 0.0 meter / second\n", - "0.3 380.559 meter -2.913855777777778 meter / second\n", - "0.6 379.2553998560887 meter -5.676321799192868 meter / second\n", - "0.9 377.15535917269835 meter -8.166374221525693 meter / second\n", - "1.2 374.35521895425103 meter -10.311720070623485 meter / second" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    21.30000020.486949941310563 meter-17.99999999508715 meter / second
    21.60000015.086949942543686 meter-17.99999999642989 meter / second
    21.9000009.686949943439785 meter-17.99999999740564 meter / second
    22.2000004.286949944090969 meter-17.999999998114706 meter / second
    22.4381640.0 meter-17.99999999852377 meter / second
    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "21.300000 20.486949941310563 meter -17.99999999508715 meter / second\n", - "21.600000 15.086949942543686 meter -17.99999999642989 meter / second\n", - "21.900000 9.686949943439785 meter -17.99999999740564 meter / second\n", - "22.200000 4.286949944090969 meter -17.999999998114706 meter / second\n", - "22.438164 0.0 meter -17.99999999852377 meter / second" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final height is close to 0, as expected.\n", - "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", - "\n", - "We can get the flight time from `results`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "22.438163885803732 second" - ], - "text/latex": [ - "$22.438163885803732\\ \\mathrm{second}$" - ], - "text/plain": [ - "22.438163885803732 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap21-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results):\n", - " plot(results.y)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)\n", - "savefig('figs/chap21-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. Hint: You can create a new `Params` object based on an existing one, like this:\n", - "\n", - "`params2 = Params(params, v_init=-30 * m/s)`\n", - "\n", - "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init-30.0 meter / second
    g9.8 meter / second ** 2
    mass0.0025 kilogram
    diameter0.019 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init -30.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.0025 kilogram\n", - "diameter 0.019 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_init = -30 * m / s\n", - "params2 = Params(params, v_init=v_init)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system2 = make_system(params2)\n", - "results, details = run_ode_solver(system2, slope_func, events=event_func, max_step=0.5)\n", - "details.message" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate the terminal velocity.\n", - "\n", - "1. You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", - "\n", - "2. Create a `Params` object with the system parameters. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", - "\n", - "3. Use `make_system` to create a `System` object.\n", - "\n", - "4. Call `run_ode_solver` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", - "\n", - "5. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", - "\n", - "6. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", - "\n", - "7. Use your best estimate of `v_term` to compute `C_d`.\n", - "\n", - "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.00567 kilogram
    diameter0.02426 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    flight_time19.1 second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.00567 kilogram\n", - "diameter 0.02426 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "flight_time 19.1 second\n", - "dtype: object" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Here's a `Params` object with the dimensions of a quarter,\n", - "# the observed flight time and our initial guess for `v_term`\n", - "\n", - "params3 = Params(params,\n", - " mass = 5.67e-3 * kg,\n", - " diameter = 24.26e-3 * m,\n", - " v_term = 18 * m / s,\n", - " flight_time = 19.1 * s)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.00567 kilogram
    diameter0.02426 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    flight_time19.1 second
    area0.000462244204111976 meter ** 2
    C_d0.6183600157463346 dimensionless
    inity 381 meter\n", - "v 0.0 meter / secon...
    t_end30 second
    dt0.3 second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.00567 kilogram\n", - "diameter 0.02426 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "flight_time 19.1 second\n", - "area 0.000462244204111976 meter ** 2\n", - "C_d 0.6183600157463346 dimensionless\n", - "init y 381 meter\n", - "v 0.0 meter / secon...\n", - "t_end 30 second\n", - "dt 0.3 second\n", - "dtype: object" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Now we can make a `System` object\n", - "\n", - "system3 = make_system(params3)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Run the simulation\n", - "\n", - "results, details = run_ode_solver(system3, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "22.438163885803736 second" - ], - "text/latex": [ - "$22.438163885803736\\ \\mathrm{second}$" - ], - "text/plain": [ - "22.438163885803736 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# And get the flight time\n", - "\n", - "flight_time = get_last_label(results) * s" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# The flight time is a little long, so we could increase `v_term` and try again.\n", - "\n", - "# Or we could write an error function\n", - "\n", - "def error_func(guess, params):\n", - " \"\"\"Final height as a function of C_d.\n", - " \n", - " guess: guess at v_term\n", - " params: Params object\n", - " \n", - " returns: height in m\n", - " \"\"\"\n", - " print(guess)\n", - " params = Params(params, v_term=guess)\n", - " system = make_system(params)\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " flight_time = get_last_label(results) * s\n", - " error = flight_time - params.flight_time\n", - " return magnitude(error)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18.0 meter / second\n" - ] - }, - { - "data": { - "text/plain": [ - "3.338163885803734" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# We can test the error function like this\n", - "v_guess1 = 18 * m / s\n", - "error_func(v_guess1, params3)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "22.0 meter / second\n" - ] - }, - { - "data": { - "text/plain": [ - "-0.22714064382192944" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_guess2 = 22 * m / s\n", - "error_func(v_guess2, params3)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "18.0 meter / second\n", - "22.0 meter / second\n", - "20.0 meter / second\n", - "21.0 meter / second\n", - "21.5 meter / second\n", - "21.75 meter / second\n", - "21.625 meter / second\n", - "21.6875 meter / second\n", - "21.71875 meter / second\n", - "21.703125 meter / second\n", - "21.6953125 meter / second\n", - "21.69140625 meter / second\n", - "21.689453125 meter / second\n", - "21.6884765625 meter / second\n", - "21.68798828125 meter / second\n", - "21.687744140625 meter / second\n", - "21.6878662109375 meter / second\n", - "21.68792724609375 meter / second\n", - "21.687896728515625 meter / second\n", - "21.687881469726562 meter / second\n", - "21.68787384033203 meter / second\n", - "21.687877655029297 meter / second\n", - "21.68787956237793 meter / second\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root21.687878608703613 meter / second
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 21.687878608703613 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Now we can use `root_scalar` to find the value of `v_term` that yields the measured flight time.\n", - "\n", - "res = root_bisect(error_func, [v_guess1, v_guess2], params3)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "21.687878608703613 meter/second" - ], - "text/latex": [ - "$21.687878608703613\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "21.687878608703613 " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "v_term_solution = res.root" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.4259437619496639 dimensionless" - ], - "text/latex": [ - "$0.4259437619496639\\ dimensionless$" - ], - "text/plain": [ - "0.4259437619496639 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Plugging in the estimated value, we can use `make_system` to compute `C_d`\n", - "\n", - "params_solution = Params(params3, v_term=v_term_solution)\n", - "system = make_system(params_solution)\n", - "system.C_d" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap22soln.ipynb b/soln/chap22soln.ipynb deleted file mode 100644 index 889338bf..00000000 --- a/soln/chap22soln.ipynb +++ /dev/null @@ -1,2957 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 22\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Vector` object represents a vector quantity. In the context of mechanics, vector quantities include position, velocity, acceleration, and force, all of which might be in 2D or 3D.\n", - "\n", - "You can define a `Vector` object without units, but if it represents a physical quantity, you will often want to attach units to it.\n", - "\n", - "I'll start by grabbing the units we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "kilogram" - ], - "text/latex": [ - "$\\mathrm{kilogram}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a two dimensional `Vector` in meters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([3., 4.]) " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A = Vector(3, 4) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the elements by name." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "3.0 meter" - ], - "text/latex": [ - "$3.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "3.0 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.x" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "4.0 meter" - ], - "text/latex": [ - "$4.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "4.0 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The magnitude is the length of the vector." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.0 meter" - ], - "text/latex": [ - "$5.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "5.0 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The angle is the number of radians between the vector and the positive x axis." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.9272952180016122 radian" - ], - "text/latex": [ - "$0.9272952180016122\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.9272952180016122 " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we make another `Vector` with the same units," - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}1.0 & 2.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}1.0 & 2.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([1., 2.]) " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "B = Vector(1, 2) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can add `Vector` objects like this" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}4.0 & 6.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}4.0 & 6.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([4., 6.]) " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A + B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And subtract like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}2.0 & 2.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}2.0 & 2.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([2., 2.]) " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A - B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compute the Euclidean distance between two Vectors." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.8284271247461903 meter" - ], - "text/latex": [ - "$2.8284271247461903\\ \\mathrm{meter}$" - ], - "text/plain": [ - "2.8284271247461903 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.dist(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the difference in angle" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-0.17985349979247822 radian" - ], - "text/latex": [ - "$-0.17985349979247822\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.17985349979247822 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.diff_angle(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we are given the magnitude and angle of a vector, what we have is the representation of the vector in polar coordinates." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.9272952180016122 radian" - ], - "text/latex": [ - "$0.9272952180016122\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.9272952180016122 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mag = A.mag\n", - "angle = A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `pol2cart` to convert from polar to Cartesian coordinates, and then use the Cartesian coordinates to make a `Vector` object.\n", - "\n", - "In this example, the `Vector` we get should have the same components as `A`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}3.0000000000000004 & 3.9999999999999996\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}3.0000000000000004 & 3.9999999999999996\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([3., 4.]) " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x, y = pol2cart(angle, mag)\n", - "Vector(x, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to represent the direction of `A` is a unit vector, which is a vector with magnitude 1 that points in the same direction as `A`. You can compute a unit vector by dividing a vector by its magnitude:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}0.6 & 0.8\\end{pmatrix} dimensionless\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}0.6 & 0.8\\end{pmatrix}\\ dimensionless$" - ], - "text/plain": [ - "array([0.6, 0.8]) " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A / A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or by using the `hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}0.6 & 0.8\\end{pmatrix} dimensionless\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}0.6 & 0.8\\end{pmatrix}\\ dimensionless$" - ], - "text/plain": [ - "array([0.6, 0.8]) " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A.hat()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_grav` that represents acceleration due to gravity, with x component 0 and y component $-9.8$ meters / second$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}0.0 & -9.8\\end{pmatrix} meter/second2\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}0.0 & -9.8\\end{pmatrix}\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "array([ 0. , -9.8]) " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "a_grav = Vector(0, -9.8) * m / s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Degrees and radians\n", - "\n", - "Pint provides units to represent degree and radians." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "radian" - ], - "text/latex": [ - "$\\mathrm{radian}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "degree = UNITS.degree\n", - "radian = UNITS.radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you have an angle in degrees," - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "45 degree" - ], - "text/latex": [ - "$45\\ \\mathrm{degree}$" - ], - "text/plain": [ - "45 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle = 45 * degree\n", - "angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can convert to radians." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.7853981633974483 radian" - ], - "text/latex": [ - "$0.7853981633974483\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.7853981633974483 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle_rad = angle.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If it's already in radians, `to` does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.7853981633974483 radian" - ], - "text/latex": [ - "$0.7853981633974483\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.7853981633974483 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle_rad.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also convert from radians to degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "45.0 degree" - ], - "text/latex": [ - "$45.0\\ \\mathrm{degree}$" - ], - "text/plain": [ - "45.0 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle_rad.to(degree)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As an alterative, you can use `np.deg2rad`, which works with Pint quantities, but it also works with simple numbers and NumPy arrays:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.7853981633974483 radian" - ], - "text/latex": [ - "$0.7853981633974483\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.7853981633974483 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_force` that represents acceleration due to a force of 0.5 Newton applied to an object with mass 0.3 kilograms, in a direction 45 degrees up from the positive x-axis.\n", - "\n", - "Add `a_force` to `a_grav` from the previous exercise. If that addition succeeds, that means that the units are compatible. Confirm that the total acceleration seems to make sense." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}1.1785113019775793 & 1.1785113019775793\\end{pmatrix} newton/kilogram\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}1.1785113019775793 & 1.1785113019775793\\end{pmatrix}\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$" - ], - "text/plain": [ - "array([1.1785113, 1.1785113]) " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "N = UNITS.newton\n", - "mag = 0.5 * N\n", - "angle = 45 * degree\n", - "theta = angle.to(radian)\n", - "x, y = pol2cart(theta, mag)\n", - "force = Vector(x, y)\n", - "\n", - "mass = 0.3 * kg\n", - "a_force = force / mass\n", - "a_force" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}1.1785113019775793 & -8.621488698022421\\end{pmatrix} newton/kilogram\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}1.1785113019775793 & -8.621488698022421\\end{pmatrix}\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$" - ], - "text/plain": [ - "array([ 1.1785113, -8.6214887]) " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "a_force + a_grav" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Baseball" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `Params` object that contains parameters for the flight of a baseball." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    y1 meter
    g9.8 meter / second ** 2
    mass0.145 kilogram
    diameter0.073 meter
    rho1.2 kilogram / meter ** 3
    C_d0.33
    angle45 degree
    velocity40.0 meter / second
    t_end10 second
    dt0.1 second
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "y 1 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 0.145 kilogram\n", - "diameter 0.073 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "C_d 0.33\n", - "angle 45 degree\n", - "velocity 40.0 meter / second\n", - "t_end 10 second\n", - "dt 0.1 second\n", - "dtype: object" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = 10 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.33,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the function that uses the `Params` object to make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    y1 meter
    g9.8 meter / second ** 2
    mass0.145 kilogram
    diameter0.073 meter
    rho1.2 kilogram / meter ** 3
    C_d0.33
    angle45 degree
    velocity40.0 meter / second
    t_end10 second
    dt0.1 second
    initR [0 meter, ...
    area0.004185386812745002 meter ** 2
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "y 1 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 0.145 kilogram\n", - "diameter 0.073 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "C_d 0.33\n", - "angle 45 degree\n", - "velocity 40.0 meter / second\n", - "t_end 10 second\n", - "dt 0.1 second\n", - "init R [0 meter, ...\n", - "area 0.004185386812745002 meter ** 2\n", - "dtype: object" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that computes drag force using vectors:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-0.11719680972835739 & -0.11719680972835739\\end{pmatrix} kilogram meter/second2\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-0.11719680972835739 & -0.11719680972835739\\end{pmatrix}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "array([-0.11719681, -0.11719681]) " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V_test = Vector(10, 10) * m/s\n", - "drag_force(V_test, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function that computes acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([28.28427125, 28.28427125]) ,\n", - " array([ -6.46603088, -16.26603088]) )" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an event function to stop the simulation when the ball hits the ground:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1 meter" - ], - "text/latex": [ - "$1\\ \\mathrm{meter}$" - ], - "text/plain": [ - "1 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final label tells us the flight time." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.004505488017051 second" - ], - "text/latex": [ - "$5.004505488017051\\ \\mathrm{second}$" - ], - "text/plain": [ - "5.004505488017051 " - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "flight_time = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `x` tells us the how far the ball landed from home plate:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "99.30497406350605 meter" - ], - "text/latex": [ - "$99.30497406350605\\ \\mathrm{meter}$" - ], - "text/plain": [ - "99.30497406350605 " - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "R_final = get_last_value(results.R)\n", - "x_dist = R_final.x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the results\n", - "\n", - "The simplest way to visualize the results is to plot x and y as functions of time." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap22-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3xUdb7/8deU9J5A6DUJ39A7SO8iHRFsWLCsZd11m+6617u7193r1d+irq7uylrWrlgARZpYAEGK9JbwhdATQkvvmcyc3x9nYAMCBkjmzCSf5+ORRzLnnMn5IJh3vt/zLTbDMBBCCCH8jd3qAoQQQogLkYASQgjhlySghBBC+CUJKCGEEH7JaXUBdU0pFQL0BbIBt8XlCCGEOJcDaAZs1FpXVD9R7wMKM5xWW12EEEKISxoCrKl+oCEEVDbAe++9R9OmTa2uRQghRDXHjx9n5syZ4P1ZXV1DCCg3QNOmTWnZsqXVtQghhLiwHzyCkUESQggh/JIElBBCCL8kASWEEMIvWfIMSinVD1iktU70vg4GXgKmY/ZDPqe1fqra9TcC/4c5FHEVMEtrfdLnhQshhPAZn7aglFI2pdS9wHIguNqpJwAFJGEOC79TKXWH9z2dgNeBWUACsA+Y68OyhRBCWMDXXXxPAA8C/3ve8TuBJ7XWeVrrQ8AzwP3ec7cBn2ut12ity4HfA4OUUik+qlkIIYQFfB1Qc7TWvYFNZw4opWIxu+7Sql23B+jq/bpT9XNa61LgaLXzQgghLJBXVM6xU8V19v19+gxKa33sAocjvZ9Lqx0rBcKrnS/lXNXPCyGE8KHD2YV8umo/K7ccxTDgjT9cS1x0aK3fxx8m6pZ4P4dVOxYOFFc7H8a5qp8XQghRxwzDYMe+08xflcGWPeYYNZsNhvdqSVRE8I+8+8pYHlBa6zyl1HHMQRJZ3sOp/KdbL817DgClVDjQmnO7BIUQQtSBKreHNduyWLByPweOFQAQHORgTL/WTB7anuaNIn/kO1w5ywPK6x3gT0qpHZhdeo8AL3jPvQ+sUUoNB9YBTwFbtdZ7rShUCCEagtJyF8s3HOGzb/dzOr8MgNioECYOase4ge2IrqNWU3X+ElB/BJ4FdmMO3HgFmAOgtd6plLrb+7oFsAGYYVGdQghRr+UVlvP5mgMsWXuIkjIXAC0TI7l+eDLDe7UkOMjhs1osCSit9UogttrrcuAh78eFrp8HzPNJcX5q/vz5PPnkkyxZsoQmTZrw3nvv8eqrr/LZZ58RExNjdXlCiACXebKIBSv3882mo1S5PQB0ahfPDSNS6NOxCXa7zec1+UsLym888dp6NqWf8Mm9+nRswp/uvaZG106bNo2vv/6aJ554gkcffZRnn32WOXPmSDgJIa6KPpzLvBUZrN+VjWGYAx8GdG3GtOHJpLaNt7Q2CagA8uc//5mJEydy1113cfvtt9OvXz+rSxJCBCDDMNiiT/LJN/vYtT8HAKfDzqi+rZg6LImWiVEWV2iSgDpPTVs0VkhISODaa69l7ty5TJ482epyhBABxu32sGb7Meat2MfBY4UAhIc6GTegLZOHJhFfB3OZroYEVADZuXMnCxcuZMKECfz3f/837733Hna7LEgvhLi0SpebrzceYf7KDI7nmOsexEWFMGVoEtcNaEtEWJDFFV6YBFSAKC8v57e//S0PPPAAd955J5MnT+a1117jvvvus7o0IYSfKi13sWTtIT77dj/5RRUANG8UwbQRyYzo3cqnI/KuhARUgHj22WcJDQ3lnnvuwel08pe//IV7772XoUOHkpqaanV5Qgg/kl9UwcLV+1ny3UFKyqsAaN8ihhmjUhjQtTkOC0bkXQkJqADx+OOPn/O6f//+7Ny506JqhBD+6FReGQtWZfDF+sNUutwAdElKYMbIDvRUjbHZAiOYzpCAEkKIAHfsdDGffL2PFZuPUuU2AOjXqSkzRqVYPlT8akhACSFEgDqUXcjHX+1lzfYsPAbYbTC0Rwumj0qhXfPAnyMpASWEEAFm75E8PvpqLxt2HwfA6bAxqncrpo9MoXnjulu81dckoIQQIkCkHczhwy/3skWb210EO+1ce00bpg1PoXHc+bsSBT4JKCGE8GNn9mH68Ku97Nx/GoDQYAcTBrVjyrAk4qL8a3JtbZKAEkIIP3RmOaK5yzV7DucBEBHqZOKQ9kwekuST7S6sJgElhBB+xDAMNqafYO5yzb6j+QBEhQczZVh7Jg5q77erPtQFCSghhPADHo/Bht3Hmful5kCWuXNtTGQw04YnM25gO8JCGt6P64b3JxZCCD/i8Ris25nN3C81h7LNBVzjokKYNiKF6wa0ITS44f6Ybrh/ciGEsNCZYPpg+R4OHy8CID46lOkjU7j2mjaE+Pk6eb4gASWEED7k8Ris3XmMucv12WBqFBPK9FEdGNOvtd8v4OpLElAB4g9/+APl5eXMnj377LExY8bw+9//npEjR1pYmRCiJs4E0wfLNUeqBdOM0WYwBTklmM4nAXWe7LlPUrZ/i0/uFZbUi2Y3P/7jFwJTpkzhvvvuo6KigpCQELZv305RURFDhgyp4yqFEFfD4zFYtyubD774T1deo9gwbhyVwmgJpkuSgAoQvXv3JjY2lpUrVzJ27FgWLVrE+PHjCQpqOENOhQgkhmGwflc273/xn8EPjWJCuXF0BwmmGpKAOk9NWzS+ZrPZmDRpEosXL2bMmDEsXbqUf/zjH1aXJYQ4j2EYfL/7OO8v/89w8YSYUGaM6sC1/SWYLocEVACZMmUK06ZNY+3atYSHh9O9e3erSxJCeBmGweY9J3nviz1keCfYxkeHeIOpjQx+uAISUAGkffv2JCUlMXv2bCZPnmx1OUII/rNW3rvL0s8uSRQXFcL0kSmMHdBWhotfBQmoADNlyhSefPJJXnzxRatLEaLB230gh3eXpbNrfw4A0RHB3DAihfGD2jboCba1Rf4LBphmzZrRq1cvWrdubXUpQjRYe4/k8e7SdLbuPQVAZFgQ1w9PZuLgdoSHysCl2iIBFSCKiorIysrilVde4ZZbbrG6HCEapIPHCnhv2Z6zGwWGhTiZOiyJKUOTGtQirr4iARUgDh48yB133MHQoUOZMmWK1eUI0aBknizigy80q7dnYRgQEuxg4qB2TBuR0iC2vbCKBFSA6NatG9u2bbO6DCEalJO5pXywXPPNpiN4DHA67Iwb2JYZI1OIi66/GwX6CwkoIYQ4T15ROR99tZdl6w5R5Taw222M7d+aG0d3IDEu3OryGgwJKCGE8CouczF/xT4Wrj5ARaUbmw2G92rJLWMVzRtFWl1eg+M3AaWUugb4O6CAU8DTWuvXlFLBwEvAdMANPKe1fsq6SoUQ9U15RRWfrznAvBUZlJS5AOjfuSm3jetI22bRFlfXcPlFQCml7MBnwG+01u8qpfoCq5VSG4GbMUMrCYgBlimlsrTWb1tXsRCiPnBVeVi+4TAffqnJK6oAoFtyI24f35HUNvEWVyf8IqCAOCARsCmlbIABVAGVwJ3ALK11HpCnlHoGuB+QgBJCXBGPx+DbbVm8tyyd4zmlAKS0iuWO8R3p0SHR4urEGX4RUFrrHKXUS8BbwBuAA/gFkA00A9KqXb4H6OrzIoUQAe/MenlvLU47u8J4qyaR3HZdRwZ0bYbNZrO4QlGdXwSUt4uvHLgVmAcMBOYD+d5LSqtdXgrIMBohxGVJO5jD20vS2X3AXJaoUWwYM8cqRvRuhcNht7g6cSF+EVDANGCQ1vpR7+tVSqnXMbv3AMKqXRsOFPuyOCFE4Dp8vJB3lqSfXf0hKjyYG0d3YPzAtrLCuJ/zl4BqBYScd6wKczTfccxBElne46mc2+UnhBA/cCqvjPe/2HN2km1osIMpw5KYNjxZ1ssLEP4SUMuBp5RS9wGvAr2AnwD3AkeAPymldgCRwCPAC1YVKoTwb0WllXzy9T4+X3MAV5UHh93GhIFtuWlMB+KiZPWHQOIXAaW13q2Umgb8BZiN2Wp6TGv9mVLqC+BZYDdgB14B5lhWrBDCL1W43Hy++gCffLPv7FymoT1aMHNcqkyyDVB+EVAAWuslwJILHC8HHvJ+CCHEOdwegxWbjvLesnROF5QD0KNDY+4c34nkVrEWVyeuht8ElBBCXI4LDRlv3zyGWRM70VPJXKb6QAJKCBFw9h3N481FaezIOA1AYlwYt4/ryNCeLbHbZS5TfSEBJYQIGMdzSnhnaTrfbjUH9UaGBXHTmA6MH9hOhozXQxJQQgi/V1RayUdf7WXRmoNUuT0EOe1MGtyeGaNSiAyXDQPrKwkoIYTfclW5WbTmIB99tZdi78i8Eb1bctu4jrIvUwMgASWE8Dsej8HqbVm8vTSdk7nmSmfdUxpx18TOJLWUkXkNhQSUEMKv7D6Qw+sLd7HvqLkUZ5umUcya2JneqYmymGsDIwElhPALx04V8+biNNbtzAYgLiqEmdd1ZHS/1jhkZF6DJAElhLBUYUklH36pWfzdQdweg5BgB9OGJ3P98GTCQuRHVEMmf/tCCEu4qjws/u4Ac7/cS0mZC5sNRvdtzW3jUkmICfvxbyDqPQkoIYRPGYbBup3ZvLkojeycEgB6pDTm7smdadc8xuLqhD+RgBJC+EzG0XxeW7jr7KaBLRMjuXtSZ/p0bCIDIMQPSEAJIepcTkEZby9J55tNRwFz08CZYxVjB7TFKbvZiouQgBJC1JnyyioWrMhg3soMKirdOB02Jg1J4sbRHYgMk00DxaVJQAkhap3HY/Dt1kzeWpx2dguMAV2bcdfEzjRrFGFxdSJQSEAJIWrVnsO5vPbpLvSRPADat4jh3ild6JrUyOLKRKCRgBJC1IpTeWW8tTiNVVszAXOi7R3jOzKij0y0FVdGAkoIcVXOPGf6ZEUGlS43QU471w9P5oYRyYSHynMmceUkoIQQV8QwzAVd31iUxun8MgAGd2/OrImdaRIvK42LqycBJYS4bBlH83nl052kH8oFzOdM903tSuf2CRZXJuqTGgeUUqoJ0BtIBNzAcWCL1jqnjmoTQviZvMJy3lmazlcbj2AYEBsZwu3jOzKqrzxnErXvkgGllHICtwK/BLoDlUAe4ADivddsAP4JzNVae+q0WiGEJVxVHj5ffYC5X2rKKqrOzme6aXQHImQ+k6gjFw0opdQw4GXgGPA6sAw4oLU2vOdtQGdgKPAz4H+UUvdprVfWddFCCN/ZlH6C1z7bSdYpc928vp2acO/kLjRvHGlxZaK+u1QL6jfATVrrnRc66Q2qXd6PfyqlegJ/BlbWdpFCCN/LOlXMa5/tYlP6CQBaNI7kJ1O70Du1icWViYbiogGltZ58Od9Ia70VmHTVFQkhLFVa7uLDL/eycPV+qtwG4aFObrlWMWFQe4Kcsm6e8J3LGSQRDrQDQs4/p7XeUptFCSF8z+MxWLklkzcX7SavqAKbDcb0a83t4zsSFxVqdXmiAapRQCmlbgPmAGHA+UN1DMxBE0KIAJWRmc+/5u9gz2FzeSLVOo77p3UlpVWcxZWJhqymLainMAdKPAeU1105QghfKiiu4J2l6SzfcNgcNh4VwqwJnRjRuxV2GTYuLFbTgIoGXtJaH67LYoQQvuH2GCxbd4h3l6ZTXObCYbcxaWh7bh6jZNi48Bs1Dah3gFnA43VXihDCF9IP5jJn/g4OHCsAzO3W77u+K62aRFlcmRDnqmlAzQa2KKVmAoeAcybkaq1H1nJdQohalldYzpuL087uats4Lox7J3dhQNdmst268EuX04IqBhYDpXVXjhCitlW5PSz+7iDvf7GH0vIqnA47N4xIZvqoFEKDZTlO4b9q+q+zL9Bfa72jrgpRSjXDXLliBOZAjFe01n9QSgUDLwHTMdcAfE5r/VRd1SFEfbJr/2nmzN/B4eNFAPTp2ISfTO1C80ayCoTwfzUNKA3E1mUhwGfAZqAJ0AxYpZRKB7oCCkgCYoBlSqksrfXbdVyPEAErr7Ccfy/azcrN5uaBTeLDuW9qV/p1bmpxZULU3OUMM39TKfUSsB9wVT+ptV5yNUUopfoD7YFBWmsXcFApNRwoA54BZmmt84A8pdQzwP2ABJQQ53F7u/Pe83bnBTntzBiZwrSRKYQEyXRFEVhqGlAfeD8/c4FztTFRtzewE3PB2VmYXXz/xJx71QxIq3btHsxWlRCimt0HcpgzfweHsgsBszvvvqldadYowuLKhLgyNQoorXVdL8AVDwwBVmG2pFIxV08/5T1ffWBGKSDbdQrhVVBcwRuLdvP1RnN0XmJ8OPdLd56oBy653YbWetXlfDOl1Eit9TdXUEcFUKi1/h/v6+1KqdeAO72vw6pdG445olCIBs3tMVi+4TBvL06juMxljs4bmcyMUR2kO0/UC5dqQf1KKfUY8HfgK++zoR/wbmo4EXNPqFLgSgJqDxCulArWWldWqy0Pc+deBWR5j6dybpefEA1OxtF8/jlvO/uO5gPQs0NjHpjWTfZoEvXKpbbbmKqUuh54GmijlFoJ7AZOYy4Y2xhzl90BwBHgL1rrT66wji8xu/OeVUr9BjOQ7gEeBA4Af1JK7QAigUeAF67wPkIEtOIyF+8uTWfJ2oMYBiTEhPKTKV0Z2E0m24r655LPoLTWC4AF3hF14zHDqAnmShLHMYeFP6W1Xn01RWity707+L4IZGMOkvir1nqeUmox8CxmONqBVzBXVheiwTAMg1VbMnn9893kF1Vgt9uYMrQ9t1yrCA+VtfNE/VTTQRIrqeOdcrXWB4AJFzheDjzk/RCiwck8WcTL83awI+M0AJ3axfPgDd1p2yza4sqEqFuyzokQfqrC5ebjr/cy75sMqtweosKDuXtSZ0b1bSXdeaJBkIASwg9t3nOCOfN3cDzHnGExpl9rZk3sTHREsMWVCeE7ElBC+JHcwnJe/XQna7YfA6BN0yh+Or07ndolWFyZEL4nASWEH3B7DJatPcjbS9MpLa8iJNjBLWMUU4Yl4XTU9Tx5IfxTjQNKKZUIdAOCMIeZn3W1a/EJ0ZAdyCrgH59sY+8Rc05T305NeOD6biTGy4IpomGrUUAppe7BXBvvQuNZa2MtPiEanLKKKt7/Yg8LVx/A4zFIiAnlvqldZQNBIbxq2oJ6FHgV+L3WuqgO6xGiQfh+93Fenr+D0/ll2G0weUh7Zl6XKnOahKimpgHVCnhBwkmIq5NTUMYrn+5k7Y5sAJJaxvCz6T1IblXX260JEXhqGlDLgVHAvjqsRYh6y+MxWLb+EG8tTqO0vIrQYAe3jevIxEHtcMggCCEuqKYBtR14Tik1GdgLVFY/qbX+bW0XJkR9cTi7kJc+3saew3mAdxDEtG4kxskgCCEupaYBNQzYgLntRffzzhm1WpEQ9USly83cLzXzV2Tg9hjER4dw39RusrCrEDVU07X4RtR1IULUJzszTvPSx9s4droEgHED23Ln+E5EhMkgCCFq6nLmQTXB3POpM+aq4unAq95FXoUQQHFpJf/+fDdffn8EgFZNovj5jB50bBdvcWVCBJ6azoPqh7ln01FgLeZE3YnAz5VSw7XWm+quRCH8n2EYrNl+jFc+3Ul+UQVOh50bR3dg+shkgpwyTVCIK1HTFtSzwAfAg1rrs8+clFIvAbMB6QIUDdbp/DJenreD79OOA+Z2GD+b0YNWTaIsrkyIwFbTgOoD3Fs9nLxexNy0UIgG58zQ8TcXpVFWUUV4qJNZEzsztn8b7HYZBCHE1appQGUDbQF93vH2gEzeFQ3O0RNFvPTxNtIO5gJwTZemPDCtGwkxYRZXJkT9UdOAegd4RSn1S2C999gA4G/ec0I0CFVuD/NW7GPu8r1UuT3ERoXwwLRuDOrW3OrShKh3ahpQTwLNgY8wR/DZABdmF9/jdVOaEP5l39E8/v7hNg5lFwLmJoJ3T+pMZLhsIihEXajpPKhK4CdKqUcABZQBGVrrsrosTgh/UOFy8/6yPXy6KgOPAU0TwvnZ9B5079DY6tKEqNcuGlBKqfHAl1prl/fr87VSSgGyH5Sov3btP83fP9pG9ukS7DaYOiyJmdelEhose30KUdcu9X/ZIqApcNL79cXIflCi3iktd/HW4jSWrD0EQOumUTx8Yw9UG5lwK4SvXDSgtNb2C30tRH23ec8JXvp4O6fzy3DYbcwY1YEbR6fIhFshfKymK0l8A0zTWuefd7wxsExr3bsuihPCl4pLK3n1s118s+koAMktY3j4pp60ax5jcWVCNEyXegY1HOjkfTkMuF8pdf6cp45AUt2UJoTvbNiVzT/nbSe3sIIgp52ZY1OZOixJ9moSwkKXakHlAI9gDim3AQ8B7mrnDaAY+E2dVSdEHSsoruDVT3examsmAB3bxvPwTT1omSjLFAlhtUs9g9qJuVIESqkVmF18eb4qTIi69t32Y8yZv4P84gqCgxzcOb4jEwa3xyHLFAnhFy7VxReutS71vpxw5tiFrq12nRB+r6C4gpfn7+C77ccA6JKUwMM39qRZowiLKxNCVHepLr4ipVQzrfVJzK68C+2ca0OGmYsAsmZ7Fi/P20FhSSWhwQ5mTezMuAFtZXFXIfzQpQJqJJDr/Vq20xABraC4gjnzd7DG22rqltyIh2/qSZP4C3YKCCH8wKWeQa260NcASqlgoBuwV2tdWHflCXH1vttxjJfnbaeg2Gw13TWpM9ddI60mIfxdTedBJQOvA78DdmDuqtsNKFBKjdNar7/U+y+HUirWe48/aq3f9IbhS8B0zFGEz2mtn6qt+4n6q6C4gn8t2MnqbVmA2Wr6+Y09aJogz5qECAQ1XVDsRcx9nw4BtwMtMReNvQt4DhhYizXNAVpUe/2E915JQAywTCmVpbV+uxbvKeqZ9buy+cfH28kvrpBnTUIEqJoG1BCgp9b6uFJqKrBYa71PKfUq8MvaKkYpdScQDeysdvhOYJZ3iHueUuoZ4H5AAkr8QHFpJa98upMVm815TV2SEvjFTT2l1SREAKppQJUDQUqpCMxVJe72Hm8KFNRGIUqpdsCfMFtjy7zHYoFmQFq1S/cAXWvjnqJ+2bznBH//cBu5heVn5zVNHNxeWk1CBKiaBtQXwKuY3XylwOdKqVHAC8DCqy1CKeUA3gUe8bbSzpyK9H6uPs+qFJChV+Ks0nIXry/czfINhwFIbRPHL2/pRYvGkT/yTiGEP6tpQN2PuatuG2CC1rpEKdUXWAk8Wgt1/AHQWuv55x0v8X4Oq3YsHHNelhDszDjN83O3cDKvDKfDzu3jUpkyLFlWgxCiHqjpjrrFwC8AlFLRSqlYrfXTtVjHzUBzpdQ07+so4J9AP+A45iCJLO+5VM7t8hMNUIXLzdtL0lj47QHAXHn8l7f0ok3TaIsrE0LUlhpvC6qUehD4L6C59/VJ4IXaCCqtdep599oGPO8dZl4M/EkptQOzy+8RzK5F0UDtO5rHc+9vIfNkMXa7jZtHd2DG6A44ZeVxIeqVms6DegSzG+5JYA3mEkeDgMeUUmVa67oMjD8CzwK7ATvwCuZQdNHAVLk9fPTVXj78ai8ej0GrJpH86pZepLSKs7o0IUQdqGkL6iHgAa31B9WOfaeUOgz8L7XcotFa96j2dbn3/g/V5j1EYDl6oojn3t9MRmYBNhtMGZrE7eM7EhIky0AKUV/VNKAaAxsvcHwz5qRdIeqEx2Ow6LsDvLUojcoqD4lxYfzy5l50TW5kdWlCiDpW04DaBcwAzl9i6CbMeUlC1LrT+WW8MHcr2/adAmB039b8ZGoXwkODLK5MCOELNQ2oPwKLlVIDgHXeYwOA64BpF32XEFdo1ZZMXp6/g5IyF9ERwfxsRg8GdG1mdVlCCB+q6TDz5d6JuT/HXIuvDEgH+mqtt9dhfaKBKSqtZM68HXzrXeC1b6cm/PzGHsRFhVpcmRDC12o8zFxr/S3wbR3WIhq47XtP8be5W8gpKCc02MG9U7pybf/W2Gwy6VaIhuiSW74Dz2Nuc1EBLAAek/2fRG2rdLl5Z2k6n67aD5hLFf361t6yBbsQDdylWlBPAJOAv2Luw/QzIAFzYIQQteJQdiHPvreZQ9mF2O02br1WMX1kCg6ZdCtEg3epgJoO3Kq1XgGglFoFfKuUCtJau3xSnai3PB6Dz9cc4K3FabiqPDRvFMFvZvamQ2uZdCuEMF0qoFpy7hDyjZgrOTQBMuuyKFG/5RSU8fwH/xk+PvaaNtw7uQuhITV+JCqEaAAu9RPBgdm1B4DW2lBKVQDBdV6VqLfW7TzGix9to6jUHD7+8I096N9Fho8LIX5IfmUVPlFeUcVrC3fxxXpzz6ZeqYn88qaexEU3vOHjhmFguF1Q5cIwDPOgzYbN+/nsa2cwNrss5SQarh8LqFne1cSrX3+bUup09Yu01v+s9cpEvZGRmc8z724m61QxQU47syZ2YtLg9gE7fNzwuHGXFOAuycddnG9+LinAXV6Mp7wUT0WJ97P364oyDLcLo8plBpO7quY3s9mxBQWbYeUMxu4MxhYcij00AkdoBPaQCOxh3s+hkTgiY3BGxOGIjMUREYs9uOH9AiDqj0sF1BHgwfOOHQfuOu+Ygbl3kxDn8HgMFqzM4N1l6VS5DVo3jeLR2/rQtpl/79nkqSjFlX+SqvyTVBWeoir/JK4C83NVUQ6e0iLMf/ZXweHE5gjCZreDYZjf7UxrCsM8VuUCw4NRWY5RWQ5U63OvIVtwKM7IOByRcThjEnHGNCYo1vzsjE3EGZWAzSEdKcI/XfRfpta6rQ/rEPVMTkEZf/tgC9v3mY3tiYPaMWtSZ79ZfdwwDNyFp6nMycKVk4XrdNbZr93FeT/ybhuOiBgcEWYrxWytxOAIi8IeEm62ZkLCsYean20hodidIWYQOIOwOZzYbD8+jN4wDPC4Maoq8bgqMarMD09lOZ7yErN1VlZsttTKi3GXFZ/bsivOw6gsx5WbjSs3mwvu82mzm6GV0ILghOYEJbQgqFELguJb4IiICdhWrqgf5FcnUeu+332c5+dupai0kpjIYH5xU0/6dmpqWT2G20Xl6Swqjx+g4sQhKk8cpOLEIYyK0gteb3MGm62LmESCzrQ0Yhp7WyCNcIRH++TZkM1m87a0nNhDwi/7/YZh4KkoxTkzC/gAAB1aSURBVF2cR1VRDlUFp6jKP0VVwUmqCk7hyj+JuyiXqvwTVOWfoGz/lnPebw+NJDixjfnRpA0hiW0JatwKe1BIbf0RhbgkCShRaypdbt5YtJtFaw4C0LNDY351Sy+fDoQwDIOq/BOUZ2oqsvZSnrWXylNHLvjcxx4eTXCjlmbrwfs5KKEFzphGNWrh+DubzYbD+6wquNGFd8Uxqly48o7jyjlmtiBzzdakKycLT3kx5Ud2U35kd7VvaicooTkhTdsT0jzF/GjSFptTVpgXtU8CStSKI8cLmf2uuSKE02Hj9nGdmDosCbu9bruIDHcVFccyKD+abobSsb24Swp+cJ0zrikhTdsR3KQdIU3aEdy0Hc5ImRRscwYR3LgVwY1bUX1hKcMwcBfnUXniEJUnD5ktz5OHceUcw3U6E9fpTIp3eZfmtDsJadKWkObJhLRIIbRVR5wxidI9KK6aBJS4KoZh8MX6w7z62S4qXW6aN4rg0dv6kNwqtm7u53FTeeIQZYd2UnZoF+VH0zFc5edcYw+PJrRFB0JbKkJadCCkafsr6iJryGw2G86oeJxR8YQn9zp73OOqwHXqKBXZ+yk/to+KY/twnc6iIjuDiuwM2LwMAEdUAqGtOxLWqhOhrTsS1KhlvWiVCt+SgBJXrLjMxYsfbWXtjmwARvVtxf3XdyOslleEqCrMoTRjM6UHtlF+eDee8uJzzgc1aklo606EtlSEtlA445rKb+91xB4UYraUmicT3XssYI56rMjeT8WxfZRn7qU8Mx13UQ4lu9dQsnuN+b6wKEJbdyK8XTfC2nWXvyNRIxJQ4orsOZzL7Hc2cTKvjLAQJw9N786wXhd+znG5DI+bimP7KN23mdKMLVSePHTOeWdMImFtuxLWtiuhbbrgjJKuOivZQ8LP/n0AGIYH16lMyo+mUXYkjfIj6biLcynVGyjVGwDv32G7boS1705Y2644wqKs/CMIPyUBJS6Lx2Mwf2UG7yxNx+MxSG4Vy+9u70PThKvbGsPjqqDswHZK9HpKM7bgKSs6e84WFEpYu66EJ/UirH13gmKbXO0fQ9Qhm81OcGJrghNbE937urMDV8oO7jA/Du2kquAkRdu+omjbV4CNkBYdCE/pTXhyb4IT20jrSgASUOIy5BWV87f3t7B1r7nI69RhSdwxvhNBzit7tuCpLKf0wFZK0tdRmrH57GRUMAc1hCf3Ijy5N2GtO8sosQBms9kIimtKUFxTontdaz5HPH6Q0oM7KDu4nfLMPVRkaSqyNHkr38cR3YiI5N6Ep/QmtE0XGdbegElAiRrZtvckz76/hfyiCqIjgvnVLb3o0/HyWzJGlYvSjM0U715NacYWjKrKs+eCmyYR2fEawlV/guKby2/R9ZTN7jj7HCtu0DQ8FWWUHdxBacYmSjO24C48TeGWLyjc8gW2oFDCk3sSkTqA8KRe2EPCrC5f+JAElLgkt9vD+8s1H3+9F8OArkmN+M3MXiTE1PwHhWEYVGRqinauoiR97TmDHEJadCAidQARqf2l666BsoeEEZHan4jU/hiGh4rsA5Tu20Tpvk1UnjhISfo6StLXYXMEEda+BxGp1xCe0gdHWKTVpYs6JgElLiqnoIzZ725m94Ec7Da45VrFjWMUjhrObXLlHado5yqKd31LVd7xs8eDm7QjsutQIjsOxBndqK7KFwHIZrMT2jyZ0ObJxA+7GVfBSUr2bKBkz3oqMjWl+zZSum8j2J2Et+9OZJchhKf0lUVx6ykJKHFBW/ac5Nn3N1NYUklcVAiP3taHrsk/HiaG20WJ/p6irV9Sdmjn2eOOqHgiuwwlqsswghNb12Xpoh4Jikkktv8kYvtPoqoojxK9gRK9nvLDu82pBxmbsQWFEN6hL5GdhxDevjs2hzyvrC8koMQ53G4P732xh4+/3gdAjw6N+fWtvYiLuvRvqK7cbAq3fUXR9m/wlBYC5pp2ER0HENl1GGFtusjeRuKqOKPiiOlzHTF9rsNdUkBx+lqKd6+mIlOfnXNlD4skInUgUd1HENI8RZ5jBjgJKHHW6fwyZr+7ibSDudhtcOt1qcwY2eGiyxUZHjelezdRuHnpOa2l4MTWRPW8lsguQ3GEXt3wcyEuxBERQ0yfccT0GYcr/wTFu7+jePdqXKeOULR1OUVblxPUqCVR3UYQ2WWYzJULUBJQAoAt+iTPvmd26cVHh/Lobb3pknThLj1PeQmF27+hcOMSqgpOAt7WUqdBRPe6Vn5zFT4VFNuEuEHTiBs0jYoThyjeuYriXatwnc4k95t3yF3xHuFJPYnsPoKIlD7SBRhAJKAaOLfH4IPle/joK3OUXi+VyK9v7UVM5A/nnrhysynYtISi7d+cnbPkjGtKTJ9xRHYbIa0lYbmQJm0JadKW+BEzKd2/laLt35x9VlWasRlHRAyR3UYQ3XMMQXHWbQEjakYCqgHLKyrnmXc3syPjNHYbzLwulRmjftilV56pyV+7gNJ9mzizk2xomy7E9JtIeHIvebYk/I7N4SSiQ18iOvQ1n1ftXk3htq9xnTpCwbpPKVj3KWHtuxPdcyzhKb1lV2E/JX8rDdTO/aeZ/c4m8ooqiI0M4ZHbetM9pfHZ84ZhUHZwB/lr51F+2LsfkMNJZOehxPSbQEiTttYULsRlckTEENNvItF9J1CRpSnc8iUlad9RdmA7ZQe244iMI6rHKKJ7jcUZFW91uaIavwkopdQY4GkgBTgJzNZa/0spFQy8BEwH3MBzWuunrKs0sHk8BvNW7OPdpel4DOjcPoHf3t6HeO+mgobhoVRvJH/tPCqy9wNgCwknpvd1RPedgDOybrbREKKu2Ww2QlumEtoyFfeYWRTvXEXhli9w5Rwjf80n5K9dQETqNcT0nUBIiw7yHNUP+EVAKaVaAfOAO4HPgN7AF0qpQ8BwQAFJQAywTCmVpbV+25JiA1hxaSXPvr+FTeknAJgxKoWZY1NxOOwYHjclaWvJ++4TXKczAXNfpdj+k4juNRa7PF8S9YgjLOpsq6r8SBqFm5aac6zSvqMk7TtCmiUT3Xc8kR0HyjqQFvKLgALaAu9rrRd4X29USq0EBmGG1iytdR6Qp5R6BrgfkIC6DBmZ+Tz91kZO5JYSGRbEr2/tRd9OTTEMg5I968n9di6uU0cBcEQ3IvaaKUT1GCULdYp6zWazEdamM2FtOlNVcMpcA3Drl1RkZ3Bq4d/J/fptonuPJbr3dTjCo60ut8Hxi4DSWq8GVp95rZSKB4YA7wDNgLRql+8Buvq0wAC3fMNh5szfgavKQ3LLGB67sx+JcWGU7ttM7qoPqDxxEABnTGNiB08nquswGYorGhxnTGPiR9xG7OAZ5qCKjYupPHmEvG8/JH/tAqK6jySm/yQZ/edDfhFQ1SmlYoCFwAZgs/dwabVLSgHZv7sGKlxu/jV/B19+fwSAsde04b6pXXFn7ubYwg+oyNoLgCMynrjBNxDVY5QEk2jw7EEhRPcYTVT3UZQf3kX++s8o27+Vws3LKNyynAjVn5hrphDaIsXqUus9vwoopVQHzGdQacBM4MyS2dWXzg4HihGXdDynhKfe3MiBYwUEO+08eEN3hrY1yPnk/yg7sA3wPmMaOI3oXtdKV54Q57HZbGd3Cq48eYT8DQsp3rWakj3rKNmzjtDWnYgdOI2w9j1kQEUd8ZuAUkoNxQynOcB/aa0NoFwpdRxzkESW99JUzu3yE+fZlH6CZ97bTEmZi2YJETw2I5kovYjMr1aA4cEeEk7MgKnE9B2PPVj21xHixwQntiZx0s+IH3aLOVl9y3LKj6Rx/EgawU2TiBs0jXDVD5vtyjbvFBfmFwGllEoCFgGPa61fPO/0O8CflFI7gEjgEeAFH5cYEDwegw+/1HzwpcYwYFDHeGa1O0rZgn9T5KoAu4PoPuOJGzxDHvgKcQWc0QkkjLyduEE3ULhlOQUbFlJ5fD8n5s0mqFFLYgfdQGSnQTJ5vZb4RUABDwFRwFNKqepznP4B/BF4FtgN2IFXMFtZoprqQ8jtNoNf9Ckl+eTnlK7PAyBc9Sdh5G0ExTe3uFIhAp89JJzYAVOJ7jOOom1fk7/+M1ynMzn12QvkrZpL7MBpRHUbLitUXCWbYRhW11CnlFJtgYNff/01LVu2tLqcOnHwWAFPvbmR7JwSVEQ+9zXbgTP3EAAhzZKJH30nYa07WVukEPWY4XZRtHMV+WsXnN2c0xmbSNzgGUR2HSYtqkvIzMxk1KhRAO201oeqn5N4D3Art2Ty4kfbcFaVcG/jNLq6d0OugSMyjvhRdxDZebD0iwtRx2yOIHPkX7cR5oT3NR/hyjnGqUX/IO+7ecQNmUFk5yESVJdJAipAud0e/r1oN59/m8GAkAyuT9hOsLsM7A5i+k0gbvCN2ENkAIQQvmSzO4jsMoSITgMp3r2GvNUfUZV3nFMLXyR/zTzihtxIRKeBElQ1JAEVgAqKK/jrO5vIPaj5TfR6WjlzwAOhbbvS6Np7CG7cyuoShWjQbHYHUV2HEdl5MMW7viVv9ce4co9x8rPnCVo7n/jhtxKe0keGp/8ICagAk5GZz+w3v6Nf+Xruik7HbjNwRCWQMGYWEakD5B+8EH7EZneYu/p2HmI+o1r9Ea5TRzjx8dOEtFTEj5hJWOvOVpfptySgAsjKzUf5Yt5i7g1dR0JYMdhsxPSbRNzQm2Q+kxB+zOZwEt1jFFFdhlK4dTl5az6hIlOT/c4fCUvqSfzwmYQ0bWd1mX5HAioAuN0e3v10IyHbP+EnEQcACEpsQ+KEnxLSPNni6oQQNWVzBhHTdwJR3UZS8P3n5K9fSNn+rWTt30pE58HED59JUGyi1WX6DQkoP1dQXMEnr71L36KviQypwGN3kjDsJmL7T5Y5FkIEKHtIGHFDbiS611jy186nYPMySnavoWTPemL6jid24A04wiKtLtNy8hPOjx08kEn6B88zgoNgB3eiou0NPycovpnVpQkhaoEjIoaEMXcR3W8CeSs/oHjXtxSsX0jR9m+IGzyD6N5jG/QCzhJQfmrL8qU4N7xLqr2cSoKIHnEHzQaMk0EQQtRDQTGJJE75BTH9JpLz1VuUH9lNzpdvULBpKfEjbiMi9ZoG+f++BJSfcZUWs+Xt52mcsxXscDKkDV1nPUpEI2k1CVHfhTRLotltT1C6bxO537yNK+cYJ+c/Q2irjiSMuZuQZu2tLtGnJKD8SL7eQuaCv9PYXUSl4eBk+/EMvvl27DKpT4gGw2azEdGhL+FJPSna9hW5335I+dF0sv79W6J6jCJu2C04I2OtLtMnJKD8gKeqkswlb1C1cznhwBF3Y6Kv+ylD+3WzujQhhEVsDifRva8jovMQ8td8TMHGJRRt+4ri9LXEDZ5OTN/x9f75lASUxSpPZ3Lkw9nY8zNxGza+s/dl1H3306ppw/gNSQhxaY7QCBJGzyKq5xhyvnyTsv1byP36bYq2fkn86FlEpPSxusQ6IwFlEcMwKNr+NSeXvo7dU8kpdxQbEiZz992TiAyr378VCSEuX3BCC5rd/DilGVvI+eoNXDnHOPHRU4Qn9ybh2rsJimtqdYm1TgLKAu7yEk4tmUNp+lrswPcV7SntfhMPTe2FwyErjwshLi48uRdh7bpRsGkpeas/ojRjM2UHdxA7cBoxA6ZgDwqxusRaIwHlY+WZmuMLnsNTeJpyw8m80mvoN/l6br6mrdWlCSEChM3hJLb/JCI7DSb3m7e9C9J+SNHOFSRce0+96faTgPIRwzAo+H4RuV+/DYaHI1UJfOIeyf33jKZrUiOryxNCBCBnVByJU35BVM/RnF72mrkQ7UdPEZ7Sx+z2i21idYlXRQLKBzwVpZxa9E9K9qwD4JuyTmyLGsp/3zuQpgkRFlcnhAh0Ya070/Ke2Wa337cfUrpvE2UHdxA35EZi+k8K2GXRArPqAFJ56ggn5s3GlXOMciOI94oH4kzqy/+7rQ8RMhhCCFFLqnf75Xz1BiVp35G74l2Kdn1L4/H3E9oy1eoSL5sEVB0q3rWaU0texnBVcKwqln8XD6f/wO7cO7mLDIYQQtQJZ1QcTa7/NaXdR3J66Su4Th3h2FuPE9XzWuJHzAyoRWgloOqAUeUi56s3Kdy8DICNFe35pLQ/s6b2YsLghrVUiRDCGuHte9Dyvr+R/9088td9RtHW5ZTu3UDCmLuI6DQ4INb2k4CqZVXF+ZyY91cqMjVuHMwr6cMWOvHYvX3pnRrYDyyFEIHFHhRC/PBbiew8hNNL/0X50XROfvo8YTtX0Xjc/ThjGltd4iVJP1Mtqsg+QNa/f0tFpqbQiOD5grHsC+/B7J8PlXASQlgmuHErmt3+ZxpNeBB7aARl+7dy9JVfUrBxCYbhsbq8i5IWVC0pTvuOU5+/hFFVySF3Iq8VDqN5q+b87939iIsKtbo8IUQDZ7PZie4xmvDk3uR88Tole9aRs/x1itPW0HjCTwlu1NLqEn9AWlBXyTA85K78gJMLnsOoqmRDRTJ/LxhDt25JPPnTQRJOQgi/4oyMo8kNj9Dkht/iiIilIlOT+dpvyFv9MYbbZXV555AW1FXwVJZx8rO/U7r3ewxsLCjpw6qKVG4YkcId4ztht/v/Q0ghRMMUkdqf0LZdzIVnt31F3rdzKdmzjsaTfkZIU/8YzCUtqCtUVXCKY2/9F6V7v6fSHsrLhaNYXdmRn97QnVkTO0s4CSH8niM0gsYTHqTZzP/BGduEypOHyXrjMXJXzfWL1pQE1BWoyD5A1huPUXnyCPn2OP6aex2H7a34wz3XMG5gO6vLE0KIyxLWtistf/Ic0X3Gg8dN/pqPyfr3Y1QcP2hpXRJQl6k0YzPH3vkD7pJ8DtOCp3PG4o5M5OmHBtOno4zUE0IEJntwKI3G3kOz2/7sbU0dIuuN31nampKAugyFm7/g+EdPY7jK2eZJ5oXc4TRp2ohnHh5KUkvZYFAIEfjC2nS+QGvqd1ScOOTzWiSgasAwPOR88w6nl70ChoevK7vzRv4AuqQ04emHBtM4LszqEoUQotb8sDV1mKx//478tfMxPG6f1REQo/iUUt2BOUA34ABwt9Z6oy/u7amq5NTnL1GS9h2Gzc6HJdewrjyZ4b1a8vBNPQlySsYLIeqnM62p3K/fpnDLF+SueI+SfZtInPywT3bw9fufrkqpYOAz4EMgFngSWK6UivbF/XO+NFcFdttDeLlgJOvKk5k+MoVf3dJLwkkIUe/Zg0NpNO4+mt783zgi4815U6/+hsItyzEMo27vXaffvXYMB4K01s9rrV1a67nAbuAmX9zcGd+SvNAWPJN3LXvdzXng+q7cOUHmOAkhGpbwpJ60vO85IjoPxnCVc3rpvzg+90mqinLr7J6BEFCdgPTzju0Buvri5vNPtOF/jo3itC2B39/ZV1YjF0I0WI6wKJpM/RWJ1/8ae2gkZQe2kvX6o3jKS+rkfoHwDCoSKD3vWCkQ7pObhwfRrFEEv7q5Fx3bxfvilkII4dciOw0itFVHTi97FVfuMbDXTVsnEAKqBDh/mFw4UOyLm980WnHTaOWLWwkhRMBwRsXTdMbv6vQegdDFlwacnxCp3uNCCCHqqUBoQa0AbEqpXwEvATdgDjdfYGlVQggh6pTft6C01pXAOMxgygUeB6ZqrU9ZWpgQQog6FQgtKLTWu4DBVtchhBDCd/y+BSWEEKJhkoASQgjhlySghBBC+KWAeAZ1lRwAx48ft7oOIYQQ56n2s9lx/rmGEFDNAGbOnGl1HUIIIS6uGbC/+oGGEFAbgSFANuC7jUyEEELUhAMznH6whZKtrpdLF0IIIa6EDJIQQgjhlySghBBC+CUJKCGEEH5JAkoIIYRfkoASQgjhlySghBBC+CUJKCGEEH5JAkoIIYRfaggrSVwxpVR3YA7mDr4HgLu11j+Y7dxQKKX6AYu01olW1+JrSqkxwNNACnASmK21/pe1VfmeUmoi8H9AO8z/Dn9tiP8dAJRSscAO4I9a6zctLsfnlFJ3A/8CKqodfkhr/VZt3UNaUBehlAoGPgM+BGKBJ4HlSqloSwuzgFLKppS6F1gOBFtdj68ppVoB84D/xfy3cAvwlFJqrKWF+ZhSqhnwCfA7rXUUMAN4XinVy9rKLDMHaGF1ERbqBTyrtY6s9lFr4QQSUJcyHAjSWj+vtXZprecCu4GbrC3LEk8AD2L+gG6I2gLva60XaK093lb0SmCQpVX5mNY6G2istV6qlLIDCUAVUGRtZb6nlLoTiAZ2Wl2LhXoD2+ryBhJQF9cJSD/v2B6gqwW1WG2O1ro3sMnqQqygtV6ttX7gzGulVDzmAsRbravKGlrrIqVUOGa3znLgH1rrfRaX5VNKqXbAn4C7ra7FKkopB+ajj9uVUseUUhlKqceUUrbavI8E1MVFAqXnHSsFwi2oxVJa62NW1+AvlFIxwEJgA2YXcENUDkQAfYG7lVL3WFyPz3h/ML8LPKK1bsibzDXG/IX1LcznkdMxe1kerM2byCCJiysBws47Fg4UW1CL8ANKqQ6YoZQGzNRaeywuyRLeP3clsEkp9QowBXjd2qp85g+A1lrPt7oQK3nDeVi1Q9uUUi8CNwD/rK37SAvq4tIAdd6xVO9x0cAopYZitpo+BaZrrcstLsnnlFLDlFKbzzscAuRbUY9FbgamK6XylVL5mF3+/1RK1doP5UCglOqslHrivMPBmK3rWiMtqItbAdiUUr8CXsL8zaAbsMDSqoTPKaWSgEXA41rrF62ux0LbgBZKqV8DLwD9gXuA6y2tyoe01qnVXyultgHPN8Bh5vnAb5RSmZit557Aw8DPavMm0oK6CK11JTAOM5hygceBqVrrU5YWJqzwEBCFObS8uNrH/7O6MF/SWhcA44FpmP9PvALcq7VeZWlhwue01lnAZOB+oBBzGsZftNaf1OZ9ZEddIYQQfklaUEIIIfySBJQQQgi/JAElhBDCL0lACSGE8EsSUEIIIfySBJQQQgi/JBN1haglSqk3gTsvcckTmKugrwCitNY+WTbLu37cd8AdWuu9l7jODqwHbtdaa1/UJsSlSAtKiNrzC6CZ92O491i/aseeAdZ6vy7xYV0PA9svFU5wdo29P2PucySE5WSirhB1QCnVBXOvoHZa60MW1hEKHAFGaq131fA9+4F7tNYr67I2IX6MdPEJ4UNKqeFU6+JTShmYO/T+HnNx4k3AbcCjwO2Yy8j8Xmv9jvf9UcCzmNsbGMA3wC8usSXKzUB+9XBSSv0BuA9zy4R04L+01kurvWcBZmtwZS38kYW4YtLFJ4T1ngZ+CVwDtAa2YAZTX2A+8C+lVKT32lcwg2ws5nYHBvCFUupiv2xOAJadeaGUut57r9swV+dfDHyslIqu9p5lwOhLfE8hfEICSgjr/UNrvUJrvQ1z1fRizFaNBp7D3JesnVKqPWaL6Fat9UZvq+h2zC3pr7vI9+4D7K72ui3mbriHvV2Pf8Zc/NVV7Zo0zA07z1m5Wwhfk9+QhLBeRrWvS4FDWuszD4fP7K8TArTxfq2VOmersnDMVtWiC3zvJsDpaq/fxRxpeMC7t9NC4A2tdVm1a3K8nxMv888hRK2SFpQQ1nOd9/piO/U6vdf2BHpU++gAvHGR93gA25kX3u1iemO2uNYCs4Ad3kEdZ5z5ueCu8Z9AiDogASVE4EgHgoAIrXWG1joDyAZmY4bUhRzHHAwBgFJqGnC/1nq51voXmC2vIsx9ns5oXO29QlhGuviECBBaa62UWgi8rZR6CDgFPIk5uGLPRd62Gehe7bUDmK2UOoE5YvAaoKn36zO6A3mc2/UohM9JC0qIwHInZph8CmwEYoAxWuv8i1y/GHO0HwBa64+BP2G2uvYC/wv8TGv9TbX3DAWWaa2li09YSibqClGPKaXCgUPAdVrrLTW43g4cxhwpuLqOyxPikqQFJUQ9prUuxWwtPVTDt0wBDkg4CX8gASVE/fc3oJs6b2z6+bytp8eBB3xSlRA/Qrr4hBBC+CVpQQkhhPBLElBCCCH8kgSUEEIIvyQBJYQQwi9JQAkhhPBL/x+sSb22N8p3hgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "xs.plot()\n", - "ys.plot()\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "savefig('figs/chap22-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the velocities the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "vx = results.V.extract('x')\n", - "vy = results.V.extract('y')\n", - "\n", - "vx.plot(label='vx')\n", - "vy.plot(label='vy')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The x velocity slows down due to drag.\n", - "\n", - "The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall.\n", - "\n", - "Another way to visualize the results is to plot y versus x. The result is the trajectory of the ball through its plane of motion." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap22-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_trajectory(results):\n", - " xs = results.R.extract('x')\n", - " ys = results.R.extract('y')\n", - " plot(xs, ys, color='C2', label='trajectory')\n", - "\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - "\n", - "plot_trajectory(results)\n", - "savefig('figs/chap22-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", - "\n", - "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", - "\n", - "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "def draw_func(state, t):\n", - " set_xlim(xs)\n", - " set_ylim(ys)\n", - " x, y = state.R\n", - " plot(x, y, 'bo')\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Delete the lines that set the x and y axes (or [comment them out](https://en.wiktionary.org/wiki/comment_out)) and see what the animation does." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "`Vector` is a function that returns a `ModSimVector` object." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim.modsim.ModSimVector" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V = Vector(3, 4)\n", - "type(V)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `ModSimVector` is a specialized kind of Pint `Quantity`." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "isinstance(V, Quantity)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There's one gotcha you might run into with Vectors and Quantities. If you multiply a `ModSimVector` and a `Quantity`, you get a `ModSimVector`:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([3., 4.]) " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V1 = V * m" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim.modsim.ModSimVector" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(V1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you multiply a `Quantity` and a `Vector`, you get a `Quantity`:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}3.0 & 4.0\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}3.0 & 4.0\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([3., 4.]) " - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V2 = m * V" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pint.quantity.build_quantity_class..Quantity" - ] - }, - "execution_count": 48, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `ModSimVector` you can get the coordinates using dot notation, as well as `mag`, `mag2`, and `angle`:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(3.0 ,\n", - " 4.0 ,\n", - " 5.0 ,\n", - " 0.9272952180016122 )" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V1.x, V1.y, V1.mag, V1.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `Quantity`, you can't. But you can use indexing to get the coordinates:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(3.0 , 4.0 )" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V2[0], V2[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can use vector functions to get the magnitude and angle." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(5.0 , 0.9272952180016122 )" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vector_mag(V2), vector_angle(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And often you can avoid the whole issue by doing the multiplication with the `ModSimVector` on the left." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    y1 meter
    g9.8 meter / second ** 2
    mass0.145 kilogram
    diameter0.073 meter
    rho1.2 kilogram / meter ** 3
    C_d0
    angle45 degree
    velocity40.0 meter / second
    t_end10 second
    dt0.1 second
    initR [0 meter, ...
    area0.004185386812745002 meter ** 2
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "y 1 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 0.145 kilogram\n", - "diameter 0.073 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "C_d 0\n", - "angle 45 degree\n", - "velocity 40.0 meter / second\n", - "t_end 10 second\n", - "dt 0.1 second\n", - "init R [0 meter, ...\n", - "area 0.004185386812745002 meter ** 2\n", - "dtype: object" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Hint\n", - "\n", - "system_no_drag = System(system, C_d=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results_no_drag, details = run_ode_solver(system_no_drag, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_trajectory(results)\n", - "plot_trajectory(results_no_drag)" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "99.30497406350605 meter" - ], - "text/latex": [ - "$99.30497406350605\\ \\mathrm{meter}$" - ], - "text/plain": [ - "99.30497406350605 " - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist = get_last_value(results.R).x" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "164.25596844639244 meter" - ], - "text/latex": [ - "$164.25596844639244\\ \\mathrm{meter}$" - ], - "text/plain": [ - "164.25596844639244 " - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "xdist_no_drag = get_last_value(results_no_drag.R).x" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "64.95099438288639 meter" - ], - "text/latex": [ - "$64.95099438288639\\ \\mathrm{meter}$" - ], - "text/plain": [ - "64.95099438288639 " - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "xdist_no_drag - x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    y1 meter
    g9.8 meter / second ** 2
    mass0.145 kilogram
    diameter0.073 meter
    rho1.0 kilogram / meter ** 3
    C_d0.33
    angle45 degree
    velocity40.0 meter / second
    t_end10 second
    dt0.1 second
    initR [0 meter, ...
    area0.004185386812745002 meter ** 2
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "y 1 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 0.145 kilogram\n", - "diameter 0.073 meter\n", - "rho 1.0 kilogram / meter ** 3\n", - "C_d 0.33\n", - "angle 45 degree\n", - "velocity 40.0 meter / second\n", - "t_end 10 second\n", - "dt 0.1 second\n", - "init R [0 meter, ...\n", - "area 0.004185386812745002 meter ** 2\n", - "dtype: object" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Hint\n", - "\n", - "system2 = System(system, rho=1.0*kg/m**3)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "105.77787365390012 meter" - ], - "text/latex": [ - "$105.77787365390012\\ \\mathrm{meter}$" - ], - "text/plain": [ - "105.77787365390012 " - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results2, details2 = run_ode_solver(system2, slope_func, events=event_func)\n", - "x = results2.R.extract('x')\n", - "x_dist2 = get_last_value(x)" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "6.472899590394064 meter" - ], - "text/latex": [ - "$6.472899590394064\\ \\mathrm{meter}$" - ], - "text/plain": [ - "6.472899590394064 " - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist2 - x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", - "\n", - "\n", - "\n", - "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Velocity in mphDrag coefficient
    Velocity in meters per second
    0.0261460.0584860.49965
    8.87150919.8450000.49878
    17.64735139.4760000.49704
    22.43291450.1810000.48225
    26.88230360.1340000.45004
    30.63699268.5330000.40914
    32.97769473.7690000.38042
    34.60447277.4080000.36562
    37.49726883.8790000.34822
    40.46024990.5070000.33081
    43.49252297.2900000.31427
    46.733562104.5400000.30035
    50.886563113.8300000.28816
    54.047136120.9000000.28381
    56.926074127.3400000.28033
    60.086646134.4100000.28207
    \n", - "
    " - ], - "text/plain": [ - " Velocity in mph Drag coefficient\n", - "Velocity in meters per second \n", - "0.026146 0.058486 0.49965\n", - "8.871509 19.845000 0.49878\n", - "17.647351 39.476000 0.49704\n", - "22.432914 50.181000 0.48225\n", - "26.882303 60.134000 0.45004\n", - "30.636992 68.533000 0.40914\n", - "32.977694 73.769000 0.38042\n", - "34.604472 77.408000 0.36562\n", - "37.497268 83.879000 0.34822\n", - "40.460249 90.507000 0.33081\n", - "43.492522 97.290000 0.31427\n", - "46.733562 104.540000 0.30035\n", - "50.886563 113.830000 0.28816\n", - "54.047136 120.900000 0.28381\n", - "56.926074 127.340000 0.28033\n", - "60.086646 134.410000 0.28207" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "baseball_drag = pd.read_csv('data/baseball_drag.csv')\n", - "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n", - "mps = mph.to(m/s)\n", - "baseball_drag.index = magnitude(mps)\n", - "baseball_drag.index.name = 'Velocity in meters per second'\n", - "baseball_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results. Hint: use `interpolate`." - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "drag_interp = interpolate(baseball_drag['Drag coefficient'])\n", - "vs = linspace(0, 60)\n", - "cds = drag_interp(vs)\n", - "plot(vs, cds)\n", - "decorate(xlabel='Velocity (m/s)', ylabel='C_d')" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " v: velocity\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " C_d = drag_interp(V.mag)\n", - " mag = -rho * V.mag**2 * C_d * area / 2\n", - " direction = V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.31695653551010883" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "C_d = drag_interp(43 * m / s)" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-1.023081126128183 & -1.023081126128183\\end{pmatrix} kilogram meter/second2\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-1.023081126128183 & -1.023081126128183\\end{pmatrix}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "array([-1.02308113, -1.02308113]) " - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = System(system, drag_interp=drag_interp)\n", - "V = Vector(30, 30) * m/s\n", - "f_drag = drag_force(V, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([28.28427125, 28.28427125]) ,\n", - " array([ -6.53489118, -16.33489118]) )" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    RV
    4.600000[86.37265447523836 meter, 6.352840864406531 me...[12.388380175637913 meter / second, -18.940140...
    4.700000[87.59981910596807 meter, 4.4276738010043495 m...[12.155784727055282 meter / second, -19.555228...
    4.800000[88.8038132288331 meter, 2.4417868717825417 me...[11.925028455712733 meter / second, -20.154598...
    4.900000[89.98482652030708 meter, 0.396745649345958 me...[11.696226535097686 meter / second, -20.738387...
    4.918869[90.20337227180956 meter, 0.0 meter][11.653444424369289 meter / second, -20.845633...
    \n", - "
    " - ], - "text/plain": [ - " R \\\n", - "4.600000 [86.37265447523836 meter, 6.352840864406531 me... \n", - "4.700000 [87.59981910596807 meter, 4.4276738010043495 m... \n", - "4.800000 [88.8038132288331 meter, 2.4417868717825417 me... \n", - "4.900000 [89.98482652030708 meter, 0.396745649345958 me... \n", - "4.918869 [90.20337227180956 meter, 0.0 meter] \n", - "\n", - " V \n", - "4.600000 [12.388380175637913 meter / second, -18.940140... \n", - "4.700000 [12.155784727055282 meter / second, -19.555228... \n", - "4.800000 [11.925028455712733 meter / second, -20.154598... \n", - "4.900000 [11.696226535097686 meter / second, -20.738387... \n", - "4.918869 [11.653444424369289 meter / second, -20.845633... " - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "90.20337227180956 meter" - ], - "text/latex": [ - "$90.20337227180956\\ \\mathrm{meter}$" - ], - "text/plain": [ - "90.20337227180956 " - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x = results.R.extract('x')\n", - "x_dist3 = get_last_value(x)" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.101601791696496 meter" - ], - "text/latex": [ - "$9.101601791696496\\ \\mathrm{meter}$" - ], - "text/plain": [ - "9.101601791696496 " - ] - }, - "execution_count": 70, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "x_dist - x_dist3" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(17.461046752327743 , 40.0 )" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# Here are the highest and lowest speeds\n", - "\n", - "vs = results.V.extract('mag')\n", - "interval = min(vs), max(vs)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.49707694, 0.33351435])" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# And here are the drag coefficients at the highest and lowest speed.\n", - "# They are substantially different.\n", - "\n", - "drag_interp(interval)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap23soln.ipynb b/soln/chap23soln.ipynb deleted file mode 100644 index 793812fe..00000000 --- a/soln/chap23soln.ipynb +++ /dev/null @@ -1,1311 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 23\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "degree" - ], - "text/latex": [ - "$\\mathrm{degree}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "degree = UNITS.degree" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    y1 meter
    g9.8 meter / second ** 2
    mass0.145 kilogram
    diameter0.073 meter
    rho1.2 kilogram / meter ** 3
    C_d0.3
    angle45 degree
    velocity40.0 meter / second
    t_end20 second
    dt0.2 second
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "y 1 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 0.145 kilogram\n", - "diameter 0.073 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "C_d 0.3\n", - "angle 45 degree\n", - "velocity 40.0 meter / second\n", - "t_end 20 second\n", - "dt 0.2 second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = 20 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.3,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end,\n", - " dt=dt)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `V`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimal launch angle\n", - "\n", - "To find the launch angle that maximizes distance from home plate, we need a function that takes launch angle and returns range." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def range_func(angle, params): \n", - " \"\"\"Computes range for a given launch angle.\n", - " \n", - " angle: launch angle in degrees\n", - " params: Params object\n", - " \n", - " returns: distance in meters\n", - " \"\"\"\n", - " params = Params(params, angle=angle)\n", - " system = make_system(params)\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " x_dist = get_last_value(results.R).x\n", - " print(angle, x_dist)\n", - " return x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test `range_func`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "45 102.67621633303261 meter\n" - ] - }, - { - "data": { - "text/html": [ - "102.67621633303261 meter" - ], - "text/latex": [ - "$102.67621633303261\\ \\mathrm{meter}$" - ], - "text/plain": [ - "102.67621633303261 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "range_func(45, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And sweep through a range of angles." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20.0 79.83369234082717 meter\n", - "23.0 86.20478395495141 meter\n", - "26.0 91.4709452133534 meter\n", - "29.0 95.83255039259141 meter\n", - "32.0 99.10671362732461 meter\n", - "35.0 101.51073514079798 meter\n", - "38.0 102.9023803583573 meter\n", - "41.0 103.40314791198459 meter\n", - "44.0 103.02100653301224 meter\n", - "47.0 101.73693469942923 meter\n", - "50.0 99.56858789440345 meter\n", - "53.0 96.55360348120037 meter\n", - "56.0 92.7050051463521 meter\n", - "59.0 88.04022482508677 meter\n", - "62.0 82.58080180144869 meter\n", - "65.0 76.32548350395584 meter\n", - "68.0 69.32998156572299 meter\n", - "71.0 61.63270335890529 meter\n", - "74.0 53.24654950607608 meter\n", - "77.0 44.252471292784826 meter\n", - "80.0 34.68860100116735 meter\n" - ] - } - ], - "source": [ - "angles = linspace(20, 80, 21)\n", - "sweep = SweepSeries()\n", - "\n", - "for angle in angles:\n", - " x_dist = range_func(angle, params)\n", - " sweep[angle] = x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the `Sweep` object, it looks like the peak is between 40 and 45 degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap23-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(sweep, color='C2')\n", - "decorate(xlabel='Launch angle (degree)',\n", - " ylabel='Range (m)',\n", - " title='Range as a function of launch angle',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap23-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `maximize` to search for the peak efficiently." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 degree 17.15514421874411 meter\n", - "90 degree 1.2569667261582053e-14 meter\n", - "34.376941012509455 degree 101.06319487191678 meter\n", - "55.623058987490545 degree 93.24073676688748 meter\n", - "21.246117974981075 degree 82.63917923456437 meter\n", - "42.49223594996215 degree 103.32194321543766 meter\n", - "47.507764050037856 degree 101.41737997289113 meter\n", - "39.39246911258517 degree 103.27504916143039 meter\n", - "44.40799721266088 degree 102.90451237123467 meter\n", - "41.308230375283905 degree 103.41115569950708 meter\n", - "40.576474687263406 degree 103.38512107429113 meter\n", - "41.760480261941645 degree 103.4149581469886 meter\n", - "42.03998606330441 degree 103.38949811498512 meter\n", - "41.58773617664667 degree 103.41463212933446 meter\n", - "41.867241978009446 degree 103.41261934653042 meter\n", - "41.69449789271447 degree 103.41499899416574 meter\n", - "41.65371854587384 degree 103.41492192196334 meter\n", - "41.71970091510101 degree 103.41500757170726 meter\n", - "41.73527723955511 degree 103.41499793513337 meter\n", - "41.710074217168575 degree 103.41500782026304 meter\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    x41.710074217168575 degree
    fun103.41500782026304 meter
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "x 41.710074217168575 degree\n", - "fun 103.41500782026304 meter\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bounds = [0, 90] * degree\n", - "res = maximize(range_func, bounds, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`res` is an `ModSimSeries` object with detailed results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    x41.710074217168575 degree
    fun103.41500782026304 meter
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "x 41.710074217168575 degree\n", - "fun 103.41500782026304 meter\n", - "dtype: object" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`x` is the optimal angle and `fun` the optional range." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "41.710074217168575 degree" - ], - "text/latex": [ - "$41.710074217168575\\ \\mathrm{degree}$" - ], - "text/plain": [ - "41.710074217168575 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "optimal_angle = res.x" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "103.41500782026304 meter" - ], - "text/latex": [ - "$103.41500782026304\\ \\mathrm{meter}$" - ], - "text/plain": [ - "103.41500782026304 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_x_dist = res.fun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Read the source code for `maximize` and `minimize_scalar`, below.\n", - "\n", - "Add a print statement to `range_func` that prints `angle`. Then run `maximize` again so you can see how many times it calls `range_func` and what the arguments are." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def maximize_golden(max_func, bracket, *args, **options):\n", - " \"\"\"Find the maximum of a function by golden section search.\n", - "\n", - " :param min_func: function to be maximized\n", - " :param bracket: interval containing a maximum\n", - " :param args: arguments passes to min_func\n", - " :param options: rtol and maxiter\n", - "\n", - " :return: ModSimSeries\n", - " \"\"\"\n", - " def min_func(*args):\n", - " return -max_func(*args)\n", - "\n", - " res = minimize_golden(min_func, bracket, *args, **options)\n", - "\n", - " # we have to negate the function value before returning res\n", - " res.fun = -res.fun\n", - " return res\n", - "\n" - ] - } - ], - "source": [ - "source_code(maximize)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def minimize_scalar(min_func, bounds, *args, **options):\n", - " \"\"\"Finds the input value that minimizes `min_func`.\n", - "\n", - " Wrapper for\n", - " https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html\n", - "\n", - " min_func: computes the function to be minimized\n", - " bounds: sequence of two values, lower and upper bounds of the range to be searched\n", - " args: any additional positional arguments are passed to min_func\n", - " options: any keyword arguments are passed as options to minimize_scalar\n", - "\n", - " returns: ModSimSeries object\n", - " \"\"\"\n", - " try:\n", - " min_func(bounds[0], *args)\n", - " except Exception as e:\n", - " msg = \"\"\"Before running scipy.integrate.minimize_scalar, I tried\n", - " running the slope function you provided with the\n", - " initial conditions in system and t=0, and I got\n", - " the following error:\"\"\"\n", - " logger.error(msg)\n", - " raise(e)\n", - "\n", - " underride(options, xatol=1e-3)\n", - "\n", - " res = scipy.optimize.minimize_scalar(min_func,\n", - " bracket=bounds,\n", - " bounds=bounds,\n", - " args=args,\n", - " method='bounded',\n", - " options=options)\n", - "\n", - " if not res.success:\n", - " msg = \"\"\"scipy.optimize.minimize_scalar did not succeed.\n", - " The message it returned is %s\"\"\" % res.message\n", - " raise Exception(msg)\n", - "\n", - " return ModSimSeries(res)\n", - "\n" - ] - } - ], - "source": [ - "source_code(minimize_scalar)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The Manny Ramirez problem\n", - "\n", - "Finally, let's solve the Manny Ramirez problem:\n", - "\n", - "*What is the minimum effort required to hit a home run in Fenway Park?*\n", - "\n", - "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its most famous features is the \"Green Monster\", which is a wall in left field that is unusually close to home plate, only 310 feet along the left field line. To compensate for the short distance, the wall is unusually high, at 37 feet.\n", - "\n", - "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", - "\n", - "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", - "\n", - "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", - "\n", - "As a first step, write a function called `height_func` that takes a launch angle and a params as parameters, simulates the flights of a baseball, and returns the height of the baseball when it reaches a point 94.5 meters (310 feet) from home plate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.x - system.x_wall" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-94.5 meter" - ], - "text/latex": [ - "$-94.5\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-94.5 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(params)\n", - "system.set(x_wall = 94.5 * m)\n", - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def height_func(angle, params):\n", - " \"\"\"Computes the height of the ball at the wall.\n", - " \n", - " angle: launch angle in degrees\n", - " params: Params object\n", - " \n", - " returns: height in meters\n", - " \"\"\"\n", - " params = Params(params, angle=angle)\n", - " system = make_system(params)\n", - " system.set(x_wall = 94.5 * m)\n", - "\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " height = get_last_value(results.R).y\n", - " \n", - " return height" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function with a launch angle of 45 degrees:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "10.953200948514532 meter" - ], - "text/latex": [ - "$10.953200948514532\\ \\mathrm{meter}$" - ], - "text/plain": [ - "10.953200948514532 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "height_func(45 * degree, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now use `maximize` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    x44.25082945182002 degree
    fun10.967930469934105 meter
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "x 44.25082945182002 degree\n", - "fun 10.967930469934105 meter\n", - "dtype: object" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bounds = [0, 90] * degree\n", - "res = maximize(height_func, bounds, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "44.25082945182002 degree" - ], - "text/latex": [ - "$44.25082945182002\\ \\mathrm{degree}$" - ], - "text/plain": [ - "44.25082945182002 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "optimal_angle = res.x" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "10.967930469934105 meter" - ], - "text/latex": [ - "$10.967930469934105\\ \\mathrm{meter}$" - ], - "text/plain": [ - "10.967930469934105 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "optimal_height = res.fun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With initial velocity 40 m/s and an optimal launch angle, the ball clears the Green Monster with a little room to spare.\n", - "\n", - "Which means we can get over the wall with a lower initial velocity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Finding the minimum velocity\n", - "\n", - "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 11 m, given given that it's launched at the optimal angle. And that's a job for `root_bisect`.\n", - "\n", - "Write an error function that takes a velocity and a `Params` object as parameters. It should use `maximize` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func(velocity, params):\n", - " \"\"\"Returns the optimal height at the wall minus the target height.\n", - " \n", - " velocity: initial velocity in m/s\n", - " params: Params object\n", - " \n", - " returns: height difference in meters\n", - " \"\"\"\n", - " print(velocity)\n", - " params = Params(params, velocity=velocity)\n", - " bounds = [0, 90] * degree\n", - " res = maximize(height_func, bounds, params)\n", - " return res.fun - 11*m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your error function before you call `root_bisect`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "40.0 meter / second\n" - ] - }, - { - "data": { - "text/html": [ - "-0.03206953006589508 meter" - ], - "text/latex": [ - "$-0.03206953006589508\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-0.03206953006589508 " - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func(40*m/s, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then use `root_bisect` to find the answer to the problem, the minimum velocity that gets the ball out of the park." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "30.0 meter / second\n", - "50.0 meter / second\n", - "40.0 meter / second\n", - "45.0 meter / second\n", - "42.5 meter / second\n", - "41.25 meter / second\n", - "40.625 meter / second\n", - "40.3125 meter / second\n", - "40.15625 meter / second\n", - "40.078125 meter / second\n", - "40.0390625 meter / second\n", - "40.01953125 meter / second\n", - "40.009765625 meter / second\n", - "40.0048828125 meter / second\n", - "40.00732421875 meter / second\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root40.008544921875 meter / second
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 40.008544921875 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "bounds = [30, 50] * m/s\n", - "res = root_bisect(error_func, bounds, params, rtol=1e-4)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "40.008544921875 meter/second" - ], - "text/latex": [ - "$40.008544921875\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "40.008544921875 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "min_velocity = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And just to check, run `error_func` with the value you found." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "40.008544921875 meter / second\n" - ] - }, - { - "data": { - "text/html": [ - "0.002204447936565046 meter" - ], - "text/latex": [ - "$0.002204447936565046\\ \\mathrm{meter}$" - ], - "text/plain": [ - "0.002204447936565046 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func(min_velocity, params)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap24soln.ipynb b/soln/chap24soln.ipynb deleted file mode 100644 index 77094fc0..00000000 --- a/soln/chap24soln.ipynb +++ /dev/null @@ -1,1319 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 24\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling paper\n", - "\n", - "We'll start by loading the units we need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And creating a `Params` object with the system parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.02 meter
    Rmax0.055 meter
    L47 meter
    omega10.0 radian / second
    t_end130 second
    dt1 second
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.02 meter\n", - "Rmax 0.055 meter\n", - "L 47 meter\n", - "omega 10.0 radian / second\n", - "t_end 130 second\n", - "dt 1 second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " L = 47 * m,\n", - " omega = 10 * radian / s,\n", - " t_end = 130 * s,\n", - " dt = 1*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def estimate_k(params):\n", - " \"\"\"Estimates the parameter `k`.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: k in meters per radian\n", - " \"\"\"\n", - " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", - " \n", - " Ravg = (Rmax + Rmin) / 2\n", - " Cavg = 2 * pi * Ravg\n", - " revs = L / Cavg\n", - " rads = 2 * pi * revs\n", - " k = (Rmax - Rmin) / rads\n", - " return k" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As usual, `make_system` takes a `Params` object and returns a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: System with init, k, and ts\n", - " \"\"\"\n", - " init = State(theta = 0 * radian,\n", - " y = 0 * m,\n", - " r = params.Rmin)\n", - " \n", - " k = estimate_k(params)\n", - "\n", - " return System(params, init=init, k=k)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.02 meter
    Rmax0.055 meter
    L47 meter
    omega10.0 radian / second
    t_end130 second
    dt1 second
    inittheta 0 radian\n", - "y 0 meter\n", - "r ...
    k2.7925531914893616e-05 meter
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.02 meter\n", - "Rmax 0.055 meter\n", - "L 47 meter\n", - "omega 10.0 radian / second\n", - "t_end 130 second\n", - "dt 1 second\n", - "init theta 0 radian\n", - "y 0 meter\n", - "r ...\n", - "k 2.7925531914893616e-05 meter\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    theta0 radian
    y0 meter
    r0.02 meter
    \n", - "
    " - ], - "text/plain": [ - "theta 0 radian\n", - "y 0 meter\n", - "r 0.02 meter\n", - "dtype: object" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write a slope function based on the differential equations\n", - "\n", - "$\\omega = \\frac{d\\theta}{dt} = 10$\n", - "\n", - "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", - "\n", - "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = r * omega\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `slope_func`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10.0 ,\n", - " 0.2 ,\n", - " 0.0002792553191489362 )" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll use an event function to stop when `y=L`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Detects when we've rolled length `L`.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with L\n", - " \n", - " returns: difference between `y` and `L`\n", - " \"\"\"\n", - " theta, y, r = state\n", - " \n", - " return y - system.L" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-47 meter" - ], - "text/latex": [ - "$-47\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-47 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetayr
    122.000001220.0 radian45.18218085106379 meter0.05406914893617014 meter
    123.000001230.0 radian45.72426861702124 meter0.054348404255319074 meter
    124.000001240.0 radian46.269148936170176 meter0.05462765957446801 meter
    125.000001250.0 radian46.8168218085106 meter0.054906914893616945 meter
    125.332771253.3276965817133 radian47.0 meter0.054999842590712666 meter
    \n", - "
    " - ], - "text/plain": [ - " theta y \\\n", - "122.00000 1220.0 radian 45.18218085106379 meter \n", - "123.00000 1230.0 radian 45.72426861702124 meter \n", - "124.00000 1240.0 radian 46.269148936170176 meter \n", - "125.00000 1250.0 radian 46.8168218085106 meter \n", - "125.33277 1253.3276965817133 radian 47.0 meter \n", - "\n", - " r \n", - "122.00000 0.05406914893617014 meter \n", - "123.00000 0.054348404255319074 meter \n", - "124.00000 0.05462765957446801 meter \n", - "125.00000 0.054906914893616945 meter \n", - "125.33277 0.054999842590712666 meter " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `y` is 47 meters, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "47.0 meter" - ], - "text/latex": [ - "$47.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "47.0 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "unrolled = get_last_value(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of radius is `R_max`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.054999842590712666 meter" - ], - "text/latex": [ - "$0.054999842590712666\\ \\mathrm{meter}$" - ], - "text/plain": [ - "0.054999842590712666 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radius = get_last_value(results.r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The total number of rotations is close to 200, which seems plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "199.47329822495885" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radians = get_last_value(results.theta) \n", - "rotations = magnitude(radians) / 2 / np.pi" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The elapsed time is about 2 minutes, which is also plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "125.33276965817134 second" - ], - "text/latex": [ - "$125.33276965817134\\ \\mathrm{second}$" - ], - "text/plain": [ - "125.33276965817134 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `theta`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `y`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_y(results):\n", - " plot(results.y, color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `r`" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_r(results):\n", - " plot(results.r, color='C2', label='r')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Radius (m)')\n", - " \n", - "plot_r(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also see the relationship between `y` and `r`, which I derive analytically in the book." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.r, results.y, color='C3')\n", - "\n", - "decorate(xlabel='Radius (m)',\n", - " ylabel='Length (m)',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the figure from the book." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap24-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_three(results):\n", - " subplot(3, 1, 1)\n", - " plot_theta(results)\n", - "\n", - " subplot(3, 1, 2)\n", - " plot_y(results)\n", - "\n", - " subplot(3, 1, 3)\n", - " plot_r(results)\n", - "\n", - "plot_three(results)\n", - "savefig('figs/chap24-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "Here's a draw function that animates the results using `matplotlib` patches." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " # get radius in mm\n", - " theta, y, r = state\n", - " radius = r.magnitude * 1000\n", - " \n", - " # draw a circle with\n", - " circle = Circle([0, 0], radius, fill=True)\n", - " plt.gca().add_patch(circle)\n", - " \n", - " # draw an arrow to show rotation\n", - " dx, dy = pol2cart(theta, radius)\n", - " arrow = Arrow(0, 0, dx, dy)\n", - " plt.gca().add_patch(arrow)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "dydt = gradient(results.y);" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(dydt, label='dydt')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Linear velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.5504654255319086 meter/second" - ], - "text/latex": [ - "$0.5504654255319086\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "0.5504654255319086 " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "linear_velocity = get_last_value(dydt) * m/s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", - "\n", - "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", - "\n", - "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = linear_velocity\n", - " omega = dydt / r\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(27.523271276595427 ,\n", - " 0.5504654255319086 ,\n", - " 0.0007686019904368403 )" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "85.38229254741002 second" - ], - "text/latex": [ - "$85.38229254741002\\ \\mathrm{second}$" - ], - "text/plain": [ - "85.38229254741002 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "t_final = get_last_label(results) * s" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAALICAYAAABy54rvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXyV5Z3//1d2EhIIELJAWAKEKwQSdkQQZNEWta3WrXWpWm2rHbt8vx3nN2MdpU5r1dF2umjH0XbaWuvPmVYtbqUqsgqyQ0ICV9iXLCSBANmXc873j/tOckgFgyQ5Jyfv5+Phg3Pu6z7hk96FvLnWMJ/Ph4iIiEgoCQ90ASIiIiJdTQFHREREQo4CjoiIiIQcBRwREREJOZGBLiCQjDExwEygFPAEuBwRERG5MBFAGrDZWtvo39CnAw5OuFkb6CJERETkoswD1vlf6OsBpxTgj3/8I6mpqYGuRURERC5AWVkZt912G7g/z/319YDjAUhNTSU9PT3QtYiIiMin83fTTDTJWEREREKOAo6IiIiEHAUcERERCTkKOCIiIhJyFHBERESk29Q1NNPi8fb479vXV1GJiIhIF6pvbKHgwAny91WSt6+CA8WnGZ02kJ//44IerUMBR0RERD61xmYPew6dJG9fJfn7Kik6UoXH62trj4wII2v0oB6vSwFHREREOq3F42XvkVPk7asgb18luw+dpLmlfQgqPDwMM3IQOeOSyBmXRPbowfSL6fm4oYAjIiIi5+Tx+jhYcpq8vc6QU8GBEzQ0te+rFxYGY4YNJDczidxxSUwcM4S4flEBrNgRkIBjjJkFvGWtTXbfJwM/BxYDYcBfge9aa6vc9puBH+McqLUauMtaW+62jQR+A8wGyoFvW2vf6dnvKPAaGhqoqakhKSnpor7O0aNHGTFiRBdVJSIivY3P5+NYeQ15eyvY6Q471dQ3n3XPiJR4cscNJXdcEpPGJjGgf3SAqj23Hg04xpgw4B7g6Q5NvwZOAxlAFPAH4FngVmNMNk6AuQrYAjwJvAIscj/7CrABuAa4DPiLMWaKtfZA9343weX222/nvvvu48yZM/z+979n2bJlF/w1Vq5cyS9+8Qtef/31bqhQRESCVXlVHXl7K9m5r4K8vZWcPNNwVnvyoFgmZzqBJmdcEkMGxgao0s7r6R6cR3GCyI+AfwUwxoQDXuBRa22te+0F4Bn3M7cDb1pr17ltDwJVxphMnN6eGcCV1tom4ANjzBs4IeqhHvuugsDJkycv+mtUVVXh9fb8Uj4REelZp2sayd9fyc69lezcW0FpZe1Z7YnxMeSOSyI3M4nJmUNJGRxHWFhYgKr9dHo64DxnrX3EGLOg9YK11gtc1+G+64Dt7utsnJ6b1vvrjDFHgRycYHSkNRi59gCzuqH2oHX//fdTUlLC9773Pb797W/T2NjI0qVLee+99wgPD+e73/0uN910E+CcvPrDH/6QLVu2kJCQwO23385dd91FXl4eS5cupaWlhRkzZrBlyxastTz55JMUFRVRXV3NlClTePzxxxk2bFiAv2MREbkQDY0tFBw84QSaogoOlJw+qz2uXyQ5Y91AM24oI1MTel2g6ahHA461tuST7jHGPIATcOa4l+KBug631QFxfq/P1dalHv31R2zZfbw7vvTfmTEhhaVfm92pe5999lkWLVrE97//fc6cOcPBgwe59dZb+cEPfsCyZct46KGHWLJkCXFxcdx3333MmDGDNWvWUFpayr333ktiYiLXXXcdjz766FnDW9/5zne46aab+PWvf01NTQ33338/L7zwAkuXLu3Ob11ERC5S60qnHXsr2Lm3Anv4JC2e9qXbUZHhTBg9mMmZQ5mcmcS49EQiIkJr79+gWUVljIkCfgl8Hlhkrd3jNtUCHQf74oAanCGqc7X1WWlpadxxxx0AXH311fzzP/8zZWVl1NXVceTIEf785z8TGRnJ6NGj+epXv8orr7zCddd17ESDF154gWHDhtHc3ExZWRmDBg2ivLy8p78dERH5BD6fjyNl1W2BZtf+Suob21c6hYdB5ojEtkAzIWMIMVERAay4+wVFwDHGJABvAgnALGttsV9zIWD87o0DRrrXw4CRxphYa229e0uW29blOtujEmgDBw5sex0d7cxsb2lpobi4mPr6embPbv8+vF4viYmJH/t1du3axb333kt1dTWZmZnU19czePDg7i1eREQ6pfJUPTuKnECzY28Fp6obz2ofPjSeyZlJTBk/lJyxScTHBd9Kp+4UFAEHZyVUODDPWttxyOllYJ07b2cD8Diw3VpbBGCM2Qk85k4+ngNcC1zaU4X3JsnJyQwZMoR169a1XTt58iQNDQ1/d+/x48d54IEHeOmll5g2bRoA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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_three(results)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/chap25soln.ipynb b/soln/chap25soln.ipynb deleted file mode 100644 index 01b67093..00000000 --- a/soln/chap25soln.ipynb +++ /dev/null @@ -1,2577 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 25\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Teapots and Turntables" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tables in Chinese restaurants often have a rotating tray or turntable that makes it easy for customers to share dishes. These turntables are supported by low-friction bearings that allow them to turn easily and glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", - "\n", - "Suppose I am sitting at a table with a pot of tea on the turntable directly in front of me, and the person sitting directly opposite asks me to pass the tea. I push on the edge of the turntable with 1 Newton of force until it has turned 0.5 radians, then let go. The turntable glides until it comes to a stop 1.5 radians from the starting position. How much force should I apply for a second push so the teapot glides to a stop directly opposite me?\n", - "\n", - "The following figure shows the scenario, where `F` is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, `r`, and `tau` is the resulting torque. The blue circle near the bottom is the teapot.\n", - "\n", - "![](diagrams/teapot.png)\n", - "\n", - "We'll answer this question in these steps:\n", - "\n", - "1. We'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", - "\n", - "2. We'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", - "\n", - "Our simulation will use the following parameters:\n", - "\n", - "1. The radius of the turntable is 0.5 meters, and its weight is 7 kg.\n", - "\n", - "2. The teapot weights 0.3 kg, and it sits 0.4 meters from the center of the turntable.\n", - "\n", - "As usual, I'll get units from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$\\mathrm{newton}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And store the parameters in a `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    radius_disk0.5 meter
    mass_disk7 kilogram
    radius_pot0.4 meter
    mass_pot0.3 kilogram
    force1 newton
    torque_friction0.2 meter * newton
    theta_end0.5 radian
    t_end20 second
    \n", - "
    " - ], - "text/plain": [ - "radius_disk 0.5 meter\n", - "mass_disk 7 kilogram\n", - "radius_pot 0.4 meter\n", - "mass_pot 0.3 kilogram\n", - "force 1 newton\n", - "torque_friction 0.2 meter * newton\n", - "theta_end 0.5 radian\n", - "t_end 20 second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(radius_disk=0.5*m,\n", - " mass_disk=7*kg,\n", - " radius_pot=0.4*m,\n", - " mass_pot=0.3*kg,\n", - " force=1*N,\n", - " torque_friction=0.2*N*m,\n", - " theta_end=0.5*radian,\n", - " t_end=20*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates the initial state, `init`, and computes the total moment of inertia for the turntable and the teapot." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", - " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", - " \n", - " init = State(theta=0*radian, omega=0*radian/s)\n", - " \n", - " I_disk = mass_disk * radius_disk**2 / 2\n", - " I_pot = mass_pot * radius_pot**2\n", - " \n", - " return System(params, init=init, I=I_disk+I_pot)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `System` object we'll use for the first phase of the simulation, while I am pushing the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    radius_disk0.5 meter
    mass_disk7 kilogram
    radius_pot0.4 meter
    mass_pot0.3 kilogram
    force1 newton
    torque_friction0.2 meter * newton
    theta_end0.5 radian
    t_end20 second
    inittheta 0 radian\n", - "omega 0.0 radi...
    I0.923 kilogram * meter ** 2
    \n", - "
    " - ], - "text/plain": [ - "radius_disk 0.5 meter\n", - "mass_disk 7 kilogram\n", - "radius_pot 0.4 meter\n", - "mass_pot 0.3 kilogram\n", - "force 1 newton\n", - "torque_friction 0.2 meter * newton\n", - "theta_end 0.5 radian\n", - "t_end 20 second\n", - "init theta 0 radian\n", - "omega 0.0 radi...\n", - "I 0.923 kilogram * meter ** 2\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system1 = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulation\n", - "\n", - "When I stop pushing on the turntable, the angular acceleration changes abruptly. We could implement the slope function with an `if` statement that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more accurate results if we simulate the system in two phases:\n", - "\n", - "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", - "\n", - "2. During the second phase, force is 0, and we run until `omega` is 0.\n", - "\n", - "Then we can combine the results of the two phases into a single `TimeFrame`.\n", - "\n", - "Here's the slope function we'll use:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega = state\n", - " radius_disk, force = system.radius_disk, system.force\n", - " torque_friction, I = system.torque_friction, system.I\n", - " \n", - " torque = radius_disk * force - torque_friction\n", - " alpha = torque / I\n", - " \n", - " return omega, alpha " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we'll test the slope function before running the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 ,\n", - " 0.32502708559046584 )" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops the simulation when `theta` reaches `theta_end`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func1(state, t, system):\n", - " \"\"\"Stops when theta reaches theta_end.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: difference from target\n", - " \"\"\"\n", - " theta, omega = state\n", - " return theta - system.theta_end " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-0.5 radian" - ], - "text/latex": [ - "$-0.5\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.5 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func1(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1, details1 = run_ode_solver(system1, slope_func, events=event_func1)\n", - "details1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    1.0000000.16251354279523292 radian0.32502708559046584 radian / second
    1.2000000.2340195016251354 radian0.390032502708559 radian / second
    1.4000000.31852654387865653 radian0.45503791982665215 radian / second
    1.6000000.41603466955579627 radian0.5200433369447454 radian / second
    1.7519610.5 radian0.569434707794277 radian / second
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "1.000000 0.16251354279523292 radian 0.32502708559046584 radian / second\n", - "1.200000 0.2340195016251354 radian 0.390032502708559 radian / second\n", - "1.400000 0.31852654387865653 radian 0.45503791982665215 radian / second\n", - "1.600000 0.41603466955579627 radian 0.5200433369447454 radian / second\n", - "1.751961 0.5 radian 0.569434707794277 radian / second" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Phase 2\n", - "\n", - "Before we run the second phase, we have to extract the final time and state of the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.7519607843137255 second" - ], - "text/latex": [ - "$1.7519607843137255\\ \\mathrm{second}$" - ], - "text/plain": [ - "1.7519607843137255 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = results1.last_label() * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And make an initial `State` object for Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    theta0.5 radian
    omega0.569434707794277 radian / second
    \n", - "
    " - ], - "text/plain": [ - "theta 0.5 radian\n", - "omega 0.569434707794277 radian / second\n", - "Name: 1.7519607843137255, dtype: object" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init2 = results1.last_row()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a new `System` object with zero force." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    radius_disk0.5 meter
    mass_disk7 kilogram
    radius_pot0.4 meter
    mass_pot0.3 kilogram
    force0 newton
    torque_friction0.2 meter * newton
    theta_end0.5 radian
    t_end20 second
    inittheta 0.5 radian\n", - "ome...
    I0.923 kilogram * meter ** 2
    t_01.7519607843137255 second
    \n", - "
    " - ], - "text/plain": [ - "radius_disk 0.5 meter\n", - "mass_disk 7 kilogram\n", - "radius_pot 0.4 meter\n", - "mass_pot 0.3 kilogram\n", - "force 0 newton\n", - "torque_friction 0.2 meter * newton\n", - "theta_end 0.5 radian\n", - "t_end 20 second\n", - "init theta 0.5 radian\n", - "ome...\n", - "I 0.923 kilogram * meter ** 2\n", - "t_0 1.7519607843137255 second\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system2 = System(system1, t_0=t_0, init=init2, force=0*N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops when angular velocity is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func2(state, t, system):\n", - " \"\"\"Stops when omega is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: omega\n", - " \"\"\"\n", - " theta, omega = state\n", - " return omega" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.569434707794277 radian/second" - ], - "text/latex": [ - "$0.569434707794277\\ \\frac{\\mathrm{radian}}{\\mathrm{second}}$" - ], - "text/plain": [ - "0.569434707794277 " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func2(system2.init, 0, system2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the second phase." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.569434707794277 ,\n", - " -0.21668472372697725 )" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system2.init, system2.t_0, system2)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2, details2 = run_ode_solver(system2, slope_func, events=event_func2)\n", - "details2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    3.7519611.2054999681345993 radian0.13606526034032235 radian / second
    3.9519611.2283793257281241 radian0.09272831559492689 radian / second
    4.1519611.2425912943725699 radian0.049391370849531435 radian / second
    4.3519611.2481358740679367 radian0.006054426104135979 radian / second
    4.3799021.247699599245727 radian0.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "3.751961 1.2054999681345993 radian 0.13606526034032235 radian / second\n", - "3.951961 1.2283793257281241 radian 0.09272831559492689 radian / second\n", - "4.151961 1.2425912943725699 radian 0.049391370849531435 radian / second\n", - "4.351961 1.2481358740679367 radian 0.006054426104135979 radian / second\n", - "4.379902 1.247699599245727 radian 0.0 radian / second" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pandas provides `combine_first`, which combines `results1` and `results2`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    3.7519611.2054999681345993 radian0.13606526034032235 radian / second
    3.9519611.2283793257281241 radian0.09272831559492689 radian / second
    4.1519611.2425912943725699 radian0.049391370849531435 radian / second
    4.3519611.2481358740679367 radian0.006054426104135979 radian / second
    4.3799021.247699599245727 radian0.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "3.751961 1.2054999681345993 radian 0.13606526034032235 radian / second\n", - "3.951961 1.2283793257281241 radian 0.09272831559492689 radian / second\n", - "4.151961 1.2425912943725699 radian 0.049391370849531435 radian / second\n", - "4.351961 1.2481358740679367 radian 0.006054426104135979 radian / second\n", - "4.379902 1.247699599245727 radian 0.0 radian / second" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = results1.combine_first(results2)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot `theta` for both phases." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `omega`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdd3xUVf7/8dedmUx6DymACFgOgoqKiIggAgqCKBakWVZd17auy+7+1i5B1LWsLl93F7GsnWpBUUCxgNjFBgpyREERSe99ZjLz++MOGGIIF8jMnSSf5+ORhzN37tz7DkI+OXfO/RwjEAgghBBCRBqH3QGEEEKIlkiBEkIIEZGkQAkhhIhIUqCEEEJEJJfdAdqaUioaGAjkAY02xxFCCNE6J5ADrNVaNzR9ocMVKMzi9J7dIYQQQuyTocD7TTd0xAKVBzBv3jyys7PtziKEEKIV+fn5TJs2DYI/u5vqiAWqESA7O5vu3bvbnUUIIYQ1v/lIRiZJCCGEiEhSoIQQQkQkKVBCCCEikhQoIYQQEUkKlBBCiIgkBUoIIUREkgIlxF4EfF48JTvsjiFEpyMFSohWBPyN5M2fyfa511H+0ct2xxGiU5ECJUQrKj9/g/qfvwWg9J1nqVi73OZEQnQeUqCE2ANfRRGlq+YBkHDUKQCUrPwflV++ZWcsIToNKVBCtCAQCFC04hEC3nri+5xI5ll/Iv20SwEoXj6Xqm/W2JxQiI5PCpQQLajZ8D51P3yJIyae9NG/ByD5hDNJHT4NCFC09N9Ub/rI3pBCdHBSoIRoprG2kuI3nwAgbeTFuBJSd72WOuRcUk4+HwJ+Cpf8i5rNn9kVU3RyH374Ieeddx7HHXcc48eP5/XXXwdgxIgRPP3004wePZpjjjmGG264gU8//ZRx48Zx7LHH8te//pXGRrMva0VFBTfddBNDhgzhlFNO4cEHH8Tn8wHg9Xq54447GDhwIKNGjeKxxx5DKbXr/PPnz2f8+PEMGDCAwYMHc//997f599gRu5kLcUBK3nwSf20lMT2PIrH/yN+8njpsMgGvh4pPllLw4v1kX3Azcb3725BUhFrewruo++GLsJwr9pDjyJl8i6V9N2/ezJVXXsm9997L6aefztq1a7nmmmvo0qULAC+88AILFiygrq6OsWPHsnnzZp5++mkaGho455xzePfddxkxYgQ33HADbrebN954g9raWv70pz/xyCOPcO211zJnzhy++uorli1bhtPp5Jprrtl1/i+++ILZs2ezYMECDjnkENavX8/UqVMZPXo0Rx99dJv9mcgISogman/4kupv1mC43HQ540oMw/jNPoZhkDbyYpIGjIFGHwXP30Pdtg02pBWd1bJlyxg0aBBjx47F5XIxePBgxo8fz5IlSwC4+OKLSUtLo1u3bvTo0YOzzjqLjIwMunXrxmGHHcb27dspLi5m1apV3H777SQkJJCZmcm1117LwoULAVi6dClXXnklmZmZpKenc9111+06/xFHHMHLL7/MIYccQllZGfX19cTHx1NYWNim36eMoIQI8nvqKF4+F4DUYZOISsvZ476GYZA++nICPi9V694mf9Hd5EydQUy3w8MVV4SB1RFNuJWWltK1a9fdtnXv3p1PPvkEgJSUlF3bHQ4HSUlJuz33+/3s2GHefD5mzJhdrwUCAbxeLw0NDRQUFOy26GtOzq//HpxOJ4888ghvvPEGqamp9O3bF7/f37bfJFKghNildPUCfJXFuLN7kzxo/F73NwwHGWOvJODzUL3hPfIXzCJn2kyic3qHIa3ozHJycvjss90///z555/JyMhg69atLY78m8vMzMThcPDee+8RGxsLQHV1NSUlJURHR5OTk0NeXh79+5uXrwsKCna998knn2Tjxo2sXLmSpKQkAoEAAwcObMPv0CSX+IQA6n/5jsq1y8Fw0GXc1RgOp6X3GQ4nXc66jjg1CH9DLXkL7sBTuC3EaUVnN3bsWD777DOWL19OY2MjH330Ea+++irjx+/9F6udsrOzOeGEE7jnnnuoqamhurqam266iVtvvRWAc889l0cffZSioiLKysqYM2fOrvdWVVURFRWFy+Wirq6OBx98kKqqKjweT5t+n1KgRKcXaPRStGwOECD5xLOIzt63EZDhcJJ1znTiDh2Av66KvPkzpXefCKmDDz6YOXPm8Pjjj3P88cczc+ZMZs6cycknn7xPx3nggQeorq7mtNNOY8SIERiGwezZswG4/PLL6du3L6NHj2bixIn069ePqKgoAC677DJiY2MZMmQIo0aNori4mCFDhrB58+Y2/T6NQCDQpge0m1KqJ7D17bffpnv37nbHEe1A2XuLKVuzCFdqNt2veBBHVPR+Hcfv81Cw+B/U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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_omega(results):\n", - " plot(results.omega, label='omega', color='C1')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')\n", - " \n", - "plot_omega(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap25-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "subplot(2, 1, 1)\n", - "plot_theta(results)\n", - "subplot(2, 1, 2)\n", - "plot_omega(results)\n", - "savefig('figs/chap25-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating friction\n", - "\n", - "Let's take the code from the previous section and wrap it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def run_two_phases(force, torque_friction, params):\n", - " \"\"\"Run both phases.\n", - " \n", - " force: force applied to the turntable\n", - " torque_friction: friction due to torque\n", - " params: Params object\n", - " \n", - " returns: TimeFrame of simulation results\n", - " \"\"\"\n", - " # put the specified parameters into the Params object\n", - " params = Params(params, force=force, torque_friction=torque_friction)\n", - "\n", - " # run phase 1\n", - " system1 = make_system(params)\n", - " results1, details1 = run_ode_solver(system1, slope_func, \n", - " events=event_func1)\n", - "\n", - " # get the final state from phase 1\n", - " t_0 = results1.last_label() * s\n", - " init2 = results1.last_row()\n", - " \n", - " # run phase 2\n", - " system2 = System(system1, t_0=t_0, init=init2, force=0*N)\n", - " results2, details2 = run_ode_solver(system2, slope_func, \n", - " events=event_func2)\n", - " \n", - " # combine and return the results\n", - " results = results1.combine_first(results2)\n", - " return TimeFrame(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test it with the same parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    3.7519611.2054999681345993 radian0.13606526034032235 radian / second
    3.9519611.2283793257281241 radian0.09272831559492689 radian / second
    4.1519611.2425912943725699 radian0.049391370849531435 radian / second
    4.3519611.2481358740679367 radian0.006054426104135979 radian / second
    4.3799021.247699599245727 radian0.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "3.751961 1.2054999681345993 radian 0.13606526034032235 radian / second\n", - "3.951961 1.2283793257281241 radian 0.09272831559492689 radian / second\n", - "4.151961 1.2425912943725699 radian 0.049391370849531435 radian / second\n", - "4.351961 1.2481358740679367 radian 0.006054426104135979 radian / second\n", - "4.379902 1.247699599245727 radian 0.0 radian / second" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "force = 1*N\n", - "torque_friction = 0.2*N*m\n", - "results = run_two_phases(force, torque_friction, params)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.247699599245727 radian" - ], - "text/latex": [ - "$1.247699599245727\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.247699599245727 " - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "theta_final = results.last_row().theta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the error function we'll use with `root_bisect`.\n", - "\n", - "It takes a hypothetical value for `torque_friction` and returns the difference between `theta_final` and the observed duration of the first push, 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(torque_friction, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " torque_friction: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " force = 1 * N\n", - " results = run_two_phases(force, torque_friction, params)\n", - " theta_final = results.last_row().theta\n", - " print(torque_friction, theta_final)\n", - " return theta_final - 1.5 * radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing the error function." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 meter * newton 2.491081016010591 radian\n" - ] - }, - { - "data": { - "text/html": [ - "0.991081016010591 radian" - ], - "text/latex": [ - "$0.991081016010591\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.991081016010591 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "guess1 = 0.1*N*m\n", - "error_func1(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.3 meter * newton 0.8319164068661051 radian\n" - ] - }, - { - "data": { - "text/html": [ - "-0.6680835931338949 radian" - ], - "text/latex": [ - "$-0.6680835931338949\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.6680835931338949 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "guess2 = 0.3*N*m\n", - "error_func1(guess2, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And running `root_scalar`." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.1 meter * newton 2.491081016010591 radian\n", - "0.3 meter * newton 0.8319164068661051 radian\n", - "0.2 meter * newton 1.247699599245727 radian\n", - "0.15000000000000002 meter * newton 1.664679140408952 radian\n", - "0.17500000000000002 meter * newton 1.4245119372074873 radian\n", - "0.16250000000000003 meter * newton 1.5351133644066652 radian\n", - "0.16875 meter * newton 1.4775125382367449 radian\n", - "0.16562500000000002 meter * newton 1.5057134910749645 radian\n", - "0.16718750000000002 meter * newton 1.4913395920086545 radian\n", - "0.16640625000000003 meter * newton 1.4984572231242101 radian\n", - "0.16601562500000003 meter * newton 1.502067905168568 radian\n", - "0.16621093750000004 meter * newton 1.5002582165443015 radian\n", - "0.16630859375000004 meter * newton 1.4993566348484146 radian\n", - "0.16625976562500006 meter * newton 1.4998071542109142 radian\n", - "0.16623535156250005 meter * newton 1.500032617476343 radian\n", - "0.16624755859375007 meter * newton 1.499919868872052 radian\n", - "0.16624145507812504 meter * newton 1.4999762389308366 radian\n", - "0.16623840332031253 meter * newton 1.5000044271426904 radian\n", - "0.1662399291992188 meter * newton 1.4999903327715458 radian\n", - "0.16623916625976565 meter * newton 1.499997379890813 radian\n", - "0.1662387847900391 meter * newton 1.5000009035001758 radian\n", - "0.16623897552490235 meter * newton 1.4999991416913503 radian\n", - "0.16623888015747074 meter * newton 1.5000000225947272 radian\n", - "0.16623892784118655 meter * newton 1.4999995821427796 radian\n", - "0.16623890399932864 meter * newton 1.4999998023686882 radian\n", - "0.1662388920783997 meter * newton 1.4999999124816914 radian\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root0.16623888611793522 meter * newton
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 0.16623888611793522 meter * newton\n", - "dtype: object" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_bisect(error_func1, [guess1, guess2], params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the coefficient of friction that yields a total rotation of 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16623888611793522 meter newton" - ], - "text/latex": [ - "$0.16623888611793522\\ \\mathrm{meter} \\cdot \\mathrm{newton}$" - ], - "text/plain": [ - "0.16623888611793522 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "torque_friction = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a test run with the estimated value." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.4999999675382056 radian" - ], - "text/latex": [ - "$1.4999999675382056\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.4999999675382056 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "force = 1 * N\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks good." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "\n", - "Here's a draw function we can use to animate the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " theta, omega = state\n", - " \n", - " # draw a circle for the table\n", - " radius_disk = magnitude(params.radius_disk)\n", - " circle1 = Circle([0, 0], radius_disk)\n", - " plt.gca().add_patch(circle1)\n", - " \n", - " # draw a circle for the teapot\n", - " radius_pot = magnitude(params.radius_pot)\n", - " center = pol2cart(theta, radius_pot)\n", - " circle2 = Circle(center, 0.05, color='C1')\n", - " plt.gca().add_patch(circle2)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "state = results.first_row()\n", - "draw_func(state, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Exercises\n", - "\n", - "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", - "\n", - "Write an error function that takes `force` and `params` and returns the offset from the desired angle." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func2(force, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " force: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " # notice that this function uses the global value of torque_friction\n", - " results = run_two_phases(force, torque_friction, params)\n", - " theta_final = get_last_value(results.theta)\n", - " print(force, theta_final)\n", - " remaining_angle = np.pi - 1.5\n", - " return theta_final - remaining_angle * radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the error function with `force=1`" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.5 newton 0.7508796257362771 radian\n" - ] - }, - { - "data": { - "text/html": [ - "-0.890713027853516 radian" - ], - "text/latex": [ - "$-0.890713027853516\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.890713027853516 " - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess1 = 0.5 * N\n", - "error_func2(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2 newton 2.990287714114223 radian\n" - ] - }, - { - "data": { - "text/html": [ - "1.3486950605244297 radian" - ], - "text/latex": [ - "$1.3486950605244297\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.3486950605244297 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess2 = 2 * N\n", - "error_func2(guess2, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run `root_bisect` to find the desired force." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.5 newton 0.7508796257362771 radian\n", - "2 newton 2.990287714114223 radian\n", - "1.25 newton 1.8767666580336735 radian\n", - "0.875 newton 1.314142751543798 radian\n", - "1.0625 newton 1.5961003377501604 radian\n", - "1.15625 newton 1.7324316654000937 radian\n", - "1.109375 newton 1.6640846390801893 radian\n", - "1.0859375 newton 1.6295935099707282 radian\n", - "1.09765625 newton 1.6467143299143472 radian\n", - "1.091796875 newton 1.6381227337897593 radian\n", - "1.0947265625 newton 1.6424107353138588 radian\n", - "1.09326171875 newton 1.6402647854172603 radian\n", - "1.093994140625 newton 1.6413372730819231 radian\n", - "1.0943603515625 newton 1.6418738823769812 radian\n", - "1.09417724609375 newton 1.641605547274225 radian\n", - "1.094085693359375 newton 1.6414714025642667 radian\n", - "1.0941314697265625 newton 1.641538473015794 radian\n", - "1.0941543579101562 newton 1.6415720096691466 radian\n", - "1.0941658020019531 newton 1.6415887783527199 radian\n", - "1.0941715240478516 newton 1.6415971627837305 radian\n", - "1.0941686630249023 newton 1.6415929705607897 radian\n", - "1.0941672325134277 newton 1.641590874454896 radian\n", - "1.094167947769165 newton 1.6415919225073785 radian\n", - "1.0941683053970337 newton 1.6415924465339684 radian\n", - "1.094168484210968 newton 1.6415927085473503 radian\n", - "1.0941683948040009 newton 1.641592577540652 radian\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root1.0941684395074844 newton
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 1.0941684395074844 newton\n", - "dtype: object" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_bisect(error_func2, [guess1, guess2], params)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.6415926430439989 radian" - ], - "text/latex": [ - "$1.6415926430439989\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.6415926430439989 " - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "force = res.root\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.6415926535897931" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "remaining_angle = np.pi - 1.5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Now suppose my friend pours 0.1 kg of tea and puts the teapot back on the turntable at distance 0.3 meters from the center. If I ask for the tea back, how much force should they apply, over an arc of 0.5 radians, to make the teapot glide to a stop back in front of me? You can assume that torque due to friction is proportional to the total mass of the teapot and the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "7.3 kilogram" - ], - "text/latex": [ - "$7.3\\ \\mathrm{kilogram}$" - ], - "text/plain": [ - "7.3 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "mass_before = params.mass_pot + params.mass_disk" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    radius_disk0.5 meter
    mass_disk7 kilogram
    radius_pot0.3 meter
    mass_pot0.2 kilogram
    force1 newton
    torque_friction0.2 meter * newton
    theta_end0.5 radian
    t_end20 second
    \n", - "
    " - ], - "text/plain": [ - "radius_disk 0.5 meter\n", - "mass_disk 7 kilogram\n", - "radius_pot 0.3 meter\n", - "mass_pot 0.2 kilogram\n", - "force 1 newton\n", - "torque_friction 0.2 meter * newton\n", - "theta_end 0.5 radian\n", - "t_end 20 second\n", - "dtype: object" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "params2 = Params(params, mass_pot=0.2*kg, radius_pot=0.3*m)" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "7.2 kilogram" - ], - "text/latex": [ - "$7.2\\ \\mathrm{kilogram}$" - ], - "text/plain": [ - "7.2 " - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "mass_after = params2.mass_pot + params2.mass_disk" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16623888611793522 meter newton" - ], - "text/latex": [ - "$0.16623888611793522\\ \\mathrm{meter} \\cdot \\mathrm{newton}$" - ], - "text/plain": [ - "0.16623888611793522 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "torque_friction" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16396164110262107 meter newton" - ], - "text/latex": [ - "$0.16396164110262107\\ \\mathrm{meter} \\cdot \\mathrm{newton}$" - ], - "text/plain": [ - "0.16396164110262107 " - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "torque_friction2 = torque_friction * mass_after / mass_before" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomega
    5.6309692.9973839879919186 radian0.12061194274576453 radian / second
    5.8309693.0178342233248876 radian0.0838904105839233 radian / second
    6.0309693.030940152225488 radian0.04716887842208207 radian / second
    6.2309693.03670177469372 radian0.010447346260240839 radian / second
    6.2878703.036251498073426 radian0.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - " theta omega\n", - "5.630969 2.9973839879919186 radian 0.12061194274576453 radian / second\n", - "5.830969 3.0178342233248876 radian 0.0838904105839233 radian / second\n", - "6.030969 3.030940152225488 radian 0.04716887842208207 radian / second\n", - "6.230969 3.03670177469372 radian 0.010447346260240839 radian / second\n", - "6.287870 3.036251498073426 radian 0.0 radian / second" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess = 2 * N\n", - "results = run_two_phases(guess, torque_friction2, params2)\n", - "results.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "subplot(2, 1, 1)\n", - "plot_theta(results)\n", - "subplot(2, 1, 2)\n", - "plot_omega(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# Note: this is so similar to error_func2, it would be better\n", - "# to generalize it, but for expediency, I will make a modified\n", - "# verison.\n", - "\n", - "def error_func3(force, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " force: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " # notice that this function uses the global value of torque_friction2\n", - " results = run_two_phases(force, torque_friction2, params)\n", - " theta_final = get_last_value(results.theta)\n", - " print(force, theta_final)\n", - " remaining_angle = np.pi * radian\n", - " return theta_final - remaining_angle" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 newton 1.521633703251964 radian\n" - ] - }, - { - "data": { - "text/html": [ - "-1.619958950337829 radian" - ], - "text/latex": [ - "$-1.619958950337829\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-1.619958950337829 " - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess1 = 1 * N\n", - "error_func3(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3 newton 4.544952149083414 radian\n" - ] - }, - { - "data": { - "text/html": [ - "1.4033594954936213 radian" - ], - "text/latex": [ - "$1.4033594954936213\\ \\mathrm{radian}$" - ], - "text/plain": [ - "1.4033594954936213 " - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess2 = 3 * N\n", - "error_func3(guess2, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1 newton 1.5220674118848017 radian\n", - "3 newton 4.555863285616827 radian\n", - "2.0 newton 3.036251498073426 radian\n", - "2.5 newton 3.7711230348952873 radian\n", - "2.25 newton 3.410270734411078 radian\n", - "2.125 newton 3.237449910464716 radian\n", - "2.0625 newton 3.137756144960873 radian\n", - "2.09375 newton 3.189525229335694 radian\n", - "2.078125 newton 3.1637524234581544 radian\n", - "2.0703125 newton 3.1507232783707426 radian\n", - "2.06640625 newton 3.144231960206115 radian\n", - "2.064453125 newton 3.1409921147185713 radian\n", - "2.0654296875 newton 3.142611552996112 radian\n", - "2.06494140625 newton 3.141801712740783 radian\n", - "2.064697265625 newton 3.1413968834505375 radian\n", - "2.0648193359375 newton 3.1415992905258765 radian\n", - "2.06475830078125 newton 3.141498085095761 radian\n", - "2.064788818359375 newton 3.1415486873377074 radian\n", - "2.0648040771484375 newton 3.1415739888135135 radian\n", - "2.0648117065429688 newton 3.141586639640125 radian\n", - "2.0648155212402344 newton 3.1415929650756085 radian\n", - "2.0648136138916016 newton 3.1415898023560187 radian\n", - "2.064814567565918 newton 3.1415913837153515 radian\n", - "2.064815044403076 newton 3.141592174395364 radian\n", - "2.0648152828216553 newton 3.1415925697354568 radian\n", - "2.064815402030945 newton 3.141592767405525 radian\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root2.0648153424263 newton
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 2.0648153424263 newton\n", - "dtype: object" - ] - }, - "execution_count": 52, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_bisect(error_func3, [guess1, guess2], params2)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.0648153424263 newton 3.135475479073576 radian\n" - ] - }, - { - "data": { - "text/html": [ - "-0.006117174516217183 radian" - ], - "text/latex": [ - "$-0.006117174516217183\\ \\mathrm{radian}$" - ], - "text/plain": [ - "-0.006117174516217183 " - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func3(res.root, params)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/data/World_population_estimates2.csv b/soln/data/World_population_estimates2.csv deleted file mode 100644 index ed7de057..00000000 --- a/soln/data/World_population_estimates2.csv +++ /dev/null @@ -1,68 +0,0 @@ -Year,census,prb,un,maddison,hyde,tanton,biraben,mj,thomlinson,durand,clark -1950,2557628654,2516000000.0,2525149000.0,2544000000.0,2527960000.0,2400000000.0,2527000000.0,2500000000.0,2400000000.0,,2486000000.0 -1951,2594939877,,2572850917.0,2571663000.0,,,,,,, -1952,2636772306,,2619292068.0,2617949000.0,,,,,,, -1953,2682053389,,2665865392.0,2665959000.0,,,,,,, -1954,2730228104,,2713172027.0,2716927000.0,,,,,,, -1955,2782098943,,2761650981.0,2769074000.0,,,,,,, -1956,2835299673,,2811572031.0,2822502000.0,,,,,,, -1957,2891349717,,2863042795.0,2879934000.0,,,,,,, -1958,2948137248,,2916030167.0,2939254000.0,,,,,,, -1959,3000716593,,2970395814.0,2995909000.0,,,,,,, -1960,3043001508,,3026002942.0,3041507000.0,3042000000.0,,,,,, -1961,3083966929,,3082830266.0,3082161000.0,,,,,,, -1962,3140093217,,3141071531.0,3135787000.0,,,,,,,3036000000.0 -1963,3209827882,,3201178277.0,3201354000.0,,,,,,, -1964,3281201306,,3263738832.0,3266477000.0,,,,,,, -1965,3350425793,,3329122479.0,3333138000.0,,,,,,, -1966,3420677923,,3397475247.0,3402224000.0,,,,,,,3288000000.0 -1967,3490333715,,3468521724.0,3471464000.0,,,,,,, -1968,3562313822,,3541674891.0,3543086000.0,,,,,,, -1969,3637159050,,3616108749.0,3615743000.0,,,,,,, -1970,3712697742,,3691172616.0,3691157000.0,3710000000.0,,3637000000.0,,3600000000.0,"3,600,000,000– 3,700,000,000",3632000000.0 -1971,3790326948,,3766754345.0,3769818000.0,,,,,,, -1972,3866568653,,3842873611.0,3846499000.0,,,,,,, -1973,3942096442,,3919182332.0,3922793000.0,3923000000.0,,,,,,3860000000.0 -1974,4016608813,,3995304922.0,3997677000.0,,,,,,, -1975,4089083233,,4071020434.0,4070671000.0,,,,3900000000.0,4000000000.0,, -1976,4160185010,,4146135850.0,4141445000.0,,,,,,, -1977,4232084578,,4220816737.0,4213539000.0,,,,,,, -1978,4304105753,,4295664825.0,4286317000.0,,,,,,, -1979,4379013942,,4371527871.0,4363144000.0,,,,,,, -1980,4451362735,,4449048798.0,4439529000.0,4461000000.0,,,,,, -1981,4534410125,,4528234634.0,4514838000.0,,,,,,, -1982,4614566561,,4608962418.0,4587307000.0,,,,,,, -1983,4695736743,,4691559840.0,4676388000.0,,,,,,, -1984,4774569391,,4776392828.0,4756521000.0,,,,,,, -1985,4856462699,,4863601517.0,4837719000.0,,5000000000.0,,,,, -1986,4940571232,,4953376710.0,4920968000.0,,,,,,, -1987,5027200492,,5045315871.0,5006672000.0,,,,,,, -1988,5114557167,,5138214688.0,5093306000.0,,,,,,, -1989,5201440110,,5230000000.0,5180540000.0,,,,,,, -1990,5288955934,,5320816667.0,5269029000.0,5308000000.0,,,,,, -1991,5371585922,,5408908724.0,5351922000.0,,,,,,, -1992,5456136278,,5494899570.0,5435722000.0,,,,,,, -1993,5538268316,,5578865109.0,5518127000.0,,,,,,, -1994,5618682132,,5661086346.0,5599396000.0,,,,,,, -1995,5699202985,5760000000.0,5741822412.0,5681575000.0,,,,,,, -1996,5779440593,,5821016750.0,5762212000.0,,,,,,, -1997,5857972543,5840000000.0,5898688337.0,5842122000.0,,,,,,, -1998,5935213248,,5975303657.0,5921366000.0,,,,,,, -1999,6012074922,,6051478010.0,5999622000.0,,,,,,, -2000,6088571383,6067000000.0,6127700428.0,6076558000.0,6145000000.0,,,5750000000.0,,, -2001,6165219247,6137000000.0,6204147026.0,6154791000.0,,,,,,, -2002,6242016348,6215000000.0,6280853817.0,6231704000.0,,,,,,, -2003,6318590956,6314000000.0,6357991749.0,6308364000.0,,,,,,, -2004,6395699509,6396000000.0,6435705595.0,6374056000.0,,,,,,, -2005,6473044732,6477000000.0,6514094605.0,6462987000.0,,,,,,, -2006,6551263534,6555000000.0,6593227977.0,6540214000.0,,,,,,, -2007,6629913759,6625000000.0,6673105937.0,6616689000.0,,,,,,, -2008,6709049780,6705000000.0,6753649228.0,6694832000.0,,,,,,, -2009,6788214394,6809972000.0,6834721933.0,6764086000.0,,,,,,, -2010,6858584755,6892319000.0,6916183482.0,,,,,,,, -2011,6935999491,6986951000.0,6997998760.0,,,,,,,, -2012,7013871313,7057075000.0,7080072417.0,,,,,,,, -2013,7092128094,7136796000.0,7162119434.0,,,,,,,, -2014,7169968185,7238184000.0,7243784000.0,,,,,,,, -2015,7247892788,7336435000.0,7349472000.0,,,,,,,, -2016,7325996709,7418151841.0,,,,,,,,, diff --git a/soln/data/World_population_estimates3.csv b/soln/data/World_population_estimates3.csv deleted file mode 100644 index 2ab604fe..00000000 --- a/soln/data/World_population_estimates3.csv +++ /dev/null @@ -1,46 +0,0 @@ -Year,census,prb,un -2016,7334771614.0,,7432663280.0 -2017,7412778971.0,, -2018,7490427640.0,, -2019,7567402977.0,, -2020,7643402123.0,,7758157000.0 -2021,7718256830.0,, -2022,7792021317.0,, -2023,7864725370.0,, -2024,7936271554.0,, -2025,8006580553.0,8000000000.0,8141661000.0 -2026,8075716000.0,, -2027,8143729466.0,, -2028,8210559895.0,, -2029,8276190519.0,, -2030,8340606590.0,8505000000.0,8500766000.0 -2031,8403880343.0,, -2032,8466094022.0,, -2033,8527246205.0,, -2034,8587325154.0,, -2035,8646304704.0,,8838908000.0 -2036,8704239274.0,, -2037,8761189197.0,, -2038,8817138785.0,, -2039,8872066537.0,, -2040,8925949679.0,,9157234000.0 -2041,8978822945.0,, -2042,9030723366.0,, -2043,9081617002.0,, -2044,9131462326.0,, -2045,9180225214.0,,9453892000.0 -2046,9227935007.0,, -2047,9274616811.0,, -2048,9320232984.0,, -2049,9364750182.0,, -2050,9408141302.0,9804000000.0,9725148000.0 -2055,,,9968809000.0 -2060,,,10184290000.0 -2065,,,10375719000.0 -2070,,,10547989000.0 -2075,,,10701653000.0 -2080,,,10836635000.0 -2085,,,10953525000.0 -2090,,,11055270000.0 -2095,,,11142461000.0 -2100,,,11213317000.0 diff --git a/soln/diagrams/RC_Divider.png b/soln/diagrams/RC_Divider.png deleted file mode 100644 index 83c136163d0e48699f20b9f25f3eda9695b511b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1752 zcmZ`(c{JPU8vfB{#4gqn=2FYGG?J*TDX}ypqKrgMsVTA{f@sCk)>blTQ*>Mu#b|LU zsxsPCrEaSluG*%yNtsXvgP|BjQDc7XA2a9vanJeQ@A;nRJcu^r_9~~w^WteTZ(aaG6%s>H#nqOuOd4H%U005tM9{t*?rMPDwr6t9n>0cSABKN&f0NN)E_IA$tOfU>tTtkDQcRs~w5f8JsRz@L@?)NZbe20>U>PGYV6VC9n?B zPuBc}qNW#WM-v@|=IKclFBuwU$1gl5=5Nh@sc@WE zs5HJ*tZUY;+)|7fzW`LU@VunU2MlWLs!trlD)Ni!v~OAoj#QGokJDhAknAVlDbQpL z2Fkl?e$lZuG^q$V!kei(IjS+UipmZDz-27Q+w0#EX14w)D@*I6*~sP2`TsShT6dz4 zP=4*bT}H_e-It57kQt}F_6yd;ic9hW||E-@A+NbO5{aV^QW5) z$9XuhrAwwH2li9my*duIqx&V%&=|(q1opao#MoQDyJ-R3Vj=0*(QC^8TnNbMiUuC` zuBbbAdb9CQGw#|DmWk<7&JMPgHL}jsic7n<>TjR#qip9qV)ajFi2ARuzL4SZjPH*$ z(M^+t?I{*FnmvQXFJvZ|RdG3Wj)I1TVB*(uzkR_}2!bzbC2K~E8Ro7y-b+!)l~{a9 zN^10rUGC)M)?}i1Z4v2^EEh*>F3I7!-=7?#nj zMrDc)$&(*;VXo&joO5?*)_0>VpZYGXa(-vxlPnG zldYGyzozSO5@MFZ*M3ur5d0hkG1%O!I;Tyo)vtNyPmVlfX_T&ZzB&}6J@ZJUBpco6 zCsLVAFHpUpn$=^P66vg)mGWftgL0qitZ+A?=$RwLYy+1v-ms6=;eWvs7LxWi=y@C@uZ0J7AOeKGqyYWh@AicozcXeACKhy7Zhh{GDMwof~ zJB^=psy53|UJaENzwUs|Fj(QQl$gu-$dTPWkV?=R`@`j(i`6|odQ3YhX z*ujMFd%4;Cs~7}ya?;&||3Km9T+gk9Xt8Y&9d`TBZjNIc-2Y{his_~#x@R)CWz|gf z+sndA{$pT1=`sG?J~iK$|8{Miw@*N}b+4##Lg!vWFoWAINl=D7KD=oAhEL%YZT0kA@$?GY$D1lsBh z8jV3)V?I%93<_17MhW^KLlm3N488RK4P%lwGoZo!(+;umVHheUmVt=7$OJ-}kqitH zi412)F_3h2LNwzN(u+;^Wk&g2LekiDP-IfVE>famk>pdsIA%PP&bVj^mTW|a diff --git a/soln/diagrams/RC_Divider.svg b/soln/diagrams/RC_Divider.svg deleted file mode 100644 index 16834bdc..00000000 --- a/soln/diagrams/RC_Divider.svg +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - R - C - V - in - V - out - - diff --git a/soln/diagrams/queue.png b/soln/diagrams/queue.png deleted file mode 100644 index 25f5d200aca209ea530fe4342753dbca24a3977f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8874 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 B9t8jZ diff --git a/soln/diagrams/spider-man.png b/soln/diagrams/spider-man.png deleted file mode 100644 index 81f8f591f819ce3c826d2b85a12fbc2e23a9ab02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35300 zcmdRWhdb5(|Gw>H9wR$DD}R+5!jNV1c?3E4>q*`aK*>GwGA z&-MKye&>2$*ZYbbuk(C9#{IbO`%#p(rV1$$0}&P$7U>;TMO`c`><}z093lh`d?hz& z_5l8e>yEmkk3b-%=C$VFk8~bN1|E9O)*fEwZdO>1<{nnp-5$BkdNd^$P2;&^35$4tpLen zN5fB+eJ=(NJ}~3zSn=Y;3M<%34B~FQ`6ZiUeh-uBsKNbgxwMa=hgkwHpp6W#oxQAu=Ug z;rcos+wl@6vZ44aYNobo7vp$0a{2@s)_3~^RS=>gB22eE9okY}MPuHMNi1W7Q1(dP z&+m4JP`vcP#1i4O@1GKv#V}fvZEq>!hI)N;50b6A+^FQ=4$Hrh@81jb`B;2c*_uqq zyTu)U=o=e9NBSO2+Sr}2$c&B_YR&p>HE9;!bn4R}g;3E&6px*}VL5+SU48G($aK)Z zb5T)I*`qe{xzaCR)U;X3#;*l_Da;N$X~iX%V2YFA7q^15QN5hy^DAx2xuvP3L<4>d z-V)C9XOfo8rB{Q$1~OW9Vx1#d_>aVmn%(0Was~V=mO{$)B>>ipLS^T%m+E*4FK@U%q_FaBilLW04I! zOKCZ?YW$wPpU?w^0As1Jf(<)rEMFMZF~5uFj1+pC39mg&}qMk}*f{ z(a4b%>Al;_9T6V>TzOHvd52UU$t8P(j-(l`yk^F8D*1s)6!J@df9I}ZqOQa)cD#I(F#yng-q%56{n ziF7@x1x9wx>p>@@*>a(l!jsNHr&HCtyJ$@n5drhWrnNht86SKw2;TZKI2Z_rfiIt+mhaNJvN!LS?fbh3{;pf_ zgNy~_lgI@0*``;E-|=z^zI^R^Wgm0kk$D9HHf0pv6K!+z+#`W?KHs(c6qH*eVh^tZ zK9!Q6-|5Bq>A$lTS;Ek^Yh{gY^l`Yu7eucDE3%crqx*`N zqHSMf1P&YeXTaf%k0Fz}Z=|TADl;eL9UUDC)as`xrFVk2dt@B?%ciGFc(5> z(IV3>0(rtoE}XVrw~`gp>*MC`{zjIZ4b@ZdJmI&9xOfE9j<*y9qMb2KQaUE3B>DT^ zkJ+P#>!1GFrudrU%Z90+tlK;k3;6KpYKw=buFdRgQda~q`H>zMN0zn1Ci||jk%>&0 zL}C3+7$)EH*S59<`S{fC-c>+6@}3WK(azT`F>R44{iAjr^J5GRGtCZ@!aEe%L$oi3 zRa2eei+NW5{%6y5?okq|EB$FV7qV=Ej{8iJCP)}3w2||Ml?4p*kSs2p`AVq)C zns}SLX=NL@p6su&oUf`lx11l$cSJn)Hj+mgyt;nv8ZjQu!Y7+&itM+%HkrCzZ#1%- zOaAv{*K4MCce+_-AqBT>o<9A1y44aic67ExP5fE@*`lw;r$xBmn5FVFhZ|_?2 z7v6Y5(`F_%kKLu-RMSKuXlm$5ore!kA*?viuLMmm8fMQ0c2NhD?Un1&htpN=E1IvY z_I7tYw|-_OB~f+kJ>DYks~na7b+ohizvpm{6e2e9Sx%Ncn15zYl?=_@z&OVi8lwJ0FV}ZzeA>pGJ^^lf=1`9qw zT7^-G?7!n7Mg|6hS2MM)i%o|=iS4@gf=AcRx&#AVx98-G^y}SM2Fn8f7VmlFZmV*> zh!JeAt*A(}GNk0sz{HcanXT<=X~X94wKaJ}FhSdJ+i~lfhs@b_M+DiG7rmC43iWjS zk+>EuWoXPTF89^p+=_}DNxdJj`c$nVW73giEwe#Tw=GCddbI+DgBX_F>H-g{vad*b zM4G2=1s*ndqdxn$y1pJ=Q$$pM`sBt$m|xP)x!rdB@Der!Jv*A4js!xJ1HI&S4AsAA z#P-)3N+x^j-+9YFul-e>H1$u9yW{?pwFG7f;Fa?epBLVW>k#ClBiWT=At9I#SLb@e z1AiL)qlSotIxufeXAN})k(-y7H~G0Qw9SkanV`yf^W?rnT*FG1-|yeQ-|DU%w){KC z-zL1nN%{JQzP2`&_`6GULw`yeoVI>8K{@P&ny$fxKX47I@qCV*uT!4O!TMyt>A~3d z@9F9VvuD4=kB^T>rG=4*X`hwMLal6N#0(tL1Ji)N(xdJf0(3-`s$e+p}xy>rBkd zCaL%G`8ydPs7BtXgtpB=deD*(c&$&|SblsK_z#y{3d=4c#n`P^Lwv@v!l2;xe8X1r z>FS$!0-WHhcV9_CtC7rfYJMeiDSK#qYz%)b=7{w`Ih5c|zV5s6%)$>>al#v0(5iKC zRM6Li==|ryXfIA%{`u|VlEH;{kcu-&c_Z0ALdZckuPHBgsaO9~GaGo?a`C4HCs^*@ zy)g_38~;Q5^`Eei5No0;w4^RV-e?9!#y?wIhu%`G(&d6Nz3VqobP${DRuKD#vq3E; zW#j~*g3U)3k(AXnHM0A|3ZbE)N=iyYQhWUe8&e%0FTDSh)C8VR&7PcJq^GBwp8tMu zL+~3SerV;1qvHU85G^fQmYPY2vc}ynn6{`_s0o)JnZkzt+}%y<=EI9fWNYU)fT9Im zqi}RBq;0M_;Pk`&YfN5s#+Zg`Ebze2Zmlfn{7+?Nr4VCU%}?Jahnq7p+0IZ+WltxE zXxsz|_W%B^o7seVn6T*R=*X>=b+(kGRo~En8~jY-scrCsR1CK3kE?z%E^{;&n$TJ6 zwPljE^6%oXWfp!dOVF9Cl2R8YSNr?>g|uc{f@CM;pM3w|v)x9xQl`-3@r>6}IL$2c z3@?OLB2%+$ywBBGh>jXho;^`6D1T>XrlVCz-18-6kRe|=MJ9k)-$U-iZ z$Mcor>1pGnUd2%nB^}eV1=^>QkM#6Lm#|0CbSQQ!be#*Fd)95QO{j`20s9mv=x}Eb zT2Af(aQ2AzYM6m-Zn!FcJG$kIk#ldhiM7qrH_4Vg{>3Y~u zKW|k+X-U5Jz{G3jX@l2R){R~XY3cK=pns?0Eyn{h4PIK~UQe6puUxsp%zVFiY-3}i zy1M$-ty{xumzflv>GM5pm|>15WNG~UzWAe2NteZBOHh#Ut4yK<4SMs=Ct1Oh`$wsW$S-66EE@PR1rgQoG3M*;h?|82>Y(XeThVx4gW}-*>RT ze+G{pe|Sw*6H-Sv65^q>w6w8NDpQkCLkgyio}QkgBZ;9sqA+$kk`sTKmRTsE6;hC5 z#d&$~B{5OauG7n$+)(t2+K-OB9UV(_i;O=x(098sb(4~jegFPl=HJ=gzr&z^i%fsz2YtRrb#7NX zgxbu?^YfSUQ%v%B>;bDkdh|%JXz`hG*+*eP24Lz1 z2Lh$1m(;fmkeX4@qXgecYNQp-QzOGrA-wj*TW$|hsQe|ldWuf&wmA@C># zLd_H9KCq!aLc=*7QDF&KN>o``Xp;s^)$i4{EhQ@{c>;6m$B!R*sEH~Faxc+`)RWed zisQ-8NoXSRURklFAymFd#C2%R0>ZSx@s` z=ykddAyzs5zON$J5hzxqnIX;eS6fs$mux^sIBD^NvI{tC7Vo)W@mc@9_r<04kaYdl zdjJACmI*r z>efB|3=QdPlVB(V;5u1lldQIU`GIk+Zc)2zrj_ApS&tCOx9X4+OKWTUYNPV!a^+kx ziN*q^ErI9Iv`zgssv*p`=GsEzWlmP{X^maB=h}v3|D84N4Q6cS+1c5t3;+gM))_YorG&qu8QKH15jFlt6xVYI+NAEOZp$NJUO)D4 ze){Kok^cL(wl*^%14F|)rzB9&eDh>^#PRvX!NCEH+t2fOVwG_#gi_TA zK95XHq>kDD^_ChwR-b-qt9Ji`!OmXxKjV`7vw)2#qby;VhU(1vNZuMIqxN+(!-Jy2 zEF994-INx80FDCBuW&LK{r>Aa_2WlnRn<*lVY+ZbXvEQ%ufY)Z*H@Z{7=_^HLUN=R zSP7?1FmCJ}o6!<(*|$>=ls3o;UUEMWf~f5OG^mpqw|a2 zcqRr0C=W5`4M}sD+D!B8%0AE}del!Rty0c0DUF}%b%j=v{VJ#J!4rB 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 Sk(3v7cp2!L>O9nP2>L&9$QF74 diff --git a/soln/diagrams/throwingaxe1.png b/soln/diagrams/throwingaxe1.png deleted file mode 100644 index 12f81a3fc8fc6942c374bc9329740d0e1e3f6ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27102 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 diff --git a/soln/diagrams/throwingaxe2.png b/soln/diagrams/throwingaxe2.png deleted file mode 100644 index dd34730b90461fad0766bfa729968eaced01092e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34525 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 MSwksZ!NmLj0TqAbs{jB1 diff --git a/soln/duck_soln.ipynb b/soln/duck_soln.ipynb deleted file mode 100644 index 9197ff79..00000000 --- a/soln/duck_soln.ipynb +++ /dev/null @@ -1,266 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Copyright 2018 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The duck problem\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "centimeter" - ], - "text/latex": [ - "$\\mathrm{centimeter}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = UNITS.g\n", - "cm = UNITS.cm" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    density_duck0.3 gram / centimeter ** 3
    density_water1.0 gram / centimeter ** 3
    r5 centimeter
    \n", - "
    " - ], - "text/plain": [ - "density_duck 0.3 gram / centimeter ** 3\n", - "density_water 1.0 gram / centimeter ** 3\n", - "r 5 centimeter\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System (\n", - " density_duck = 0.3 * g/cm**3,\n", - " density_water = 1 * g/cm**3,\n", - " r = 5 * cm,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(d, system):\n", - " # in order to work with root_scale, we have\n", - " # to accept input that does not have units\n", - " d = d * cm\n", - " r = system.r\n", - " \n", - " volume_duck = 4 / 3 * pi * r**3\n", - " mass_duck = volume_duck * system.density_duck\n", - "\n", - " volume_water = pi / 3 * (3 * r * d**2 - d**3)\n", - " mass_water = volume_water * system.density_water\n", - "\n", - " # and return an error that does not have units\n", - " error = mass_duck - mass_water\n", - " return magnitude(error)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "43.982297150257125" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(3, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-27.227136331111524" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(4, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - " converged: True\n", - " flag: 'converged'\n", - " function_calls: 7\n", - " iterations: 6\n", - " root: 3.6325749109061265" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = root_scalar(error_func, [3., 4.], system)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "3.6325749109061265 centimeter" - ], - "text/latex": [ - "$3.6325749109061265\\ \\mathrm{centimeter}$" - ], - "text/plain": [ - "3.6325749109061265 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res.root * cm" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/filter_soln.ipynb b/soln/filter_soln.ipynb deleted file mode 100644 index d7fb0f44..00000000 --- a/soln/filter_soln.ipynb +++ /dev/null @@ -1,1774 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Low pass filter\n", - "\n", - "The following circuit diagram (from [Wikipedia](https://en.wikipedia.org/wiki/File:RC_Divider.svg)) shows a low-pass filter built with one resistor and one capacitor. \n", - "\n", - "![Low-pass filter circuit diagram](diagrams/RC_Divider.png)\n", - "\n", - "A \"filter\" is a circuit takes a signal, $V_{in}$, as input and produces a signal, $V_{out}$, as output. In this context, a \"signal\" is a voltage that changes over time.\n", - "\n", - "A filter is \"low-pass\" if it allows low-frequency signals to pass from $V_{in}$ to $V_{out}$ unchanged, but it reduces the amplitude of high-frequency signals.\n", - "\n", - "By applying the laws of circuit analysis, we can derive a differential equation that describes the behavior of this system. By solving the differential equation, we can predict the effect of this circuit on any input signal.\n", - "\n", - "Suppose we are given $V_{in}$ and $V_{out}$ at a particular instant in time. By Ohm's law, which is a simple model of the behavior of resistors, the instantaneous current through the resistor is:\n", - "\n", - "$ I_R = (V_{in} - V_{out}) / R $\n", - "\n", - "where $R$ is resistance in ohms.\n", - "\n", - "Assuming that no current flows through the output of the circuit, Kirchhoff's current law implies that the current through the capacitor is:\n", - "\n", - "$ I_C = I_R $\n", - "\n", - "According to a simple model of the behavior of capacitors, current through the capacitor causes a change in the voltage across the capacitor:\n", - "\n", - "$ I_C = C \\frac{d V_{out}}{dt} $\n", - "\n", - "where $C$ is capacitance in farads (F).\n", - "\n", - "Combining these equations yields a differential equation for $V_{out}$:\n", - "\n", - "$ \\frac{d }{dt} V_{out} = \\frac{V_{in} - V_{out}}{R C} $\n", - "\n", - "Follow the instructions blow to simulate the low-pass filter for input signals like this:\n", - "\n", - "$ V_{in}(t) = A \\cos (2 \\pi f t) $\n", - "\n", - "where $A$ is the amplitude of the input signal, say 5 V, and $f$ is the frequency of the signal in Hz." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Params and System objects\n", - "\n", - "Here's a `Params` object to contain the quantities we need. I've chosen values for `R1` and `C1` that might be typical for a circuit that works with audio signal." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ohm = UNITS.ohm\n", - "farad = UNITS.farad\n", - "volt = UNITS.volt\n", - "Hz = UNITS.Hz\n", - "second = UNITS.second" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R11000000.0 ohm
    C11e-09 farad
    A5 volt
    f1000 hertz
    \n", - "
    " - ], - "text/plain": [ - "R1 1000000.0 ohm\n", - "C1 1e-09 farad\n", - "A 5 volt\n", - "f 1000 hertz\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(\n", - " R1 = 1e6 * ohm,\n", - " C1 = 1e-9 * farad,\n", - " A = 5 * volt,\n", - " f = 1000 * Hz)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "* `omega` is the frequency of the input signal in radians/second.\n", - "\n", - "* `tau` is the time constant for this circuit, which is the time it takes to get from an initial startup phase to \n", - "\n", - "* `cutoff` is the cutoff frequency for this circuit (in Hz), which marks the transition from low frequency signals, which pass through the filter unchanged, to high frequency signals, which are attenuated.\n", - "\n", - "* `t_end` is chosen so we run the simulation for 4 cycles of the input signal." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " f, R1, C1 = params.f, params.R1, params.C1\n", - " \n", - " init = State(V_out = 0)\n", - " omega = 2 * np.pi * f\n", - " tau = R1 * C1\n", - " cutoff = 1 / R1 / C1 / 2 / np.pi\n", - " t_end = 4 / f\n", - " dt = t_end / 4000\n", - " \n", - " return System(params, init=init, t_end=t_end, dt=dt,\n", - " omega=omega, tau=tau, cutoff=cutoff.to(Hz))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R11000000.0 ohm
    C11e-09 farad
    A5 volt
    f1000 hertz
    initV_out 0\n", - "dtype: int64
    t_end0.004 / hertz
    dt1e-06 / hertz
    omega6283.185307179586 hertz
    tau0.001 farad * ohm
    cutoff159.15494309189532 hertz
    \n", - "
    " - ], - "text/plain": [ - "R1 1000000.0 ohm\n", - "C1 1e-09 farad\n", - "A 5 volt\n", - "f 1000 hertz\n", - "init V_out 0\n", - "dtype: int64\n", - "t_end 0.004 / hertz\n", - "dt 1e-06 / hertz\n", - "omega 6283.185307179586 hertz\n", - "tau 0.001 farad * ohm\n", - "cutoff 159.15494309189532 hertz\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a slope function that takes as an input a `State` object that contains `V_out`, and returns the derivative of `V_out`.\n", - "\n", - "Note: The ODE solver requires the return value from slope_func to be a sequence, even if there is only one element. The simplest way to do that is to return a list with a single element:\n", - "\n", - "```\n", - " return [dV_out_dt]\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: V_out\n", - " t: time\n", - " system: System object with A, omega, R1 and C1\n", - " \n", - " returns: dV_out/dt\n", - " \"\"\"\n", - " [V_out] = state\n", - " \n", - " R1, C1 = system.R1, system.C1\n", - " A, omega = system.A, system.omega\n", - " \n", - " V_in = A * np.cos(omega * t)\n", - " \n", - " V_R1 = V_in - V_out\n", - "\n", - " I_R1 = V_R1 / R1\n", - " I_C1 = I_R1\n", - "\n", - " dV_out_dt = I_C1 / C1\n", - "\n", - " return [dV_out_dt]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[5000.0 ]" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0*UNITS.s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation. I suggest using `t_eval=ts` to make sure we have enough data points to plot and analyze the results. " - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    V_out
    0.0000000
    0.0000010.004997467101366766 volt / farad / hertz / ohm
    0.0000020.00998974189353765 volt / farad / hertz / ohm
    0.0000030.014976632282572247 volt / farad / hertz / ohm
    0.0000040.01995794638210714 volt / farad / hertz / ohm
    \n", - "
    " - ], - "text/plain": [ - " V_out\n", - "0.000000 0\n", - "0.000001 0.004997467101366766 volt / farad / hertz / ohm\n", - "0.000002 0.00998974189353765 volt / farad / hertz / ohm\n", - "0.000003 0.014976632282572247 volt / farad / hertz / ohm\n", - "0.000004 0.01995794638210714 volt / farad / hertz / ohm" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function you can use to plot `V_out` as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_results(results):\n", - " xs = results.V_out.index\n", - " ys = results.V_out.values\n", - "\n", - " t_end = get_last_label(results)\n", - " if t_end < 10:\n", - " xs *= 1000\n", - " xlabel = 'Time (ms)'\n", - " else:\n", - " xlabel = 'Time (s)'\n", - " \n", - " plot(xs, ys)\n", - " decorate(xlabel=xlabel,\n", - " ylabel='$V_{out}$ (volt)',\n", - " legend=False)\n", - " \n", - "plot_results(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If things have gone according to plan, the amplitude of the output signal should be about 0.8 V.\n", - "\n", - "Also, you might notice that it takes a few cycles for the signal to get to the full amplitude. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping frequency\n", - "\n", - "Plot `V_out` looks like for a range of frequencies:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "fs = [1, 10, 100, 1000, 10000, 100000] * Hz\n", - "\n", - "for i, f in enumerate(fs):\n", - " system = make_system(Params(params, f=f))\n", - " results, details = run_ode_solver(system, slope_func)\n", - " subplot(3, 2, i+1)\n", - " plot_results(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At low frequencies, notice that there is an initial \"transient\" before the output gets to a steady-state sinusoidal output. The duration of this transient is a small multiple of the time constant, `tau`, which is 1 ms." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating the output ratio\n", - "\n", - "Let's compare the amplitudes of the input and output signals. Below the cutoff frequency, we expect them to be about the same. Above the cutoff, we expect the amplitude of the output signal to be smaller.\n", - "\n", - "We'll start with a signal at the cutoff frequency, `f=1000` Hz." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system = make_system(Params(params, f=1000*Hz))\n", - "results, details = run_ode_solver(system, slope_func)\n", - "V_out = results.V_out\n", - "plot_results(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function computes `V_in` as a `TimeSeries`:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_vin(results, system):\n", - " \"\"\"Computes V_in as a TimeSeries.\n", - " \n", - " results: TimeFrame with simulation results\n", - " system: System object with A and omega\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " A, omega = system.A, system.omega\n", - " \n", - " ts = results.index.values * UNITS.second\n", - " V_in = A * np.cos(omega * ts)\n", - " return TimeSeries(V_in, results.index, name='V_in')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the input and output look like. Notice that the output is not just smaller; it is also \"out of phase\"; that is, the peaks of the output are shifted to the right, relative to the peaks of the input." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "V_in = compute_vin(results, system)\n", - "\n", - "plot(V_out)\n", - "plot(V_in)\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='V (volt)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function estimates the amplitude of a signal by computing half the distance between the min and max." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def estimate_A(series):\n", - " \"\"\"Estimate amplitude.\n", - " \n", - " series: TimeSeries\n", - " \n", - " returns: amplitude in volts\n", - " \"\"\"\n", - " return (series.max() - series.min()) / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The amplitude of `V_in` should be near 5 (but not exact because we evaluated it at a finite number of points)." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.0 volt" - ], - "text/latex": [ - "$5.0\\ \\mathrm{volt}$" - ], - "text/plain": [ - "5.0 " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A_in = estimate_A(V_in)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The amplitude of `V_out` should be lower." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.8133731785983502 volt/(farad hertz ohm)" - ], - "text/latex": [ - "$0.8133731785983502\\ \\frac{\\mathrm{volt}}{\\left(\\mathrm{farad} \\cdot \\mathrm{hertz} \\cdot \\mathrm{ohm}\\right)}$" - ], - "text/plain": [ - "0.8133731785983502 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A_out = estimate_A(V_out)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the ratio between them." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16267463571967006 1/(farad hertz ohm)" - ], - "text/latex": [ - "$0.16267463571967006\\ \\frac{1}{\\left(\\mathrm{farad} \\cdot \\mathrm{hertz} \\cdot \\mathrm{ohm}\\right)}$" - ], - "text/plain": [ - "0.16267463571967006 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ratio = A_out / A_in" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16267463571967006 dimensionless" - ], - "text/latex": [ - "$0.16267463571967006\\ dimensionless$" - ], - "text/plain": [ - "0.16267463571967006 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ratio.to_base_units()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Encapsulate the code we have so far in a function that takes two TimeSeries objects and returns the ratio between their amplitudes." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def estimate_ratio(V1, V2):\n", - " \"\"\"Estimate the ratio of amplitudes.\n", - " \n", - " V1: TimeSeries\n", - " V2: TimeSeries\n", - " \n", - " returns: amplitude ratio\n", - " \"\"\"\n", - " a1 = estimate_A(V1)\n", - " a2 = estimate_A(V2)\n", - " return a1 / a2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And test your function." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.16267463571967006 1/(farad hertz ohm)" - ], - "text/latex": [ - "$0.16267463571967006\\ \\frac{1}{\\left(\\mathrm{farad} \\cdot \\mathrm{hertz} \\cdot \\mathrm{ohm}\\right)}$" - ], - "text/plain": [ - "0.16267463571967006 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "estimate_ratio(V_out, V_in)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating phase offset\n", - "\n", - "The delay between the peak of the input and the peak of the output is call a \"phase shift\" or \"phase offset\", usually measured in fractions of a cycle, degrees, or radians.\n", - "\n", - "To estimate the phase offset between two signals, we can use cross-correlation. Here's what the cross-correlation looks like between `V_out` and `V_in`:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "corr = correlate(V_out, V_in, mode='same')\n", - "corr = TimeSeries(corr, V_in.index)\n", - "plot(corr, color='C4')\n", - "decorate(xlabel='Lag (s)',\n", - " ylabel='Correlation')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The location of the peak in the cross correlation is the estimated shift between the two signals, in seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.00221799999999997 second" - ], - "text/latex": [ - "$0.00221799999999997\\ \\mathrm{second}$" - ], - "text/plain": [ - "0.00221799999999997 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "peak_time = corr.idxmax() * UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can express the phase offset as a multiple of the period of the input signal:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.001 1/hertz" - ], - "text/latex": [ - "$0.001\\ \\frac{1}{\\mathrm{hertz}}$" - ], - "text/plain": [ - "0.001 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "period = 1 / system.f" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.2179999999999698 dimensionless" - ], - "text/latex": [ - "$2.2179999999999698\\ dimensionless$" - ], - "text/plain": [ - "2.2179999999999698 " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(peak_time / period).to_reduced_units()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We don't care about whole period offsets, only the fractional part, which we can get using `modf`:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.21799999999996977 dimensionless" - ], - "text/latex": [ - "$0.21799999999996977\\ dimensionless$" - ], - "text/plain": [ - "0.21799999999996977 " - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frac, whole = np.modf(peak_time / period)\n", - "frac = frac.to_reduced_units()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we can convert from a fraction of a cycle to degrees:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "78.47999999998912 degree" - ], - "text/latex": [ - "$78.47999999998912\\ \\mathrm{degree}$" - ], - "text/plain": [ - "78.47999999998912 " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "frac * 360 * UNITS.degree" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Encapsulate this code in a function that takes two `TimeSeries` objects and a `System` object, and returns the phase offset in degrees.\n", - "\n", - "Note: by convention, if the output is shifted to the right, the phase offset is negative." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def estimate_offset(V1, V2, system):\n", - " \"\"\"Estimate phase offset.\n", - " \n", - " V1: TimeSeries\n", - " V2: TimeSeries\n", - " system: System object with f\n", - " \n", - " returns: amplitude ratio\n", - " \"\"\"\n", - " corr = correlate(V1, V2, mode='same')\n", - " corr = TimeSeries(corr, V1.index)\n", - " peak_time = corr.idxmax() * UNITS.second\n", - " period = 1 / system.f\n", - " frac, whole = np.modf(peak_time / period)\n", - " frac = frac.to_reduced_units()\n", - " return -frac * 360 * UNITS.degree" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-78.47999999998912 degree" - ], - "text/latex": [ - "$-78.47999999998912\\ \\mathrm{degree}$" - ], - "text/plain": [ - "-78.47999999998912 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "estimate_offset(V_out, V_in, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping frequency again\n", - "\n", - "**Exercise:** Write a function that takes as parameters an array of input frequencies and a `Params` object.\n", - "\n", - "For each input frequency it should run a simulation and use the results to estimate the output ratio (dimensionless) and phase offset (in degrees).\n", - "\n", - "It should return two `SweepSeries` objects, one for the ratios and one for the offsets." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_frequency(fs, params):\n", - " ratios = SweepSeries()\n", - " offsets = SweepSeries()\n", - "\n", - " for i, f in enumerate(fs):\n", - " system = make_system(Params(params, f=f))\n", - " results, details = run_ode_solver(system, slope_func)\n", - " V_out = results.V_out\n", - " V_in = compute_vin(results, system)\n", - " \n", - " f = magnitude(f)\n", - " ratios[f] = estimate_ratio(V_out, V_in)\n", - " offsets[f] = estimate_offset(V_out, V_in, system)\n", - " return ratios, offsets" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run your function with these frequencies." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}1.0 & 3.1622776601683795 & 10.0 & 31.622776601683793 & 100.0 & 316.22776601683796 & 1000.0 & 3162.2776601683795 & 10000.0\\end{pmatrix} hertz\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}1.0 & 3.1622776601683795 & 10.0 & 31.622776601683793 & 100.0 & 316.22776601683796 & 1000.0 & 3162.2776601683795 & 10000.0\\end{pmatrix}\\ \\mathrm{hertz}$" - ], - "text/plain": [ - "array([1.00000000e+00, 3.16227766e+00, 1.00000000e+01, 3.16227766e+01,\n", - " 1.00000000e+02, 3.16227766e+02, 1.00000000e+03, 3.16227766e+03,\n", - " 1.00000000e+04]) " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fs = 10 ** linspace(0, 4, 9) * Hz" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "ratios, offsets = sweep_frequency(fs, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot output ratios like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAEYCAYAAAD4czk4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deZxU1Zn/8U9VL0AD3Si7bO4P4MoiokElmolxi2YwmshPJVFjoomJYzbHidEkjFlM4kTH6IjGCYMxE/d9wSXjAgqKC9sDBmWTVUCarbvp7t8f91ZTXVTvVXWru7/v16tf3XXr3ltPldjfPueee06strYWERGRfBKPugAREZFUCicREck7CicREck7CicREck7hVEXkE1m1gU4BlgDVEdcjoiIQAEwEJjj7hUN7dShw4kgmF6JuggREdnLCcCrDT3Z0cNpDcCMGTMYMGBA1LWIiHR6a9euZfLkyRD+fm5IRw+naoABAwYwePDgqGsREZE9Gr3UogERIiKSdxROIiKSdxROIiKSdxROIiKSdyIdEGFm44An3L1fA88PBe4GxgPrge+4+1M5LFFEIrJ161bWr19PVVVV1KVICxUVFdGvXz9KS0tbfY5IwsnMYsAlwM1N7Ho/MAs4A5gAPGJmR7v7siyXKCIR2rp1K+vWrWPQoEF069aNWCwWdUnSTLW1tezcuZPVq1cDtDqgourWuxH4FvCLhnYws0OBscD17l7p7i8CjxGEWk6s3/4JW3Z+mquXE5HQ+vXrGTRoECUlJQqmdiYWi1FSUsKgQYNYv359q88TVTjd4e5jgLmN7DMSWOHu25O2LQaOyGploZqaGq55+mf84Nmp7KjcmYuXFJFQVVUV3bp1i7oMaYNu3bq1qUs2knBy94+bsVsPYEfKth1ASeYr2lssFmNw6UA+rShn8cYPcvGSIpJELab2ra3//fJ5tN52IPVPpxJgWy5ePBaLMaLvwQAs27wyFy8pIp3MypWZ+d1SXV3NmjWNzgbUIpmqqy3yOZwWAkPNLDmghofbc+KAfYYC8OHmFbl6SRHpJBYtWsR5552XkXP9y7/8C88++2xGzjVjxgx++ctf1j0eNWoU7p6Rc7dE3s6t5+5uZu8CU83sWuB44GzguFzVcMC+QwD4aMuqXL2kiHQSW7duzdgw+U2bNmXkPIlz1dbW1j2eN29exs7dEnnVcjKzyWaW3G03CRhBcI/TNOASd5+fq3r6lvQGYMvOT+v9xxIRSXj99deZNGkSo0eP5qyzzuKZZ56pe+7kk09m5syZdY9vvfVWrrjiCj755BMuu+wyysvLGTVqFOvWrePCCy/kN7/5DWeccQajRo3im9/8Jhs3bgTgoYce4uyzz673umbGokWLmDp1KnPnzuXmm2/mZz/72V71/fjHP+Z73/seJ598MqeeeipVVVU8++yzTJo0iXHjxnHMMcdw7bXX1m2/8847efnll/niF79Y73UA5s+fz4UXXsjYsWM59dRTmTFjRsY/z4RIW07u/jLQK+nxDGBG0uOVwGm5ryzQpbCYLgXFVFRXsmt3Bd2KukZVikindtP//Sfz1uTs71JGDTyca0+8ssn9li5dyuWXX86vfvUrPv/5zzNnzhyuuOIK+vbty5gxYxo8rnfv3tx1111ceeWVzJ27Z9DyQw89xN13383+++/Pj3/8Y370ox9x9913N1rDddddx+LFiznllFOYMmVK2n1mz57Nww8/TI8ePVi/fj0//OEPufvuuxk7dizLly/n/PPPZ+bMmZx22mksWbKERYsWcfvtt9c7x6ZNm5gyZQpXXnkl99xzD0uWLOHyyy+nrKyMM888s8nPqqXyquWUj3p26QFAeUVOxmGISDvy5JNPcuyxx3L66adTWFjIcccdx1lnncXDDz/cqvNNnjyZkSNHUlJSwjXXXMNrr73G5s2b21znuHHjGDhwID179qRv37488cQTjB07lvLycjZt2sQ+++zT5D1JL7zwAn379uVrX/saRUVFHHbYYVx00UU8+OCDba4vnby95pQvSrv0YOOOTWyt2Ea/Hn2iLkekU2pOKyYKmzZtYr/99qu3bfDgwbzxxhutOt/QoUPrfh4wYAC1tbUZuZ7Ur9+eGeKKiop48MEHeeCBB+jatSsjR46koqKiyUsX6d7roEGDMjpKMJnCqQmJltNWtZxEJMXAgQPrdctBMAy7T5/gD9l4PE5lZWXdc1u2bGn0fOvWrav7efXq1RQUFNC3b1/i8Xi9wRMtbU0l33P05JNP8vjjj/Pggw/Sv39/gLrrS40ZOHAgH39c/xbV5PeaaerWa0JpXTiVR1yJiOSb008/nblz5/LUU09RXV3NrFmzePzxxznrrLMA2H///Xn66afZuXMnS5YsqTfcu7i4mMrKSioqKuq23XfffXz44Yds27aN3/72t5xyyimUlpZywAEHsHz5cubOnUtlZSV33nlnvcApLi5m27bm/QFdXl5OQUEBxcXFVFVVMX36dNy9LvyKi4spL9/7991JJ53E5s2buffee6mqqmLhwoVMnz697r1mmsKpCXuuOW1vYk8R6WyGDRvG7bffzrRp0xg7diw33ngjN954IxMmTADgRz/6ERs2bOD444/n+uuvZ9KkSXXHmhkjRozg2GOPrbuPaPTo0Vx11VWcdNJJdO3alalTpwJw1FFHcdlll/Hd736XiRMnUlZWVq+L7ayzzuKee+7hmmuuabLmL33pS4wcOZLPfe5znHjiicyePZszzzyTpUuXAjBx4kSWL1/OSSedVO+4srIypk2bxsyZMxk/fjzf/va3ufTSSzn//PPb9iE2INaRh0ib2f7Ahy+88AKDBw9u1TkeWvg097//GOeMOJULjjwno/WJSHqLFi1ixIgRUZeRUxdeeGGjI+7ao3T/HVetWsUpp5wCcIC7f9TQsWo5NaGuW2+XuvVERHJF4dSE0i49AdhaqW49EZFc0Wi9JvTs0h2AcrWcRCSLpk+fHnUJeUUtpybUDSWv1FByEZFcUTg1oa5bT/c5ieRURx6s1Rm09b+fwqkJPYpKiBFje+UOqmuqoy5HpFMoKipi506tQN2e7dy5k6KiolYfr3BqQjwep0fiupMGRYjkRL9+/Vi9ejU7duxQC6qdqa2tZceOHaxevbretEktpQERzVBa3IPyim2UV2yjV9fSqMsR6fBKS4P/zz7++OOMrXkkuVNUVET//v3r/ju2hsKpGUq79mB1ua47ieRSaWlpm365Sfumbr1m6FmsZTNERHJJ4dQMmvxVRCS3FE7NsGfZDA2IEBHJBYVTM6jlJCKSWwqnZtBS7SIiuaVwagbNEiEiklsKp2YoTdyEq3ASEckJhVMzJFpOWg1XRCQ3FE7N0DNpQISmUhERyT6FUzN0KSymuKCIqprdVOyuiLocEZEOT+HUTImuvU81nFxEJOsUTs1UphF7IiI5o3BqptKuYctJy7WLiGSdwqmZyurCaWvElYiIdHwKp2Yq0zUnEZGcUTg1U6LltFXdeiIiWadwaqayLsGiZ1vUchIRybpIVsI1s6OAO4AjgWXA1919Tpr9DPgjMBooB+5w96m5rDVBLScRkdzJecvJzIqBR4G/Ar2AqcBzZpZuPeYZwExgX+Bk4Coz+2Kuak2m+5xERHInim69iUCRu9/i7lXufj+wADg/zb4Wfo8BteHXrpxUmUItJxGR3IkinEYCi1K2LQaOSLPvz4EbgQpgKXCfuz+X3fLSq1twsHIbNTU1UZQgItJpRBFOPYAdKdt2ACVp9q0FrgmPORr4ZzO7JLvlpVcQL6BncXdqa2spr9QsESIi2RTFgIjtQLeUbSVAvd/4ZjYWuNrd9ws3vWtmvwauAO7OepVplHbtSXnldj7dVU5Z13SXyEREJBOiaDktZM+1pITh4fZkQ4BiM4slbdsNVGWxtkb1CgNJgyJERLIripbTS0DMzK4GbgMmEQwpfzhlv9eAAuBGM/sZcADwfeA/c1hrPXUj9jQoQkQkq3LecnL3SuA0glDaBFwHnOPuG8xsspltC/dbH+73WWAj8BzwJ+DWXNecsGdmcoWTiEg2RXITrrvPByak2T6D4N6mxOPZwAk5LK1RieHkWzT5q4hIVmn6ohbQvU4iIrmhcGoBzRIhIpIbCqcWqButp5aTiEhWKZxaoG41XLWcRESySuHUAnWj9dRyEhHJKoVTC3Qt7EJRQREV1ZXsqopk/lkRkU5B4dQCsViMXhoUISKSdQqnFqq77qSuPRGRrFE4tZBmiRARyT6FUwslZiPfopaTiEjWKJxaqG6WCLWcRESyRuHUQpqZXEQk+xROLdSrbkCEJn8VEckWhVMLaX49EZHsUzi1kGYmFxHJPoVTC9WN1lPLSUQkaxROLdSzuDsxYmyr2E51TXXU5YiIdEgKpxYqiBfQo0t3aqmlvHJ71OWIiHRICqdWKOuiEXsiItmkcGqFMs2vJyKSVQqnVtD8eiIi2aVwagXNTC4ikl0Kp1boFQ4n1424IiLZoXBqBc2vJyKSXQqnVqgbEKGWk4hIViicWkFDyUVEskvh1AqaX09EJLsUTq1QljQzeW1tbcTViIh0PAqnVuha1JUuBcVUVlexa3dF1OWIiHQ4CqdWKtWgCBGRrFE4tVLdLBG67iQiknEKp1ZKDIrYohF7IiIZV9jaA83sDOAi4BPgfeA94D13b7IpYWZHAXcARwLLgK+7+5w0+/UEbgW+CNQCDwDfdveq1tadKZpfT0Qke9rScpoG3As8DewLXAW80dRBZlYMPAr8FegFTAWeM7PSNLvfE+6zPzACGAv8oA01Z4zm1xMRyZ5Wt5yAJe7+dPjz4y04biJQ5O63hI/vN7NvA+cDdyV2MrOBwNnAIHffCmw1s7OBgjbUnDHJw8lFRCSz2tJy+ruZfd/MYi08biSwKGXbYuCIlG2jgBXAZDNbZmYrgSuB1a2qNsPKEpO/quUkIpJxbWk5DScIlGvMbB7wLsE1p780cVwPYEfKth1AScq2fQm68w4nuDbVj6CFVg78exvqzoi6WSLUchIRybhWt5zc/Tx3H0EQIP9G0PoZ04xDtwPdUraVANtStlUQdOFd4+7b3H0Z8Dvgn1tbcyaVaWZyEZGsaXHLycx+5u7Xm9mJBC2lLcDb4VdzLASuTtk2HPhzyrbF4fdewKetrTdb9izVrqHkIiKZ1ppf9k+E378FHGFm3QiuISWGkt/fxPEvATEzuxq4DZhE0G33cPJO7v6+mc0Ffm9mFwJ9CELtLvJAz+IexIhRXrmd6ppqCuJ5MU5DRKRDaLJbz8wuTn7s7m+G37/q7ocTDPH+CeAEQ70b5e6VwGkEobQJuA44x903mNlkM0vu3jsd2EVwL9RcgiHot5AH4vE4Pbt0B6C8IrVHUkRE2qI5Lae7zOwS4Ap3n5/6ZBg288KvZgnPMyHN9hnAjKTHG4ALmnveXCvrWsrWim1s2VVOr25lUZcjItJhNGdAxGigGnjbzH5rZj2yXFO7oVkiRESyo8lwcvf57v5ZgqmKvgwsNrPzsl5ZO6BZIkREsqPZQ8nDgQ7DgenAn83seTM7NGuVtQO96maJ0Ig9EZFMatF9Tu6+w92vJbj5tgp4z8ymhiP2Oh21nEREsqNVN+G6+1J3P52gm++rBPcudTqaX09EJDtadJ+TmR1AcE/SEUnfhwItnV+vQyhTy0lEJCuaDCczS6y7dDjQPdz8IfAOcB/BnHrvZqvAfJaY/FWr4YqIZFZzWk5HEwTRdPZM7qq7TlG3nohItjQZTu4+PheFtEd1AyIqyqmtrSUW65S9myIiGdecbr0HgIeAJ93906b270y6FnahS2EXKnZXsHP3LkqKOuWgRRGRjGvOaL0FwI+A9Wb2rJl9M1ylVoCyLsGEGbruJCKSOc2ZIeKn7n4UwQq2zwMXAsvN7HUz+4GZHZztIvOZrjuJiGRes4eSu/s/gJuBm81sAHAOwcJ/U83MCZa8uDdcFLDT0HLtIiKZ19qbcNcCL7r75wmWT/81wVDzvFilNpc0S4SISOa1ZWXZ+4HR4Uq404HpZnZSZspqP9StJyKSea1Zpv0rBIsKlprZEcBid68Kn76V4IbdTkPLtYuIZF5rWk5/J+gOnELQnTfCzLYCHwM7Mlda+1DWVS0nEZFMa3E4ufsa4D4z+8jdXwcws32BA4DFGa4v79UtOKhrTiIiGdOWa07TzOx94H3gPeB9d9+embLaD43WExHJvFaN1gsdB9wGbAHOBd41szUZqaod0YAIEZHMa3XLKZzK6JXwi/Bm3AsyVFe70aO4O7FYjG2V29ldU01hvCDqkkRE2r1Wt5zM7MDkx+7+AXBYmytqZ+LxOKXFwRRG5RWarF1EJBPacs1phpkNJVjb6T1gF2AZqaqd6dWtjE8ryllTvp59upVFXY6ISLvX6paTux/n7oMIhpQ/TzBB7OkZqqtdObL/cABeXzk34kpERDqGtrScgLruvA8yUEu7dcKwcTzuM5m18m2mjDpP151ERNqo1eFkZv2Ba4G+wELgnvAeqE5nWK/BDC4dyKqta3hv7UJG73dE1CWJiLRrbRlK/hdgGfAngpkhZprZZzJSVTsTi8WYMOwYAF5Z/mbE1YiItH9tCad+7v4Hd5/p7r8nuN70+wzV1e5MGDYOgDmr32Vn1a6IqxERad/aEk4bzGx84oG7Lwc67Trl/br3Znifg6isrmLO6nejLkdEpF1rMpzM7OIGnvoGwRRGd5nZVWZ2B7Ako9W1M4nWk7r2RETapjktp7vM7P/M7PDkje6+FBgFPA2UAm8AX818ie3HcUNGUxCL8966RWzREhoiIq3WnNF6ownWaXrbzG4Ffuru2wDCdZweCr86vZ5denD0wMN46+P3eX3FXE4/9OSoSxIRaZeabDm5+3x3/yxwEfBlYLGZndeWFzWzo8xslpltN7P3zeyYJvYvMrO3zOyGtrxuLpwQdu29unxOxJWIiLRfzR4Q4e73A8MJlmT/s5k9b2aHtvQFzawYeBT4K9ALmAo8Z2aljRz2C+Dolr5WFMbsdyRdC7vwwaaPWFO+PupyRETapRaN1nP3He5+LXAEUAW8Z2ZTzawlo/QmAkXufou7V4WhtwA4P93OZjYR+Cfg2ZbUGpUuhcWMGxzk6KsaGCEi0iqtGkru7kvd/XSCbr6vEswQ0VwjgUUp2xYTBF49ZrYPcBdBl2Jla2qNQnLXXm1tbcTViIi0Py2avsjMDgCOJAiSxPehQKwFp+lBMKNEsh1ASZp97wBud/f5Zu1nwvPD+xm9upayZtt6/rFpOQf33j/qkkRE2pUmwym8f+lI4HCge7j5Q+Ad4D7g3fCrubaz9826JUC9xZDMbArQB7ilBefOCwXxAo4fOpanlrzIK8vfVDiJiLRQc1pORxME0XSCEHovMZS8lRYCV6dsGw78OWXbV4FxwOaw1dQd+IKZjXX3M9vw+jlxwrBxPLXkRV5fMZeLjp5EgWYqFxFptibDyd3HN7VPC70ExMzsauA2YBJBy+zhlNc9NfmxmT0CvOPuN2S4nqw4cJ+hDOzZjzXl63l/nXP0wJFRlyQi0m60ZW69VnH3SuA0glDaBFwHnOPuG8xsspl1iLXOY7FY0sAIjdoTEWmJNi822BruPh+YkGb7DGBGA8eck+26Mm3C0GP43/lP8Obqd6jYXUmXwuKoSxIRaRdy3nLqTAb07Mch++7Prt0VzP1YM5WLiDSXwinLTtj/WABe+UhdeyIizaVwyrLjhowmHovz7tqFbK3oEJfTRESyTuGUZWVdSzlqwAiqa2uYteKtqMsREWkXFE45MGGoRu2JiLSEwikHjhl0JF0KivFPlrF+28aoyxERyXsKpxzoWtSVYwYdBcCrK7TOk4hIUxROOTIhvCH3leVvaqZyEZEmKJxy5MgBIyjt0oPVW9fy0ZZVUZcjIpLXFE45Uhgv4PghYwF45aM3Iq5GRCS/KZxyaMKwYwB4bcVcampqIq5GRCR/KZxy6JDeB9C/R1827/qUBRuWRF2OiEjeUjjlUCwWY8LQoPX0iu55EhFpkMIpx04Iu/beWDWPyuqqiKsREclPCqcc2690AAfuM5SdVbt4++P3oy5HRCQvKZwicELSPU8iIrI3hVMEPjN0LLFYjLfXzGdbxfaoyxERyTsKpwj06lbGEf2GU11TzexVb0ddjohI3lE4RSRxz9MryzXXnohIKoVTRMYNPpqigiIWbVjKxu2boi5HRCSvKJwiUlLUjbH7HQlopnIRkVQKpwgl7nl6VV17IiL1KJwidPSAw+hR3J0Vn65mxZbVUZcjIpI3FE4RKiwo5LghowHd8yQikkzhFLHEDbmvrphDTa1mKhcRAYVT5A7tcyB9S/blkx2bWbzhg6jLERHJCwqniMVjcT6je55EROpROOWBRNfe7JVvUaWZykVEFE75YEjZfgzrNZjtVTuZt2ZB1OWIiERO4ZQndM+TiMgeCqc88ZmhxxAjxlsfv8eOyp1RlyMiEimFU57oXbIPI/sdQlXNbmavmhd1OSIikSqM4kXN7CjgDuBIYBnwdXffqz/LzMYAvw/32wpMA37u7rU5LDdnThg2jgXrl/Dq8jc5+cDjoy5HRCQyOW85mVkx8CjwV6AXMBV4zsxKU/YrAZ4E/hfoDZwCTAEuy2W9uXTs4FEUxgtZsH4Jm3ZsibocEZHIRNGtNxEocvdb3L3K3e8HFgDnp+w3BJjl7re5e7W7LwUeASbkttzc6V5cwuj9DqeWWl5bMTfqckREIhNFOI0EFqVsWwwckbzBA19KPA5bXKcBHfqCTN10RpprT0Q6sSjCqQewI2XbDqCkoQPMrAvwl3C/O7JXWvRGDTyckqJufLhlJau2rom6HBGRSEQRTtuBbinbSoBt6XY2swHAi0A/4HPu3qHHWRcXFDE+nKlcrScR6ayiCKeFgKVsGx5ur8fMRgJzgA8Igmlz9suLXqJr75Xlc6it7ZADE0VEGhXFUPKXgJiZXQ3cBkwiGCr+cPJOZrYP8Bxwv7t/P+dVRmhE34Pp3W0fNmz/BN+4jOF9D4q6JBGRnMp5y8ndKwkGNkwCNgHXAee4+wYzm2xmie69C4FBwLfMbFvS119yXXOuBTOVjwXUtScinVMkN+G6+3zSDAl39xnAjPDnPwB/yHFpeWPC0HE8tvh5Zq18iymjz6MwXhB1SSIiOaPpi/LUsF6DGFI6kPLK7Ux/50FWfaqReyLSeUTScpKmxWIxTj1kItPe+gtPL32Jp5e+xJDSgYwfMprjhoxhcNnAqEsUEckahVMe+/zBJ9K/Rx9eX/EWb65+h5Vb17BywZP8bcGTDK4LqtEMKdsv6lJFRDJK4ZTnjhowkqMGjOSymguYv24xs1a+zZur32HV1jU8sOBJHljwJINKB3Bc2KJSUIlIR6BwaicK4wUcPfAwjh54WBhUzuyVb/Hm6ndZvXUtDyx4igcWPFUXVOMHBy2qWCwWdekiIi2mcGqHgqAaydEDR3JpzQUsWO/MWpEmqHoOqNf1p6ASkfZC4dTOFcYL6rr+6oJq5dvMWfUOq8vX8uDCp3hw4VPs17M/44eM5viw609BJSL5TOHUgdQLqjFfZeH6JcE1qlXz+Lh8HQ8tfJqHFj5dF1THDRnN0LJBCioRyTsKpw6qMF7AkQNGcOSAEVw65issSATV6nfqBdXAnv3Ca1RjGNZLQSUi+UHh1AkUpAmq2Svf5o3V77CmfD0PLXyGhxY+w8Ae/eruo1JQiUiUFE6dTHJQXTLmKyzcsLSu62/NtvU8vOgZHl6UHFSjGdZrsIJKRHJK4dSJFcQLOKL/cI7oP5xLRp/Pog1LeT1NUA3o0beuRbW/gkpEckDhJEAQVIf3H87hSUEVtKjeYe22DTyy6FkeWfSsgkpEckLhJHupH1RB19/slW/zxqp59YKqf4++dTf8HrDPEAWViGSMwkkaFY/HOby/cXh/4+ujz2fRxg+YteIt3lj9DuuSg6p7n7prVAfsM1RBJSJtonCSZovH4xzW71AO63fonqBa+RZvrHqHdds38uji53h08XP0796HY4eM5ngFlYi0ksJJWqVeUI06n8UbP2BW2PW3bvtGHlv8HI8tfo5+3XszfsgYjhsymgMVVCLSTAonabN4PM7Ifocyst+hfG3UeSze+I+wRTWP9ds/SQmq4BrVQfsOU1CJSIMUTpJRQVAdwsh+h9QFVWIwRRBUz/PY4ufp27034weP4rghYxRUIrIXhZNkTXJQTRn9ZXzjP4Kuv5Xz2LD9Ex73mTzuMxVUIrIXhZPkRDwWZ0TfQxjR9xCmjPoySzYu4/Ww669eUJXsy7HhqL+D991fQSXSSSmcJOfisTjD+x7M8L4H1wXVrJVvM3vV22zYsYknfCZP+Ez6lOwbtKiGjlFQiXQyCieJVHJQXTzqXJZs/JDZK99i9qp5bNyxiSeWvMATS16oC6rxQ0ZzSO8DFFQiHZzCSfJGEFQHMbzvQVw06lyWfvIhs1bsHVS9S/Zh/ODRjOh7MMUFxRQXFFFcUERRQSHFBcV134vjhRQVFFEQL4j6rYlICymcJC/FY3Gsz0FYn6SgCgdTfLJjM08ueYEnl7zQrHMVxOIUFRRRFIZYcTwRZnu2JT+3V8gVFFIUT9kv+dh4mm0FRRTFC9XCE2klhZPkvXpBdfQkPvjkI2avfJu12zZQVVNFZXXwVVW9m8rqyrrvlTXB9+raGqp3V7Brd0XOay8qKKI4vifs6ofg3oFWHC+iuLAoJQzrh2XwXPpzJo5Ra1HaO4WTtCvxWJxD+xzIoX0ObPYxu2uqqaqu2hNcNVVU7q6qC7aq6uSAq6oXeHXbUgKvqnp33XF1x9dU1dtWVbM7PLaK7VU7s/ip7C0ei6dpEaYLwzQhl9Qi3GtbSktxTws0EZxqLUpmKJykwyuMF1AYL6BbUdecvm5NbQ27E2GYGnKJVl7N7nrhWBd8NfXDsd73mqo9xyd/r9lzjpraGnZF3Frcq0WY2u2Z3OIrTIThnq7UutCMF+3pXk3bDRv8rNZix6JwEsmSeCxOcWExxRTn/LUTrcWGWnWVyUG3u6rJ7tF6LcKkc6ZuS24tEmVrMU0YBuFWvHdwplw7bPq6YlI3axiOai1mnsJJpAPKh4H2f8MAAAxqSURBVNbiXiGX1CJM7Urd0yJM01qs2U1V4vhGulIjbS3GC9O3CJs98CYpBAtTw7DhFmhHbi0qnEQkY6JsLVbXVCcFWrou0URXapru1URw7m6gRdhIC7SqZnfdVxStxfRh2PBI05a1FhsezJPt1qLCSUQ6hIJ4Ad2iai3WVO81UCa563SvbXu1FBvvSm0odGtqa6jYXUFFjluLB++7P7/43A+Ix+JZe41IwsnMjgLuAI4ElgFfd/c5afYbCtwNjAfWA99x96dyWauISGOCa13B9a5cq64biVrVRFdqyraUa457jzRN14rcE5xFBdmPjpyHk5kVA48CtwAnApOA58xsmLtvTdn9fmAWcAYwAXjEzI5292W5rFlEJB8VxAsoiBfQNcetxVzIXpusYROBIne/xd2r3P1+YAFwfvJOZnYoMBa43t0r3f1F4DHgklwXLCIiuRVFOI0EFqVsWwwckWa/Fe6+vYn9RESkg4kinHoAO1K27QBKWrmfiIh0MFGE03agW8q2EmBbK/cTEZEOJopwWghYyrbh4fbU/YaaWbcm9hMRkQ4miqHkLwExM7sauI1gtN6RwMPJO7m7m9m7wFQzuxY4HjgbOC7H9YqISI7lvOXk7pXAaQShtAm4DjjH3TeY2WQzS+62mwSMILjHaRpwibvPz3XNIiKSW5HchBsGzIQ022cAM5IeryQIstYqAFi7dm0bTiEiIpmS9Pu40YkBO/r0RQMBJk+eHHUdIiJS30DgHw092dHDaQ5wArAGqI64FhERCVpMAwl+PzcoVltbm5tyREREmimKoeQiIiKNUjiJiEjeUTiJiEjeUTiJiEjeUTiJiEjeUTiJiEjeUTiJiEjeUTiJiEje6egzRLSamR0F3EEwY/oy4Ovu3ugdze2Bmf0T8EvgEIIJdX/j7neaWTHBLPHnEsym8Tt3vynpuPOAfye4s/vvwBR3Xx8+NxS4GxgfnvM77v5U7t5V65hZL+A94Hp3v7czfQZmNhD4I/BZYBfwX+7+k870GQCY2XjgDwTL+GwAfunu0zrD52Bm44An3L1f+Dgr79nMYsDPgW8AxcCfgB+4++7G6lPLKY3wP9KjwF+BXsBU4DkzK420sDYysyHAg8AvCN7XV4GbzOxU4EaC/0EPAo4BLjazi8LjRhL8w5sC9AaWAvcnnfp+gl/yvYHLgPvN7MAcvKW2ugMYlPS4M30GjxJM69Wf4BfKxWZ2AZ3oMzCzOMHn8Ad3LyP4/+G28A/TDvs5mFnMzC4FniMIi4RsvedvAP8MjCb4o/gY4F+bqlMtp/QmAkXufkv4+H4z+zZwPnBXZFW13f7Afe6eWDtrjpm9DHwGuJjgL6HNwGYzuxm4HPgz8P+Ax939VYBwfa3NZnYIEAPGAv8ULofyopk9BlxCsBxKXjKzi4FS4P2kzZ3iMzCzY4EDgc+4exXwoZlNBHYCN9MJPoPQPkA/gvXlYkAtsBuopGP/W7gROIPgj9R/S9qerfd8MXCLu68Kj70B+G/gZ40VqZZTeiOBRSnbFgNHRFBLxrj7K+7+zcRjM9uXYGLceQRN9eRVhpPf78jk59x9B7AyfH4ksMLdtzdwbN4xswOAnwJfT9rWi87zGYwhCOUbzGy1mf0D+BJBOHWWzwB3/4SgG+u/gSqCiUj/laBF2ZE/hzvcfQwwN7Ehy//+6x0bPrdf+PunQWo5pdcD2JGybQdQEkEtWWFmZcBjwBvAW+Hm5Pec/H6b+jzazWdlZgXA/wDfd/e1ZpZ4qkf4vcN/BkDij5K/E7SghgPPEFxzgc7xGSS69XYBFxB0dx8PPARsCXfpkJ+Du3+cZnM2//2nHpv4uYRgwdm0FE7pbQe6pWwrAbal2bfdMbNDCfraFwKT2fNek99z8vtt7POINfJcPvoJ4O7+UMr2xF99neEzqAC2uvsN4eN3zWwaQfcLdI7PAILrIJ9x9x+Ej/9uZnfT+T4HyO6//9RjE6HV6Geibr30FhJcGEw2nPpN03bJzE4kaC09Apzr7rvCPua11H/Pye+33udhZiXA0HD7QmComXVr4Nh88xXgXDPbYmZbCLoebicY9NJZPoPFQEk48CehEOhM/w4AhgBdUrbtJmhBdqbPgSz/Dkj9fTocWOPuW2iEWk7pvURwkfRqgj7pSQRDyh9u9Kg8Z2YHAU8A17n7rSlPTwd+ambvETTDvw/8R/jcfcCr4UXzWcBNwDx3XxKe911ganiR9HjgbOC4LL+dVnH34cmPzewdgou195rZNjrBZwA8T/AL+Ldmdg3BL45LgG8R3DbRGT4DCEar3WRm3yAY6DSaYKTZpcAKOs/nkJCt3wHTge+b2QsEragbwm2NUsspjXDEyWkEobSJYMTJOe6+odED89+VQE+C/yG3JX39CrgemA8sILgw/CDBUGvc/X2CwQN3ABuBw4AvJ513EjCC4P6GacAl7j4/N28pozrFZ+Duu4CTCK43rSG43vRrd3+QTvIZALj7AoKuvcsJrjPdB/zY3R+lE30OSbL1nu8A/ga8TjAEfWH4Wo3SSrgiIpJ31HISEZG8o3ASEZG8o3ASEZG8o3ASEZG8o3ASEZG8o3ASEZG8o5twpdMws4+AYQ08XdTU+jKdgZmNJbjn6WQzmwLc7O590ux3L9DD3c9t4nxxYDZwobt7FkqWDkotJ+ls/pVg9uV6Xwqmuklx/4sMLu3g7jUESyPckalzSueglpN0NuXuvjbqIvLUOUCNu8/K5End/Qkz+w8zm+juL2fy3NJxKZxEQuEiaMcS9CiMB65y9/82s+8D3yFY5fMdguU2ZofHFBLMMzaFYHbm3xBM63JbOF/fy8Bcd/9+0uvUAme5+xPh48bOfy/BEgPdCJbP/gSY5u6/CJ8vIGgNXkawFMYc4NsE026tBE519xeSXvsDYKq7/ynNR/AdgiUjWvq53cuembyT3eDuN4Y/Pwx8F3i5peeXzkndeiL1fQH4P4JwesrMLif4pXoFMAp4imClzwPC/W8ALgq/Pgd8ETi8uS/WjPNDMBHpKoLVRqcBPzezMeFz1wNXAd8Lj18JPEkwx9mLBEuPJ15rPMGy9HsFkJmVAhMI5tlrqe9Sv5v0dwQTy96TtM8zwOfCMBdpkv6hSGfzWzP7Zcq2M5O6m3YCN4XXSjCzfyWYDPTJ8Pl/D2dmvtLMfgB8A/i5uz8d7j8Z+KAF9TR4foJZoQH+4e4/CX/+RThb/hgze5tgJvFfJNanMrMrCQJzH4JFFW8xs2+Fy7FfADzh7p+mqWMUwR+rqUs79A5na0/VhWBNMMLzfRq+/hcIWm6nuvvKpP0XEsx0PZxgclGRRimcpLO5ieCXdrLVST9/mBRMPQjWrLnLzO5M2qcLwYJ9fcOvxErCuPtHZpb8S7lBzTh/wtKUQ8uBIqBP+Ppzkl6/HLgmPP9DwB+BU83saeA84JsNlNMf2B7OWJ5sMzAuzf6/SvN+DgH+QhC2L6c8/Un4vV8Dry9Sj8JJOpuN7t5Yy2Zn0s8F4feLgXlp9ktdmjohOVjqTfuf0q3V1PkTKtO8Rixpe9qlBdx9m5k9Apwf1tSFoNswnZrwnHttT/d5mVk5e5b2xsx6Eixg+bS7/z7NeRKXEKobeH2RenTNSaQBYXfVWmCQu3+Q+GJPt9U2YDlJC8mZWW9g/6TTVAJlSY8PbO75m1nfeoJF8hKv383M1pnZseGm/wFOJxiJ97dwrbJ01gLdU1YzbRYziwF/JlhF9tIGduub9DoiTVLLSaRxvwauN7M1BN1nFxCEx0nh8zcRLN64DHCC7q7kpb/nAN81sz8TXJf5HfVbVk2dvym/B34S3mC8hOAepU/Z0xJ7DqgiWCjuC42c571wv6MIbpptievDek8BeoaDKwAq3X1T+PNRBF2ELbkeJ52Ywkmkcf9BMIz71wTXZZYA57r7awDufmfYWvoj0JVgKHnykty/JVgh9FmCFUSvp37LqtHzN8NvCFY3nhZ+fw04I9FCcvdqM/tf4EsEoxDTcvetZvYqQci0NJy+RjAA4+2U7X8HJoY/nwg84+7q1pNm0Uq4IhlmZhsJ7lW6N+paAMzsb8AH7n5tE/t9GfiJux+Z4dePE3R/XuDur2Ty3NJx6ZqTSAdlZieZ2feAM4C7mnHIg0DMzE7IcClnA8sUTNISCieRjusrBPPa/dDdlzW1cziE/lLg55kqIGw1XUfDQ9hF0lK3noiI5B21nEREJO8onEREJO8onEREJO8onEREJO8onEREJO/8f2vhJ6fRg0PfAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(ratios, color='C2', label='output ratio')\n", - "decorate(xlabel='Frequency (Hz)',\n", - " ylabel='$V_{out} / V_{in}$')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But it is useful and conventional to plot ratios on a log-log scale. The vertical gray line shows the cutoff frequency." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_ratios(ratios, system):\n", - " \"\"\"Plot output ratios.\n", - " \"\"\"\n", - " # axvline can't handle a Quantity with units\n", - " cutoff = magnitude(system.cutoff)\n", - " plt.axvline(cutoff, color='gray', alpha=0.4)\n", - " \n", - " plot(ratios, color='C2', label='output ratio')\n", - " decorate(xlabel='Frequency (Hz)',\n", - " ylabel='$V_{out} / V_{in}$',\n", - " xscale='log', yscale='log')" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_ratios(ratios, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This plot shows the cutoff behavior more clearly. Below the cutoff, the output ratio is close to 1. Above the cutoff, it drops off linearly, on a log scale, which indicates that output ratios for high frequencies are practically 0.\n", - "\n", - "Here's the plot for phase offset, on a log-x scale:" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_offsets(offsets, system):\n", - " \"\"\"Plot phase offsets.\n", - " \"\"\"\n", - " # axvline can't handle a Quantity with units\n", - " cutoff = magnitude(system.cutoff)\n", - " plt.axvline(cutoff, color='gray', alpha=0.4)\n", - " \n", - " plot(offsets, color='C9')\n", - " decorate(xlabel='Frequency (Hz)',\n", - " ylabel='Phase offset (degree)',\n", - " xscale='log')" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_offsets(offsets, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For low frequencies, the phase offset is near 0. For high frequencies, it approaches 90 degrees." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis\n", - "\n", - "By analysis we can show that the output ratio for this signal is\n", - "\n", - "$A = \\frac{1}{\\sqrt{1 + (R C \\omega)^2}}$ \n", - "\n", - "where $\\omega = 2 \\pi f$, and the phase offset is\n", - "\n", - "$ \\phi = \\arctan (- R C \\omega)$ \n", - "\n", - "**Exercise:** Write functions that take an array of input frequencies and returns $A(f)$ and $\\phi(f)$ as `SweepSeries` objects. Plot these objects and compare them with the results from the previous section.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def output_ratios(fs, system):\n", - " R1, C1, omega = system.R1, system.C1, system.omega\n", - " \n", - " omegas = 2 * np.pi * fs\n", - " rco = R1 * C1 * omegas\n", - " A = 1 / np.sqrt(1 + rco**2)\n", - " return SweepSeries(A, magnitude(fs))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function:" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    1.0000000.9999802613756332 dimensionless
    3.1622780.9998026663382117 dimensionless
    10.0000000.9980319045036448 dimensionless
    31.6227770.9808266593818514 dimensionless
    100.0000000.8467330159648304 dimensionless
    316.2277660.4495645925385784 dimensionless
    1000.0000000.15717672547758985 dimensionless
    3162.2776600.050265590254250286 dimensionless
    10000.0000000.015913478971147695 dimensionless
    \n", - "
    " - ], - "text/plain": [ - "1.000000 0.9999802613756332 dimensionless\n", - "3.162278 0.9998026663382117 dimensionless\n", - "10.000000 0.9980319045036448 dimensionless\n", - "31.622777 0.9808266593818514 dimensionless\n", - "100.000000 0.8467330159648304 dimensionless\n", - "316.227766 0.4495645925385784 dimensionless\n", - "1000.000000 0.15717672547758985 dimensionless\n", - "3162.277660 0.050265590254250286 dimensionless\n", - "10000.000000 0.015913478971147695 dimensionless\n", - "dtype: object" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "A = output_ratios(fs, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def phase_offsets(fs, system):\n", - " R1, C1, omega = system.R1, system.C1, system.omega\n", - "\n", - " omegas = 2 * np.pi * fs\n", - " rco = R1 * C1 * omegas\n", - " phi = np.arctan(-rco).to(UNITS.degree)\n", - " return SweepSeries(phi, magnitude(fs))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    1.000000-0.3599952627020996 degree
    3.162278-1.1382701830745394 degree
    10.000000-3.5952737798681755 degree
    31.622777-11.237840984624153 degree
    100.000000-32.14190763534206 degree
    316.227766-63.284247907949336 degree
    1000.000000-80.95693892096232 degree
    3162.277660-87.1187796579127 degree
    10000.000000-89.08818633038616 degree
    \n", - "
    " - ], - "text/plain": [ - "1.000000 -0.3599952627020996 degree\n", - "3.162278 -1.1382701830745394 degree\n", - "10.000000 -3.5952737798681755 degree\n", - "31.622777 -11.237840984624153 degree\n", - "100.000000 -32.14190763534206 degree\n", - "316.227766 -63.284247907949336 degree\n", - "1000.000000 -80.95693892096232 degree\n", - "3162.277660 -87.1187796579127 degree\n", - "10000.000000 -89.08818633038616 degree\n", - "dtype: object" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "phi = phase_offsets(fs, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the theoretical results along with the simulation results and see if they agree." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd3wUdcLH8c/uplcgJBBCt/woUlWKDWygnHr2xp1iL9yj3tnPO5/HU6/ocerZUIFDsN0pKicWUNDzUEBQEGk/OgQCBAjpfXefPzZgCEFSNpnd5Pt+vfIimd2Z+WbCK9/MzG9mXH6/HxERkVDjdjqAiIhIbVRQIiISklRQIiISklRQIiISkiKcDuAUY0w0cCKwA/A6HEdEpLXyAOnAYmttWfUXWm1BESin/zodQkREADgVmF99QmsuqB0Ar7/+Oh07dnQ6i0iz27hxIwA9e/Z0OIm0Zjt37mTs2LFQ9Tu5utZcUF6Ajh070rlzZ6eziDS7oqIiAP3/l1BxyKmWsC4oY0wE8CrQlUD7XmOtLXU2lYiIBEO4j+K7BNhmrT0V+Ab4hcN5REQkSMK9oIYBc6o+/xQY4WAWEREJonAvqCQgv+rzAiDRwSwiIhJEYX0OikA57S+lRAIlJSItTH5+PtnZ2VRUVDgdReopMjKStLQ0kpKS6j1vuBfUN8AoYB5wNrDQ2TgiEmz5+fns2rWLjIwMYmNjcblcTkeSOvL7/ZSUlLB9+3aAepdUuBfU28DPjDFfAXuAK5trxR+s/pTPvv8PuFxkdOp0YPqePXsoKysjpX17YqKjASgsLCQvL4/4hATaJCcDUOmtZNfOXXgiPHTs8ON1WLuyd1FZUUmHDh2IiIwEID8vj4LCApKSkkhMDPyAy8vK2L1nN1GRUaSmpR2Yf0dWFj6/j07pnXC53biAffv2UVxcTLu27YiLj8OFi5LiYnJycoiNjSWlffvAzH7Yvn0bLpf7wNBjF7B7927KSstITU0lJjY28D0VFJKbu4/ExETatm0LgLfSy46sLCIiIujUKSMwM7Bzxw4qKirplJ5OZFQUALn7cikoyKdd23aktGmHx+3BW+Ele1c28bFxdMnojMflweP2sCNrBx7cdO3SlaiIKCLcHgryCygvLad9u3YkxicR4fZQWVFJWUkpcTFxJCcm4XF78Lg8VJZXEBUZRWx0DB63B7cr3I9sty7Z2dlkZGQQFxfndBSpJ5fLRVxcHBkZGWRlZbWugrLWVuLAyD2/389MO4d8VyEAO7L2HPwGF+zYu/eQaRTthaIa07ywLSv70Pmza8wP7Mjf++MZt/0qYMv2Q65vY8eOQ+fP2rcH9tWYWALrMrcePM0PW7fuPGT+LdmHTiNvB+TVmFYOazdvPeStG7ZtO3T+3Zmwu8a0ImDP4kPfW8vqG8LtcoMP8PuJiYohKiISj9uDr8JLWUkZsTGxBwquTXQSvtwKerbvyvC+Q0hPSMPj9gQniNRJRUUFsVV/GEl4io2NbdDh2ZArKGPMEGCWtTat2rQBwESgP7ARuN5aW8tvsObhcrl47Mz7WLDqG1wuFxkZGQde27NnD6WlpbRv356YmBgACgoKyMvLIyEhgTZt2gBQWVHJzl07ifBE0DE9sAfl9/vZtWsXlZWVpKWlEVm1B5WXl0dBQQHJyckkJgZOuZWVlbF7926ioqJIq7YHlZWVhc/no1OnTrjdgT2FvTl7KSoqom3bdsTHB/4KLSouYu/eHGJjY0hJaQ/48fn9bKsqkcAeVOBhlruysyktLQ3sQVV9T/n5+ezL3UdCQsKBPaiKigqysrLwRHgCe1CB74qsrCwqKiromN6RyMgowM++ffvIzcsjuU0ycQnxeH1eCosL2Za1ncjoSFLTUqn0efH6vGzauplKbyXpGen4/H4qfZXs3ruHopIiEpOTiIyKxOvzUlRaTH5BPhFREUTHRFPp81Lpq6S4pBi/C1weF16/D5/fF/jjwAXFlSUUV5b8+MONgOLKMvbuyz3oZ/7t1lW8vfUTItwRZCR1JKrETWp0O4b2PoGjU7vTPq6dDj01IW3b8NbQn1/IFJQxxgXcAPy1xvQoYCbwNHAagWuf5hhjullra+5PNJuOialcNPRnh76Qceikw+pey7TaLuo/3IX+R9X23oF1n7823U6sZVo95j+2lmn1uZPO8bVMO6Ee8x+B3+/H6/dRUlZCeWUFbo8LvwsqfV6KiosoKCrAE/ljwW3Zncm365eR6yugKKKM3UV72ZIbKPF1ZVv5etEyAGIjYmjjTiTBF0v/bn3o26UXXZM7kRSjgaVSN5mZmXTp0qXRy/F6vWRnZ5Oenh6EVMHL1RAhU1DAI8DPgMeA31WbPhKItNY+XfX1W8aYXwFXAK80a0IJey6XiwiXh8TYhENfjE+B1IMn9Uo9itF9Rh74uqSilM05mSxY+Q3bCnZCkofMvCzyygooIXATk3UbtjJjwyeBRXpiia2I4qj23RjYsx9d22TQOSmd2MiYpvoWJQytXr2a66+/ngULFjR6Wb/5zW8YNGgQ48aNa/SyXn/9db7++muef/55AAYNGsRbb72FMabRy66LUCqoidbah40xI2tM7wOsrjFtDdCvWVKJVBMbGUPvDsfQu8MxB03PK81nsV2K3bkekiLIKtpFZl4WRZUlFLlL2JOznEU5yw+8P8YbSWp0CscfM4CuyZ3ompxBekIakRGRzf0tSQjIz88P2hD6nJycoCxn/7L8fv+Br5cuXRq0ZddFyBSUtTbrMC8lAMU1phUDGtIjISM5JomzBozgrAE/3szE7/ezadcWftiyikJPKXsr88jMy2JbXhalngoyK3eSufrHkR8uP8T5YujXrQ/d2mTQJbkT6XFpdGrTQQMzwsTXX3/NhAkT2LRpExkZGYwfP55zzjkHgDPOOIPf/va3nHXWWQA8++yzrF69mkcffZSbbrqJsrIyBg0axCeffMI999xD//79+eKLL8jKymLo0KE89thjtG/fnnfffZdXX32VmTNnHlivMYb333+fd999lyVLlrB06VK2bt3Kww8/fFC+Bx54gNLSUpYvX05kZCSzZs1i3rx5vPzyy2RmZuL3+znrrLP4wx/+wLx583jppZfw+XxccMEF/Pvf/z6wnt69e7NixQr+8pe/sHr1alJSUrjmmmv235U8aEKmoH5CEVBzCE8cUOhAFpE6c7lc9OzYnZ4dux80vbS8jNWZlp3Fu8mnmMy8LDbvyyS7aC9FnlIWbvuOhdu+O/B+t89FRlJHjkrtTtfkTqRGt6N7286kJaW2ysEDf/ryeZbuWNFs6xuUfhwPnjb+iO9bt24dt9xyC3/5y18YNWoUixcv5vbbbyc1NZXjj6/t5GpASkoKr7zyCuPHj2fJkiUHpr/77rtMnjyZ7t2788ADD3D//fczefLkn8zw0EMPsWbNGs4888zDHuJbuHAh7733HgkJCWRnZ3PfffcxefJkTjjhBLZs2cIVV1zBZ599xrnnnsvatWtZvXo1L7zwwkHLyMnJYdy4cYwfP54pU6awdu1abrnlFpKTkznvvPOOuK3qKhwKahXw6xrTegHTHMgi0mgxUdEMOqr/IdNzC/JYn72JQncJW/OyyMzLYvX2tZR7Ksks3EFm4cGXE8S4o+nT8ViuHXgp6YlphyxPmteHH37I0KFDGTNmDADDhw/n/PPP57333vvJgjqcsWPH0qdPHwDuvvtuRo8ezb59Na8Tqb8hQ4YcGEARHR3NrFmz6NKlCwUFBeTk5NC2bVuys7N/chlz584lNTWV6667DoC+fftyzTXXMGPGjFZXUJ8DLmPMr4HnCIzi6w+852gqkSBrk5jMCYkHj8L0+/3szNlFrq+AzLwstuZlsWzjD+ytyKWUMr7L+oGV2Wu5YfAVjOg+rFXsUdVlb8YJOTk5dKp20T4ELtdYtGhRg5bXtWvXA5937NgRv98flPNL1S9LiYyMZMaMGbzzzjvExMTQp08fysrKDjrvVJvavteMjAx27Dj0mszGCPmCstaWG2POJXAd1B+AzcCF1tqal3eKtDgul4v0lI6k05HeqVUDM46/Cq/Xy97ifby5YiZfbV3CC99MY873n/Pbc+8kITre2dCtVHp6+kGH6CAwRLt91Z1a3G435eXlB17LzT34Wruadu3adeDz7du34/F4SE1Nxe12HzSgor57VdX/iPnwww/54IMPmDFjBh06dADgggsuOOIy0tPTyco6eNhA9e81WELuni/W2i+stW1qTFthrT3FWptore1nrZ3nVD6RUODxeEhLbM8dw67n6mMvwO1zsb4sk3tnP87aPRudjtcqjRkzhiVLlvDRRx/h9XpZsGABH3zwAeeffz4A3bt35+OPP6akpIS1a9cye/bsA/NGRUVRXl5OWVnZgWlvvPEGmzZtorCwkAkTJnDmmWeSlJREjx492LJlC0uWLKG8vJyXXnrpoNKJioqisLBup+gLCgrweDxERUVRUVHB9OnTsdYeKMCoqCgKCg69B/eIESPYt28fU6dOpaKiglWrVjF9+vQD32uwhFxBiUjduVwuLhx0LncPupFOsWnsLdnHw/MmMGPlR/h8PqfjtSrdunXjhRdeYNKkSZxwwgk88sgjPPLII5xyyikA3H///ezevZuTTjqJhx9+mEsuueTAvMYYevfuzdChQ7HWAjB48GDuuOMORowYQUxMDI8//jgAAwYM4KabbuLOO+9k5MiRJCcnH3S47fzzz2fKlCncfffdR8x80UUX0adPH8466yxOO+00Fi5cyHnnnce6desAGDly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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(A, ':', color='gray')\n", - "plot_ratios(ratios, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(phi, ':', color='gray')\n", - "plot_offsets(offsets, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the phase offsets, there are small differences between the theoretical results and our estimates, but that is probably because it is not easy to estimate phase offsets precisely from numerical results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Consider modifying this notebook to model a [first order high-pass filter](https://en.wikipedia.org/wiki/High-pass_filter#First-order_continuous-time_implementation), a [two-stage second-order low-pass filter](https://www.electronics-tutorials.ws/filter/filter_2.html), or a [passive band-pass filter](https://www.electronics-tutorials.ws/filter/filter_4.html)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/glucose_soln.ipynb b/soln/glucose_soln.ipynb deleted file mode 100644 index 51d1f3ca..00000000 --- a/soln/glucose_soln.ipynb +++ /dev/null @@ -1,2104 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 18\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - ".wrapper(x)>" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1e-05" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "G0 = 290\n", - "k1 = 0.03\n", - "k2 = 0.02\n", - "k3 = 1e-05" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To estimate basal levels, we'll use the concentrations at `t=0`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "11" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Gb = data.glucose[0]\n", - "Ib = data.insulin[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create the initial condtions." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G290
    X0
    \n", - "
    " - ], - "text/plain": [ - "G 290\n", - "X 0\n", - "dtype: int64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(G=G0, X=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make the `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "182" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290
    k10.03
    k20.02
    k31e-05
    initG 290\n", - "X 0\n", - "dtype: int64
    Gb92
    Ib11
    I<function interpolate.<locals>.wrapper at 0x7f...
    t_00
    t_end182
    dt2
    \n", - "
    " - ], - "text/plain": [ - "G0 290\n", - "k1 0.03\n", - "k2 0.02\n", - "k3 1e-05\n", - "init G 290\n", - "X 0\n", - "dtype: int64\n", - "Gb 92\n", - "Ib 11\n", - "I .wrapper at 0x7f...\n", - "t_0 0\n", - "t_end 182\n", - "dt 2\n", - "dtype: object" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(G0=G0, k1=k1, k2=k2, k3=k3,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Updates the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " dt = system.dt\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " G += dGdt * dt\n", - " X += dXdt * dt\n", - "\n", - " return State(G=G, X=X)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Numerical solution\n", - "\n", - "In the previous chapter, we approximated the differential equations with difference equations, and solved them using `run_simulation`.\n", - "\n", - "In this chapter, we solve the differential equation numerically using `run_ode_solver`, which is a wrapper for the SciPy ODE solver.\n", - "\n", - "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations. We don't have to do the update part; the solver does it for us." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: derivatives of G and X\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-5.9399999999999995, 0.0)" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run the ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details = run_ode_solver(system, slope_func, t_eval=data.index);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`details` is a `ModSimSeries` object with information about how the solver worked." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    02900
    2278.4760.00015
    4267.4640.00147812
    6255.8990.00330258
    8244.4240.00428352
    10233.4210.0048796
    12222.9050.00539312
    14212.9090.00580811
    16203.4540.00610843
    18194.5660.00630605
    20186.240.00643892
    22178.4590.00655891
    24171.1850.0066622
    26164.3960.00673793
    28158.0680.00679316
    30152.1720.00686423
    32146.670.00695603
    34141.5320.00703975
    36136.7420.00708884
    38132.2860.00710463
    40128.1480.00708845
    42124.3150.00704154
    44120.7690.00696712
    46117.4960.00686816
    48114.4810.00674565
    50111.7090.0066005
    52109.1670.0064336
    54106.840.00625981
    56104.710.00609282
    58102.7620.00593238
    .........
    12486.96620.00107406
    12687.08830.000956516
    12887.22240.000845541
    13087.36670.000740875
    13287.51960.000642273
    13487.67960.000549496
    13687.84540.000462316
    13888.01570.000380513
    14088.18960.000303877
    14288.36580.000232205
    14488.54360.000164302
    14688.72249.90618e-05
    14888.90183.63786e-05
    15089.0813-2.38474e-05
    15289.2606-8.17126e-05
    15489.4392-0.000137309
    15689.617-0.000190727
    15889.7936-0.00024205
    16089.9687-0.000291362
    16290.1422-0.000338741
    16490.3138-0.000385262
    16690.4837-0.00043192
    16890.6521-0.000478709
    17090.8191-0.000525623
    17290.9848-0.000572659
    17491.1493-0.00061981
    17691.3128-0.000667074
    17891.4754-0.000714445
    18091.6372-0.000761918
    18291.7983-0.000809491
    \n", - "

    92 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " G X\n", - "0 290 0\n", - "2 278.476 0.00015\n", - "4 267.464 0.00147812\n", - "6 255.899 0.00330258\n", - "8 244.424 0.00428352\n", - "10 233.421 0.0048796\n", - "12 222.905 0.00539312\n", - "14 212.909 0.00580811\n", - "16 203.454 0.00610843\n", - "18 194.566 0.00630605\n", - "20 186.24 0.00643892\n", - "22 178.459 0.00655891\n", - "24 171.185 0.0066622\n", - "26 164.396 0.00673793\n", - "28 158.068 0.00679316\n", - "30 152.172 0.00686423\n", - "32 146.67 0.00695603\n", - "34 141.532 0.00703975\n", - "36 136.742 0.00708884\n", - "38 132.286 0.00710463\n", - "40 128.148 0.00708845\n", - "42 124.315 0.00704154\n", - "44 120.769 0.00696712\n", - "46 117.496 0.00686816\n", - "48 114.481 0.00674565\n", - "50 111.709 0.0066005\n", - "52 109.167 0.0064336\n", - "54 106.84 0.00625981\n", - "56 104.71 0.00609282\n", - "58 102.762 0.00593238\n", - ".. ... ...\n", - "124 86.9662 0.00107406\n", - "126 87.0883 0.000956516\n", - "128 87.2224 0.000845541\n", - "130 87.3667 0.000740875\n", - "132 87.5196 0.000642273\n", - "134 87.6796 0.000549496\n", - "136 87.8454 0.000462316\n", - "138 88.0157 0.000380513\n", - "140 88.1896 0.000303877\n", - "142 88.3658 0.000232205\n", - "144 88.5436 0.000164302\n", - "146 88.7224 9.90618e-05\n", - "148 88.9018 3.63786e-05\n", - "150 89.0813 -2.38474e-05\n", - "152 89.2606 -8.17126e-05\n", - "154 89.4392 -0.000137309\n", - "156 89.617 -0.000190727\n", - "158 89.7936 -0.00024205\n", - "160 89.9687 -0.000291362\n", - "162 90.1422 -0.000338741\n", - "164 90.3138 -0.000385262\n", - "166 90.4837 -0.00043192\n", - "168 90.6521 -0.000478709\n", - "170 90.8191 -0.000525623\n", - "172 90.9848 -0.000572659\n", - "174 91.1493 -0.00061981\n", - "176 91.3128 -0.000667074\n", - "178 91.4754 -0.000714445\n", - "180 91.6372 -0.000761918\n", - "182 91.7983 -0.000809491\n", - "\n", - "[92 rows x 2 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD9CAYAAAC/fMwDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de3zU9Z3v8ddvrpmEW4BwEQIo0i9gkQqoq7aSirrFWlu3xW6rRQ/20cupPWfrto9dT7u6tiprt+2pSh+Htmsv2LqslFpFxepaoaLWclcBv3gBDfeEXEnmPnP++E1wCEkIJOSXzLyfj0eYzO8y+cwv4T3f+f6+8/052WwWEREpfD6vCxARkb6hwBcRKRIKfBGRIqHAFxEpEgp8EZEiEfC6gM4YY8LA+cB+IO1xOSIiA4UfGAust9bG81f028DHDfsXvC5CRGSA+giwLn9Bfw78/QC//e1vGTNmjNe1iIgMCAcOHOD666+HXIbm68+BnwYYM2YM48eP97oWEZGB5riucJ20FREpEgp8EZEiocAXESkS3erDN8ZcDdwDnAkcAr5vrf1pbuhkM5DI2/wla+2Vuf2uy+03FlgL3GStPdSL9YuISDedMPCNMWOB3wHXWmtXG2NmAS8aY9bjvkOos9YeN4zGGDMdeBCYD2wA7gWWA5f1Yv1dWrOxmmWrd1BbH2VkeYSF86dRNbuyr368iEi/csIuHWvtfqAiF/Y+YASQwm3Zzwa2dLLrDcAqa+06a20MuA24xBgzpXdK79qajdUsWbGVmvooWaCmPsqSFVtZs7G6L368iEi/060+fGttszGmFIgDzwA/sda+CcwCRhljXjXGHDTGrDDGjMvtNh3YnvcYrUA1MKNXn0Enlq3eQTx57KikeDLNstU7+uLHi4j0Oydz0jYGlOF+AnaRMeZmoAV4EZgHGCAKPJrbfhDQ2u4xWoHSnhTcXbX10ZNaLiJS6Lr9wStrbQb35OwGY8zPgE9aa6/J38YYcytQY4ypxH0xiLR7mFLgSM9K7p6R5RFqOgj3keXtSxIRKQ4nbOEbY+YaYza2WxwGGowx3zXGTMtbHsrdxnC7c0ze45QCE8jr5jmdFs6fRjjoP2ZZOOhn4fxpnewhIlLYutPC3wKMy7Xe7wMuBG4GrgW+Acwxxnw+t+19wJPW2hpjzMPAOmNMFfAysBjYbK3d2cvPoUNto3E0SkdExHXCwLfWNhpjrgLuB+7APfH6RWvtWmPM67nlb+Ue60ngS7n9XjPGLAKWAuOAV4AFp+VZdKJqdqUCXkQkp1t9+NbaTcCHO1h+GLi+i/1WAitPuToREek1mlpBRKRIKPBFRIqEAl9EpEgo8EVEioQCX0SkSCjwRUSKhAJfRKRIKPBFRIqEAl9EpEgo8EVEioQCX0SkSCjwRUSKhAJfRKRIKPBFRIqEAl9EpEgo8EVEioQCX0SkSCjwRUSKhAJfRKRIKPBFRIqEAl9EpEgo8EVEioQCX0SkSCjwRUSKhAJfRKRIKPBFRIpEoDsbGWOuBu4BzgQOAd+31v7UGBMClgCfAdLAj6y1i/P2uy6331hgLXCTtfZQ7z4FERHpjhO28I0xY4HfAf9krR0MLAB+bIyZBdwJGGAycD5wozFmYW6/6cCDwE3ACOBNYPlpeA4iItINJwx8a+1+oMJau9oY48MN7xTQDNwI3G2trbfW7gZ+AHw5t+sNwCpr7TprbQy4DbjEGDPlNDwPERE5gW714Vtrm40xpUAceAb4CVCD21WzPW/TN4AZue+n56+z1rYC1XnrRUSkD3WrDz8nBpQB5wJPAdHc8ta8bVqB0tz3g9qta79eRET6ULcD31qbARLABmPMz4A5uVWRvM1KgSO571varWu/XkRE+lB3TtrONcZsbLc4DNQDB3BP2raZyvvdONvz1+W6hCZwbBeQiIj0ke608LcA44wxtwL3ARcCNwPX4gb+HcaYV3G7cL6Z2wbgYWCdMaYKeBlYDGy21u7s1WcgIiLd0p1ROo3AVcDfAXXAz4AvWmvXArcDrwPbgPXASmBpbr/XgEW5+7XAObhDOkVExAPd6sO31m4CPtzB8hjwtdxXR/utxH0REBERj53MKJ0BY+0vlpCNt3Dpl7+Fz/f+m5g1G6tZtnoHtfVRRpZHWDh/GlWzKz2sVESk7xTkXDql+zcxoe6v2L/+5eiyNRurWbJiKzX1UbJATX2UJSu2smZjtXeFioj0oYIM/JbRHwLg0CtPH122bPUO4sn0MdvFk2mWrd7Rp7WJiHilIAN/yrxryGRhbPMOmusOA1BbH+1w286Wi4gUmoIM/HFnTmJvcBIBJ8O2Z1cBMLK8/WfA6HK5iEihKcjAByiZMQ+A4NsvkM1mWTh/GuGg/5htwkE/C+dP86I8EZE+V7CBP3Pe5TRmSinPNrBr01+pml3JLQtmUlEewQEqyiPcsmCmRumISNEoyGGZACXhELWj5jC09s/sf+kpzpp9IVWzKxXwIlK0CraFDzC56moyWaho3E60sd7rckREPFXQgX+Wmcy7/okEnAzbn33c63JERDxV0IEPEPzg5QD4d64hm0mfYGsRkcJV8IE/5/LLOZwZxJBsE7vWr/O6HBERzxR84JdGQhwecxEANS8/6XE1IiLeKfjAB5h25TUksn4qWt6maf97XpcjIuKJogj8iRPPYFd4KgD2j7/3uBoREW8UReADDL/wKgDK9v6VdFzz54hI8SmawJ99yQVUZ0ZRQpyda58+8Q4iIgWmaAI/4PcRPetSAFq3PEM2m/W4IhGRvlU0gQ8w+2Mf50gmTHnyEAd3bve6HBGRPlVUgV8xYgj7hs4E4O3n9clbESkuRRX4AJOqPgHA8NottDY3eVyNiEjfKbrANzOmsdc3jrCTYusf9UEsESkeRRf4juMQ/uBl7p2da3XyVkSKRtEFPsCHrvgYrdkwo7M1vP7XjV6XIyLSJ4oy8EMlJTSNmQPAvhfVrSMixaEoAx/AXPEpACa0bmf//lqPqxEROf26dYlDY8wVwL8BU4BDwL9ba39qjAkDzUAib/OXrLVX5va7DrgHGAusBW6y1h7qxfpP2Wu1Qf6jcQGN6RIG3/dnvrTgfF3+UEQK2gkD3xhTCawEbgQeA2YDfzTG7AYOA3XW2jEd7DcdeBCYD2wA7gWWA5f1Uu2nbM3Gapas2Eo8HQGgOelnyYqtAAp9ESlY3enSmQQ8bK191FqbsdauB9YAl+CG/5ZO9rsBWGWtXWetjQG3AZcYY6b0vOyeWbZ6B/HksVe/iifTLFu9w6OKREROvxO28K21LwAvtN03xgwHPgI8BHwMGGWMeRUYDfwZ+Adr7V5gOm7Lvu1xWo0x1cAM4M3efBInq7a+49kyO1suIlIITuqkrTFmKPA48Apu904L8CIwDzBAFHg0t/kgoLXdQ7QCpT2ot1eMLI90uHzY4FAfVyIi0ne6ddIWwBjzAdyQ3w5cb63NALe22+ZWoCbX798CtE/WUuBIjyruBQvnT3P78PO6dYKkOG+QploQkcLVrRa+MeZS3Fb9H4DP5PrkMcZ81xgzLW/TtiZyDPeFweQ9RikwIbfcU1WzK7llwUwqyiM4QHnE4e/LXuKC6FpaookT7i8iMhB1Z5TOZOAJ4NvW2gfarT4XmGOM+Xzu/n3Ak9baGmPMw8A6Y0wV8DKwGNhsrd3Za9X3QNXsyqMjcrLpJNvvfYRINsorz7/IZVd91OPqRER6X3e6dL4GDAYWG2MW5y3/CXAzcD/wVu6xngS+BGCtfc0YswhYCozDfYewoPdK7z1rtxzgP5qvpTHhZ9DzNTijqvnoHA3PFJHC0p1ROrfSrq++neu72Hcl7hj+fuvomPykeyiOZMI88MhmHEdj8kWksBTt1AptOhqTn0xnNSZfRApO0Qd+Z2PvazQmX0QKTNEHfmdj8geHNE++iBSWog/8hfOnEQ76j1kWJMXFgW2k0xmPqhIR6X1FH/jtx+RXDC3hM2WvcFXJJjb9davX5YmI9Jpuf9K2kOWPyQdY/+AWOPA2B196Ai46z8PKRER6T9G38Dty9hWfBuCs6Ou8V33Q42pERHqHAr8D5RPOpjYyiRInxetPP3riHUREBgAFfidGffiT7u2Bl2k+oiGaIjLwKfA7MfH8D9PoG8Zw3xHWP/201+WIiPSYAr8TjuPD/8ErAPDb/yad0bh8ERnYFPhdmHbFNcQIUckBNq17xetyRER6RIHfhWBJKc3j/gaA+ldWeVyNiEjPKPBPYNr860hnHc6MW97ZucvrckRETpkC/wSGjB5L7dDp+J0sb/7xEa/LERE5ZQr8bph4xWcBqGzcRM2BWo+rERE5NZpaoQNrNlazbPUOauujjCyPuBOshScxOr6brU+u4PKbv+p1iSIiJ00t/HbaroBVUx8lizsv/pIVW3m3cj4AFftfpOVIi7dFioicAgV+Ox1dASueTPPMzgy1/goGO1E2PvkHj6oTETl1Cvx2Or0CVkOU+5vnsyE+icibz5FMJvu4MhGRnlHgt9PZFbAAGmOwvOVidiXK2fTMH/uwKhGRnlPgt9PRFbDyJQnwRHQWma2rdEUsERlQFPjt5F8BqzP1mTJGZ2t5dc1zfViZiEjPKPA7UDW7kl9858pOQ39IyG3Zx/76KJmMWvkiMjAo8LvQWfdOU8LPHQ2fpjoa4Y0XX/CgMhGRk6fA70JX3TsNmTKWt1zMi8+9QDarqZNFpP/r1idtjTFXAP8GTAEOAf9urf2pMSYELAE+A6SBH1lrF+ftdx1wDzAWWAvcZK091LtP4fRqu8D5orueoabdkM0kAV5oOZOq9X9hygUXeVShiEj3nLCFb4ypBFYCdwHDgM8Bi40xfwvcCRhgMnA+cKMxZmFuv+nAg8BNwAjgTWB57z+FvtHZ+Pz6TBm1a/9LrXwR6fe606UzCXjYWvuotTZjrV0PrAEuAW4E7rbW1ltrdwM/AL6c2+8GYJW1dp21NgbcBlxijJnSy8+hT3Q2Pn+Yr5XRiWreWf9yH1ckInJyThj41toXrLVfabtvjBkOfATYjNtVsz1v8zeAGbnvp+evs9a2AtV56weUjk7ghoN+LhwdB+DwmofVyheRfu2kZss0xgwFHgdeATbmFrfmbdIKlOa+H9RuXfv1A0rV7EqAY2bRPH/qKF7ZFuCPTV+g3NfCVf/1LH//91d6XKmISMe6HfjGmA8Aj+G22q8H2vo48vs6SoEjue9b2q1rv37AaTuBC+/PqulOtOZQnxnEI+ubGX32e3x0zgRvCxUR6UC3hmUaYy7FbdX/AfiMtTZmra0HDuCetG0zlfe7cbbnrzPGlAITOLYLaMDqaFbNJAF++YfNHlUkItK1E7bwjTGTgSeAb1trH2i3+iHgDmPMq7hdON8E7sutexhYZ4ypAl4GFgObrbU7e6l2T3U6aieaZdH3nqG24f2Lp7S9KxAR8VJ3unS+BgzGHYq5OG/5T4DbgR8C23DfLfwMWApgrX3NGLMod38c7juEBb1XurdGlkeOG5ffpqbBXd528RRAoS8injth4FtrbwVu7WKTr+W+Otp3Je4Y/oKzcP60vD78NlnAOWa7eDLNstU7FPgi4jlNrXCK8qddcCA3/YLT4baddf+IiPQlXcS8B/JH7QAdTr8AXV9URUSkr6iF34s6+3DWwvnTPKpIROR9auH3orbW/s8f3UpTNEW5r4XPzZuq/nsR6RcU+L2sanYll543nt9//3vMSm+lecckspfPwnE67t8XEekr6tI5DXw+h8kfX0hzpoTBzbs5tPFPXpckIqLAP13OmzGJ14dVAXD4v5eRiWukjoh4S4F/Gs397Gd5NzWSkvQRdq3+jdfliEiRU+CfRuNHDaHG/B2ZLGS2PUO8Zo/XJYlIEVPgn2Yf/+RlbMoY/GR4e+VPNGe+iHhGgX+alUWClFd9npZMiJLDO6nbrBO4IuINBX4fuOzD5/BSyVwAap75FemWRo8rEpFipMDvAy9s3sOLLZP433Vf4J7DH2PlL//T65JEpAgp8E+ztitj1TfHabsy1vJdFfzxqRe8Lk1EiowC/zTr7MpYv1mzh0wi5lFVIlKMFPinWWdTIzekI+x/+ld9W4yIFDUF/mnW2dTI5b4W4q89S+s7W/u4IhEpVgr806yjKZNDQR8TgvUA7Hn0ATKxFi9KE5Eio9kyT7O2qZGXrd5Bbf37FzaPx6fz7rOvMjF2mD/8+j95ombCMes1pbKI9DYFfh9of2UsgGw2yw83f4L9B/7M73aWk0QXPheR00tdOh5xHIcvfG4ej0YvJNnudbftwuciIr1Jge+h0cNLiWWDHa7Thc9FpLcp8D1WMazjUTy68LmI9DYFvscWXjWNUPDYX0Mo4OjC5yLS6xT4HquaXcnXF3yIoYNCQJZy3xGuG7yBj0wd4nVpIlJgFPj9QNXsSn5z53yu+fAkFpa9wPnONvat/CHZTPrEO4uIdNNJDcs0xlwAPGGtHZW7HwaagUTeZi9Za6/Mrb8OuAcYC6wFbrLWHuqNwgvRjVfP4I63P87I6HKGVG+j7vnfMmLeQq/LEpEC0a3AN8Y4wM3AD9qtmgHUWWvHdLDPdOBBYD6wAbgXWA5c1pOCC1ko6OfrN36U++8/yM3hp2n8y2OEx01h0NSLvC5NRApAd7t07gS+CtzVbvlsYEsn+9wArLLWrrPWxoDbgEuMMVNOqdIicUbFIK5ZcBWPt84G4OBjD5Coec/jqkSkEHQ38Jdaa2fjttTzzQJGGWNeNcYcNMasMMaMy62bDmxv29Ba2wpU474rkC5cfO4ZDLvwajbGJ+Gk4uxbfo+ukiUiPdatwLfW7utkVQvwIjAPMEAUeDS3bhDQ2m77VqD05MssPjdefQ6bK67m3dQIMk017F9xL9lU0uuyRGQA69EoHWvtrdbar1tra6y1DcCtwPnGmErcF4P2nx4qBY705GcWi4Dfx7duvIjf++bTkCklsddS89T/I5vNel2aiAxQPQp8Y8x3jTH5nxAK5W5juN05Jm/bUmACed080rXyISX8w//4KL+KXU48G+DIa2tpeHGl12WJyADV09kyzwXmGGM+n7t/H/CktbbGGPMwsM4YUwW8DCwGNltrd/bwZxaVyeOH8dnrruD+36RooYT6RwOMfOZxbvzkeZpNU0ROSk8/eHUzUA+8BezGHY//BQBr7WvAImApUAucAyzo4c8rSslUmv1UUJ8ZBDjUtmR54JHNrNlY7XVpIjKAnFQL31q7BhiWd/8wcH0X268E1AfRQ8tW7yCdObbvPpHK8utVr6qVLyLdpqkVBoDOpkqubU4SP7i7b4sRkQFLgT8AdHUh9P2/vZNE7Z4+rkhEBiIF/gDQ0YXQAWYFd5GJNrHvN/9Ksm5/3xcmIgOKAn8AqJpdyS0LZlJRHsEBKsojLLpmOq+FP8SbydFkWurZ99t/JVl/wOtSRaQf00XMB4iOLoQ+24zm9p9kuIGnOKuphn0P/Qtjr/9XQiPGdfIoIlLM1MIfwCaMGcJ3vnwpy5If463kKNLNdex76F9IHNJkayJyPAX+AHf2+GF8+0uX8lDyb7HJsWRaGtn3m9uJ73/b69JEpJ9R4BcAM3E4t39lLg+nrmRbYhyZaDP7Hrqd1ne2el2aiPQjCvwCMaWynDu/OpdHMleyIX4m2WSMA/91N82vrfW6NBHpJxT4BeSscUO5639eypP+eTwXnQ6ZNDWP30/Dy3/QLJsiolE6hWbi2CHce8ul3PGzIE3NpVxbtoG6Pz3E2m11PLZ/HLUNMUaWR1g4f5qmZRApMmrhF6AxI8r4/tc/wt5RF/OL5rn8JTaZX+8YSk1DjCxQUx9lyYqtmnxNpMgo8AvU0EFh7v7qJQQmn88jrX9Dst2buXgyzbLVOzyqTkS8oMAvYJFwgH9ZdCFpjp+WATqflE1ECpMCv8D5/T4qOpl8bXg4RSYR6+OKRMQrCvwi0NHka0FSXBV4ib2/+JY+pCVSJBT4RSB/8jVwL5AeIc64QAPJw/vY+6vbaHjp92QzaY8rFZHTScMyi0T+5GvJVIZfPrGNH74Q5hOlm5hb8gZ1z/+W1rc2UXH11wgOH+txtSJyOqiFX4SCAR9f+tQMvnXTRTzLJSxtnkdzNkKsegd7fn4rDX95XK19kQKkwC9iF804gwe++VFCk2ZyT8MnWB8/i2wqQd1zv2bfr79N/MA7XpcoIr1IgV/kRgyN8N0vXcznPjGHRxJz+WnzZTRmy4jve5O9v/gnap/+OenoEa/LFJFeoMAXfD6HT82dzAPfrMI3YSZ313+C52PTyGSzNG18muqlX6dp87Pq5hEZ4BT4ctQZIwdx91cuYdGn5/Bs5iK+33g1b6dGk2ltovappez5+a20vrlRE7GJDFAapSPH8Pkcrrr4TC6aMZZfPbGd+zcM47zQbj5ZtoXy2j0ceOQeSiacQ/nczxKZcI7X5YrISVDgS4fKB5fwjc/N4soLJ/KzPwzje3sn8AH/fvZny2moK6X81S1cW/nfzL/2Skoqp3ldroh0g7p0pEvnnDWC//sPc7nyorPYkR5PQ6YMcKjPDOKhd8fz+M//g33LvkPLzvVksxmvyxWRLqiFLyfk8zlseOPQccuTBFgVnc2c6pXEqncQHDmeoRdczaBzPoIvVOJBpSLSlZMKfGPMBcAT1tpRufshYAnwGSAN/Mhauzhv++uAe4CxwFrgJmvt8ckh/V5nM2s2ZEp5tGUO88p2MKR2D7VPLaXuTw8xeOZlDJn1t/rUrkg/0q3AN8Y4wM3AD9qtuhMwwGRgKPC0MWavtXaZMWY68CAwH9gA3AssBy7rpdqlD40sj1DTQeiXRUK8Hp7Nn+umcl5oN1WlO5kQO0TjK6tofGUVJRPOYfCHLqNs6kX4gmEPKheRNt3tw78T+CpwV7vlNwJ3W2vrrbW7cV8QvpxbdwOwylq7zlobA24DLjHGTOl52dLXOppxMxz085VrZ/Dz/3M53/j8HOorzuOHDR/jB41X8Up8MikCxN7bRs3jD/DufV/k0Kqf0Lprq8bzi3iku106S621txtjqtoWGGOG4XbVbM/b7g1gRu776bgtewCsta3GmOrc+jd7UrT0vbaJ15at3kFtffS46+JWza5k7qzx2HfrefKlXTyyZRS/bz2f80K7uSTyNpXxGo68+ieOvPon/GXDKJt2MWVTL6SkchqOr+MLtIhI7+pW4Ftr93WweFDutjVvWStQmre+lWPlr5cBJn/GzY44jsPUScOZOmk4X7zmgzy/cQ/PrR/JD/Z/gNG+BmaFd3NBZDfDWxpo2vAUTRuewlc6hLIp51N69mwiZ56LL9zxxVpEpOd6MkqnJXeb/z+0FDiSt779/9789VLAhg4K86m5k/nkpWfx9t5Gnt9Qzbqto1ldN5MJ/sPMDL3LeSXVjGhtonnrczRvfQ78ASITziFy1kwik84lNHoijqORwyK95ZQD31pbb4w5gHvSdm9u8VTe7+LZnlsHgDGmFJjAsV1AUuAcx+Hs8cM4e/wwFl3zQbbvOswLm/fy4rZxrKqPMdbfwAeDe5gR3sMEaoju2kp011YAfKVDiEw8h5LK6UQmnkOwolIvACI90NNx+A8BdxhjXsXtwvkmcF9u3cPAuly//8vAYmCztXZnD39ml9ZsrO60n1m85fc5HG6IsuGNg9Q3xRk2uITKyqm8WT+RZ/c3UebEmBrchwnuZ1roAENam2jZ8TItO14GwFdSRviMKYTHfYCSM6YQHjsZf9lQj5+VyMDR08C/HfghsA13xM/PgKUA1trXjDGLcvfHAa8AC3r487q0ZmM1S1ZsJZ50R4HU1EdZssJtLSr0vdf+99PQHGfrm7XcsmAmH5w8kk32EJvsIZ54q5aH6+OM8jUxOXiQswMHmRI6xNBYC9F3thB9Z8vRx/QPHkF4zFmERk8iNGoioVETCJaP0Ylg6bey2SxkUmQSceKxOIlYlHg0RjIW5aU36li1uYmG1gwVwyIsvKp3G6xOf5350BgzCdj13HPPMX78+G7ts+iuZzocK15RHuEX37mydwuUk9bd308mk+W9g828+mYN23fVsWP3Yeqa4gx1WpgUqGVSoIaJgVrGB+oJO8njHs/xBwmOGEtwxDj3a/hYguVjCZaPwVc6BMdxTuvzlIEnm0mTTSXIJhOkk3Hi0VYS0RiJWJRENEYyHiMVi5FKxEklYqQTcTKJOJlkgkwqTjaZgHQC0kmcdAInncTJJPFlkvgzKfzZFH5SBLIpAqTxOcfn7ob4JJa3XEwyrx0eDvq5ZcHMkwr9PXv2MG/ePIAzc8PljyqoqRU6+zRoZ8ulb3X39+PzOUwaO4RJY4dwzaWTyWazHKxrxb5bz87qena+18DqvY0kkykqfE2MD9Rxhr/e/Qo0UE4LiUPvkTj03nE/ywmVEBhaQXDoKAJDK/APHkFgyHACg0fgH1SOf1A5vnCpXhT6ifwgziTjZJNxMslcq7g1SjIWJRGLkozFSMVjpBMxUokEmUTM3TaVgGQC0nFIJY6GsBvESfzZFAGSBOh6HigfEMp99UjuzyqV9ZHM+km6LwOknQCPReccE/YA8WSaZat39Forv6ACv7NPg44s11C//uBUfz+O4zBmRBljRpQxd5b7bi+dybKv5gi79jXyzt5G3jvYzPoDzRysayVMklH+Rkb7Gxntb2Kkr5mR/mYq/E1EEjGSNdUka6o7/3mBEP6yofhLh+ArHYK/dCj+yCB8kcH4SgbhLynDFy7FV1KKE4rgC0fwhSI4oRIcf7CgXyyy2SzZdJJsKukGcSrhfp90v29r7aaTCZK5IE7G46TisVzLOEE6EXNbxsk42VQCUm7r2Ekn8KWT+DIJfJkU/mySAN37kJ4/93WqMll3bqhk1k8iGyCFn5QTIO0ESTtBMr4gGV+ArD9E1h8EfwgnEIRAGF8whC8QwhcK4w+F8QfDBMMl+MPubTAcJlRSQigSIRSJEC6JUBIOEgr68fne/1tp/sfHOqytNxusBRX4C+dPO6aPGNy3RAvna/re/qA3fj8dnZS/6er35+WPxVPsq21hb80R9tUcYV9tCxvqWjlwuIW6higlJBjuO8JwXwvDfS0M9bUyzNfCMF8rQ3xRhviihFMJUo01pBprTv5JOg4EwoI4dg0AAAgUSURBVDjBME7ADQVfwA0EJxBwXxD8AfAHcHx+93uf3z3n4PO5t44Px+cDxweOk3sBcdzHxjnaSjwqm/snmyWbzZLJpMlmMmQyGbLpDJl0mkwm4y5Pp8ik3dtsOk0mnXK/z60jd59MCifz/q0vk8LJpvBnT/1T0qcSyvlBHM8Gjn6fJJAL4gBpX4iML0jWH4KA++W0BXGwBF8oTCAUwh+OEAiVEIyUEAyFCUdKj4ZwaaSEjW8c4nd/epPDjd4M+OiLBmtBBf6JPg0q3urp76c7J+VLwgHOGjeUs8YdP3onmUpT2xCjtiFKTUOUw41R6pvjvN0Uo64xRlNLnIYjCVLRVgb5YgxyYkdvS30Jypw4pU6CEidBxEkQ8SUoIUXYSea+Um7XQDJGNhmjrZe2P04kkXvpOKX50ZO57og0fhK58HW7KAIk8R/tqsi0tYz9QbK5QHbaAjkYwhd0W8P+UBh/yG0JB0rcAHZbxKWUlISJlAQZGvJTEgpQEvITDvrx+3t3eO6ajdX8ctU2Twd89EWDtaACH078aVDxVk9+P8tW7zjmPwOcXB9nMOBn7Mgyxo4s63K7ZCpNc2uS5pYETa0JjrQmaImmaI0laYkmaYqn2LyngZ3vNRBPpgkGfFQMixAO+UklU2TTCUjG8WWS7sm7dBKy7otBwEkTIIOfDD7HvfWTPfq9jyw+sjhO7pZsLpzdl4+2+wD5p/2yeVvgOEffHeD43HcOjh/H54Dv/XcUjt/PvliEnY0RommHSACmj3KYNDKIPxjEHwzhDwYJhEIEQmGCoTDBUJBwOEg46CcU9FOWC+BQ0E84F8rhkJ9QwHdSXVvvv3NrONoQ+Jvp47q9f0/19G+rN/RFg7XgAl8KV1+dlA8G/Awf4mf4kI7n9F+zsZrVL+0+GhDJVIbDjbETjqbIZLKkM1nSmQzZLPx50x6WP2upbYwxYmgJC+ZN4eJzz3h/hyy5Hhw3OB3HPZ/RdutzwOc4OD4Hn+Pg87nLuhu0azZW86cVW4mn3ecRTcHrNX6qqmb0aaOpPwyn7i8DPk53g1UfW5QBo7O+zL4+Kd9Va7ArPp9DMOCjJBTgldf38/PHXqe2MQbA4cYYv1y1na07aygfXOJ+DXFvhw0OM2xwmKGDwgwpCzG4NMSgSJDSkiAl4QDhoJ9gwIff55xUq/pUn0dv6w919Je/rdNNgS8DRmdTNJ9sH+eajdUsuusZrvnHx1h01zOs2dj5iJ2O9EZrsD+EXH9p1faHOnrrb6u/U5eODBi90cfZG90HvTGaoj+EXH8Zxtwf6iiWAR8KfBlQetrH2Rsn53pjNEV/CLn+Moy5v9RRDAM+1KUjRaU3WtZVsyu5ZcFMKsojOLhTQ5zsx9/7QxdCbzyPQqqjGKiFL0Wlt1rWPW0N9pcuhP7Squ0vdRQ6Bb4Ulf7SfQAKOel7CnwpKv2lZS3iBQW+FB21rKVY6aStiEiRUOCLiBQJBb6ISJFQ4IuIFIn+fNLWD3DgwAGv6xARGTDyMvO4683058AfC3D99dd7XYeIyEA0Fng7f0F/Dvz1wEeA/fTPiwaJiPRHftywX99+hZPNZo/fXERECo5O2oqIFAkFvohIkVDgi4gUCQW+iEiRUOCLiBQJBb6ISJFQ4IuIFIn+/MGrU2KMmQksBc4F3gEWWWuP+wCCdMwYswj4KRDPW/w14D+BJcBncD8I9yNr7eK+r3BgMMZcADxhrR2Vux+ii+NnjLkOuAf3AzNrgZustYf6vPB+qINjGQaagUTeZi9Za6/Mrdex7ERBBX7uP9VjwI+BS4FPA88YYyZaa5s8LW7gmAX80Fr7z/kLjTGLAQNMBoYCTxtj9lprl3lQY79ljHGAm4EftFt1J50cP2PMdOBBYD6wAbgXWA5c1meF90NdHMsZQJ21dkwH++hYdqHQunSqgKC19sfW2qS1djmwDfist2UNKLOBLR0svxG421pbb63djfuf8Mt9WdgAcSfwVeCudsu7On43AKusteustTHgNuASY8yUPqq5v+rsWHb2Nwo6ll0qtMCfDuxot+wN3BaBnIAxxo/bFfYFY8w+Y8xbxph/NsaU47493p63uY5rx5Zaa2fjti4BMMYMo+vjNz1/nbW2FahGx/e4Y5kzCxhljHnVGHPQGLPCGDMut07HsguFFviDgNZ2y1qBUg9qGYgqcP9z/Ro4E7e/+avA13Pr84+tjmsHrLX7Olg8KHfb2fHT320HOjmWAC3Ai8A83G6yKPBobp2OZRcKqg8f9w8h0m5ZKXDEg1oGHGvtAWBu3qItxpgHcPtD4dhjq+PafS25286On/5uT4K19tb8+8aYW4EaY0wlOpZdKrQW/nbcV/x8Uzn2rbR0whhzjjHmznaLQ0AMOMCxx1bHtZustfV0ffyO+bs1xpQCE9Dx7ZAx5rvGmGl5i0K52xg6ll0qtBb+84BjjPkG7hC4T+P2ST/a5V7SpgH4R2PMHtyRDucB/wu4Bffk9x3GmFdx3zZ/E7jPq0IHoIfo/Pg9DKwzxlQBLwOLgc3W2p1eFDoAnAvMMcZ8Pnf/PuBJa22NMUbHsgsF1cK31iZwux8+DdQB3wY+Za2t8bSwAcJauxe4Bnf0SBOwEvietfZ3wO3A67jBvz63bqlHpQ5EnR4/a+1rwKLc/VrgHGCBN2UOCDcD9cBbwG7c8fhfAB3LE9EFUEREikRBtfBFRKRzCnwRkSKhwBcRKRIKfBGRIqHAFxEpEgp8EZEiocAXESkSCnwRkSKhwBcRKRL/H5UezHjbUYNmAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.G, '-')\n", - "plot(results2.G, '-')\n", - "plot(data.glucose, 'bo')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The differences in `G` are less than 1%." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0\n", - "2 -0.127982\n", - "4 -0.191302\n", - "6 0.154946\n", - "8 0.26436\n", - "10 0.207439\n", - "12 0.132947\n", - "14 0.035413\n", - "16 -0.0815439\n", - "18 -0.222312\n", - "20 -0.371789\n", - "22 -0.522334\n", - "24 -0.664226\n", - "26 -0.801867\n", - "28 -0.934267\n", - "30 -1.05701\n", - "32 -1.1642\n", - "34 -1.25663\n", - "36 -1.346\n", - "38 -1.43135\n", - "40 -1.5119\n", - "42 -1.58699\n", - "44 -1.65612\n", - "46 -1.71812\n", - "48 -1.77288\n", - "50 -1.82036\n", - "52 -1.86066\n", - "54 -1.89392\n", - "56 -1.91501\n", - "58 -1.92508\n", - " ... \n", - "124 -0.661724\n", - "126 -0.631811\n", - "128 -0.601917\n", - "130 -0.572193\n", - "132 -0.54277\n", - "134 -0.513756\n", - "136 -0.485244\n", - "138 -0.457312\n", - "140 -0.430024\n", - "142 -0.403431\n", - "144 -0.377577\n", - "146 -0.352881\n", - "148 -0.329311\n", - "150 -0.306834\n", - "152 -0.285416\n", - "154 -0.265021\n", - "156 -0.245616\n", - "158 -0.227165\n", - "160 -0.209635\n", - "162 -0.192991\n", - "164 -0.177201\n", - "166 -0.16262\n", - "168 -0.149158\n", - "170 -0.136734\n", - "172 -0.12527\n", - "174 -0.114695\n", - "176 -0.104943\n", - "178 -0.0959529\n", - "180 -0.0876686\n", - "182 -0.0800372\n", - "Name: G, Length: 92, dtype: object" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "percent_diff.dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's find the parameters that yield the best fit for the data. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll use these values as an initial estimate and iteratively improve them." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290.00000
    k10.03000
    k20.02000
    k30.00001
    \n", - "
    " - ], - "text/plain": [ - "G0 290.00000\n", - "k1 0.03000\n", - "k2 0.02000\n", - "k3 0.00001\n", - "dtype: float64" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(G0 = 290,\n", - " k1 = 0.03,\n", - " k2 = 0.02,\n", - " k3 = 1e-05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` takes the parameters and actual data and returns a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object with the given parameters.\n", - " \n", - " params: sequence of G0, k1, k2, k3\n", - " data: DataFrame with `glucose` and `insulin`\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " # params might be a Params object or an array,\n", - " # so we have to unpack it like this\n", - " G0, k1, k2, k3 = params\n", - " \n", - " Gb = data.glucose[0]\n", - " Ib = data.insulin[0]\n", - " I = interpolate(data.insulin)\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " init = State(G=G0, X=0)\n", - " \n", - " return System(G0=G0, k1=k1, k2=k2, k3=k3,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290
    k10.03
    k20.02
    k31e-05
    initG 290.0\n", - "X 0.0\n", - "dtype: float64
    Gb92
    Ib11
    I<function interpolate.<locals>.wrapper at 0x7f...
    t_00
    t_end182
    dt2
    \n", - "
    " - ], - "text/plain": [ - "G0 290\n", - "k1 0.03\n", - "k2 0.02\n", - "k3 1e-05\n", - "init G 290.0\n", - "X 0.0\n", - "dtype: float64\n", - "Gb 92\n", - "Ib 11\n", - "I .wrapper at 0x7f...\n", - "t_0 0\n", - "t_end 182\n", - "dt 2\n", - "dtype: object" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`error_func` takes the parameters and actual data, makes a `System` object, and runs `odeint`, then compares the results to the data. It returns an array of errors." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)\n", - "results, details = run_ode_solver(system, slope_func, t_eval=data.index)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(params, data):\n", - " \"\"\"Computes an array of errors to be minimized.\n", - " \n", - " params: sequence of parameters\n", - " data: DataFrame of values to be matched\n", - " \n", - " returns: array of errors\n", - " \"\"\"\n", - " print(params)\n", - " \n", - " # make a System with the given parameters\n", - " system = make_system(params, data)\n", - " \n", - " # solve the ODE\n", - " results, details = run_ode_solver(system, slope_func, t_eval=data.index)\n", - " \n", - " # compute the difference between the model\n", - " # results and actual data\n", - " errors = results.G - data.glucose\n", - " return errors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When we call `error_func`, we provide a sequence of parameters as a single object." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how that works:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "G0 290.00000\n", - "k1 0.03000\n", - "k2 0.02000\n", - "k3 0.00001\n", - "dtype: float64\n" - ] - }, - { - "data": { - "text/plain": [ - "0 198.000000\n", - "2 -71.523600\n", - "4 -19.535535\n", - "6 4.898956\n", - "8 4.423982\n", - "10 17.420932\n", - "12 11.905305\n", - "14 7.909446\n", - "16 7.454111\n", - "18 NaN\n", - "19 NaN\n", - "20 NaN\n", - "22 6.458757\n", - "24 NaN\n", - "26 NaN\n", - "27 NaN\n", - "28 NaN\n", - "30 NaN\n", - "32 4.670366\n", - "34 NaN\n", - "36 NaN\n", - "38 NaN\n", - "40 NaN\n", - "42 0.314528\n", - "44 NaN\n", - "46 NaN\n", - "48 NaN\n", - "50 NaN\n", - "52 4.166524\n", - "54 NaN\n", - " ... \n", - "124 NaN\n", - "126 NaN\n", - "128 NaN\n", - "130 NaN\n", - "132 NaN\n", - "134 NaN\n", - "136 NaN\n", - "138 NaN\n", - "140 NaN\n", - "142 6.365824\n", - "144 NaN\n", - "146 NaN\n", - "148 NaN\n", - "150 NaN\n", - "152 NaN\n", - "154 NaN\n", - "156 NaN\n", - "158 NaN\n", - "160 NaN\n", - "162 5.142209\n", - "164 NaN\n", - "166 NaN\n", - "168 NaN\n", - "170 NaN\n", - "172 NaN\n", - "174 NaN\n", - "176 NaN\n", - "178 NaN\n", - "180 NaN\n", - "182 1.798265\n", - "Length: 94, dtype: float64" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`leastsq` is a wrapper for `scipy.optimize.leastsq`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2.9e+02 3.0e-02 2.0e-02 1.0e-05]\n", - "[2.9e+02 3.0e-02 2.0e-02 1.0e-05]\n", - "[2.9e+02 3.0e-02 2.0e-02 1.0e-05]\n", - "[2.90000004e+02 3.00000000e-02 2.00000000e-02 1.00000000e-05]\n", - "[2.90000000e+02 3.00000004e-02 2.00000000e-02 1.00000000e-05]\n", - "[2.90000000e+02 3.00000000e-02 2.00000003e-02 1.00000000e-05]\n", - "[2.90000000e+02 3.00000000e-02 2.00000000e-02 1.00000001e-05]\n" - ] - } - ], - "source": [ - "best_params, fit_details = leastsq(error_func, params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first return value is a `Params` object with the best parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290.00000
    k10.03000
    k20.02000
    k30.00001
    \n", - "
    " - ], - "text/plain": [ - "G0 290.00000\n", - "k1 0.03000\n", - "k2 0.02000\n", - "k3 0.00001\n", - "dtype: float64" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "best_params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The second return value is a `ModSimSeries` object with information about the results." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    fvec[198.0, -71.52359999999999, -19.53553501808568...
    nfev5
    fjac[[nan, nan, nan, nan, nan, nan, nan, nan, nan,...
    ipvt[1, 2, 3, 4]
    qtf[nan, nan, nan, nan]
    cov_xNone
    mesgThe cosine of the angle between func(x) and an...
    ier4
    \n", - "
    " - ], - "text/plain": [ - "fvec [198.0, -71.52359999999999, -19.53553501808568...\n", - "nfev 5\n", - "fjac [[nan, nan, nan, nan, nan, nan, nan, nan, nan,...\n", - "ipvt [1, 2, 3, 4]\n", - "qtf [nan, nan, nan, nan]\n", - "cov_x None\n", - "mesg The cosine of the angle between func(x) and an...\n", - "ier 4\n", - "dtype: object" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "fit_details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have `best_params`, we can use it to make a `System` object and run it." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The solver successfully reached the end of the integration interval.'" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(best_params, data)\n", - "results, details = run_ode_solver(system, slope_func, t_eval=data.index)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results, along with the data. The first few points of the model don't fit the data, but we don't expect them to." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap08-fig04.pdf\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXhU5fXA8W8yWUgIhkDCvm9HQNlBRNEU3ELFahF3EdFWK7a21tZ9wapo1bqAViwqYkV+4i6IqFQUFBQiixo87BCWkEDCmpD998edhMkyYQLJzCQ5n+fJMzN3mXtyCXPmfe973xNSXFyMMcYYE2xCAx2AMcYYUxlLUMYYY4KSJShjjDFByRKUMcaYoBQW6ABqm4hEAoOBXUBhgMMxxhhTlgtoDSxX1VzPFfU+QeEkp8WBDsIYY0yVhgNLPBc0hAS1C+DNN9+kVatWgY7FGGOMh7S0NK6++mpwf1Z7aggJqhCgVatWtGvXLtCxGGOMqVyFSzA2SMIYY0xQsgRljDEmKFmCMsYYE5QsQRljjAlKfh0kISIXAo8BnYF04J+qOs19r9JBIM9j829V9Tz3fpe592sNfAWMV9V0f8ZujDHGv/yWoESkNfAOcImqzheRAcA3IrIcpyWXqaoVxoGLSC/gFSAJWAE8AcwGRvgr9hKLklOZOX8te7JyiI+LYlxSTxIHtvd3GMYY0yD4rYtPVXcBCe7kFAo0BwpwWk4DgVVedr0G+FhVl6jqEeBu4AwR6e6PuEssSk5l6pzVZGTlUAxkZOUwdc5qFiWn+jMMY4xpMPx6DUpVD4pINJALfAa8oKrrgQFACxFZIyK7RWSOiLR179YLSPF4j2wgFTjVn7HPnL+W3Pyyw/Rz8wuZOX+tP8MwxpgGIxCDJI4AjXGmIJogIjcAh4FvgJGAADnA++7tY4Dscu+RDUT7JVq3PVk51VpujDHmxPh9JglVLcIZDLFCRF4GfqOqF3luIyK3Axki0h4neUWVe5to4JA/4i0RHxdFRiXJKD6ufGjGGONfqamptG9f/66H+60FJSJni0hyucWRwD4ReVhEenosj3A/HsHp3hOP94kGOuDR7ecP45J6EhnuKrMsMtzFuKSeXvYwxjQEL730ErfffnuNvuf27dsREQ4cOHDMbd98800ef/zx0tf9+/dHVWs0nkDxZwtqFdDW3Tp6DjgNuAG4BPgLMEhErnJv+xwwT1UzRGQWsEREEoGlwGRgpaqu82PspaP1bBSfMcbTzTffHNDjZ2ZmUlxcXPp65cqVAYymZvlzFN9+YBTwWyATeBm4UVW/wklUWcAGYAtOF+C17v1+BCYALwF7gN7AWH/F7SlxYHteve88Pnr6N7x633mWnIxpQIqKinjssccYNmwYp59+OjfccAPbtm1jypQp3HLLLQBMmTKFu+++m1tuuYX+/fszevRoVq1axZ/+9KfS1yWtG8/9oOpW04IFCxgzZgxDhgxh8ODB3H333eTn57NgwQKmTZvGokWLuOgi50qJiLB2rTN466effuLaa69l0KBBnH/++bz55pul73nttdfyzDPPcMkllzBgwACuuuoqNm7cWGvn73j49RqUqv4AnFnJ8r3A1VXs9y7wbi2GZowJEpOmL2PF2t1+Odagni158MahPm37+eef8/XXXzN//nyio6N54IEHmDZtWoUyPh999BEvvPACU6ZMYeLEiVxzzTW88MILPPXUU9x1111MnTqVKVOm+Bzjjh07+Pvf/84rr7zCoEGD2Lp1K5dffjlffPEFSUlJrFu3jrVr1/Liiy+W2S8zM5Px48czceJEXn31VdatW8dNN91EbGwsF154IQAffPABM2bMICEhgdtuu40pU6bw7LPP+hxbbbOpjowxxgdNmjQhPT2dDz/8kLS0NB599FEeffTRCtv16dOHxMREXC4XQ4YMoWvXrpx99tlEREQwbNgwtm/fXq3jJiQkMHfuXAYNGsTBgwfJzMwkLi6O9PSqJ9NZuHAhCQkJXH/99YSHh9O7d2/GjRvHu+8e/a5/0UUX0blzZ2JiYjj//PPZtm1btWKrbQ2hHpQxpg7xtUXjb8OGDeOBBx5g9uzZPP7447Rv354777yzwnZNmzYtfR4aGspJJ51U5nVRUVG1jhseHs67777LO++8Q6NGjejVqxe5ubllrjtVJjMzkzZt2pRZ1rZtW3btOloXsHnz5qXPw8LCKCysUJIpoCxBGWOMD1JTU+nVqxezZ8/m4MGDzJo1iz//+c9cf/31ZbYLCQnx6f1CQ0PJz88vfb1v375Kt5s3bx4ff/wx7777Li1btgQovd5UldatW7Nz584Kv0N8fLxP8QUD6+IzxhgfLFu2jFtvvZWdO3cSExNDbGwsTZo0weVyHXvnSnTu3JmVK1eyadMmsrOzee211yrd7uDBg7hcLiIiIsjPz+eNN95AVUuTW0REBAcPHqyw39lnn01WVhYzZswgPz+flJQU3njjDUaPHn1c8QaCJShjjPHBmDFjOOecc7jssssYMGAAb7/9Ns8//7zPLabyzjnnHH79619z5ZVXMmrUKE4//fRKt7vkkkvo1asX55xzDmeddRbLli3jwgsvZP369QAkJiaydetWzj777DL7xcbGMn36dL744guGDh3Krbfeyo033sjll19+XPEGQsix+jHrOhHpBGxeuHAh7dq1C3Q4xhhjPGzfvp2RI0cCdFbVLZ7rrAVljDEmKFmCMsYYE5QsQRljjAlKlqCMMcYEJUtQxhhjgpIlKGOMMUHJEpQxxpigZAnKGGNMULIEZYwxxicHDhzwqcpvTbEEZYwxNWDEiBF88cUXgQ6j2u66665Ky4ZU5vzzz2fHjh21HNFRNpu5MaZOW5Scysz5a9mTlUN8XBTjknpatetakpmZ6dfjWQvKGFNnLUpOZeqc1WRk5VAMZGTlMHXOahYlp9bK8T777DPOP/98TjvtNO655x6uuOIK3nvvvQrblW9NeZZ3Ly4u5j//+Q+JiYkMHDiQG2+8kbS0NAC2bt3KzTffzJAhQxgxYgRTp06loKAAgNWrVzNmzBgGDRrEBRdcwPTp00vfPy0tjYkTJ3LaaadxzjnnMGPGDK+/Q0pKCmPHjqVfv35MmDChTNI5cOAAf//73xkxYgR9+/Zl9OjRLF26FIDf/va3AFxxxRV88skn5OXl8cgjj3DeeefRr18/zj33XObNm3ecZ7ZylqCMMXXWzPlryc0vW2QvN7+QmfPX1vixNm/ezB133ME999zDkiVL6NChAytXrqz2+7z99tu8+eabvPzyyyxbtow2bdpwzz33kJeXx4QJE+jYsSOLFy9mxowZfPLJJ7zyyisA3HfffYwZM4YVK1bw3HPP8eKLL5KamkphYSE333wzrVu35uuvv2b69Om89dZbfPDBBxWOnZeXxx/+8AcSExNZvnw5119/Pd98803p+ieffJKcnBzmzZtHcnIyZ555Jo888ghAaSKePXs2o0aN4tVXX+Wnn35izpw5/PDDD4wbN44HHnigNKHWBOviM8bUWXuycqq1/ETMmzePYcOGlZa1uOmmm5g1a1a13+fjjz/mmmuuoUePHgD87W9/Y/v27SQnJ7Nv3z7uuOMOwsPD6dChAxMnTuS5557jpptuIiYmhkWLFtGhQwcGDx7MihUrCA0NZfXq1Wzbto133nmHsLAwOnXqxPXXX8/s2bO5+OKLyxw7OTmZ7Oxsbr75ZlwuF8OHDy9TpuO2224jIiKCiIgIdu7cyUknneS1tPwVV1zBZZddxkknncTu3buJiori0KFD5OTk0KRJk2qfl8pYgjLG1FnxcVFkVJKM4uOiavxY6enppRVtwamc26pVq2q/z549e8qUYm/SpAk9e/Zk7ty5JCQkEB4eXrrOs0T7s88+y7PPPstdd93FgQMHSEpK4v7772fHjh3k5OQwdOjQ0v2KiorKlJ73PHZ8fHyZIovt2rUrLR+fnp7OY489xvr16+nUqRPx8fFeS8sfOnSIhx9+mNWrV9O2bVs6d+4McMxS9NVhCcoYU2eNS+rJ1Dmry3TzRYa7GJfUs8aP1apVK1avXl36uri4mN27d1e6bWhoKHl5eaWvPcu5t2zZsvSaEzhJ4/XXXycxMZH09HTy8vKIiIgAjpZoLygoYNOmTTz88MOEh4eTkpLCHXfcwcyZMxkyZAjNmzdnyZIlpe+ZmZnJkSNHKsTVokUL0tPTKSgoICzM+fjfvXs3LVq0AOAvf/kLY8aMYebMmYSGhvL555/z3XffVfo7Pvjgg3Ts2JEXX3yRsLAwUlJSmDt37jHPY3XYNShjTJ2VOLA9t47tS0JcFCFAQlwUt47tWyuj+EaPHs2yZctYvHgxBQUFvP7662USjadOnToxf/58cnJyWLduHQsWLCjzPv/973/ZvHkzeXl5TJ06lZSUFPr06UPLli15+umnyc3NZdu2bfz73/9m9OjRuFwu7rnnHmbMmEFhYSGtWrUiNDSU2NhY+vTpQ0xMDC+++CJ5eXlkZmZyyy238Pzzz1eIa+DAgTRv3pznn3+evLw8li1bxsKFC0vXHzp0iEaNGhEaGsrWrVt58cUXS0vLA4SHh5eWlz948CCRkZGEhoaSnp7O008/DVBm+xNlCcoYU6clDmzPq/edx0dP/4ZX7zuv1oaYt2/fnsmTJ/Pggw8ybNgwNm7cSJs2bcp0yZW48847ycjIYNiwYTzwwAOMGTOmdN2YMWO44ooruOGGGxg2bBhpaWlMnjyZ8PBwpk2bxubNmxk+fDhXXXUV5557Ln/84x8JCQnhueee44svvmDw4MGMGjWKoUOHcvnllxMREcHLL7/MmjVrGD58OKNGjaJbt2488MADFeIKCwtj2rRpJCcnM2TIEJ555pmSarYAPProo/z3v/+lf//+/P73v+eiiy4iPz+f1FRnVOSll17K7373O2bNmsW9997LkiVLGDhwIFdccQWDBw8mLi6OdevW1dg5t5Lvxhjjg507d5KdnU23bt1Klw0bNox//vOfnHnmmQGMrG6zku/GGHOC0tPTGTduHKmpqRQXFzN79mzy8vLo169foEOrt2yQhDHG+KBfv378/ve/59prr2X//v106dKFl156iZiYmECHVm/5lKBExAUMBAYBLYBCIA1Yrqqrai88Y4wJHuPHj2f8+PGBDqPBqDJBiUgc8CfgD0BzYBOwF3AB8UBHEdkFvAS8oKr7vL2X+/0uBB4DOgPpwD9VdZqIRABTgUtxkt+/VHWyx36XufdrDXwFjFfVyu8eM8YYUy94vQYlIuOAlUAH4AYgRlVFVYep6mmq2hVoBtwM9AZ+EpHrqni/1sA7wJ2q2gQYCzwrIgOASYAAXYHBwHXu4yMivYBXgPE4SXI9MPuEfmtjjDFBr6oW1GBgsKpmeNtAVQ8A84B57gR0L/C6l213iUiCqh4UkVCcZFMAHASuw2kVZQFZIvIUcBMwE7gG+FhVlwCIyN3ubbqr6vpq/r7GGGPqCK8JSlX/WJ03UtVdwK3H2OagiEQD+93HfgLIwOm6S/HY9BfgVPfzXsAKj/fIFpFU93pLUMYYU0+d0Cg+ERkMPKGqI6qx2xGgMdAH+AQomUgr22ObbCDa/Tym3Lry640xxtRDJzrMvBlw9jG38qCqRUAesEJEXsYZGQjgObtjNHDI/fxwuXXl1xtjjKmH/HajroicLSLJ5RZHAlk4Q9bFY/nJHO3yS/Fc5+4i7EDZLkFjjDH1jD9v1F0FtBWR24HngNNwRgdegpOgHhSRNThdene4twGYBSwRkURgKTAZWKmqNTfhkzHGmKDjtxaUqu4HRgG/BTKBl4EbVfUr4AHgJ+BnYDnwLs69Vajqj8AE9+s9OEPax/orbmOMMYHhtQUlIm/7sH+1qnWp6g9AhVkVVfUIMNH9U9l+7+IkLWOMMQ1EVV18h33Yf6P7p96as3Ad36zZyUM3nk7TJpGlyxclpzJz/lr2ZOUQHxfFuKSetTbNvzHGNERV3Qd1vT8DCVapuw+ycft+5i/dwpXnOWM1FiWnlqnimZGVw9Q5TqVNS1LGGFMzquriG+frm6jqzJoJJ/iMHNyBL5O38+nSLYwd2Z0wVygz568tU2IaIDe/kJnz11qCMsaYGlJVF9/T5V43A4qAnTj3MbXHmTR2Pc6URPVSn27xtE2IYUfGIb7/OY1hfdqwJyun0m29LTfGGFN9XkfxqWpCyQ/wELAI6KSqHVW1O9AO+BSY449AAyUkJIRRZ3QC4JNvNwMQH1f+vmGqXG6MMab6fB1m/iBwm6ruKFmgqnuAu3DKcdRrIwZ1IDLCxer1e0jdfZBxST2JDHeV2SYy3MW4pJ4BitAYY+qf6twH1bqSZV1x5tar12Kiwjm7fzsAPl26hcSB7bl1bF8S4qIIARLiorh1bF+7/mSMMTXI15kkXgNeF5GHcWpEheDMBHEv8GwtxRZUkoZ14rPvtrJw+TaudQ8pt4RkjDG1x9cEdTfOrOMPAi3dy3bhVMR9qjYCCzbd2jVFOsahW7P4auUOzh/aMdAhGWNMvVZVRd1h7sKCqGqRqj6kqq2BFkALVW3bUJJTiVHDOgPwyTebKS4uDnA0xhhTv1V1DeopIENEPhCRW0SkOziDI9wDJBqcM/u2ITYmgk0795OyOTPQ4RhjTL1W1TDzYUBnnBLupwDzRWSziLwsIpeKSJy/ggwWEeEuLhjaCYCPFtfrGZ6MMSbgqhzFp6oHVPV9Vb1FVbsBI4Bk4ApgvYh8JyKP+CPQYJE0rBOu0BCW/biL9MzyhX6NMcbUlGqV21DVzao6TVUvxbkW9ScawDBzT81jozizb1uKimHeN5sDHY4xxtRbPo3iq2JevmKcltSZwHeqml9jkQWxi87qwlcrt7Pgu61ceZ7QKNKfdR+NMaZh8PWTdTxwFk5rqaSSbXcgGtgKxAFZInKeqm6o6SCDTY8OcaVDzr9MTiXJPbrPGGNMzfG1i28VsABor6oDVHUAzlx8HwJvA/HAfOD5WokyCF00vAsAHy/ZZEPOjTGmFviaoK4H/qaqWSUL3CXc7wNuUtVCnBklzqj5EIPTsD5taB7biNTdh1i1LiPQ4RhjTL3ja4LKBTpVsrwzUFIYKRIoqIGY6oQwVyhJwzoBNljCGGNqg6/XoF4GXnPPxbcCJ7ENBO4HpotIC+AZ4H+1EmWQOu+0jsz+TFmekkZGVg4JVm7DGGNqjE8tKFV9ACcB3Q0sBb4B/g487l42ENgP3Fo7YQanuCaNGHZqG4qKYcGyLYEOxxhj6hWfx0er6uPA4yLSHMhX1QMeq+e7fxqcUWd05utVO/jsu61cfq4QHlatW8uMMcZ44XOCEpFEoDfOtSZEpHSdqv6rpgOrK3p1bkaHVk3YlnaQZT/tYni/toEOyRhj6gVfb9R9FvgjsI2KM0cUAw02QYWEhDBqWGdeem8Nn3y72RKUMcbUEF9bUOOACar6em0GU1f9amA7Xp/3Mz9t3Mu2tAN0aHVSoEMyxpg6z9cLJtnA97UZSF0W3SicxAFOdd35324JbDDGGFNP+JqgHgGeEhGb08eLknuiFq5IJSe3wdwOZowxtcbXLr61wGPABs/BESVU1VWTQdVFndvE0qtzM1I2Z7Loh+0knd4p0CEZY0ydVp0bdZcBr+F09x0XETkX596p7kA68KSqThORSOAgkOex+beqep57v8twEmRr4CtgvKqmH28ctWFRcirbdx8CYNp7a2gU7uJXg9oHOCpjjKm7fE1Q7YEkVd10vAcSkfbAu8B1OJPMDgQWiMgWYC+QqaqtKtmvF/AKkIQzi8UTwGyc4olBYVFyKlPnrCY335n1qbComClzVhESAokDLUkZY8zx8PUa1Oc45TZORCdglrtCb5GqLgcW4UwwOxBnxvTKXAN8rKpLVPUIzswVZ4hI9xOMp8bMnL+2NDmVyC8oYub8tQGKyBhj6j5fW1DfAVNFZAywAShTmFBV/36sN1DVxcDiktci0gwYDrwBXAC0EJE1QEvga+DPqroD6IXTcip5n2wRSQVOBdb7GH+t2pOVU+nyDC/LjTHGHJuvLahzgeVADNAPGOzxM6i6BxWRWOAjnMT3IXAYZ36/kYAAOcD77s1jqHjdKxunWGJQiPcySWzjRlZp1xhjjpdPn6Cq+quaOqCI9MBJSinA1apaBNxebpvbgQz3davDQPkMEA0cqqmYTtS4pJ5lrkGVCAmBwsIiXC6bn88YY6rL6yeniDwoIj7XjxCRJu5yHFVtcxZOq+kD4FL3NSVE5GER6emxaYT78QhOIhOP94gGOriXB4XEge25dWxfEuKiCAESmkbRNCaCQzkFfJ+SFujwjDGmTqqqBbUf+FlE3gHeU9Vl5TcQkRCcLr5rgN/ilOSolIh0BeYC96rqlHKr+wCDROQq9+vngHmqmiEis4Al7slqlwKTgZWqus6XX9BfEge2LzNi74OvNvLKRz8xd8lmTj+1TQAjM8aYuslrglLVZ93J6e/AZyJSgHPD7h5wGgo4s5uHADOAM1R1WxXHmgg0ASaLyGSP5S8ANwDP4wzACAPmAb93x/GjiEwAXgLa4rTAxlb7N/WzRhHOvctrNuxh3KRPmXBhbxtybowx1RBSXFx8zI1EpDGQiDMcvCVQBKQBycCXqppbizGeEBHpBGxeuHAh7dq188sxy98XBRAZ7uLWsX0tSRljjIft27czcuRIgM6qusVzna+DJA7jtGrm1Xh09VBl90Xl5hcyc/5aS1DGGOMjG15WC7zdF+VtuTHGmIosQdUCb/dFxTf1eVCkMcY0eJagasG4pJ5Ehlec4P203hWmGjTGGOOFTXVQC0quM82cv5Y9WTk0jgrnUE4+G7bvC3BkxhhTd/iUoNz3O12MM4ovHGdoeSlf5uJraDzvizqSW8D4f3zGL1uzWLctix4d4gIcnTHGBD9fu/ieBebglLwYwgnOxdfQNIoM44KhHQF4f9GGAEdjjDF1g69dfGOBm1V1em0GU5+NHt6FD77ayLdrdpK29zCtmjcOdEjGGBPUfG1BReJUsjXHqXlsFGcPaEdRMXy0+LjrPhpjTIPha4J6FbhDRGxQxQm4+OyuAHz+3VYOZucdY2tjjGnYfE04XYALgctEZCtQ5tNVVYfUdGD1Uec2sfTvkcDKdRl8unQLY0f2CHRIxhgTtHxNUGvcP+YEXZLYjZXrMvh48SYuPrsr4WEV75cyxhjj+1x8k2o7kIaiX48EOrU+iS27DvDVD9s5Z0jHQIdkjDFByeeZJEQkSUQWi0imiOwTkWUickVtBlcfhYSEcEliNwDeW7SBoqJjzyZvjDENkU8JSkTG4VTB/RG4Fae20w/AayJyde2FVz8N79eWhLgoUncf4rufdwU6HGOMCUq+XoO6G7hdVV/wWPamiKwB7gLerPHI6rHwsFB+m9iNae//yNsL1zP0lNaEhIQce0djjGlAfE1QHYFPK1n+BVWUeTeORcmppfPyxcdFMS6pJ+ee1pH/+3wdG1L3sWpdBv2lRaDDNMaYoOLrNaj1wMhKlp8DVFXmvcErqa6bkZVDMZCRlcPUOatZumYnF53VBYA5C9cHNkhjjAlCvragngBeFZHewDL3stOB3wG31EZg9UVV1XWn/PVXvPu/9fy4cQ9rN2fSs3OzAEVpjDHBx6cWlKrOAm4AhgGvAFOBAcBYVX2t9sKr+6qqrts4Kpxfn+m0ot5euM6fYRljTNDzeeoiVX0TGwxRbfFxUWRUkqRCQkO46K8f0iy2Ea7QEFas3c2mHfvp0jY2AFEaY0zw8ZqgROSfwCRVPex+7pXVg/JuXFJPps5ZXaGbr+T+p737j+AKdUbwzf5cuWe8zRpljDFQdQtqME5xQnBqQHm7o9TuNK1C+eq6IaEhFW7OLXS/XvrjLmtFGWOMm9cEpaq/8nie6G07ERsffSye1XUv+uuHVW771me/cO/1p/kjLGOMCWq+ziRRKCIJlSzvAFhxo2qIj4uqcv2yn9LYsH2fn6IxxpjgVdU1qCuBS9wvQ4DpIpJbbrOOQGYtxVYvebsm5WnK/63kub/+yut6Y4xpCKpqQX0OHAIOu1/nuJ+X/BwCvgMurs0A65vEge25dWxfEqpoSW3aeYD1qVl+jMoYY4JPVdeg9gATAERkC/CUqh72tr0vRORc4HGgO5AOPKmq00QkAufeqkuBQuBfqjrZY7/LgMeA1jil58eravqJxBJIJdekLvrrh15HmMxaoDx441C/xmWMMcHE53pQItJCRPoBJRX2QoBIYKBnMvFGRNoD7wLXAR8CA4EF7uSXCAjQFYgFPhWRHao6U0R64dwcnASswJnVYjYwwsffMWh5u0cKYMXa3Ta7hDGmQfN1kMQNQCqwGPgSWOR+nA9c5uOxOgGzVPV9VS1S1eXu9zkDJ2k9qqpZqroFeAq4yb3fNcDHqrpEVY/gzKx+hoh09/G4QWtcUk8iw8tW1I0Md3Fa71YAzJj3M8XFNorfGNMw+TpZ7N04XXAJwF6gBzAUUGC6L2+gqotV9eaS1yLSDBgOrMTpukvx2PwX4FT3816e61Q1GydZnkod53k9KgRIiIvi1rF9+cuVA2gSHUHK5kyWr90d6DCNMSYgfE1Q7YEXVHUvTkLprarfA7dxHJPFikgs8BHOIItk9+Jsj02ygWj385hy68qvr9MSB7bn1fvO46Onf8Or950HwB+f/pKD2XkAvDhnVemNvMYY05D4mqD2AyXDztYBfd3PFafrzmci0gNnRvTdOIMiDrpXeQ5ri8YZJQjOiMHyQ94819cbnqU5Suw9kMtL764OYFTGGBMYviaoz4F/iUgn4FvgChHpCFyNk2h8IiJn4bSaPgAuVdUjqpoFpOEMkihxMke79VI814lINNCBsl2C9UJlpTkAPvt+G3lV3DdljDH1ka+zmf8FmAlcCLyEUwdqM1AA/N6XNxCRrsBc4F5VnVJu9RvAg+4S8jHAHcBz7nWzgCUikggsBSYDK1W13tWn8Faao6iomHGTFpCdk19akbdk6iRjjKmvfE1QpwCXqGrJJ+gI9/Dvfaq608f3mAg0ASaLiOew9BeAB4CngZ9xWnUv4yRCVPVHEZngft0WpwU21sdj1ilVDTs/nJMPHK3IC1iSMsbUa74mqP3VZeUAAB9gSURBVLdx7jtaU7JAVavVxaaqtwO3V7HJRPdPZfu+i3MPVb3myzRIcLQiryUoY0x95us1qA0cHRhhakllw8698dYdaIwx9YWvLaj1wAwRuRvYiDMvXylV9fVmXXMMnqU5ACY88lml3X7HmhXdGGPqOl9bUAU4gyS+A/ZQdtLYE5qfz1Ststkmwl2hjEvqGaCIjDHGP3xtQb0GLFXVfM+FIhIJjKrxqEwpz4q8JS2pxlFhnNG3bSDDMsaYWudrC+pLoGkly7vgDAM3tahkton3/zmadi1i2Hcojw++2hDosIwxplZVVbDwD8Ak98sQIEVEys+5E4Mz9ZHxgzBXKDddcir3T1vK7M/XcVb/drRsVi9mfDLGmAqq6uL7D871pVDgVeAfOFMelSjGmW5oYa1FZyro16MFZ/Vry9erdvDy+z9y/w2nBTokY4ypFVUVLCwZGIGIbAa+cS8zAXbDb05hxS+7+T4ljWU/7WLoKa0DHZIxxtQ4XwdJfA1cLCIDgXCcLr9Sqvr3mg7MeNfspEZcc0FPXv7gR6a9/yN9uycQFenrP6UxxtQNvg6SeBaYg1PVdggw2ONnUO2EZqoyalgnurSNZc++HGZ/poEOxxhjapyvX7vHAjerqk/FCU3tc7lCmXhpX+54/ms++Hojw/u1pVv7ygZaGmNM3eRrCyoS+Ko2AzHV16NDHKPP7EJRUTHP/d9K8guKAh2SMcbUGF8T1KvAHSJiFzqCyKLkVL79cRcAW3Yd4Kk3VwQ4ImOMqTm+JpwuOLWgLhORrUCe50pVHVLTgZmqlVTf9Zz5/Ns1u3hn4TouHdkjgJEZY0zN8DVBrcGj1IYJPG/Vd99c8AuXJHbD5fK1cWyMMcHJpwSlqpOOvZXxJ2/lNgoKi3lv0QbGWivKGFPH+XxNSUROA/4K9ABGA1cCm1V1Ti3FZqpQVfXdWQt+ob+0oFs7G9VnjKm7fOoHEpFRwP+ALEBwbtYNA/7rLsdu/KyyMhyR4S769YinoLCYp99M5kieTfxhjKm7fL1Q8TDwZ1W9Cac2FKr6GHArYLNIBEBl1XdvHduX+yYMpX3LGLanH+L1uSmBDtMYY46br118PYEvKlm+EHi+5sIx1VG++m6Jv141kDue/5q532wmIjyUxat3sicrh/i4KMYl9ax0H2OMCTa+tqC2U/mURucCW2suHFMTurZrytUXOBV331u0kYysHIqBjKwcps5ZzaLk1MAGaIwxPvA1QT0KTBORuwEXcKGI/At4BniytoIzx++SxG6Eh1X8583NL2Tm/LUBiMgYY6rHpwSlqjNxRu2dj1MjahIwFLhKVV+pvfDM8XKFhnid+sjbEHVjjAkm1Zm66DNgharuBRCRwVg13aCW4GUoenxcVACiMcaY6vF1mHkvYCNwl8fij4EfRaRrbQRmTlxlQ9EjwkMZl9QzQBEZY4zvfL0GNRVYjNO1V6Iz8J17nQlCpUPRmx5tMcXHRnFG37YBjMoYY3zja4IaDDysqodKFqhqDvAIcEZtBGZqRuLA9rx6/3nMfOh8msc2Yueew/znwx8DHZYxxhyTrwkqEzilkuU9gIM1F46pLXFNGnHP+CGEh4Uy/9stfLp0S6BDMsaYKvk6SGI68LKItAdWAMXAAOB+oNqj+ERkCDBXVVu4X0fiJDrPMh7fqup57vWXAY8BrXEKJ45X1fTqHreh69EhjomX9uXZ2SuZ9v4aOrRqQq/OzQMdljHGVMrXBPWoe9v7gQT3snSqeR+UiIQANwBPlVt1KpCpqq0q2acXThJMwkmOTwCzgRG+HtccNXJwBzbt2M9HizcxecZynv7zWbSIiw50WMYYU4Gv90EVqeqDqtoSaAE0VdVWqvqEqlanzvgk4A841648DQRWednnGuBjVV2iqkeAu4EzRKR7NY5rPEwY3Zu+3ePZdyiXh6cv43BOfqBDMsaYCnyuaici/UXkRmAscI2I3FLyU43jvaSqA3FaQp4GAC1EZI2I7BaROSJSMtSsF1A666mqZgOpOK0ucxxcrlDuGjeYdi1i2Jp2kMdfX05BYXW+ZxhjTO3z9T6oe4Fk4HGc2cv/5vFzh68HU9WdXlYdBr4BRuKU88gB3neviwGyy22fDVi/1AmIiY7gwRuH0jQmklXrM3jxndUUFxcHOixjjCnl6zWoG4H7VfXR2ghCVW/3fC0itwMZ7kEZh4HyUx9EA4cwJ6RV88bcf8Np3P3iN3z+/TZaNovm8nMl0GEZYwzgexdfc+Dt2gpCRB4WEc/pDSLcj0dwuvfEY9tooAMe3X7m+PXoEMcdVw8kJAT+++kvzF+6JdAhGWMM4HuCege4uhbj6AM8LSJNRaQp8BwwT1UzgFnAb0Qk0T0cfTKwUlXX1WI8DUpuXgGNG4UD8OI7q5n23poAR2SMMb538eUAd4vIWGA9Ze9XQlUvO8E4bsApfLjBHdM84Pfu9/7RXVb+JaAtzvRKY0/weMZtUXIqU+esJje/sHTZ3G82ExHh4voLewcwMmNMQ+drgorGacnUCFVdBDT1eL2XKlpoqvou8G5NHd8cNXP+2jLJqcR7X25gSK9W9O5iN/IaYwLDpwSlqtfXdiAmMKqqDTVp+lIe+t3pNtuEMSYgfK4HJSKn4gwx741z7eoX4HlV/baWYjN+EO+lZlRkuIuc3EIe+s9SJv1uGD07NwtAdMaYhszX+6CSgB9wRvO9A8wBmgBfich5tReeqW2V1YyKDHdxy5g+nNW/LTm5hTz4n6X8siUzQBEaYxqq6szF94iqetaDQkTuA/6BU23X1EGJA9sDzrWoPVk5xMdFMS6pJ4kD23P2gHZQDF+v2sEDLy/l/htO49Su8QGO2BjTUPiaoHoClY3Umw3cU3PhmEBIHNi+NFF5crlCuf2qARACX6/cwUMvL+XO6wYzpFeFOX2NMabG+Xof1DagfyXLB+LMam7qKSdJDSTp9E7kFRTx6Gvfsyg5NdBhGWMaAF9bUC8AL4lIO2CZe9npwL3AP2sjMBM8XKEh/GFMH2Kiw5mzcD3/eusHDmbnM3p4l0CHZoypx3wdZv68iDTBKXVRchFiJ/Cgqk6treBM8AgJCWHcqF40bhTOjHkpvPzBj+zOzOb60b1xhYYEOjxjTD3k8zBz90Sxj4pICyBHVa3UewM0ZkR34k6KZMrbq/jw642kZ2Vz+1UDaBTh85+SMcb4pMprUCISKSI3i0hcyTJ3qfXfi8hEEYmoYndTT40Y1IGHfnc6jRuFsfTHXdz772/IPHAk0GEZY+oZr197RSQWZ/h4H5xqt8s8VrcBbgKuFJEka001PH27J/DPPw5n0vRlrNu2j7888xXnn96RL77fVmG4ujHGHI+qWlD348zB111VPZMTqvpX4BQgARtm3mB1aHUST912Fr06NyPzwBHeWqBkZOVQDGRk5TB1zmob8WeMOW5VJajfArer6vbKVqrqFuBO4NJaiMvUEXFNGvHIzWfQKNJVYV1ufiEz568NQFTGmPqgqgTVCjhWzaVVON19pgELDwslN7fijOhQ9WS0xhhTlaoSVCrQ4xj7dwfSai4cU1fFx0VVurxJYxtHY4w5PlUlqLeBh7yN1HMvfwiYWwtxmTqmsklnAQ4czuOZt37gcE5+AKIyxtRlVd28Mhm4GEgWkeeBFcB+IA4YDPwRcOFMFmsauAqTzjaNok/3eBav3MH/VqTy48Y9/PmK/vTplhDgSI0xdYXXBKWq2SIyDHgCeBKnvAZACLAXeAP4h6pm1XqUpk6obNLZMb/qzjNv/cD61H3c++9vGT28C9cm9SQq0m7sNcZUrcobdVX1oKreArTAKVR4JiBAC1W93ZKTOZb2LZvw5B+Hc/UFJ+MKDeHjxZuY+OT/WLF2d6BDM8YEOV/n4svDqaBrTLW5XKFcca4wuGdLpsxZxcbt+5k0fRln9m3D7y4+lWYnNQp0iMaYIORruQ1jTljXdk15+k9nccNFvYmMcLFk9U5ufnwh7325nvyCyoepG2MaLktQxq9crlAuPrsbL/xtBEN6tSInt4DX5qYw8ckv+T4ljeLi4kCHaIwJEpagTEC0bBbN/TecxqTfnU67FjHs2nOYf7zyHff8+xt+2ZoZ6PCMMUHAEpQJqAEnt2DKHb/ixt+cQpPocH7auJe/Pb+YR1/7jm1pBwIdnjEmgGysrwm4MFcovzmrKyMHd+C9L9fz4debWPZTGt/9nMawU9tw+bk96NwmNtBhGmP8zBKUCRoxUeGMG9WLZrGNeH1eCkdyC/lmzU6+WbOT03q3YsyvutOzc7NAh2mM8RNLUCaoLEpOZcbHKeTmlx3V993PTotKOsZx8dldOf2U1rhc1kNtTH1mCcoElZnz11ZITgDRjcIIDQlBt2bxxMwVJMRFccHQTpw7pANxdh+VMfVSQBKUiAwB5qpqC/frCGAqTm2pQuBfqjrZY/vLgMeA1sBXwHh36XlTz3grz5FzpIC3H/s1/0tO5cOvNrJzz2HemL+WWQt+4fRTW3P+0I6c2i0BV2iInyM2xtQWvyYoEQkBbgCeKrdqEs4USl2BWOBTEdmhqjNFpBfwCpCEM2HtE8BsYITfAjd+Ex8XRUYlSSo+LopGkWGMGtaZC4Z2YtW6DOYv3cz3P6exZPVOlqzeSXzTKH41sB0jB3egbUJMAKI3xtQkf7egJgG/Bh4B7vNYfh1OqygLyBKRp4CbgJnANcDHqroEQETudm/TXVXX+zV6U+vGJfVk6pzVZbr5IsNdjEvqWfo6NDSEASe3YMDJLdizL4fPv9vKwhWp7M7MZs7C9cxZuJ5u7WIZ3q8tZ/ZtS4tm0YH4VYwxJ8jfCeolVX1ARBJLFohIU5yuuxSP7X4BTnU/74XTcgJKZ1lPda+3BFXPVCjbERfFuKSeFWZJLxHfNIorzz+Zy88VUjbvZeHyVL5Zs5MN2/ezYft+XpubgnSI47RTWjH0lNa0b9mk0vcxxgQfvyYoVd1ZyeKSvphsj2XZQLTH+mzK8lxv6pnKynYcS2hoCKd0jeeUrvH8YUwfkn/Zzdcrd/B9ym50Wxa6LYuZn6ylbUIMg3u1ZODJLejdpTnhYRWLLBpjgkMwjOI77H70rBkeDRzyWF++nrjnemPKiAh3cfqpbTj91DYcyS1g5bp0lv2Uxvc/p7Ej4xA7vjrEB19tpFGEi1O7xdO3ewJ9usXTsdVJhNogC2OCRsATlKpmiUgaziCJHe7FJ3O0yy/FvQ4AEYkGOlC2S9CYSjWKDCtNVgWFRazdnEnyL7tJ/iWdLbsOsDxlN8tTnNpUsTER9O7SnF6dm9OrczO6tIm1e62MCaCAJyi3N4AHRWQNTpfeHcBz7nWzgCXu61ZLcUrRr1TVdbUd1KLkVJ+vhZjg4+3f79Ru8Yy/sDd79+ewal0GazbsYfX6DPbuP8K3a3bx7ZpdAERGuOjWrik9OsTRo0NTurVrSstm0YSEWCvLGH8IlgT1APA08DPOBLYvAy8BqOqPIjLB/bot8B0wtrYDWpScWmY0WUZWDlPnrAawJFUH+PLv1zw2ipGDOzBycAeKi4vZuecwKZv2krI5k5TNe9m55zA/b9rLz5v2lr5v46hwurSJpUvbWDq1bkKHVifRoWUTGlkJe1PPFRUVk5dfSF5BEXn5hSxevZ33F20k60AuCbX0BT6kvtffEZFOwOaFCxfSrl07n/eb8Mhnld6PkxAXxav3nVdzAZpaURP/fvsP5bI+dR/r3IMsNm3fz75DuZVu26JZNO0SYmjbIoa2CTG0iW9M6/jGJDSNsm5CU+OKi4vJLygiN7+QvPxC92ORx/OS5UWlzz2Ti7ft8/KLyCs4um++x/sUFBZVGVNkuItbx/atdpLavn07I0eOBOisqls819nXPi+8zWjgbbkJLjXx7xcbE8mgni0Z1LMl4HwoZB44wqYd+9m0cz/bdh1k2+6DbE8/SHpmNumZ2fxQboITV2gICXFRtIiLLn2MbxpF89hGxMc6j42jwq3bsB4oSRolH/q5ee5Hj+eliSPP+dDPzS/wWFfksa6wzPuUSTjuBBKItkVEuIuIsFCyj+RTVO74ufmFzJy/tkZbUZagvKhqRgMT/Grj3y8kJITmsVE0j41icK9WpcsLCovYteewM0Iw/RA7Mg6xa+9h0vYcZs/+I6TtzSZtb/k7JY4Kc4USd1IkcU0iiY2JJLZxJLExEZzUOIIm0RHEREfQJDqcmOgIohuF0bhROFGRYTbi0AeFJd1SFVoHR5d5JoHKEkNJ8vB8XT7plDz6M2mEuUKJDA8lItxFZITLSR7hLiLdSaTM65Ltwo9uFxEeSkRY2fURlW3rfq/wsNDSL1IX/fXDSmOq6S/wlqC88GVGAxO8/PnvF+YKpX3LJpXeBJyXX0h6VjbpWTlkuB/37Mth7/4c9u4/wt79R8jJLSAjK6fShOpNSAg0iggjKtJFVGQYjSLDaBQRRmTJh1XY0Q+a8LBQ58cVSpj7eZgrFJcrlLDQEFyuUFyhIbhcIbhCQwgJCSE0NITQ0kcnOYeGhIA7J1aWGotxWhHFxc6LYoopKoKi4mLnp8j5KSzzWERhUTEFhcUUFhY5j0VFFBQUke9+XVBYRH5BEfkFhe5H56egwEk4Ja9LurDyC462RgrLf82vZeFhRz/cS/8twkOJDA9zHiOOfvCXPPd8XZIwKtsvWdN5/8sNZO4/QnzTKMaNCtygLX99gbcE5UV1ZzQwwaUm//1OZDRnRLiLdi2a0K6F9xksjuQVsO9gLvsO5pJ1MJcDh3M5cDiP/YfyOJidx6HsfOcxJ5/sI85PTm4hObkF5OQWAJVfFzNOIo+opEURHhZa2upwWhyeScEzSRzdxnP7MonGY11tTVa8KDmVN+Ydnek/Y19gB2356wugJagqHM+MBiZ41MS/nz9GczaKCKNV8zBaNW/sc0wzP1nLnn05NIttxOjhXejTLb60y+lIntP9lF/amigkv/BoqyO/sIhCd8uksLCYgqIiigqL3S2ZIoqLKdPiKcZpFZVvjRQXF1e4duY0skKcx5KWV0lrLMRppYWGOC21UHeLLTQkhDBXKLv2HkK37iMnt4DoRmH075FAt/ZxFVqAEWFOgnGeH20lOl1eLsLdXVcR4c6y472+V9kXk6GntD6u9zpRlZWhqY1rPr7y1xd4S1DGVCHYPhjKJ8y9+4/w1gKl+UmNqh1PMN3ntyg5lf+tSC39vbKPFLBibTpDT2kdFOc50LeZBOOgLX98gbfxr8ZUIdg+GKpKmNVR8gGckZVDMUc/gBclp9ZgtL6rqd+rvsbj7dpOfR+0ZQnKmCoE2wdDTSXMYPsADrYvAsEWz7iknkSGl53YuCEM2rIuPmOqUJMXg2uiS62mRk8F2wdwsN3WEWzxNNRBW5agjKlCTX0w1NQ1jZpKmMH2ARxst3UEWzzQMAdtWYIy5hhq4oOhpgZb1FTCDLYP4GBrIQRbPA2VJShj/KAmu9RqImEG4wdwsLUQgi2ehsgSlDF+EGxdamAfwCb42Sg+Y/ygoY7CMuZEWAvKGD8Ixi41Y4KdJShj/MS61IypHuviM8YYE5QsQRljjAlKlqCMMcYEJUtQxhhjglJDGCThAkhLSwt0HMYYY8rx+Gx2lV/XEBJUa4Crr7460HEYY4zxrjWw0XNBQ0hQy4HhwC6g8BjbGmOM8S8XTnJaXn5FSHFxccXNjTHGmACzQRLGGGOCkiUoY4wxQckSlDHGmKBkCcoYY0xQsgRljDEmKFmCMsYYE5QsQRljjAlKlqCMMcYEpYYwk8RxE5G+wEtAH2ATMEFVK9ztHEgici7wONAdSAeeVNVpIhIJHATyPDb/VlXPC0CYFYjIBGAakOuxeCLwFjAVuBRn5o9/qepk/0dYlohcjROvpyhgITCaIDvXIjIEmKuqLdyvI6jivIrIZcBjOHf0fwWMV9X0AMfcAngOGAmEAPOB21Q1y71+JnAZUODxNn1UdVMAY67y/12QnudD5TYJAyKBtqq6M5Dn2RKUF+7/0B8CzwJnAWOAz0Sko6oeCGhwbiLSHngXuA4n1oHAAhHZAuwFMlW1VcACrNoA4GlVvctzoYhMBgToCsQCn4rIDlWdGYAYS6nqm8CbJa9FpD/wGfA34FSC5FyLSAhwA/BUuVWT8HJeRaQX8AqQBKwAngBmAyMCHPN0YD/QGQgH3gBeAK5yrx8AXKyqn/ojTk9VxOz1byFYz7OqxnhsEwZ8CSxS1Z3uxQE7z9bF510iEK6qz6pqvqrOBn4GLg9sWGV0Amap6vuqWuRu3S0CzsBJVqsCGNuxeIvvOuBRVc1S1S04/5lu8mdgxyIi4TjJ6iFVXU1wnetJwB+AR8otr+q8XgN8rKpLVPUIcDdwhoh0D1TMIhIKFAGTVPWwqu4D/gOc6V4fBZxM4M67t/Nc1d9C0J3nStyJ82XgQQj8ebYE5V0vYG25Zb/gfEMKCqq6WFVvLnktIs1wJsZdifOtp4WIrBGR3SIyR0TaBipWTyLiwuk2vVZEdorIBhG5S0TicLo+Ujw2D6pz7jYRyAFedL8OpnP9kqoOxPmGDoCINKXq89rLc52qZgOp+O+8V4jZ/YXrYlXd4LHdxTh/2wD9cLqc/iMiGSLyg4hc6Kd4oZKY3ar6Wwi68+xJRNoA9wA3q2qRe3FAz7MlKO9igOxyy7KB6ADEckwiEgt8BHyH0913GPgGp/9ecD5Q3w9YgGUl4PwneR2n++ZSnG92f3Sv9zzvQXXO3V2/f8NpPZXMtBw059qjW8ZTSReOt/Ma0L91LzGXISJ34CSoO92LmgCLcVoFbYBHgbfd141rXRUxV/W3EOzn+S/Ap6rq2VoK6Hm2a1DeHca5CO4pGih/QTHgRKQHTlJKAa52f/u5vdw2twMZItJeVVMDEGYpVU0DzvZYtEpEpuD0zUPZ8x5s5/wCnK6neSULVDVoz7XbYfejt/MatH/r7u7UKTgDUUao6i8AqvoZzjXAEu+KyPXARcBqvwfqVtXfAsF9nl043cBlCucF+jxbC8q7FJxvQJ5Opmw3ScCJyFk4raYPgEvdfduIyMMi0tNj0wj34xE/h1iBiPQWkUnlFkfgxJZG2fMebOf8N8DbHl0gQX2uAdyj3qo6r2X+1kUkGuhAgM+7iDQBPgcGA0M8v9mLyGgRua7cLiV/QwFzjL+FoDzPbsPcjws9Fwb6PFsLyrsvgRAR+QvO8NwxONdNgqWbDBHpCswF7lXVKeVW9wEGiUjJiKfngHmqmuHPGL3YB/xVRLbjjGrqD/wJuBVnIMqDIrIGp0vkDpzYg8VQ4P5yy4L5XJd4A+/ndRawREQSgaXAZGClqq4LRKAeZuN8iR7uvl7jyQU8JyJrgWScwUvDgBv9G2IFXv8WRCRYzzM4f9fLPL94uQX0PFsLygtVzcPpchoDZAL34gy1DKYPnYk4fcSTReSQx88TOMNJs4ANwBac+zKuDVikHlR1B04XwU3AAZyh8v9Q1XeAB4CfcBLVcve6lwIUamU6AeX78oP2XHvwel5V9Udggvv1HqA3MDYwYTpEpA8wChgCpHv8bW8HUNUPcP5PvoXzN/RX4EJV3RaomN28/i0E43n20ImKf9cBP89WUdcYY0xQshaUMcaYoGQJyhhjTFCyBGWMMSYoWYIyxhgTlCxBGWOMCUqWoIwxxgQlu1HXGB+JyAyc6WC8mYQzm/yXQBNV9csUNu5par4Bxh3PTZ8iUgyMVtW5Pmw7FViuqq9XP1JjqsdaUMb47jacWcFb45RjAedG0pJlTwHfup8frmT/2vInYPUJzEjQGmdKIV88DDwsIs2P81jG+Mxu1DXmOIjIKcCPQGd3faVAxdEI2IYzkepPfjrmq8A2VX3IH8czDZd18RlTg9zzrJV28bm7z67EKU4nOGVGrsEp2XEtzvQxd6vqG+79mwBP45QgKQb+h1Pm3FuphCuAfSXJSUQ6AZtxppL6F9AO+AKnnMlTOLOC7wJucc9UXaaLT0QW4ZQi7wuch1Ov6ElVne5xzPeAV0TkUVXNP+6TZcwxWBefMbXvceDPOBNydgB+wElMg3E+7KeJSEnNppdxEtn5OCVJioEF7lLclfk1UFkp7n/glEY/F6c7cg1O9+NAnKJ/0yvZp8SdOF1+/XGS279FxLOE+RdAc/d7GVNrLEEZU/teUNUv3eUi5uLU/7lHVRWnlRMFdBaRLjgtoqtUdbm7VXQtzkSeF3h570E4E8CW96j7PZbgFJxLUdXn3fWUXgDau1trlVmkqi+447sbp6elT8lKd0mXTe5jG1NrLEEZU/s8y5ZnA1s8qvGW1NWJxCkJDqAls3cDe4HGVKxNVqIlzszYxzrmJo/XnsesTOlgC1U94H4aXm6bvUALL/sbUyPsGpQxta/8dZryNXdKhLm37Y/Ttecp08s+RUDICRyzMnmVLCt/DBdQWI33NKbarAVlTPBYi9NSaayqG1R1A86AhieBHl72SQMS/BSfp3j3sY2pNZagjAkS7ms+HwEzRWS4iJwMzMQZXPGLl92ScUbc+Y2IxAIdcQofGlNrLEEZE1yuwxmK/gFOAogFzlXVfV62n4cz2s+fzsRpPa3083FNA2M36hpTh4lINE5p8QtU9Qc/HfMtnFGB//DH8UzDZS0oY+owVc3GuUY10R/HE5HWOC22F/xxPNOwWYIypu57BugjIt6Gotek+4D7VNXbqEJjaox18RljjAlK1oIyxhgTlCxBGWOMCUqWoIwxxgQlS1DGGGOCkiUoY4wxQen/ASvHNQJHt4xeAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.G, label='simulation')\n", - "plot(data.glucose, 'bo', label='glucose data')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')\n", - "\n", - "savefig('figs/chap08-fig04.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interpreting parameters\n", - "\n", - "Based on the parameters of the model, we can estimate glucose effectiveness and insulin sensitivity." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "def indices(params):\n", - " \"\"\"Compute glucose effectiveness and insulin sensitivity.\n", - " \n", - " params: sequence of G0, k1, k2, k3\n", - " data: DataFrame with `glucose` and `insulin`\n", - " \n", - " returns: State object containing S_G and S_I\n", - " \"\"\"\n", - " G0, k1, k2, k3 = params\n", - " return State(S_G=k1, S_I=k3/k2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    S_G0.0300
    S_I0.0005
    \n", - "
    " - ], - "text/plain": [ - "S_G 0.0300\n", - "S_I 0.0005\n", - "dtype: float64" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "indices(best_params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Here's the source code for `run_ode_solver` and `leastsq`, if you'd like to know how they work." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def run_ralston(system, slope_func, **options):\n", - " \"\"\"Computes a numerical solution to a differential equation.\n", - "\n", - " `system` must contain `init` with initial conditions,\n", - " and `t_end` with the end time.\n", - "\n", - " `system` may contain `t_0` to override the default, 0\n", - "\n", - " It can contain any other parameters required by the slope function.\n", - "\n", - " `options` can be ...\n", - "\n", - " system: System object\n", - " slope_func: function that computes slopes\n", - "\n", - " returns: TimeFrame\n", - " \"\"\"\n", - " # the default message if nothing changes\n", - " msg = \"The solver successfully reached the end of the integration interval.\"\n", - "\n", - " # get parameters from system\n", - " init, t_0, t_end, dt = check_system(system, slope_func)\n", - "\n", - " # make the TimeFrame\n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt) * get_units(t_end)\n", - "\n", - " event_func = options.get('events', None)\n", - " z1 = np.nan\n", - "\n", - " def project(y1, t1, slopes, dt):\n", - " t2 = t1 + dt\n", - " y2 = [y + slope * dt for y, slope in zip(y1, slopes)]\n", - " return y2, t2\n", - "\n", - " # run the solver\n", - " for t1 in ts:\n", - " y1 = frame.row[t1]\n", - "\n", - " # evaluate the slopes at the start of the time step\n", - " slopes1 = slope_func(y1, t1, system)\n", - "\n", - " # evaluate the slopes at the two-thirds point\n", - " y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3)\n", - " slopes2 = slope_func(y_mid, t_mid, system)\n", - "\n", - " # compute the weighted sum of the slopes\n", - " slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)]\n", - "\n", - " # compute the next time stamp\n", - " y2, t2 = project(y1, t1, slopes, dt)\n", - "\n", - " # check for a terminating event\n", - " if event_func:\n", - " z2 = event_func(y2, t2, system)\n", - " if z1 * z2 < 0:\n", - " scale = magnitude(z1 / (z1 - z2))\n", - " y2, t2 = project(y1, t1, slopes, scale * dt)\n", - " frame.row[t2] = y2\n", - " msg = \"A termination event occurred.\"\n", - " break\n", - " else:\n", - " z1 = z2\n", - "\n", - " # store the results\n", - " frame.row[t2] = y2\n", - "\n", - " details = ModSimSeries(dict(success=True, message=msg))\n", - " return frame, details\n", - "\n" - ] - } - ], - "source": [ - "source_code(run_ode_solver)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def leastsq(error_func, x0, *args, **options):\n", - " \"\"\"Find the parameters that yield the best fit for the data.\n", - "\n", - " `x0` can be a sequence, array, Series, or Params\n", - "\n", - " Positional arguments are passed along to `error_func`.\n", - "\n", - " Keyword arguments are passed to `scipy.optimize.leastsq`\n", - "\n", - " error_func: function that computes a sequence of errors\n", - " x0: initial guess for the best parameters\n", - " args: passed to error_func\n", - " options: passed to leastsq\n", - "\n", - " :returns: Params object with best_params and ModSimSeries with details\n", - " \"\"\"\n", - " # override `full_output` so we get a message if something goes wrong\n", - " options['full_output'] = True\n", - "\n", - " # run leastsq\n", - " t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options)\n", - " best_params, cov_x, infodict, mesg, ier = t\n", - "\n", - " # pack the results into a ModSimSeries object\n", - " details = ModSimSeries(infodict)\n", - " details.set(cov_x=cov_x, mesg=mesg, ier=ier)\n", - "\n", - " # if we got a Params object, we should return a Params object\n", - " if isinstance(x0, Params):\n", - " best_params = Params(Series(best_params, x0.index))\n", - "\n", - " # return the best parameters and details\n", - " return best_params, details\n", - "\n" - ] - } - ], - "source": [ - "source_code(leastsq)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Since we don't expect the first few points to agree, it's probably better not to make them part of the optimization process. We can ignore them by leaving them out of the `Series` returned by `error_func`. Modify the last line of `error_func` to return `errors.loc[8:]`, which includes only the elements of the `Series` from `t=8` and up.\n", - "\n", - "Does that improve the quality of the fit? Does it change the best parameters by much?\n", - "\n", - "Note: You can read more about this use of `loc` [in the Pandas documentation](https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** How sensitive are the results to the starting guess for the parameters? If you try different values for the starting guess, do we get the same values for the best parameters?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/insulin_soln.ipynb b/soln/insulin_soln.ipynb deleted file mode 100644 index f3dbc3ae..00000000 --- a/soln/insulin_soln.ipynb +++ /dev/null @@ -1,1125 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Insulin minimal model\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data\n", - "\n", - "We have data from Pacini and Bergman (1986), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122.." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The insulin minimal model\n", - "\n", - "In addition to the glucose minimal mode, Pacini and Bergman present an insulin minimal model, in which the concentration of insulin, $I$, is governed by this differential equation:\n", - "\n", - "$ \\frac{dI}{dt} = -k I(t) + \\gamma (G(t) - G_T) t $" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a version of `make_system` that takes the parameters of this model, `I0`, `k`, `gamma`, and `G_T` as parameters, along with a `DataFrame` containing the measurements, and returns a `System` object suitable for use with `run_simulation` or `run_odeint`.\n", - "\n", - "Use it to make a `System` object with the following parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    I0360.000
    k0.250
    gamma0.004
    G_T80.000
    \n", - "
    " - ], - "text/plain": [ - "I0 360.000\n", - "k 0.250\n", - "gamma 0.004\n", - "G_T 80.000\n", - "dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(I0 = 360,\n", - " k = 0.25,\n", - " gamma = 0.004,\n", - " G_T = 80)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def make_system(params, data):\n", - " # params might be a Params object or an array,\n", - " # so we have to unpack it like this\n", - " I0, k, gamma, G_T = params\n", - " \n", - " init = State(I=I0)\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - " G=interpolate(data.glucose)\n", - " \n", - " system = System(I0=I0, k=k, gamma=gamma, G_T=G_T, G=G,\n", - " init=init, t_0=t_0, t_end=t_end, dt=1)\n", - "\n", - " return system" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    I0360
    k0.25
    gamma0.004
    G_T80
    G<function interpolate.<locals>.wrapper at 0x7f...
    initI 360.0\n", - "dtype: float64
    t_00
    t_end182
    dt1
    \n", - "
    " - ], - "text/plain": [ - "I0 360\n", - "k 0.25\n", - "gamma 0.004\n", - "G_T 80\n", - "G .wrapper at 0x7f...\n", - "init I 360.0\n", - "dtype: float64\n", - "t_0 0\n", - "t_end 182\n", - "dt 1\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a slope function that takes state, t, system as parameters and returns the derivative of `I` with respect to time. Test your function with the initial condition $I(0)=360$." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " [I] = state\n", - " k, gamma = system.k, system.gamma\n", - " G, G_T = system.G, system.G_T\n", - " \n", - " dIdt = -k * I + gamma * (G(t) - G_T) * t\n", - " \n", - " return [dIdt]" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[-90.0]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, system.t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run `run_ode_solver` with your `System` object and slope function, and plot the results, along with the measured insulin levels." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    I
    17822.356671
    17923.180483
    18024.013211
    18124.854654
    18225.704657
    \n", - "
    " - ], - "text/plain": [ - " I\n", - "178 22.356671\n", - "179 23.180483\n", - "180 24.013211\n", - "181 24.854654\n", - "182 25.704657" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.tail()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(results.I, 'g-', label='simulation')\n", - "plot(data.insulin, 'go', label='insulin data')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write an error function that takes a sequence of parameters as an argument, along with the `DataFrame` containing the measurements. It should make a `System` object with the given parameters, run it, and compute the difference between the results of the simulation and the measured values. Test your error function by calling it with the parameters from the previous exercise.\n", - "\n", - "Hint: As we did in a previous exercise, you might want to drop the errors for times prior to `t=8`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func(params, data):\n", - " \"\"\"Computes an array of errors to be minimized.\n", - " \n", - " params: sequence of parameters\n", - " actual: array of values to be matched\n", - " \n", - " returns: array of errors\n", - " \"\"\"\n", - " print(params)\n", - " \n", - " # make a System with the given parameters\n", - " system = make_system(params, data)\n", - "\n", - " # solve the ODE\n", - " results, details = run_ode_solver(system, slope_func)\n", - "\n", - " # compute the difference between the model\n", - " # results and actual data\n", - " errors = (results.I - data.insulin).dropna()\n", - " return TimeSeries(errors.loc[8:])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "I0 360.000\n", - "k 0.250\n", - "gamma 0.004\n", - "G_T 80.000\n", - "dtype: float64\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    811.892725
    10-2.299827
    12-7.258477
    14-7.522652
    16-3.263455
    192.001941
    222.652451
    277.047398
    323.742283
    428.929934
    529.543487
    620.764077
    72-3.217837
    82-10.385020
    92-7.384116
    102-9.062852
    122-3.583691
    142-3.586581
    1623.171719
    18218.704657
    \n", - "
    " - ], - "text/plain": [ - "8 11.892725\n", - "10 -2.299827\n", - "12 -7.258477\n", - "14 -7.522652\n", - "16 -3.263455\n", - "19 2.001941\n", - "22 2.652451\n", - "27 7.047398\n", - "32 3.742283\n", - "42 8.929934\n", - "52 9.543487\n", - "62 0.764077\n", - "72 -3.217837\n", - "82 -10.385020\n", - "92 -7.384116\n", - "102 -9.062852\n", - "122 -3.583691\n", - "142 -3.586581\n", - "162 3.171719\n", - "182 18.704657\n", - "dtype: float64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "error_func(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use `leastsq` to find the parameters that best fit the data. Make a `System` object with those parameters, run it, and plot the results along with the measurements." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[3.6e+02 2.5e-01 4.0e-03 8.0e+01]\n", - "[3.6e+02 2.5e-01 4.0e-03 8.0e+01]\n", - "[3.6e+02 2.5e-01 4.0e-03 8.0e+01]\n", - "[3.60000005e+02 2.50000000e-01 4.00000000e-03 8.00000000e+01]\n", - "[3.60000000e+02 2.50000004e-01 4.00000000e-03 8.00000000e+01]\n", - "[3.60000000e+02 2.50000000e-01 4.00000006e-03 8.00000000e+01]\n", - "[3.60000000e+02 2.50000000e-01 4.00000000e-03 8.00000012e+01]\n", - "[-5.30683629e+02 -6.79500345e-02 -2.29098225e-03 7.86040674e+01]\n", - "[2.86020929e+02 2.22835658e-01 2.97772381e-03 7.96421423e+01]\n", - "[2.86020933e+02 2.22835658e-01 2.97772381e-03 7.96421423e+01]\n", - "[2.86020929e+02 2.22835661e-01 2.97772381e-03 7.96421423e+01]\n", - "[2.86020929e+02 2.22835658e-01 2.97772385e-03 7.96421423e+01]\n", - "[2.86020929e+02 2.22835658e-01 2.97772381e-03 7.96421435e+01]\n", - "[1.40631803e+02 1.53621683e-01 1.89393929e-03 7.90793326e+01]\n", - "[1.40631805e+02 1.53621683e-01 1.89393929e-03 7.90793326e+01]\n", - "[1.40631803e+02 1.53621685e-01 1.89393929e-03 7.90793326e+01]\n", - "[1.40631803e+02 1.53621683e-01 1.89393932e-03 7.90793326e+01]\n", - "[1.40631803e+02 1.53621683e-01 1.89393929e-03 7.90793338e+01]\n", - "[1.01576311e+02 8.86883215e-02 9.10961079e-04 7.82514786e+01]\n", - "[1.01576313e+02 8.86883215e-02 9.10961079e-04 7.82514786e+01]\n", - "[1.01576311e+02 8.86883229e-02 9.10961079e-04 7.82514786e+01]\n", - "[1.01576311e+02 8.86883215e-02 9.10961092e-04 7.82514786e+01]\n", - "[1.01576311e+02 8.86883215e-02 9.10961079e-04 7.82514798e+01]\n", - "[5.41795211e+01 3.19558519e-02 1.64722970e-06 7.52821022e+01]\n", - "[9.41838679e+01 7.81822807e-02 7.18446369e-04 7.71896713e+01]\n", - "[9.41838693e+01 7.81822807e-02 7.18446369e-04 7.71896713e+01]\n", - "[9.41838679e+01 7.81822818e-02 7.18446369e-04 7.71896713e+01]\n", - "[9.41838679e+01 7.81822807e-02 7.18446380e-04 7.71896713e+01]\n", - "[9.41838679e+01 7.81822807e-02 7.18446369e-04 7.71896724e+01]\n", - "[7.78825680e+01 5.77937352e-02 4.15373341e-04 7.56865719e+01]\n", - "[7.78825692e+01 5.77937352e-02 4.15373341e-04 7.56865719e+01]\n", - "[7.78825680e+01 5.77937361e-02 4.15373341e-04 7.56865719e+01]\n", - "[7.78825680e+01 5.77937352e-02 4.15373347e-04 7.56865719e+01]\n", - "[7.78825680e+01 5.77937352e-02 4.15373341e-04 7.56865730e+01]\n", - "[6.35497242e+01 3.52871788e-02 1.00914602e-04 7.17166904e+01]\n", - "[7.00853351e+01 4.50180592e-02 2.47464050e-04 7.34214050e+01]\n", - "[7.00853362e+01 4.50180592e-02 2.47464050e-04 7.34214050e+01]\n", - "[7.00853351e+01 4.50180598e-02 2.47464050e-04 7.34214050e+01]\n", - "[7.00853351e+01 4.50180592e-02 2.47464054e-04 7.34214050e+01]\n", - "[7.00853351e+01 4.50180592e-02 2.47464050e-04 7.34214061e+01]\n", - "[6.37912891e+01 3.44851857e-02 9.62260771e-05 6.83462066e+01]\n", - "[6.67348714e+01 3.95606416e-02 1.77689353e-04 7.08245914e+01]\n", - "[6.67348724e+01 3.95606416e-02 1.77689353e-04 7.08245914e+01]\n", - "[6.67348714e+01 3.95606422e-02 1.77689353e-04 7.08245914e+01]\n", - "[6.67348714e+01 3.95606416e-02 1.77689356e-04 7.08245914e+01]\n", - "[6.67348714e+01 3.95606416e-02 1.77689353e-04 7.08245925e+01]\n", - "[6.34063138e+01 3.36912594e-02 8.92271739e-05 6.53604365e+01]\n", - "[6.54581258e+01 3.75386018e-02 1.53145128e-04 6.89998360e+01]\n", - "[6.54581268e+01 3.75386018e-02 1.53145128e-04 6.89998360e+01]\n", - "[6.54581258e+01 3.75386023e-02 1.53145128e-04 6.89998360e+01]\n", - "[6.54581258e+01 3.75386018e-02 1.53145131e-04 6.89998360e+01]\n", - "[6.54581258e+01 3.75386018e-02 1.53145128e-04 6.89998370e+01]\n", - "[6.37967075e+01 3.44948737e-02 1.05359671e-04 6.52279435e+01]\n", - "[6.37967084e+01 3.44948737e-02 1.05359671e-04 6.52279435e+01]\n", - "[6.37967075e+01 3.44948743e-02 1.05359671e-04 6.52279435e+01]\n", - "[6.37967075e+01 3.44948737e-02 1.05359673e-04 6.52279435e+01]\n", - "[6.37967075e+01 3.44948737e-02 1.05359671e-04 6.52279444e+01]\n", - "[6.34409307e+01 3.39762874e-02 1.00577649e-04 6.31260404e+01]\n", - "[6.34409316e+01 3.39762874e-02 1.00577649e-04 6.31260404e+01]\n", - "[6.34409307e+01 3.39762879e-02 1.00577649e-04 6.31260404e+01]\n", - "[6.34409307e+01 3.39762874e-02 1.00577650e-04 6.31260404e+01]\n", - "[6.34409307e+01 3.39762874e-02 1.00577649e-04 6.31260413e+01]\n", - "[6.28791031e+01 3.28824014e-02 8.29220012e-05 6.00474015e+01]\n", - "[6.30778597e+01 3.32816079e-02 8.95761488e-05 6.11905313e+01]\n", - "[6.30778606e+01 3.32816079e-02 8.95761488e-05 6.11905313e+01]\n", - "[6.30778597e+01 3.32816084e-02 8.95761488e-05 6.11905313e+01]\n", - "[6.30778597e+01 3.32816079e-02 8.95761502e-05 6.11905313e+01]\n", - "[6.30778597e+01 3.32816079e-02 8.95761488e-05 6.11905322e+01]\n", - "[6.28214056e+01 3.28104757e-02 8.25234881e-05 5.95114505e+01]\n", - "[6.28214065e+01 3.28104757e-02 8.25234881e-05 5.95114505e+01]\n", - "[6.28214056e+01 3.28104762e-02 8.25234881e-05 5.95114505e+01]\n", - "[6.28214056e+01 3.28104757e-02 8.25234894e-05 5.95114505e+01]\n", - "[6.28214056e+01 3.28104757e-02 8.25234881e-05 5.95114514e+01]\n", - "[6.27778545e+01 3.27546603e-02 8.21350019e-05 5.93234986e+01]\n", - "[6.27778555e+01 3.27546603e-02 8.21350019e-05 5.93234986e+01]\n", - "[6.27778545e+01 3.27546608e-02 8.21350019e-05 5.93234986e+01]\n", - "[6.27778545e+01 3.27546603e-02 8.21350032e-05 5.93234986e+01]\n", - "[6.27778545e+01 3.27546603e-02 8.21350019e-05 5.93234995e+01]\n", - "[6.27660608e+01 3.27361764e-02 8.19166237e-05 5.92757881e+01]\n", - "[6.27660617e+01 3.27361764e-02 8.19166237e-05 5.92757881e+01]\n", - "[6.27660608e+01 3.27361769e-02 8.19166237e-05 5.92757881e+01]\n", - "[6.27660608e+01 3.27361764e-02 8.19166250e-05 5.92757881e+01]\n", - "[6.27660608e+01 3.27361764e-02 8.19166237e-05 5.92757890e+01]\n", - "[6.27629251e+01 3.27314482e-02 8.18644601e-05 5.92648489e+01]\n", - "[6.27629260e+01 3.27314482e-02 8.18644601e-05 5.92648489e+01]\n", - "[6.27629251e+01 3.27314487e-02 8.18644601e-05 5.92648489e+01]\n", - "[6.27629251e+01 3.27314482e-02 8.18644614e-05 5.92648489e+01]\n", - "[6.27629251e+01 3.27314482e-02 8.18644601e-05 5.92648498e+01]\n", - "[6.27620378e+01 3.27300853e-02 8.18488907e-05 5.92615370e+01]\n", - "Both actual and predicted relative reductions in the sum of squares\n", - " are at most 0.000000\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "best_params, details = leastsq(error_func, params, data)\n", - "print(details.mesg)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    I062.762
    k0.0327301
    gamma8.18489e-05
    G_T59.2615
    G<function interpolate.<locals>.wrapper at 0x7f...
    initI 62.762038\n", - "dtype: float64
    t_00
    t_end182
    dt1
    \n", - "
    " - ], - "text/plain": [ - "I0 62.762\n", - "k 0.0327301\n", - "gamma 8.18489e-05\n", - "G_T 59.2615\n", - "G .wrapper at 0x7f...\n", - "init I 62.762038\n", - "dtype: float64\n", - "t_0 0\n", - "t_end 182\n", - "dt 1\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(best_params, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func, t_eval=data.index)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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fPXVV6Snp7No0SLatGlzSMeqy9LshYWFFUknOTmZPn36cOmll1ZsP/nkk5k1axZdu3Zl165dxMfHU1paWu3Q3qBBg3j99dfp378/2dnZFBQU0KZNm4MuMx8q9aBEpNlKTerIrmqSUWpSxwY/dvDKtOW/7AGeeeYZpk2bxrXXXktpaSkXXnghf/jDHw7pWHVZmj0nJ4fi4mK6detW0Ra85FBJSQn3338/n332GV26dKnoCVW3JFNsbCwzZszg3XffpUOHDgwePDjkperrQglKRJqtCWnjmbF4VqVhvoTYBCak1a1yLdzy8/PJzMxk6tSplJWVsXTpUm644QaOPPJI0tO9Ice6LPNeHx06dCAhIYGMjIyK5Lljx46K7Y888giFhYV8/PHHtG7dmj179vDKK69U+17PPvssq1at4r333qNdu3b4/X5GjBgRtljLaYhPRJqtUX3SmTRiIp2SOuIDOiV1ZNKIiQ16/ak2paWlXHPNNbz11lv4fD66deuGz+cjJSWF1NRU2rZty+uvv05paSlvv/12jcUO9ZGQkMA555zD1KlT2bNnD1u2bOH555+v2J6bm0urVq2IjY1lz5493HfffQCVlo7ft29fxb7x8fHExcWRn5/PI488Qm5uLkVFRQce+BCoByUizdqoPukRS0hVJScn89hjjzFlyhRuv/12kpOTmThxYsVy7Pfddx8PP/ww06dP5+STTz7k4omqbr/9du666y5OPvlkUlJSGDt2LF9++SUAN954I3/6059IT0+nbdu2nHXWWZgZa9euJS0tjXHjxnHPPffwww8/cNttt7F69WpOOOEEkpKSGD16NCeccELFMvPhoiXfRSRqacn35kNLvouISLMR8hBfYEHBgUAXoBTYDqxzzrWsrpiIiDSoOicoMxsN3AiMxZtlvJwfyDazd4AnnHOfhTdEERFpiQ6aoAJLqc/AW9LiNeACvKUtduMNEXYGjgZGAy+b2ffAJM0uLiIih6IuPagXgXucc2/VsH1z4Guemd2Ct/rti3izkYuIHBK/34/PV+v80RLl6luMV5cENbKu15cC+71mZq/XKxoRkSDx8fHk5+eTlJQU6VDkEOTn5xMfHx/y6w5axVeX5GRmPczsslBeIyJyMF26dGHr1q3k5eXV+69wiRy/309eXh5bt26lS5cuIb8+XDfqDgGeBZ4/2I4iInXVrl07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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(results.I, 'g-', label='simulation')\n", - "plot(data.insulin, 'go', label='insulin data')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Using the best parameters, estimate the sensitivity to glucose of the first and second phase pancreatic responsivity:\n", - "\n", - "$ \\phi_1 = \\frac{I_{max} - I_b}{k (G_0 - G_b)} $\n", - "\n", - "$ \\phi_2 = \\gamma \\times 10^4 $\n", - "\n", - "For $G_0$, use the best estimate from the glucose model, 290. For $G_b$ and $I_b$, use the inital measurements from the data.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "I0, k, gamma, G_T = best_params" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(130, 11)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "I_max = data.insulin.max()\n", - "Ib = data.insulin[0]\n", - "I_max, Ib" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(289, 92)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "# The value of G0 is the best estimate from the glucose model\n", - "G0 = 289\n", - "Gb = data.glucose[0]\n", - "G0, Gb" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "18.455830724497748" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "phi_1 = (I_max - Ib) / k / (G0 - Gb)\n", - "phi_1" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8184889071339871" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "phi_2 = gamma * 1e4\n", - "phi_2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/interest.ipynb b/soln/interest.ipynb deleted file mode 100644 index d8fe740d..00000000 --- a/soln/interest.ipynb +++ /dev/null @@ -1,373 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exponential, geometric, and polynomial growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose there are two banks across the street from each other, The First Geometric Bank (FGB) and Exponential Savings and Loan (ESL). They offer the same interest rate on checking accounts, 3%, but at FGB, they compute and pay interest at the end of each year, and at ESL they compound interest continuously.\n", - "\n", - "If you deposit $p_0$ dollars at FGB at the beginning of Year 0, the balanace of your account at the end of Year $n$ is\n", - "\n", - "$ x_n = p_0 (1 + \\alpha)^n $\n", - "\n", - "where $\\alpha = 0.03$. At ESL, your balance at any time $t$ would be\n", - "\n", - "$ x(t) = p_0 \\exp(\\alpha t) $\n", - "\n", - "If you deposit \\$1000 at each back at the beginning of Year 0, how much would you have in each account after 10 years?\n", - "\n", - "Is there an interest rate FGB could pay so that your balance at the end of each year would be the same at both banks? What is it?\n", - "\n", - "Hint: `modsim` provides a function called `exp`, which is a wrapper for the NumPy function `exp`." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.03" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "p_0 = 1000\n", - "alpha = 0.03" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "ts = linrange(11)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1000. , 1030. , 1060.9 , 1092.727 ,\n", - " 1125.50881 , 1159.2740743 , 1194.05229653, 1229.87386542,\n", - " 1266.77008139, 1304.77318383, 1343.91637934])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "geometric = p_0 * (1 + alpha) ** ts" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1000. , 1030.45453395, 1061.83654655, 1094.17428371,\n", - " 1127.49685158, 1161.83424273, 1197.21736312, 1233.67805996,\n", - " 1271.24915032, 1309.96445073, 1349.85880758])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "exponential = p_0 * exp(alpha * ts)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.030454533953516938" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "alpha2 = exp(alpha) - 1" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([1000. , 1030.45453395, 1061.83654655, 1094.17428371,\n", - " 1127.49685158, 1161.83424273, 1197.21736312, 1233.67805996,\n", - " 1271.24915032, 1309.96445073, 1349.85880758])" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "geometric = p_0 * (1 + alpha2) ** ts" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(ts, exponential, '-', label='Exponential')\n", - "plot(ts, geometric, 's', label='Geometric')\n", - "\n", - "decorate(xlabel='Time (years)',\n", - " ylabel='Value (dollars)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose a new bank opens called the Polynomial Credit Union (PCU). In order to compete with First Geometric Bank and Exponential Savings and Loan, PCU offers a parabolic savings account where the balance is a polynomial function of time:\n", - "\n", - "$ x(t) = p_0 + \\beta_1 t + \\beta_2 t^2 $\n", - "\n", - "As a special deal, they offer an account with $\\beta_1 = 30$ and $\\beta_2 = 0.5$, with those parameters guaranteed for life.\n", - "\n", - "Suppose you deposit \\$1000 at all three banks at the beginning of Year 0. How much would you have in each account at the end of Year 10? How about Year 20? And Year 100?" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "number_of_years = 100\n", - "ts = linrange(number_of_years+1)\n", - "geometric = p_0 * (1 + alpha2) ** ts\n", - "exponential = p_0 * exp(alpha * ts)\n", - "None" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "beta1 = 30\n", - "beta2 = 0.5\n", - "parabolic = p_0 + beta1 * ts + beta2 * ts**2\n", - "None" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def plot_results():\n", - " plot(ts, exponential, '-', label='Exponential')\n", - " plot(ts, geometric, 's', label='Geometric')\n", - " plot(ts, parabolic, 'o', label='Parabolic')\n", - " \n", - " decorate(xlabel='Time (years)',\n", - " ylabel='Value (dollars)')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_results()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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DB48mK5duwIwcuRIxo8fz4oVKwDo0qULY8aMIScnh759+zJlyhQArrzySg4cOMCYMWPYv38/7du3Z/78+bRo0YIdO3b4jee+++5j1qxZXHnllRw7doxOnTrx3HPPnTRuVJWBAwcydepUvv32W4YMGVJ+/OabbyY7O5tevXqRlpZG79696dWrF1999VWtPiuRWBUN1YuvBI/HE7aTu80Ycxbw7V//+ldOP/30kx7Pzs6OmXUn/gwfPrx8Jlesi5c/U4kv9R17CVZH5ars2LGDfv36AZxtrf1P5cdVyYiIRLhoq158KcmIiESYSFqxX19KMnHg5ZdfDncIIlILdU0wkVK9+FKSERGJALFUvfhSkhERiQCxVL34UpIREQmTWK1efCnJiIiESTTPGguUkoyISAhFQ7+xYFKSEVfs2LGjygWwIvEuHqoXX0oyUearr74iKyuL9evXc+TIEdLT07nooosYO3YsGRkZ4Q4PgMcff5yioiImTZpU5eP3338/TZo00UZkEjfirXrxpSRTR9X90LjZwmHLli3ceOON3HTTTYwbN47TTjuNnJwc5s2bx/Dhw1m5ciUpKSmunLs28vLyaNKkSbWPT506NYTRiIRfvFUvvtSFuY6q+6Gpz0yRmkydOpXhw4fzhz/8gbZt25KQkEBmZiYPPPAAl112GYcOHeLQoUNMnDiRXr160adPH2bNmkVxcTEAxcXFPPXUU/Tp04cePXowatSo8iaY69ev54orruDJJ5+ke/fuXHjhhaxatYo//elP9OjRgwsvvJB33nmnPJZ//OMfDBkyhK5duzJo0CA+/fRTwGnVv3LlSl577bXy9+/cuTOTJ0+mW7duLF68mAkTJvDwww8DzvYAjz/+OD//+c/p3r07Y8eOrbI7s0g8ifbqxZeSTJTYtWsX//73v7n66qtPeiwxMZE777yTVq1aMX78eI4ePcrq1atZsmQJn332GfPmzQNgzpw5rFmzhldeeYW//e1vnH766YwaNYqioiIArLUArFu3jhtvvJFx48ZRWlrKxx9/zG233VZegezatYuRI0dyww03sH79eu6++27GjBnD999/z0033cTAgQO59tprycrKApwtnJs3b86nn37KFVdcUSH2uXPn8sknn/DGG2+wdu1aCgoKeOyxx1z7HEVCpS4t+c+Z9CbnTHrT1YaWoaYkEyXKNh1r3bp1+bG5c+fSrVs3unXrRqdOnZg7dy4ffPAB999/P40bNyYjI4PRo0ezePFiAJYvX87vf/972rVrR8OGDbn33nvJyclhy5YtgLNtwOjRo0lMTKRnz56UlJQwYsQIkpOT6du3LwcPHiQ/P5+VK1fSpUsXfvWrX9GgQQMuvPBCevfuzZtvVl/eDxw4kJSUFNLS0iocX7lyJaNGjaJt27akpaUxbdq0uOgWLbGvtnc1Yql68aUxmShRtpXxvn37yrdLvv3227n99tsBp51/w4YNAbjsssvKX+fxeCgqKuLEiRPk5ubStm3b8sdSUlLIyMhg9+7dtGzZktTU1PIxnbI9YdLT0wHKt1guLS0lJyeHdevW0a1bt/L3Kikp4ZJLLqk2/uomJezfv79CTK1ataJVq1aBfCQiEacuA/yxMvZSHSWZKNGuXTvat2/PsmXLyhNLZUVFRSQmJvLRRx+RmpoKQH5+Prm5uTRs2LB8q+Wf/vSngDMesmfPnvIEVpZIapKRkcGll17KrFmzyo/t2LGDRo0aVfua6t67devW7N69m06dOgHw9ddf8/7773PrrbcGFItIJFH1cjLdLquj6n443Pyheeihh3jppZeYO3cu+/btAyAnJ4cnnniCTZs2ccYZZ9C9e3ceffRRjh49Sn5+PhMnTmTy5MkADBo0iGeeeYYffviBEydO8Pjjj9OsWTO6dOlSqzgGDBjAhx9+yIcffkhpaSnZ2dlcffXVfPDBB0D1WytXZeDAgcybN489e/Zw9OhRZs2aVeOOnCKRwnfcJd7HXqqjSqaOwvHD0bFjR5YuXUpWVhbXXHMNhw4dIi0tjW7durFw4UK6du1Kz549mT59OpdccgnFxcX07NmT2bNnA86WzIWFhdxwww0cOnSILl268OKLL9Z62vNZZ53FnDlzmDVrFnfddRfp6emMHDmSq666CoDLL7+csWPHcu211/LEE0/4fa/f/e53HD9+nGuuuYYTJ07Qu3dvxo8fX7cPSCTE3JxNGiu0/bK26o0p+jMVtwWjqWUsVTDafllEJIhitSW/W5RkRERqEA8t+d2iJCMiUoN4bgtTX0oyIiJViOemlsGkJCMiUgVVL8GhJCMi4qXqJfiUZEREvFS9BJ+SjIjENVUv7lKSEZG4purFXVGTZIwxPwf+bK3tHO5YwsEYwymnnEJiotNuLiEhgc6dOzN+/HjOO++8oJ6rbAXvhg0byrswB2rOnDlkZ2fz9NNPk5WVxZdfflmhkaZIJFD1EjpRkWSMMc2AcUByuGPx9dF3n/HalhXkHsujRVpzru14JRed2d218y1evLi8ZUpRURFPPvkkI0eO5P333y9vzR9JRo0aFe4QRKqk6iV0oqUL82xgQriD8PXRd58xb8Or7D+WhwfYfyyPeRte5aPvPgvJ+ZOTk/n1r3/N7t27OXToEB6Ph7lz53L55ZfTuXNnevfuzUsvvVT+fGMMU6dOpXv37jz55JMUFhYybdo0Lr30Un76059yySWXVNheGWDhwoX07t2biy++mOeff778+P79+7n77rvp2bMnF110EdOmTaOgoOCkGOfMmcPvf/97wNnX5rnnnqNv37507dqVW265hd27d7vz4YhUUtduyWVUvdRdxCcZY8xo4H1r7VfhjsXXa1tWUFhSWOFYYUkhr21ZEZLzHzp0iJdffplzzz2X5s2b8/bbb7NixQpeeuklNm3axJQpU3j88cfZu3dv+Wvy8/P5+OOPGTlyJC+88AJbt25lyZIlbNq0iRtuuIH777+f4uLi8ud/9dVXrFq1iqysLF544QVWr14NOJulFRcX895777Fs2TKys7OZPn2633hff/11Xn31VZ599lnWrVtH27Ztue+++9z5cEQqqU+/sXhpye+WaLhdNgTwGGNuAs42xsy01o4Ld1C5x/JqdTwYrrvuuvLbYikpKXTs2JE5c+YA8Itf/IIePXqQkZHBvn37SE5OpqSkhLy8vPJdKQcMGEBKSgopKSkMHTqUIUOGkJ6ezp49e0hNTSU/P79CRTJhwgQaNWrEeeedxzXXXMM777zD+eefz+bNm/nkk09o3LgxjRs35p577mH48OE88MAD1ca+cuVKrr/++vLxo3vuuUf7xoir1G8sMkR8krHW9in72hizNRISDECLtObsryKhtEhr7to5Fy1aVG0b++LiYqZPn86nn35KRkYGHTt2BJzbVGV8t0DOz89n6tSp/Otf/yIzM5Ozzz67wvMTExM57bTTyp/fpk0b1q9fT25uLikpKbRs2bL8sczMTAoLC8nNza029srbLDdp0kQt+cVV6pYcGSI+yUSqazteybwNr1a4ZZaSlMK1Ha8MSzyzZs3ixIkTfPjhh5xyyikcOnSIN954o8JzfLdAnjJlCmeeeSZPP/00DRo0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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_results()\n", - "plt.yscale('log')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/jump2_soln.ipynb b/soln/jump2_soln.ipynb deleted file mode 100644 index fadfae6d..00000000 --- a/soln/jump2_soln.ipynb +++ /dev/null @@ -1,1685 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Bungee dunk example, taking into account the mass of the bungee cord\n", - "\n", - "Copyright 2019 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install modsimpy\n", - "# https://pypi.org/project/modsimpy/\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install pint==0.9\n", - " !pip install modsimpy\n", - " !mkdir figs" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bungee jumping" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the previous case study, we simulated a bungee jump with a model that took into account gravity, air resistance, and the spring force of the bungee cord, but we ignored the weight of the cord.\n", - "\n", - "It is tempting to say that the weight of the cord doesn't matter, because it falls along with the jumper. But that intuition is incorrect, as explained by [Heck, Uylings, and Kędzierska](http://iopscience.iop.org/article/10.1088/0031-9120/45/1/007). As the cord falls, it transfers energy to the jumper. They derive a differential equation that relates the acceleration of the jumper to position and velocity:\n", - "\n", - "$a = g + \\frac{\\mu v^2/2}{\\mu(L+y) + 2L}$ \n", - "\n", - "where $a$ is the net acceleration of the number, $g$ is acceleration due to gravity, $v$ is the velocity of the jumper, $y$ is the position of the jumper relative to the starting point (usually negative), $L$ is the length of the cord, and $\\mu$ is the mass ratio of the cord and jumper.\n", - "\n", - "If you don't believe this model is correct, [this video might convince you](https://www.youtube.com/watch?v=X-QFAB0gEtE).\n", - "\n", - "Following the example in Chapter 21, we'll model the jump with the following modeling assumptions:\n", - "\n", - "1. Initially the bungee cord hangs from a crane with the attachment point 80 m above a cup of tea.\n", - "\n", - "2. Until the cord is fully extended, it applies a force to the jumper as explained above.\n", - "\n", - "3. After the cord is fully extended, it obeys [Hooke's Law](https://en.wikipedia.org/wiki/Hooke%27s_law); that is, it applies a force to the jumper proportional to the extension of the cord beyond its resting length.\n", - "\n", - "4. The jumper is subject to drag force proportional to the square of their velocity, in the opposite of their direction of motion.\n", - "\n", - "First I'll create a `Param` object to contain the quantities we'll need:\n", - "\n", - "1. Let's assume that the jumper's mass is 75 kg and the cord's mass is also 75 kg, so `mu=1`.\n", - "\n", - "2. The jumpers's frontal area is 1 square meter, and terminal velocity is 60 m/s. I'll use these values to back out the coefficient of drag.\n", - "\n", - "3. The length of the bungee cord is `L = 25 m`.\n", - "\n", - "4. The spring constant of the cord is `k = 40 N / m` when the cord is stretched, and 0 when it's compressed.\n", - "\n", - "I adopt the coordinate system and most of the variable names from [Heck, Uylings, and Kędzierska](http://iopscience.iop.org/article/10.1088/0031-9120/45/1/007).\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " M = 75 * kg, # mass of jumper\n", - " m_cord = 75 * kg, # mass of cord\n", - " area = 1 * m**2, # frontal area of jumper\n", - " rho = 1.2 * kg/m**3, # density of air\n", - " v_term = 60 * m / s, # terminal velocity of jumper\n", - " L = 25 * m, # length of cord\n", - " k = 40 * N / m) # spring constant of cord" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", - "\n", - "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`.\n", - "\n", - "It also computes `mu` and the initial `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given params.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " M, m_cord = params.M, params.m_cord\n", - " g, rho, area = params.g, params.rho, params.area\n", - " v_init, v_term = params.v_init, params.v_term\n", - " \n", - " # back out the coefficient of drag\n", - " C_d = 2 * M * g / (rho * area * v_term**2)\n", - " \n", - " mu = m_cord / M\n", - " init = State(y=0*m, v=v_init)\n", - " t_end = 10 * s\n", - "\n", - " return System(params, C_d=C_d, mu=mu,\n", - " init=init, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    M75 kilogram
    m_cord75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    L25 meter
    k40.0 newton / meter
    C_d0.3402777777777778 dimensionless
    mu1.0 dimensionless
    inity 0 meter\n", - "v 0.0 meter / secon...
    t_end10 second
    \n", - "
    " - ], - "text/plain": [ - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "M 75 kilogram\n", - "m_cord 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "C_d 0.3402777777777778 dimensionless\n", - "mu 1.0 dimensionless\n", - "init y 0 meter\n", - "v 0.0 meter / secon...\n", - "t_end 10 second\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)\n", - "system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`drag_force` computes drag as a function of velocity:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(v, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " v: velocity\n", - " \n", - " returns: drag force in N\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - "\n", - " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's drag force at 20 m/s." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-81.66666666666667 kilogram meter/second2" - ], - "text/latex": [ - "$-81.66666666666667\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "-81.66666666666667 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drag_force(20 * m/s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function computes the acceleration of the jumper due to tension in the cord.\n", - "\n", - "$a_{cord} = \\frac{\\mu v^2/2}{\\mu(L+y) + 2L}$ " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def cord_acc(y, v, system):\n", - " \"\"\"Computes the force of the bungee cord on the jumper:\n", - " \n", - " y: height of the jumper\n", - " v: velocity of the jumpter\n", - " \n", - " returns: acceleration in m/s\n", - " \"\"\"\n", - " L, mu = system.L, system.mu\n", - " \n", - " a_cord = -v**2 / 2 / (2*L/mu + (L+y))\n", - " return a_cord" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's acceleration due to tension in the cord if we're going 20 m/s after falling 20 m." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-3.6363636363636362 meter/second2" - ], - "text/latex": [ - "$-3.6363636363636362\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "-3.6363636363636362 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y = -20 * m\n", - "v = -20 * m/s\n", - "cord_acc(y, v, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now here's the slope function:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func1(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing g, rho,\n", - " C_d, area, and mass\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " M, g = system.M, system.g\n", - " \n", - " a_drag = drag_force(v, system) / M\n", - " a_cord = cord_acc(y, v, system)\n", - " dvdt = -g + a_cord + a_drag\n", - " \n", - " return v, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial params." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 , -9.8 )" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func1(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll need an event function to stop the simulation when we get to the end of the cord." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Run until y=-L.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing g, rho,\n", - " C_d, area, and mass\n", - " \n", - " returns: difference between y and -L\n", - " \"\"\"\n", - " y, v = state \n", - " return y + system.L" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "25 meter" - ], - "text/latex": [ - "$25\\ \\mathrm{meter}$" - ], - "text/plain": [ - "25 " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func1, events=event_func)\n", - "details.message" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how long it takes to drop 25 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.2118255911654763" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results)\n", - "t_final" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results, **options):\n", - " plot(results.y, **options)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `min` to find the lowest point:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-25.0 meter" - ], - "text/latex": [ - "$-25.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-25.0 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Velocity when we reach the end of the cord." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-23.876881009672466 meter/second" - ], - "text/latex": [ - "$-23.876881009672466\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "-23.876881009672466 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results.v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although we compute acceleration inside the slope function, we don't get acceleration as a result from `run_ode_solver`.\n", - "\n", - "We can approximate it by computing the numerical derivative of `v`:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXyU1dn/8c9kMtkJCUkgEPbtQnZEQEDAum9Vq/axam2tttZqtWoff9anm1rthrvWutvq06qPtSqiVVFAVFYB2TksgQQICVtYQiAJSX5/zCSGmEAymWQmyff9et2vmbmXmSvDTa6cc1/3OZ7KykpEREQiTVS4AxAREamLEpSIiEQkJSgREYlISlAiIhKRosMdQLiZWSwwBtgOlIc5HBGR9sYLdAUWOedKam5o9wkKf3L6NNxBiIi0c5OAz2quUILyt5z4xz/+QWZmZrhjERFpV/Lz87nqqqsg8Lu4JiWoQLdeZmYm3bt3D3csIiLt1dcusahIQkREIpISlIiIRCQlKBERiUhKUCIiEpGUoEREJCIpQYmISERSmXkTbdtZRP7ug0R5PERFBRaPB6/XU73OG+X52vaoKA/RXg8xPq9/iY7C4/GE+8cREYkYSlBNUFRcyk1/nkl5RWjm1IrxeYn1RRFblbR8XmJjvNWv/Y9RxMZEEx8bTWJ8NElxPhLjfSTE+0iM85EU73+dGO8jLsarpCcirZYSVBMkxvu44JS+5Obvp6KykooKAo+VlFdUUFHx1bryCv/6qu0VlZWUl1dQUlZBaVk5ZUf8j6Vl5RygLCTxRUV5SIyLrk5YiXE+khJ8dEyKJSUplpQOsUc9T0mKJSEuWklNRCKCElQTeDwefnjR0JC8V3lFJWVl5ZQEltKyckpKyyktq6Ck7Ejg0b+upKycQyVHOHiojIOHy/yPVUvV68NHKCkt50BxGQeKG57wfNFRgaQVQ0qHODomxVQnsLTkeNJT4slIjSc1OQ5vlBKZiDQfJagI4Y3y4I2NJi42dP8kZUcqKA4krKJAAisqLmNvUQn7ikrYW1TC3gMlX70+UMLh0nJ27T3Err2HgH31vndUlIe0jnFkpMSTkZJAekocGakJ/tep8WSkxJMY71NrTESCpgTVhlW1hjomxTb4mMMlR45KWHuLStlbdJi9B0rYve8wOwPJa++BEnYWHmJn4SFgT53vFRfjDSSrBLqlJ9I1I5Fu6Ul0y0ikS2oCXq+KSEWkfkpQcpS42GgyY6PJTEs85n6lZeXs2udPVjsLA49VS+Ehdu0t5lBJOVsKithSUMQSd/Tx3igPmWkJdA0krG7pSWQFHtNT4olS96FIu9fqEpSZ3QZMcc5dXGNdT+B54GRgB3Czc+69MIXYLsT4vP7WUHpSndsrKys5ePgIOwuL2bGnmLxdB/3LziLydh1k195DbNt5kG07D8Kao4/1RUeRmZZIVkYiPbp0oFdmMr27JZOVkUS0Wl0i7UarSVBmlgT8Fvg5MK3W5leBecD5wCnAW2Y20jmX3bJRShWPx0NSvI+k+I706dbxa9sPlx4hf3dxdcKq+Vh4oIQtBQfYUnCA+Svzq4+J9kbRo0sSvbom0zuQtHp3TaZTcpyudYm0Qa0mQQHvAjuBp/FPDwyAmQ0ETgLOdM6VAjPNbBpwHfDLcAQqxxcXE03vrv4EU1vx4TK27zpI3s6D5BTsZ3PefnLy95O/u5hNefvZlLf/qP07JPj8SSuw9OqaTK/MZOJDWHAiIi0vYv4Hm1kM0KmOTZXOuQLgCudcnpndTY0EBQwGcp1zB2usWwuMbbZgpVklxPno1z2Fft1TmERW9friw2XkFhwgZ7s/aW3O30/O9v0cKC5j5cbdrNy4u3pfjwd6dOmA9UxlQM9UBvZIoXfXZBVmiLQiEZOggAnArDrWlwPRzrm8eo5LAoprrSsGEkIYm0SAhDgfg3p1YlCvr/6OqaysZM/+w2yulbS2FBwgN9+/zFiYC/ivm/XL6oj1SmVgj1QG9EyhS6cEdQ+KRKiISVDOudlAML8pDgLxtdYlAEVNjUkin8fjIa1jPGkd4xk9qEv1+tKycjbl7cPlFrI+dy8ut5Dtuw6yZvMe1mz+qiy+Y1IMA3qkVietgT1TSEqICcePIiK1REyCaoLVQE8zi3fOHQqsGxRYL+1UjM+L9eqE1Wht7T9YyvothazL3cu63ELW5Rayr6iUL9YU8MWagur9enRJYli/dIb1T2dYv/RG3UcmIqHT6hOUc86Z2TLgfjO7C39X4UXA+PBGJpEmOTGG0YO6VLe0KisrKdhTzLrcwuqW1sate6vv3Xpv7mYAemZ2YHi/dIb2T2do3zQlLJEW0uoTVMClwDP474HaBVznnFsZ3pAk0nk8HjLTEslMS2TyqO6Af3io9VsKWbFxFys27GLNpj3V17Kmf74JgN5dk6tbV0P7pdFBXYIizcJTWRmaqSJaKzPrDWz6+OOP6d69e7jDkQhTdqScdbl7v0pYm/dQdqSiervHA326dmRo/zSG90tn+IAMlbeLNMLWrVs5/fTTAfo45zbX3Kb/SSLH4Iv2MqRvGkP6pvGdM43SsnJcbiErNuxixcZdrN1cSHbePrLz9jFtTjbR3iiG909nzOAujBmcSZdOKiYVCZYSlEgjxPi8/gKKfukAlJSV43L2sGLDbpa6HazbUsgSt4MlbgdPv7mCnpkdGHOCP1kN6pWq+7BEGkEJSqQJYn1ehvfPYHj/DK46ZxD7ikpYvLaAhasLWOp2VF+/emPWBpLifYwe1IUxg7swelBnlbOLHIcSlEgIdUyK5bSTenLaST0pO1LB6k27WbS6gC/W5LNt50E+WbqVT5ZuJSrKwwm9OzE20BXYvXOSbhgWqUUJSqSZ+KKjGDEggxEDMvjhRUPZtrOIRasLWLQ6n1XZu6uXF6evJisjkUkjuzN5VBY9unQId+giEUEJSqSFZGUkkTUliYun9OPgoTKWrtsRaF0VsG3nQV6d4Xh1hqNPt2Qmj+rOpJFZKrKQdk0JSiQMEuN9nDIii1NGZFFeXsGKjbuYs3Qbc5fnBUZsX83f313NoF6pTB7VnVNGdCM1OS7cYYu0KCUokTDzeqMYObAzIwd25ieXDmfJ2h3MWbqNBavzWZtTyNqcQp57ewXD+qczeVR3JgzrqgILaReUoEQiiC/ay7ihXRk3tCuHS46wcHU+c5ZuY/HaApat38Wy9bv46xvLONG6MGlUFuOGZOrGYGmzdGaLRKi42Ggmj+rO5FHdKSouZd6K7cxZuo3lG3aycHU+C1fnExvjZfLILM4Z35sBPVJUCShtihKUSCuQlBDDmeN6cea4XhQeOMzny/KYs3QbazbvYcbCXGYszKVvVkfOGd+bKaOySIjzhTtkkSZTghJpZVI7xHHBKX254JS+bNtZxPvzNvPxoi1kb9vHk/9axovvrGTKiT045+Re9OueEu5wRYKmBCXSimVlJHHdhUO5+twTmLs8j/fn57Aqezfvz9vM+/M2M6BHCueM783kkVnE6VqVtDI6Y0XagBifl1NH9+DU0T3Izd/PB/Nz+PiLLazfspf1W77k+Wkr+cboHpwzvje9uyaHO1yRBlGCEmljemYm86OLh3H1eSfw+bI83p+3mbU5hbz7+Sbe/XwTg3qlcu6E3kwckUWszxvucEXqpQQl0kbFxURz+pienD6mJ5vy9vH+vM3MWry1+t6qF95ZxYWT+nHexD4kxauoQiKPEpRIO9CnW0d+cukIrrlgCHOWbuO9uZvI3raPl/+zhn/NXM+543tz0ZR+dNJoFRJBlKBE2pH42GjOPrkXZ43rybL1O/nXzPUsW7+Lf8/ewLRPszl9TA8u+UZ/uqUnhTtUESUokfbI4/FUD6+0LreQf81cz/yV2/lgfg4zFuQwYXg3LjttgMrUJayUoETauYE9U/mfa8aypeAAb87ewKzFW/hsWR6fLcvjROvMZacNYGi/NI1SIS1OCUpEAOjRpQO3XD6KK88exNtzNvL+vM3V09dbz1QuPW0A44ZkEhWlRCUtQwlKRI6SnhLPdRcO5dunD+TdzzfxzqfZuNxCfv+3hfToksSl3xjAqSd2x+uNCneo0sbpDBOROiUnxnDFWcYLvzqTH108lPSUeLYUFPHIq0u5+cFZLFyVT2VlZbjDlDZMLSgROaa42GgunNSPc8f34ZMlW3l1hmNLQRG/e2EBQ/qmce03hzCwZ2q4w5Q2SC0oEWkQX3QUZ4ztyV/vPI0fXTSUDgkxrMrezc8fncOfXlrE9l0Hwx2itDFqQYlIo/iivVw4uR+njenJGzPXM23ORj5blsf8lds5d0IfLj9jIB2TYsMdprQBakGJSFCS4n18//zBPPWLMzh9TA/KKyp559Nsrv/DR7z+8ToOlx4Jd4jSyilBiUiTZKTGc+t3TuTR209l9KDOFB8+wkvvreGGP37MRwtzKK9QIYUEJ+guPjOLAgYBnYFyIB/Y4JzT2SjSDvXp1pG7fzSeZet28uK7q9i4dR+PvvYlb32ykWsuGMLoQZ11s680SqMTlJlNBn4GnAF0qLGpEig0s/eBJ51zc0MTooi0JiMGZvBQ/ynM+XIbL7+3mpz8A9zz3HyG90/n2m8O0fBJ0mAN7uIzswFmNhN4AcgGLgGygDggAegNXAPkAa+a2SwzGxjqgEUk8kVFeTj1xO489YvTue7CISTF+1i+YRe3PzqHF95ZpetT0iCNaUH9L3Cvc+7derZvCSzTzexO4OLAMWObFqKItFa+aC8XT+nPGWN68soMx/RPs3lz9gbmLs/jpstGMMo6hztEiWCNKZI4+RjJ6SjOuUrn3JvAuODCEpG2JCkhhh9dNIypt0ymT7dkCvYU85tn5vHQPxezr6gk3OFJhGpQgjIzA04zsw611l9wrONUMCEiNQ3smcpDt07he+edQEx0FLMWb+XGP89k9uItGjZJvua4CcrMbgLeBm4BVpnZt2psvre5AhORtinaG8W3Tx/I43d8g+H909l/sJQH/7mEu5+dT8Ge4nCHJxGkIS2oHwOjnXMXAVOAX5nZ7YFtqhkVkaB0S0/ivhsm8LPLR5IU72OJ28FNU2fy1icbKC+vCHd4EgEakqCinXMHAZxzm4BTgbPN7CGUoESkCTweD2eM7cWTd57G5JFZlJSW8/y0Vfz3Y3PI3rYv3OFJmDUkQeWb2ciqF865A8D5QDowrLkCq4+Z3WZmb9Wzrb+Z7TOzpJaOS0SCl9ohjjuuPonfXDeO9JR4Nmzdx22PfMLfpqskvT1rSIL6Hv5RIqo55444574HTG6WqOpgZklmNhV4sJ7tlwJzgOSWiklEQmvM4Ez+csc3+OakvlRWVvLGrA3c8sBslq3bGe7QJAyOm6Ccc1udc/n1bPs89CHV612gD/B07Q1mdj3wB1S0IdLqJcT5uP7iYUy9eRK9uyazffdBfvX0XJ59ewVlR3Rtqj0Jaiw+M0sH9jjnQna2mFkM0KmOTZXOuQLgCudcnpndDXSttc804Dmgb6jiEZHwsl6dePi2Kbwxaz2vfOCYNiebNZv28P+uPonMtMRwhyctINjRzP8F3Fb1wswuMLP7zGx0E2KZAGyvY9kG4JzLq+9A51x+KJOliESGaG8Ul59h/Omnp9A5NZ71W/Zy60Oz+Xx5vb8OpA0JdjTzYfgHjMXMegBvAA641cwucM7NbuwbBo5RVaCIfI316sSjt5/Ko68tZf7KfP7490WcP7EP135zCDE+b7jDk2YSbAsqDtgTeH4ZsMA5Nxz4FfCbUAQmIlJTUkIM/3PNWK6/eBjR3ije/XwTdzz+KXm7isIdmjSTYBNUNjA48PwS4NXA82nAiKYGJSJSF4/Hwzcn9WXqzZPITEsge9s+bn3oE+Ys3Rru0KQZBJugngH+ambP4R8Q9p3A+nggJhSBiYjUp3+PFB657VQmjujGoZIjTP3fxTzx+peUlJWHOzQJoaCuQTnnHjezSuAc4KfOuS2BTeOAnFAFV89n332MbRvQdSyRdiEx3sedV5/E+/038+zbK/lgfg4up5A7v3cS3Tt3OP4bSMQLesp359wTwBO1VqfxVXefiEiz8ng8nDuhD9arE396aRGbt+/ntoc/4cbLRvCN0T3CHZ40UYMTlJmtBz4EZgAznXP7a+/jnJsawthERBqkb1ZHHr5tCk/+azmfLN3KQ/9cwvL1u/jxt4YRFxv03+ESZo35lzsfOBP4AfCCma3hq4Q1X/chiUg4JcT5+PlVJzJ8QDpP/3s5Hy3KxeX6u/x6ZWoEtNaowUUSzrl1zrm/BKbdyADuDBz/ILDDzN40s5+YWf9milVE5Jg8Hg9njevFQ7dOoUeXJLYUHOCOxz5lqdsR7tAkCEFV8Tnnyp1znznnfuucGw/0A14GhgP/CWWAIiKN1atrMg/9bAqnBKr87nluPh8tbNb6LWkGQXfOmlkC/sFbYwOrNgPPBhYRkbCKi43mju+eRJdOq3lj1gYefe1LdhQe4oqzDI9Hxb6tQbCDxX4XeAr/fU9V/9KVgeeVgMYeEZGwi4rycM0FQ+jcKYGn/72cVz50FOwp5qffHokvOtjbQKWlBPsv9Afgefyjh3cNLN1qPIqIRIzzJvThl9eOIzbGy8wvtnDvc/M5eKgs3GHJcQTbxZcMPOGcU6euiLQKYwdn8ocbJ3Lv8wv4cv1OfvGXz/jtD08mPSU+3KFJPYJtQb0MXBPCOEREmt2AHqk8cMtkundOYvP2/fz80TlsytsX7rCkHsG2oKYCS8zsKvzFEUfdA+WcO62JcYmINIsunRKYevMk7ntxIauyd3PnE5/xi++P4UTrHO7QpJamtKCK8E/DvghYXGsREYlYSQkx/O7H45k8Kqu6DH3GAl2xiDTBtqDGAOOcc8tDGYyISEvxRXv5+ZWj6dIpgdc/Xs9j//clBYXFXHX2IJWhR4hgW1AOSAllICIiLS0qysP3zhvMjZeNIMoDr81Yx8OvLKHsiEZuiwTBtqD+APzNzJ4ANgJH1Ws6595ramAiIi3l3PG9yUiJ508vLWLW4q3s3neYu64ZS1K8L9yhtWvBtqBeAXoDDwBvAtNrLO/Uf5iISGQ66YQu/OGmU0jtEMvyDbu484lP2b3vULjDatcaM91GinNuL4BzrkGJzcxSnXOFwQYnItKS+ndP4YFbJnP3c/PIzT/Ar56ay+9vnEhqh7hwh9YuNaYF9YmZ3WlmHY+3o5mlm9mvgDnBhyYi0vI6d0rgjzdNonfXZLbuKOLXT81lX1FJuMNqlxpzDWoicB+w1cw+B94HVgG78I/BlwGMAKYAk4C/B44REWlVkhNj+N2PJ/A/f/2MnPwD/OaZedx/wwSSEmLCHVq70pj5oIqcc7cCA4B5wJXAe/jve/oCmAZcAswHBjnnbq5r1l0RkdYgpUMs990wka7piWRv28dvn51H8WGN39eSGl3F55zLB+4B7jGzKCANqHDO7Q51cCIi4dQpOY77b5jIL578jHW5e7n72fncc/144jWNfIto0njzzrkK59xOJScRaasyUuO5/4YJpKfEs2bzHn73/AIOlx4Jd1jtgiZEERE5jsy0RO6/YQKdkmNZsXEXv39xIaVl5eEOq81TghIRaYBuGUncd8NEUpJiWbpuJ398aZFGnGhmSlAiIg3Uo0sHfnfDBDok+Fi0uoCp//sFR8qVpJpLkxKUmfnMLN7MEmouoQpORCTS9O6azL0/nkBiXDTzVmzn4X8uobyiMtxhtUlBJSgzO9nMlgGH8U+7caDWIiLSZvXvnlJdzTfny2089tpSKpSkQi7YWslHgH3AxYDudRKRdsd6deK3PzyZ3z47j5lfbMEXHcVNl43QVB0hFGyCGgac7JxbEcpgRERakyF90/j1teO497n5fDA/B190FNdfPExJKkSCvQa1BugWykBERFqjEQMy+OUPxhHtjWL6Z5t4cfpqKivV3RcKwbagHgeeNbPHgfVAac2Nmg9KRNqTEwd15q7vj+H3f1vIm7M3EBfj5cqzB4U7rFYv2AT1YuDxT3VsqwS8Qb6viEirNHZIJndcfRJ/fvkLXvnQkZWRxJQTu4c7rFYtqATV0PmgRETak4nDu/HDC4fyzFsreOy1pWRlJNG/R0q4w2q1mjTioZmdDgzBfy1rDfCxc06DVIlIu3XBKX3YlLePGQtzue/FBTx86xRSkzXhYTCCvQ8q08zmA/8BfgrchH+q9yVm1jmE8YmItCoej4efXDqcE3p3Yve+w/z+bwspO6Jx+4IRbFfdo8ARoI9zbqBzbgDQG9gDPBSi2EREWiVftJe7rhlDeko8a3MKefJfy1XZF4RgE9Q5wC3OuW1VK5xzecDPgfNCEVh9zOw2M3ur1rrRZjbHzPaaWa6Z/cbMdCOCiIRNaoc4fvmDscT4vHy0KJd3Ps0Od0itTrAJ6jD+ar3amq2Cz8ySzGwq8GCt9QnAu8D/4Z888XTgGuBHzRGHiEhD9e+ewq2XjwLg+WkrWep2hDmi1iXYBPUh8JCZdalaEXj+IPBBKAKrw7tAH+DpWut7APOcc08458qdc+uBt4BTmikOEZEGmzQqi/86YyAVlfDnl78gb1dRuENqNYKt4rsDmAnkmFlOYF0vYDlwZTBvaGYxQKc6NlU65wqAK5xzeWZ2N9C1aqNzzgHfqvU+5wLPBBOHiEioXXX2IHK272fBqnzue2EBD9wymYQ4X7jDinhBtaCcc/nAcOBS4HngCeAC59xY59z2IGOZAGyvY9kW+My8472BmcUCrwDFwFNBxiEiElJRUR5uv/JEemZ2YEtBEQ/8Y7Gm6GiABregzOw8YIZzrizwHPzXnFYGnsdUrQ9mqCPn3Gwg6MIGM8sE3gAqgDOcc4eCfS8RkVBLiPPxqx+M4+ePfsKi1QX84/01fO+8weEOK6I1potvOpAJ7Ag8r0+LD3VkZoPxX/uaCVzvnCtpyc8XEWmIrumJ3Hn1GH7z7Dxe/3g9vTKTNRzSMTQ4QdUc3iiShjoys1T8RRuvOuf+O9zxiIgcy4iBGRoOqYGCHUlippl97Rs1swwzW9z0sBrlaiAL+ImZFdVYXmnhOEREGuSCU/pw5tielB6p4P4XF1C4/3C4Q4pIjbkGdSpQ1WE6BfixmdWe3v0EoF9oQqubc+7uWq8fAx5rzs8UEQmlquGQtu4oYs3mPfz+bwv5/Y0T8UVrIoiaGnMNajfw3/gLGTz4x9+rOcBUJVCEfzQJERE5hqrhkG5/ZE71cEi3XD5Ss/HW0JhrUCuAvgBmNgu4xDlX2FyBiYi0dVXDId35xGd8tCiXPt2SuXBys3ZCtSrB3gf1jbqSk5nFmNn4poclItI+1B4OaeXGXWGOKHIENZKEmZ2Mf8ihwXw9yVUG+74iIu3RpFFZZOft418z1/Pwq0t5/OenaqQJmjbdxk7gO8Ah4LvAXfivQV0RmtBERNqPK88eRN+sjuzYU8wL76wKdzgRIdgENRy43Tn3BrAUKHDO/Rn4GXBrqIITEWkvfNFR3H7lifiio/hgfg5frCkId0hhF2yCOgLsDzxfB4wMPJ+Ffwp4ERFppF6ZyXz3nBMAeOy1pew/WBrmiMIr2AS1ALjRzKKAZfhHDwcYCrTvb1REpAkumtKPIX3TKDxQwlP/Xh7ucMIq2AR1F/AD4HbgZWCwmWXjnzTwnyGKTUSk3fFGebj1O6OIi/Hy6Zfb+HTptuMf1EYFW2a+COgN/D1Qbj4aeAC4FrgtZNGJiLRDmWmJXHfhUAD++u9l7N7XPidnCHYsvulAT+fcTvDPD+Wce9I595pzTpOciIg00dkn92L0oM4cKC7j8f/7ksrK9verNdguvpOBslAGIiIiX/F4PNz8XyNJivexeO0OPlyQc/yD2phgb6h9GHjJzB4GsvHfC1XNObe6qYGJiLR3aR3jueGS4Tzwj8U8P20lIwZkkJmWGO6wWkywLajf4W9FvQYswj+rbtWyIjShiYjI5FFZnDKiG4dKynnk1aVUtKOp4oNNUH2OsfQNTWgiIuKfmmMEqR1iWZW9m2mfbgx3SC0m2Cq+HOdcDpAInAjsCrxXbmC9iIiESHJiDDf/l388hJfeW0NO/v7jHNE2BFvFl2xm7+Hv0nsd6IL/utQyM+sewvhERAQYMziTM8f2pOxIBQ+/soQj5RXhDqnZBdvF9yAQC3TnqwKJW4C9wCMhiEtERGr54UVD6dwpgY1b9/F/H60LdzjNLtgEdT5wh3Mur2qFcy4XuBk4LRSBiYjI0RLifNz6nVF4PPDaR+tYv6VtzxkbbIJKolZpeYC3Ce8pIiLHMaxfOhdO6kdFRSUPv7KEkrLycIfUbIJNJu8Dd5tZ1YxalWaWgX+4oxkhiUxEROp09Xkn0KNLElsKinj5vTXhDqfZBJugbgZ6ALuBBOAjIBfoiH9OKBERaSaxPi+3XXEiUVEepn26kRVtdJr4YMvMC5xzE4CL8BdHPBZ4flLN61IiItI8BvRI5fIzBlJZCY+8upTiw21v9LkGD3VkZoPrWF0QWKqcYGYa6khEpAX81xkDWbQ6nw1b9/HCO6v46bdHHv+gVqQxLaiqYYxW1rGsqLFNQx2JiLSAaG8Ut11xItHeKD5ckMOGLXvDHVJINSZBVQ1jVN/wRn3RUEciIi2qZ2Yy35zUl8pKeG7ayjY1LUeDu/jqGsIo0O1nwIdAZ2Cz5oMSEWlZl58xkJlf5LIqezdzV2xn4vBu4Q4pJDTUkYhIK5cY7+OqswcB8OI7qyhtI/dGaagjEZE24KxxveiZ2YGCPcW882l2uMMJCQ11JCLSBni9UfzwwqGAfxikwgOHwxxR02moIxGRNmKUdeakE7pwqOQI/3h/bbjDaTINdSQi0oZc+80heKM8zFiQw+btrXveqFAPdZSMhjoSEQmbHl06cN7EPlRUwnNvr2jVZeehHupojIY6EhEJryvOMpLifSxbv4tFqwuOf0CEavB9UHVxzs0CZoUoFhERCYEOCTFccZbx7NsreeGdlYyyzviiW195QLD3QUWb2b1m9uMa6xaY2a/NrPV9CyIibcx5E/uQlZHEtp0H+c/cTeEOJyjBJpMHgKuBmsX2fwGuAX7XxJiOycxuM7O3aq0bb2bzzWy/mW0NJEpPc8YhIhLJor1RXHvhEJOb8OoAAA6mSURBVAD++aFj/8HSMEfUeMEmqMuBK51z1RV7zrmXgO/jT1IhZ2ZJZjYV/03CNdfHAu8AL+Cfj2oycCPwreaIQ0SktRhzQhdGDsjg4KEyXvmw9ZWdB5ugEoCiOtYX4k8SzeFd/IPRPl1zpXOuBOjjnHsmsCoN//1Ye5opDhGRVsHj8XDdRUOJ8sB7czezpeBAuENqlGAT1Czgz2bWqWqFmaUA9wOzg3lDM4sxs8w6li6BXa5wzl3G0fNPAeCcq/rWtwEL8Ze9zwkmDhGRtqR312TOOrk3FRWVvPDOqnCH0yjBJqhbgH7ANjNba2ZrgO2BdTcH+Z4TAu9Re9kG0MDy9b7AQGA0cE+QcYiItClXnT2IhLhovlhTwJK1O8IdToMFVWbunMs1s6HAGcBgoBRwwAznXEWQ7zkbaFJhg3PuMLA+cK3qFuDXTXk/EZG2IKVDLJefMZAXp6/muWkreXzAqXi9kV9wHXSZOfAroIdz7gHn3GPAvcAvW7rM3MwGmNkGM0ussToW/8jqIiICfHNSXzLTEthScIAPFnxter+I1OrKzOuwESgB7jMzX2ASxf8Gnm3hOEREIpYv2ss1F/jLzv/x/lqKDpWFOaLjazVl5vUJdCleCAwCdgJvA392zr3cknGIiES6CcO6MqRvGvsPlvLaDBfucI4r2KGOwlFmDoBz7u461m0Ezm3OzxURae08Hg8/vGgotz/yCdM/y+bcCb3plp4U7rDqFeoy898Dn4QiMBERCb3+3VM47aQeHCmv5G/TV4c7nGMKZZl5Hv4y75+GKjgREQm9q889gbgYL/NWbGf5hp3hDqdewU63kQsMBS4DngP+ClwCTME/HbyIiESotI7xXHbaAACef3sV5RWROWdU0CXhzrlS59y7zrkHgLX4iyO2AY+EKDYREWkmF5/an/SUeLLz9jF/5fZwh1OnoBOUmfU2s3vMLAf4D/4ihWfx37grIiIRLNbn5aLJfQH47MttYY6mbo2q4guMHH4ZcC3+7rwK/GPvZQGTnXPLQh2giIg0j/HDuvH8tFV8saaAkrJyYn3ecId0lAa3oMzsSSAfeAY4AFwHdHHOnQVUApF/15eIiFTr0imB/t07cri0nKUu8sboa0wX3w34RxK/AbjOOfd351xh84QlIiItYcLwbgDMXd6Q8bhbVmMS1DfwT2HxKJBvZrPN7GYz6948oYmISHOrSlALV+VTdiSosb6bTYMTlHPuE+fc9UAm8B38EwJOBXIC73OJmSU3S5QiItIssjKS6JXZgYOHj0TcPVGNruILlJe/4Zy7BH+yuhH4HP/8S3lm9lyIYxQRkWY0MdCK+nxZZHXzNWlqDOfcXufc0865yfinY/8DMD4kkYmISIuo6uabvzKf8vLI6eYLdrDYrwmMLnF/YBERkVaiZ2YHsjIS2bbzICuzdzNiQEa4QwKa2IISEZHWz+PxRGQ1nxKUiIgwYVhVN992KiJkbD4lKBERoV/3jnTulMCe/SWszdkT7nAAJSgRESHQzTesKwBzl0fG4LFKUCIiAnzVzTd3RR6VleHv5lOCEhERAKxXKp2S49hZeIj1W/aGOxwlKBER8YuKqtnNF/5qPiUoERGpVl1uvmJ72Lv5lKBERKTa4L5pdEyKYfuug2zevj+ssShBiYhINW+Uh5OHRkY1nxKUiIgcpWY1XzgpQYmIyFGG9U8nMd5Hbv4Btu44ELY4lKBEROQovugoxg3JBMLbzacEJSIiX1Ndbh7Gbj4lKBER+ZpR1pn4WC8bt+4jf/fBsMSgBCUiIl8T4/My5oTwdvMpQYmISJ2+umk3PN18SlAiIlKn0YM6E+Pz4nIK2bX3UIt/vhKUiIjUKS42mtGDOgMwb0XLd/MpQYmISL3CWc2nBCUiIvUaMziTaK+H1dm72XugpEU/WwlKRETqlRjvY+TAzlRUwvyVLdvNpwQlIiLHNHG4v5vv8xaeI0oJSkREjmnskK5ERXlYsWEXB4pLW+xzW12CMrPbzOyterb5zGyxmd3dwmGJiLRZyYkxDO+XTnlFJQtW5rfY57aaBGVmSWY2FXjwGLvdB4xsoZBERNqNCcNbvpqv1SQo4F2gD/B0XRvN7FTgTOCDFoxJRKRdOHloVzweWOp2Uny4rEU+M7pFPqUBzCwG6FTHpkrnXAFwhXMuL9B917XWsanAs8C38LeiREQkhFKT4xjcJ41V2btZtLqAKSd2b/bPjKQW1ARgex3LNgDn3LHalU8BTzrnVjZ3kCIi7VVL37QbMS0o59xswNPY48zsGiAdeCTEIYmISA3jh3Xj2bdXsnjtDg6XHCEutnlTSCS1oIJ1BTAWKDSzvcD5wC/MbHp4wxIRaVsyUuOxnqmUlJaz2O1o9s+LmBZUsJxzZ9d8HShB/9I5d3d4IhIRabsmDO+Kyy1k7vI8Jgam42gubaEFJSIiLaRqjqhFqwsoO1LerJ/V6lpQx2sZOecubqFQRETancy0RPp260h23j6WrtvJ2MGZzfZZakGJiEijVN+028xj8ylBiYhIo1R1832+LK9Zx+ZTghIRkUbp0aUDowZmcLi0nOmfZjfb5yhBiYhIo3379IEAvPNZNodKjjTLZyhBiYhIow3tl4b1SuVAcRmzl2xtls9QghIRkUbzeDz84IIhdEqOIy05rlk+o9WVmYuISGQY0jeNv//27OPvGCS1oEREJCIpQYmISERSghIRkYikBCUiIhFJCUpERCKSEpSIiEQkJSgREYlIug8KvAD5+fnhjkNEpN2p8bvXW3ubEhR0BbjqqqvCHYeISHvWFdhYc4USFCwCJgHbgeadHlJERGrz4k9Oi2pv8FRWVrZ8OCIiIsehIgkREYlISlAiIhKRlKBERCQiKUGJiEhEUoISEZGIpAQlIiIRSQlKREQikhKUiIhEJI0k0QBmNgJ4ChgOZAPXOue+dtezmfUEngdOBnYANzvn3mvJWMOlEd/RacAM4FCN1X9yzv2uRQINMzMbC0x3znWuZ3u7PYeqNOA7apfnkJmdCfwRGID/3JjqnHu6jv3azDmkBHUcZhYDvA08AkwGLgU+NLNezrn9tXZ/FZgHnA+cArxlZiOdc9ktGXNLa+R3dCLwunPuOy0cZliZmQe4DnjgOLu2y3MIGvUdtbtzyMx6AG8A38f/f2008IGZbXbOfVBr9zZzDqmL7/hOBXzOuUecc2XOuVeBVcDlNXcys4HAScBvnHOlzrmZwDT8/+HaulNpwHcUMBr4siWDixD3AD8B7qtvh3Z+DkEDvqOA9ngO9Qb+6Zx70zlXEeidmA1MrLlTWzuHlKCObzCwpta6tcCwOvbLdc4dPM5+bVFDvyPw//V7hpnlmFmumU01s9hmjzD8nnLOjQa+OMY+7fkcgoZ9R9AOzyHn3KfOuRuqXptZJ/yDXC+ttWubOoeUoI4vCSiuta4YSAhyv7aoQT+7mUUDW4E3gROA04AzgDZ97QDAOZfXgN3a8znUoO+oPZ9DVcysI/5W0QL83X01talzSNegju8gEF9rXQJQFOR+bVGDfnbn3BHg9BqrNpjZ/cCfgP/XrBG2Du35HGqQ9n4OBbrw3gZWA1c55ypq7dKmziG1oI5vNWC11g0KrK+9X08ziz/Ofm1Rg74jM8syswcCRRVVYoDDzRxfa9Gez6EGac/nkJlNxt9qegu4zDlX18/cps4htaCObxbgMbPbgCfwV6gNx9/FUM0558xsGXC/md0FTAAuAsa3cLzh0KDvCNgNXAUUm9m9QB/gV8ALLRhrxGrn51BDtctzyMz6AdOBXzrnHq9vv7Z2DqkFdRzOuVLgXPy/dPcAvwQuds7tNLOrzKxm0/lS/P3iO4DngOuccytbOuaW1tDvKPAX37n4S9F3A3OA14GHwhJ4BNA5dHw6hwC4CegA/MHMimosf2rL55Bm1BURkYikFpSIiEQkJSgREYlISlAiIhKRlKBERCQiKUGJiEhEUoISEZGIpBt1RZqJmf0N//QI9bkH/4jUs4AOzrkWGY7GzLzA58D3nHPrjrFfFDAfuNo551oiNpGa1IISaT4/A7oGllMD68bWWPcAMDfw/GAdxzeXW4Blx0pOAIFx3u7FPxGlSIvTjboiLcDMhgIrgD7Ouc1hjCMOyAVOa+joAma2Ef9oBLObMzaR2tTFJxJGZnYqNbr4zKwSuAK4C/8AvF8A3wXuAK4G9gN3OedeDhzfAXgQuAyoBGYCPzvG1BXfAfbWTE5m9mvgeiAD/7xe/+Oc+0+NY97E3xqcHYIfWaTB1MUnEnn+CNwKnAz0BJbgT0xjgH8DT5tZUmDfZ/AnsrOBKfiT1AeBeZPqcj7wftULM/tW4LO+i3/U63eB180sucYx7+OfIFB/0EqLUoISiTx/cc7Ncs59iX8E6yL8rRqHf1DUeKCPmfXF3yK60jm3KNAquhr/9ODn1PPeJwGrarzuDZQAOYGux3uBS4CyGvusxj8R3qCQ/HQiDaS/iEQiz4Yaz4uBzc65qovFVXMAxQK9As+d2VHTcSXgb1VNr+O9uwC7arz+X/yVhtlmthj/TK0vOucO1dhnd+CxcyN/DpEmUQtKJPKU1Xpde9bUKtGBfUcBI2ssA4EX6zmmAvBUvXDO7QRG429xzQWuAZYHijqqVP2eKG/wTyASAkpQIq3XGsAHJDrnNjjnNgDbgan4k1Rd8vEXQwBgZpcAP3bOfeic+xn+ltcB4Lwax2TUOFakxaiLT6SVCsyeOg14ycxuAnYC9+Mvrlhbz2GLgRE1XnuBqWZWgL9i8GQgM/C8ygigkKO7HkWanVpQIq3b9/Enk7eARUBH4Ezn3N569n8Xf7UfAM6514Hf4m91rQPuA37qnJtZ45jJwPvOOXXxSYvSjboi7YiZJQCbgXOcc0sasH8UkIO/UvDTZg5P5ChqQYm0I865YvytpZsaeMhFQLaSk4SDEpRI+/MwMNxq1abXFmg9/RK4oUWiEqlFXXwiIhKR1IISEZGIpAQlIiIRSQlKREQikhKUiIhEJCUoERGJSP8f0LW+O37ZvbcAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "a = gradient(results.v)\n", - "plot(a)\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Acceleration (m/$s^2$)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The maximum downward acceleration, as a factor of `g`" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "max_acceleration = max(abs(a)) * m/s**2 / params.g" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using Equation (1) from [Heck, Uylings, and Kędzierska](http://iopscience.iop.org/article/10.1088/0031-9120/45/1/007), we can compute the peak acceleration due to interaction with the cord, neglecting drag." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.625 dimensionless" - ], - "text/latex": [ - "$1.625\\ dimensionless$" - ], - "text/plain": [ - "1.625 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def max_acceleration(system):\n", - " mu = system.mu\n", - " return 1 + mu * (4+mu) / 8\n", - "\n", - "max_acceleration(system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you set `C_d=0`, the simulated acceleration approaches the theoretical result, although you might have to reduce `max_step` to get a good numerical estimate." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping cord weight\n", - "\n", - "Now let's see how velocity at the crossover point depends on the weight of the cord." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_m_cord(m_cord_array, params):\n", - " sweep = SweepSeries()\n", - "\n", - " for m_cord in m_cord_array:\n", - " system = make_system(Params(params, m_cord=m_cord))\n", - " results, details = run_ode_solver(system, slope_func1, events=event_func)\n", - " min_velocity = min(results.v) * m/s\n", - " sweep[m_cord.magnitude] = min_velocity\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "m_cord_array = linspace(1, 201, 21) * kg\n", - "sweep = sweep_m_cord(m_cord_array, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like. As expected, a heavier cord gets the jumper going faster.\n", - "\n", - "There's a hitch near 25 kg that seems to be due to numerical error." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(sweep)\n", - "\n", - "decorate(xlabel='Mass of cord (kg)',\n", - " ylabel='Fastest downward velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Phase 2\n", - "\n", - "Once the jumper falls past the length of the cord, acceleration due to energy transfer from the cord stops abruptly. As the cord stretches, it starts to exert a spring force. So let's simulate this second phase." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`spring_force` computes the force of the cord on the jumper:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def spring_force(y, system):\n", - " \"\"\"Computes the force of the bungee cord on the jumper:\n", - " \n", - " y: height of the jumper\n", - " \n", - " Uses these variables from system:\n", - " y_attach: height of the attachment point\n", - " L: resting length of the cord\n", - " k: spring constant of the cord\n", - " \n", - " returns: force in N\n", - " \"\"\"\n", - " L, k = system.L, system.k\n", - " \n", - " distance_fallen = -y\n", - " extension = distance_fallen - L\n", - " f_spring = k * extension\n", - " return f_spring" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The spring force is 0 until the cord is fully extended. When it is extended 1 m, the spring force is 40 N. " - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.0 newton" - ], - "text/latex": [ - "$0.0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "0.0 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spring_force(-25*m, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "40.0 newton" - ], - "text/latex": [ - "$40.0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "40.0 " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spring_force(-26*m, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The slope function for Phase 2 includes the spring force, and drops the acceleration due to the cord." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func2(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing g, rho,\n", - " C_d, area, and mass\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " M, g = system.M, system.g\n", - " \n", - " a_drag = drag_force(v, system) / M\n", - " a_spring = spring_force(y, system) / M\n", - " dvdt = -g + a_drag + a_spring\n", - " \n", - " return v, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll run Phase 1 again so we can get the final state." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    M75 kilogram
    m_cord75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    L25 meter
    k40.0 newton / meter
    C_d0.3402777777777778 dimensionless
    mu1.0 dimensionless
    inity 0 meter\n", - "v 0.0 meter / secon...
    t_end10 second
    \n", - "
    " - ], - "text/plain": [ - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "M 75 kilogram\n", - "m_cord 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "C_d 0.3402777777777778 dimensionless\n", - "mu 1.0 dimensionless\n", - "init y 0 meter\n", - "v 0.0 meter / secon...\n", - "t_end 10 second\n", - "dtype: object" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system1 = make_system(params)\n", - "system1" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func.direction=-1\n", - "results1, details1 = run_ode_solver(system1, slope_func1, events=event_func)\n", - "details1.message" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I need the final time, position, and velocity from Phase 1." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.2118255911654763" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results1)\n", - "t_final" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    y-25.0 meter
    v-23.876881009672466 meter / second
    \n", - "
    " - ], - "text/plain": [ - "y -25.0 meter\n", - "v -23.876881009672466 meter / second\n", - "Name: 2.2118255911654763, dtype: object" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init2 = results1.row[t_final]\n", - "init2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And that gives me the starting conditions for Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    M75 kilogram
    m_cord75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    L25 meter
    k40.0 newton / meter
    C_d0.3402777777777778 dimensionless
    mu1.0 dimensionless
    inity -25.0 meter\n", - "v -...
    t_end10 second
    t_02.21183
    \n", - "
    " - ], - "text/plain": [ - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "M 75 kilogram\n", - "m_cord 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "C_d 0.3402777777777778 dimensionless\n", - "mu 1.0 dimensionless\n", - "init y -25.0 meter\n", - "v -...\n", - "t_end 10 second\n", - "t_0 2.21183\n", - "dtype: object" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system2 = System(system1, t_0=t_final, init=init2)\n", - "system2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run Phase 2, setting the direction of the event function so it doesn't stop the simulation immediately. " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'A termination event occurred.'" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func.direction=+1\n", - "results2, details2 = run_ode_solver(system2, slope_func2, events=event_func)\n", - "details2.message" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "8.09952482949752" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results2)\n", - "t_final" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the results on the same axes." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results1, label='Phase 1')\n", - "plot_position(results2, label='Phase 2')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And get the lowest position from Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-77.04609533183535 meter" - ], - "text/latex": [ - "$-77.04609533183535\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-77.04609533183535 " - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results2.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see how big the effect of the cord is, I'll collect the previous code in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "def simulate_system2(params):\n", - " \n", - " system1 = make_system(params)\n", - " event_func.direction=-1\n", - " results1, details1 = run_ode_solver(system1, slope_func1, events=event_func)\n", - "\n", - " t_final = get_last_label(results1)\n", - " init2 = results1.row[t_final]\n", - " \n", - " system2 = System(system1, t_0=t_final, init=init2)\n", - " results2, details2 = run_ode_solver(system2, slope_func2, events=event_func)\n", - " t_final = get_last_label(results2)\n", - " return TimeFrame(pd.concat([results1, results2]))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run both phases and get the results in a single `TimeFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "results = simulate_system2(params);" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3hUVf7H8fekE0LoJdRQ5FBDR4oioquiqIiIq9gRey/rrv50V3ddXV27qy4WLKBYqSpiAUHpvR8gEGpCD6TX+f1xBzbEBANkcmeSz+t55jG5M5P5AGa+c84993w9Xq8XERGRQBPidgAREZGSqECJiEhAUoESEZGApAIlIiIBKcztAP5mjIkEegHJQIHLcURE5FihQBywyFqbU/SOSl+gcIrTHLdDiIjIcZ0J/FL0QFUoUMkA48ePp1GjRm5nERGRIlJSUhg5ciT43quLqgoFqgCgUaNGNG3a1O0sIiJSst+cgtEiCRERCUgqUCIiEpBUoEREJCCpQImISEAKmkUSxpguwFtAArAZuMlau8jdVCIi4i9BMYIyxkQAk4FPgVrA08AMY0ysq8FERMRvgmUENRAIt9a+7Pt+gjHmLuBK4G1/vrDX62XDtoNk5xYQERZKeHgIkeGhxFaPILZ6BB6Px58vLyJSZQVLgeoArCt2bD3Q2d8vvGjdbv7+7oIS7wsL9VCrRhR1YiOJqxtDs0YxNG9Yg6YNatC4fgyhISpeIiInK1gKVAyQWexYJhDt7xdu07QWA7o2ITU9h5y8AvLyCsnJyyc1PZeMrDz2pWaxLzWLDdtSj3letcgwTIvatI+vQ7v4OnSIr0NUZLD8dYuIuC9Y3jEzgGrFjkUD6f5+4TqxUTx8bc8S78vJK+Dg4Wz2H8pm1950tu1OY8eedLamHGbvwSyWb9jL8g17AQgLDaFz67r07NCQXu0bEVevur+ji4gEtWApUGuB+4sdawd86EKWoyLDQ2lUtzqN6lanY6u6x9x34HA265IOsD7pAGs272fTjlSWbdjLsg17eXvSauLjYhnYvSlndW9KvVrFa6+IiARLgZoJeIwx9wOvA5fjLDef6Gqq46gTG0X/hMb0T2gMwKH0HJas38PidbtZun43ScmHef/rtXzwzVo6t67HOb2ac2bXxoSHhbqcXEQkMARFgbLW5hpjBuNcB/UUkAQMtdbudTXYCagZE8mgns0Y1LMZefmFLF2/m5lLd7BwTQorN+1j5aZ9vDd1Need3oLBfVtSv7ZGVSJStQVFgQKw1q4GznA7R3kIDwvh9E5xnN4pjoysPH5ZsZNvfk1i865DfP7jRr6cuYn+CY0ZcW5b4uN0qZeIVE1BU6Aqq+rVwjm/Tzznnd6CdUkHmPbLFuau3MWc5TuZs3wnfTvHceW5bWndtJbbUUVEKpQKVIDweDx0aFmXDi3rsi81iy9nbmTG/K3MW5XMvFXJnN6xEddf1IFmDWu4HVVEpEIExVZHVU29WtW49bIE3n7sDww9qzUR4aEsWJPCXf+eyVtfreRQeo7bEUVE/E4FKoDViY1i1CWdeOfRczm/Twvwevn61y3c8swPfDVzI/kFhW5HFBHxGxWoIFA7Noq7rujKqw+eTY92DcjMzmfstLXc/9LPrE864HY8ERG/UIEKIi3iYvnb6L78bXQfGtWNJin5MA+/Nof/fLGC9Mxct+OJiJQrFagg1KNdQ15/eBAjzm1LWKiH6fOSuOO5n1i8brfb0UREyo0KVJCKDA/l2sHteeWBgbSPr8PBtByefGc+//liBVk5+W7HExE5ZSpQQa55o1ieufMMbhzSgbDQEKbPS+LeF2bp3JSIBD0VqEogNMTDsLNP48X7BhAfF0vy/gwe+c8vfPnTRgoLvW7HExE5KSpQlUjLxjV58b4BXDawDYWFXt7/ei1Pj11ImhZQiEgQUoGqZMLDQrnp4o48ftPpVK8WzsK1Kdz34iw2bDvodjQRkROiAlVJ9e7YiFceGEibZrXYczCLR17/hR8XbXM7lohImalAVWIN60Tz3F1nMLhfPPkFhbw8YRljp66hQOelRCQIqEBVcuFhodxxeRfuuDyB0BAPX83axNNjF5CZned2NBGR41KBqiIG92vJU7f2pUZ0OIvW7ubh1+aw92CW27FEREqlAlWFJLSpzwv3nkWzhjFsS0nj4ddmszX5sNuxRERKpAJVxcTVq85zd51Jx1Z12X8om0f+8wtrNu93O5aIyG+oQFVBMdERPHlLX/p2dlrOP/7fucxbtcvtWCIix1CBqqIiw0N55LpeDO4bT15+Ic9+sEjL0EUkoKhAVWGhIR5uvzyBq88zFHrhlU+X8d38JLdjiYgAKlBVnsfj4arz23HDRR3weuH1z1cw7ZfNbscSEVGBEsflg05j9NBOAPx34iomztrkciIRqepUoOSoS85szR3DuwDw3tQ1TPo50eVEIlKVqUDJMQb3jefuEV0BeHfKar6dl+RqHhGpulSg5DfOO70Ft13WGYA3v1zBT4u1uk9EKp4KlJToojNaceMQZ+HEKxOW8cuKnW5HEpEqRgVKSjXs7NO4yrcE/d/jlrBk/W63I4lIFaICJcd11XmGoWe1pqDQy7MfLGLjdjU+FJGKoQIlx+XxeLhxSEcG9mhKdm4BT72zgOR9GW7HEpEqQAVKfldIiId7RnSjW9v6pKbn8Ncx80hNy3E7lohUcipQUibhYSH8+fpetG5ak+T9GTz57nyycvLdjiUilZgKlJRZdFQ4fx3Vh4Z1otm0PZUXP15CodrHi4ifqEDJCakdG8WTt/SlerVw5q9O4aNv17kdSUQqKRUoOWFN6sfw5+t6EhLi4YufNupCXhHxCxUoOSld2zY4utvEa5+tUFdeESl3KlBy0gb3a8mQM1qSX1DIP99fyO4DmW5HEpFKRAVKTsnNl3Siu2nA4Yxc/vn+QnLyCtyOJCKVhAqUnJLQ0BAevqYHjepGs3nnId78cgVer1b2icipU4GSUxYTHcGjN/QmIjyUHxdtZ/q8JLcjiUgloAIl5aJl45rcfYXT7HDMpFWs33rA5UQiEuxUoKTcDOzRjIvPbEV+gZdn3l/EwbRstyOJSBBTgZJyddPFHenQsg4HDmfz4sdLtdOEiJw0FSgpV2GhIfzp2p7UjIlg+Ya9fDlzo9uRRCRIBUyBMsbca4zZbIw5ZIxZaIw5s8h9zY0x3xtj0owxicaYC93MKsdXt2Y17r+qOwDjpq9n7RZdxCsiJy4gCpQxZhjwJ2AIUBt4E5hmjKnve8gEYCVQFxgNTDDGtHIjq5RNj3YNGTawDYWFXp4ft4S0zFy3I4lIkAmIAgXEAf+01q611hZaa8cCBUBnY0xboCfwhLU211r7EzAFGOViXimDay9sj2lRm32pWbwyYZmujxKRExJWUS9kjIkA6pRwl9da+59ijx0AxABrgL7ANmtt0Tau64He/soq5SMsNISHr+nJvS/OYsGaFL7+dQtDztDAV0TKpiJHUP2A5BJuO4s+yBjTCfgU+D9r7W6cQlV8k7dMINrfgeXUNawTzd0jugIwduoatu9OczmRiASLChtBWWtnAZ7jPcYYMwT4CHjWWvuc73AGUK3YQ6OB9PLOKP7RP6Exg3o246fF23nh4yU8f/cAwsMCZXZZRAJVwLxLGGPuBT4BbrbW/qvIXWuB5saYokWqne+4BIlbL+tMg9rVSNxxiE+/t27HEZEgEBAFyhgzAvgncK619sui91lrLbACeNoYE2mMORu4FPi44pPKyYqOCuf+q7rj8cDnP25g3RZthSQixxcQBQr4MxAJ/GiMSS9yG+K7/3KgPbAHeAcYZa1d7VJWOUmdWtdzlp574cVPlpCVk+92JBEJYBV2Dup4rLXdf+f+7cDgCoojfjTygnYsWb+HpOTDjJ26hjuGd3E7kogEqEAZQUkVER4WygNXdycs1MO385JYtWmf25FEJECpQEmFa9m4JiPOaQvAq58tI1tTfSJSAhUoccXwc9oSHxdLyv5Mxk1f73YcEQlAKlDiivCwEO69shshIR6mzElkfZJW9YnIsVSgxDVtmtVi2MA2eL3wyqfLyM0rcDuSiAQQFShx1VXnGZo2iGHHnnQm6AJekaByKD2H9Vv9N/tR5mXmxpiGQA+gAc5O4ynAUmutmv3ISYsID+WeEd340+tz+GrmJgZ2b0rzRrFuxxKR33EwLZsHX5nN3oNZjH38POrVKr4j3ak7boEyxoQBVwP3AV2AXOAgEIpvZ3JjzALgDWCCtbaw3BNKpde+ZR3O79OC7+Zv5Y0vV/LP2/sTEnLcbRtFxEW5eQX8c+xC9h7MwrSoTe3YKL+8TqlTfMaYs3CaBF4HvAu0BaKttY2ttQ2BCKAbzpZDdwHrjTED/ZJSKr0bLupArZhI1mzez4+LtrkdR0RK4fV6efXT5azfepD6tavx2I29CfXTB8rjjaAeBK601q4q6U5rrRdY7bu9YYzpBjwFzCrvkFL5xURHMOrSTrwwfgljp62hd8dG1IyJdDuWiBTz2Q8b+HnZDqpFhvL4TadTu4Z/Rk9wnBGUtfaS0opTKY9fZq29uHxiSVV0VrcmdD2tPmmZebw3dY3bcUSkmHmrdjFu+no8HnhoZE9aNq7p19c7kUUS0UBLnE1dj2GtXVqeoaRq8ng83D48gbuen8lPi7dzTq9mJLSp73YsEQG2707jpU+ct/obLupA746N/P6aZVpmboy5Bmcn8ZXA4mK3RX5LJ1VO43oxXHmusw3SG1+sIC9f10aJuC0jK4+nxy4kK6eAAV2bcNnANhXyumW9DuoZnIUSrYC4YrfG/okmVdWws9vQtEEMO/dmMHFWottxRKq0wkIvL32ylJ1704mPi+XuEV3xeCpmlW1Zp/higdettVv9GUYEnB3PbxuWwP+9NZdPf9jAWd2b0rBOtNuxRKqkz37cwII1KVSvFs6jN/QmKrLiujSVdQT1EXCDH3OIHKPLafUZ0LUJuXkFvD2pzGt1RKQcLV63m4+/cxZFPHxND+LqVa/Q1y9rKXweWGqMGQkkAcdckGutHVTOuUS46ZKOLFq3mwVrUli0NoVeHfx/UlZEHHsOZvLix0vweuGaC9rRo13DCs9wIiOodOBrnEURS4rdRMpd3ZrVuPr8dgD8d+IqcrSZrEiFyMsv5LmPFpOWmUePdg24wte/raKVdQTVCzjdWrvSn2FEirv4jJb8uGgbScmH+eLHjYy8oJ3bkUQqvQ++XovdepB6tarxwNU9XNt6rKwjKAvU8mcQkZKEhoZw27AEAL6cuZFd+9JdTiRSuc1duYvJsxMJDfHwyLU9ia0e4VqWso6gngHeN8a8DiQCeUXvtNZ+U97BRI7o2Koug3o246fF23ln8mqeGNXH7UgilVLyvgxe+XQZADcM6Ui7+Dqu5ilrgfrE999/l3CfF2d3cxG/ueGiDsxblcyitbu1YELED/LyC3l+3GIys/Pp2zmOSwe0cjtS2QqUtVaNDcVVtWOjuPr8drw7ZTVvT15N17b1CQ/T5yKR8jLu23Vs3J5K/drVuKcCL8Y9nt9rt3FCjDFabi5+M+SMljRrWIPkfRlM+lk7TIiUl6V2D1/N2kRIiIeHR/YkJtq9805FHW9kdL8x5ltjzGBjTHhpDzLGhBljhhpjfsBpbCjiF2GhIdw6tDMAn/6wgb0Hs1xOJBL8DqZlH90E9urzDe1bunveqahSp/istUONMZcBzwItjDGzgDXAPsAD1MfpstsX2Ab83Vr7hd8TS5XWpW19+ndpzK8rdvHe1NU8cl0vtyOJBK3CQi8vfbyU1LQcOreux/BB7lzvVJrjnoOy1k4EJvo65V6IU4wa4uwkkYJzke4z1to5fs4pctRNF3dk0drd/LJiFxdu2kfnNvXcjiQSlCbPTmTZhr3UiI7gwZHd/dYZ92SVdZHELNQpVwJEg9rRjDjnNMZNX8+YSat4+f6zCA3VOh6RE7Fl1yE+/GYdAPf9sRt1a1ZzOdFv6bdagtLQgW1oUCeapOTDTJ+vTfZFTkROXgH/Hr+E/IJCBveNr5DmgydDBUqCUmR4KKMu7gjA+OnrSMvMdTmRSPD44Ou1bEtJo0n9GG66pKPbcUqlAiVBq2/nOBLa1CMtM4/x09e7HUckKCxdv4epczYTGuLhoZE9iIqouP5OJ0oFSoKWx+PhlqGdCQnx8O3cLSQlH3Y7kkhAO5Sew8sTnCXlIy9oR5tmgb3FaplLpzGmAZAAhOMsMz9Ke/GJW1rExXJh33im/bqFMRNX8fTt/QLiCniRQOP1evnPFys4mJZDx1Z1GXb2aW5H+l1lKlDGmFHAGzjFqTjtxSeuuvqCdvy8bCerEvcxd2Uy/bs0djuSSMCZuWQH81YlUy0ylPuvCrwl5SUp6wjqYeBt4C/W2jQ/5hE5YTWiI7hmcDve/HIl701bQ68ODYkI12cmkSP2HsxizESnnd/oSzvTsE60y4nKpqznoJoBr6g4SaA6//QWxMfFsudApvbpEymisNDLK58uJSM7n94dGnFu7+ZuRyqzshaoGcA5/gwicipCQ0O4+dJOAHz+4wb2H9I+fSIA38zdwoqN+4itHsFdI7oE1Tnask7xrQBeNMZcAmwAjrnoxFr7p/IOJnKiupxWn76d45i3KpkPvl7LA1f3cDuSiKt27k1n7LS1ANwxvAu1a0S5nOjElHUEdRawAKiGs0FsryK3nv6JJnLibrq4I+FhIcxcsoP1Ww+4HUfENQWFXl76ZCm5eQWc3aMp/ROCb/FQWffiO9vfQUTKQ6O61Rl6Vms+/3Ej70xazXN3n0lIEKxWEilvk3/ehN16kDqxUdzia1MTbE7kOqiGwF1AR5yR1zrgbWvtZj9lEzkpV5zTlh8XbcNuO8ispTsY1LOZ25FEKtS2lMOM8+2ucveIrgHTgPBElWmKzxjTG+fc02U4/aD2AkOAlcYYTfFJQKkWGcb1F3UAnD3HsnLyXU4kUnEKCgp5ecIy8vIL+UPv5vRs39DtSCetrOegXgA+ATpba2+x1o621nYG3gee91c4kZM1sHsz2javxYHD2Xzx00a344hUmK9mbWLj9lTq1arGqEs6uR3nlJS1QPUEXrLWeosdfw1noUS5McacbozJM8bEFznW3BjzvTEmzRiTaIy5sDxfUyqfkBAPoy915t0nztrE7gOZLicS8b+tyYf5+Dtnau+eEV2pXq2kzX+CR1kLVDIQX8LxVkC5XbxrjIkBPuS358YmACuBusBoYIIxplV5va5UTu3i63BWt6bk5Rcydtoat+OI+JUztbeU/AIvF/SNp5tp4HakU1bWAvURMMYYc5kxJs53Gwa85buvvLwGfFX0gDGmLc4I7glrba619idgCjCqHF9XKqnrL+pARHgov67YxerEfW7HEfGbr2ZtYtOOQ9SvXY0bh3RwO065KOsqvqeBxsBnOEXNA+ThFJTHyvIDjDERQJ0S7vJaa3cbY4YDrYEHgT8Xub8DsM1am1Hk2HqgdxmzSxVWv3Y1hp/dho9nWN6evJoX7zsrKDbJFDkR21IO8/F3FoC7r+hKdFRwT+0dUdbroHKB0caYhwADZAGbrLUnsp9MP2BmCccLjDEtcBZbnA0UFrs/Bih+AiETCI7dDsV1l53dhhkLt7F55yF+WLiN8/u0cDuSSLkpKCjklU+XkV9QyHmnt6gUU3tHlFqgfAsRvrfW5pWyKKGZMQYoWz8oa+0sivWR8r2OB/gB+Ku1NskYU7yDVgbODhZFRQPpv/eaIgBREWHccFEH/j1+CeO+XceZXRtXmk+YIpNnJ7JhWyr1akZx08WB2779ZBzvHNQ0oHaRr0u7TT3FDM2A/sCrxphUYKvv+EpjzNXAWqC5MaZokWrnOy5SJgO6NaF9fB1S03P49PsNbscRKRc79qQdvSD3ziuCf9VecaWOoKy1ISV9Xd6stduAozsY+kZQB4EEa22S79gK4GljzF9wpgovBfr6K5NUPh6Ph9FDO/HAy7OZMieR8/u2oHG9GLdjiZy0gkIvr366nLz8Qgb1bBbUF+SWpqw7SfxUwtQbxpj6xpgl5R/rNy4H2gN7gHeAUdba1RXwulKJnNasNuf0akZ+gZf3pmjZuQS3r3/dzLqkA9SuEcnoS4P7gtzSHO8c1ECcFXTg7GZ+qzGm+DVP7XFW3pUba20qxc5VWWu3A4PL83Wkarruwg7MXbmLBWtSWL5hD13bVp4TylJ1pOzP4MNv1gFw++Vdgnavvd9zvFV8+4GHcIqFB7gTKChyvxdnocKDfksnUs7qxEZxxTlt+fCbdbw9eTWvPjCQ0FC/zWCLlDuv18vrny8nJ7eAM7s2oW/nOLcj+c3xzkGtwtkpAmPMTGCYtfZgRQUT8ZdLB7Tmu/lb2ZaSxvR5SVx0hjYlkeAxY8E2VmzcR43oCG69LDjbaJRVqR8djTFFrzO6CMgxxkSXdPN/TJHyExEeyqhLnOW4479bT1pm7u88QyQw7D+UxXtTndPvt17WmZoxkS4n8q/jzW2kGXP0iq90nD33it+OHBcJKn06xZHQph5pmXlHN9cUCWRer5c3vlhJZnY+vTs0YkC3Jm5H8rvjnYMaBBzpma2OulKpOMvOO3PvCzP5Zm4SF/SNp0WjWLdjiZRq9rKdLFybQnRUGHcMT8Djqfxbdh3vHNTPJX0NR/fVSwA2WGsP+y+eiP/Ex8VyQd94vpmbxDuTV/PULX2rxC+9BJ9D6TmMmbQKgJsu7kTdmsU316mcynodVBtjzM/GmD6+c04Lfbetxpg+fk0o4kcjL2hPTLVwlm/Yy8I1KW7HESnRmEmrOJyRS0Kbepx3enO341SYsq6vfQ3nXFMScC3QFGfT2DeBF/2STKQCxFaPYOQF7QB4d8oa8vILfucZIhVr4ZoUZi/bSWREKHeP6FqlRvllLVBnAvdba1OAocDX1tqNwNtAV3+FE6kIg/vG07xRDZL3ZzDp50S344gclZGVxxtfrgDg2sHtaVS3usuJKlZZC1Q2EG6MqY6zq8S3vuONgEP+CCZSUUJDQ45uFfPZDxvYf+hEusiI+M/YaWvYfygb06I2Q6rg9XplLVDf4YyWvsTpxTTVGHOO79gUP2UTqTBd2zagb+c4snMLeP9rbZQv7luxcS/fzd9KWGgI94zoWiUbbZa1QN0KLMYZSV3k627bC5gF3OefaCIV66aLOxIeFsKsJTtYu2W/23GkCsvOzef1z5cD8Mc/tKV5Fb0EoqwdddOBewGMMbHGmFrW2mf9mkykgjWqW51hZ7fh0+83MGbSKl64V+3hxR3jp68nZX8m8XGxDDv7NLfjuKbMu2QaY243xmzH6dW03xiTbIz5s/+iiVS84YNOo16taiTuOMQPC7f+/hNEypndeoApsxMJ8cA9V3YlPKzqbmZc1uugHgKexVlufiYwAHgJ+JMx5l7/xROpWFERYUfbZn/4zTrStU+fVKC8/AJe/Ww5hV64bGAbTmtW+/efVImVaYoPp9XGbdbaT4oc+9UYsxX4B/BKuScTcckZXRrzzdy6rE7cz/jp67l1WILbkaSK+PzHjWxLSSOuXnWuOr+d23FcV9axY31gUQnHl+BctCtSaXg8Hm4Z2pmQEA/fzN3Cll26kkL8b8uuQ3z2wwYA7h7RlcjwUJcTua+sBWo1cEUJx68EtBW0VDotG9fkov4tKfTCW1+txOv1uh1JKrGCgkJe/XQZBYVeBveLp3Prem5HCghlneJ7AvjaGNMXmOc71he4ABjmj2Aibrv6/HbMWbaTtVsO8PPSHQzs0cztSFJJTfo5kU07DlGvVjVuuKiD23ECRplGUNbaGcA5QA7OXnzDgcNAL2vtNP/FE3FPTLVwrve9Wbw3dQ2Z2XkuJ5LKaMeeNMb7epLddUUXoqPCXU4UOMo6gsJaOxuY7ccsIgFnUM9mTJ+fhN16kE9mWEZd0sntSFKJFBZ6ee2z5eTlFzKoZzN6tGvodqSActyW78aYMcaYA75rnt4wxlTNy5mlygoJ8XDbsAQ8Hpg6ZzPbUtT+TMrPN3O3sHbLAWrViOTmS/Xhp7jjTfE9CVwMPIfTUuMinL33RKqUNk1rcUGfeAoKvbz11SotmJBykbI/gw98+z7ePiyBGtERLicKPMcrUMOBq621z1prn8dZxXepMUYTpFLlXHthe2KrR7AqcR8/L93hdhwJcl6vM7WXnVvAGV0a0y+hsduRAtLxClRTjl1Cvsj3eE2SSpVTIzqCG4c4O0y8O3UN6VlaMCEnb/r8razctI/Y6hHcpgvBS3W8AhUKHG0vaq314qzi0zhUqqRBPZvRoWUdUtNyGD99ndtxJEjtOZDJ2KmrAbhtWAI1YyJdThS4qu4uhCInKCTEw+2Xd3F2mPh1C5t2pLodSYKM1+vltc+Xk5VTQN/OcZzRRVN7x/N7y8xvMMakF3v8NcaYfUUfZK19o9yTiQSg+LhYLjmzFZN+TuTNL1fw/N0DCFFLDimj7xduY/mGvdSIDuf2yxPwePT/zvEcr0BtA24vdiwFuLHYMS+gAiVVxlXnGWYv28mGbal8t2Arg/vGux1JgsDeg1m8O8WZ2rvlsgRq14hyOVHgK7VAWWvjKzCHSNCIjgpn9NBO/OvDxXwwbQ19OjaidqzebKR0zqq9ZWRm53N6x0ac1a2J25GCgs5BiZyE/gmN6dm+IRnZ+bwzebXbcSTAzViwlWW+qb07h3fR1F4ZqUCJnASPx9lhIjIilNnLd7Jk/W63I0mA2nMg8+jU3m3DEjTaPgEqUCInqWGdaK4+z2kq98aXK8nOzXc5kQSawkIvr3y6jKycAvolxHFmV03tnQgVKJFTcMmAVrRsHMueA5lMmGHdjiMBZvr8pKMX5N4+TFN7J0oFSuQUhIWGcNcVXfF4YOLPieq+K0cl78tg7NQ1ANx+eQK1auiC3BOlAiVyito2r81F/VoebZ1QUKjNZKu6gkIvL32ylOzcAgZ0bcIZXTS1dzJUoETKwbUXtqdezSg2bk9l6pxEt+OIyybN2sS6pAPUiY3ktsu1197JUoESKQfRUeHcMbwLAB99u57kfRkuJxK3bNl1iHHTnX2277mym9ponAIVKJFy0qtDIwZ2b0puXgGvf75cfaOqoLz8Al78eCn5BYUM7huvDpSHyS0AABY/SURBVLmnSAVKpBzdfGknYqtHsHLTPr5fuM3tOFLBPplhSUo+TFzd6tx4cUe34wQ9FSiRclQzJpJbhnYG4L0pq9l/KMvlRFJR1mzez5c/bcTjgfuu6ka1yN/bi1t+jwqUSDkb0K0JvTo42yC98cVKTfVVARlZebz48RIKvTB80Gl0aFnX7UiVggqUSDnzeDzccXkXqkeFsXBtCjOXbHc7kvjZWxNXsudgFm2a1uQq3+4icupUoET8oF6taoz2TfWNmbiKfama6qusZi/bwawlO4iMCOXBkT0ID9PbankJmL9JY0w/Y8wiY0y6MWaDMWZ4kfuaG2O+N8akGWMSjTEXuplVpCwG9WxG7w6NyMjO57XPtKqvMtpzMJM3vlgBwKhLOtG0QQ2XE1UuAVGgjDFxwNfA60AN4E5gnDGmue8hE4CVQF1gNDDBGNPKjawiZeXxeLjzii7EVAtnqd3DjAVa1VeZHNktIsPX4+mCPi3cjlTpBESBAq4DZltrP7DWeq213wO9gYPGmLZAT+AJa22utfYnYAowysW8ImVSJzaK24Y5Owm8O2U1ew5kupxIyssXP25gdeJ+atWI5O4RXbURrB9U2DpIY0wEUKeEu7xADyDJGDMBOBfYDjxirV1pjDkH2GatLXpp/nqcAiYS8AZ0a8LcVbuYuzKZlycs4++39SM0RG9mwWzN5v18/J2zW8QDV3WnZow2gvWHihxB9QOSS7jtxClco4FxQBzwDDDRGNMaiAGKf+zMBKIrJrbIqTmyqq9WjUhWJe5j0qxNbkeSU5CWmcu/x/9vSXk308DtSJVWhY2grLWzgBI/NhpjvgamW2un+Q59Zoy5GxiMU8CqFXtKNJDup6gi5a5mTCT3XtmNJ9+Zz7jp6+jStj5tmtZyO5acIK/Xy6ufLmNfahamRW1GXqAl5f4UKOeg1gO1ix07UjzXAs2NMUWLVDvfcZGg0bN9Qy7q35L8Ai8vjF+iDrxB6JtftzB/dQrRUWE8NLIHYaGB8hZaOQXK3+6HQD9jzDXGmBBjzJVAAjDZWmuBFcDTxphIY8zZwKXAxy7mFTkpN17ckWYNY9ixJ/1oMzsJDpt2pPKu79/s7hFdaVS3usuJKr+AKFDW2hXAhcB9QCrwODDMWnvkEvzLgfbAHuAdYJS1drUbWUVORWR4KA+N7ElYqIdv5iaxaG2K25GkDNIzc3n2g0Xk5RdyQd94NSCsIAGzm6G19kec5eQl3bcd53yUSNBr1aQm1w5uz9hpa3l5wjJefXAgdWsWP80qgcLr9fLyhGXsPpBJ66Y1GX1pJ7cjVRkBMYISqWqGntWGbm3rczgjl+fHLaGgoNDtSFKKibMSWbAmhepRYfz5ul5EhIe6HanKUIEScUFIiIcHru5BndhI1mzezyczrNuRpARrNu/ng2+c9Vj3X9Vd550qmAqUiEtq1YjkoZE9CfHAZz9uYPmGPW5HkiIOHs7muY8WU1joZdjANpzeKc7tSFWOCpSIizq3qccfz2uH1wsvjF/KgcPZbkcSIC+/kGc+WMSBw9l0bFWXay9s73akKkkFSsRlI85tS0KbeqSm5/D8uMU6HxUAxkxaxbqkA9SrGcUj1/XU9U4u0d+6iMtCQzw8NNI5H7U6cT9jp+kadDd9Oy+J6fOSCA8L4dEbe1O7RpTbkaosFSiRAFA7Noo/X9ebsFAPk2cnMmvpDrcjVUlrt+xnzMSVANx1RRdOa1Z8gxupSCpQIgGifcs6R7vwvvbZcjbvPORyoqpl78EsnvlgEfkFXi4Z0IpBPZv//pPEr1SgRALI4L7xnNurObl5BTz9/kIOZ+S6HalKyMzO46l355OalkNCm3rcNKSj25EEFSiRgOLxeLj98gTaNKvFngOZPPfRIvK1aMKvCgoKee6jxSQlH6ZJ/Rj+cn0vQrUoIiDoX0EkwESEh/Lo9b2pFRPJio37eOurlXi9XrdjVVrvTF7NkvV7qBEdwV9v7kNMdITbkcRHBUokANWvXY3HbupNRFgI383fyqSfE92OVClNmZPItF+3EBYawmM39iaunnaKCCQqUCIBql2LOtx3VXcAxk5bw7xVyS4nqlzmrtzFu5Odpgj3/rEbHVvVdTmRFKcCJRLAzuzahGsHt8frhX+PX8Km7aluR6oUVm7ay/PjnLbtIy9ox8DuTd2OJCVQgRIJcFeccxrn9GpGbl4BT747n1370t2OFNQ27UjlH+8tJL+gkCH9W3LluW3djiSlUIESCXAej4c7h3ely2n1SE3L4fH/zmP/oSy3YwWlXXvT+dvb88jKyWdA1yaMHtoZj8fjdiwphQqUSBAIDwvh0Rt6c5pv+fkTY+aRlqlrpE7E3oNZPD5mHofSc+nWtj73XdWdkBAVp0CmAiUSJKKjwvnb6L40axjDtpQ0nnxnPtk5+W7HCgr7UrN47M1f2XMgk7bNa/GXG3oTHqa3v0CnfyGRIBJbPYKnbulH/drVsFsP8vTYheTkFbgdK6DtP5TFo2/+SvL+DNo0rcmTo/tSLTLM7VhSBipQIkGmXq1q/P3WftSKiWT5xr38/d35ZOdqJFWS/YeyePSNX0nel0HrpjX5+639dCFuEFGBEglCTerH8M87+lO7hrPbxFPvLCBL033HODKtt2tfBq0aqzgFIxUokSDVrGEN/nlHf+rERrEqcR9PvjOfzOw8t2MFhO2703j4tTns3JtBy8ax/P22ftRQcQo6KlAiQaxpgxo8c2d/6tWMYs3m/TwxZh6H0nPcjuWqDdsO8sjrv7AvNYv28XV4+vb+xFZXcQpGKlAiQa5xvRieufMMGvgWTjzy+hxS9me4HcsVy+weHnvzV9Iyc+nZviFP3dpXI6cgpgIlUgk0qlud5+4+k1aNa7JzbwYPvzqHDdsOuh2rQn2/YCtPvTuf7NwCzu7RlMdu7E1UhFbrBTMVKJFKom7NajxzZ3+6ta1PanoOj775KwvXprgdy+8KCgoZM2kVr362nPwCL0PPas19f+xOmHo6BT39C4pUItFR4Txxcx/O6dWMnNwC/vHeAiZ8byksrJz9pNIyc/nb2/OZOmczYaEe7h7RlVGXdNIOEZWExr8ilUxYaAj3XtmNuLrVGf/desZPX4/depAHru5eqc7HJO5I5V8fLiZ5fwa1YiL5yw296NBSLTMqE42gRCohj8fDlX8w/O3mvtSIDmfxut3c99LPbNoR/O06Cgu9TJy1iYdenU3yfucC3BfuG6DiVAmpQIlUYt3bNeDl+wfSxrfJ7MOvzubTHywFBYVuRzsp+w9l8de35/He1DXkF3i5sF88/7rrTBrUjnY7mviBpvhEKrkGdaJ57q4zeHfKGr7+dQvjvl3P/FXJ3PfH7rSIi3U7Xpl4vV5mLd3B25NWk5aZS2z1CO69shu9OzZyO5r4kQqUSBUQHhbKbcMS6Nspjlc/W8amHYe476VZXPkHw2UD2xAZHup2xFJtTTnMW1+tZHXifoCjrTLqxEa5nEz8TQVKpArp0rY+rz10Nu9PW8u385IYP309MxZs5brB7RnQrWlArX7LyMrj8x83MOnnRAoKvdSMieDGIR0Z1LOZmgxWESpQIlVMdFQ4dwzvwhldG/P2pNUkJR/mhY+XMnl2IjcM6UhCm3quFoD0rDymzk5k8pzNZGTl4fHA4L7xXHth+0q1ClF+nwqUSBWV0KY+Lz8wkJmLt/PRt+vYtOMQ//fWXNo0rcmlA1rTv0uTCm3qdzAtm2/nJjFldiIZ2c7O7J1a1+XGIR1p27x2heWQwKECJVKFhYZ4OLd3c87o0pjJsxOZMmczm3Yc4oWPlzJ22loG94vnzK5NaFI/xi+vX1BQyJL1e/h+4VYWrd1Nge+C4oQ29fjjeYbOrev55XUlOKhAiQhRkWFc+QfD0IFtmLVkB5NnJ7J9dxrjpzsX+rZoVIN+CY3p0ymOFnGxhJ7CuapD6Tms3LiPZRv2sHjdbg6mObuvh4R4OL1jI4ae1ZpOKkyCCpSIFBEZHsr5fVpw3unNWbZhL7OWbGfhmhS2pqSxNcXyyQxLZEQorZvU5LRmtWnZOJY6sVHUqhFJrZhIqlcLJ7+gkNy8QvLyC8nIzmPX3nR2+m5bdh5m865Dx7xmk/oxnHd6c87u0YzaWpknRahAichveDweupsGdDcNyMsvZOWmvcxdmczyjXvZcyCTtVsOsHbLgZP62eFhIXRsWZcubevTtW19WjepqVV5UiIVKBE5rvCwEHq0a0iPdg0BZ4pu4/ZUNm5PZcfuNFLTcziYlsOh9Bwys/MIDwshPCyU8LAQoiLCiKtXnaYNYmhcP4amDWJo27x2QF93JYFDBUpETkjNmEh6tm9Iz/YN3Y4ilZz24hMRkYCkAiUiIgEpYKb4jDE3Av8H1APWAw9aa3/x3dcceBfoA+wB7rbWfuNWVhER8b+AGEEZYxKAF4FLgVrAOGCSMeZIvgnASqAuMBqYYIxp5UZWERGpGAFRoIDT+F8WD1AAZAEYY9oCPYEnrLW51tqfgCnAKDeCiohIxaiwKT5jTARQp4S7vMB3wGpgFf8rTudbawuNMR2AbdbajCLPWQ/09nNkERFxUUWOoPoBySXcdgJRgMU5x1QdeARniq8REANkFvtZmYBaaIqIVGIVNoKy1s7Cmb77DWPM60CKtXaB79AbxpgbgCuAHUC1Yk+JBtLL+NKhACkpKSeYWERE/K3Ie/Nvrt4OlFV8zYBNxY7lA3nAWqC5MaaatTbLd1873/GyiAMYOXJkeeQUERH/iAMSix4IlAI1DXjOGPMZsAgYCXQEvrbWbjfGrACeNsb8BWeq8FKgbxl/9iLgTJzpxIJyTy4iIqciFKc4LSp+h8fr9VZ8nBIYYx4Cbse5Dmot8JC19lfffc2AMTjFaR/wF2vtZ25lFRER/wuYAiUiIlJUoFwHJSIicgwVKBERCUgqUCIiEpBUoEREJCCpQImISEBSgRIRkYCkAiUiIgEpUHaSCEjGmC7AW0ACsBm4yVr7m6udA4ExpjcwzVrbwO0sRRlj/gA8i9NSZQ/wvLX2v+6mOpYxZgjwT6AlTsbnAi0jgDGmFk5ftCeste+7HOcYxpibgP8COUUO32mt/cClSMcwxsQBbwJnA9nAGGvt4+6m+h9jzEicv7+iqgE/WmvPcyHSbxhj+gCvAgbYCzxrrX3Hn6+pEVQpfO1BJgOf4jRRfBqYYYyJdTVYMcYYjzHmZmAGEOF2nqJ8O4B8CfwD5+/wKuAZY8z5rgYrwvfG9QXwiLW2Bs4GxS8bY7q7m6xEbwFN3A5Riu7AC9bamCK3gChOPpNxtjtriNM14XpjzNXuRvofa+34on93ONuzHQAedjkaAL7msZOBV621NXF+l1/3fYj3GxWo0g0Ewq21L1tr86y1E4A1wJXuxvqNJ3G2iPqH20FKEA98bK2daK0t9I0+ZwH9XU1VhLU2Gahvrf3W90tYF2ej4jR3kx3LGHM9EIvTMy0Q9QCWux2iJMaY04FWwD3W2mxr7Rac3++ZrgYrhTEmHBgP/M1au8LtPD61gQaAxxjjwenjlw/k+vNFVaBK1wFYV+zYeqCzC1mO5y1rbQ9gsdtBirPWzrHW3nbke2NMHZxPhsvcS/Vb1to0Y0w0zvTUDOA/1tqNLsc6yhjTEvgrcJPbWUpijAnFmQa/1hizyxizyRjzZ98bWSDogVPY/2aM2WmMSQQu8304CUR34jRtfcPtIEdYa/cDrwMf4HSZWAQ8aq0t/h5ZrlSgShcUjRKttbvczlAWxpiawBRgAc5UQaDJxmmW2Qu4yRgzyuU8wNE3/3E4mycHalOz+jgfkD7AOY83HGdUf7uboYo48sEoD2ckNQx4KJCm+I7wnVp4GGf0FDAbpfpmF7KBq3HOjQ0E/mqM8ev5MS2SKF0Gp9YoUXyMMW1xitJaYKS1ttDlSL/hy5QLLDbGjMFp6fKuu6kAeByw1tqv3A5SGl/hPKvIoeXGmNeAywmMUUAOcNha+zff9yuMMe/gFKqPXUtVsguAQuBrt4MUMwzob609ck7sZ2PMu8CtOLMOfqERVOnW4qxWKepEGiUKYIwZgDNqmgQMt9ZmuxzpGMaYs4wxS4odjgRS3chTgj8Cw40xqcaYVJwp5jeMMYHwxg+AMaajMebJYocjcD5xB4L1QLRvdHJEoH44vxT4LAA/xDXD+b0o6khTWb8J1H+kQDAT54Tg/Thzr5fjzLNPdDVVEDHGtMZpRvmYtfY1t/OUYjnQxBjzAPAKcDowCrjM1VQ+1tp2Rb83xiwHXg6wZeapwIPGmB04o85uwD3AXa6m+p/vcZZFv2CMeRDng+coAmcKsqg+OKPmQDMDZwXuLcDbOKs2RwM3+/NFNYIqhbU2FxiMU5gOAI8BQ621e10NFlzuBGrg/I+dXuT2L7eDHWGtPQRciDOFcQCnMebN1tqfXQ0WRKy1O4FLcKZ7DuNcWvB3a+0Xrgbz8Y3az8I5/5QMTMe51u1LV4OVLB4IuPPK1to1OL8jt+J8IPkY+LO11q/nk9WwUEREApJGUCIiEpBUoEREJCCpQImISEBSgRIRkYCkAiUiIgFJBUpERAKSLtQVKSfGmPeB64/zkCdxdnOfCdSw1lbItlm+/fx+Ba6z1m44zuNCgPnAtdZaWxHZRI5HIyiR8nMvEOe7DfQd613k2L+Bub6vMyow1z3AiuMVJzi6H+FTOH2nRFynC3VF/MAY0wmnxUNLa22SizmigG3AIGvt6jI+JxEYZa2d5c9sIr9HU3wiFcgYM5AiU3zGGC9Od9K/4OwRtxi4BqflwrU4Wwf9xVr7ke/5NYAXcFpaeIGfgHuP03blj0Bq0eJkjHkcuAWnTcY6nL4+3xZ5zkSc0eCscvgji5w0TfGJuO9Z4D6cjUKbA0txClMv4Cvgv8aYGN9jx+AUsvNx9pfzAt8ZY0r7sHkRzt5zABhjLvO91jU4u/N/DXxujIkt8pzpwLnH+ZkiFUIFSsR9/7HWzrTWLsfZ/T0dZ1RjgRdx+pK1NMa0whkRXW2tXeQbFV2Ls8HoBaX87J7AmiLfx+P0R9rqm3p8CmcT0KJtE9biNOw8Zid1kYqmT0gi7ttU5OtMIKlIN9UjPZUigRa+r60xx7Qqi8YZVU0r4Wc3BPYV+X4czkrDzb4+WFOAsdbarCKP2e/7b4MT/HOIlCuNoETcV7zpW2nN6sJ8j+0GdC1yawuMLeU5hYDnyDe+djE9cEZcc4EbgJW+RR1HHHlfKCjzn0DED1SgRILHOiAcqG6t3WSt3YTT3+h5nCJVkhScxRAAGGOGAbdaa2dYa+/FGXml4fTEOqJ+keeKuEZTfCJBwlprjTFTgA+NMXfidIl9GmdxxfpSnrYE6FLk+1DgeWPMbpwVg32ARr6vj+gCHOTYqUeRCqcRlEhwuR6nmEwCFgE1gT9Ya1NLefzXOKv9ALDWfg78FWfUtQH4B3CXtfanIs8ZAEy31mqKT1ylC3VFKjFjTDSQBFxgrV1ahseHAFtxVgrO8XM8kePSCEqkErPWZuKMlu4s41MuBTarOEkgUIESqfxeAhJMsbXpxflGT48Bt1VIKpHfoSk+EREJSBpBiYhIQFKBEhGRgKQCJSIiAUkFSkREApIKlIiIBKT/BxWQ/S3gTJ8sAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "params_no_cord = Params(params, m_cord=1*kg)\n", - "results_no_cord = simulate_system2(params_no_cord);" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/jump.png\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results, label='m_cord = 75 kg')\n", - "plot_position(results_no_cord, label='m_cord = 1 kg')\n", - "\n", - "savefig('figs/jump.png')" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-74.62920556283255 meter" - ], - "text/latex": [ - "$-74.62920556283255\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-74.62920556283255 " - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results_no_cord.y)" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-2.4168897690027933 meter" - ], - "text/latex": [ - "$-2.4168897690027933\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-2.4168897690027933 " - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = min(results.y) - min(results_no_cord.y)\n", - "diff" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The difference is more than 2 meters, which could certainly be the difference between a successful bungee dunk and a bad day." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/jump_soln.ipynb b/soln/jump_soln.ipynb deleted file mode 100644 index f8dd95de..00000000 --- a/soln/jump_soln.ipynb +++ /dev/null @@ -1,1368 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Bungee jump case study\n", - "\n", - "Copyright 2018 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bungee jumping" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose you want to set the world record for the highest \"bungee dunk\", [as shown in this video](https://www.youtube.com/watch?v=UBf7WC19lpw). Since the record is 70 m, let's design a jump for 80 m.\n", - "\n", - "We'll make the following modeling assumptions:\n", - "\n", - "1. Initially the bungee cord hangs from a crane with the attachment point 80 m above a cup of tea.\n", - "\n", - "2. Until the cord is fully extended, it applies no force to the jumper. It turns out this might not be a good assumption; we will revisit it.\n", - "\n", - "3. After the cord is fully extended, it obeys [Hooke's Law](https://en.wikipedia.org/wiki/Hooke%27s_law); that is, it applies a force to the jumper proportional to the extension of the cord beyond its resting length.\n", - "\n", - "4. The jumper is subject to drag force proportional to the square of their velocity, in the opposite of their direction of motion.\n", - "\n", - "Our objective is to choose the length of the cord, `L`, and its spring constant, `k`, so that the jumper falls all the way to the tea cup, but no farther! \n", - "\n", - "First I'll create a `Param` object to contain the quantities we'll need:\n", - "\n", - "1. Let's assume that the jumper's mass is 75 kg.\n", - "\n", - "2. With a terminal velocity of 60 m/s.\n", - "\n", - "3. The length of the bungee cord is `L = 40 m`.\n", - "\n", - "4. The spring constant of the cord is `k = 20 N / m` when the cord is stretched, and 0 when it's compressed.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$\\mathrm{newton}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    y_attach80 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    L25 meter
    k40.0 newton / meter
    zero_force0 newton
    \n", - "
    " - ], - "text/plain": [ - "y_attach 80 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "zero_force 0 newton\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(y_attach = 80 * m,\n", - " v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " mass = 75 * kg,\n", - " area = 1 * m**2,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 60 * m / s,\n", - " L = 25 * m,\n", - " k = 40 * N / m,\n", - " zero_force = 0 * N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", - "\n", - "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given params.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " area, mass = params.area, params.mass\n", - " g, rho = params.g, params.rho\n", - " v_init, v_term = params.v_init, params.v_term\n", - " y_attach = params.y_attach\n", - " \n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " init = State(y=y_attach, v=v_init)\n", - " t_end = 20 * s\n", - "\n", - " return System(params, C_d=C_d, \n", - " init=init, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    y_attach80 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    L25 meter
    k40.0 newton / meter
    zero_force0 newton
    C_d0.3402777777777778 dimensionless
    inity 80 meter\n", - "v 0.0 meter / secon...
    t_end20 second
    \n", - "
    " - ], - "text/plain": [ - "y_attach 80 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "L 25 meter\n", - "k 40.0 newton / meter\n", - "zero_force 0 newton\n", - "C_d 0.3402777777777778 dimensionless\n", - "init y 80 meter\n", - "v 0.0 meter / secon...\n", - "t_end 20 second\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`spring_force` computes the force of the cord on the jumper.\n", - "\n", - "If the spring is not extended, it returns `zero_force`, which is either 0 Newtons or 0, depending on whether the `System` object has units. I did that so the slope function works correctly with and without units." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def spring_force(y, system):\n", - " \"\"\"Computes the force of the bungee cord on the jumper:\n", - " \n", - " y: height of the jumper\n", - " \n", - " Uses these variables from system|\n", - " y_attach: height of the attachment point\n", - " L: resting length of the cord\n", - " k: spring constant of the cord\n", - " \n", - " returns: force in N\n", - " \"\"\"\n", - " y_attach, L, k = system.y_attach, system.L, system.k\n", - " \n", - " distance_fallen = y_attach - y\n", - " if distance_fallen <= L:\n", - " return system.zero_force\n", - " \n", - " extension = distance_fallen - L\n", - " f_spring = k * extension\n", - " return f_spring" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The spring force is 0 until the cord is fully extended. When it is extended 1 m, the spring force is 40 N. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0 newton" - ], - "text/latex": [ - "$0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "0 " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spring_force(80*m, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0 newton" - ], - "text/latex": [ - "$0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "0 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spring_force(55*m, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "40.0 newton" - ], - "text/latex": [ - "$40.0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "40.0 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spring_force(54*m, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`drag_force` computes drag as a function of velocity:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(v, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " v: velocity\n", - " system: System object\n", - "\n", - " returns: drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the drag force at 60 meters per second." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "735.0 kilogram meter/second2" - ], - "text/latex": [ - "$735.0\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "735.0 " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v = -60 * m/s\n", - "f_drag = drag_force(v, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Acceleration due to drag at 60 m/s is approximately g, which confirms that 60 m/s is terminal velocity." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.8 meter/second2" - ], - "text/latex": [ - "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "9.8 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a_drag = f_drag / system.mass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now here's the slope function:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing g, rho,\n", - " C_d, area, and mass\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(v, system) / mass\n", - " a_spring = spring_force(y, system) / mass\n", - " \n", - " dvdt = -g + a_drag + a_spring\n", - " \n", - " return v, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial params." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 , -9.8 )" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_position(results):\n", - " plot(results.y)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_position(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After reaching the lowest point, the jumper springs back almost to almost 70 m, and oscillates several times. That looks like more osciallation that we expect from an actual jump, which suggests that there some dissipation of energy in the real world that is not captured in our model. To improve the model, that might be a good thing to investigate.\n", - "\n", - "But since we are primarily interested in the initial descent, the model might be good enough for now.\n", - "\n", - "We can use `min` to find the lowest point:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.413731910623594 meter" - ], - "text/latex": [ - "$5.413731910623594\\ \\mathrm{meter}$" - ], - "text/plain": [ - "5.413731910623594 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At the lowest point, the jumper is still too high, so we'll need to increase `L` or decrease `k`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although we compute acceleration inside the slope function, we don't get acceleration as a result from `run_ode_solver`.\n", - "\n", - "We can approximate it by computing the numerical derivative of `ys`:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "a = gradient(results.v)\n", - "plot(a)\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Acceleration (m/$s^2$)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can compute the maximum acceleration the jumper experiences:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "16.64087716292061 meter/second2" - ], - "text/latex": [ - "$16.64087716292061\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "16.64087716292061 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_acceleration = max(a) * m/s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Relative to the acceleration of gravity, the jumper \"pulls\" about \"1.7 g's\"." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.6980486900939398 dimensionless" - ], - "text/latex": [ - "$1.6980486900939398\\ dimensionless$" - ], - "text/plain": [ - "1.6980486900939398 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_acceleration / system.g" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "The gradient function in `modsim.py` adapts the NumPy function of the same name so it works with `Series` objects.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "def gradient(series, **options):\n", - " \"\"\"Computes the numerical derivative of a series.\n", - "\n", - " If the elements of series have units, they are dropped.\n", - "\n", - " series: Series object\n", - " options: any legal options to np.gradient\n", - "\n", - " returns: Series, same subclass as series\n", - " \"\"\"\n", - " x = magnitudes(series.index)\n", - " y = magnitudes(series.values)\n", - " # units = get_units(series.values[0])\n", - "\n", - " a = np.gradient(y, x, **options)\n", - " return series.__class__(a, series.index)\n", - "\n" - ] - } - ], - "source": [ - "source_code(gradient)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving for length\n", - "\n", - "Assuming that `k` is fixed, let's find the length `L` that makes the minimum altitude of the jumper exactly 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The metric we are interested in is the lowest point of the first oscillation. For both efficiency and accuracy, it is better to stop the simulation when we reach this point, rather than run past it and the compute the minimum.\n", - "\n", - "Here's an event function that stops the simulation when velocity is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return velocity.\n", - " \"\"\"\n", - " y, v = state\n", - " return v" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As usual, we should test it with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.0 meter/second" - ], - "text/latex": [ - "$0.0\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "0.0 " - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can test it and confirm that it stops at the bottom of the jump." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "plot_position(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.448756012469637 meter" - ], - "text/latex": [ - "$5.448756012469637\\ \\mathrm{meter}$" - ], - "text/plain": [ - "5.448756012469637 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "min(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write an error function that takes `L` and `params` as arguments, simulates a bungee jump, and returns the lowest point.\n", - "\n", - "Test the error function with a guess of 25 m and confirm that the return value is about 5 meters.\n", - "\n", - "Use `root_scalar` with your error function to find the value of `L` that yields a perfect bungee dunk. Hint: before calling `root_scalar`, make a version of `params` with no dimensions.\n", - "\n", - "Run a simulation with the result from `root_scalar` and confirm that it works." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def error_func(L, params):\n", - " \"\"\"Minimum height as a function of length.\n", - " \n", - " L: length in m\n", - " params: Params object\n", - " \n", - " returns: height in m\n", - " \"\"\"\n", - " params = Params(params, L=L)\n", - " system = make_system(params)\n", - "\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " min_height = get_last_value(results.y)\n", - " return min_height" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "5.448756012469637 meter" - ], - "text/latex": [ - "$5.448756012469637\\ \\mathrm{meter}$" - ], - "text/plain": [ - "5.448756012469637 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess1 = 25 * m\n", - "error_func(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-1.398018644734631 meter" - ], - "text/latex": [ - "$-1.398018644734631\\ \\mathrm{meter}$" - ], - "text/plain": [ - "-1.398018644734631 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "guess2 = 30 * m\n", - "error_func(guess2, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    convergedTrue
    root28.996669054031372 meter
    \n", - "
    " - ], - "text/plain": [ - "converged True\n", - "root 28.996669054031372 meter\n", - "dtype: object" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "res = root_bisect(error_func, [guess1, guess2], params)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "L = res.root\n", - "params_solution = Params(params, L=L)\n", - "system_solution = make_system(params_solution)\n", - "\n", - "results, details = run_ode_solver(system_solution, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "4.1424875280200724×10-7 meter2" - ], - "text/latex": [ - "$4.1424875280200724\\times 10^{-7}\\ \\mathrm{meter}^{2}$" - ], - "text/plain": [ - "4.1424875280200724e-07 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "min_height = get_last_value(results.y) * m" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/kitten_soln.ipynb b/soln/kitten_soln.ipynb deleted file mode 100644 index af88784b..00000000 --- a/soln/kitten_soln.ipynb +++ /dev/null @@ -1,878 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study.\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Unrolling\n", - "\n", - "Let's simulate a kitten unrolling toilet paper. As reference material, see [this video](http://modsimpy.com/kitten).\n", - "\n", - "The interactions of the kitten and the paper roll are complex. To keep things simple, let's assume that the kitten pulls down on the free end of the roll with constant force. Also, we will neglect the friction between the roll and the axle. \n", - "\n", - "![](diagrams/kitten.png)\n", - "\n", - "This figure shows the paper roll with $r$, $F$, and $\\tau$. As a vector quantity, the direction of $\\tau$ is into the page, but we only care about its magnitude for now." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start by loading the units we need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$\\mathrm{newton}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a few more parameters in the `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.02 meter
    Rmax0.055 meter
    Mcore0.015 kilogram
    Mroll0.215 kilogram
    L47 meter
    tension0.0002 newton
    t_end120 second
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.02 meter\n", - "Rmax 0.055 meter\n", - "Mcore 0.015 kilogram\n", - "Mroll 0.215 kilogram\n", - "L 47 meter\n", - "tension 0.0002 newton\n", - "t_end 120 second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " Mcore = 15e-3 * kg,\n", - " Mroll = 215e-3 * kg,\n", - " L = 47 * m,\n", - " tension = 2e-4 * N,\n", - " t_end = 120 * s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` computes `rho_h`, which we'll need to compute moment of inertia, and `k`, which we'll use to compute `r`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, Mcore, Mroll,\n", - " L, tension, and t_end\n", - " \n", - " returns: System with init, k, rho_h, Rmin, Rmax,\n", - " Mcore, Mroll, ts\n", - " \"\"\"\n", - " L, Rmax, Rmin = params.L, params.Rmax, params.Rmin\n", - " Mroll = params.Mroll\n", - " \n", - " init = State(theta = 0 * radian,\n", - " omega = 0 * radian/s,\n", - " y = L)\n", - " \n", - " area = pi * (Rmax**2 - Rmin**2)\n", - " rho_h = Mroll / area\n", - " k = (Rmax**2 - Rmin**2) / 2 / L / radian \n", - " \n", - " return System(params, init=init, area=area, rho_h=rho_h, k=k)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.02 meter
    Rmax0.055 meter
    Mcore0.015 kilogram
    Mroll0.215 kilogram
    L47 meter
    tension0.0002 newton
    t_end120 second
    inittheta 0 radian\n", - "omega 0.0 radi...
    area0.008246680715673206 meter ** 2
    rho_h26.07109543981524 kilogram / meter ** 2
    k2.7925531914893616e-05 meter / radian
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.02 meter\n", - "Rmax 0.055 meter\n", - "Mcore 0.015 kilogram\n", - "Mroll 0.215 kilogram\n", - "L 47 meter\n", - "tension 0.0002 newton\n", - "t_end 120 second\n", - "init theta 0 radian\n", - "omega 0.0 radi...\n", - "area 0.008246680715673206 meter ** 2\n", - "rho_h 26.07109543981524 kilogram / meter ** 2\n", - "k 2.7925531914893616e-05 meter / radian\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    theta0 radian
    omega0.0 radian / second
    y47 meter
    \n", - "
    " - ], - "text/plain": [ - "theta 0 radian\n", - "omega 0.0 radian / second\n", - "y 47 meter\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we compute `I` as a function of `r`:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def moment_of_inertia(r, system):\n", - " \"\"\"Moment of inertia for a roll of toilet paper.\n", - " \n", - " r: current radius of roll in meters\n", - " system: System object with Mcore, rho, Rmin, Rmax\n", - " \n", - " returns: moment of inertia in kg m**2\n", - " \"\"\"\n", - " Mcore, Rmin, rho_h = system.Mcore, system.Rmin, system.rho_h\n", - " \n", - " Icore = Mcore * Rmin**2 \n", - " Iroll = pi * rho_h / 2 * (r**4 - Rmin**4)\n", - " return Icore + Iroll" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When `r` is `Rmin`, `I` is small." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "6×10-6 kilogram meter2" - ], - "text/latex": [ - "$6\\times 10^{-6}\\ \\mathrm{kilogram} \\cdot \\mathrm{meter}^{2}$" - ], - "text/plain": [ - "6e-06 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "moment_of_inertia(system.Rmin, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As `r` increases, so does `I`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.00037418750000000006 kilogram meter2" - ], - "text/latex": [ - "$0.00037418750000000006\\ \\mathrm{kilogram} \\cdot \\mathrm{meter}^{2}$" - ], - "text/plain": [ - "0.00037418750000000006 " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "moment_of_inertia(system.Rmax, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "Write a slope function we can use to simulate this system. Here are some suggestions and hints:\n", - "\n", - "* `r` is no longer part of the `State` object. Instead, we compute `r` at each time step, based on the current value of `y`, using\n", - "\n", - "$y = \\frac{1}{2k} (r^2 - R_{min}^2)$\n", - "\n", - "* Angular velocity, `omega`, is no longer constant. Instead, we compute torque, `tau`, and angular acceleration, `alpha`, at each time step.\n", - "\n", - "* I changed the definition of `theta` so positive values correspond to clockwise rotation, so `dydt = -r * omega`; that is, positive values of `omega` yield decreasing values of `y`, the amount of paper still on the roll.\n", - "\n", - "* Your slope function should return `omega`, `alpha`, and `dydt`, which are the derivatives of `theta`, `omega`, and `y`, respectively.\n", - "\n", - "* Because `r` changes over time, we have to compute moment of inertia, `I`, at each time step.\n", - "\n", - "That last point might be more of a problem than I have made it seem. In the same way that $F = m a$ only applies when $m$ is constant, $\\tau = I \\alpha$ only applies when $I$ is constant. When $I$ varies, we usually have to use a more general version of Newton's law. However, I believe that in this example, mass and moment of inertia vary together in a way that makes the simple approach work out. Not all of my collegues are convinced." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, omega, y\n", - " t: time\n", - " system: System object with Rmin, k, Mcore, rho_h, tension\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega, y = state\n", - " k, Rmin, tension = system.k, system.Rmin, system.tension\n", - " \n", - " r = sqrt(2*k*y + Rmin**2)\n", - " I = moment_of_inertia(r, system)\n", - " tau = r * tension\n", - " alpha = tau / I\n", - " dydt = -r * omega\n", - " \n", - " return omega, alpha, dydt " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test `slope_func` with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 ,\n", - " 0.02939702689159846 ,\n", - " -0.0 )" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, 0*s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomegay
    115.2205.83885219911747 radian3.7827035471318 radian / second36.27041961153422 meter
    116.4210.40759585863975 radian3.8320604323461227 radian / second36.04569112433749 meter
    117.6215.0357989373311 radian3.88180711854165 radian / second35.818632262441746 meter
    118.8219.72393467957122 radian3.9319528720968493 radian / second35.589242955595836 meter
    120.0224.47248760394635 radian3.982507222010697 radian / second35.357523131304944 meter
    \n", - "
    " - ], - "text/plain": [ - " theta omega \\\n", - "115.2 205.83885219911747 radian 3.7827035471318 radian / second \n", - "116.4 210.40759585863975 radian 3.8320604323461227 radian / second \n", - "117.6 215.0357989373311 radian 3.88180711854165 radian / second \n", - "118.8 219.72393467957122 radian 3.9319528720968493 radian / second \n", - "120.0 224.47248760394635 radian 3.982507222010697 radian / second \n", - "\n", - " y \n", - "115.2 36.27041961153422 meter \n", - "116.4 36.04569112433749 meter \n", - "117.6 35.818632262441746 meter \n", - "118.8 35.589242955595836 meter \n", - "120.0 35.357523131304944 meter " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check the results to see if they seem plausible:\n", - "\n", - "* The final value of `theta` should be about 220 radians.\n", - "\n", - "* The final value of `omega` should be near 4 radians/second, which is less one revolution per second, so that seems plausible.\n", - "\n", - "* The final value of `y` should be about 35 meters of paper left on the roll, which means the kitten pulls off 12 meters in two minutes. That doesn't seem impossible, although it is based on a level of consistency and focus that is unlikely in a kitten.\n", - "\n", - "* Angular velocity, `omega`, should increase almost linearly at first, as constant force yields almost constant torque. Then, as the radius decreases, the lever arm decreases, yielding lower torque, but moment of inertia decreases even more, yielding higher angular acceleration." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot `theta`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot `omega`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_omega(results):\n", - " plot(results.omega, color='C2', label='omega')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')\n", - " \n", - "plot_omega(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot `y`" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_y(results):\n", - " plot(results.y, color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/oem_soln.ipynb b/soln/oem_soln.ipynb deleted file mode 100644 index d018877c..00000000 --- a/soln/oem_soln.ipynb +++ /dev/null @@ -1,2027 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study.\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Electric car" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Olin Electric Motorsports](https://www.olinelectricmotorsports.com/) is a club at Olin College that designs and builds electric cars, and participates in the [Formula SAE Electric](https://www.sae.org/attend/student-events/formula-sae-electric) competition.\n", - "\n", - "The goal of this case study is to use simulation to guide the design of a car intended to accelerate from standing to 100 kph as quickly as possible. The [world record for this event](https://www.youtube.com/watch?annotation_id=annotation_2297602723&feature=iv&src_vid=I-NCH8ct24U&v=n2XiCYA3C9s), using a car that meets the competition requirements, is 1.513 seconds.\n", - "\n", - "We'll start with a simple model that takes into account the characteristics of the motor and vehicle:\n", - "\n", - "* The motor is an [Emrax 228 high voltage axial flux synchronous permanent magnet motor](http://emrax.com/products/emrax-228/); according to the [data sheet](http://emrax.com/wp-content/uploads/2017/01/emrax_228_technical_data_4.5.pdf), its maximum torque is 240 Nm, at 0 rpm. But maximum torque decreases with motor speed; at 5000 rpm, maximum torque is 216 Nm.\n", - "\n", - "* The motor is connected to the drive axle with a chain drive with speed ratio 13:60 or 1:4.6; that is, the axle rotates once for each 4.6 rotations of the motor.\n", - "\n", - "* The radius of the tires is 0.26 meters.\n", - "\n", - "* The weight of the vehicle, including driver, is 300 kg.\n", - "\n", - "To start, we will assume no slipping between the tires and the road surface, no air resistance, and no rolling resistance. Then we will relax these assumptions one at a time.\n", - "\n", - "* First we'll add drag, assuming that the frontal area of the vehicle is 0.6 square meters, with coefficient of drag 0.6.\n", - "\n", - "* Next we'll add rolling resistance, assuming a coefficient of 0.2.\n", - "\n", - "* Finally we'll compute the peak acceleration to see if the \"no slip\" assumption is credible.\n", - "\n", - "We'll use this model to estimate the potential benefit of possible design improvements, including decreasing drag and rolling resistance, or increasing the speed ratio.\n", - "\n", - "I'll start by loading the units we need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "revolutions_per_minute" - ], - "text/latex": [ - "$\\mathrm{revolutions_per_minute}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "minute = UNITS.minute\n", - "hour = UNITS.hour\n", - "km = UNITS.kilometer\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton\n", - "rpm = UNITS.rpm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And store the parameters in a `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    r_wheel0.26 meter
    speed_ratio0.216667
    C_rr0.2
    C_d0.5
    area0.6 meter ** 2
    rho1.2 kilogram / meter ** 3
    mass300 kilogram
    \n", - "
    " - ], - "text/plain": [ - "r_wheel 0.26 meter\n", - "speed_ratio 0.216667\n", - "C_rr 0.2\n", - "C_d 0.5\n", - "area 0.6 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "mass 300 kilogram\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(r_wheel=0.26 * m,\n", - " speed_ratio=13/60,\n", - " C_rr=0.2,\n", - " C_d=0.5,\n", - " area=0.6*m**2,\n", - " rho=1.2*kg/m**3,\n", - " mass=300*kg)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates the initial state, `init`, and constructs an `interp1d` object that represents torque as a function of motor speed." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(x=0*m, v=0*m/s)\n", - " \n", - " rpms = [0, 2000, 5000]\n", - " torques = [240, 240, 216]\n", - " interpolate_torque = interpolate(Series(torques, rpms))\n", - " \n", - " return System(params, init=init,\n", - " interpolate_torque=interpolate_torque,\n", - " t_end=3*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    r_wheel0.26 meter
    speed_ratio0.216667
    C_rr0.2
    C_d0.5
    area0.6 meter ** 2
    rho1.2 kilogram / meter ** 3
    mass300 kilogram
    initx 0 meter\n", - "v 0.0 meter / secon...
    interpolate_torque<function interpolate.<locals>.wrapper at 0x7f...
    unit_torque1.0 meter * newton
    t_end3 second
    \n", - "
    " - ], - "text/plain": [ - "r_wheel 0.26 meter\n", - "speed_ratio 0.216667\n", - "C_rr 0.2\n", - "C_d 0.5\n", - "area 0.6 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "mass 300 kilogram\n", - "init x 0 meter\n", - "v 0.0 meter / secon...\n", - "interpolate_torque .wrapper at 0x7f...\n", - "unit_torque 1.0 meter * newton\n", - "t_end 3 second\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    v0.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "v 0.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Torque and speed\n", - "\n", - "The relationship between torque and motor speed is taken from the [Emrax 228 data sheet](http://emrax.com/wp-content/uploads/2017/01/emrax_228_technical_data_4.5.pdf). The following functions reproduce the red dotted line that represents peak torque, which can only be sustained for a few seconds before the motor overheats." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_torque(omega, system):\n", - " \"\"\"Maximum peak torque as a function of motor speed.\n", - " \n", - " omega: motor speed in radian/s\n", - " system: System object\n", - " \n", - " returns: torque in Nm\n", - " \"\"\"\n", - " factor = (1 * radian / s).to(rpm)\n", - " x = magnitude(omega * factor)\n", - " return system.interpolate_torque(x) * N * m" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "240.0 meter newton" - ], - "text/latex": [ - "$240.0\\ \\mathrm{meter} \\cdot \\mathrm{newton}$" - ], - "text/plain": [ - "240.0 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_torque(0*radian/s, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "216.0 meter newton" - ], - "text/latex": [ - "$216.0\\ \\mathrm{meter} \\cdot \\mathrm{newton}$" - ], - "text/plain": [ - "216.0 " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "omega = (5000 * rpm).to(radian/s)\n", - "compute_torque(omega, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the whole curve." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "xs = linspace(0, 525, 21) * radian / s\n", - "taus = [compute_torque(x, system) for x in xs]\n", - "plot(xs, taus)\n", - "decorate(xlabel='Motor speed (rpm)',\n", - " ylabel='Available torque (N m)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulation\n", - "\n", - "Here's the slope function that computes the maximum possible acceleration of the car as a function of it current speed." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " x, v = state\n", - " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", - " mass = system.mass\n", - " \n", - " # use velocity, v, to compute angular velocity of the wheel\n", - " omega2 = v / r_wheel\n", - " \n", - " # use the speed ratio to compute motor speed\n", - " omega1 = omega2 / speed_ratio\n", - " \n", - " # look up motor speed to get maximum torque at the motor\n", - " tau1 = compute_torque(omega1, system)\n", - " \n", - " # compute the corresponding torque at the axle\n", - " tau2 = tau1 / speed_ratio\n", - " \n", - " # compute the force of the wheel on the ground\n", - " F = tau2 / r_wheel\n", - " \n", - " # compute acceleration\n", - " a = F/mass\n", - "\n", - " return v, a " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `slope_func` at linear velocity 10 m/s." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x0 meter
    v10.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "x 0 meter\n", - "v 10.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "test_state = State(x=0*m, v=10*m/s)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(10.0 , 14.201183431952662 )" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(test_state, 0*s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    xv
    2.8857.32626824256294 meter38.632749274430566 meter / second
    2.9158.49067227876934 meter38.99375142852514 meter / second
    2.9459.66589334398368 meter39.353885587648904 meter / second
    2.9760.851905429699734 meter39.713153838812325 meter / second
    3.0062.0486825899462 meter40.071558264007834 meter / second
    \n", - "
    " - ], - "text/plain": [ - " x v\n", - "2.88 57.32626824256294 meter 38.632749274430566 meter / second\n", - "2.91 58.49067227876934 meter 38.99375142852514 meter / second\n", - "2.94 59.66589334398368 meter 39.353885587648904 meter / second\n", - "2.97 60.851905429699734 meter 39.713153838812325 meter / second\n", - "3.00 62.0486825899462 meter 40.071558264007834 meter / second" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After 3 seconds, the vehicle could be at 40 meters per second, in theory, which is 144 kph." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "40.071558264007834 meter/second" - ], - "text/latex": [ - "$40.071558264007834\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "40.071558264007834 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v_final = get_last_value(results.v)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "144.2576097504282 kilometer/hour" - ], - "text/latex": [ - "$144.2576097504282\\ \\frac{\\mathrm{kilometer}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "144.2576097504282 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v_final.to(km/hour)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `x`" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results):\n", - " plot(results.x, label='x')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `v`" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, label='v')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Stopping at 100 kph\n", - "\n", - "We'll use an event function to stop the simulation when we reach 100 kph." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stops when we get to 100 km/hour.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: difference from 100 km/hour\n", - " \"\"\"\n", - " x, v = state\n", - " \n", - " # convert to km/hour\n", - " factor = (1 * m/s).to(km/hour)\n", - " v = magnitude(v * factor)\n", - " \n", - " return v - 100 " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap11-fig02.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "subplot(2, 1, 1)\n", - "plot_position(results)\n", - "\n", - "subplot(2, 1, 2)\n", - "plot_velocity(results)\n", - "\n", - "savefig('figs/chap11-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "According to this model, we should be able to make this run in just over 2 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.010095574667565 second" - ], - "text/latex": [ - "$2.010095574667565\\ \\mathrm{second}$" - ], - "text/plain": [ - "2.010095574667565 " - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "At the end of the run, the car has gone about 28 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    x28.385825236293645 meter
    v27.777777777777775 meter / second
    \n", - "
    " - ], - "text/plain": [ - "x 28.385825236293645 meter\n", - "v 27.777777777777775 meter / second\n", - "Name: 2.010095574667565, dtype: object" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = results.last_row()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we send the final state back to the slope function, we can see that the final acceleration is about 13 $m/s^2$, which is about 1.3 times the acceleration of gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "99.99999999999999 kilometer/hour" - ], - "text/latex": [ - "$99.99999999999999\\ \\frac{\\mathrm{kilometer}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "99.99999999999999 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v, a = slope_func(state, 0, system)\n", - "v.to(km/hour)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "12.918946212080874 newton/kilogram" - ], - "text/latex": [ - "$12.918946212080874\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$" - ], - "text/plain": [ - "12.918946212080874 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "a" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1.3182598175592728 dimensionless" - ], - "text/latex": [ - "$1.3182598175592728\\ dimensionless$" - ], - "text/plain": [ - "1.3182598175592728 " - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = 9.8 * m/s**2\n", - "(a / g).to(UNITS.dimensionless)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's not easy for a vehicle to accelerate faster than `g`, because that implies a coefficient of friction between the wheels and the road surface that's greater than 1. But racing tires on dry asphalt can do that; the OEM team at Olin has tested their tires and found a peak coefficient near 1.5.\n", - "\n", - "So it's possible that our no slip assumption is valid, but only under ideal conditions, where weight is distributed equally on four tires, and all tires are driving." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** How much time do we lose because maximum torque decreases as motor speed increases? Run the model again with no drop off in torque and see how much time it saves." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we'll see how much effect drag has on the results.\n", - "\n", - "Here's a function to compute drag force, as we saw in Chapter 21." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(v, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " v: velocity\n", - " system: System object\n", - " \n", - " returns: drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " f_drag = -np.sign(v) * rho * v**2 * C_d * area / 2\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it with a velocity of 20 m/s." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-72.0 kilogram meter/second2" - ], - "text/latex": [ - "$-72.0\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "-72.0 " - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drag_force(20 * m/s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the resulting acceleration of the vehicle due to drag.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-0.24 meter/second2" - ], - "text/latex": [ - "$-0.24\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "-0.24 " - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drag_force(20 * m/s, system) / system.mass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that the effect of drag is not huge, compared to the acceleration we computed in the previous section, but it is not negligible.\n", - "\n", - "Here's a modified slope function that takes drag into account." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func2(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " x, v = state\n", - " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", - " mass = system.mass\n", - " \n", - " omega2 = v / r_wheel * radian\n", - " omega1 = omega2 / speed_ratio\n", - " tau1 = compute_torque(omega1, system)\n", - " tau2 = tau1 / speed_ratio\n", - " F = tau2 / r_wheel\n", - " a_motor = F / mass\n", - " a_drag = drag_force(v, system) / mass\n", - " \n", - " a = a_motor + a_drag\n", - " return v, a " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the next run." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2, details = run_ode_solver(system, slope_func2, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The time to reach 100 kph is a bit higher." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.034354320417196 second" - ], - "text/latex": [ - "$2.034354320417196\\ \\mathrm{second}$" - ], - "text/plain": [ - "2.034354320417196 " - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final2 = get_last_label(results2) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But the total effect of drag is only about 2/100 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.02425874574963105 second" - ], - "text/latex": [ - "$0.02425874574963105\\ \\mathrm{second}$" - ], - "text/plain": [ - "0.02425874574963105 " - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final2 - t_final" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's not huge, which suggests we might not be able to save much time by decreasing the frontal area, or coefficient of drag, of the car." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling resistance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we'll consider [rolling resistance](https://en.wikipedia.org/wiki/Rolling_resistance), which the force that resists the motion of the car as it rolls on tires. The cofficient of rolling resistance, `C_rr`, is the ratio of rolling resistance to the normal force between the car and the ground (in that way it is similar to a coefficient of friction).\n", - "\n", - "The following function computes rolling resistance." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "system.set(unit_rr = 1 * N / kg)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "def rolling_resistance(system):\n", - " \"\"\"Computes force due to rolling resistance.\n", - " \n", - " system: System object\n", - " \n", - " returns: force\n", - " \"\"\"\n", - " return -system.C_rr * system.mass * system.unit_rr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The acceleration due to rolling resistance is 0.2 (it is not a coincidence that it equals `C_rr`)." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-60.0 newton" - ], - "text/latex": [ - "$-60.0\\ \\mathrm{newton}$" - ], - "text/plain": [ - "-60.0 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rolling_resistance(system)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-0.2 newton/kilogram" - ], - "text/latex": [ - "$-0.2\\ \\frac{\\mathrm{newton}}{\\mathrm{kilogram}}$" - ], - "text/plain": [ - "-0.2 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rolling_resistance(system) / system.mass" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a modified slope function that includes drag and rolling resistance." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func3(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " x, v = state\n", - " r_wheel, speed_ratio = system.r_wheel, system.speed_ratio\n", - " mass = system.mass\n", - " \n", - " omega2 = v / r_wheel * radian\n", - " omega1 = omega2 / speed_ratio\n", - " tau1 = compute_torque(omega1, system)\n", - " tau2 = tau1 / speed_ratio\n", - " F = tau2 / r_wheel\n", - " a_motor = F / mass\n", - " a_drag = drag_force(v, system) / mass\n", - " a_roll = rolling_resistance(system) / mass\n", - " \n", - " a = a_motor + a_drag + a_roll\n", - " return v, a " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the run." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results3, details = run_ode_solver(system, slope_func3, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final time is a little higher, but the total cost of rolling resistance is only 3/100 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "2.0646544476416953 second" - ], - "text/latex": [ - "$2.0646544476416953\\ \\mathrm{second}$" - ], - "text/plain": [ - "2.0646544476416953 " - ] - }, - "execution_count": 46, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final3 = get_last_label(results3) * s" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.030300127224499374 second" - ], - "text/latex": [ - "$0.030300127224499374\\ \\mathrm{second}$" - ], - "text/plain": [ - "0.030300127224499374 " - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final3 - t_final2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So, again, there is probably not much to be gained by decreasing rolling resistance.\n", - "\n", - "In fact, it is hard to decrease rolling resistance without also decreasing traction, so that might not help at all." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimal gear ratio" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The gear ratio 13:60 is intended to maximize the acceleration of the car without causing the tires to slip. In this section, we'll consider other gear ratios and estimate their effects on acceleration and time to reach 100 kph.\n", - "\n", - "Here's a function that takes a speed ratio as a parameter and returns time to reach 100 kph." - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "def time_to_speed(speed_ratio, params):\n", - " \"\"\"Computes times to reach 100 kph.\n", - " \n", - " speed_ratio: ratio of wheel speed to motor speed\n", - " params: Params object\n", - " \n", - " returns: time to reach 100 kph, in seconds\n", - " \"\"\"\n", - " params = Params(params, speed_ratio=speed_ratio)\n", - " system = make_system(params)\n", - " system.set(unit_rr = 1 * N / kg)\n", - " \n", - " results, details = run_ode_solver(system, slope_func3, events=event_func)\n", - " t_final = get_last_label(results)\n", - " a_initial = slope_func(system.init, 0, system)\n", - " return t_final" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it with the default ratio:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.0646544476416953" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "time_to_speed(13/60, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can try it with different numbers of teeth on the motor gear (assuming that the axle gear has 60 teeth):" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8 1.3230554808694261\n", - "9 1.4683740716590767\n", - "10 1.6154033363003908\n", - "11 1.763893473709603\n", - "12 1.913673186217739\n", - "13 2.0646544476416953\n", - "14 2.216761311453768\n", - "15 2.369962929121199\n", - "16 2.5242340753735495\n", - "17 2.6795453467447845\n" - ] - } - ], - "source": [ - "for teeth in linrange(8, 18):\n", - " print(teeth, time_to_speed(teeth/60, params))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wow! The speed ratio has a big effect on the results. At first glance, it looks like we could break the world record (1.513 seconds) just by decreasing the number of teeth.\n", - "\n", - "But before we try it, let's see what effect that has on peak acceleration." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_acceleration(speed_ratio, params):\n", - " \"\"\"Maximum acceleration as a function of speed ratio.\n", - " \n", - " speed_ratio: ratio of wheel speed to motor speed\n", - " params: Params object\n", - " \n", - " returns: peak acceleration, in m/s^2\n", - " \"\"\"\n", - " params = Params(params, speed_ratio=speed_ratio)\n", - " system = make_system(params)\n", - " a_initial = slope_func(system.init, 0, system)[1] * m/s**2\n", - " return a_initial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "8 23.076923076923077 meter * newton / kilogram / second ** 2\n", - "9 20.51282051282051 meter * newton / kilogram / second ** 2\n", - "10 18.46153846153846 meter * newton / kilogram / second ** 2\n", - "11 16.783216783216787 meter * newton / kilogram / second ** 2\n", - "12 15.384615384615385 meter * newton / kilogram / second ** 2\n", - "13 14.201183431952662 meter * newton / kilogram / second ** 2\n", - "14 13.186813186813184 meter * newton / kilogram / second ** 2\n", - "15 12.307692307692308 meter * newton / kilogram / second ** 2\n", - "16 11.538461538461538 meter * newton / kilogram / second ** 2\n", - "17 10.85972850678733 meter * newton / kilogram / second ** 2\n" - ] - } - ], - "source": [ - "for teeth in linrange(8, 18):\n", - " print(teeth, initial_acceleration(teeth/60, params))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we decrease the speed ratio, the peak acceleration increases. With 8 teeth on the motor gear, we could break the world record, but only if we can accelerate at 2.3 times the acceleration of gravity, which is impossible without very sticky ties and a vehicle that generates a lot of downforce." - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.354081632653061" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "23.07 / 9.8" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These results suggest that the most promising way to improve the performance of the car (for this event) would be to improve traction." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/orbit_soln.ipynb b/soln/orbit_soln.ipynb deleted file mode 100644 index b55e14f8..00000000 --- a/soln/orbit_soln.ipynb +++ /dev/null @@ -1,767 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Earth orbit\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "year" - ], - "text/latex": [ - "$\\mathrm{year}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Here are the units we'll need\n", - "\n", - "s = UNITS.second\n", - "N = UNITS.newton\n", - "kg = UNITS.kilogram\n", - "m = UNITS.meter\n", - "year = UNITS.year" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R[147000000000.0 meter, 0.0 meter]
    V[0.0 meter / second, -30300.0 meter / second]
    \n", - "
    " - ], - "text/plain": [ - "R [147000000000.0 meter, 0.0 meter]\n", - "V [0.0 meter / second, -30300.0 meter / second]\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# And an inition condition (with everything in SI units)\n", - "\n", - "# distance from the sun to the earth at perihelion\n", - "R = Vector(147e9, 0) * m\n", - "\n", - "# initial velocity\n", - "V = Vector(0, -30300) * m/s\n", - "\n", - "init = State(R=R, V=V)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initR [147000000000.0 meter, 0.0 me...
    G6.674e-11 meter ** 2 * newton / kilogram ** 2
    m11.989e+30 kilogram
    r_final701879000.0 meter
    m25.972e+24 kilogram
    t_end31556925.9747 second
    \n", - "
    " - ], - "text/plain": [ - "init R [147000000000.0 meter, 0.0 me...\n", - "G 6.674e-11 meter ** 2 * newton / kilogram ** 2\n", - "m1 1.989e+30 kilogram\n", - "r_final 701879000.0 meter\n", - "m2 5.972e+24 kilogram\n", - "t_end 31556925.9747 second\n", - "dtype: object" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Making a system object\n", - "\n", - "r_earth = 6.371e6 * m\n", - "r_sun = 695.508e6 * m\n", - "\n", - "t_end = (1 * year).to_base_units()\n", - "\n", - "system = System(init=init,\n", - " G=6.674e-11 * N / kg**2 * m**2,\n", - " m1=1.989e30 * kg,\n", - " r_final=r_sun + r_earth,\n", - " m2=5.972e24 * kg,\n", - " t_end=t_end)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Here's a function that computes the force of gravity\n", - "\n", - "def universal_gravitation(state, system):\n", - " \"\"\"Computes gravitational force.\n", - " \n", - " state: State object with distance r\n", - " system: System object with m1, m2, and G\n", - " \n", - " returns: Vector\n", - " \"\"\"\n", - " R, V = state\n", - " G, m1, m2 = system.G, system.m1, system.m2\n", - " \n", - " # make sure the result is a vector, either\n", - " # by forcing it, or by putting v.hat() on\n", - " # the left\n", - " \n", - " force = -G * m1 * m2 / R.mag2 * R.hat()\n", - " return Vector(force)\n", - "\n", - " force = -R.hat() * G * m1 * m2 / R.mag2\n", - " return force" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-3.6686485997501037×1022 & -0.0\\end{pmatrix} newton\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-3.6686485997501037\\times 10^{22} & -0.0\\end{pmatrix}\\ \\mathrm{newton}$" - ], - "text/plain": [ - "array([-3.6686486e+22, -0.0000000e+00]) " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "universal_gravitation(init, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# The slope function\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `g`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " R, V = state\n", - "\n", - " F = universal_gravitation(state, system)\n", - " A = F / system.m2\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([ 0., -30300.]) ,\n", - " array([-0.00614308, -0. ]) )" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Always test the slope function!\n", - "\n", - "slope_func(init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Here's an event function that stops the simulation\n", - "# before the collision\n", - "\n", - "def event_func(state, t, system):\n", - " R, V = state\n", - " return R.mag - system.r_final" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "146298121000.0 meter" - ], - "text/latex": [ - "$146298121000.0\\ \\mathrm{meter}$" - ], - "text/plain": [ - "146298121000.0 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Always test the event function!\n", - "\n", - "event_func(init, 0, system)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    messageSuccess
    \n", - "
    " - ], - "text/plain": [ - "message Success\n", - "dtype: object" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Finally we can run the simulation\n", - "\n", - "system.set(dt=system.t_end/1000)\n", - "results, details = run_euler(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_trajectory(R):\n", - " x = R.extract('x') / 1e9\n", - " y = R.extract('y') / 1e9\n", - "\n", - " plot(x, y)\n", - " plot(0, 0, 'yo')\n", - "\n", - " decorate(xlabel='x distance (million km)',\n", - " ylabel='y distance (million km)')" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_trajectory(results.R)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "R [1993548154.0907593 meter, 53558254525.37807 m...\n", - "V [9671.881139414403 meter / second, 2805.422229...\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error = results.last_row() - system.init" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "53595343660.133934 meter" - ], - "text/latex": [ - "$53595343660.133934\\ \\mathrm{meter}$" - ], - "text/plain": [ - "53595343660.133934 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error.R.mag" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "10070.535172486145 meter/second" - ], - "text/latex": [ - "$10070.535172486145\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "10070.535172486145 " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error.V.mag" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Ralston\n", - "\n", - "system.set(dt=system.t_end/1000)\n", - "results, details = run_ralston(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_trajectory(results.R)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "R [-3723637.7203674316 meter, -1060434466.552573...\n", - "V [-214.86614651603597 meter / second, 0.7785432...\n", - "dtype: object" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error = results.last_row() - system.init" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1060441004.1725632 meter" - ], - "text/latex": [ - "$1060441004.1725632\\ \\mathrm{meter}$" - ], - "text/plain": [ - "1060441004.1725632 " - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error.R.mag" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "214.8675569931363 meter/second" - ], - "text/latex": [ - "$214.8675569931363\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "214.8675569931363 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error.V.mag" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x') * 1.1\n", - "ys = results.R.extract('y') * 1.1\n", - "\n", - "def draw_func(state, t):\n", - " set_xlim(xs)\n", - " set_ylim(ys)\n", - " x, y = state.R\n", - " plot(x, y, 'b.')\n", - " plot(0, 0, 'yo')\n", - " decorate(xlabel='x distance (million km)',\n", - " ylabel='y distance (million km)')" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system.set(dt=system.t_end/100)\n", - "results, details = run_ralston(system, slope_func)\n", - "animate(results, draw_func)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/penny_model_comparison.ipynb b/soln/penny_model_comparison.ipynb deleted file mode 100644 index d85e73a7..00000000 --- a/soln/penny_model_comparison.ipynb +++ /dev/null @@ -1,1177 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Comparison of the penny models from Chapters 1, 20, and 21\n", - "\n", - "Copyright 2018 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### With air resistance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we'll add air resistance using the [drag equation](https://en.wikipedia.org/wiki/Drag_equation)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start by getting the units we'll need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "kilogram" - ], - "text/latex": [ - "$\\mathrm{kilogram}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.0025 kilogram
    diameter0.019 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.0025 kilogram\n", - "diameter 0.019 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(height = 381 * m,\n", - " v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " mass = 2.5e-3 * kg,\n", - " diameter = 19e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 18 * m / s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " unpack(params)\n", - " \n", - " area = np.pi * (diameter/2)**2\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " init = State(y=height, v=v_init)\n", - " t_end = 30 * s\n", - " \n", - " return System(params, area=area, C_d=C_d, \n", - " init=init, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    v_init0.0 meter / second
    g9.8 meter / second ** 2
    mass0.0025 kilogram
    diameter0.019 meter
    rho1.2 kilogram / meter ** 3
    v_term18.0 meter / second
    area0.0002835287369864788 meter ** 2
    C_d0.4445009981135434 dimensionless
    inity 381 meter\n", - "v 0.0 meter / secon...
    t_end30 second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "v_init 0.0 meter / second\n", - "g 9.8 meter / second ** 2\n", - "mass 0.0025 kilogram\n", - "diameter 0.019 meter\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 18.0 meter / second\n", - "area 0.0002835287369864788 meter ** 2\n", - "C_d 0.4445009981135434 dimensionless\n", - "init y 381 meter\n", - "v 0.0 meter / secon...\n", - "t_end 30 second\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function, including acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " mass = system.mass\n", - " g = system.g\n", - " \n", - " f_drag = rho * v**2 * C_d * area / 2\n", - " a_drag = f_drag / mass\n", - " \n", - " dydt = v\n", - " dvdt = -g + a_drag\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 , -9.8 )" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the same event function as in the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageA termination event occurred.
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message A termination event occurred.\n", - "dtype: object" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.000000381 meter0.0 meter / second
    0.300000380.559 meter-2.913855777777778 meter / second
    0.600000379.2553998560887 meter-5.676321799192868 meter / second
    0.900000377.15535917269835 meter-8.166374221525693 meter / second
    1.200000374.35521895425103 meter-10.311720070623485 meter / second
    1.500000370.96543201556204 meter-12.090247228814045 meter / second
    1.800000367.09631700871336 meter-13.518952241005275 meter / second
    2.100000362.8483908201627 meter-14.638370780659383 meter / second
    2.400000358.3075410597563 meter-15.498718976734299 meter / second
    2.700000353.54387826134905 meter-16.150356583635052 meter / second
    3.000000348.6127953660127 meter-16.638537486499228 meter / second
    3.300000343.5570453854738 meter-17.001300692432412 meter / second
    3.600000338.4090764843133 meter-17.269254229780273 meter / second
    3.900000333.1932204915177 meter-17.466306425809933 meter / second
    4.200000327.92756526232625 meter-17.610750940510915 meter / second
    4.500000322.62547300477706 meter-17.716383148064374 meter / second
    4.800000317.2967703203745 meter-17.793499099432996 meter / second
    5.100000311.94866008776336 meter-17.84972641814655 meter / second
    5.400000306.586409493623 meter-17.890685845112163 meter / second
    5.700000301.21386361121205 meter-17.920503377109643 meter / second
    6.000000295.8338258653892 meter-17.94219936904363 meter / second
    6.300000290.448338371113 meter-17.957980371929946 meter / second
    6.600000285.05888770100324 meter-17.96945605745975 meter / second
    6.900000279.66655550040554 meter-17.977799435972766 meter / second
    7.200000274.2721285128205 meter-17.9838646561385 meter / second
    7.500000268.87617883849407 meter-17.988273335755586 meter / second
    7.800000263.47912241839214 meter-17.99147768251337 meter / second
    8.100000258.08126161893864 meter-17.99380656697738 meter / second
    8.400000252.68281622283766 meter-17.99549911112701 meter / second
    8.700000247.28394597351817 meter-17.996729153771838 meter / second
    .........
    13.800000155.48693674391328 meter-17.99998562459072 meter / second
    14.100000150.08694035214128 meter-17.99998955354878 meter / second
    14.400000144.6869429742007 meter-17.99999240867943 meter / second
    14.700000139.28694487962224 meter-17.999994483471404 meter / second
    15.000000133.88694626427096 meter-17.999995991199814 meter / second
    15.300000128.48694727047982 meter-17.99999708684937 meter / second
    15.600000123.08694800168064 meter-17.99999788304576 meter / second
    15.900000117.68694853303616 meter-17.999998461632856 meter / second
    16.200000112.28694891916632 meter-17.999998882085677 meter / second
    16.500000106.88694919976282 meter-17.999999187624077 meter / second
    16.800000101.48694940366919 meter-17.99999940965544 meter / second
    17.10000096.08694955184568 meter-17.999999571003165 meter / second
    17.40000090.68694965952389 meter-17.999999688252768 meter / second
    17.70000085.28694973777245 meter-17.99999977345675 meter / second
    18.00000079.8869497946348 meter-17.999999835373536 meter / second
    18.30000074.48694983595604 meter-17.999999880367778 meter / second
    18.60000069.08694986598373 meter-17.999999913064592 meter / second
    18.90000063.686949887804516 meter-17.999999936825006 meter / second
    19.20000058.28694990366144 meter-17.999999954091432 meter / second
    19.50000052.88694991518449 meter-17.999999966638754 meter / second
    19.80000047.48694992355816 meter-17.999999975756754 meter / second
    20.10000042.08694992964321 meter-17.999999982382704 meter / second
    20.40000036.686949934065154 meter-17.999999987197707 meter / second
    20.70000031.28694993727853 meter-17.999999990696715 meter / second
    21.00000025.886949939613654 meter-17.999999993239406 meter / second
    21.30000020.486949941310563 meter-17.99999999508715 meter / second
    21.60000015.086949942543686 meter-17.99999999642989 meter / second
    21.9000009.686949943439785 meter-17.99999999740564 meter / second
    22.2000004.286949944090969 meter-17.999999998114706 meter / second
    22.4381640.0 meter-17.99999999852377 meter / second
    \n", - "

    76 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.000000 381 meter 0.0 meter / second\n", - "0.300000 380.559 meter -2.913855777777778 meter / second\n", - "0.600000 379.2553998560887 meter -5.676321799192868 meter / second\n", - "0.900000 377.15535917269835 meter -8.166374221525693 meter / second\n", - "1.200000 374.35521895425103 meter -10.311720070623485 meter / second\n", - "1.500000 370.96543201556204 meter -12.090247228814045 meter / second\n", - "1.800000 367.09631700871336 meter -13.518952241005275 meter / second\n", - "2.100000 362.8483908201627 meter -14.638370780659383 meter / second\n", - "2.400000 358.3075410597563 meter -15.498718976734299 meter / second\n", - "2.700000 353.54387826134905 meter -16.150356583635052 meter / second\n", - "3.000000 348.6127953660127 meter -16.638537486499228 meter / second\n", - "3.300000 343.5570453854738 meter -17.001300692432412 meter / second\n", - "3.600000 338.4090764843133 meter -17.269254229780273 meter / second\n", - "3.900000 333.1932204915177 meter -17.466306425809933 meter / second\n", - "4.200000 327.92756526232625 meter -17.610750940510915 meter / second\n", - "4.500000 322.62547300477706 meter -17.716383148064374 meter / second\n", - "4.800000 317.2967703203745 meter -17.793499099432996 meter / second\n", - "5.100000 311.94866008776336 meter -17.84972641814655 meter / second\n", - "5.400000 306.586409493623 meter -17.890685845112163 meter / second\n", - "5.700000 301.21386361121205 meter -17.920503377109643 meter / second\n", - "6.000000 295.8338258653892 meter -17.94219936904363 meter / second\n", - "6.300000 290.448338371113 meter -17.957980371929946 meter / second\n", - "6.600000 285.05888770100324 meter -17.96945605745975 meter / second\n", - "6.900000 279.66655550040554 meter -17.977799435972766 meter / second\n", - "7.200000 274.2721285128205 meter -17.9838646561385 meter / second\n", - "7.500000 268.87617883849407 meter -17.988273335755586 meter / second\n", - "7.800000 263.47912241839214 meter -17.99147768251337 meter / second\n", - "8.100000 258.08126161893864 meter -17.99380656697738 meter / second\n", - "8.400000 252.68281622283766 meter -17.99549911112701 meter / second\n", - "8.700000 247.28394597351817 meter -17.996729153771838 meter / second\n", - "... ... ...\n", - "13.800000 155.48693674391328 meter -17.99998562459072 meter / second\n", - "14.100000 150.08694035214128 meter -17.99998955354878 meter / second\n", - "14.400000 144.6869429742007 meter -17.99999240867943 meter / second\n", - "14.700000 139.28694487962224 meter -17.999994483471404 meter / second\n", - "15.000000 133.88694626427096 meter -17.999995991199814 meter / second\n", - "15.300000 128.48694727047982 meter -17.99999708684937 meter / second\n", - "15.600000 123.08694800168064 meter -17.99999788304576 meter / second\n", - "15.900000 117.68694853303616 meter -17.999998461632856 meter / second\n", - "16.200000 112.28694891916632 meter -17.999998882085677 meter / second\n", - "16.500000 106.88694919976282 meter -17.999999187624077 meter / second\n", - "16.800000 101.48694940366919 meter -17.99999940965544 meter / second\n", - "17.100000 96.08694955184568 meter -17.999999571003165 meter / second\n", - "17.400000 90.68694965952389 meter -17.999999688252768 meter / second\n", - "17.700000 85.28694973777245 meter -17.99999977345675 meter / second\n", - "18.000000 79.8869497946348 meter -17.999999835373536 meter / second\n", - "18.300000 74.48694983595604 meter -17.999999880367778 meter / second\n", - "18.600000 69.08694986598373 meter -17.999999913064592 meter / second\n", - "18.900000 63.686949887804516 meter -17.999999936825006 meter / second\n", - "19.200000 58.28694990366144 meter -17.999999954091432 meter / second\n", - "19.500000 52.88694991518449 meter -17.999999966638754 meter / second\n", - "19.800000 47.48694992355816 meter -17.999999975756754 meter / second\n", - "20.100000 42.08694992964321 meter -17.999999982382704 meter / second\n", - "20.400000 36.686949934065154 meter -17.999999987197707 meter / second\n", - "20.700000 31.28694993727853 meter -17.999999990696715 meter / second\n", - "21.000000 25.886949939613654 meter -17.999999993239406 meter / second\n", - "21.300000 20.486949941310563 meter -17.99999999508715 meter / second\n", - "21.600000 15.086949942543686 meter -17.99999999642989 meter / second\n", - "21.900000 9.686949943439785 meter -17.99999999740564 meter / second\n", - "22.200000 4.286949944090969 meter -17.999999998114706 meter / second\n", - "22.438164 0.0 meter -17.99999999852377 meter / second\n", - "\n", - "[76 rows x 2 columns]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final height is close to 0, as expected.\n", - "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", - "\n", - "We can get the flight time from `results`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "22.438163885803732" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = get_last_label(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results):\n", - " plot(results.y)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Back to Chapter 1\n", - "\n", - "We have now considered three models of a falling penny:\n", - "\n", - "1. In Chapter 1, we started with the simplest model, which includes gravity and ignores drag.\n", - "\n", - "2. As an exercise in Chapter 1, we did a \"back of the envelope\" calculation assuming constant acceleration until the penny reaches terminal velocity, and then constant velocity until it reaches the sidewalk.\n", - "\n", - "3. In this chapter, we model the interaction of gravity and drag during the acceleration phase.\n", - "\n", - "We can compare the models by plotting velocity as a function of time.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "22.4" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = 9.8\n", - "v_term = 18\n", - "t_end = 22.4" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "ts = linspace(0, t_end, 201)\n", - "model1 = -g * ts;" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "model2 = TimeSeries()\n", - "for t in ts:\n", - " v = -g * t\n", - " if v < -v_term:\n", - " model2[t] = -v_term\n", - " else:\n", - " model2[t] = v" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func, max_step=0.5)\n", - "model3 = results.v;" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(ts, model1, label='model1', color='gray')\n", - "plot(model2, label='model2', color='C0')\n", - "plot(model3, label='model3', color='C1')\n", - " \n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXycZb3//9dM9n1rky4spSwfChaklK2yLyoKgiweFkGPIJsKCnh+KJ4jKBzhCIiKfgFRVOTIAQVFNkEERUFo2bQsH2iB7k3apG3SZp+Z3x/3pEzTSTJtZ0vyfj4e88jMNdd935/JY5pPr+u+llAsFkNERCTfhHMdgIiISDJKUCIikpeUoEREJC8pQYmISF4qzHUA+cTMSoD9gBVAJMfhiIiMBwXAZGCuu/ckvqEEtan9gGdyHYSIyDh0CPC3xAIlqE2tALj77ruZNGlSrmMRERnzVq5cyZlnngnxv7+JlKA2FQGYNGkS2223Xa5jEREZTza7raJBEiIikpeUoEREJC8pQYmISF5SghIRkbw0agZJmNnewK3AXsA7wOfcfW6SejsAPwUOBFqAL7n7I9mMVURGj/b2dlpaWujr68t1KGNSUVERjY2NVFdXb/GxoyJBmVkx8HvgZuBQ4GTgcTPb0d3bB1W/B3gO+DhwMPA7M/ugu7+TzZhFJP+1t7fT3NzM1KlTKSsrIxQK5TqkMSUWi9HV1cWyZcsAtjhJjZYuvsOBIne/2d373P0e4DXg3xIrmdluwGzgv9y9193/DDwInJONINe3t7PkrbeycSkRSYOWlhamTp1KeXm5klMGhEIhysvLmTp1Ki0tLVt8/GhJUHsAbwwqexOYmaTeYnffMEK9jHjx9mvpvvfrrHhvUTYuJyLbqK+vj7KyslyHMeaVlZVtVRfqaElQlUDnoLJOoHwr62VEKBahIBRj5dtvZuNyIpIGajll3tb+jkdLgtoADP5vTjmwfivrZUSkvAGAztaV2biciMiYNloS1OuADSrbPV4+uN4OZlY2Qr2MKKxpBKBvbXM2Liciss1++MMfctFFF41Yb+nSpZgZ7e3BuLS///3vnHTSScyaNYtjjjmGe+65J+2xjYpRfMBTQMjMvgLcQjCKby/ggcRK7u5m9ipwrZl9DZgDnAAclI0gSxuaYBGEN7Rm43IiIjmxYsUKvvSlL3H99ddz1FFHMX/+fM4991ymTp3KIYcckrbrjIoWlLv3AscSJKY24ErgRHdfZWZnmlliF97JwAyCOVB3AOe4+/xsxFkzaSoAJT1rsnE5ERlHli5dyuzZs7nrrrv40Ic+xP77789dd93F3XffzSGHHMIBBxzAz3/+cwCeffZZTj75ZGbNmsXxxx/PY489tsl5PvOZz7DPPvtw8skns3jx4k2uc++99/KRj3yE/fbbj3POOYclS5ZsFsuyZcs47rjjOOaYYwiHw+y1117sv//+vPTSS2n9zKOlBUU8yRycpPxu4O6E10sIklnWTdxue9YAVdF2YrGYbr6KjDJX3/EP5r2RvS762TOa+Oa5B6Zcv6Ojg/nz5/PUU0/xpz/9icsvv5wTTjiBJ598kmeeeYYvfelLzJw5k/PPP5/rr7+eD3/4w8ydO5eLLrqIiRMnsu+++3LJJZewxx578JOf/AR355xzzmH27NkAPP744/zgBz/gtttuY9ddd+XOO+/k85//PA899NCmcc+evfEYgLVr1zJv3jxOOOGE9Pxi4kZFC2q0qGmopztWRGmoj441a3MdjoiMQRdddBHFxcUcdNBBRCIRzj77bIqLizniiCOIRCL87Gc/44ADDuBjH/sYhYWFHHTQQRx//PE88MADLFmyhPnz53PppZdSXFzMzJkzN0kq9957L2effTZ77rknxcXFnHfeeaxfv57nn39+yHg6Ojq48MIL2XvvvTnqqKPS+llHTQtqNAiHw3SEqimlldVLl1BdX5frkERkC2xJayZXamtrASgoKACgqqoKCP7+AHR3dzN16tRNjtluu+14/vnnWbVqFSUlJdTV1W3y3sBKD8uXL+fHP/4xt99++8b3+/r6WL58OTvuuONmsbz77rtcdNFF7LLLLtxwww0bY0gXJag06y6pg55W1q5YCnvtletwRGSMGenWwezZs5k3b94mZUuWLGHChAk0NTXR09NDa2srDQ3BtJjm5ve7NBsbGzn77LM57bTTNpYtXLiQKVOm0Nq66eCvga7D0047jUsvvTQjtzTUxZdm0fJ6ALo0F0pEcuDggw9m3rx5PPLII0QiEZ577jn+8Ic/cPzxxzN16lT2339/rr/+erq6unjzzTe5//77Nx574okncuedd7Jw4UJisRh/+MMfOOGEEzZJYgCLFy/m/PPP5+KLL+ayyy7L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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(model2, label='model2', color='C0')\n", - "plot(results.v, label='model3', color='C1')\n", - " \n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Clearly Model 1 is very different from the other two, which are almost identical except during the transition from constant acceleration to constant velocity.\n", - "\n", - "We can also compare the predictions:\n", - "\n", - "* According to Model 1, the penny takes 8.8 seconds to reach the sidewalk, and lands at 86 meters per second.\n", - "\n", - "* According to Model 2, the penny takes 22.1 seconds and lands at terminal velocity, 18 m/s.\n", - "\n", - "* According to Model 3, the penny takes 22.4 seconds and lands at terminal velocity.\n", - "\n", - "So what can we conclude? The results from Model 1 are clearly unrealistic; it is probably not a useful model of this system. The results from Model 2 are off by about 1%, which is probably good enough for most purposes.\n", - "\n", - "In fact, our estimate of the terminal velocity could by off by 10% or more, and the figure we are using for the height of the Empire State Building is not precise either.\n", - "\n", - "So the difference between Models 2 and 3 is swamped by other uncertainties." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/queue_soln.ipynb b/soln/queue_soln.ipynb deleted file mode 100644 index 02122d5d..00000000 --- a/soln/queue_soln.ipynb +++ /dev/null @@ -1,1331 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case Study: Queueing theory\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## One queue or two?\n", - "\n", - "This notebook presents a solution to an exercise from *Modeling and Simulation in Python*. It uses features from the first four chapters to answer a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", - "\n", - "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", - "\n", - "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", - "\n", - "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question.\n", - "\n", - "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", - "\n", - "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", - "\n", - "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### One server, one queue\n", - "\n", - "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def make_system(lam, mu):\n", - " \"\"\"Make a System object.\n", - " \n", - " lam: arrival rate, per minute\n", - " mu: service completion rate, per minute\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " # duration is 10 hours, expressed in minutes\n", - " return System(lam=lam, mu=mu, duration=10*60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    lam0.125
    mu0.200
    duration600.000
    \n", - "
    " - ], - "text/plain": [ - "lam 0.125\n", - "mu 0.200\n", - "duration 600.000\n", - "dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "interarrival_time = 8\n", - "service_time = 5\n", - "\n", - "lam = 1 / interarrival_time\n", - "mu = 1 / service_time\n", - "\n", - "system = make_system(lam, mu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", - "\n", - "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n", - "\n", - "It should return the total number of customers at the end of the time step.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func1(x, t, system):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " x: number of people in the shop\n", - " t: time step\n", - " system: System object\n", - " \"\"\"\n", - " # if there's a customer in service, check if they're done\n", - " if x > 0:\n", - " if flip(system.mu):\n", - " x -= 1\n", - " \n", - " # check for an arrival\n", - " if flip(system.lam):\n", - " x += 1\n", - " \n", - " return x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "update_func1(1, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate a queueing system.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " \"\"\"\n", - " x = 0\n", - " results = TimeSeries()\n", - " results[0] = x\n", - " \n", - " for t in linrange(0, system.duration):\n", - " x = update_func(x, t, system)\n", - " results[t+1] = x\n", - "\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call `run_simulation` with your update function and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results = run_simulation(system, update_func1)\n", - "plot(results)\n", - "decorate(xlabel='Time (min)', ylabel='Customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n", - "\n", - "$L = \\lambda W$\n", - "\n", - "Where $\\lambda$ is the arrival rate. Here's a function that computes them." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_metrics(results, system):\n", - " \"\"\"Compute average number of customers and wait time.\n", - " \n", - " results: TimeSeries of queue lengths\n", - " system: System object\n", - " \n", - " returns: L, W\n", - " \"\"\"\n", - " L = results.mean()\n", - " W = L / system.lam\n", - " return L, W" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call `compute_metrics` with the results from your simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.8552412645590682, 6.841930116472546)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "compute_metrics(results, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Parameter sweep\n", - "\n", - "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n", - "\n", - "Create an array of values for `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.02 , 0.0214, 0.0228, 0.0242, 0.0256, 0.027 , 0.0284, 0.0298,\n", - " 0.0312, 0.0326, 0.034 , 0.0354, 0.0368, 0.0382, 0.0396, 0.041 ,\n", - " 0.0424, 0.0438, 0.0452, 0.0466, 0.048 , 0.0494, 0.0508, 0.0522,\n", - " 0.0536, 0.055 , 0.0564, 0.0578, 0.0592, 0.0606, 0.062 , 0.0634,\n", - " 0.0648, 0.0662, 0.0676, 0.069 , 0.0704, 0.0718, 0.0732, 0.0746,\n", - " 0.076 , 0.0774, 0.0788, 0.0802, 0.0816, 0.083 , 0.0844, 0.0858,\n", - " 0.0872, 0.0886, 0.09 , 0.0914, 0.0928, 0.0942, 0.0956, 0.097 ,\n", - " 0.0984, 0.0998, 0.1012, 0.1026, 0.104 , 0.1054, 0.1068, 0.1082,\n", - " 0.1096, 0.111 , 0.1124, 0.1138, 0.1152, 0.1166, 0.118 , 0.1194,\n", - " 0.1208, 0.1222, 0.1236, 0.125 , 0.1264, 0.1278, 0.1292, 0.1306,\n", - " 0.132 , 0.1334, 0.1348, 0.1362, 0.1376, 0.139 , 0.1404, 0.1418,\n", - " 0.1432, 0.1446, 0.146 , 0.1474, 0.1488, 0.1502, 0.1516, 0.153 ,\n", - " 0.1544, 0.1558, 0.1572, 0.1586, 0.16 ])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "num_vals = 101\n", - "lam_array = linspace(0.1*mu, 0.8*mu, num_vals)\n", - "lam_array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n", - "\n", - "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n", - "\n", - "It should return the `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def sweep_lam(lam_array, mu, update_func):\n", - " \"\"\"Run simulations with a range of values for `lam`\n", - " \n", - " lam_array: array of values for `lam`\n", - " mu: probability of finishing a checkout\n", - " update_func: passed along to run_simulation\n", - " \n", - " returns: SweepSeries of average wait time vs lam\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for lam in lam_array:\n", - " system = make_system(lam, mu)\n", - " results = run_simulation(system, update_func)\n", - " L, W = compute_metrics(results, system)\n", - " sweep[lam] = W\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call your function to generate a `SweepSeries`, and plot it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0.02004.658902
    0.02145.209386
    0.02283.065067
    0.02425.706742
    0.02568.059484
    0.02709.613607
    0.02843.280917
    0.02984.075981
    0.03126.932890
    0.03265.563325
    0.03406.704512
    0.035410.340581
    0.03687.279534
    0.03824.225070
    0.03964.453856
    0.04103.449535
    0.04245.376260
    0.04387.483722
    0.04524.491040
    0.04666.641292
    0.04803.986412
    0.04945.119672
    0.05086.386993
    0.05228.861349
    0.05366.394815
    0.05506.534564
    0.056410.060065
    0.05784.001405
    0.05927.110896
    0.06063.459581
    ......
    0.119414.687971
    0.12086.942072
    0.122212.472393
    0.12369.827203
    0.125027.873544
    0.126410.978538
    0.12787.121673
    0.129212.543593
    0.130617.976675
    0.13208.042152
    0.133413.545640
    0.134814.701018
    0.136236.649637
    0.137628.150756
    0.139013.957553
    0.14045.119672
    0.141817.166969
    0.14329.527882
    0.144613.750711
    0.14607.783831
    0.147410.249765
    0.14886.988800
    0.150210.058690
    0.151613.071881
    0.153012.800017
    0.154410.776512
    0.155823.281694
    0.157210.351704
    0.15869.242687
    0.160023.356905
    \n", - "

    101 rows × 1 columns

    \n", - "
    " - ], - "text/plain": [ - "0.0200 4.658902\n", - "0.0214 5.209386\n", - "0.0228 3.065067\n", - "0.0242 5.706742\n", - "0.0256 8.059484\n", - "0.0270 9.613607\n", - "0.0284 3.280917\n", - "0.0298 4.075981\n", - "0.0312 6.932890\n", - "0.0326 5.563325\n", - "0.0340 6.704512\n", - "0.0354 10.340581\n", - "0.0368 7.279534\n", - "0.0382 4.225070\n", - "0.0396 4.453856\n", - "0.0410 3.449535\n", - "0.0424 5.376260\n", - "0.0438 7.483722\n", - "0.0452 4.491040\n", - "0.0466 6.641292\n", - "0.0480 3.986412\n", - "0.0494 5.119672\n", - "0.0508 6.386993\n", - "0.0522 8.861349\n", - "0.0536 6.394815\n", - "0.0550 6.534564\n", - "0.0564 10.060065\n", - "0.0578 4.001405\n", - "0.0592 7.110896\n", - "0.0606 3.459581\n", - " ... \n", - "0.1194 14.687971\n", - "0.1208 6.942072\n", - "0.1222 12.472393\n", - "0.1236 9.827203\n", - "0.1250 27.873544\n", - "0.1264 10.978538\n", - "0.1278 7.121673\n", - "0.1292 12.543593\n", - "0.1306 17.976675\n", - "0.1320 8.042152\n", - "0.1334 13.545640\n", - "0.1348 14.701018\n", - "0.1362 36.649637\n", - "0.1376 28.150756\n", - "0.1390 13.957553\n", - "0.1404 5.119672\n", - "0.1418 17.166969\n", - "0.1432 9.527882\n", - "0.1446 13.750711\n", - "0.1460 7.783831\n", - "0.1474 10.249765\n", - "0.1488 6.988800\n", - "0.1502 10.058690\n", - "0.1516 13.071881\n", - "0.1530 12.800017\n", - "0.1544 10.776512\n", - "0.1558 23.281694\n", - "0.1572 10.351704\n", - "0.1586 9.242687\n", - "0.1600 23.356905\n", - "Length: 101, dtype: float64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "sweep = sweep_lam(lam_array, mu, update_func1)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(sweep, 'bo')\n", - "\n", - "decorate(xlabel='Arrival late, lambda (per min)',\n", - " ylabel='Average time in system',\n", - " title='Single server, single queue')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# W_avg = sweep.mean()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis\n", - "\n", - "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n", - "\n", - "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n", - "\n", - "$W = 1 / (\\mu - \\lambda)$\n", - "\n", - "The following function plots the theoretical value of $W$ as a function of $\\lambda$." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_W(lam_array, mu):\n", - " \"\"\"Plot the theoretical mean wait time.\n", - " \n", - " lam_array: array of values for `lam`\n", - " mu: probability of finishing a checkout\n", - " \"\"\"\n", - " W = 1 / (mu - lam_array)\n", - " plot(lam_array, W, 'g-')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_W(lam_array, mu)\n", - "plot(sweep, 'bo')\n", - "\n", - "decorate(xlabel='Arrival late, lambda (per min)',\n", - " ylabel='Average time in system',\n", - " title='Single server, single queue')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple servers\n", - "\n", - "Now let's try the other two queueing strategies:\n", - "\n", - "1. One queue with two checkout counters.\n", - "2. Two queues, one for each counter.\n", - "\n", - "The following figure shows the three scenarios:\n", - "\n", - "![](diagrams/queue.png)\n", - "\n", - "Write an update function for one queue with two servers." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func2(x, t, system):\n", - " \"\"\"Simulate a single queue with two servers.\n", - " \n", - " system: System object\n", - " \"\"\"\n", - " # if both servers are busy, check whether the\n", - " # second is complete\n", - " if x > 1 and flip(system.mu):\n", - " x -= 1\n", - " \n", - " # check whether the first is complete\n", - " if x > 0 and flip(system.mu):\n", - " x -= 1\n", - " \n", - " # check for an arrival\n", - " if flip(system.lam):\n", - " x += 1\n", - " \n", - " return x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use this update function to simulate the system, plot the results, and print the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.8552412645590682, 6.841930116472546)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(lam, mu)\n", - "run_simulation(system, update_func2)\n", - "plot(results)\n", - "decorate(xlabel='Time (min)', ylabel='Customers')\n", - "compute_metrics(results, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n", - "\n", - "Create a new array of values for `lam` from 10% to 160% of `mu`." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0.02 , 0.023, 0.026, 0.029, 0.032, 0.035, 0.038, 0.041, 0.044,\n", - " 0.047, 0.05 , 0.053, 0.056, 0.059, 0.062, 0.065, 0.068, 0.071,\n", - " 0.074, 0.077, 0.08 , 0.083, 0.086, 0.089, 0.092, 0.095, 0.098,\n", - " 0.101, 0.104, 0.107, 0.11 , 0.113, 0.116, 0.119, 0.122, 0.125,\n", - " 0.128, 0.131, 0.134, 0.137, 0.14 , 0.143, 0.146, 0.149, 0.152,\n", - " 0.155, 0.158, 0.161, 0.164, 0.167, 0.17 , 0.173, 0.176, 0.179,\n", - " 0.182, 0.185, 0.188, 0.191, 0.194, 0.197, 0.2 , 0.203, 0.206,\n", - " 0.209, 0.212, 0.215, 0.218, 0.221, 0.224, 0.227, 0.23 , 0.233,\n", - " 0.236, 0.239, 0.242, 0.245, 0.248, 0.251, 0.254, 0.257, 0.26 ,\n", - " 0.263, 0.266, 0.269, 0.272, 0.275, 0.278, 0.281, 0.284, 0.287,\n", - " 0.29 , 0.293, 0.296, 0.299, 0.302, 0.305, 0.308, 0.311, 0.314,\n", - " 0.317, 0.32 ])" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "lam_array = linspace(0.1*mu, 1.6*mu, num_vals)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n", - "\n", - "Plot the results and print the average value of `W` across all values of `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of averages = 6.34676127667513 minutes\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "sweep = sweep_lam(lam_array, mu, update_func2)\n", - "W_avg = sweep.mean()\n", - "print('Average of averages = ', W_avg, 'minutes')" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(sweep, 'bo')\n", - "decorate(xlabel='Arrival late, lambda (per min)',\n", - " ylabel='Average time in system',\n", - " title='Multiple server, single queue')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multiple queues\n", - "\n", - "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n", - "\n", - "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n", - "\n", - "When a customer arrives, which queue do they join?" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func3(x1, x2, t, system):\n", - " \"\"\"Simulate two queues with one server each.\n", - " \n", - " x1: number of customers in queue 1\n", - " x2: number of customers in queue 2\n", - " t: time step\n", - " system: System object\n", - " \"\"\"\n", - " # if the first servers is busy, check it it's done\n", - " if x1 > 0 and flip(system.mu):\n", - " x1 -= 1\n", - " \n", - " # if the second queue is busy, check if it's done\n", - " if x2 > 0 and flip(system.mu):\n", - " x2 -= 1\n", - " \n", - " # check for an arrival\n", - " if flip(system.lam):\n", - " # join whichever queue is shorter\n", - " if x1 < x2:\n", - " x1 += 1\n", - " else:\n", - " x2 += 1\n", - " \n", - " return x1, x2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write a version of `run_simulation` that works with this update function." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate a queueing system.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " \"\"\"\n", - " x1, x2 = 0, 0\n", - " results = TimeSeries()\n", - " results[0] = x1 + x2\n", - " \n", - " for t in linrange(0, system.duration):\n", - " x1, x2 = update_func(x1, x2, t, system)\n", - " results[t+1] = x1 + x2\n", - "\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your functions by running a simulation with a single value of `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.8552412645590682, 6.841930116472546)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = make_system(lam, mu)\n", - "run_simulation(system, update_func3)\n", - "plot(results)\n", - "decorate(xlabel='Time (min)', ylabel='Customers')\n", - "compute_metrics(results, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n", - "\n", - "How do the results compare to the scenario with two servers and one queue." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Average of averages = 6.753981831564981 minutes\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "sweep = sweep_lam(lam_array, mu, update_func3)\n", - "W_avg = sweep.mean()\n", - "print('Average of averages = ', W_avg, 'minutes')" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot(sweep, 'bo')\n", - "decorate(xlabel='Arrival late, lambda (per min)',\n", - " ylabel='Average time in system',\n", - " title='Multiple server, multiple queue')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "\"\"\"\n", - "With two queues, the average of averages is slightly higher, most of the time. But the difference is small.\n", - "\n", - "The two configurations are equally good as long as both servers are busy; the only time two lines is worse is if one queue is empty and the other contains more than one customer. In real life, if we allow customers to change lanes, that disadvantage can be eliminated.\n", - "\n", - "From a theoretical point of view, one line is better. From a practical point of view, the difference is small and can be mitigated. So the best choice depends on practical considerations.\n", - "\n", - "On the other hand, you can do substantially better with an express line for customers with short service times. But that's a topic for another notebook.\n", - "\"\"\";" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/rabbits2soln.ipynb b/soln/rabbits2soln.ipynb deleted file mode 100644 index e4457bd2..00000000 --- a/soln/rabbits2soln.ipynb +++ /dev/null @@ -1,528 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Rabbit example\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Rabbit Redux\n", - "\n", - "This notebook starts with a version of the rabbit population growth model and walks through some steps for extending it.\n", - "\n", - "In the original model, we treat all rabbits as adults; that is, we assume that a rabbit is able to breed in the season after it is born. In this notebook, we extend the model to include both juvenile and adult rabbits.\n", - "\n", - "As an example, let's assume that rabbits take 3 seasons to mature. We could model that process explicitly by counting the number of rabbits that are 1, 2, or 3 seasons old. As an alternative, we can model just two stages, juvenile and adult. In the simpler model, the maturation rate is 1/3 of the juveniles per season.\n", - "\n", - "To implement this model, make these changes in the System object:\n", - "\n", - "1. Replace `p0` with two initial populations: `juvenile_pop0` and `adult_pop0`, with values `0` and `10`.\n", - "\n", - "2. Add an additional variable, `mature_rate`, with the value `0.33`." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    t00.00
    t_end30.00
    juvenile_pop00.00
    adult_pop010.00
    birth_rate0.90
    mature_rate0.33
    death_rate0.50
    \n", - "
    " - ], - "text/plain": [ - "t0 0.00\n", - "t_end 30.00\n", - "juvenile_pop0 0.00\n", - "adult_pop0 10.00\n", - "birth_rate 0.90\n", - "mature_rate 0.33\n", - "death_rate 0.50\n", - "dtype: float64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(t0 = 0, \n", - " t_end = 30,\n", - " juvenile_pop0 = 0,\n", - " adult_pop0 = 10,\n", - " birth_rate = 0.9,\n", - " mature_rate = 0.33,\n", - " death_rate = 0.5)\n", - "\n", - "system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now update `run_simulation` with the following changes:\n", - "\n", - "1. Add a second TimeSeries, named `juveniles`, to keep track of the juvenile population, and initialize it with `juvenile_pop0`.\n", - "\n", - "2. Inside the for loop, compute the number of juveniles that mature during each time step.\n", - "\n", - "3. Also inside the for loop, add a line that stores the number of juveniles in the new `TimeSeries`. For simplicity, let's assume that only adult rabbits die.\n", - "\n", - "4. During each time step, subtract the number of maturations from the juvenile population and add it to the adult population.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def run_simulation(system):\n", - " \"\"\"Runs a proportional growth model.\n", - " \n", - " Adds TimeSeries to `system` as `results`.\n", - " \n", - " system: System object with t0, t_end, p0,\n", - " birth_rate and death_rate\n", - " \"\"\"\n", - " juveniles = TimeSeries()\n", - " juveniles[system.t0] = system.juvenile_pop0\n", - " \n", - " adults = TimeSeries()\n", - " adults[system.t0] = system.adult_pop0\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " maturations = system.mature_rate * juveniles[t]\n", - " births = system.birth_rate * adults[t]\n", - " deaths = system.death_rate * adults[t]\n", - " \n", - " if adults[t] > 30:\n", - " market = adults[t] - 30\n", - " else:\n", - " market = 0\n", - " \n", - " juveniles[t+1] = juveniles[t] + births - maturations\n", - " adults[t+1] = adults[t] + maturations - deaths - market\n", - " \n", - " system.adults = adults\n", - " system.juveniles = juveniles" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your changes in `run_simulation`:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    010.000000
    15.000000
    25.470000
    36.209900
    47.057723
    58.021560
    69.117031
    710.362107
    811.777219
    913.385586
    1015.213601
    1117.291261
    1219.652658
    1322.336542
    1425.386953
    1528.853947
    1632.794414
    1734.478600
    1836.487431
    1937.893339
    2039.401924
    2140.546917
    2241.694992
    2342.613800
    2443.495581
    2544.226171
    2644.907656
    2745.485241
    2846.014130
    2946.469075
    3046.880673
    3147.238170
    \n", - "
    " - ], - "text/plain": [ - "0 10.000000\n", - "1 5.000000\n", - "2 5.470000\n", - "3 6.209900\n", - "4 7.057723\n", - "5 8.021560\n", - "6 9.117031\n", - "7 10.362107\n", - "8 11.777219\n", - "9 13.385586\n", - "10 15.213601\n", - "11 17.291261\n", - "12 19.652658\n", - "13 22.336542\n", - "14 25.386953\n", - "15 28.853947\n", - "16 32.794414\n", - "17 34.478600\n", - "18 36.487431\n", - "19 37.893339\n", - "20 39.401924\n", - "21 40.546917\n", - "22 41.694992\n", - "23 42.613800\n", - "24 43.495581\n", - "25 44.226171\n", - "26 44.907656\n", - "27 45.485241\n", - "28 46.014130\n", - "29 46.469075\n", - "30 46.880673\n", - "31 47.238170\n", - "dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_simulation(system)\n", - "system.adults" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, update `plot_results` to plot both the adult and juvenile `TimeSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def plot_results(system, title=None):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " system: System object with `results`\n", - " \"\"\"\n", - " newfig()\n", - " plot(system.adults, 'bo-', label='adults')\n", - " plot(system.juveniles, 'gs-', label='juveniles')\n", - " decorate(xlabel='Season', \n", - " ylabel='Rabbit population',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And test your updated version of `plot_results`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\nmTPp27evvYtmV4cPH2b+/PmkpKRQVlZG165dmTVrFr169bJ30ZrFbbfdxqlTp9A0jcrKSlxdXdHp\ndNxxxx28+OKLbN68mTfffJPMzEwMBgNjx45lypQpbfaPFzT+njzzzDO8/fbbrF+/nrNnz2I0Ghk/\nfjwTJkzA2dnZ3kW/anbt2sV9991nfS9qc9R75WLviaPeKxkZGbz22mskJyfj5OREdHQ0jzzyCEOG\nDAFo9vvE4cNfCCGEcDQO3ewvhBBCOCIJfyGEEMLBSPgLIYQQDkbCXwghhHAwEv5CCCGEg5HwF0II\nIRyMi70LIISwn5SUFN5//31SU1M5d+6cdTvRcePGMWLECHsXTwhxlUjNXwgHtWPHDsaNG4ezszP/\n+7//y9atW1m5ciWdO3dm+vTprF692t5FFEJcJVLzF8JBffTRR4SEhLBgwQLrKmKhoaF0796dsrIy\nfvnlFzuXUAhxtUj4C+GgysvLqa6uprKyEjc3N5tz8+fPt36vaRrvv/8+a9eu5fjx43h7e/O73/2O\nJ5980manthUrVvDJJ5+QlZWFl5cXCQkJzJgxgy5dulhfZ+nSpaxdu5bTp0+j1+vp168fs2bNIiIi\nAgCTycTf//53Nm7cyPnz5wkICGDIkCFMnz4dHx8fAO6//34CAgJITExk0aJFnDhxgoiICKZPn87g\nwYOv9tsmRJsgzf5COKhBgwZx5swZxo8fz+bNmykuLq73uiVLlvD6668zcuRIvvrqK55//nm++eYb\nZs6cab1m7dq1vPrqq0yYMIHNmzezcuVKnJycePjhhykvLwfgs88+Y+nSpcyYMYNNmzaxbNkyCgsL\nmTJlivV15s6dy2effcaTTz7Jhg0bePbZZ9m6dSt/+ctfbMp08OBB1qxZw/z58/nss8/w9fVlxowZ\nlJSUXIV3Sog2SBNCOCSz2awtWrRI69GjhxYbG6vFx8dro0aN0hYuXKhlZmZqmqZpFRUVWp8+fbRZ\ns2bZPPeLL77QYmNjtYyMDE3TNK2goEBLT0+3ueb777/XYmNjtdTUVE3TNO3ZZ5/VEhMTba7JycnR\n9u7dq1VXV2vZ2dlaXFyctnz5cptrPvroIy02NlY7evSopmmaNn78eC0hIUHLycmxXvP1119rsbGx\n2p49e377GyOEA5CavxAOSqfTMW3aNLZv384bb7zB3XffTXFxMe+88w6JiYl8+umnHD58mOLiYq67\n7jqb5w4cOBCAffv2AeDp6cn333/PXXfdxbXXXkvv3r2ZNm0aoLZwBRg8eDCZmZlMnDjR2vQfGBhI\nQkICTk5O/PLLL2iaRp8+fWx+V8+ePQHYv3+/9ViHDh0IDAy0/mz53vK7hBCNkz5/IRycj48Pt99+\nO7fffjsAe/fuZcaMGbzwwgu89957ADz99NM8++yzdZ577tw5AF577TVWrVrFtGnTGDx4MN7e3qSm\npjJjxgzrtTfddBMffPABH3zwAS+99BJFRUX07NmTWbNm0bdvX2u3g7e3t83v8PLyArBp0q891gCw\nDljUZJNSIS6JhL8QDspkMgHg7u5uc7x79+488cQTPP7445jNZgBmzJjBoEGD6ryGn58fAOvWrWP4\n8OHW2j6oDxEX6tevH/369aOqqork5GTeeustJk+ezL///W/rgL6ioiKb51h+9vX1vdJ/qhDiAtLs\nL4QDOnv2LP369WPJkiX1nj9x4gQAkZGR+Pr6curUKTp06GB9hIWFYTab8ff3B6CiooKAgACb11i7\ndi1QUxvftm0bGRkZALi4uDBgwADmzJlDSUkJR48epVu3bjg5OZGcnGzzOrt370an05GQkNB0b4AQ\nDk5q/kI4oODgYO677z6WLl2KyWTitttuw2g0UlRUxA8//MBbb73FPffcQ2hoKA899BCLFy8mIiKC\n66+/nuLiYpYtW8aOHTvYtGkT/v7+9O7dm82bNzNixAi8vLz4xz/+Qfv27QFITU2ld+/efP755+zf\nv5+//vWvREdHU1xczIoVKzAYDMTExODt7c3IkSNZunQp7dq1o3v37uzdu5dFixYxfPhwwsPD7fyu\nCdF2SPgL4aBmz55Nt27d+Oyzz1i3bh15eXl4enrSuXNnnn76ae6++24ApkyZgqenJx988AEvv/wy\n7u7uXHvttaxatcpa83/22Wd5+umnmTBhAn5+ftx7771MmTKFvLw8li1bhouLCy+88AILFizgqaee\nIicnB19fX3r27Ml7771n7ed/4YUXCAwM5NVXXyUnJweDwcCoUaPqTPUTQvw2Ok1GyAghhBAORfr8\nhRBCCAcj4S+EEEI4GAl/IYQQwsFI+AshhBAORsJfCCGEcDAS/kIIIYSDkfAXQgghHIyEvxBCCOFg\nJPyFEEIIB/P/I/Jd/ZYeqlQAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(system, title='Proportional growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook demonstrates the steps we recommend for starting your project:\n", - "\n", - "1. Start with one of the examples from the book, either by copying a notebook or pasting code into a new notebook. Get the code working before you make any changes.\n", - "\n", - "2. Make one small change, and run the code again.\n", - "\n", - "3. Repeat step 2 until you have a basic implementation of your model.\n", - "\n", - "If you start with working code that you understand and make small changes, you can avoid spending a lot of time debugging.\n", - "\n", - "One you have a basic model working, you can think about what metrics to measure, what parameters to sweep, and how to use the model to predict, explain, or design." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bonus question\n", - "\n", - "Suppose you only have room for 30 adult rabbits. Whenever the adult population exceeds 30, you take any excess rabbits to market (as pets for kind children, of course). Modify `run_simulation` to model this strategy. What effect does it have on the behavior of the system?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What happens if rabbits only take one season to mature? Change `mature_rate` to 1.0 and run the simulation again." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/soln/rabbits3soln.ipynb b/soln/rabbits3soln.ipynb deleted file mode 100644 index 431fd14f..00000000 --- a/soln/rabbits3soln.ipynb +++ /dev/null @@ -1,863 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Rabbit example\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Rabbit is Rich\n", - "\n", - "This notebook starts with a version of the rabbit population growth model. You will modify it using some of the tools in Chapter 5. Before you attempt this diagnostic, you should have a good understanding of State objects, as presented in Section 5.4. And you should understand the version of `run_simulation` in Section 5.7.\n", - "\n", - "### Separating the `State` from the `System`\n", - "\n", - "Here's the `System` object from the previous diagnostic. Notice that it includes system parameters, which don't change while the simulation is running, and population variables, which do. We're going to improve that by pulling the population variables into a `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    t00.00
    t_end20.00
    juvenile_pop00.00
    adult_pop010.00
    birth_rate0.90
    mature_rate0.33
    death_rate0.50
    \n", - "
    " - ], - "text/plain": [ - "t0 0.00\n", - "t_end 20.00\n", - "juvenile_pop0 0.00\n", - "adult_pop0 10.00\n", - "birth_rate 0.90\n", - "mature_rate 0.33\n", - "death_rate 0.50\n", - "dtype: float64" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(t0 = 0, \n", - " t_end = 20,\n", - " juvenile_pop0 = 0,\n", - " adult_pop0 = 10,\n", - " birth_rate = 0.9,\n", - " mature_rate = 0.33,\n", - " death_rate = 0.5)\n", - "\n", - "system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following cells, define a `State` object named `init` that contains two state variables, `juveniles` and `adults`, with initial values `0` and `10`. Make a version of the `System` object that does NOT contain `juvenile_pop0` and `adult_pop0`, but DOES contain `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    juveniles0
    adults10
    \n", - "
    " - ], - "text/plain": [ - "juveniles 0\n", - "adults 10\n", - "dtype: int64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "init = State(juveniles=0, adults=10)\n", - "init" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    t00
    t_end20
    initjuveniles 0\n", - "adults 10\n", - "dtype: int64
    birth_rate0.9
    mature_rate0.33
    death_rate0.5
    \n", - "
    " - ], - "text/plain": [ - "t0 0\n", - "t_end 20\n", - "init juveniles 0\n", - "adults 10\n", - "dtype: int64\n", - "birth_rate 0.9\n", - "mature_rate 0.33\n", - "death_rate 0.5\n", - "dtype: object" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "system = System(t0 = 0, \n", - " t_end = 20,\n", - " init = init,\n", - " birth_rate = 0.9,\n", - " mature_rate = 0.33,\n", - " death_rate = 0.5)\n", - "\n", - "system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Updating `run_simulation`\n", - "\n", - "Here's the version of `run_simulation` from last time:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def run_simulation(system):\n", - " \"\"\"Runs a proportional growth model.\n", - " \n", - " Adds TimeSeries to `system` as `results`.\n", - " \n", - " system: System object\n", - " \"\"\"\n", - " juveniles = TimeSeries()\n", - " juveniles[system.t0] = system.juvenile_pop0\n", - " \n", - " adults = TimeSeries()\n", - " adults[system.t0] = system.adult_pop0\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " maturations = system.mature_rate * juveniles[t]\n", - " births = system.birth_rate * adults[t]\n", - " deaths = system.death_rate * adults[t]\n", - " \n", - " if adults[t] > 30:\n", - " market = adults[t] - 30\n", - " else:\n", - " market = 0\n", - " \n", - " juveniles[t+1] = juveniles[t] + births - maturations\n", - " adults[t+1] = adults[t] + maturations - deaths - market\n", - " \n", - " system.adults = adults\n", - " system.juveniles = juveniles" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the cell below, write a version of `run_simulation` that works with the new `System` object (the one that contains a `State` object named `init`).\n", - "\n", - "Hint: you only have to change two lines." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_simulation(system):\n", - " \"\"\"Runs a proportional growth model.\n", - " \n", - " Adds TimeSeries to `system` as `results`.\n", - " \n", - " system: System object \n", - " \"\"\"\n", - " juveniles = TimeSeries()\n", - " juveniles[system.t0] = system.init.juveniles\n", - " \n", - " adults = TimeSeries()\n", - " adults[system.t0] = system.init.adults\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " maturations = system.mature_rate * juveniles[t]\n", - " births = system.birth_rate * adults[t]\n", - " deaths = system.death_rate * adults[t]\n", - " \n", - " if adults[t] > 30:\n", - " market = adults[t] - 30\n", - " else:\n", - " market = 0\n", - " \n", - " juveniles[t+1] = juveniles[t] + births - maturations\n", - " adults[t+1] = adults[t] + maturations - deaths - market\n", - " \n", - " system.adults = adults\n", - " system.juveniles = juveniles" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your changes in `run_simulation`:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    value
    010.000000
    15.000000
    25.470000
    36.209900
    47.057723
    58.021560
    69.117031
    710.362107
    811.777219
    913.385586
    1015.213601
    1117.291261
    1219.652658
    1322.336542
    1425.386953
    1528.853947
    1632.794414
    1734.478600
    1836.487431
    1937.893339
    2039.401924
    2140.546917
    \n", - "
    " - ], - "text/plain": [ - "0 10.000000\n", - "1 5.000000\n", - "2 5.470000\n", - "3 6.209900\n", - "4 7.057723\n", - "5 8.021560\n", - "6 9.117031\n", - "7 10.362107\n", - "8 11.777219\n", - "9 13.385586\n", - "10 15.213601\n", - "11 17.291261\n", - "12 19.652658\n", - "13 22.336542\n", - "14 25.386953\n", - "15 28.853947\n", - "16 32.794414\n", - "17 34.478600\n", - "18 36.487431\n", - "19 37.893339\n", - "20 39.401924\n", - "21 40.546917\n", - "dtype: float64" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_simulation(system)\n", - "system.adults" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting the results\n", - "\n", - "Here's a version of `plot_results` that plots both the adult and juvenile `TimeSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def plot_results(system, title=None):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " system: System object with `results`\n", - " \"\"\"\n", - " newfig()\n", - " plot(system.adults, 'bo-', label='adults')\n", - " plot(system.juveniles, 'gs-', label='juveniles')\n", - " decorate(xlabel='Season', \n", - " ylabel='Rabbit population',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If your changes in the previous section were successful, you should be able to run this new version of `plot_results`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "image/png": "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\n/vWvxMbG4u3tzZgxY4iPj+ejjz6yKf/xxx8TFxfHPffcg6+vLx06dODhhx/miy++qNlT3llKSkqI\nj49n9uzZ6PV6vL29mTRpEuXl5ezZs8epdWtqzfm62DNnzhxSUlLo37+/s6vSqMLCQlauXMmoUaNs\njn3wwQcMHjyYlJQUvLy86Nq1KxMmTOD999/HbDbblD98+DDbtm1jxowZREVF4e/vz5QpU9DpdHzx\nxReOOJ1Gz6eqqorp06fTv39/3N3d6du3LwMGDODnn392SN3OV2Pncr6cfW3O51w2bdpEamoqs2bN\navJ6na9zfQa3lPeMSwT3ffv2YTQa6dmzp9XjvXr1Ii0tzab87t276dWrl01Zk8nEvn37mrSu5xIY\nGMi8efOIj4+veSwzMxOAqKgou88pKyvjkUceYeDAgQwaNIjZs2fbbJvrTBs2bODPf/4zffv25dZb\nb2XTpk12yzXn61Lff//7X3755RemTZvWYJnmcl1Gjx5tdwgEGv6dFxYWkpGRYVM+LS0NT09PLrvs\nsprHPDw86N69u933WlNo7Hz+8pe/cOedd9b8rGka2dnZtG3bttHXfP/997nuuutITk7mrrvuYseO\nHZe0zg1p7FxA5Q+/9957ueKKKxg6dCgvvfQSBoPBbllnX5tznYuFwWDgueee44knniAoKKjRss64\nLuf6DG4p7xmXCO6WVl1ISIjV46GhoeTl5dktHxwcbFMWsFvemUpLS5k1axbXXnutzZcXUPWOj49n\n3LhxbNmyhSVLlrBr1y6mT5/uhNraSkhIIC4ujg8++IAffviB6667jilTpths6wst57qYzWYWLlzI\nAw88QEBAgN0yzf26WDT2O7fXW2IpX38cNCQkpFldI4vXX3+dkydP2p0vYdG9e3e6d+/O2rVr+eab\nb+jatSv33XcfWVlZDqyprTZt2tCxY0cef/xxtm7dyksvvcS6dets5ndYtJRrs2LFCkJCQrjxxhsb\nLddcrkv9z+CW8p5xieDemPq/0EtdvillZ2dz1113ER4ezoIFC+yWGTJkCB9++CEDBw7Ew8ODxMRE\npk2bxubNm8nJyXFwjW299dZbzJo1i7CwMAICAnjooYdITEzkk08+Oa/XaU7XZePGjZw+fbrRzYqa\n+3VpCs3pGlVXVzN37lzef/99lixZYjXhrr41a9bw0EMPERAQQGhoKE899RT+/v58/vnnDqyxrTvv\nvJOlS5fSs2dPPD096devHw888ABr1qzBZDKd12s1l2tTVVXF0qVLmTx58jnr1Byuyx/5DL4YTXld\nXCK4h4eHA9h0eRYUFBAREWFTPiIiwm5ZAL1e30S1PD979uxh9OjR9O3blyVLluDn5/eHnxsTEwPA\n6dOnm6p6F6Vjx45269YSrguomf5Dhw7F29v7vJ7XHK/L+f7Ow8PDKSoqQqu3JUVhYaHd95ozGAwG\nHnroIX788Uc+/vhjkpKSzuv5Hh4etGvXrlldJ4uYmBiqqqpqrlFdLeHabN68GYPBwJAhQ877uY6+\nLg19BreU94xLBPcePXrg5eVl09X7yy+/2N0KLykpyWasw7K8wl7Xt6MdPnyYSZMm8cADD/DMM8/Y\nLIWpa9WqVXz22WdWjx07dgxQQdSZMjMzefbZZykuLrZ6/Pjx4zWBrq7mfl1AddFt3ryZYcOGNVqu\nOV+Xuhr6nev1erv1TEpKwmg0Ws2BqKqqYu/evXbfa45WXV3NlClTqKio4OOPP6ZTp06Nlt+3bx8v\nvPCC1USoqqoqMjMz7f6NOtKbb77J999/b/XYsWPH8PPzsxsUmvu1ATX/5sorrzxnY8XZ16Wxz+CW\n8p5xieAeGBjIbbfdxqJFi0hPT6eiooKlS5eSnZ3NmDFj2LNnDzfccEPNOssxY8aQmZnJ8uXLMRgM\nHD9+nEWLFjF69GgCAwOdei7V1dXMnDmT0aNHM2HCBJvj9c/FaDTy3HPP8dNPP2EymTh48CALFy7k\n5ptvJiwszMG1txYREcG3337Ls88+S0FBAeXl5bz22mukp6czbty4FnVdLA4cOIDRaCQxMdHq8ZZ0\nXeoaP348W7duZf369TUfOMuWLePee++t6TIcP3487733HgDx8fEMHjyYl156idOnT1NaWsqCBQvw\n9vZmxIgRzjwVQE3AOnHiBG+99VaDfzN1zyc8PJw1a9Ywf/58SktLKSoq4oUXXgDglltucVi97Sks\nLOTpp59m7969mEwmUlNTeeedd1rstQE1gbNbt252jzWX63Kuz+CW8p5xmSQ2s2fPZv78+YwdO5ay\nsjISExN55513iI6OJisri/T0dIxGIwDt27fn7bffZv78+bzyyisEBQUxYsQI/vd//9fJZwG7du1i\n3759HD58uOaPw2LUqFGMHDnS6lz+8pe/YDKZePbZZ8nJySEoKIhbbrmFRx55xBnVt+Lr68uyZct4\n+eWXSUlJoaKigm7duvHBBx8QFxfHtm3bWsx1sThz5gxQOxRkUVFR0WyviyWBiKVb8IYbbkCn0zFq\n1CheeOEFFi5cyKuvvsqMGTOIiIjgnnvusZqAlpmZaTVR6JVXXuGFF15gxIgRGI1GkpKSWLZsWYOT\nCx15Ptu2bSM7O5sBAwbYPG/v3r025xMVFcW7777LwoULGTp0KEajkb59+/Lhhx865EtYY+fy9NNP\n4+Pjw2OPPcaZM2fQ6/Xcf//9jB8/vub5zenanOvvDNT7p6Hfa3O5Luf6DG4p7xnZz10IIYRwMS7R\nLS+EEEKIWhLchRBCCBcjwV0IIYRwMRLchRBCCBcjwV0IIYRwMRLchRBCCBfjMuvchRC2du/ezfLl\ny0lLSyM3N7dmi8qxY8cycuRIZ1dPCNFEpOUuhIvatm0bY8eOxd3dnX/9619s2rSJ9957jy5dujBt\n2jRWrlzp7CoKIZqItNyFcFGrVq0iMjKSBQsW1KTFjIqKomfPnlRUVPDrr786uYZCiKYiwV0IF2Uw\nGKiursZoNOLl5WV17OWXX675t6ZpLF++nLVr1/Lbb78REBDADTfcwOOPP261wceyZcv45JNPyMzM\nxN/fnx49ejB9+nQuu+yymtdZvHgxa9euJScnBz8/P5KTk3niiSfo0KEDAJWVlfzzn/9kw4YNnD17\nltDQUIYOHcq0adNqcsHfc889hIaGkpKSwqJFi8jKyqJDhw5MmzbtgnYTE6I1km55IVzU4MGDOX36\nNOPGjWPjxo2UlpbaLffmm28yf/58brrpJr744guee+45/vOf/zBjxoyaMmvXruXFF19k/PjxbNy4\nkffeew83NzceeOABDAYDAKtXr2bx4sVMnz6dr7/+miVLllBcXMzkyZNrXmf27NmsXr2axx9/nPXr\n1zNnzhw2bdrEY489ZlWngwcP8umnn/Lyyy+zevVqgoKCmD59OmVlZU3wmxLCBWlCCJdkNpu1RYsW\nab169dISEhK0xMRE7bbbbtMWLlyoZWRkaJqmaVVVVVqfPn20J554wuq5n332mZaQkKAdOXJE0zRN\nKyoq0g4fPmxV5ocfftASEhK0tLQ0TdM0bc6cOVpKSopVmby8PG3v3r1adXW1durUKa1r167a0qVL\nrcqsWrVKS0hI0NLT0zVN07Rx48ZpPXr00PLy8mrKfPXVV1pCQoK2Z8+ei//FCNEKSMtdCBel0+mY\nMmUKW7du5ZVXXuH222+ntLSUt956i5SUFP79739z7NgxSktLufLKK62eO3DgQICaPah9fX354Ycf\nuPXWWxkwYABJSUlMmTIFUFuTAgwZMoSMjAwmTJhQ0zUfFhZGjx49cHNz49dff0XTNPr06WP1f/Xu\n3RuA/fv31zwWExNjtfuX5d+W/0sI0TgZcxfCxQUGBjJixIiavaP37t3L9OnTef7553n33XcBeOqp\np5gzZ47Nc3NzcwF46aWX+OCDD5gyZQpDhgwhICCAtLQ0pk+fXlP26quvZsWKFaxYsYK5c+dSUlJC\n7969eeKJJ+jbt2/NsED9bS79/f0BrLrc6471AzUTAjXZxFKIP0SCuxAuqrKyEgBvb2+rx3v27MnU\nqVN59NFHMZvNAEyfPp3BgwfbvEZwcDAA69at48Ybb6xprUPt/uh1JScnk5ycjMlkYufOnbz22mtM\nmjSJ77//vmbCXElJidVzLD8HBQVd6KkKIeqRbnkhXNCZM2dITk7mzTfftHs8KysLgI4dOxIUFMTJ\nkyeJiYmpubVt2xaz2UxISAgAVVVVhIaGWr3G2rVrgdrW9JYtWzhy5AgAHh4eXHHFFcyaNYuysjLS\n09Pp3r07bm5u7Ny50+p1du3ahU6no0ePHpfuFyBEKyctdyFcUJs2bbj77rtZvHgxlZWVXH/99ej1\nekpKSti8eTOvvfYad9xxB1FRUdx///288cYbdOjQgauuuorS0lKWLFnCtm3b+PrrrwkJCSEpKYmN\nGzcycuRI/P39efvtt2nfvj0AaWlpJCUlsWbNGvbv38/f/vY34uLiKC0tZdmyZURERBAfH09AQAA3\n3XQTixcvpl27dvTs2ZO9e/eyaNEibrzxRqKjo538WxPCdUhwF8JFzZw5k+7du7N69WrWrVtHQUEB\nvr6+dOnShaeeeorbb78dgMmTJ+Pr68uKFSuYN28e3t7eDBgwgA8++KCm5T5nzhyeeuopxo8fT3Bw\nMHfddReTJ0+moKCAJUuW4OHhwfPPP8+CBQt48sknycvLIygoiN69e/Puu+/WjLM///zzhIWF8eKL\nL5KXl0dERAS33XabzVI4IcTF0WkyQ0UIIYRwKTLmLoQQQrgYCe5CCCGEi5HgLoQQQrgYCe5CCCGE\ni5HgLoQQQrgYCe5CCCGEi5HgLoQQQrgYCe5CCCGEi5HgLoQQQriY/wfih2Vrq3RVMQAAAABJRU5E\nrkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(system, title='Proportional growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's the end of the diagnostic. If you were able to get it done quickly, and you would like a challenge, here are two bonus questions:\n", - "\n", - "\n", - "### Bonus question #1\n", - "\n", - "Write a version of `run_simulation` that puts the results into a single `TimeFrame` named `results`, rather than two `TimeSeries` objects.\n", - "\n", - "Write a version of `plot_results` that can plot the results in this form.\n", - "\n", - "WARNING: This question is substantially harder, and requires you to have a good understanding of everything in Chapter 5. We don't expect most people to be able to do this exercise at this point." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_simulation(system):\n", - " \"\"\"Runs a proportional growth model.\n", - " \n", - " Adds TimeSeries to `system` as `results`.\n", - " \n", - " system: System object \n", - " \"\"\"\n", - " results = TimeFrame(columns = system.init.index)\n", - " results.loc[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " juveniles, adults = results.loc[t]\n", - "\n", - " maturations = system.mature_rate * juveniles\n", - " births = system.birth_rate * adults\n", - " deaths = system.death_rate * adults\n", - " \n", - " if adults > 30:\n", - " market = adults - 30\n", - " else:\n", - " market = 0\n", - " \n", - " juveniles += births - maturations\n", - " adults += maturations - deaths - market\n", - " \n", - " results.loc[t+1] = juveniles, adults\n", - " \n", - " system.results = results" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "run_simulation(system)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def plot_results(system, title=None):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " system: System object with `results`\n", - " \"\"\"\n", - " newfig()\n", - " plot(system.results.adults, 'bo-', label='adults')\n", - " plot(system.results.juveniles, 'gs-', label='juveniles')\n", - " decorate(xlabel='Season', \n", - " ylabel='Rabbit population',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nSxe2bdvGb37zGz755BPCwq6+XXzmjpkAZJVkkZJXv9JLn4A+dNV3vWH5FkIIIWyFTT25FxYWsmPH\nDn7/+98TGhqKq6srkyZNIjw8nPfff/+az1tcVcyZvDOm18FewQR5Bt2ILAshhBA2x6aC+9GjR6mu\nrmbAgAFm+wcOHEhSUlITR11ean4qdagFYbycvejl1+u68imEEELYMpsK7nl5eQD4+vqa7ffz8yM3\nN/eaz1ur1QLgpHMi0hApE9UIIYSwazbX5t6U6+nRHhkYSW55LgHuAdKBTgghhN2zqUfYgIAAAAoK\nCsz25+fnExgYeM3ndXNyo6t3VwnsQgghOgSbCu5RUVG4uLhw+PBhs/0HDx4kNja2jXIlhBBCtC82\nVS3v7e3N+PHjSUxMJCIiguDgYDZt2kRmZiaTJk26pnMuH7v8BudSCCGEsG02FdwB5s+fz5IlS5g8\neTKlpaVERkaycuVKunZtekx6ba3qMHfhwoXWyqYQQgjRZozxzhj/GtNpmqa1ZoZawv79+3nkkUfa\nOhtCCCFEq9q4caPVZmu7CO4VFRX8+OOPGAwGHB0d2zo7QgghRIuqra0lJyeHqKgo3NwsO4vbRXAX\nQgghRD2b6i0vhBBCiOsnwV0IIYSwMxLchRBCCDsjwV0IIYSwMxLchRBCCDtjc5PYXKvy8nIWL17M\nnj17KCwspFevXjz11FPceuutVtN/++23JCYmcvr0aby9vbntttuYN28e7u7urZxzS7m5uSxdupSv\nv/6asrIyevXqxTPPPMPw4cMt0m7dupV58+bh4uJitj8uLo4lS5a0VpabNGrUKC5evIiDg/n3yO3b\ntxMaGmqR3lbLZd++fUyfPt1if01NDffddx9/+ctfzPbbWrmkp6czf/58fvjhB7744gu6detmeu9f\n//oXq1atIi0tDYPBQFxcHE899VSTw0rz8vJYtGgR+/bto7y8nMjISObMmUNUVFRrXU6z17Nx40Y2\nbtxIVlYWfn5+3HfffcyaNcvib9CoT58+ODs7WyxOdeDAAYvyawlNXUtiYiJ///vfcXZ2Nkv/2GOP\n8fTTT1s9V1uXTVPXcvfdd3P+/HmztJqmUV1dzcmTJ62eqy3L5XL34HbxmdHsxNy5c7V7771XO3v2\nrFZRUaFt3rxZi4qK0s6cOWORNjU1VYuKitLWr1+vlZWVaT/99JN2//33a3Pnzm2DnFuaOHGiNn36\ndC07O1urqKjQli5dqt10003ahQsXLNJ+9NFH2siRI9sgl1dm5MiR2kcffXRFaW29XBrLzs7Whg4d\nqu3du9fiPVsql127dmnDhw/X5syZo0VERGjp6emm9/bu3av1799f27lzp1ZZWamdOHFC++Uvf6kl\nJiY2eb6pU6dq06ZN07KysrSSkhLtjTfe0IYOHarl5eW1xuU0ez2bN2/WYmJitL1792o1NTXa/v37\ntejoaG3t2rVNni8iIkL7/vvvWyPrFpq7ljfffFObMmXKVZ2vLcumuWux5plnnmn2s92W5dLcPbi9\nfGbsolq+sLCQHTt28Pvf/57Q0FBcXV2ZNGkS4eHhvP/++xbpP/jgA8LCwpg6dSru7u50796d3/72\nt2zfvt20pnxbKS4uJjw8nPnz52MwGHB1deWJJ56grKyMI0eOtGneWpotl4s1CxYsIC4ujqFDh7Z1\nVppVUFDAxo0bGTdunMV7GzZsYMSIEcTFxeHi4kKfPn2YNm0a7733HnV1dRbpT506xd69e5kzZw7B\nwcF4enoya9YsdDod27dvb43LafZ6qqqqSEhIYOjQoTg6OhITE8OwYcP4/vvvWyVvV6u5a7labV02\nV3Mtu3fvZt++fcybN6/F83W1LncPbi+fGbsI7kePHqW6upoBAwaY7R84cCBJSUkW6Q8fPszAgQMt\n0tbU1HD06NEWzevleHt788orrxAeHm7al56eDkBwcLDVY0pLS/nd737H8OHDue2225g/f77Fsrlt\n6dNPP+VXv/oVMTExPPDAA+zevdtqOlsul8b++9//cvDgQWbPnt1kGlsplwkTJlhtAoGmf+cFBQWk\npaVZpE9KSsLZ2Zm+ffua9jk5OdG/f3+rn7WW0Nz1PProozz00EOm15qmkZmZSefOnZs953vvvced\nd95JbGwsDz/8MPv377+heW5Kc9cCav7wX//619x8882MGjWKxYsXU1FRYTVtW5fN5a7FqKKigpde\neonnnnsOvV7fbNq2KJfL3YPby2fGLoK78anO19fXbL+fnx+5ublW0/v4+FikBaymb0slJSXMmzeP\n22+/3eLLC6h8h4eHM2XKFL7++mtWrFjBoUOHSEhIaIPcWoqIiCAsLIwNGzbw1VdfceeddzJr1iyL\nZX2h/ZRLXV0dy5YtY8aMGXh5eVlNY+vlYtTc79xabYkxfeN2UF9fX5sqI6O///3vnD9/3mp/CaP+\n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\nTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Bonus question #2\n", - "\n", - "Factor out the update function.\n", - "\n", - "1. Write a function called `update` that takes a `State` object and a `System` object and returns a new `State` object that represents the state of the system after one time step.\n", - "\n", - "2. Write a version of `run_simulation` that takes an update function as a parameter and uses it to compute the update.\n", - "\n", - "3. Run your new version of `run_simulation` and plot the results.\n", - "\n", - "WARNING: This question is substantially harder, and requires you to have a good understanding of everything in Chapter 5. We don't expect most people to be able to do this exercise at this point." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update(state, system):\n", - " \"\"\"Compute the state of the system after one time step.\n", - " \n", - " state: State object with juveniles and adults\n", - " system: System object\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " juveniles, adults = state\n", - " \n", - " maturations = system.mature_rate * juveniles\n", - " births = system.birth_rate * adults\n", - " deaths = system.death_rate * adults\n", - " \n", - " if adults > 30:\n", - " market = adults - 30\n", - " else:\n", - " market = 0\n", - " \n", - " juveniles += births - maturations\n", - " adults += maturations - deaths - market\n", - " \n", - " return State(juveniles=juveniles, adults=adults)\n", - "\n", - "\n", - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a proportional growth model.\n", - " \n", - " Adds TimeSeries to `system` as `results`.\n", - " \n", - " system: System object \n", - " \"\"\"\n", - " results = TimeFrame(columns = system.init.index)\n", - " results.loc[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " results.loc[t+1] = update_func(results.loc[t], system)\n", - " \n", - " system.results = results" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "run_simulation(system, update)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\nSxe2bdvGb37zGz755BPCwq6+XXzmjpkAZJVkkZJXv9JLn4A+dNV3vWH5FkIIIWyFTT25FxYWsmPH\nDn7/+98TGhqKq6srkyZNIjw8nPfff/+az1tcVcyZvDOm18FewQR5Bt2ILAshhBA2x6aC+9GjR6mu\nrmbAgAFm+wcOHEhSUlITR11ean4qdagFYbycvejl1+u68imEEELYMpsK7nl5eQD4+vqa7ffz8yM3\nN/eaz1ur1QLgpHMi0hApE9UIIYSwazbX5t6U6+nRHhkYSW55LgHuAdKBTgghhN2zqUfYgIAAAAoK\nCsz25+fnExgYeM3ndXNyo6t3VwnsQgghOgSbCu5RUVG4uLhw+PBhs/0HDx4kNja2jXIlhBBCtC82\nVS3v7e3N+PHjSUxMJCIiguDgYDZt2kRmZiaTJk26pnMuH7v8BudSCCGEsG02FdwB5s+fz5IlS5g8\neTKlpaVERkaycuVKunZtekx6ba3qMHfhwoXWyqYQQgjRZozxzhj/GtNpmqa1ZoZawv79+3nkkUfa\nOhtCCCFEq9q4caPVZmu7CO4VFRX8+OOPGAwGHB0d2zo7QgghRIuqra0lJyeHqKgo3NwsO4vbRXAX\nQgghRD2b6i0vhBBCiOsnwV0IIYSwMxLchRBCCDsjwV0IIYSwMxLchRBCCDtjc5PYXKvy8nIWL17M\nnj17KCwspFevXjz11FPceuutVtN/++23JCYmcvr0aby9vbntttuYN28e7u7urZxzS7m5uSxdupSv\nv/6asrIyevXqxTPPPMPw4cMt0m7dupV58+bh4uJitj8uLo4lS5a0VpabNGrUKC5evIiDg/n3yO3b\ntxMaGmqR3lbLZd++fUyfPt1if01NDffddx9/+ctfzPbbWrmkp6czf/58fvjhB7744gu6detmeu9f\n//oXq1atIi0tDYPBQFxcHE899VSTw0rz8vJYtGgR+/bto7y8nMjISObMmUNUVFRrXU6z17Nx40Y2\nbtxIVlYWfn5+3HfffcyaNcvib9CoT58+ODs7WyxOdeDAAYvyawlNXUtiYiJ///vfcXZ2Nkv/2GOP\n8fTTT1s9V1uXTVPXcvfdd3P+/HmztJqmUV1dzcmTJ62eqy3L5XL34HbxmdHsxNy5c7V7771XO3v2\nrFZRUaFt3rxZi4qK0s6cOWORNjU1VYuKitLWr1+vlZWVaT/99JN2//33a3Pnzm2DnFuaOHGiNn36\ndC07O1urqKjQli5dqt10003ahQsXLNJ+9NFH2siRI9sgl1dm5MiR2kcffXRFaW29XBrLzs7Whg4d\nqu3du9fiPVsql127dmnDhw/X5syZo0VERGjp6emm9/bu3av1799f27lzp1ZZWamdOHFC++Uvf6kl\nJiY2eb6pU6dq06ZN07KysrSSkhLtjTfe0IYOHarl5eW1xuU0ez2bN2/WYmJitL1792o1NTXa/v37\ntejoaG3t2rVNni8iIkL7/vvvWyPrFpq7ljfffFObMmXKVZ2vLcumuWux5plnnmn2s92W5dLcPbi9\nfGbsolq+sLCQHTt28Pvf/57Q0FBcXV2ZNGkS4eHhvP/++xbpP/jgA8LCwpg6dSru7u50796d3/72\nt2zfvt20pnxbKS4uJjw8nPnz52MwGHB1deWJJ56grKyMI0eOtGneWpotl4s1CxYsIC4ujqFDh7Z1\nVppVUFDAxo0bGTdunMV7GzZsYMSIEcTFxeHi4kKfPn2YNm0a7733HnV1dRbpT506xd69e5kzZw7B\nwcF4enoya9YsdDod27dvb43LafZ6qqqqSEhIYOjQoTg6OhITE8OwYcP4/vvvWyVvV6u5a7labV02\nV3Mtu3fvZt++fcybN6/F83W1LncPbi+fGbsI7kePHqW6upoBAwaY7R84cCBJSUkW6Q8fPszAgQMt\n0tbU1HD06NEWzevleHt788orrxAeHm7al56eDkBwcLDVY0pLS/nd737H8OHDue2225g/f77Fsrlt\n6dNPP+VXv/oVMTExPPDAA+zevdtqOlsul8b++9//cvDgQWbPnt1kGlsplwkTJlhtAoGmf+cFBQWk\npaVZpE9KSsLZ2Zm+ffua9jk5OdG/f3+rn7WW0Nz1PProozz00EOm15qmkZmZSefOnZs953vvvced\nd95JbGwsDz/8MPv377+heW5Kc9cCav7wX//619x8882MGjWKxYsXU1FRYTVtW5fN5a7FqKKigpde\neonnnnsOvV7fbNq2KJfL3YPby2fGLoK78anO19fXbL+fnx+5ublW0/v4+FikBaymb0slJSXMmzeP\n22+/3eLLC6h8h4eHM2XKFL7++mtWrFjBoUOHSEhIaIPcWoqIiCAsLIwNGzbw1VdfceeddzJr1iyL\nZX2h/ZRLXV0dy5YtY8aMGXh5eVlNY+vlYtTc79xabYkxfeN2UF9fX5sqI6O///3vnD9/3mp/CaP+\n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\nTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plot_results(system)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.1" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/soln/salmon_soln.ipynb b/soln/salmon_soln.ipynb deleted file mode 100644 index d5d8a90e..00000000 --- a/soln/salmon_soln.ipynb +++ /dev/null @@ -1,1636 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case Study: Predicting salmon returns\n", - "\n", - "This case study is based on a ModSim student project by Josh Deng and Erika Lu.\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Can we predict salmon populations?\n", - "\n", - "Each year the [U.S. Atlantic Salmon Assessment Committee](https://www.nefsc.noaa.gov/USASAC/Reports/USASAC2018-Report-30-2017-Activities.pdf) reports estimates of salmon populations in oceans and rivers in the northeastern United States. The reports are useful for monitoring changes in these populations, but they generally do not include predictions.\n", - "\n", - "The goal of this case study is to model year-to-year changes in population, evaluate how predictable these changes are, and estimate the probability that a particular population will increase or decrease in the next 10 years.\n", - "\n", - "As an example, I'll use data from page 18 of the 2017 report, which provides population estimates for the Narraguagus and Sheepscot Rivers in Maine.\n", - "\n", - "![USASAC_Report_2017_Page18](data/USASAC_Report_2017_Page18.png)\n", - "\n", - "At the end of this notebook, I make some suggestions for extracting data from a PDF document automatically, but for this example I will keep it simple and type it in.\n", - "\n", - "Here are the population estimates for the Narraguagus River:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "pops = [2749, 2845, 4247, 1843, 2562, 1774, 1201, 1284, 1287, 2339, 1177, 962, 1176, 2149, 1404, 969, 1237, 1615, 1201];" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To get this data into a Pandas Series, I'll also make a range of years to use as an index." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "range(1997, 2016)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "years = range(1997, 2016)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the series." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    19972749.0
    19982845.0
    19994247.0
    20001843.0
    20012562.0
    20021774.0
    20031201.0
    20041284.0
    20051287.0
    20062339.0
    20071177.0
    2008962.0
    20091176.0
    20102149.0
    20111404.0
    2012969.0
    20131237.0
    20141615.0
    20151201.0
    \n", - "
    " - ], - "text/plain": [ - "1997 2749.0\n", - "1998 2845.0\n", - "1999 4247.0\n", - "2000 1843.0\n", - "2001 2562.0\n", - "2002 1774.0\n", - "2003 1201.0\n", - "2004 1284.0\n", - "2005 1287.0\n", - "2006 2339.0\n", - "2007 1177.0\n", - "2008 962.0\n", - "2009 1176.0\n", - "2010 2149.0\n", - "2011 1404.0\n", - "2012 969.0\n", - "2013 1237.0\n", - "2014 1615.0\n", - "2015 1201.0\n", - "dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pop_series = TimeSeries(pops, index=years, dtype=np.float64)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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ft1wNxK/22CSHpQQYsTV1NRw3XXXsXjxYpYvX86aNWtoa2tj3bp1/OUvf+Htt9/m/PPPB4ze2M6dO/2P//GPf3D66adz3HHHcdddd/Haa69x5plnsnDhQu644w7/a3z88cdcdtllLF26lOOOO47Vq1fT2NjIli1buPnmmyksLGTRokUA1NfXs2bNGk4++WSWLVvG3XffTWdnJ2DMP7v77rs54YQTOPnkk3n22Wf7fF/33nsv3//+97n22mtZsGABq1at4vPPP/fvX79+PRdddBHHH3885513Hq+++qp/3xlnnMF9993HGWecwcKFC/npT3/qn/N277338t3vftd/bH+9pnXr1nHRRRexZMkSFi9ezJo1a3C73QP+brdt28YVV1zBokWLOOecc3j88cf917ziiiv4r//6L1atWsXxxx/PZZddxt69e+38Uw+L9KCEiFCbdCUf76jA3Rn6noAr2smSObkcp7KDcr377ruPcePGsX79epqbm7nyyit59dVXWblyJYWFhezcuZP777+/13P/9a9/8fLLL7Nnzx4uvvhiTjvtNJ5//nmKi4u5+OKLWblyJZMmTWL16tXccsstrFixgsrKSq666ir+/ve/c+2113LLLbfw6KOP8vzzzwPws5/9jJiYGNatW0dLSws33HADf/nLX1i9ejVPPvkkL730Ek899RTp6en8+Mc/7ve9rVu3jt///vf893//N4899hjf+c53+Pe//015eTnXXXcdd9xxB1/4whfYuHEj3/3ud8nKymLhwoUAvPDCCzz66KMkJSWxevVq7rjjDm699Vbbv9cDBw7w05/+lIcffphFixZRXFzMpZdeyuuvv86XvvSlPn+3NTU1XH311axevZr//d//pbCwkOuuu46UlBTOPfdcAJ577jkeeeQRsrKy+P73v8+9997LPffcY7ttQyE9KCEi1OeFh0ckOAG4O718Xnh4UOdcdtllLFq0KODnmWeeASApKYlt27bx2muv4fP5eO6551i5cqWt637rW98iISGB+fPnk5CQwKWXXkpSUhJz584lOzubsrIyYmNjefrpp1mxYgUtLS0cPnyY9PT0XufnVFVV8dZbb3HTTTeRlJREdnY2q1evZu3atQC88sorXH755eTn55OUlMQPfvCDftu3ePFizj//fFwuF9/4xjeIiYlhw4YNvPzyy5xwwgmsWLGC6Oholi5dynnnncc///lP/7nf/va3mTRpEmlpaVx//fW8/PLLdn/dAGRlZfHSSy+xaNEiGhsbqampIS0tbcB5SW+88QZZWVl84xvfwOVyMXfuXK688kr/vxfA+eefz9SpU0lKSuKcc86hpKRkUG0bCulBCRGhFszMGtEe1IKZWYM654knnujzHtTq1atxOp38+c9/5sYbb2ThwoXceuutTJs2bcDrpqam+h9HRUUxbtw4/3On04nP5yMqKop3332Xv/71r3i9XmbNmkVDQwO91R49ePAgAF/84hf923w+H263m/b2dqqqqgIWNB2obufkyZP9jx0OBzk5ORw+fJiamhrGjx8fcOzEiRP56KOP/M/z8/P9j3NycmhqaqKtra3f17NyuVw888wzPP3008TFxTFnzhza29t7fd9WvbVtwoQJlJd3ryuYkZHhfxwdHY3HY2tJp2GRACVEhDpOZQdtyG2kFRYW8tWvfpXvf//7lJeXc/vtt3PrrbfyyCOPDHiunXk2mzZt4p577uGpp57yB73vfOc7vR6bnZ2N0+nkvffeIz7eWFquqamJ6upqYmNjyc7O9pfvATh06FC/r23d7/P5KC8vJy8vj/r6ej755JOAY0tLS8nMzOz13IMHD5KamkpcXBxOpzNg8mtdXV2vr/3yyy/z4osv8swzz5CTkwPgv9/Un7y8PH+g7qtto0GG+IQQI+7RRx/ltttuo7m5mYyMDOLi4khJSQEgJiaGxsbGYV2/sbERp9NJbGwsXq+Xf/3rX7z33nv+D/mYmBiam5vxer3k5uayZMkSfve739Hc3ExTUxNr1qzhV7/6FQAXXngh//d//8fevXtpbm4e8L7LBx98wDvvvIPb7ebBBx/E6XSydOlSVqxYwSeffMIrr7yCx+Nhw4YNvPjii5x33nn+cx988EEqKyuprq7mvvvuY9WqVQBMnTqVTZs2sW/fPlpaWvjrX//a5/uOiooiJiYGt9vNY489htY64H339rtdtmwZtbW1PPLII7jdbnbs2MFjjz0W0LbRIAFKCBESX/3qV4+YB9WVNbdmzRq8Xi+nn346J554Ig0NDfziF78AYPny5RQXF7Ns2bIhv/app57Keeedx8qVK1m6dCl///vfueSSS9i9ezdg3CeKjo5m4cKFNDQ0cNddd9HU1MTZZ5/NGWecgcPh8AeiVatWcdlll3HF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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_population(series):\n", - " plot(series, label='Estimated population')\n", - " decorate(xlabel='Year', \n", - " ylabel='Population estimate', \n", - " title='Narraguacus River',\n", - " ylim=[0, 5000])\n", - " \n", - "plot_population(pop_series)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modeling changes\n", - "\n", - "To see how the population changes from year-to-year, I'll use `ediff1d` to compute the absolute difference between each year and the next.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 96., 1402., -2404., 719., -788., -573., 83., 3.,\n", - " 1052., -1162., -215., 214., 973., -745., -435., 268.,\n", - " 378., -414., 0.])" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "abs_diffs = np.ediff1d(pop_series, to_end=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compute relative differences by dividing by the original series elementwise." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1997 0.034922\n", - "1998 0.492794\n", - "1999 -0.566047\n", - "2000 0.390125\n", - "2001 -0.307572\n", - "2002 -0.322999\n", - "2003 0.069109\n", - "2004 0.002336\n", - "2005 0.817405\n", - "2006 -0.496794\n", - "2007 -0.182668\n", - "2008 0.222453\n", - "2009 0.827381\n", - "2010 -0.346673\n", - "2011 -0.309829\n", - "2012 0.276574\n", - "2013 0.305578\n", - "2014 -0.256347\n", - "2015 0.000000\n", - "dtype: float64" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rel_diffs = abs_diffs / pop_series" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can use the `modsim` function `compute_rel_diff`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1997 0.034922\n", - "1998 0.492794\n", - "1999 -0.566047\n", - "2000 0.390125\n", - "2001 -0.307572\n", - "2002 -0.322999\n", - "2003 0.069109\n", - "2004 0.002336\n", - "2005 0.817405\n", - "2006 -0.496794\n", - "2007 -0.182668\n", - "2008 0.222453\n", - "2009 0.827381\n", - "2010 -0.346673\n", - "2011 -0.309829\n", - "2012 0.276574\n", - "2013 0.305578\n", - "2014 -0.256347\n", - "2015 0.000000\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rel_diffs = compute_rel_diff(pop_series)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These relative differences are observed annual net growth rates. So let's drop the `0` and save them." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1997 0.034922\n", - "1998 0.492794\n", - "1999 -0.566047\n", - "2000 0.390125\n", - "2001 -0.307572\n", - "2002 -0.322999\n", - "2003 0.069109\n", - "2004 0.002336\n", - "2005 0.817405\n", - "2006 -0.496794\n", - "2007 -0.182668\n", - "2008 0.222453\n", - "2009 0.827381\n", - "2010 -0.346673\n", - "2011 -0.309829\n", - "2012 0.276574\n", - "2013 0.305578\n", - "2014 -0.256347\n", - "dtype: float64" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rates = rel_diffs.drop(2015)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A simple way to model this system is to draw a random value from this series of observed rates each year. We can use the NumPy function `choice` to make a random choice from a series." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.06910907577019151" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.choice(rates)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Simulation\n", - "\n", - "Now we can simulate the system by drawing random growth rates from the series of observed rates.\n", - "\n", - "I'll start the simulation in 2015." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1201.0" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = 2015\n", - "p_0 = pop_series[t_0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a `System` object with variables `t_0`, `p_0`, `rates`, and `duration=10` years. \n", - "\n", - "The series of observed rates is one big parameter of the model." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    t_02015
    p_01201
    duration10
    rates1997 0.034922\n", - "1998 0.492794\n", - "1999 -0.56...
    \n", - "
    " - ], - "text/plain": [ - "t_0 2015\n", - "p_0 1201\n", - "duration 10\n", - "rates 1997 0.034922\n", - "1998 0.492794\n", - "1999 -0.56...\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(t_0=t_0,\n", - " p_0=p_0,\n", - " duration=10,\n", - " rates=rates)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write an update functon that takes as parameters `pop`, `t`, and `system`.\n", - "It should choose a random growth rate, compute the change in population, and return the new population." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func1(pop, t, system):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " pop: population\n", - " t: time step\n", - " system: System object\n", - " \"\"\"\n", - " rate = np.random.choice(system.rates)\n", - " pop += rate * pop\n", - " return pop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your update function and run it a few times" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1203.806074766355" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update_func1(p_0, t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `run_simulation` that stores the results in a `TimeSeries` and returns it." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate a queueing system.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " \"\"\"\n", - " t_0 = system.t_0\n", - " t_end = t_0 + system.duration\n", - " \n", - " results = TimeSeries()\n", - " results[t_0] = system.p_0\n", - " \n", - " for t in linrange(t_0, t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - "\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `run_simulation` to run generate a prediction for the next 10 years.\n", - "\n", - "The plot your prediction along with the original data. Your prediction should pick up where the data leave off." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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fDNLliyhpKSEiy66iL/85S8sW7aMm2++mSeeeILnn38egB/96Ed4vV5Wr15NQ0MDV199NY888gjLly/nz3/+M//+97/529/+Rl5eHtddd12Hr2316tX88pe/5De/+Q1PPfUUV155Jf/5z38oLi7miiuu4M477+RrX/saH3/8Md/97ncpKChg1qxZAPzrX//iiSeeICMjg+XLl3PnnXd2qZP63r17uf766/n973/P7Nmz2blzJ+eeey6vvfYaJ598crvvbUVFBRdffDHLly/nD3/4A5s2beKKK64gOzubU089FYDnnnuOxx9/nIKCAq655hoeeOABfvWrX9mWrTO0BZVkRGorWllM0Ubt5tPYo3H7ul5RTgBGJETj9nVd2nPeeecxe/bsuJ9nn30WgIyMDNavX8+rr76KYRg899xznH766bbue/nll5OWlsbhhx9OWloa5557LhkZGUydOpXCwkL27NmDz+fj73//O0uWLKGhoYHS0lLy8vLaHPleVlbGm2++yc9+9jMyMjIoLCxk+fLlrFq1CoCXXnqJ888/nzFjxpCRkcH3v//9DuWbM2cOS5cuxePxcMkll+D1elmzZg0vvvgic+fOZcmSJbjdbubPn89pp53GP//5z9je73znO4wePZrc3FyuuuoqXnzxRbtvNwAFBQX8+9//Zvbs2dTW1lJRUWFr1P3rr79OQUEBl1xyCR6Ph6lTp3LhhRfGfl8AS5cuZdy4cWRkZHDiiSeya9euLsnWGdqCSjKs7r0mIv56PH0gi6b/kTpuWq9aUKnjumY9PfPMM+3GoJYvX47T6eTBBx9kxYoVzJo1i1tuuYXx48d3et+cnJzYY5fLRWZms8fB6XRiGAYul4t33nmHP/7xj0SjUSZPnkxNTU2bI9+bBiqedNJJsXOGYRAKhQgEApSVlTFs2LDYWmfjesaOHRt77HA4GDp0KKWlpVRUVDBixIi4a0eNGsVHH30UOx4zZkzs8dChQ6mrq8Pv93f4fFY8Hg/PPvssf//730lJSWHKlCkEAoFOR923JdvIkSMpLi6OHbccdR+JRGzLZQetoJIMa4JEE9HG2j6QRNMfSRs/rcdcbr3Npk2b+OY3v8k111xDcXExd9xxB7fccguPP/54p3vtjIf/9NNP+dWvfsXf/va3mNK78sor27y2sLAQp9PJu+++S2pqKqAm8paXl+Pz+SgsLGTv3r2x6/fv39/hc1vXDcOguLiY4cOHU11dzdq1a+Ou3b17N/n5+W3uLSoqIicnh5SUFJxOZ9yo+6qqqjaf+8UXX+SFF17g2WefZejQoQCxeFNHDB8+PKao25Mt0fS6i08IkSOE2CWEuNg89gohfieEqBBClAohVra4/hwhxBYhRL0Q4iUhRKFlbYwQ4j9CiFohxFYhxJJefjk9TrimtNW5qL/1+GqNZqDxxBNPcNttt1FfX8+QIUNISUkhOzsbUOPYa2sP7ItabW0tTqcTn89HNBrl5Zdf5t13340b+V5fX080GmXYsGEcccQR/OIXv6C+vp66ujpWrlzJjTfeCMCZZ57Jn/70J7Zu3Up9fX2ncZf333+ft99+m1AoxKOPPorT6WT+/PksWbKEtWvXxsbVr1mzhhdeeIHTTjsttvfRRx+lpKSE8vJyHnroIc444wwAxo0bx6effsq2bdtoaGjgj3/8Y7uv2+Vy4fV6CYVCPPXUU0gp4153W+/tscceS2VlJY8//jihUIgNGzbw1FNPxcmWaPoiBvVbYKTl+GZAABOAOcBFQogLAYQQU4DfAxcDQ4DNwCrL3lXA5+ba5cAqIUTn/oAkxTCihGvKW52P6BiUZoDwzW9+s1UdVFPW3MqVK4lGoyxatIh58+ZRU1PDDTfcAMDChQvZuXMnxx57bLef++ijj+a0007j9NNPZ/78+fzlL3/hnHPOYfPmzYCKE7ndbmbNmkVNTQ333HMPdXV1nHDCCSxevBiHwxFTRGeccQbnnXceF1xwAYsXL2by5MkdPvfhhx/Ok08+ydy5c3nzzTd57LHHSElJYezYsTz88MM89thjzJ49m5tvvpmbb76ZBQsWxPZOnTqV888/n5NOOompU6dy7bXXAnD88cdzyimn8K1vfYslS5Ywf/78Np/7jDPOYMqUKRx//PEcc8wxfPjhh5x66qmx193ee5udnc1jjz3Ga6+9xrx587jqqqtYtmwZ5557bvd+Ad2gV0e+CyEuAs4FRgC/klI+LoQoAi6WUr5qXrMMuERKeZQQ4nbgICnleeZaGlAJHAo4gPVArpSy3lz/E7BTSvkTm/IcRBKNfA/XVlD57l9bnXdn5ZO74Bt9IJEm2dEj35OfBx54oMMMxI5YvHgxN9xwA8cff3wCJOtdknrkuxBiHHATcKnlXA4wHNhgufQr4DDz8RTrmpSyAdhtrk8BdjUppzb29jusCRLurGY/r3bxaTSawUivKCghhAv4E7BCSrnPspRh/ttgOdcApFnWrWvW9Y7W+iXh6ub4k7dwLJiB32iwUTeN1Wg0g44uZ/EJIXKBaillV9ob/BSQUsqW5dZNpkGq5VwaUGdZTyWepnVHB2v9kjgLKrsApy8tZj1F/fW40rP7SjSNRtNNvve973V77xtvvNGDkvQ/bCsoIcT1wA+BXOBgIcRNQC3wAyllZ0UX3wRGCCHONI8zgYeBI4B9qCSJppzNyTS79TaYa00ypAFjzPMOYIwQIlVK2djG3n6FYRitXHyu1MyYgor467SC0mg0gwpbCkoI8UPgSuBq4DHz9N9RGXl+YEVH+6WUcSkuQojPaE6SqANuEkJ8jnLbrQDuNy99BnhPCLEQWAPcAXwqpdxk3mcdcJuZmn4k8HWg7VSWJCfaUIMRVnre6U3FmZKOMyW9eV1n8mnawTAMW3VAGk1f0d1kPLsxqGXAd6SUfwaiAFLKF4CLgG9165mb+RkqG+9L4GPgWZTiQ0r5BSqp4rdAGTAVONuy9yzgEKAEpTgvk1KuP0B5+gRr/MmdnY/D4cCZmhE7F9VdzTVt4HK54oo1NZpkpLGxEY+n6/1w7Lr4xqBqkFqyC+Xy6xJSyumWx35gufnT1rXPopRWW2u7gZO7+vzJSFsZfK6UZgWla6E0bZGTk8P+/fsZOXIkTqduralJLgzDoLGxkb1798a6WHQFuwrqE1Qc6fam5zX/XQ78r8vPqmlFvIIqAMCZYrWgdKq5pjX5+fns2bMnaQbMaTQt8Xg8DB06lKysrC7vtaugrgNeEUIcC/hQcZ/JwCTgxC4/qyYOwzBaufgAnKk6BqXpGKfTGddMVKMZSNjyCUgpPwIORiUqPI9K734FmCyl/CBx4g0Oov46oqEAAA63F6c5+8mV0tyRWU/W1Wg0gw27WXw/A+6WUv68xfksIcS9UsprEyHcYMHawbwpQQLA4U3B4XRhRCMY4SDRcBCn29tXYmo0Gk2v0q6CEkKMBJoKb24C3hBCVLS4bDrwHUArqAOgrfgTqBECzpR0Ig1qhHO0sR5nplZQGo1mcNCRBTUH+AfNCRHvtHPd73tUokFIXPwpa0jcmjMlo1lB+Wshs8tJkxqNRtMvaVdBSSmfM7t9O4FtqK4P1mFFBlAnpWxpVWm6SHsWFIArNYOmKhedyafRaAYTHcagpJRNA+bbTaYQQnillMEelWoQEfXXEw2onrcOlxtXRnw7I2s3CV0LpdFoBhN2kyQKgZ+gRly4zNMOVMr5FCAnIdINAqwDCt1Z+Tgc8d8FdDcJjUYzWLFbev4ocDqwETga+AI12mIeaiKupptYR7xbZ0A1EZdqri0ojUYziLCroBYCF0kpr0b1zXtKSnkKqnnrMQmSbVDQMsW8JXENY7UFpdFoBhF2FZQP2Go+3gjMNB8/juoirukmHSVIQAsXX2Ndt7sCazQaTX/DroKSKNceKAXVNNIig9ZDAzU2iQb9RBprAXA4XbgyWofyHG4vDpfqAmxEIxhmxwmNRqMZ6NjtxfdL4I/m6Pa/AJ8LIRyo1PO3EyXcQMdqPbky83A4Xa2uaRq7EamrBJSbz+lN6TUZNRqNpq+w24vvaVQc6gtzWOCpqPHqbwOXJUy6AU5bIzbawqVTzTUazSDE9sh3KeUay+PXgNcSItEgorMEiSbix25oBaXRaAYHduugxqLSyaeiEibikFIe3sNyDQriU8xbJ0g0EZ8oobtJaDSawYFdC+oZIA9YBfgTJ87gIRoOEqmvVgcOB+7MvHavjZusqy0ojUYzSLCroKYDR0op1yVSmMFExBp/ysjF4Wr/V6G7SWg0msGI3TTzdcDwRAoy2IiLP3WQIAEtYlA6SUKj0QwS7FpQlwHPCyH+DGwHotZFKeWTPS3YQCcugy+7/fgTgMs6+t1fj2EYsaGGGo1GM1Cxq6AuBCYC1wGNLdYMQCuoLtIVC8rh8uD0+IiGAhhGFCPQgMOSeq7RaDQDEbsK6krgO1LK3yVSmMGCEQkTrq80jxy4WgwpbAtnSgZRs4tExF8f16NPo9FoBiJ2Y1AB4M1ECjKYCNdWgNlTz5WehdPd+Rj3lj35NBqNZqBjV0HdDtwmhOj8q76mU+zWP1lx6WJdjUYzyLDr4jsfOAw4SwhRA7Ep5ABIKQt7WrCBjN0OElbiJutqBaXRaAYBdhXUgwmVYpBhtwefFe3i02g0gw1bCkpK+USiBRksGNEIkdqK2LFtBRXn4tPtjjQazcCnXQUlhPgrsExKWWM+bhcp5Tk9LtkAJVJXiRGNAOBKzbQ9OsOVqtsdaTSawUVHFlQ9qsap6bGmB+hK/ZMVFYNyAAZRfwNGNNLm/CiNRqMZKLSroKSUl1gObwL2SCnjOkiYAwynJ0i2AUlcBp/NBAlQE3edvhSigUaalJQrLTMBEmo0Gk1yYDfNfDvQVor5GODdnhNn4BNvQdlLMW/CmdKskHSquUajGeh0FIO6FPiOeegAVgshwi0uGwbssPtkQohTUTVV44AS4JdSykeEEF5UpuA3gAhwr5TyDsu+c8x9w1FTfC+WUpaYa2OA3wPzzHt+T0r5kl2ZehPDiBKuLY8dd8WCAjVZN2xO6Ij46/H0pHAajUaTZHQUg/oLMAqlnGYDrwPWr+2Gefx3O08khBhuXnuGlPJlIcRM4H0hxMfA2YAAJgkkfNoAACAASURBVADZwCtCiL1SyieFEFNQCuhkYC1wJ2ou1WLz1quANcApwALgOSHEdCnlNjty9SaRumqMiNLxzpR0nL60Lu2PTzWv7VHZNBqNJtnoKAZVD9wCIITYAaySUga6+0RSymIhRIGUslYI4US5DMNALXARyiqqBCqFEHcDV6Ca0J4PvCClfM+UZaV5zSSalecJUsog8IYQ4l+o7us/6a6siSK+g0TXrCfQqeYajWZwYTcG9RRwnhBiNIAQ4sdCiPVCiD8IIWxH6k3llIbq7fcq8BBQinLdbbBc+hWqcwXAFOualLIB2G2uTwF2mcq0rb1JRXcKdK24rN0kdLGuRqMZ4NhVUHcAdwOFQohFwP8BzwOHAvd18Tn9QDowB7gUuMY832C5pgFo8n9ltFizrne0lnR0N8W8CT1ZV6PRDCbsKqjzgbOllJ8A3wLekVL+BJVEcXpXnlBKGZVSBqWUa4HfoVx0AKmWy9JojnfVt1izrne0llQYhtHtFPMmnKnWLD7t4tNoNAMbuwoqF9hsPl4CNGXJVQOdz4oAhBDHCiE+aXHaB1QC+1BJEk1Mptmtt8G6ZroIx5jnNwBjhBCp7exNGqINNRhh1WPX6fHFxZPs4vSlgjlJNxpsjCVcaDQazUDEbrPYL4ALhRD7gBGo8e8e1ITdz2ze4zNgpBDiWuB+YC4qmeEMlIK6SQjxOcptt8K8BuAZ4D0hxEJUtt4dwKdSyk0AQoh1qFEgK4Ejga8D823K1Gu0HPHenZHtDocTV0p6LP4U9dfjSs/uMRk1mv5OKBxhy+5qhmSnUJiXlJ5+TRewa0GtAH4APArcLqXcglIg30ApqU6RUlajrK8zgQqUe2+ZlPJt4GfAeuBL4GPgWeC35r4vULGq3wJlwFRUWnoTZwGHoGqgHgMuk1Kut/m6egUjGiFYtid23J34UxNWyyuiU801mjg++LyY19fu4h9vbaGuIdjX4mgOELvdzN8VQhQC2WYqOChL5loppd/uk0kp/4eqVWp53g8sN3/a2vcsSmm1tbYbVSOVVBiGQbiymEDRVgLFW2Lj2qHnFJSOQ2k08WwvUpXs4UiUPaV1TB6b18cSaQ4Euy4+UJl33xJCHAzcikrl3ohqg6RBKaVIbQWBos34iza3qUAcLg+eISO7/RzO1OZUc53Jp9E0U9cYoq6xeZZqaWUjk8f2oUCaA8aWgjKV0ltADTAe+DUqm+/rQoiTpJQfJEzCfkCkocZUSluI1FW2eY0zJR3fiImkjp6ikh26iSvOxacVlEbTRElFfMVJWVVjH0mi6SnsWlD3A3+VUn5fCFELIKW8QAjxEHAXcFSiBExmgiW7aNiyllBVSZvrTo8P7/AJpIyYiDt3eLcSI1rdU7v4NJo22d+GgjIMo0f+32n6BrsKaj7NBbVW7gXW9Zw4/YdooIHqtS/TPDJL4XC58Q49iJQRk/Dkj+rxmU1xLj5tQWk0MVoqqEAoQk19kOwMXx9JpDlQ7CqoRqAQ2NTi/CSU22/w4XDi9PqIBv3gcOAtGINvxCR8hWNxuBPXZ9xlGbmhJ+tqNArDMCipbNlUBkqrGrWC6sfYVVBPAA8JIZrGbxQIIQ5Fuf6eTohkSY7Tm0LOkWcSqavCnVNoe3T7geLwpuBwujCiEYxwkGg4iNNtq1ZaoxmwVNUGCIYirc6XVjYycVROH0ik6QnsKqgbUb6sN1DdH9agOpE/DNyQGNGSH1daFq60rF59TofDgTMlg0iDSqeNNtbjzNQKSjO42W+xnlxOB5Gocr3rRIn+jd06qDCwUghxM2pmkxvY0qKLuKaXcKamNysofy1k5vaxRBpN37K/vFlBTRiVw6ZdKpu2VCuofk1X6qCaCmq/TJAsGpu4UjJoqvbQqeYaDXHxJzEml+17qwlFojT4QzT4Q6Sl6PnT/RG7rY40SYRONddomolEonGW0tC8NIbkNNcallZqK6q/ohVUP+RAukkYhkH9po+p+ex1Ilq5aQYAZdV+ombMKSfDR4rPTYFVQWk3X7+lSy4+TXIQl2reRRdfoHgrDVvMqSeGQdaM43tSNI2m19lf0fxFq6mDeb5WUAMC2wrKbBZ7OOAB4kqzpZQvtblJkxCcKd23oPy7N8YeB/dv12nqmn6PtcXR0FyloOIsqDbqozT9A7u9+C5DpZS3FWk0gJ5tl6DpkLjR7411ttu5RBpqCZUXxY6NaITg/h2kjDw4IXJqNL3BPquCGqIU1JDsFJwOB1HDoKY+SCAUwefRH1P9DbsW1A9Rs6BWSin1EKI+xunx4XB7MMIhVbAbCuCwUSjs3ytp2ZopULRFKyhNv8UfDFNVq0bZOB2OmGvP5XKSl50Sq4Mqq2pkZEHXp1hr+ha7SRKjgfu1ckoe4jP5OnfzGYZBYI9sdT5Ytlu1a9Jo+iHWDL0hOSm4Xc0faVY3X5nO5OuX2FVQrwLHJVIQTddwpXZt7Eaooig2gdfh8TUPTTQMAvu2JURGjSbR7G8j/tREfKKEjkP1R+y6+NYB9wohlqIaxsbNUpZSXt/Tgmk6pquJEv7dX8Uep4yYhCsti7qaMgACxVtIHTOl54XUaBKMtUB3aF563Fp8qrn2EvRH7CqoY4GPgFRgWos1o/XlmkQT5+LrxIKKhgIELVZSyiiBw5cGG9cABqHyYiL+elwp6e3fRKNJQqwZfIV58YNArRZUZY2fcCQa5wLUJD92e/EtSrQgmq4R5+LrxIIKFG/FiKpOz+7MIbiy8nE4HHiGDDez+gyCxVtJHXd4IkXuVaKhAKGKYjy5w3qt07ymd7GOePe4neRmxv+evR4XORk+quoCRA2D8mo/Q/PS2rqVJknpSh3UUOAqYCoqdrUReFRKqQMYfUBX2h1ZkyNSRolYSrpv+MRY2rm/aMuAUlA1n7xCqKIYd1Y+OUedpaeqDkD2l1sKdHPTcDpb/44LclOpqlNZfmVVjVpB9TNs2btCiCNQsaczgDKgFDgV+FwIMTtx4mnaw66LL1xbSahqPwAOhxPfyEmxNd+w8WB+cIerS4jUVydI2t4l0lBLqKIYgHBNGZG6qj6WSJMIrPGnwnYUT74u2O3X2LWg7gH+DFwppYzFnIQQDwJ3AdoF2Mu44vrx1bdbrBvY22w9eQvH4vQ2/4d1elPw5o8mWLpLXVu8lbSJMxMode8QKt8bf1xZjFuPJBlw7K+IbxDbFrrlUf/GbsRwNnCfVTmZPADM6VmRNHZwuDw4PWqUtWFEMQKtvx0aRtQszlWkjJ7c6hrfiImxx4GiLQmQtPcJlu+JOw5X7usjSTSJouWI9/YUlDWTr9zSVFbTP7CroIqBg9o4Px7Qxbt9hDPV0jS2jThUsGQX0YD61uj0peEpGN3qGt/QcTicqgVMuK6CcG1FgqTtHQzDaG1Bme4+zcCh0jLiPS3FQ0Zq2/OerGvhSDQWj9L0D+y6+J4CfieE+D7woXluPnCfuabpA5wp6WDWMkUb6yCnMG49Ljli5ME4HK2/jzjcHryFY2PFuoGizbjF3ARKnVgidVUxpRw711ir0+gHGPENYlM7TIIpyEmNZfuVVjaQl6WzOvsLdi2o21DdJP4K7AH2omJSfwN+khjRNJ1hTTVvWawbDTQSKNkRO/aNEu3ep6WbzzD6rxsk1MK910RYW1EDirgOEkM6/uKh41D9F1sKSkoZlFJeDuSjLKdpQI6UcoWUMtTxbk2isGbytayFChRtBlPReHKG4s5oP0nAWzAGh1u5QSKNtYSrSxMgbe9gde85fc1xiVA/iUNF/fUEirYQDWlXVEdYFVRhbmoHV8YrqDKtoPoV7br4hBBLgP9IKUPm45aMFkJ9K9fzoPqGuHZHllRzwzDw72lubdSR9QTgcLnxDRuP33QJBoo242nhLuwPGEaUoMVSSpswg7oN7wP9Q0EZ0QhVa54j0liLJ28EOfOW9rVISUk4EqWsulnRFOZ2XNtUYFkvrWq0PZ5G0/d0FIP6NzAMKDEft4eeB9VHtOfiC9eUxpIdHE5XnAuvPXzDJzYrqOKtpB8yv82YVTITrinDMC0Ppy8N3yhB3YYPAINwTXnSD2cMVe6LNfQNVRQRrinHnTWkj6VKPsqqGluNeO+IzDQPPq+LQDBCIBihtiFEVnry/h1ommn3NyuldLb1WJM8xLv4mrP4rMkRvuETbH0oe/JH4vSmEg02Eg00EKooxjtkZM8KnGBCZc3uPc+QkTjdXtxZQwjXlAEG4cp9eAvG9J2AnRAq3R137C/aREbW/D6SJnmxk15uxeFwUJCTyp4S9SWutLJBK6h+gt1OEm8IIXLaOF8ghPik58XS2EG5+JSrIupvUMMLI2H8lnqmztx7TTgcTnzDx8eO+2NNlDX+5M1XytWTO6x5vSK53XzBFgoqsHcThhHtI2mSl/gGsfZaFxXkxLv5NP2DjmJQC4GmGQzHAlcIIVrWPB0CTLD7ZEKIE4BfAJNQrsO7pJSPCCG8wIPAN4AIcK+U8g7LvnOA24HhwNvAxVLKEnNtDPB7YJ55z+8NlpiYw+nC6UslGmgADKL+BsJV+2NuLldqJp68Ebbv5xs+kcadXwIQ3LcNY+qCWI1UsmNEI3H1Tp68ZgXVuHM9kNxxqIi/nnBtedy5aKCRUNmepLb6+oK4Ee82FVR+TnNquU6U6D905LwtB1agvqI7gOUo5dGEAdQB19l5IiHEaOBZ4CLgeWAWsFoIsQNYCAiUsssGXhFC7JVSPimEmIJSQCcDa4E7gVXAYvPWq4A1wCnAAuA5IcT0wdLE1pmSYSooFYeydo7wWRrD2sGdOwxnSjpRf73qBl62B2/h2B6XORGEq/bHOra70rJwpakiZnfe8FbXJKPSDZXtbvO8f+8mraAstDfivTOsiRJaQfUfOopBfYHqFIEQ4k3gTCll5QE810HAM1LKf5rHHwsh3gKOQimti837Vwoh7gauAJ4EzgdekFK+Z8qy0rxmEkpxzgZOkFIGgTeEEP8CLmOQ1Ge5UjMIV5cAEKraT7C0qQ7IQcpIe+69JhwOB74RE2nctg5QHc77i4IKtog/NeFKSceVmkmksRYjGiFcXRrn9ksWrO493/CJBIqVizW4b3vSJ3f0Jh2NeO+InAwfbpeTcCRKXWOIBn+ItJS2u09okge7dVCL2lJOQgivEMJWFFdK+a6U8juWvXnA0cCnKNfdBsvlXwGHmY+nWNeklA3AbnN9CrBLSlnfzt4BjzXVvHH7OprmR3qGjIhZEV0hZXhzxl9w/w6MSP8oc4uLP7VI7vBYrKhkdPMZRpRgWXOBcdqEGbgz89RaNBI3bHKw09GI945wOh0MyW528+k4VP/AVqsjIcQ84BGUQmip1Ay797HcLxv4F2pKb1OShbXbaQPQ9NeX0WKt5XpHawMepzXV3NLiJ2VU68awdnBl5eNKzyZSX40RCREs2YVvuO0wY59ghEOxkSIQb0GBcl2ydxNgJkqMJ6kIV5VY0uNTcWXm4Rt5MOGvVFcx/55N3f59DjTiFFRe11pXFeSkxvaXVTUydlhWj8qm6Xnspo/fj5oB9U2gEeV2W4mKQX2rK08ohDgY1c9vPyopoinxwupMTjPvDVDfYs263tHaoMBlSTVvwuH24hs2rlv3czgc+Ib3rw7nocriWNcMd2YeTl/8n4Qn1xKHqixOulZOVveet2CM6Wpt8mCrmqhIg+7JbBhGfAeJPHvxpyZ0HKr/YVdBHQ5cK6V8FuWS2y+l/CVwDfB9u08mhDgGZTU9B3xDSuk3XYf7UEkSTUym2a23wbomhEgDxpjnNwBjhBCp7ewd8DjbaIDqGzERh6tLRm2r/U0ES3clfdudYHnb8acmXBk5sdEk0VAg6QYYWhMkvPmq47wrJR1vwajY+UDR5l6XK9moN2NH0PaI984oiBteqBVUf8CuggoDNebjTcB08/GbqBHwnSKEmIDqSPEzKeXKFrOlngJuEkLkCyEOQmUPNnVJfwb4uhBioRDCB9wBfCql3CSllMA64DYhhE8IsQj4urlnUGAdudHEgbqD3Bm5uLPyATMGsn/7Ad0v0bQs0G2Jw+HAnWuNQyVP49ho0E+oqqn3oQNPfrNS8o04OPbYv1cmneXX28T332t7xHtH5GWn4DSzWqvqmsd1aJIXuwrqI+C7QggnSiGcbJ4/FAjavMdyIBO4QwhRZ/m5E/gZsB74EvgYlY7+W4hlE15qHpehFOLZlvueharHKgEeAy6TUq63KVO/x+lLjY1tB3Bl5OLOLjjg+1rjToHirQd8v0QRDfoJ15j1Qw4HniFt13158poz95JpgGGobA+xxJacQpzeZqvAN+wgHC6ziW99db9u4tsT7O9G/ZMVt8tJbpauh+pP2PUDrQReQimB3wM/EkJsA4YCj9q5gZTyWuDaDi5Zbv60tfdZlNJqa203zQpz0OFwOHGlZMR6uKV0sfapPXwjJlIvPwIgWLaHaKCxVWwnGQhVFBH7gM8uaDcdO76jRPJYUEGLe6/lQEmHy4NvuKWJ717ZL5v49hTWFkd2O0i0pCAnhXKz0WxpVSMjClrHcDXJg900849RdUxPmDGjWcA9KMvmBwmTTmOLJreW0+Prcu1Te7hSM5s/1A2DwL7ktKJCncSfmnBnF8QKdJsGGPY1hmEQLN0VO/a2NfHY8vsMFG2JFSMPNqJRgxJL3GhYtxWUTpToT9iOpJu1RvXm433AQ4kSStM1MqYuwFswGndWfo9aOb7hE2J1Q4GiLaSOPbTH7t1TtFeg2xKH04U7Z6hpcakBhi4bXd4TSaS2IlYa4PT42nTNevKG40rNINJYRzQUUGn/3czQ7M9YY0ZpKR7S2xnx3hn5uXp4YX+io158pTT5TjpBSjl4/Q5JgMPlTkitkm/4hNi4ilDlPsJ1VbgzWvUM7jMi/noi9Sojz+F0ddohwpM7LKagQpX7bI0hSSRW68mTP7rN8SYq5fxgGrb+D1ANZAejgtpfHh9/6q4b29oaqaLaTyQSxWWzG4Wm9+nIglrRa1JokhKnLw1v4RiCJTsBaNz2GZmHL+xboSxY3Xvu3KGdptZ78oaB6alMho4S8fVPrd17TfhGNiuoYMlOokF/XDLFYKCrIzbaw+dxkZ3ho7ouQNQwKK/2dzuepUk8HfXie6I3BdEkJ2kTZsQUlH+vJG3SLFxtpLb3BR21N2oLd+4wVPFr3w8wjIaDcenuXkt6eUvcGTm4swsJV5dgGFECxcnpbk0kB5rBZyU/J5XqOlXbV1rVqBVUEmO31dFfO1qXUp7TM+Jokg1P7jA8ecNV5pth0LhtHRlTF/S1WBiGYTtBoolkGmAYKi9q7n6Rld9mwbWVlFEHU2c2BQ7s3TyoFFTLEe8FuQcWZy3ISWXrHuUa1okSyY1d52t9i58AMBI4FdAl7gOctAkzYo/9uzfG9fzrK6INNUQaVUcrh9uD22b6dbIMMIzL3stv373XhG/4hFiMKlS1n3CSdcNIJK1GvHu73yUFWnSU0AoqqbH1m5ZSXtLWeSHEj1CthTQDGE++yhAM15RhRCM07vicdDG3T2UKljd3//bkDm8zwaAtkmGAoWEYcePdW9Y/tYXTm4q3cAyB/TsAlSzhFkckSsSkoqfiT01YLbByU/l1tSuFpnc40PSVv6A6OWgGMA6Hg7QJM2PHjTvX93l/vlB5UeyxJ79z914TbQ0w7G0i9dWxwmqH24Mnd6itfb6Rza2PAkWbk6b1kRGNUPPpa5S/9gT+vT3vULFm8PVEvCgtxUO6OQsqFInG4lGa5KPbCkoI4UANBqzp7FpN/8c7bByudJViboRD+M3R8H1By/iTd0j7CQYtaRpgCMQGGPY21uawnryRtif8egvHxpreRhprk6YjRsOmjwkUbyEabKTui7d63P24v4ctKIhPN9duvuTFloISQpQKIUqsP6hY1E+AXyZUQk1SoKyo5lhU447P+2yYYaS2gmjQD4DTm4LLHO5nl74eYBiXXl7YuXuvCYfTFVe7FTBnXPUlwbI9NJgTmEEp/bov3sIwoj1yf3+geyPeO6NAF+z2C+xGG1vWRBmoJrEfSymTsweOpsfxjZhIw+a1RBpriQb9+Hd/RepBvT+8OC7+lDeiy0WbfTnA0IiE460/GwkSVnwjD6bRtF4D+7aSMfWoWEPZ3iYaaKR23Ru0rOcPVe7Dv2M9qeMOP+DneP/zZldufk6q7RHvnZHfhdEbhqHaLH21o4LdJbWMLszkmBkje6TnpaZj7CZJxGqihBBDgIiUcvCkEWkA9Q0+dfw06r58D4CGbZ+RMmaKbRdVT9Hd+FNsTxsDDHvrwyZUURyLe7nSs3GldW2qqzu7sHnicThEYP9OUvqgI4ZhGNR+8RbRgHK/Ob2p+IaPjynPevkR3sKxuNKzu/0cX+2sYOOOitjxtEn5Bya0BWsmX1lVY5t/AzX1QTbtquSrnRUxKw6gqjbApDE5jMjXjWYTje2vI0KInwohilAdzcuFEDuEELaHFWoGBimjJsf6/UX99QQSEBTvCMOIxtoVQdfiT020GmBY33vftazdy7tTg+VwOEixJkvslT0iV1fx71wfK+AGyDx8EemHHIk7cwigXH21X7zV7USOyho/b3/SbClPHpvLwWNyD0xoC1npXnwe9cXKHwxT16jc1YFQhC+3lfOPN7fw5Esb+HB9cZxyamLb3uoek0XTPnZjULcBVwN3AguAY4BfAzcKIX6YOPE0yYbD5Sb1oGbXTcPWT3ss3mCHcFUJRlh9mDhT0nF20QKBNgYY9mKygd32Rh1hHWQYLN1DtJc7s4dryqn/6sPYcepBh+EtHIPD6VKtsBxNo+qL8e/qejJNOBLllQ93Eoqov6vczBSOnTmqR61cR4t41hdbylj94Q7+8K/1vPnJborK6uKu97idjB7a3EFl297qpMmiHMjYtaCWARdJKe+XUq6RUr4vpbwXNW7j6sSJp0lGUsZOxdGUTdZQTbB4W689d8v2Rt390OqLAYaRhloidZWA2dw2r+3hip3hSsu07DXwF2/pIQk7x4iEqPnstZib0p2VT/rkebF1d3YBaeOnx47rv/qISEPXEn3f/WxvbGaT2+XkxHlj8bh73o1sTZT4nyxh8+4qItFmpeNwOBg7LIuvzR3LpacdyqlHjcNrWl019UEqavw9LpMmHrsKyg3sbuP8FtSUXM0gwun2xrXaUVZU73ybDMbFn7ru3ovt7YMBhnHDCYeM6LS5bUfEufn29F42X93GNc1K1uUmc/pxrWKQaZNm48pQ7jgjEqL2i7dt/31s2lXJl9vKY8dHTx/ZY5l7LWnvvgU5qSyYNoJLTp3CaUeP5+AxuXjcTlwuJ2OHxVtRmsRiV0HdBTwshIj5JIQQecAvgLsTIZgmuUk96NDYB2y4tpyQpXVPojAi4Thrx07/vfboiwGG1u4RXc3ea4l3+PiY/OHa8l6p5wrs24Z/14bYccaUo3BntI4LKVffIlRjXmX1+ndv7PT+VbUB3vyk+T2aNDqXKeO6VkLQFcYOy4q1TcpI9TBTFPKtrwnOPUEw/eBC0lJaZ0eOG9Gc9LGtSCuoRGP3K9y5wCHANiHEbiAMjAG8wDwhRMzNp2dDDQ6c3lRSxkyhcfvnADRs+R+egjEJzYYLVe6Lz4DrpMFqR/T2AEMjGolPj+9m/KkJp9uLd+g4AqZ7r27jB2TPXZqw9z/SWEftF2/Hjn3DxuMb1X6XM09OIanjD6fRrJGq/2oN3oLR7XbCD0eirP5wB6GwijvlZPhYNKtn404tSfW5+fZJk6lvDJGXlWKr3dHY4Vk4nQ6iUYPSykZqG4JkpvVNR/zBgF0F9auESqHpl6SOm4Z/x3qVWVe1n1BFMd4h3Yur2KG73SPaozcHGIar9seSO1ypmbGuHAdC2oQZBPZtBcMgVFFMYI8kZXTPt8Y0jCi1697AMNtbuVIzyDjs2E6VR/qkOQT374ilxNetf4es2Uva3Pf+uqJYwazL6eDEeQfF4j2JJNXnJtVn39Xq87gYVZjBrn2qVdW2vdVMm9R6ErKmZ+hOHVQW4NR1UBpXSjq+USLmvmnc+r8EKyhL/OkA3Huxe/TiAMNgi+awPWEZuLOGkDZuGg3bPgOg7qs1qh2Sr2djNo1bP7Wk9jvInHZcLE2/IxwuN5mHL6JqzfOAQbB0N4G9kpQWlteWPVV8sbUsdrxg2sgDHqmRSMaPyI4pqO1FWkElkq7UQV1puvcqUXVQxUKIHydONE1/QGVsqQ/bYNkeQlUlXdofDTaqGFBDLZH6asJ1VYRrKwnXVhCuKSdcU0aouoRQRRGh6qZ7O/D0gCJsHmBIbIBhogj2YPzJinWApBEKULfx/R67NyjFXb95bdzzWVtFdYYndxipBzUn1NRt+CAu3lddF+CNtc3vzYSR2Rw6YcgBSp1YrHGootJ6/IFwH0ozsLE7sHAF8FPgNuA91P/qo4AfCyEapZT3J05ETTLjSs/GN2ICgSIVC2nc+imeWSe2e71hRAlX7iNQsjPm/ukq7qwhPTLyvPUAw/3drk3qiGigwXwOwOHoVveL9nC4PGQcegzVH78IQKBoC8GRB/fIIMZoKEDtZ6/HBit6coeRNnFmJ7taky6OIFiyk0hDDUY4qFx9s04iGjVY/eFOgiEVV8xK97Jods9Yl4kkPdXDsCHp7CuvJ2oY7NhXw+SxiUvmGMzYdb4uB74jpfyz5dz7QoidwK2AVlCDmLTxM2IKKrB/O+HaStyZzdld0XCQUOkegiU7CJbsPOBRHT2pRDy5w2LKI1RRnBAFFSyLn13V02PmvQWj8Y2YGPsd1K1/l9xjzjmgHn2GYVC3/t3msSAen0optzl3y4rD5SHjsIVUf/QvAIIlOwkUbebj0vTYrCenGXc60GGEvcX4EdnsK1eW4Pa91VpBJQi7fw0FwMdtnP8EOPBotaZf484agrfwIIIlOwBo3PYpaQfPIViyk2DJTkLlRe3OXXI4XTi8Kc0ffA6nss8dOhr3pwAAFsVJREFUTvObtEN1JjCPXenZpFoKQQ+U3hhgGDc9NwEKECDjkKMIlu7GCAWINNbSsPl/pE/u/lBJ/871sQxBgMxDj203A88O3iEjSB07Ndarr+i/b/BlYAa4VCzryMOG99gojd5g3MgsPvhCxeV27qslFI7icfdMI1tNM3YV1HrgbOCOFufPBb7qUYk0/ZK0CdNjCsq/dxP+DkZBOFPS8RaOxVc4Fs+QkQdUsHqgtDXAsCeb3xpGNL7+KUEKyulLJWPyfGq/eAuAhu2f4RsxEXdW1+M5jds/p27jB7HjlNGT8Q0/8Jbv6WIewZJd+Guq2VtcxQjPenZlz2TcyJx+l2iQm5lCXlYKFTV+wpEoe0pq42JTmp7B7ifDz4AXhRDzgTXmufnAScCZiRBM07/w5A7DM2RkXCq4FXdWPt7CsXiHjsWdVZA0cYamAYaRxlo1wLCmDE+OvQm3dghXl8Vcmk5fKq7MxCUA+EYJ/Hul6oxhGNStf4fs+ad36b1u2PZZXJ89T04hGYcc1SPyOdweMg47lr0v/5VI1CArsI8cb4jj+kHcqS3GjciOtTvatrdaK6gEYMsmlVK+ChwHBIALgG+gJunOkVL+O3HiafoT6QfPiVkfDocTb8FoMqYuIG/Rt8ld8A3SD56DJ7sw6T6MrFlpdevf7XLvuPaINNRQt/6d2LE3P7EfxA6Hg4ypx8TcpaGq/V1q1tqw5X/xyil3GFlHnIrD3XPzprz5o3AMPwQAw+lm8ZxxpHShDimZGD+yWSFtL6ohGtXNY3sa238ZUsp3gHc6vVAzaPHkDiPnqLOI+utw5w7r8WSAROEbMTHmkgzXlFH5/rNkTT/ugDLhgiW7qFn3eqy4FdSwwUTjzswldcIMGrZ8AphzmYaO67TrRv3mtTRY0sk9ecPJnr2kR5VTE4csOpHisZPIzMsle0hyp5R3RGFuKhmpHuoaQ/iDYYrL6xlZoGdE9STtWlBCiDQhxO+EEBVmzdPDZpGuRtMu7sw8vAVj+o1yAjWXKePQo2OWhxEKUP3xyzRs+aTLTXANw6B+81qq174cU04Oh5OMQ4/GewDNbbtC2oQZsUGBRjhE/Yb2a6MMw6Be/jdeOQ0ZmTDlBOByORk1aWK/Vk6gLNaDrL35dPPYHqcjF9/NwGnAL4F7gVOAR3tDKI2mt0kdM5XseUtxxiwNg/pNH1PzySu20+KjoQA1a182P+yVYnOmpJM9/+ukjpmaGMHbwOFyk3HosbHjwL5tBPbvaHWdYRg0yI9o2Pq/2Dlv/iiyZ5+cMOU00Bg/ovk7+/YiPSOqp+lIQX0DOE9K+Qsp5V2oLL6vCyH0X65mQOLJHUbuUWfFzWkKluyk6v1/EK6t6GCn6kRR9d7f41LKPUNGkHvUN3o06cIu3iEjSBklYsf1G96L9QIE03L6ak2sTRIoSzJr1kl9mlXZ3xhZkBGbzFtTH6SsSs+I6kk6+kscRXwK+ccohTYU2NPmDpsIIY4A/t3U+VwI4QUeRCnFCHCvlPIOy/XnALcDw4G3gYullCXm2hjg98A81Dj670kpXzoQ+TSDF6cvjey5p1L/1YexTu2RhmqqPvgHmYctbLOhrH/vJuq+eDuu1itt/HTSxBHdKmztKdInz1eF0UE/kcY66jd/TMYhRyrltPEDGnd8EbvWW3gQWTNP6NEU+8GAy+Vk7PAsNu1SM7K2F1UndR/B/kZH/3tcKGUBgJTSQGXxdTu4IIRwCCGWAa+2uM/NgAAmAHOAi4QQF5p7pqAU0MXAEGAzsMqydxXwubl2ObBKCHHgRRuaQYvD4STjkCPJmn58rBuDEQlT89lr1G38IDbi3ohGqPvyXdXp21RODpeHrBlfI33yvD5VTgBObwrphxwZO27c/gWh6hLqv3wvTjn5ho7TyukAGK9nRCWM3rblb0bFsm4FbrScvwhlFVUClUKIu4ErgCeB84EXpJTvAQghVprXTEL1HJgNnCClDAJvCCH+BVwG/KSXXpNmgOIbMRFXZh41n/z/9u48uK7yvOP490qWZMmSLLxbNrJkW36wwRvGZjU42A6h8SQMW6DQhiXTTJq2CQ2lJaShbUKAQJhkknRI2zQdyBAwJkCgFPAabGJsY7Dx+sqWdy22JXnTYlvL7R/nSLqSJVnWvVf3SPP7zDDDPds9z7yyHr3nvO/zvkdjrfeLp27vZzScqCBzyjVUb11N/fHDLccnD8ohe9ZNHS7ilyhpuYWcKSnyyy2FOfHRW4QbWx/1pY0a3+GquNJ9eaOySE4K0dgUpuJ4HSeqzzA48/zV3uX8zpeg7jOz6nbH32tmFZEHOef+vZvf97xz7vtmNq95g5nl4D262x5x3E5gqv//U4CWIUbOuVq/qvpUoAk44JyraXfunG7ej0iXBmQNIefaWzm1eWVLpYz6qlKOrVnS5ri0UePJnDYvcKMXvblRczm2ejHhpsa2ySl3IlnTb0x4T6+vS01JZuyILPaXe/Pn9pWeZPqkvlUZI6i6SlAHgG+021YO3N9uWxjoVoJyzpV2sLl54kBtxLZaICNify1tRe7vap9I1JJS0siedRN1xZ9QU9Q6Qs8TYtAlV5JeMD1wE5CbJQ8aTMbEWdQUrW/ZNnDMJDKnzVNyipHxYwa3JKjikhNKUDHSaYJyzuX30j00934i3yxmANUR+9u/dWzeH+pin0jMhEIhMibOYsDg4Zzc5E3ATUpNJ2vmAlJjsHhivKWPn87ZyhLqK0tIH3cpg6Zcq+QUQwW52az6JEQ4HKassoba0/VkDNSA52glfDypc+6YmZXjDZJoLuR2Ca2P/Lb7+wBvAjGQ528PAXlmlu6cq+vgXJGYSh2ex5Dr76K+qoyUobkxWZeqN4SSkhk8ZxHhxvrAPYbsDzIGpjBqSAZllTWEw2H2l51icoGW4IhWwhOU70XgcTP7DO+R3sO0rjH1ErDGf2+1Fq+i+qfOuSIAM9sMPOEPnrgG+DJeIVuRuEhKS49Jde/eFgqFCCk5xU3BmMGU+WtE7Sk9oQQVA0Hp438fb0mPbXjzrV4Dngdwzm0BHvA/VwCX4k0abnYbMBlvDtR/AQ8657b22p2LiNB2uPnBw6eob+h4DbRohcNhthZXsH5beb9fbj4hPSjn3CogJ+LzabxVe7/ZyfGv4SWtjvYdBG6O/V2KiHRfTlYaQ7MHUumvEXWg/BQTxuac/8QL9GnRUf70mTfebOf+Kv7smgKG5fTPycFB6UGJiPR5BW2W4Ij9pN0jVbV8tKWs5fPJmrMsWbELt7/rUlx9lRKUiEiMRD7m21t2ksYYrhFV39DI++v309SuIG1DYxNL1x9g9aaSmH5fEChBiYjEyHB/jSiAM2cbKT0auxkvqzeVcvyUV1k/ZUASi64bz0VZraNIN+86ypt/LKb2dH1nl+hzlKBERGIkFAq1W2k3No/5dh86zva9lS2fb5g5lvzR2dwxv5AJEd9XWlHN4mVFlFfWdHSZPkcJSkQkhgraLWIY7RpR1bVnWbnxYMvnwosvwsZ59R5TU5L5wtX5XHXZ6JZKJtV19by+ajfb9lR2eL2+RAlKRCSGcodnkpbqFd+trqvn6PG685zRuaamMEvXH+DMWW/IevagVG64fEybslqhUIgrJo9k0XUFLd/b2BRm5caDrPj4II2NTVFEk1hKUCIiMZScFKJgdOtKu+u3lXO2vmdzoj4tOkKJ/x4rFAqxYE4eA1M7nh00blQ2d86f1GbI+fa9lfx+1W6qa8/26PsTTQlKRCTGIuc/7Ss7yeLlRVSeuLCe1OGqWtZtLW/5fMUlI8gdltnFGTA4M43bPleI5bUu+XK4qpZXlhVx6MipC/r+IFCCEhGJsfzR2UybOKzl8/FTZ3h1+S527O3efKX6hkaWrmsdUj5q6CBmTxnVrXNTBiSxYE4ec2eMIcl/FFh3poE3P9jD2i2lMX3kV3G8jk1FRzhRfSZm14ykBCUiEmOhUIjrZ45l4Zw8UgZ4v2YbGptY/vEBlm84QH1D10li9aYSjvu/9FNTklk4J4+kpO4v5xIKhZheOJxbbphAepr3SDAcDrNx5xGWrNzFsZOnexiZ52x9I6s3lfDKsiLWbC7lrdV7orpeZ5SgRETixMYN4Y75kxia3Tpface+KpYsL+LYqY6TxO6Dx9ke0dO6fuaYHq/Qmzs8k68sNC4emdWy7eixOl5ZVsTW4ooLHmEYDocpPnScl97byeZdR1vOb07CsaYEJSISR0OyB3L7/EIuGdf6Xqjy5GkWLyui6MCxNseeqj3Lyk9ah5RPyruozfuknshMT+FLc8dz3fRckv1eWENjE6s+OcQ7H+7t9sTekzVneefDvfzf2n1U17WeM3ZEFjdfUxDVPXYmKMttiIj0WykDkpk/O4/c4Zl88GkJDY1N1Dc08f66/ZRW1HDd9FySQiGWrms/pHxsTFZqDoVCzJg0grEjsli6bj+V/iO+vWUnKX/fMX92HvkRIw8jNTaF2bzrKBu2lVMf8f4qPW0Ac2eMofDinLitJq0EJSLSC0KhEFMKhjLiogzeXbuv5R3T1uIKDlfVkDs0k9KK1iHlC+eMIy0lOab3MCwnnTsWTGLtljI27zoKeAMo3l6zh8smDOPaabltHteVV9awcuOhc0YgXjZ+KFdNHd3pkPdYUYISEelFw3LSuXPBJFZ8fJDdh44D3nuho8dak8DsySMZPWxQXL5/QHISc2eMYdyoLJZtONjyiG9rcQUlR6pZeGUe2YNSWbul7JxqFMNy0pl3+VhGDY3PvZ1zr73yLSIi0iI1JZmbrhrHmOJMVm8uoSmiCvnooYO4YvLIuN9D3qhs7v68sWrjQYpLvJqBx06dZsmKXaSlJFMXsRhiSnISsy8dxfTC4S3vsXqDEpSISAKEQiGmThzGiCEZvPfRPk7WnCUtNZkFFzikPBrpaQP4wtX57NhXxepNJdQ3NNHUFG6TnApyB3P9zDFkZaT2yj1FUoISEUmgkUMyuGuhsa/sJCOHZPR4SHlPNb8byx2WydL1+zlcVQt4o/+unzm2TXX23qYEJSKSYKkpyUyKcjh5tHKy0rj1c4W4/VXUNzQxOX8IqTEepHGhlKBERATwCt1OKRia6NtooYm6IiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSEpQIiISSP2iWKyZTQeeB6YBe4AHnHMbEntXIiISjT7fgzKzVOBN4BUgB3gCeN/MshN6YyIiEpX+0IOaB6Q4537qf37ZzP4G+Arwn+c5NxmgvLw8fncnIiKdivj9e87iU/0hQU0BdrTbthOY2o1zRwPcc889sb4nERG5MKOB4sgN/SFBZQK17bbVAhndOHcDMBcoAxpjfF8iInJ+yXjJ6ZxxA/0hQdUA6e22ZQDV5zvROXcGWBOPmxIRkW4r7mhjnx8kAWwHrN22S/ztIiLSR/WHHtRKIGRmDwG/AG7DG27+ekLvSkREotLne1DOubPAzXiJqQp4DLjFOXc0oTcmIiJRCYXD4UTfg4iIyDn6fA9KRET6JyUoEREJJCUoEREJJCUoEREJpP4wzLzfMbOFwFNAIXAEeMY59yu/MO4vgNvxKl8855x7MuK8O4Ef4c3K/iNwn3PuiL8vD/g1cJV/zb91zr3Te1GdK05x3ggsBeoivupp59wPeiGkc/Q0xojzHwJucM7dErEtUG0ZpxgD1Y4Q1c/rt4BvAUMBB3zHObfa39cv2vI8Mfa4LZWgAsbMLgZeA76KV6V9FvCeme3DK4xrwARgMPCumZU4514wsyl4P+g3Ax8DTwMvAzf6l34ZWAt8EbgOeMPMZjjn9vROZG3FMc7LgVedc3f1WjCd6GmM/rmZwOPAd4A/tLt0YNoyjjEGph0hqp/XW4FHgIV4NUK/CrxtZhP9qTB9vi27EWOP21IJKnjygZecc80TjTeY2SrgWryGv885dww4ZmbPAl8HXgDuBd5yzq0BMLNH/WMKgRBwBbDQnze2wsz+ADyIN28sEfKJcZzOuV14/6g29WokncunZzEC/C9wFPgVflFjADObRLDaMp8Yx+gLUjtCz+McDfzIOddc2eY3ZvYTYKqZHaJ/tGWnMQIriKItlaACxu8Wr27+bGZD8Aravoj3gxBZwimyavsUvB5F83Vqzeygv78JOOCcq2l37px4xNAdcYpzF95fa8PN7Bt4ifkV4Ht+3cVeFUWMAHc750rN7F9o+8t7CgFqyzjFCAFqR+h5nM65X0Zex8yuxytwvQ24mn7QlueJEaJoSw2SCDAzG4z36GMdsNHfHFm5PbJqe1dV3aOp+B53sYrTzAYAh/DKXE3Ge+y3AEjYe4tmFxgjzrnSTi4V2LaMVYxBbke48DgjzruM1l/Oh+lHbRlxXpsYo21L9aACyn+U8ybeXy330FqxPbJye2TV9q6quoe62JdQsYzTOdcAzI/YvtvMnsB7T/VIjG+923oQY1d6XL0/nmIZY1DbEXoep5ktwuuJPOWc+7G/uV+1ZUcxRtuW6kEFkN9FXge8AdzunDvtP/stp23l9siq7W2quptZBpDnb98O5JlZeifnJkSs4zSzMWb2rD/iqFkqcDqOYXSphzF2JXBtGesYg9iO0PM4/RFuvwO+5px7OuK4ftOWncUYbVuqBxUwZjYBeBt4zDn383a7XwQeN7PP8B4PPAz8zN/3ErDGzObhjQp6EvjUOVfkX3cz8IQ/qOAa4Mt4z8ATIh5xmtlAvL/4as3s34AC4HvAf8c7no5EEWOnnHMuSG0ZjxiBSgLUjtDzOK11SsSNzrl1kSf1l7bsKkaibEslqOD5JpAFPGlmkXNGfgl8H/gJ3svHJOA/gOcBnHNbzOwB//MYvL+C7og4/zb/+CNABfCgc25rfEPpUszjdM6dNrObgZ/i/cOo9c99rjcC6kCPYuyGILVlzGMMYDtCz+P8JyANWG7WZtm6u5xzb9M/2rLLGKNpS1UzFxGRQNI7KBERCSQlKBERCSQlKBERCSQlKBERCSQlKBERCSQlKBERCSQlKJEAMLOXzeyoX6Cz/b7HzKzazPITcGsiCaMEJRIM38abON9mQT8zK8BbeuEx59y+BNyXSMIoQYkEgHOuHHgU+JqZXRmx6+d4a+m0Lz0j0u+pkoRIQJhZCPgQr5jmbOBLwGJgZvNicGZ2P/BdvDJPO/B6Vu/6+wbgLWPw50AuXmmZ3wEPO+cazey3eGuDTcZbGfVW59yqXgtQ5AKpByUSEM65MPBXwDTgfuBZ4IcRyemLeDXMHvOP+TXwupk1L3D3KHA38BdAof/574BFEV9zL16Rz/nAR3EOSSQqKhYrEiDOua1m9hzeMug7gKcidn8Xb62dxf7n3WZ2BfD3wF3AFrxluT/w9//GzB7BW4X3TX/bdufcb+Mdh0gsKEGJBM+/Av8I/MA5Vx+xfQowy8z+OWJbCv66PM65N8xsvpk9A0zC62XlA8kRxxfH88ZFYkmP+EQCxjlX5/9vXbtdA4B/AGZE/Hcp3hpCmNkPgVfx/l2/CnweaL90Q/trigSWelAifcdOYJxzbnfzBr83dRp4Bvhr4NvOuRf8fel4qw2HEnCvIlFTghLpO34MvGBmDlgBLAQex3v/BFAFLDKzPwGD8R4VZuMtJifS5+gRn0gf4Zx7FXgIeATvvdNDwNedc0v8Q/4Sb/TeFuD3wG7gf4BZvX6zIjGgeVAiIhJI6kGJiEggKUGJiEggKUGJiEggKUGJiEggKUGJiEggKUGJiEggKUGJiEggKUGJiEgg/T847FlEVSAwDQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "results = run_simulation(system, update_func1)\n", - "plot(results, label='Simulation')\n", - "plot_population(pop_series)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To get a sense of how much the results vary, we can run the model several times and plot all of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_many_simulations(system, update_func, iters):\n", - " \"\"\"Runs simulations and plots the results.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " iters: number of simulations to run\n", - " \"\"\"\n", - " for i in range(iters):\n", - " results = run_simulation(system, update_func)\n", - " plot(results, color='gray', linewidth=5, alpha=0.1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The plot option `alpha=0.1` makes the lines semi-transparent, so they are darker where they overlap.\n", - "\n", - "Run `plot_many_simulations` with your update function and `iters=30`. Also plot the original data." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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bY6JIoygzPnHI6hWq0U8Hu9wQzabza7k2m+CmjYLqt0H5iU46rxh4Fbgn7TWXwXej1NQ8/c4fWVuxSnXgtb6dzhlYD4N7MZpN/AKY+qX4cSzduKILl4vnUMtLCws/Oi2oU/EqolqRQUd65X1JPP77zEZCyrIejQJKsiC8s/da0yrzFxr/QMcWbj/eBknYXd9yHW34pBW0LnNhLTztrCwsPAjyCqIx+MTjgcFWRxBm3U/3Xtyz6kSVJDlB7gxOnPeqNf2ArbUURc0m022bNnSEQy1sJgpSKVSrFixggULFhzspcwKyGYetKFPdJMNGh9kifSboIIItxtByf2jPG+9XvcoDYPepzljQc027N69m1gshlKqp39QFha9QKvVolQqsXXrVgBLUhEQJJCYjHtPrgub30QQQfXS4jCFDOb83QgqjGhisZhnrJBfkNUVNncvYXfdLti/fz8rV6605GQxIyG5Locddhg7d+482MuZFRCyCHJ59Yug+h2D8rsZwatGDLp/WLzJv64gMUnQmH7B7rxdIMlsFhYzGblcjlqtdrCXMSsgm6m5qQbFVaJgKhZUvwlqPBFDmKTcf9zvPrQENcPQr+CfhUWvYP9Go0M226lIzP3XmfBv1kHxrrBrJ4NWqzWtFhR0vk+WoCz6js2bN8+Je8xEzNfnnokI23B7JZIIIqig63pJUEHxpV4RlLWgLHoCpRRPf/rTOfHEEz1fr3vd68a99qabbuLDH/6w+/OJJ56I1rqn67vrrrt429veNqlrt2zZglKK4eHhnq5pspjIeqbjvbWIjjBBwWQII8ji8s890yTmgjBJvT83yvwu562Kz2JSuOWWW3jyk5884ev27t3r+SO7++67e7ksAPbt2xeaUT+XMR3vrUV0RCkLFBVhMvNuP0PvCWqiEnNzTLf/SfOcWFe9qB04EVgLap5g7969XHrppZx88smcdtppbNiwgXK5zJ133slnPvMZfvjDH/KSl7wEcKyxBx980H395S9/mdNPP50TTzyRq666iu9+97s873nP46STTuIjH/mIe49f//rXnH/++axbt44TTzyR9evXMzIywn333ccHPvABNm7cyNq1Tp72gQMH2LBhA89+9rM59dRTufrqq92kwGazydVXX82znvUsnv3sZ/O1r30t9LmuueYa3v72t3PJJZdwwgkncO6553LPPfe453/+85/zspe9jGc84xmcffbZfOc733HPnXHGGVx77bWcccYZnHTSSbznPe9xc96uueYa3vzmN7tju1lNd955Jy972ct45jOfycknn8yGDRuo1Wrjvrf3338/F154IWvXruWFL3whN910kzvnhRdeyL/+679y7rnn8oxnPIPzzz+fRx55JMqv2qILgiyoqDlBfnQrd2Tez49e50CNZxF2I6ig+YSEgp4jiKCsBTVDcLfeya8f2EGt3n9LIJWM88zjDuFEtaIn81177bUMDQ3x85//nEKhwGte8xq+853vcM4557Bx40YefPBBPvWpTwVe++1vf5vbb7+dP/zhD7ziFa/guc99Lt/4xjfYtGkTr3jFKzjnnHM44ogjWL9+PZdffjlnnnkmO3fu5KKLLuJLX/oSl1xyCZdffjk33HAD3/jGNwB473vfSzqd5s4776RYLPK2t72Nz3zmM6xfv54vfvGLfOtb3+IrX/kKS5Ys4d3vfnfXZ7vzzjv5l3/5F/793/+dG2+8kTe96U38z//8D9u3b+fSSy/lIx/5CH/xF3/Bb37zG9785jezfPlyTjrpJAC++c1vcsMNNzA4OMj69ev5yEc+whVXXBH5fd26dSvvec97+NznPsfatWvZtGkTr3zlK/ne977Hi1/84tD3du/evVx88cWsX7+e//zP/2Tjxo1ceumlLFy4kLPOOguAr3/961x//fUsX76ct7/97VxzzTV8/OMfj7w2Cy+CcqBg8haUXBsUdxKC6KdAAsIl5kGuOv8auin5Go1GhwUlc/urS9gY1AzBPRt3TQs5AdTqTe7ZuGtC15x//vmsXbvW83XrrU6FqMHBQe6//36++93v0mq1+PrXv84555wTad43vOEN5PN5nva0p5HP53nlK1/J4OAgxx9/PCtWrGDLli1kMhm++tWvcuaZZ1IsFtm1axdLliwJzM/ZvXs3d911F+9///sZHBxkxYoVrF+/nltuuQWAO+64gwsuuIDVq1czODjIO97xjq7rO/nkk3nJS15CKpXita99Lel0ml/84hfcfvvtPOtZz+LMM88kmUyybt06zj77bP77v//bvfaNb3wjRxxxBIsXL+Ytb3kLt99+e9S3G4Dly5fzrW99i7Vr1zIyMsLevXtZvHjxuHlJ3//+91m+fDmvfe1rSaVSHH/88bzmNa9xf18AL3nJSzj66KMZHBzkhS98IY899tiE1mbhRS9zoATjCSX6bUH5ySJo/olaUHI8jKD8sBbUDMEJT1o+rRbUCU9aPqFrbr755tAY1Pr164nH43zyk5/ksssu46STTuKKK67gmGOOGXfeRYsWua8TiQRDQ0Puz/F4nFarRSKR4Mc//jGf//znaTabrFmzhuHh4cA/3m3btgHwohe9yD3WarWo1WpUKhV2797taSA5Xq+uI4880n0di8VYuXIlu3btYu/evRx66KGesYcffji/+tWv3J9Xr17tvl65ciWjo6NuU7YoSKVS3HrrrXz1q18lm81y3HHHUalUxv2nDVrbYYcdxvbtYz3bli5d6r5OJpOBn5YtoqOXOVD+64PuA9Pj4vPDTyITURI2m00399O8Tl5HEYb0EpagJoAT1YqeudymGxs3buRVr3oVb3/729m+fTtXXnklV1xxBddff/2410b557377rv5+Mc/zle+8hWX9N70pjcFjl2xYgXxeJyf/OQnbgfS0dFR9uzZQyaTYcWKFW75HoDHH3+8673N861Wi+3bt7Nq1SoOHDjAb3/7W8/YzZs3s2zZssBrt23bxqJFi8hms8TjcU/y6/79+wPvffvtt3Pbbbdx6623snLlSgA33tQNq1atcok6bG0WvUUvc6D815sIcyXK+Olw8QWtx7+OIIxnQYW9T/0qGGtdfPMEN9xwAx/84AcpFAosXbqUbDbLwoULAaeb5sjIyJTmHxkZIR6Pk8lkaDabfPvb3+YnP/mJu8mn02m3q+ghhxzCM5/5TD784Q9TKBQYHR1lw4YN/MM//AMAL33pS/mv//ovHnnkEQqFwrhxl5/97Gf86Ec/olar8dnPfpZ4PM66des488wz+e1vf8sdd9xBo9HgF7/4Bbfddhtnn322e+1nP/tZdu7cyZ49e7j22ms599xzATj66KO5++67+eMf/0ixWOTzn/986HMnEgm3I+mNN96I1trz3EHv7amnnsq+ffu4/vrrqdVqPPDAA9x4442etVn0Fr3MgTKv9yPIlSjo9SY+FYLqRsphCcdhgpJ+WVGWoOYQXvWqV3XkQYlqbsOGDTSbTU4//XROOeUUhoeHed/73gfAaaedxqZNmzj11FMnfe/nPOc5nH322ZxzzjmsW7eOL33pS5x33nk8/PDDgBMnSiaTnHTSSQwPD3PVVVcxOjrKC17wAs444wxisZhL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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_many_simulations(system, update_func1, 30)\n", - "plot_population(pop_series)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are highly variable: according to this model, the population might continue to decline over the next 10 years, or it might recover and grow rapidly!\n", - "\n", - "It's hard to say how seriously we should take this model. There are many factors that influence salmon populations that are not included in the model. For example, if the population starts to grow quickly, it might be limited by resource limits, predators, or fishing. If the population starts to fall, humans might restrict fishing and stock the river with farmed fish.\n", - "\n", - "So these results should probably not be considered useful predictions. However, there might be something useful we can do, which is to estimate the probability that the population will increase or decrease in the next 10 years. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Distribution of net changes\n", - "\n", - "To describe the distribution of net changes, write a function called `run_many_simulations` that runs many simulations, saves the final populations in a `ModSimSeries`, and returns the `ModSimSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def run_many_simulations(system, update_func, iters):\n", - " \"\"\"Runs simulations and report final populations.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " iters: number of simulations to run\n", - " \n", - " returns: series of final populations\n", - " \"\"\"\n", - " # FILL THIS IN" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def run_many_simulations(system, update_func, iters):\n", - " \"\"\"Runs simulations and report final populations.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " iters: number of simulations to run\n", - " \n", - " returns: series of final populations\n", - " \"\"\"\n", - " last_pops = ModSimSeries()\n", - " \n", - " for i in range(iters):\n", - " results = run_simulation(system, update_func)\n", - " last_pops[i] = get_last_value(results)\n", - " \n", - " return last_pops" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function by running it with `iters=5`." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    0892.723387
    199.036567
    2943.549004
    3290.634834
    41003.147033
    \n", - "
    " - ], - "text/plain": [ - "0 892.723387\n", - "1 99.036567\n", - "2 943.549004\n", - "3 290.634834\n", - "4 1003.147033\n", - "dtype: float64" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "run_many_simulations(system, update_func1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run 1000 simulations and describe the distribution of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 1000.000000\n", - "mean 1605.829424\n", - "std 2799.595802\n", - "min 13.400432\n", - "25% 306.557442\n", - "50% 748.584171\n", - "75% 1686.740121\n", - "max 47316.744869\n", - "dtype: float64" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "last_pops = run_many_simulations(system, update_func1, 1000)\n", - "last_pops.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we substract off the initial population, we get the distribution of changes." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 1000.000000\n", - "mean 404.829424\n", - "std 2799.595802\n", - "min -1187.599568\n", - "25% -894.442558\n", - "50% -452.415829\n", - "75% 485.740121\n", - "max 46115.744869\n", - "dtype: float64" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "net_changes = last_pops - p_0\n", - "net_changes.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The median is negative, which indicates that the population decreases more often than it increases.\n", - "\n", - "We can be more specific by counting the number of runs where `net_changes` is positive." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "348" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(net_changes > 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can use `mean` to compute the fraction of runs where `net_changes` is positive." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.348" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.mean(net_changes > 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the fraction where it's negative." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.652" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.mean(net_changes < 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So, based on observed past changes, this model predicts that the population is more likely to decrease than increase over the next 10 years, by about 2:1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## A refined model\n", - "\n", - "There are a few ways we could improve the model.\n", - "\n", - "1. It looks like there might be cyclic behavior in the past data, with a period of 4-5 years. We could extend the model to include this effect.\n", - "\n", - "2. Older data might not be as relevant for prediction as newer data, so we could give more weight to newer data.\n", - "\n", - "The second option is easier to implement, so let's try it.\n", - "\n", - "I'll use `linspace` to create an array of \"weights\" for the observed rates. The probability that I choose each rate will be proportional to these weights.\n", - "\n", - "The weights have to add up to 1, so I divide through by the total." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "weights = linspace(0, 1, len(rates))\n", - "weights /= sum(weights)\n", - "plot(weights)\n", - "decorate(xlabel='Index into the rates array',\n", - " ylabel='Weight')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll add the weights to the `System` object, since they are parameters of the model." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "system.weights = weights" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can pass these weights as a parameter to `np.random.choice` (see the [documentation](https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html))" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.3466728711028385" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.choice(system.rates, p=system.weights)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write an update function that takes the weights into account." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def update_func2(pop, t, system):\n", - " \"\"\"Simulate one time step.\n", - " \n", - " pop: population\n", - " t: time step\n", - " system: System object\n", - " \"\"\"\n", - " rate = np.random.choice(system.rates, p=system.weights)\n", - " pop += rate * pop\n", - " return pop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `plot_many_simulations` to plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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ffXVvOc97+Giiy7iuOOO49xzz+W+++5zt//hD3/gla98Jc94xjM4++yz+elPf+puO+OMM7jmmms444wzOOGEE/jQhz7k1rxdffXVvOMd73D3bWc13X777bzyla/kmc98JieddBJr1qyhXC5P+Nk++OCDXHjhhZx44om86EUv4sYbb3TPeeGFF/Lv//7vnHvuuTzjGc/g/PPP57HHHgvzX21pQdAXJMnA8xMkZq1uzOa2IIHqZPxJ8Lc7gnGBmm665d4Da0FNinv1Dv780DbKlc5bAol4lGcefSDHq6XTcr5rrrmG/v5+/vCHP5DNZnn961/PT3/6U8455xzWrl3Lww8/zJe+9KXAY3/yk59w22238eijj/LqV7+a5z3vefzgBz9g/fr1vPrVr+acc87hkEMOYfXq1Vx66aWceeaZ7Nixgze84Q1861vf4qKLLuLSSy/l+uuv5wc/+AEA//RP/0QymeT2228nl8vx7ne/m6985SusXr2ab37zm/zoRz/iO9/5DosWLeIDH/hA22u7/fbb+fSnP81//Md/cMMNN/D2t7+dn//852zdupWLL76YK664gr//+7/n7rvv5h3veAdLlizhhBNOAOCHP/wh119/PX19faxevZorrriCyy67LPTnunnzZj70oQ/xta99jRNPPJH169fzmte8hl/84he85CUvafnZ7tmzhze+8Y2sXr2a//qv/2Lt2rVcfPHFDA4OctZZZwHw/e9/n+uuu44lS5bwnve8h6uvvprPfe5zoddm8RIkOpFIJLRABVlQ8XjcjU3VarWux5+EVgI13e/tj7EJnRIoa0FNgvvW7uyKOAGUKzXuW7tzUsecf/75nHjiiZ6fW25xOkT19fXx4IMP8rOf/Yx6vc73v/99zjnnnFDnfetb30pPTw9Pe9rT6Onp4TWveQ19fX0cc8wxLF26lE2bNpFKpfjud7/LmWeeSS6XY+fOnSxatCiwPmfXrl3ceeedfOxjH6Ovr4+lS5eyevVqbr75ZgB+/OMfc8EFF7By5Ur6+vp473vf23Z9J510Ei972ctIJBK86U1vIplMctddd3HbbbfxrGc9izPPPJN4PM4pp5zC2Wefzf/8z/+4x77tbW/jkEMOYeHChbzzne/ktttuC/txA7BkyRJ+9KMfceKJJzI6OsqePXtYuHDhhHVJv/zlL1myZAlvetObSCQS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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "plot_many_simulations(system, update_func2, 30)\n", - "plot_population(pop_series)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `run_many_simulations` to collect the results and `describe` to summarize the distribution of net changes." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "count 1000.000000\n", - "mean 742.390577\n", - "std 3254.531642\n", - "min -1167.871448\n", - "25% -828.100752\n", - "50% -291.246535\n", - "75% 958.199207\n", - "max 35927.186006\n", - "dtype: float64" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "last_pops = run_many_simulations(system, update_func2, 1000)\n", - "net_changes = last_pops - p_0\n", - "net_changes.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Does the refined model have much effect on the probability of population decline?" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.582" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "np.mean(net_changes < 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extracting data from a PDF document\n", - "\n", - "The following section uses `tabula-py` to get data from a PDF document.\n", - "\n", - "If you don't already have it installed, and you are using Anaconda, you can install it by running the following command in a Terminal or Git Bash:\n", - "\n", - "```\n", - "conda install -c conda-forge tabula-py\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "from tabula import read_pdf" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Unnamed: 01 SW2SW3SWRepeatTotalHatcheryNatural
    019972781,4928361,8141,296518
    119983401,4773421,8621,146716
    219994021,1363261,567959608
    32000292535020847562285
    42001269804741,084833251
    52002437505223967832135
    620032331,185361,4271,238189
    720043191,26621241,6301,395235
    820053179450101,2721,019253
    920064421,007251,4561,167289
    102007299958311,261940321
    1120088121,75812232,6052,191414
    1220092432,06516162,3402,017323
    1320105521,0812161,6511,468183
    1420111,0843,05326154,1783,560618
    15201226879315941731210
    1620137852535611413198
    17201411033433450304146
    18201515076191921739182
    19201623238923626448178
    2020173636631321041806235
    \n", - "
    " - ], - "text/plain": [ - " Unnamed: 0 1 SW 2SW 3SW Repeat Total Hatchery Natural\n", - "0 1997 278 1,492 8 36 1,814 1,296 518\n", - "1 1998 340 1,477 3 42 1,862 1,146 716\n", - "2 1999 402 1,136 3 26 1,567 959 608\n", - "3 2000 292 535 0 20 847 562 285\n", - "4 2001 269 804 7 4 1,084 833 251\n", - "5 2002 437 505 2 23 967 832 135\n", - "6 2003 233 1,185 3 6 1,427 1,238 189\n", - "7 2004 319 1,266 21 24 1,630 1,395 235\n", - "8 2005 317 945 0 10 1,272 1,019 253\n", - "9 2006 442 1,007 2 5 1,456 1,167 289\n", - "10 2007 299 958 3 1 1,261 940 321\n", - "11 2008 812 1,758 12 23 2,605 2,191 414\n", - "12 2009 243 2,065 16 16 2,340 2,017 323\n", - "13 2010 552 1,081 2 16 1,651 1,468 183\n", - "14 2011 1,084 3,053 26 15 4,178 3,560 618\n", - "15 2012 26 879 31 5 941 731 210\n", - "16 2013 78 525 3 5 611 413 198\n", - "17 2014 110 334 3 3 450 304 146\n", - "18 2015 150 761 9 1 921 739 182\n", - "19 2016 232 389 2 3 626 448 178\n", - "20 2017 363 663 13 2 1041 806 235" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = read_pdf('data/USASAC2018-Report-30-2017-Activities-Page11.pdf')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/spiderman_soln.ipynb b/soln/spiderman_soln.ipynb deleted file mode 100644 index 3c037852..00000000 --- a/soln/spiderman_soln.ipynb +++ /dev/null @@ -1,1536 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study: Spider-Man\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "I'll start by getting the units we'll need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "radian" - ], - "text/latex": [ - "$\\mathrm{radian}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton\n", - "degree = UNITS.degree\n", - "radian = UNITS.radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Spider-Man" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case study we'll develop a model of Spider-Man swinging from a springy cable of webbing attached to the top of the Empire State Building. Initially, Spider-Man is at the top of a nearby building, as shown in this diagram.\n", - "\n", - "![](diagrams/spiderman.png)\n", - "\n", - "The origin, `O⃗`, is at the base of the Empire State Building. The vector `H⃗` represents the position where the webbing is attached to the building, relative to `O⃗`. The vector `P⃗` is the position of Spider-Man relative to `O⃗`. And `L⃗` is the vector from the attachment point to Spider-Man.\n", - "\n", - "By following the arrows from `O⃗`, along `H⃗`, and along `L⃗`, we can see that \n", - "\n", - "`H⃗ + L⃗ = P⃗`\n", - "\n", - "So we can compute `L⃗` like this:\n", - "\n", - "`L⃗ = P⃗ - H⃗`\n", - "\n", - "The goals of this case study are:\n", - "\n", - "1. Implement a model of this scenario to predict Spider-Man's trajectory.\n", - "\n", - "2. Choose the right time for Spider-Man to let go of the webbing in order to maximize the distance he travels before landing.\n", - "\n", - "3. Choose the best angle for Spider-Man to jump off the building, and let go of the webbing, to maximize range." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll create a `Params` object to contain the quantities we'll need:\n", - "\n", - "1. According to [the Spider-Man Wiki](http://spiderman.wikia.com/wiki/Peter_Parker_%28Earth-616%29), Spider-Man weighs 76 kg.\n", - "\n", - "2. Let's assume his terminal velocity is 60 m/s.\n", - "\n", - "3. The length of the web is 100 m.\n", - "\n", - "4. The initial angle of the web is 45 degrees to the left of straight down.\n", - "\n", - "5. The spring constant of the web is 40 N / m when the cord is stretched, and 0 when it's compressed.\n", - "\n", - "Here's a `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    g9.8 meter / second ** 2
    mass75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    length100 meter
    angle225 degree
    k40.0 newton / meter
    t_00 second
    t_end30 second
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "length 100 meter\n", - "angle 225 degree\n", - "k 40.0 newton / meter\n", - "t_0 0 second\n", - "t_end 30 second\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(height = 381 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 75 * kg,\n", - " area = 1 * m**2,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 60 * m / s,\n", - " length = 100 * m,\n", - " angle = (270 - 45) * degree,\n", - " k = 40 * N / m,\n", - " t_0 = 0 * s,\n", - " t_end = 30 * s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the initial position" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_condition(params):\n", - " \"\"\"Compute the initial position and velocity.\n", - " \n", - " params: Params object\n", - " \"\"\"\n", - " height, length, angle = params.height, params.length, params.angle\n", - " \n", - " H⃗ = Vector(0, height)\n", - " theta = angle.to(radian)\n", - " x, y = pol2cart(theta, length)\n", - " L⃗ = Vector(x, y)\n", - " P⃗ = H⃗ + L⃗\n", - " V⃗ = Vector(0, 0) * m/s\n", - " \n", - " return State(P⃗=P⃗, V⃗=V⃗)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    P⃗[-70.71067811865477 meter, 310.28932188134524 ...
    V⃗[0.0 meter / second, 0.0 meter / second]
    \n", - "
    " - ], - "text/plain": [ - "P⃗ [-70.71067811865477 meter, 310.28932188134524 ...\n", - "V⃗ [0.0 meter / second, 0.0 meter / second]\n", - "dtype: object" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "initial_condition(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now here's a version of `make_system` that takes a `Params` object as a parameter.\n", - "\n", - "`make_system` uses the given value of `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = initial_condition(params)\n", - " \n", - " mass, g = params.mass, params.g\n", - " rho, area, v_term = params.rho, params.area, params.v_term\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " \n", - " return System(params, init=init, C_d=C_d)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    g9.8 meter / second ** 2
    mass75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    length100 meter
    angle225 degree
    k40.0 newton / meter
    t_00 second
    t_end30 second
    initP⃗ [-70.71067811865477 meter, 310.289321881...
    C_d0.3402777777777778 dimensionless
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "length 100 meter\n", - "angle 225 degree\n", - "k 40.0 newton / meter\n", - "t_0 0 second\n", - "t_end 30 second\n", - "init P⃗ [-70.71067811865477 meter, 310.289321881...\n", - "C_d 0.3402777777777778 dimensionless\n", - "dtype: object" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    P⃗[-70.71067811865477 meter, 310.28932188134524 ...
    V⃗[0.0 meter / second, 0.0 meter / second]
    \n", - "
    " - ], - "text/plain": [ - "P⃗ [-70.71067811865477 meter, 310.28932188134524 ...\n", - "V⃗ [0.0 meter / second, 0.0 meter / second]\n", - "dtype: object" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Drag and spring forces\n", - "\n", - "Here's drag force, as we saw in Chapter 22." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V⃗, system):\n", - " \"\"\"Compute drag force.\n", - " \n", - " V⃗: velocity Vector\n", - " system: `System` object\n", - " \n", - " returns: force Vector\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V⃗.mag**2 * C_d * area / 2\n", - " direction = -V⃗.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}10.0 & 10.0\\end{pmatrix} meter/second\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}10.0 & 10.0\\end{pmatrix}\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "array([10., 10.]) " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "V⃗_test = Vector(10, 10) * m/s" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-28.873526898450695 & -28.873526898450695\\end{pmatrix} kilogram meter/second2\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-28.873526898450695 & -28.873526898450695\\end{pmatrix}\\ \\frac{\\mathrm{kilogram} \\cdot \\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "array([-28.8735269, -28.8735269]) " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drag_force(V⃗_test, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the 2-D version of spring force. We saw the 1-D version in Chapter 21." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def spring_force(L⃗, system):\n", - " \"\"\"Compute drag force.\n", - " \n", - " L⃗: Vector representing the webbing\n", - " system: System object\n", - " \n", - " returns: force Vector\n", - " \"\"\"\n", - " extension = L⃗.mag - system.length\n", - " if magnitude(extension) < 0:\n", - " mag = 0\n", - " else:\n", - " mag = system.k * extension\n", - " \n", - " direction = -L⃗.hat()\n", - " f_spring = direction * mag\n", - " return f_spring" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}0 & -101\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}0 & -101\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([ 0, -101]) " - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "L⃗_test = Vector(0, -system.length-1*m)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-0.0 & 40.0\\end{pmatrix} newton\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-0.0 & 40.0\\end{pmatrix}\\ \\mathrm{newton}$" - ], - "text/plain": [ - "array([-0., 40.]) " - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f_spring = spring_force(L⃗_test, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function, including acceleration due to gravity, drag, and the spring force of the webbing." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " P⃗, V⃗ = state\n", - " g, mass = system.g, system.mass\n", - " \n", - " H⃗ = Vector(0, system.height)\n", - " L⃗ = P⃗ - H⃗\n", - " \n", - " a_grav = Vector(0, -g)\n", - " a_spring = spring_force(L⃗, system) / mass\n", - " a_drag = drag_force(V⃗, system) / mass\n", - " \n", - " A⃗ = a_grav + a_drag + a_spring\n", - " \n", - " return V⃗, A⃗" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([0., 0.]) ,\n", - " array([ 5.35924893e-15, -9.80000000e+00]) )" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the results\n", - "\n", - "We can extract the x and y components as `Series` objects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The simplest way to visualize the results is to plot x and y as functions of time." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(P⃗):\n", - " x = P⃗.extract('x')\n", - " y = P⃗.extract('y')\n", - " plot(x, label='x')\n", - " plot(y, label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results.P⃗)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the velocities the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(V⃗):\n", - " vx = V⃗.extract('x')\n", - " vy = V⃗.extract('y')\n", - " plot(vx, label='vx')\n", - " plot(vy, label='vy')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results.V⃗)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to visualize the results is to plot y versus x. The result is the trajectory through the plane of motion." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_trajectory(P⃗, **options):\n", - " x = P⃗.extract('x')\n", - " y = P⃗.extract('y')\n", - " plot(x, y, **options)\n", - " \n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - " \n", - "plot_trajectory(results.P⃗, label='trajectory')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Letting go\n", - "\n", - "Now let's find the optimal time for Spider-Man to let go. We have to run the simulation in two phases because the spring force changes abruptly when Spider-Man lets go, so we can't integrate through it.\n", - "\n", - "Here are the parameters for Phase 1, running for 9 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "params1 = Params(params, t_end=9*s)\n", - "system1 = make_system(params1)\n", - "results1, details1 = run_ode_solver(system1, slope_func)\n", - "plot_trajectory(results1.P⃗, label='Phase 1')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final conditions from Phase 1 are the initial conditions for Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.999999999999991 second" - ], - "text/latex": [ - "$8.999999999999991\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.999999999999991 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_final = get_last_label(results1) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the position Vector." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}42.09220704823149 & 273.0520143333356\\end{pmatrix} meter\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}42.09220704823149 & 273.0520143333356\\end{pmatrix}\\ \\mathrm{meter}$" - ], - "text/plain": [ - "array([ 42.09220705, 273.05201433]) " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = results1.last_row()\n", - "init.P⃗" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the velocity Vector." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}14.625507683978038 & 7.937765075110924\\end{pmatrix} meter/second\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}14.625507683978038 & 7.937765075110924\\end{pmatrix}\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "array([14.62550768, 7.93776508]) " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init.V⃗" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here is the `System` for Phase 2. We can turn off the spring force by setting `k=0`, so we don't have to write a new slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    height381 meter
    g9.8 meter / second ** 2
    mass75 kilogram
    area1 meter ** 2
    rho1.2 kilogram / meter ** 3
    v_term60.0 meter / second
    length100 meter
    angle225 degree
    k0.0 newton / meter
    t_08.999999999999991 second
    t_end18.999999999999993 second
    initP⃗ [42.09220704823149 meter, 273.0520143333...
    C_d0.3402777777777778 dimensionless
    \n", - "
    " - ], - "text/plain": [ - "height 381 meter\n", - "g 9.8 meter / second ** 2\n", - "mass 75 kilogram\n", - "area 1 meter ** 2\n", - "rho 1.2 kilogram / meter ** 3\n", - "v_term 60.0 meter / second\n", - "length 100 meter\n", - "angle 225 degree\n", - "k 0.0 newton / meter\n", - "t_0 8.999999999999991 second\n", - "t_end 18.999999999999993 second\n", - "init P⃗ [42.09220704823149 meter, 273.0520143333...\n", - "C_d 0.3402777777777778 dimensionless\n", - "dtype: object" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system2 = System(system1, t_0=t_final, t_end=t_final+10*s, init=init, k=0*N/m)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops the simulation when Spider-Man reaches the ground." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stops when y=0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: height\n", - " \"\"\"\n", - " P⃗, V⃗ = state\n", - " return P⃗.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details2 = run_ode_solver(system2, slope_func, events=event_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_trajectory(results1.P⃗, label='Phase 1')\n", - "plot_trajectory(results2.P⃗, label='Phase 2')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can gather all that into a function that takes `t_release` and `V_0`, runs both phases, and returns the results." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "def run_two_phase(t_release, V⃗_0, params):\n", - " \"\"\"Run both phases.\n", - " \n", - " t_release: time when Spider-Man lets go of the webbing\n", - " V_0: initial velocity\n", - " \"\"\"\n", - " params1 = Params(params, t_end=t_release, V⃗_0=V⃗_0)\n", - " system1 = make_system(params1)\n", - " results1, details1 = run_ode_solver(system1, slope_func)\n", - "\n", - " t_0 = get_last_label(results1) * s\n", - " t_end = t_0 + 10 * s\n", - " init = results1.last_row()\n", - "\n", - " system2 = System(system1, t_0=t_0, t_end=t_end, init=init, k=0*N/m)\n", - " results2, details2 = run_ode_solver(system2, slope_func, events=event_func)\n", - "\n", - " results = results1.combine_first(results2)\n", - " return TimeFrame(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's a test run." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "143.42923899746137 meter" - ], - "text/latex": [ - "$143.42923899746137\\ \\mathrm{meter}$" - ], - "text/plain": [ - "143.42923899746137 " - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "t_release = 9 * s\n", - "V⃗_0 = Vector(0, 0) * m/s\n", - "\n", - "results = run_two_phase(t_release, V⃗_0, params)\n", - "plot_trajectory(results.P⃗)\n", - "x_final = results.P⃗.last_value().x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "Here's a draw function we can use to animate the results." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.P⃗.extract('x')\n", - "ys = results.P⃗.extract('y')\n", - "\n", - "def draw_func(state, t):\n", - " set_xlim(xs)\n", - " set_ylim(ys)\n", - " x, y = state.P⃗\n", - " plot(x, y, 'bo')\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Maximizing range\n", - "\n", - "To find the best value of `t_release`, we need a function that takes possible values, runs the simulation, and returns the range." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def range_func(t_release, params):\n", - " \"\"\"Compute the final value of x.\n", - " \n", - " t_release: time to release web\n", - " params: Params object\n", - " \"\"\"\n", - " V_0 = Vector(0, 0) * m/s\n", - " results = run_two_phase(t_release, V_0, params)\n", - " x_final = results.P⃗.last_value().x\n", - " print(t_release, x_final)\n", - " return x_final" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "range_func(9*s, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run it for a few values." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for t_release in linrange(3, 15, 3) * s:\n", - " range_func(t_release, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use `maximize_scalar` to find the optimum." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bounds = [6, 12] * s\n", - "res = maximize_golden(range_func, bounds, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we can run the simulation with the optimal value." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_time = res.x\n", - "V⃗_0 = Vector(0, 0) * m/s\n", - "results = run_two_phase(best_time, V⃗_0, params)\n", - "plot_trajectory(results.P⃗)\n", - "x_final = results.P⃗.last_value().x" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_deg2rad.ipynb b/soln/test_deg2rad.ipynb deleted file mode 100644 index c5e6e148..00000000 --- a/soln/test_deg2rad.ipynb +++ /dev/null @@ -1,146 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from pint import UnitRegistry\n", - "ureg = UnitRegistry()\n", - "Q_ = ureg.Quantity" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.7853981633974483" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle = 45\n", - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.7853981633974483 radian" - ], - "text/latex": [ - "$0.7853981633974483\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.7853981633974483 " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle = 45 * ureg.degree\n", - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.785 radian" - ], - "text/latex": [ - "$0.785\\ \\mathrm{radian}$" - ], - "text/plain": [ - "0.785 " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle = 0.785 * ureg.radian\n", - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "45.0 radian" - ], - "text/latex": [ - "$45.0\\ \\mathrm{radian}$" - ], - "text/plain": [ - "45.0 " - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "angle = 45 * ureg.dimensionless\n", - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_ediff1d.ipynb b/soln/test_ediff1d.ipynb deleted file mode 100644 index ce852ea6..00000000 --- a/soln/test_ediff1d.ipynb +++ /dev/null @@ -1,87 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "cannot convert float NaN to integer", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mediff1d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/numpy/lib/arraysetops.py\u001b[0m in \u001b[0;36mediff1d\u001b[0;34m(ary, to_end, to_begin)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0ml_end\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0m_to_end\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masanyarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mto_end\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype_req\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 119\u001b[0m \u001b[0;31m# check that casting has not overflowed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 120\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_to_end\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mto_end\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/ModSimPy/lib/python3.7/site-packages/numpy/core/numeric.py\u001b[0m in \u001b[0;36masanyarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m 589\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 590\u001b[0m \"\"\"\n\u001b[0;32m--> 591\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msubok\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 592\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 593\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: cannot convert float NaN to integer" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "a = np.array([1, 2, 3])\n", - "np.ediff1d(a, np.nan)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "cannot convert float NaN to integer", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: cannot convert float NaN to integer" - ] - } - ], - "source": [ - "a[2] = np.nan\n", - "a" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_euler.ipynb b/soln/test_euler.ipynb deleted file mode 100644 index 1b8197c8..00000000 --- a/soln/test_euler.ipynb +++ /dev/null @@ -1,3610 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Experiments with different ODE solvers\n", - "\n", - "Copyright 2019 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    inity 2\n", - "dtype: int64
    t_01
    t_end3
    \n", - "
    " - ], - "text/plain": [ - "init y 2\n", - "dtype: int64\n", - "t_0 1\n", - "t_end 3\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(y = 2)\n", - "system = System(init=init, t_0=1, t_end=3)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " [y] = state\n", - " dydt = y + t\n", - " return [dydt]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_euler(system, slope_func)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "24.973714732487576" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_last_value(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Glucose minimal model\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1e-05" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "G0 = 290\n", - "k1 = 0.03\n", - "k2 = 0.02\n", - "k3 = 1e-05" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To estimate basal levels, we'll use the concentrations at `t=0`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "11" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Gb = data.glucose[0]\n", - "Ib = data.insulin[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create the initial condtions." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G290
    X0
    \n", - "
    " - ], - "text/plain": [ - "G 290\n", - "X 0\n", - "dtype: int64" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(G=G0, X=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make the `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "182" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    G0290
    k10.03
    k20.02
    k31e-05
    initG 290\n", - "X 0\n", - "dtype: int64
    Gb92
    Ib11
    I<scipy.interpolate.interpolate.interp1d object...
    t_00
    t_end182
    dt2
    \n", - "
    " - ], - "text/plain": [ - "G0 290\n", - "k1 0.03\n", - "k2 0.02\n", - "k3 1e-05\n", - "init G 290\n", - "X 0\n", - "dtype: int64\n", - "Gb 92\n", - "Ib 11\n", - "I \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    02900
    2278.120
    4266.9530.0003
    6256.2950.002668
    8245.070.00404128
    10233.9050.00467963
    12223.2020.00525244
    14212.9850.00572235
    16203.2880.00609345
    18194.1330.00632971
    20185.5480.00648986
    22177.5270.00661026
    24170.0480.00672585
    26163.0780.00681282
    28156.5910.00687231
    30150.5630.00692941
    32144.9630.00700824
    34139.7530.00710791
    36134.9010.00717159
    38130.3920.00720073
    40126.2110.0071967
    42122.3420.00716083
    44118.7690.0070944
    46115.4780.00700262
    48112.4520.00688652
    50109.6760.00674706
    52107.1350.00658517
    54104.8160.00640177
    56102.7050.0062257
    58100.7840.00605667
    .........
    12486.39070.00109474
    12686.53810.000972951
    12886.69740.000858033
    13086.86680.000749712
    13287.04450.000647723
    13487.22910.000551815
    13687.41910.000461742
    13887.61320.000377272
    14087.81030.000298181
    14288.00930.000224254
    14488.20930.000155284
    14688.40938.90726e-05
    14888.6092.55097e-05
    15088.808-3.55107e-05
    15289.0058-9.40903e-05
    15489.2022-0.000150327
    15689.3969-0.000204314
    15889.5896-0.000256141
    16089.7801-0.000305895
    16289.9682-0.00035366
    16490.1538-0.000399513
    16690.3366-0.000445533
    16890.5169-0.000491711
    17090.6949-0.000538043
    17290.8708-0.000584521
    17491.0448-0.00063114
    17691.217-0.000677895
    17891.3877-0.000724779
    18091.5569-0.000771788
    18291.7248-0.000818916
    \n", - "

    92 rows × 2 columns

    \n", - "" - ], - "text/plain": [ - " G X\n", - "0 290 0\n", - "2 278.12 0\n", - "4 266.953 0.0003\n", - "6 256.295 0.002668\n", - "8 245.07 0.00404128\n", - "10 233.905 0.00467963\n", - "12 223.202 0.00525244\n", - "14 212.985 0.00572235\n", - "16 203.288 0.00609345\n", - "18 194.133 0.00632971\n", - "20 185.548 0.00648986\n", - "22 177.527 0.00661026\n", - "24 170.048 0.00672585\n", - "26 163.078 0.00681282\n", - "28 156.591 0.00687231\n", - "30 150.563 0.00692941\n", - "32 144.963 0.00700824\n", - "34 139.753 0.00710791\n", - "36 134.901 0.00717159\n", - "38 130.392 0.00720073\n", - "40 126.211 0.0071967\n", - "42 122.342 0.00716083\n", - "44 118.769 0.0070944\n", - "46 115.478 0.00700262\n", - "48 112.452 0.00688652\n", - "50 109.676 0.00674706\n", - "52 107.135 0.00658517\n", - "54 104.816 0.00640177\n", - "56 102.705 0.0062257\n", - "58 100.784 0.00605667\n", - ".. ... ...\n", - "124 86.3907 0.00109474\n", - "126 86.5381 0.000972951\n", - "128 86.6974 0.000858033\n", - "130 86.8668 0.000749712\n", - "132 87.0445 0.000647723\n", - "134 87.2291 0.000551815\n", - "136 87.4191 0.000461742\n", - "138 87.6132 0.000377272\n", - "140 87.8103 0.000298181\n", - "142 88.0093 0.000224254\n", - "144 88.2093 0.000155284\n", - "146 88.4093 8.90726e-05\n", - "148 88.609 2.55097e-05\n", - "150 88.808 -3.55107e-05\n", - "152 89.0058 -9.40903e-05\n", - "154 89.2022 -0.000150327\n", - "156 89.3969 -0.000204314\n", - "158 89.5896 -0.000256141\n", - "160 89.7801 -0.000305895\n", - "162 89.9682 -0.00035366\n", - "164 90.1538 -0.000399513\n", - "166 90.3366 -0.000445533\n", - "168 90.5169 -0.000491711\n", - "170 90.6949 -0.000538043\n", - "172 90.8708 -0.000584521\n", - "174 91.0448 -0.00063114\n", - "176 91.217 -0.000677895\n", - "178 91.3877 -0.000724779\n", - "180 91.5569 -0.000771788\n", - "182 91.7248 -0.000818916\n", - "\n", - "[92 rows x 2 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Numerical solution\n", - "\n", - "In the previous chapter, we approximated the differential equations with difference equations, and solved them using `run_simulation`.\n", - "\n", - "In this chapter, we solve the differential equation numerically using `run_euler`...\n", - "\n", - "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations. We don't have to do the update part; the solver does it for us." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: derivatives of G and X\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-5.9399999999999995, 0.0)" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run the ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 276 ms, sys: 368 µs, total: 277 ms\n", - "Wall time: 274 ms\n" - ] - } - ], - "source": [ - "system = System(G0=G0, k1=k1, k2=k2, k3=k3,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=1)\n", - "\n", - "%time results2, details = run_euler(system, slope_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    GX
    02900
    1284.060
    2278.2987.5e-05
    3272.6880.0002235
    4267.2070.00088903
    5261.7130.00206125
    6256.0820.00298502
    7250.3950.00366532
    8244.7260.00416202
    9239.1250.00447878
    10233.6410.0047792
    11228.2750.00506362
    12223.0310.00532235
    13217.9130.0055559
    14212.9250.00576478
    15208.0690.00594948
    16203.3490.0061005
    17198.7680.00621849
    18194.3290.00631745
    19190.0320.00639777
    20185.8750.00645981
    21181.8580.00652061
    22177.9760.0065802
    23174.2260.0066386
    24170.6030.00668983
    25167.1030.00673403
    26163.7250.00677135
    27160.4650.00680192
    28157.3190.00682588
    29154.2860.00685537
    .........
    15389.2245-0.000116549
    15489.3181-0.000144218
    15589.4115-0.000171334
    15689.5045-0.000197907
    15789.597-0.000223949
    15889.6892-0.00024947
    15989.7809-0.000274481
    16089.8721-0.000298991
    16189.9628-0.000323011
    16290.053-0.000346551
    16390.1426-0.00036962
    16490.2316-0.000392728
    16590.3201-0.000415873
    16690.4081-0.000439056
    16790.4955-0.000462274
    16890.5825-0.000485529
    16990.669-0.000508818
    17090.7551-0.000532142
    17190.8407-0.000555499
    17290.926-0.000578889
    17391.0108-0.000602311
    17491.0953-0.000625765
    17591.1795-0.00064925
    17691.2633-0.000672765
    17791.3468-0.00069631
    17891.43-0.000719883
    17991.5129-0.000743486
    18091.5955-0.000767116
    18191.6779-0.000790774
    18291.7601-0.000814458
    \n", - "

    183 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " G X\n", - "0 290 0\n", - "1 284.06 0\n", - "2 278.298 7.5e-05\n", - "3 272.688 0.0002235\n", - "4 267.207 0.00088903\n", - "5 261.713 0.00206125\n", - "6 256.082 0.00298502\n", - "7 250.395 0.00366532\n", - "8 244.726 0.00416202\n", - "9 239.125 0.00447878\n", - "10 233.641 0.0047792\n", - "11 228.275 0.00506362\n", - "12 223.031 0.00532235\n", - "13 217.913 0.0055559\n", - "14 212.925 0.00576478\n", - "15 208.069 0.00594948\n", - "16 203.349 0.0061005\n", - "17 198.768 0.00621849\n", - "18 194.329 0.00631745\n", - "19 190.032 0.00639777\n", - "20 185.875 0.00645981\n", - "21 181.858 0.00652061\n", - "22 177.976 0.0065802\n", - "23 174.226 0.0066386\n", - "24 170.603 0.00668983\n", - "25 167.103 0.00673403\n", - "26 163.725 0.00677135\n", - "27 160.465 0.00680192\n", - "28 157.319 0.00682588\n", - "29 154.286 0.00685537\n", - ".. ... ...\n", - "153 89.2245 -0.000116549\n", - "154 89.3181 -0.000144218\n", - "155 89.4115 -0.000171334\n", - "156 89.5045 -0.000197907\n", - "157 89.597 -0.000223949\n", - "158 89.6892 -0.00024947\n", - "159 89.7809 -0.000274481\n", - "160 89.8721 -0.000298991\n", - "161 89.9628 -0.000323011\n", - "162 90.053 -0.000346551\n", - "163 90.1426 -0.00036962\n", - "164 90.2316 -0.000392728\n", - "165 90.3201 -0.000415873\n", - "166 90.4081 -0.000439056\n", - "167 90.4955 -0.000462274\n", - "168 90.5825 -0.000485529\n", - "169 90.669 -0.000508818\n", - "170 90.7551 -0.000532142\n", - "171 90.8407 -0.000555499\n", - "172 90.926 -0.000578889\n", - "173 91.0108 -0.000602311\n", - "174 91.0953 -0.000625765\n", - "175 91.1795 -0.00064925\n", - "176 91.2633 -0.000672765\n", - "177 91.3468 -0.00069631\n", - "178 91.43 -0.000719883\n", - "179 91.5129 -0.000743486\n", - "180 91.5955 -0.000767116\n", - "181 91.6779 -0.000790774\n", - "182 91.7601 -0.000814458\n", - "\n", - "[183 rows x 2 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the results from `run_simulation` and `run_euler`, we can see that they are not very different." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.G, '-')\n", - "plot(results2.G, '-')\n", - "plot(data.glucose, 'bo')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The differences in `G` are less than 1%." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.970403647921524" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "\n", - "max(abs(percent_diff.dropna()))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dropping pennies\n", - "\n", - "I'll start by getting the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And defining the initial state." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    y381 meter
    v0.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "y 381 meter\n", - "v 0.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "init = State(y=381 * m, \n", - " v=0 * m/s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Acceleration due to gravity is about 9.8 m / s$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "9.8 meter/second2" - ], - "text/latex": [ - "$9.8\\ \\frac{\\mathrm{meter}}{\\mathrm{second}^{2}}$" - ], - "text/plain": [ - "9.8 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "g = 9.8 * m/s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When we call `odeint`, we need an array of timestamps where we want to compute the solution.\n", - "\n", - "I'll start with a duration of 10 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "10 second" - ], - "text/latex": [ - "$10\\ \\mathrm{second}$" - ], - "text/plain": [ - "10 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_end = 10 * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    inity 381 meter\n", - "v 0.0 meter / secon...
    g9.8 meter / second ** 2
    t_end10 second
    \n", - "
    " - ], - "text/plain": [ - "init y 381 meter\n", - "v 0.0 meter / secon...\n", - "g 9.8 meter / second ** 2\n", - "t_end 10 second\n", - "dtype: object" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = System(init=init, g=g, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And define the slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `g`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " g = system.g \n", - "\n", - " dydt = v\n", - " dvdt = -g\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's always a good idea to test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0 meter / second\n", - "-9.8 meter / second ** 2\n" - ] - } - ], - "source": [ - "dydt, dvdt = slope_func(system.init, 0, system)\n", - "print(dydt)\n", - "print(dvdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to call `run_euler`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Success'" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.set(dt=0.1*s)\n", - "results, details = run_euler(system, slope_func, max_step=0.5)\n", - "details.message" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.0381 meter0.0 meter / second
    0.1381.0 meter-0.9800000000000001 meter / second
    0.2380.902 meter-1.9600000000000002 meter / second
    0.3380.70599999999996 meter-2.9400000000000004 meter / second
    0.4380.412 meter-3.9200000000000004 meter / second
    0.5380.02 meter-4.9 meter / second
    0.6379.53 meter-5.880000000000001 meter / second
    0.7378.94199999999995 meter-6.860000000000001 meter / second
    0.8378.256 meter-7.840000000000002 meter / second
    0.9377.472 meter-8.820000000000002 meter / second
    1.0376.59 meter-9.800000000000002 meter / second
    1.1375.60999999999996 meter-10.780000000000003 meter / second
    1.2374.532 meter-11.760000000000003 meter / second
    1.3373.356 meter-12.740000000000004 meter / second
    1.4372.082 meter-13.720000000000004 meter / second
    1.5370.71 meter-14.700000000000005 meter / second
    1.6369.23999999999995 meter-15.680000000000005 meter / second
    1.7367.67199999999997 meter-16.660000000000004 meter / second
    1.8366.006 meter-17.640000000000004 meter / second
    1.9364.24199999999996 meter-18.620000000000005 meter / second
    2.0362.37999999999994 meter-19.600000000000005 meter / second
    2.1360.41999999999996 meter-20.580000000000005 meter / second
    2.2358.36199999999997 meter-21.560000000000006 meter / second
    2.3356.20599999999996 meter-22.540000000000006 meter / second
    2.4353.95199999999994 meter-23.520000000000007 meter / second
    2.5351.59999999999997 meter-24.500000000000007 meter / second
    2.6349.15 meter-25.480000000000008 meter / second
    2.7346.602 meter-26.460000000000008 meter / second
    2.8343.95599999999996 meter-27.44000000000001 meter / second
    2.9341.21199999999993 meter-28.42000000000001 meter / second
    .........
    7.1137.4700000000001 meter-69.57999999999993 meter / second
    7.2130.5120000000001 meter-70.55999999999993 meter / second
    7.3123.45600000000012 meter-71.53999999999994 meter / second
    7.4116.30200000000012 meter-72.51999999999994 meter / second
    7.5109.05000000000013 meter-73.49999999999994 meter / second
    7.6101.70000000000013 meter-74.47999999999995 meter / second
    7.794.25200000000014 meter-75.45999999999995 meter / second
    7.886.70600000000015 meter-76.43999999999996 meter / second
    7.979.06200000000015 meter-77.41999999999996 meter / second
    8.071.32000000000016 meter-78.39999999999996 meter / second
    8.163.48000000000017 meter-79.37999999999997 meter / second
    8.255.54200000000017 meter-80.35999999999997 meter / second
    8.347.50600000000017 meter-81.33999999999997 meter / second
    8.439.37200000000017 meter-82.31999999999998 meter / second
    8.531.14000000000017 meter-83.29999999999998 meter / second
    8.622.810000000000173 meter-84.27999999999999 meter / second
    8.714.382000000000174 meter-85.25999999999999 meter / second
    8.85.856000000000174 meter-86.24 meter / second
    8.9-2.7679999999998266 meter-87.22 meter / second
    9.0-11.489999999999826 meter-88.2 meter / second
    9.1-20.309999999999825 meter-89.18 meter / second
    9.2-29.227999999999824 meter-90.16000000000001 meter / second
    9.3-38.24399999999983 meter-91.14000000000001 meter / second
    9.4-47.357999999999834 meter-92.12000000000002 meter / second
    9.5-56.56999999999984 meter-93.10000000000002 meter / second
    9.6-65.87999999999984 meter-94.08000000000003 meter / second
    9.7-75.28799999999984 meter-95.06000000000003 meter / second
    9.8-84.79399999999984 meter-96.04000000000003 meter / second
    9.9-94.39799999999984 meter-97.02000000000004 meter / second
    10.0-104.09999999999985 meter-98.00000000000004 meter / second
    \n", - "

    101 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.0 381 meter 0.0 meter / second\n", - "0.1 381.0 meter -0.9800000000000001 meter / second\n", - "0.2 380.902 meter -1.9600000000000002 meter / second\n", - "0.3 380.70599999999996 meter -2.9400000000000004 meter / second\n", - "0.4 380.412 meter -3.9200000000000004 meter / second\n", - "0.5 380.02 meter -4.9 meter / second\n", - "0.6 379.53 meter -5.880000000000001 meter / second\n", - "0.7 378.94199999999995 meter -6.860000000000001 meter / second\n", - "0.8 378.256 meter -7.840000000000002 meter / second\n", - "0.9 377.472 meter -8.820000000000002 meter / second\n", - "1.0 376.59 meter -9.800000000000002 meter / second\n", - "1.1 375.60999999999996 meter -10.780000000000003 meter / second\n", - "1.2 374.532 meter -11.760000000000003 meter / second\n", - "1.3 373.356 meter -12.740000000000004 meter / second\n", - "1.4 372.082 meter -13.720000000000004 meter / second\n", - "1.5 370.71 meter -14.700000000000005 meter / second\n", - "1.6 369.23999999999995 meter -15.680000000000005 meter / second\n", - "1.7 367.67199999999997 meter -16.660000000000004 meter / second\n", - "1.8 366.006 meter -17.640000000000004 meter / second\n", - "1.9 364.24199999999996 meter -18.620000000000005 meter / second\n", - "2.0 362.37999999999994 meter -19.600000000000005 meter / second\n", - "2.1 360.41999999999996 meter -20.580000000000005 meter / second\n", - "2.2 358.36199999999997 meter -21.560000000000006 meter / second\n", - "2.3 356.20599999999996 meter -22.540000000000006 meter / second\n", - "2.4 353.95199999999994 meter -23.520000000000007 meter / second\n", - "2.5 351.59999999999997 meter -24.500000000000007 meter / second\n", - "2.6 349.15 meter -25.480000000000008 meter / second\n", - "2.7 346.602 meter -26.460000000000008 meter / second\n", - "2.8 343.95599999999996 meter -27.44000000000001 meter / second\n", - "2.9 341.21199999999993 meter -28.42000000000001 meter / second\n", - "... ... ...\n", - "7.1 137.4700000000001 meter -69.57999999999993 meter / second\n", - "7.2 130.5120000000001 meter -70.55999999999993 meter / second\n", - "7.3 123.45600000000012 meter -71.53999999999994 meter / second\n", - "7.4 116.30200000000012 meter -72.51999999999994 meter / second\n", - "7.5 109.05000000000013 meter -73.49999999999994 meter / second\n", - "7.6 101.70000000000013 meter -74.47999999999995 meter / second\n", - "7.7 94.25200000000014 meter -75.45999999999995 meter / second\n", - "7.8 86.70600000000015 meter -76.43999999999996 meter / second\n", - "7.9 79.06200000000015 meter -77.41999999999996 meter / second\n", - "8.0 71.32000000000016 meter -78.39999999999996 meter / second\n", - "8.1 63.48000000000017 meter -79.37999999999997 meter / second\n", - "8.2 55.54200000000017 meter -80.35999999999997 meter / second\n", - "8.3 47.50600000000017 meter -81.33999999999997 meter / second\n", - "8.4 39.37200000000017 meter -82.31999999999998 meter / second\n", - "8.5 31.14000000000017 meter -83.29999999999998 meter / second\n", - "8.6 22.810000000000173 meter -84.27999999999999 meter / second\n", - "8.7 14.382000000000174 meter -85.25999999999999 meter / second\n", - "8.8 5.856000000000174 meter -86.24 meter / second\n", - "8.9 -2.7679999999998266 meter -87.22 meter / second\n", - "9.0 -11.489999999999826 meter -88.2 meter / second\n", - "9.1 -20.309999999999825 meter -89.18 meter / second\n", - "9.2 -29.227999999999824 meter -90.16000000000001 meter / second\n", - "9.3 -38.24399999999983 meter -91.14000000000001 meter / second\n", - "9.4 -47.357999999999834 meter -92.12000000000002 meter / second\n", - "9.5 -56.56999999999984 meter -93.10000000000002 meter / second\n", - "9.6 -65.87999999999984 meter -94.08000000000003 meter / second\n", - "9.7 -75.28799999999984 meter -95.06000000000003 meter / second\n", - "9.8 -84.79399999999984 meter -96.04000000000003 meter / second\n", - "9.9 -94.39799999999984 meter -97.02000000000004 meter / second\n", - "10.0 -104.09999999999985 meter -98.00000000000004 meter / second\n", - "\n", - "[101 rows x 2 columns]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "def crossings(series, value):\n", - " \"\"\"Find the labels where the series passes through value.\n", - "\n", - " The labels in series must be increasing numerical values.\n", - "\n", - " series: Series\n", - " value: number\n", - "\n", - " returns: sequence of labels\n", - " \"\"\"\n", - " units = get_units(series.values[0])\n", - " values = magnitudes(series - value)\n", - " interp = InterpolatedUnivariateSpline(series.index, values)\n", - " return interp.roots()" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([8.86802711])" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'Success'" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.set(dt=0.1*s)\n", - "results, details = run_ralston(system, slope_func, max_step=0.5)\n", - "details.message" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([8.81788535])" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.0381 meter0.0 meter / second
    0.1380.951 meter-0.9800000000000001 meter / second
    0.2380.80400000000003 meter-1.9600000000000002 meter / second
    0.3380.559 meter-2.9400000000000004 meter / second
    0.4380.216 meter-3.9200000000000004 meter / second
    0.5379.77500000000003 meter-4.9 meter / second
    0.6379.23600000000005 meter-5.880000000000001 meter / second
    0.7378.59900000000005 meter-6.860000000000001 meter / second
    0.8377.86400000000003 meter-7.840000000000002 meter / second
    0.9377.031 meter-8.820000000000002 meter / second
    1.0376.1 meter-9.800000000000002 meter / second
    1.1375.071 meter-10.780000000000003 meter / second
    1.2373.944 meter-11.760000000000003 meter / second
    1.3372.719 meter-12.740000000000004 meter / second
    1.4371.396 meter-13.720000000000004 meter / second
    1.5369.975 meter-14.700000000000005 meter / second
    1.6368.456 meter-15.680000000000005 meter / second
    1.7366.839 meter-16.660000000000004 meter / second
    1.8365.124 meter-17.640000000000004 meter / second
    1.9363.31100000000004 meter-18.620000000000005 meter / second
    2.0361.40000000000003 meter-19.600000000000005 meter / second
    2.1359.391 meter-20.580000000000005 meter / second
    2.2357.284 meter-21.560000000000006 meter / second
    2.3355.079 meter-22.540000000000006 meter / second
    2.4352.776 meter-23.520000000000007 meter / second
    2.5350.375 meter-24.500000000000007 meter / second
    2.6347.876 meter-25.480000000000008 meter / second
    2.7345.279 meter-26.460000000000008 meter / second
    2.8342.584 meter-27.44000000000001 meter / second
    2.9339.791 meter-28.42000000000001 meter / second
    .........
    7.1133.99100000000016 meter-69.57999999999993 meter / second
    7.2126.98400000000017 meter-70.55999999999993 meter / second
    7.3119.87900000000018 meter-71.53999999999994 meter / second
    7.4112.67600000000019 meter-72.51999999999994 meter / second
    7.5105.3750000000002 meter-73.49999999999994 meter / second
    7.697.9760000000002 meter-74.47999999999995 meter / second
    7.790.4790000000002 meter-75.45999999999995 meter / second
    7.882.8840000000002 meter-76.43999999999996 meter / second
    7.975.1910000000002 meter-77.41999999999996 meter / second
    8.067.4000000000002 meter-78.39999999999996 meter / second
    8.159.51100000000021 meter-79.37999999999997 meter / second
    8.251.524000000000214 meter-80.35999999999997 meter / second
    8.343.43900000000022 meter-81.33999999999997 meter / second
    8.435.25600000000022 meter-82.31999999999998 meter / second
    8.526.97500000000022 meter-83.29999999999998 meter / second
    8.618.596000000000224 meter-84.27999999999999 meter / second
    8.710.119000000000225 meter-85.25999999999999 meter / second
    8.81.5440000000002243 meter-86.24 meter / second
    8.9-7.128999999999776 meter-87.22 meter / second
    9.0-15.899999999999777 meter-88.2 meter / second
    9.1-24.768999999999778 meter-89.18 meter / second
    9.2-33.73599999999978 meter-90.16000000000001 meter / second
    9.3-42.80099999999978 meter-91.14000000000001 meter / second
    9.4-51.963999999999785 meter-92.12000000000002 meter / second
    9.5-61.22499999999979 meter-93.10000000000002 meter / second
    9.6-70.58399999999979 meter-94.08000000000003 meter / second
    9.7-80.0409999999998 meter-95.06000000000003 meter / second
    9.8-89.5959999999998 meter-96.04000000000003 meter / second
    9.9-99.24899999999981 meter-97.02000000000004 meter / second
    10.0-108.99999999999982 meter-98.00000000000004 meter / second
    \n", - "

    101 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.0 381 meter 0.0 meter / second\n", - "0.1 380.951 meter -0.9800000000000001 meter / second\n", - "0.2 380.80400000000003 meter -1.9600000000000002 meter / second\n", - "0.3 380.559 meter -2.9400000000000004 meter / second\n", - "0.4 380.216 meter -3.9200000000000004 meter / second\n", - "0.5 379.77500000000003 meter -4.9 meter / second\n", - "0.6 379.23600000000005 meter -5.880000000000001 meter / second\n", - "0.7 378.59900000000005 meter -6.860000000000001 meter / second\n", - "0.8 377.86400000000003 meter -7.840000000000002 meter / second\n", - "0.9 377.031 meter -8.820000000000002 meter / second\n", - "1.0 376.1 meter -9.800000000000002 meter / second\n", - "1.1 375.071 meter -10.780000000000003 meter / second\n", - "1.2 373.944 meter -11.760000000000003 meter / second\n", - "1.3 372.719 meter -12.740000000000004 meter / second\n", - "1.4 371.396 meter -13.720000000000004 meter / second\n", - "1.5 369.975 meter -14.700000000000005 meter / second\n", - "1.6 368.456 meter -15.680000000000005 meter / second\n", - "1.7 366.839 meter -16.660000000000004 meter / second\n", - "1.8 365.124 meter -17.640000000000004 meter / second\n", - "1.9 363.31100000000004 meter -18.620000000000005 meter / second\n", - "2.0 361.40000000000003 meter -19.600000000000005 meter / second\n", - "2.1 359.391 meter -20.580000000000005 meter / second\n", - "2.2 357.284 meter -21.560000000000006 meter / second\n", - "2.3 355.079 meter -22.540000000000006 meter / second\n", - "2.4 352.776 meter -23.520000000000007 meter / second\n", - "2.5 350.375 meter -24.500000000000007 meter / second\n", - "2.6 347.876 meter -25.480000000000008 meter / second\n", - "2.7 345.279 meter -26.460000000000008 meter / second\n", - "2.8 342.584 meter -27.44000000000001 meter / second\n", - "2.9 339.791 meter -28.42000000000001 meter / second\n", - "... ... ...\n", - "7.1 133.99100000000016 meter -69.57999999999993 meter / second\n", - "7.2 126.98400000000017 meter -70.55999999999993 meter / second\n", - "7.3 119.87900000000018 meter -71.53999999999994 meter / second\n", - "7.4 112.67600000000019 meter -72.51999999999994 meter / second\n", - "7.5 105.3750000000002 meter -73.49999999999994 meter / second\n", - "7.6 97.9760000000002 meter -74.47999999999995 meter / second\n", - "7.7 90.4790000000002 meter -75.45999999999995 meter / second\n", - "7.8 82.8840000000002 meter -76.43999999999996 meter / second\n", - "7.9 75.1910000000002 meter -77.41999999999996 meter / second\n", - "8.0 67.4000000000002 meter -78.39999999999996 meter / second\n", - "8.1 59.51100000000021 meter -79.37999999999997 meter / second\n", - "8.2 51.524000000000214 meter -80.35999999999997 meter / second\n", - "8.3 43.43900000000022 meter -81.33999999999997 meter / second\n", - "8.4 35.25600000000022 meter -82.31999999999998 meter / second\n", - "8.5 26.97500000000022 meter -83.29999999999998 meter / second\n", - "8.6 18.596000000000224 meter -84.27999999999999 meter / second\n", - "8.7 10.119000000000225 meter -85.25999999999999 meter / second\n", - "8.8 1.5440000000002243 meter -86.24 meter / second\n", - "8.9 -7.128999999999776 meter -87.22 meter / second\n", - "9.0 -15.899999999999777 meter -88.2 meter / second\n", - "9.1 -24.768999999999778 meter -89.18 meter / second\n", - "9.2 -33.73599999999978 meter -90.16000000000001 meter / second\n", - "9.3 -42.80099999999978 meter -91.14000000000001 meter / second\n", - "9.4 -51.963999999999785 meter -92.12000000000002 meter / second\n", - "9.5 -61.22499999999979 meter -93.10000000000002 meter / second\n", - "9.6 -70.58399999999979 meter -94.08000000000003 meter / second\n", - "9.7 -80.0409999999998 meter -95.06000000000003 meter / second\n", - "9.8 -89.5959999999998 meter -96.04000000000003 meter / second\n", - "9.9 -99.24899999999981 meter -97.02000000000004 meter / second\n", - "10.0 -108.99999999999982 meter -98.00000000000004 meter / second\n", - "\n", - "[101 rows x 2 columns]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's position as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/chap09-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(results):\n", - " plot(results.y, label='y')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "plot_position(results)\n", - "savefig('figs/chap09-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Onto the sidewalk\n", - "\n", - "To figure out when the penny hit the sidewalk, we can use `crossings`, which finds the times where a `Series` passes through a given value." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "def crossings(series, value):\n", - " \"\"\"Find the labels where the series passes through value.\n", - "\n", - " The labels in series must be increasing numerical values.\n", - "\n", - " series: Series\n", - " value: number\n", - "\n", - " returns: sequence of labels\n", - " \"\"\"\n", - " units = get_units(series.values[0])\n", - " values = magnitudes(series - value)\n", - " interp = InterpolatedUnivariateSpline(series.index, values)\n", - " return interp.roots()" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([8.81788535])" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this example there should be just one crossing, the time when the penny hits the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.81788534972054 second" - ], - "text/latex": [ - "$8.81788534972054\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.81788534972054 " - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = t_crossings[0] * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare that to the exact result. Without air resistance, we have\n", - "\n", - "$v = -g t$\n", - "\n", - "and\n", - "\n", - "$y = 381 - g t^2 / 2$\n", - "\n", - "Setting $y=0$ and solving for $t$ yields\n", - "\n", - "$t = \\sqrt{\\frac{2 y_{init}}{g}}$" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.817885349720552 second" - ], - "text/latex": [ - "$8.817885349720552\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.817885349720552 " - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sqrt(2 * init.y / g)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The estimate is accurate to about 10 decimal places." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Events\n", - "\n", - "Instead of running the simulation until the penny goes through the sidewalk, it would be better to detect the point where the penny hits the sidewalk and stop. `run_ralston` provides exactly the tool we need, **event functions**.\n", - "\n", - "Here's an event function that returns the height of the penny above the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we pass it to `run_ralston`. The solver should run until the event function returns 0, and then terminate." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    messageSuccess
    \n", - "
    " - ], - "text/plain": [ - "message Success\n", - "dtype: object" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ralston(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The message from the solver indicates the solver stopped because the event we wanted to detect happened.\n", - "\n", - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    yv
    0.000000381 meter0.0 meter / second
    0.100000380.951 meter-0.9800000000000001 meter / second
    0.200000380.80400000000003 meter-1.9600000000000002 meter / second
    0.300000380.559 meter-2.9400000000000004 meter / second
    0.400000380.216 meter-3.9200000000000004 meter / second
    0.500000379.77500000000003 meter-4.9 meter / second
    0.600000379.23600000000005 meter-5.880000000000001 meter / second
    0.700000378.59900000000005 meter-6.860000000000001 meter / second
    0.800000377.86400000000003 meter-7.840000000000002 meter / second
    0.900000377.031 meter-8.820000000000002 meter / second
    1.000000376.1 meter-9.800000000000002 meter / second
    1.100000375.071 meter-10.780000000000003 meter / second
    1.200000373.944 meter-11.760000000000003 meter / second
    1.300000372.719 meter-12.740000000000004 meter / second
    1.400000371.396 meter-13.720000000000004 meter / second
    1.500000369.975 meter-14.700000000000005 meter / second
    1.600000368.456 meter-15.680000000000005 meter / second
    1.700000366.839 meter-16.660000000000004 meter / second
    1.800000365.124 meter-17.640000000000004 meter / second
    1.900000363.31100000000004 meter-18.620000000000005 meter / second
    2.000000361.40000000000003 meter-19.600000000000005 meter / second
    2.100000359.391 meter-20.580000000000005 meter / second
    2.200000357.284 meter-21.560000000000006 meter / second
    2.300000355.079 meter-22.540000000000006 meter / second
    2.400000352.776 meter-23.520000000000007 meter / second
    2.500000350.375 meter-24.500000000000007 meter / second
    2.600000347.876 meter-25.480000000000008 meter / second
    2.700000345.279 meter-26.460000000000008 meter / second
    2.800000342.584 meter-27.44000000000001 meter / second
    2.900000339.791 meter-28.42000000000001 meter / second
    .........
    6.000000204.60000000000005 meter-58.799999999999926 meter / second
    6.100000198.67100000000005 meter-59.77999999999992 meter / second
    6.200000192.64400000000006 meter-60.75999999999992 meter / second
    6.300000186.51900000000006 meter-61.73999999999992 meter / second
    6.400000180.29600000000008 meter-62.719999999999914 meter / second
    6.500000173.97500000000008 meter-63.69999999999991 meter / second
    6.600000167.5560000000001 meter-64.67999999999991 meter / second
    6.700000161.0390000000001 meter-65.65999999999991 meter / second
    6.800000154.42400000000012 meter-66.63999999999992 meter / second
    6.900000147.71100000000013 meter-67.61999999999992 meter / second
    7.000000140.90000000000015 meter-68.59999999999992 meter / second
    7.100000133.99100000000016 meter-69.57999999999993 meter / second
    7.200000126.98400000000017 meter-70.55999999999993 meter / second
    7.300000119.87900000000018 meter-71.53999999999994 meter / second
    7.400000112.67600000000019 meter-72.51999999999994 meter / second
    7.500000105.3750000000002 meter-73.49999999999994 meter / second
    7.60000097.9760000000002 meter-74.47999999999995 meter / second
    7.70000090.4790000000002 meter-75.45999999999995 meter / second
    7.80000082.8840000000002 meter-76.43999999999996 meter / second
    7.90000075.1910000000002 meter-77.41999999999996 meter / second
    8.00000067.4000000000002 meter-78.39999999999996 meter / second
    8.10000059.51100000000021 meter-79.37999999999997 meter / second
    8.20000051.524000000000214 meter-80.35999999999997 meter / second
    8.30000043.43900000000022 meter-81.33999999999997 meter / second
    8.40000035.25600000000022 meter-82.31999999999998 meter / second
    8.50000026.97500000000022 meter-83.29999999999998 meter / second
    8.60000018.596000000000224 meter-84.27999999999999 meter / second
    8.70000010.119000000000225 meter-85.25999999999999 meter / second
    8.8000001.5440000000002243 meter-86.24 meter / second
    8.817802-4.440892098500626e-16 meter-86.41446327683617 meter / second
    \n", - "

    90 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " y v\n", - "0.000000 381 meter 0.0 meter / second\n", - "0.100000 380.951 meter -0.9800000000000001 meter / second\n", - "0.200000 380.80400000000003 meter -1.9600000000000002 meter / second\n", - "0.300000 380.559 meter -2.9400000000000004 meter / second\n", - "0.400000 380.216 meter -3.9200000000000004 meter / second\n", - "0.500000 379.77500000000003 meter -4.9 meter / second\n", - "0.600000 379.23600000000005 meter -5.880000000000001 meter / second\n", - "0.700000 378.59900000000005 meter -6.860000000000001 meter / second\n", - "0.800000 377.86400000000003 meter -7.840000000000002 meter / second\n", - "0.900000 377.031 meter -8.820000000000002 meter / second\n", - "1.000000 376.1 meter -9.800000000000002 meter / second\n", - "1.100000 375.071 meter -10.780000000000003 meter / second\n", - "1.200000 373.944 meter -11.760000000000003 meter / second\n", - "1.300000 372.719 meter -12.740000000000004 meter / second\n", - "1.400000 371.396 meter -13.720000000000004 meter / second\n", - "1.500000 369.975 meter -14.700000000000005 meter / second\n", - "1.600000 368.456 meter -15.680000000000005 meter / second\n", - "1.700000 366.839 meter -16.660000000000004 meter / second\n", - "1.800000 365.124 meter -17.640000000000004 meter / second\n", - "1.900000 363.31100000000004 meter -18.620000000000005 meter / second\n", - "2.000000 361.40000000000003 meter -19.600000000000005 meter / second\n", - "2.100000 359.391 meter -20.580000000000005 meter / second\n", - "2.200000 357.284 meter -21.560000000000006 meter / second\n", - "2.300000 355.079 meter -22.540000000000006 meter / second\n", - "2.400000 352.776 meter -23.520000000000007 meter / second\n", - "2.500000 350.375 meter -24.500000000000007 meter / second\n", - "2.600000 347.876 meter -25.480000000000008 meter / second\n", - "2.700000 345.279 meter -26.460000000000008 meter / second\n", - "2.800000 342.584 meter -27.44000000000001 meter / second\n", - "2.900000 339.791 meter -28.42000000000001 meter / second\n", - "... ... ...\n", - "6.000000 204.60000000000005 meter -58.799999999999926 meter / second\n", - "6.100000 198.67100000000005 meter -59.77999999999992 meter / second\n", - "6.200000 192.64400000000006 meter -60.75999999999992 meter / second\n", - "6.300000 186.51900000000006 meter -61.73999999999992 meter / second\n", - "6.400000 180.29600000000008 meter -62.719999999999914 meter / second\n", - "6.500000 173.97500000000008 meter -63.69999999999991 meter / second\n", - "6.600000 167.5560000000001 meter -64.67999999999991 meter / second\n", - "6.700000 161.0390000000001 meter -65.65999999999991 meter / second\n", - "6.800000 154.42400000000012 meter -66.63999999999992 meter / second\n", - "6.900000 147.71100000000013 meter -67.61999999999992 meter / second\n", - "7.000000 140.90000000000015 meter -68.59999999999992 meter / second\n", - "7.100000 133.99100000000016 meter -69.57999999999993 meter / second\n", - "7.200000 126.98400000000017 meter -70.55999999999993 meter / second\n", - "7.300000 119.87900000000018 meter -71.53999999999994 meter / second\n", - "7.400000 112.67600000000019 meter -72.51999999999994 meter / second\n", - "7.500000 105.3750000000002 meter -73.49999999999994 meter / second\n", - "7.600000 97.9760000000002 meter -74.47999999999995 meter / second\n", - "7.700000 90.4790000000002 meter -75.45999999999995 meter / second\n", - "7.800000 82.8840000000002 meter -76.43999999999996 meter / second\n", - "7.900000 75.1910000000002 meter -77.41999999999996 meter / second\n", - "8.000000 67.4000000000002 meter -78.39999999999996 meter / second\n", - "8.100000 59.51100000000021 meter -79.37999999999997 meter / second\n", - "8.200000 51.524000000000214 meter -80.35999999999997 meter / second\n", - "8.300000 43.43900000000022 meter -81.33999999999997 meter / second\n", - "8.400000 35.25600000000022 meter -82.31999999999998 meter / second\n", - "8.500000 26.97500000000022 meter -83.29999999999998 meter / second\n", - "8.600000 18.596000000000224 meter -84.27999999999999 meter / second\n", - "8.700000 10.119000000000225 meter -85.25999999999999 meter / second\n", - "8.800000 1.5440000000002243 meter -86.24 meter / second\n", - "8.817802 -4.440892098500626e-16 meter -86.41446327683617 meter / second\n", - "\n", - "[90 rows x 2 columns]" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the `events` option, the solver returns the actual time steps it computed, which are not necessarily equally spaced. \n", - "\n", - "The last time step is when the event occurred:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "8.81780237518735 second" - ], - "text/latex": [ - "$8.81780237518735\\ \\mathrm{second}$" - ], - "text/plain": [ - "8.81780237518735 " - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is accurate to about 15 decimal places.\n", - "\n", - "We can also check the velocity of the penny when it hits the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-86.41446327683617 meter/second" - ], - "text/latex": [ - "$-86.41446327683617\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$" - ], - "text/plain": [ - "-86.41446327683617 " - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v_sidewalk = get_last_value(results.v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And convert to kilometers per hour." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "-311.09206779661025 kilometer/hour" - ], - "text/latex": [ - "$-311.09206779661025\\ \\frac{\\mathrm{kilometer}}{\\mathrm{hour}}$" - ], - "text/plain": [ - "-311.09206779661025 " - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "km = UNITS.kilometer\n", - "h = UNITS.hour\n", - "v_sidewalk.to(km / h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_plot_quantity.ipynb b/soln/test_plot_quantity.ipynb deleted file mode 100644 index 1efbad4e..00000000 --- a/soln/test_plot_quantity.ipynb +++ /dev/null @@ -1,387 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 25\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "import pint\n", - "UNITS = pint.UnitRegistry()\n", - "Quantity = UNITS.Quantity\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import numpy as np\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "x and y must not be None", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 3356\u001b[0m mplDeprecation)\n\u001b[1;32m 3357\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3358\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3359\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3360\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_hold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwashold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1853\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1854\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1855\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1856\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1857\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1525\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcbook\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormalize_kwargs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_alias_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1526\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1527\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1528\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1529\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_grab_next_args\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 404\u001b[0m \u001b[0mthis\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 405\u001b[0m \u001b[0margs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 406\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mseg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_plot_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mthis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 407\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mseg\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_plot_args\u001b[0;34m(self, tup, kwargs)\u001b[0m\n\u001b[1;32m 364\u001b[0m \u001b[0;31m# downstream.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 365\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mv\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mv\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtup\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 366\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"x and y must not be None\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 367\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 368\u001b[0m \u001b[0mkw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: x and y must not be None" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(1, 1, None)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$newton$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meter = UNITS.meter\n", - "minute = UNITS.minute\n", - "newton = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a few more parameters in the `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "240.0 meter newton" - ], - "text/latex": [ - "$240.0 meter \\cdot newton$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_torque = 240 * newton * meter" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "5500 1/minute" - ], - "text/latex": [ - "$5500 \\frac{1}{minute}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "max_rpm = 5500 / minute" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def available_torque(rpm):\n", - " if rpm > max_rpm:\n", - " return 0 * newton * meter\n", - " return max_torque * (1 - rpm/max_rpm)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "240.0 meter newton" - ], - "text/latex": [ - "$240.0 meter \\cdot newton$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "available_torque(0 / minute)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "[ 0. 302.5 605. 907.5 1210. 1512.5 1815. 2117.5 2420. 2722.5 3025. 3327.5 3630. 3932.5 4235. 4537.5 4840. 5142.5 5445. 5747.5 6050. ] 1/minute" - ], - "text/latex": [ - "$[ 0. 302.5 605. 907.5 1210. 1512.5 1815. 2117.5 2420. 2722.5 3025. 3327.5 3630. 3932.5 4235. 4537.5 4840. 5142.5 5445. 5747.5 6050. ] \\frac{1}{minute}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rpms = np.linspace(0, max_rpm*1.1, 21) / minute" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "taus = [available_torque(rpm) for rpm in rpms]" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.0 240.0 meter * newton\n", - "302.5 226.79999999999998 meter * newton\n", - "605.0 213.6 meter * newton\n", - "907.5 200.39999999999998 meter * newton\n", - "1210.0 187.20000000000002 meter * newton\n", - "1512.5 174.0 meter * newton\n", - "1815.0 160.79999999999998 meter * newton\n", - "2117.5 147.6 meter * newton\n", - "2420.0 134.39999999999998 meter * newton\n", - "2722.5 121.19999999999997 meter * newton\n", - "3025.0 107.99999999999999 meter * newton\n", - "3327.5 94.79999999999998 meter * newton\n", - "3630.0 81.59999999999997 meter * newton\n", - "3932.5 68.39999999999995 meter * newton\n", - "4235.0 55.19999999999997 meter * newton\n", - "4537.5 41.99999999999996 meter * newton\n", - "4840.0 28.799999999999972 meter * newton\n", - "5142.5 15.59999999999996 meter * newton\n", - "5445.0 2.399999999999949 meter * newton\n", - "5747.5 0.0 meter * newton\n", - "6050.0 0.0 meter * newton\n", - "dtype: object" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "series = pd.Series(taus, index=rpms.magnitude)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "ename": "ValueError", - "evalue": "setting an array element with a sequence.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mseries\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Motor speed (rad/s)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Available torque (N m)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 3356\u001b[0m mplDeprecation)\n\u001b[1;32m 3357\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3358\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3359\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3360\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_hold\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mwashold\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1853\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1854\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1855\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1856\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1857\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mplot\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1526\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1527\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1528\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1529\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1530\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36madd_line\u001b[0;34m(self, line)\u001b[0m\n\u001b[1;32m 1930\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_clip_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpatch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1931\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1932\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_update_line_limits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mline\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1933\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_label\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1934\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_label\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'_line%d'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlines\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/axes/_base.py\u001b[0m in \u001b[0;36m_update_line_limits\u001b[0;34m(self, line)\u001b[0m\n\u001b[1;32m 1952\u001b[0m \u001b[0mFigures\u001b[0m \u001b[0mout\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mdata\u001b[0m \u001b[0mlimit\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgiven\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mupdating\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdataLim\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1953\u001b[0m \"\"\"\n\u001b[0;32m-> 1954\u001b[0;31m \u001b[0mpath\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_path\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1955\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvertices\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msize\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1956\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py\u001b[0m in \u001b[0;36mget_path\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 949\u001b[0m \"\"\"\n\u001b[1;32m 950\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_invalidy\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_invalidx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 951\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 952\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_path\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 953\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/lines.py\u001b[0m in \u001b[0;36mrecache\u001b[0;34m(self, always)\u001b[0m\n\u001b[1;32m 655\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0malways\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_invalidy\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 656\u001b[0m \u001b[0myconv\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert_yunits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_yorig\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 657\u001b[0;31m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_to_unmasked_float_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0myconv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 658\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 659\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_y\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/matplotlib/cbook/__init__.py\u001b[0m in \u001b[0;36m_to_unmasked_float_array\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 2048\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfilled\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2049\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2050\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2051\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2052\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py\u001b[0m in \u001b[0;36masarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m 490\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 491\u001b[0m \"\"\"\n\u001b[0;32m--> 492\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 493\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 494\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence." - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(series)\n", - "plt.xlabel('Motor speed (rad/s)')\n", - "plt.ylabel('Available torque (N m)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_timestamp.ipynb b/soln/test_timestamp.ipynb deleted file mode 100644 index 6f125adb..00000000 --- a/soln/test_timestamp.ipynb +++ /dev/null @@ -1,173 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas._libs.tslibs.timestamps.Timestamp" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "timestamp = pd.Timestamp(1412526600000000000)\n", - "series = pd.Series([], dtype=object)\n", - "series['timestamp'] = timestamp\n", - "type(series.timestamp)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "int" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "series = pd.Series([], dtype=object)\n", - "series['anything'] = 300.0\n", - "series['timestamp'] = timestamp\n", - "type(series.timestamp)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype('O')" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "series.dtype" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "INSTALLED VERSIONS\n", - "------------------\n", - "commit: None\n", - "python: 3.6.5.final.0\n", - "python-bits: 64\n", - "OS: Linux\n", - "OS-release: 4.4.0-128-generic\n", - "machine: x86_64\n", - "processor: x86_64\n", - "byteorder: little\n", - "LC_ALL: None\n", - "LANG: en_US.utf8\n", - "LOCALE: en_US.UTF-8\n", - "\n", - "pandas: 0.23.0\n", - "pytest: 3.5.1\n", - "pip: 10.0.1\n", - "setuptools: 39.1.0\n", - "Cython: 0.28.2\n", - "numpy: 1.14.3\n", - "scipy: 1.1.0\n", - "pyarrow: None\n", - "xarray: None\n", - "IPython: 6.4.0\n", - "sphinx: 1.7.4\n", - "patsy: 0.5.0\n", - "dateutil: 2.7.3\n", - "pytz: 2018.4\n", - "blosc: None\n", - "bottleneck: 1.2.1\n", - "tables: 3.4.3\n", - "numexpr: 2.6.5\n", - "feather: None\n", - "matplotlib: 2.2.2\n", - "openpyxl: 2.5.3\n", - "xlrd: 1.1.0\n", - "xlwt: 1.3.0\n", - "xlsxwriter: 1.0.4\n", - "lxml: 4.2.1\n", - "bs4: 4.6.0\n", - "html5lib: 1.0.1\n", - "sqlalchemy: 1.2.7\n", - "pymysql: None\n", - "psycopg2: None\n", - "jinja2: 2.10\n", - "s3fs: None\n", - "fastparquet: None\n", - "pandas_gbq: None\n", - "pandas_datareader: None\n" - ] - } - ], - "source": [ - "pd.show_versions()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_units_off.ipynb b/soln/test_units_off.ipynb deleted file mode 100644 index 705705a4..00000000 --- a/soln/test_units_off.ipynb +++ /dev/null @@ -1,731 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Low pass filter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "A 0.0 dimensionless\n", - "Bd 0.0 dimensionless\n", - "Bq 0.0 dimensionless\n", - "C 0.0 dimensionless\n", - "Gy 0.0 dimensionless\n", - "Hz 0.0 dimensionless\n", - "K 0.0 dimensionless\n", - "Sv 0.0 dimensionless\n", - "amp 0.0 dimensionless\n", - "ampere 0.0 dimensionless\n", - "ampere_turn 0.0 dimensionless\n", - "baud 0.0 dimensionless\n", - "becquerel 0.0 dimensionless\n", - "bit 0.0 dimensionless\n", - "bps 0.0 dimensionless\n", - "candela 0.0 dimensionless\n", - "candle 0.0 dimensionless\n", - "cd 0.0 dimensionless\n", - "coulomb 0.0 dimensionless\n", - "count 0.0 dimensionless\n", - "counts_per_second 0.0 dimensionless\n", - "cps 0.0 dimensionless\n", - "degK 0.0 dimensionless\n", - "delta_degC 0.0 dimensionless\n", - "fine_structure_constant 0.0 dimensionless\n", - "g 0.0 dimensionless\n", - "gram 0.0 dimensionless\n", - "gray 0.0 dimensionless\n", - "hertz 0.0 dimensionless\n", - "kelvin 0.0 dimensionless\n", - "lm 0.0 dimensionless\n", - "lumen 0.0 dimensionless\n", - "lux 0.0 dimensionless\n", - "lx 0.0 dimensionless\n", - "m 0.0 dimensionless\n", - "meter 0.0 dimensionless\n", - "metre 0.0 dimensionless\n", - "mol 0.0 dimensionless\n", - "mole 0.0 dimensionless\n", - "rad 0.0 dimensionless\n", - "radian 0.0 dimensionless\n", - "rps 0.0 dimensionless\n", - "s 0.0 dimensionless\n", - "sec 0.0 dimensionless\n", - "second 0.0 dimensionless\n", - "sievert 0.0 dimensionless\n", - "sr 0.0 dimensionless\n", - "steradian 0.0 dimensionless\n", - "stere 0.0 dimensionless\n", - "Δcelsius 0.0 dimensionless\n" - ] - } - ], - "source": [ - "with units_off():\n", - " for i, name in enumerate(dir(UNITS)):\n", - " unit = getattr(UNITS, name)\n", - " try:\n", - " res = 1*unit - 1\n", - " if res == 0:\n", - " print(name, 1*unit - 1)\n", - " except TypeError:\n", - " pass\n", - " if i > 10000:\n", - " break" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-0.998 dimensionless\n" - ] - } - ], - "source": [ - "with units_off():\n", - " print(2 * UNITS.farad - 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1999.0 dimensionless\n" - ] - } - ], - "source": [ - "with units_off():\n", - " print(2 * UNITS.volt - 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1999.0 dimensionless\n" - ] - } - ], - "source": [ - "with units_off():\n", - " print(2 * UNITS.newton - 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "gram meter/second2" - ], - "text/latex": [ - "$\\frac{gram \\cdot meter}{second^{2}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mN = UNITS.gram * UNITS.meter / UNITS.second**2" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0 dimensionless\n" - ] - } - ], - "source": [ - "with units_off():\n", - " print(2 * mN - 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R11.000000e+06
    C11.000000e-09
    A5.000000e+00
    f1.000000e+03
    \n", - "
    " - ], - "text/plain": [ - "R1 1.000000e+06\n", - "C1 1.000000e-09\n", - "A 5.000000e+00\n", - "f 1.000000e+03\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(\n", - " R1 = 1e6, # ohm\n", - " C1 = 1e-9, # farad\n", - " A = 5, # volt\n", - " f = 1000, # Hz \n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " unpack(params)\n", - " \n", - " init = State(V_out = 0)\n", - " omega = 2 * np.pi * f\n", - " tau = R1 * C1\n", - " cutoff = 1 / R1 / C1\n", - " t_end = 3 / f\n", - " \n", - " return System(params, init=init, t_end=t_end,\n", - " omega=omega, cutoff=cutoff)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R11e+06
    C11e-09
    A5
    f1000
    initV_out 0\n", - "dtype: int64
    t_end0.003
    omega6283.19
    cutoff1000
    \n", - "
    " - ], - "text/plain": [ - "R1 1e+06\n", - "C1 1e-09\n", - "A 5\n", - "f 1000\n", - "init V_out 0\n", - "dtype: int64\n", - "t_end 0.003\n", - "omega 6283.19\n", - "cutoff 1000\n", - "dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function," - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " V_out, = state\n", - " unpack(system)\n", - " \n", - " V_in = A * np.cos(omega * t)\n", - " \n", - " V_R1 = V_in - V_out\n", - " \n", - " I_R1 = V_R1 / R1 \n", - " I_C1 = I_R1\n", - "\n", - " dV_out = I_C1 / C1\n", - " \n", - " return dV_out" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "5000.0" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The solver successfully reached the end of the integration interval.\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    solNone
    t_events[]
    nfev86
    njev0
    nlu0
    status0
    messageThe solver successfully reached the end of the...
    successTrue
    \n", - "
    " - ], - "text/plain": [ - "sol None\n", - "t_events []\n", - "nfev 86\n", - "njev 0\n", - "nlu 0\n", - "status 0\n", - "message The solver successfully reached the end of the...\n", - "success True\n", - "dtype: object" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ts = linspace(0, system.t_end, 301)\n", - "results, details = run_ode_solver(system, slope_func, t_eval=ts)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "def plot_results(results):\n", - " xs = results.V_out.index\n", - " ys = results.V_out.values\n", - "\n", - " t_end = get_last_label(results)\n", - " if t_end < 10:\n", - " xs *= 1000\n", - " xlabel = 'Time (ms)'\n", - " else:\n", - " xlabel = 'Time (s)'\n", - " \n", - " plot(xs, ys)\n", - " decorate(xlabel=xlabel,\n", - " ylabel='$V_{out}$ (volt)',\n", - " legend=False)\n", - " \n", - "plot_results(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The solver successfully reached the end of the integration interval.\n", - "The solver successfully reached the end of the integration interval.\n", - "The solver successfully reached the end of the integration interval.\n", - "The solver successfully reached the end of the integration interval.\n", - "The solver successfully reached the end of the integration interval.\n", - "The solver successfully reached the end of the integration interval.\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fs = [1, 10, 100, 1000, 10000, 100000]\n", - "for i, f in enumerate(fs):\n", - " system = make_system(Params(params, f=f))\n", - " ts = linspace(0, system.t_end, 301)\n", - " results, details = run_ode_solver(system, slope_func, t_eval=ts)\n", - " subplot(3, 2, i+1)\n", - " plot_results(results)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/test_vector.ipynb b/soln/test_vector.ipynb deleted file mode 100644 index 611fef30..00000000 --- a/soln/test_vector.ipynb +++ /dev/null @@ -1,211 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "1 meter" - ], - "text/latex": [ - "$1 meter$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x = 1 * UNITS.meter" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "[0.5547002 0.83205029] dimensionless" - ], - "text/latex": [ - "$[0.5547002 0.83205029] dimensionless$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v = Vector(2,3).hat()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "[0.5547002 0.83205029] meter" - ], - "text/latex": [ - "$[0.5547002 0.83205029] meter$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vp = x * v" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim._Vector" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(v)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim._Vector" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(v * 3)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "modsim._Vector" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(v * x)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pint.unit.build_quantity_class..Quantity" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(x * v)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/throwingaxe_soln.ipynb b/soln/throwingaxe_soln.ipynb deleted file mode 100644 index 0354bdbc..00000000 --- a/soln/throwingaxe_soln.ipynb +++ /dev/null @@ -1,991 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study: Throwing Axe\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Throwing axe" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Our favorite event at Lumberjack Competitions is axe throwing.  The axes used for this event typically weigh 1.5 to 2 kg, with handles roughly 0.7 m long.  They are thrown overhead at a target typically 6 m away and 1.5 m off the ground.  Normally, the axe makes one full rotation in the air to hit the target blade first, with the handle close to vertical.\n", - "\n", - "![Diagram of throwing axe](diagrams/throwingaxe1.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `make_system` that sets the initial conditions.\n", - "\n", - "The state variables are x, y, theta, vx, vy, omega, where theta is the orientation (angle) of the axe in radians and omega is the angular velocity in radians per second.\n", - "\n", - "I chose initial conditions based on videos of axe throwing." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "radian = UNITS.radian\n", - "\n", - "def make_system():\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " returns: System with init, ...\n", - " \"\"\"\n", - " P = Vector(0, 2) * m\n", - " V = Vector(8, 4) * m/s\n", - " theta = 2 * radian\n", - " omega = -7 * radian/s\n", - " \n", - " init = State(P=P, V=V, theta=theta, omega=omega)\n", - "\n", - " t_end = 1.0 * s\n", - " \n", - " return System(init=init, t_end=t_end,\n", - " g = 9.8 * m/s**2,\n", - " mass = 1.5 * kg,\n", - " length = 0.7 * m)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initP [0.0 meter, 2.0 met...
    t_end1.0 second
    g9.8 meter / second ** 2
    mass1.5 kilogram
    length0.7 meter
    \n", - "
    " - ], - "text/plain": [ - "init P [0.0 meter, 2.0 met...\n", - "t_end 1.0 second\n", - "g 9.8 meter / second ** 2\n", - "mass 1.5 kilogram\n", - "length 0.7 meter\n", - "dtype: object" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    P[0.0 meter, 2.0 meter]
    V[8.0 meter / second, 4.0 meter / second]
    theta2 radian
    omega-7.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - "P [0.0 meter, 2.0 meter]\n", - "V [8.0 meter / second, 4.0 meter / second]\n", - "theta 2 radian\n", - "omega -7.0 radian / second\n", - "dtype: object" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a simple starting place, I ignore drag, so `vx` and `omega` are constant, and `ay` is just `-g`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with length0, m, k\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " P, V, theta, omega = state\n", - "\n", - " A = Vector(0, -system.g)\n", - " alpha = 0 * radian / s**2\n", - "\n", - " return V, A, omega, alpha" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(array([8., 4.]) ,\n", - " array([ 0. , -9.8]) ,\n", - " -7.0 ,\n", - " 0.0 )" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    PVthetaomega
    0.96[7.680000000000005 meter, 1.3241600000000022 m...[8.0 meter / second, -5.407999999999994 meter ...-4.7200000000000015 radian-7.0 radian / second
    0.97[7.760000000000005 meter, 1.2695900000000022 m...[8.0 meter / second, -5.505999999999994 meter ...-4.790000000000002 radian-7.0 radian / second
    0.98[7.840000000000005 meter, 1.2140400000000022 m...[8.0 meter / second, -5.603999999999994 meter ...-4.860000000000002 radian-7.0 radian / second
    0.99[7.920000000000005 meter, 1.1575100000000023 m...[8.0 meter / second, -5.701999999999994 meter ...-4.930000000000002 radian-7.0 radian / second
    1.00[8.000000000000005 meter, 1.1000000000000023 m...[8.0 meter / second, -5.799999999999994 meter ...-5.000000000000003 radian-7.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - " P \\\n", - "0.96 [7.680000000000005 meter, 1.3241600000000022 m... \n", - "0.97 [7.760000000000005 meter, 1.2695900000000022 m... \n", - "0.98 [7.840000000000005 meter, 1.2140400000000022 m... \n", - "0.99 [7.920000000000005 meter, 1.1575100000000023 m... \n", - "1.00 [8.000000000000005 meter, 1.1000000000000023 m... \n", - "\n", - " V \\\n", - "0.96 [8.0 meter / second, -5.407999999999994 meter ... \n", - "0.97 [8.0 meter / second, -5.505999999999994 meter ... \n", - "0.98 [8.0 meter / second, -5.603999999999994 meter ... \n", - "0.99 [8.0 meter / second, -5.701999999999994 meter ... \n", - "1.00 [8.0 meter / second, -5.799999999999994 meter ... \n", - "\n", - " theta omega \n", - "0.96 -4.7200000000000015 radian -7.0 radian / second \n", - "0.97 -4.790000000000002 radian -7.0 radian / second \n", - "0.98 -4.860000000000002 radian -7.0 radian / second \n", - "0.99 -4.930000000000002 radian -7.0 radian / second \n", - "1.00 -5.000000000000003 radian -7.0 radian / second " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The simplest way to visualize the results is to plot the state variables as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_position(P):\n", - " x = P.extract('x')\n", - " y = P.extract('y')\n", - " plot(x, label='x')\n", - " plot(y, label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results.P)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the velocities the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_velocity(V):\n", - " vx = V.extract('x')\n", - " vy = V.extract('y')\n", - " plot(vx, label='vx')\n", - " plot(vy, label='vy')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results.V)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.theta, label='theta', color='C2')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Angle (radian)')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZgU1dXH8e+AgCguICAoQZToCWhURIxi3BBEMbjg8iqLcYlKxPU1iQJqxH2JiIkiqHGLC68RwQVFXMA1iRAjJBKPGDWiLG4o4AII8/5xa7BpeoYapqqnZvr3eZ5+6L51u/pMPUOfuVWn7i0rLy9HREQkaxrUdgAiIiKFKEGJiEgmKUGJiEgmKUGJiEgmbVDbARSbmTUBugHzgZW1HI6ISKlrCLQFprv7stwNJZegCMnppdoOQkRE1rAP8HJuQykmqPkA999/P23atKntWEREStqCBQsYMGAARN/NuUoxQa0EaNOmDe3atavtWEREJFjrkouKJEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoEREJJOUoERE6qBXX32Vo446it12242+ffsyefJkAHr06ME999xD79692XXXXbngggt47bXXOPTQQ+nSpQvnn38+K1eGeVm//PJLhg4dyt57781+++3HyJEj+e677wBYsWIFl112Gd26daNnz57cfvvtmNnqz3/ggQfo27cvXbt2Za+99uL6669P/GcsxdnMRURiufrFW/jH/H8V5bO6tN2JofsOidV3zpw5nH766Vx77bUcdNBBTJ8+nTPOOINWrVoB8PDDD/Pggw/yzTff0KdPH+bMmcM999zDsmXLOPLII3nhhRfo0aMHF1xwAY0bN+bpp5/m66+/5uyzz2bs2LEMGTKE0aNH88YbbzBp0iQaNmzIGWecsfrzX3/9dUaNGsWDDz5Ix44dmTVrFv3796d3797svPPOiR0TjaBEROqYSZMm8ZOf/IQ+ffqwwQYbsNdee9G3b18mTJgAwAknnECLFi3Yeuutad++PYcddhgtW7Zk6623Zvvtt+fDDz/k008/ZerUqVxyySU0a9aM1q1bM2TIEMaNGwfAY489xumnn07r1q3ZYostOOuss1Z/fqdOnZg4cSId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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(results.omega, label='omega', color='C2')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to visualize the results is to plot y versus x. The result is the trajectory through the plane of motion." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_trajectory(P, **options):\n", - " x = P.extract('x')\n", - " y = P.extract('y')\n", - " plot(x, y, **options)\n", - " \n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - " \n", - "plot_trajectory(results.P, label='trajectory')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Animation\n", - "\n", - "Animating this system is a little more complicated, if we want to show the shape and orientation of the axe.\n", - "\n", - "It is useful to construct a frame with $\\hat{r}$ along the handle of the axe and $\\hat{\\theta}$ perpendicular." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to animate the results. The following figure shows the frame and the labeled points A, B, C, and D.\n", - "\n", - "![Diagram of the axe with reference frame](diagrams/throwingaxe2.png)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def make_frame(theta):\n", - " rhat = Vector(pol2cart(theta, 1))\n", - " that = rhat.perp()\n", - " return rhat, that" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "P, V, theta, omega = results.first_row()\n", - "rhat, that = make_frame(theta)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-0.4161468365471424 & 0.9092974268256817\\end{pmatrix} dimensionless\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-0.4161468365471424 & 0.9092974268256817\\end{pmatrix}\\ dimensionless$" - ], - "text/plain": [ - "array([-0.41614684, 0.90929743]) " - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rhat" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\\[\\begin{pmatrix}-0.9092974268256817 & -0.4161468365471424\\end{pmatrix} dimensionless\\]" - ], - "text/latex": [ - "$\\begin{pmatrix}-0.9092974268256817 & -0.4161468365471424\\end{pmatrix}\\ dimensionless$" - ], - "text/plain": [ - "array([-0.90929743, -0.41614684]) " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "that" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "0.0 dimensionless" - ], - "text/latex": [ - "$0.0\\ dimensionless$" - ], - "text/plain": [ - "0.0 " - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.dot(rhat, that)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.9547622981669658,\n", - " 0.04546487134128409,\n", - " -0.48241904971578364,\n", - " 0.9755696399943229)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "O = Vector(0, 0)\n", - "plot_segment(O, rhat)\n", - "plot_segment(O, that)\n", - "plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.P.extract('x')\n", - "ys = results.P.extract('y')\n", - "\n", - "l1 = 0.6 * m\n", - "l2 = 0.1 * m\n", - "\n", - "def draw_func(state, t):\n", - " plt.axis('equal')\n", - " set_xlim([0,8])\n", - " set_ylim([0,6])\n", - " \n", - " P, V, theta, omega = state\n", - " rhat, that = make_frame(theta)\n", - " \n", - " # plot the handle\n", - " A = P - l1 * rhat\n", - " B = P + l2 * rhat\n", - " plot_segment(A, B, color='red')\n", - "\n", - " # plot the axe head\n", - " C = B + l2 * that\n", - " D = B - l2 * that\n", - " plot_segment(C, D, color='black', linewidth=10)\n", - "\n", - " # plot the COG\n", - " x, y = P\n", - " plot(x, y, 'bo')\n", - "\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "During the animation, the parts of the axe seem to slide around relative to each other. I think that's because the lines and circles get rounded off to the nearest pixel.\n", - "\n", - "Here's the final state of the axe at the point of impact (assuming the target is 8 m away)." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    P[0.0 meter, 2.0 meter]
    V[8.0 meter / second, 4.0 meter / second]
    theta2 radian
    omega-7.0 radian / second
    \n", - "
    " - ], - "text/plain": [ - "P [0.0 meter, 2.0 meter]\n", - "V [8.0 meter / second, 4.0 meter / second]\n", - "theta 2 radian\n", - "omega -7.0 radian / second\n", - "Name: 0.0, dtype: object" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "state = results.first_row()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "draw_func(state, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Find the starting conditions that make the final height of the COG as close as possible to 1.5 m. Ideally, the final angle should be a little past vertical." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/trees_soln.ipynb b/soln/trees_soln.ipynb deleted file mode 100644 index 12100a69..00000000 --- a/soln/trees_soln.ipynb +++ /dev/null @@ -1,1981 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Copyright 2018 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Modeling tree growth\n", - "\n", - "This case study is based on \"[Height-Age Curves for Planted Stands of Douglas Fir, with Adjustments for Density](http://www.cfr.washington.edu/research.smc/working_papers/smc_working_paper_1.pdf)\", a working paper by Flewelling, Collier, Gonyea, Marshall, and Turnblom.\n", - "\n", - "It provides \"site index curves\", which are curves that show the expected height of the tallest tree in a stand of Douglas firs as a function of age, for a stand where the trees are the same age.\n", - "\n", - "Depending on the quality of the site, the trees might grow more quickly or slowing. So each curve is identified by a \"site index\" that indicates the quality of the site.\n", - "\n", - "I'll start with some of the data from their Table 1. Here's the sequence of ages." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[2, 3, 4, 5, 6, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "years = [2, 3, 4, 5, 6, 8, 10, 15, 20, 25, 30,\n", - " 35, 40, 45, 50, 55, 60, 65, 70]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the series of heights for a site with index 45, indicating that height at 30 years is 45 feet." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    21.40
    31.49
    41.75
    52.18
    62.78
    84.45
    106.74
    1514.86
    2025.39
    2535.60
    3045.00
    3553.65
    4061.60
    4568.92
    5075.66
    5581.85
    6087.56
    6592.80
    7097.63
    \n", - "
    " - ], - "text/plain": [ - "2 1.40\n", - "3 1.49\n", - "4 1.75\n", - "5 2.18\n", - "6 2.78\n", - "8 4.45\n", - "10 6.74\n", - "15 14.86\n", - "20 25.39\n", - "25 35.60\n", - "30 45.00\n", - "35 53.65\n", - "40 61.60\n", - "45 68.92\n", - "50 75.66\n", - "55 81.85\n", - "60 87.56\n", - "65 92.80\n", - "70 97.63\n", - "dtype: float64" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "site45 = TimeSeries([1.4, 1.49, 1.75, 2.18, 2.78, 4.45, 6.74,\n", - " 14.86, 25.39, 35.60, 45.00, 53.65, 61.60,\n", - " 68.92, 75.66, 81.85, 87.56, 92.8, 97.63],\n", - " index=years)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the series for site index 65." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    21.40
    31.56
    42.01
    52.76
    63.79
    86.64
    1010.44
    1523.26
    2037.65
    2551.66
    3065.00
    3577.50
    4089.07
    4599.66
    50109.28
    55117.96
    60125.74
    65132.68
    70138.84
    \n", - "
    " - ], - "text/plain": [ - "2 1.40\n", - "3 1.56\n", - "4 2.01\n", - "5 2.76\n", - "6 3.79\n", - "8 6.64\n", - "10 10.44\n", - "15 23.26\n", - "20 37.65\n", - "25 51.66\n", - "30 65.00\n", - "35 77.50\n", - "40 89.07\n", - "45 99.66\n", - "50 109.28\n", - "55 117.96\n", - "60 125.74\n", - "65 132.68\n", - "70 138.84\n", - "dtype: float64" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "site65 = TimeSeries([1.4, 1.56, 2.01, 2.76, 3.79, 6.64, 10.44, \n", - " 23.26, 37.65, 51.66, 65.00, 77.50, 89.07, \n", - " 99.66, 109.28, 117.96, 125.74, 132.68, 138.84],\n", - " index=years)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And for site index 85." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2 1.40\n", - "3 1.80\n", - "4 2.71\n", - "5 4.09\n", - "6 5.92\n", - "8 10.73\n", - "10 16.81\n", - "15 34.03\n", - "20 51.26\n", - "25 68.54\n", - "30 85.00\n", - "35 100.34\n", - "40 114.33\n", - "45 126.91\n", - "50 138.06\n", - "55 147.86\n", - "60 156.39\n", - "65 163.76\n", - "70 170.10\n", - "dtype: float64" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "site85 = Series([1.4, 1.8, 2.71, 4.09, 5.92, 10.73, 16.81, \n", - " 34.03, 51.26, 68.54, 85, 100.34, 114.33,\n", - " 126.91, 138.06, 147.86, 156.39, 163.76, 170.10],\n", - " index=years)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the curves look like:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Saving figure to file figs/trees-fig01.pdf\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(site85, label='SI 85')\n", - "plot(site65, label='SI 65')\n", - "plot(site45, label='SI 45')\n", - "decorate(xlabel='Time (years)',\n", - " ylabel='Height (feet)')\n", - "\n", - "savefig('figs/trees-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For my examples I'll work with the SI 65 data; as an exercise, you can run the notebook again with either of the other curves." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "data = site65;" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Model 1\n", - "\n", - "As a starting place, let's assume that the ability of the tree to gain mass is limited by the area it exposes to sunlight, and that the growth rate (in mass) is proportional to that area. In that case we can write:\n", - "\n", - "$ m_{n+1} = m_n + \\alpha A$\n", - "\n", - "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", - "\n", - "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power:\n", - "\n", - "$ m = \\beta h^D $\n", - "\n", - "where $h$ is height, $\\beta$ is an unknown constant of proportionality, and $D$ is the dimension that relates height and mass. \n", - "\n", - "We'll start by assuming $D=3$, but we'll revisit that assumption.\n", - "\n", - "Finally, we'll assume that area is proportional to height squared:\n", - "\n", - "$ A = \\gamma h^2$\n", - "\n", - "I'll specify height in feet, and choose units for mass and area so that $\\beta=1$ and $\\gamma=1$.\n", - "\n", - "Putting all that together, we can write a difference equation for height:\n", - "\n", - "$ h_{n+1}^D = h_n^D + \\alpha h_n^2 $\n", - "\n", - "Now let's solve it. Here's a system object with the parameters and initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    alpha7.0
    dim3.0
    h_01.4
    t_02.0
    t_end70.0
    \n", - "
    " - ], - "text/plain": [ - "alpha 7.0\n", - "dim 3.0\n", - "h_0 1.4\n", - "t_0 2.0\n", - "t_end 70.0\n", - "dtype: float64" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = 7\n", - "dim = 3\n", - "\n", - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)\n", - "\n", - "h_0 = get_first_value(data)\n", - "\n", - "system = System(alpha=alpha, dim=dim, \n", - " h_0=h_0, t_0=t_0, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's an update function that takes the current height as a parameter and returns the height during the next time step." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def update(height, t, system):\n", - " \"\"\"Update height based on geometric model.\n", - " \n", - " height: current height in feet\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " area = height**2\n", - " mass = height**system.dim\n", - " mass += system.alpha * area\n", - " return mass**(1/system.dim)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the update function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.5439688299649954" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update(h_0, t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's our usual version of `run_simulation`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.h_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "66 140.497321\n", - "67 142.792941\n", - "68 145.089152\n", - "69 147.385935\n", - "70 149.683273\n", - "dtype: float64" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = run_simulation(system, update)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzde3ycVZ348c/MJJP7/X5Pm6anTduk6b1AobQIiAKuKPoTRZRd3YXdddfV167yExdFWVZhdV1ZwPUG4vpDES+gFbmVQktpgSZp05ymaXO/3yfJ5Dbz/P54JulMbk3bJDNJvu/Xi1dnzvM8M98JSb455znneyyGYSCEEEIEGqu/AxBCCCGmIglKCCFEQJIEJYQQIiBJghJCCBGQgvwdwHxTSoUAW4EmwOXncIQQQviyAWnAEa31kPeBJZ+gMJPTAX8HIYQQYka7gNe9G5ZDgmoCeOqpp0hNTfV3LEIIIbw0Nzdz2223ged3tbflkKBcAKmpqWRmZvo7FiGEEFObdAtGJkkIIYQISJKghBBCBCRJUEIIIQKSJCghhBAByS+TJJRS24DntNbJnuchgAMY9jrtoNb6Ws/xW4FvYs6V3w/cobVunYtYent7aW1tZWRkZC5eblkKDg4mOTmZ6Ohof4cihFhCFjRBKaUswJ3Atycc2gB0aq0nzQNXShUAPwTeCxwFHgR+Aey51Hh6e3tpaWkhIyODsLAwLBbLpb7ksmMYBk6nk4aGBgBJUkKIObPQQ3z3AX8D3D+hfTNwbJprPg78Xmv9utZ6EPgScLlSKv9Sg2ltbSUjI4Pw8HBJThfJYrEQHh5ORkYGra1z0qkVQghg4RPUo1rrzZg9IW+bgGSlVKlSqkUp9UulVIbnWAFQPnai1noAqMPsdV2SkZERwsLCLvVlBBAWFibDpEKIObWgCUpr3TjNoX7gDWAvoAAn8KznWCQwMOH8ASB8LmKSntPckK+jEEvf8PAwFRUVuN3uBXm/gKgkobX+vPdzpdTngTalVBZm8prYzQkH+hYoPCGEWPZaWlooKSlhaGgIq9XK6tWr5/09A2KauVLqa0qptV5Nds+/g5jDe8rr3HAgG69hP3Fpvve973HXXXed97z6+nqUUvT29i5AVEKIQNLf38/QkFls/NSpUzidznl/z4DoQQGFwBal1Mc8z78LPK+1blNK/Rx4XSm1GzgEPAC8q7U+5Z9QhRBi+VmxYgVNTU0MDAxQWFi4IPfvA6IHhTn1vAs4DVRjrof6BIDWugz4NPAo0A6sAz7slyj9rL6+ni1btvDkk09y+eWXs23bNp588kmeeuopdu3axfbt2/nJT34CwMGDB7nlllvYtGkTN954I/v27fN5nU9+8pMUFxdzyy23UFtb6/M+Tz/9NNdddx1bt27lzjvvpK6ubiE/phDCz4aGhiZNerJYLGzatIndu3eTkpKyIHH4pQeltX4ViPV63gHcNsP5zwDPzH9k4+/HqVNmB2316tUopXyOnzhxgjNnzgBQUFBAXl6ez/HS0lJqamoAKCwsJCcnx+f4O++8Q0NDw5SvfT4Oh4Pjx4/zyiuv8OKLL/KFL3yBm2++mZdeeokDBw7wd3/3d2zYsIHPfvazPPjgg1x77bUcOXKEu+66i6SkJDZv3sznPvc5CgoK+MEPfoDWmjvvvJMtW7YA8MILL/Cf//mfPPbYY+Tn5/PjH/+Yv/qrv+K55567oDiFEIuPYRg0NTVRVlZGamoqRUVFPscXetZzoPSgxAW46667sNvt7Ny5E5fLxe23347dbufqq6/G5XLxox/9iO3bt3PDDTcQFBTEzp07ufHGG3n22Wepq6vj+PHjfP7zn8dut7NhwwZuvvnm8dd++umnuf3221m3bh12u53PfOYz9PX1cfjwYT9+YiHEQujq6uLtt99meHiY2tpav69tlAS1CMXGmp1Pm80GQFRUFABWq/m/c3BwkPT0dJ9rMjMzaWpqoq2tjZCQEOLi4nyOjWlsbOSRRx5hy5YtbNmyha1bt+JwOGhsnG6FgBBiqYiPjx//3REWFjb+O8VfAmWSREBRSs049LZu3TrWrVs37fHCwkIKCwunPb5p0yY2bdp00fGdb83Rli1bOHrUdy10XV0diYmJpKSkMDQ0REdHBwkJCYA5fXRMcnIyt99+Ox/96EfH26qqqkhPT6ejo+OiYxZCLA7r168nNDQUpRRBQf5NEdKDWoKuuOIKjh49yh/+8AdcLheHDh3i97//PTfeeCMZGRls27aNBx98EKfTSUVFBb/+9a/Hr/3ABz7Aj3/8Y6qqqjAMg9///vfcfPPNPklMCLG4GYZBfX09b7/9NoZh+BwLCQlh3bp1fk9OID2oJSkoKIhHHnmEhx56iHvuuYeUlBTuu+8+rrjiCgD+4z/+g3vuuYfLLruM9PR0rrnmGjo7OwEzQfX29nLXXXfR2tpKdnY23//+98nNzaW+vt6fH0sIMQcMw+Do0aM0NzcDkJSURHZ2tp+jmpplYvZcapRSucDZl156yedeC8DJkydZu3btlNeJCydfTyEWB++ZyDExMezatctv5crq6+vZu3cvwAqtdbX3MelBCSHEMrNmzRpaW1tJSkpizZo1AVtLUxKUEEIsUWPrmlJTU31m5NlsNq688srxmcAX87pt3U5O13XjchlsLUghNGTu04kkKCGEWIIGBgYoLS2lra1tyqIAF5OcevqGqKzrRtd00eUYPHfAArs2Zkx/4UWSBCWEEEtQS0sLbW1tAFRWVpKWlnZRO14PDI5QVd+Dru2iuaN/ynPio0MvKdbpSIISQoglKDc3l8bGRrq6uli5ciURERGzvnZk1MXZxl50TRd1LQ7cU0ymCw6ysjI9hjW58WSlRM1l6OMkQQkhxCJnGAZut9tn2M5isbBx40aGh4d9KsdMx+U2qG9xoGu7ONvQw4hr8qaEVouF7NQoVmfHsSI9muCgi7uHNVuSoIQQYhHr7++npKSE8PBwNm7c6HMsIiJixp6TYRi0dA6ga7o4Xd+Nc2h0yvPSEiJYnR3HqqxYwuZhMsR0JEEJIcQiNTAwwP79+3G5XHR0dJCenk5ycvJ5r+vqHUTXdnGqtove/uEpz4mPDmV1dhz5WbHERIbMdeizIglqGWhpaSE+Pp7g4GB/hyKEmEPh4eGkpKTQ2NiIxWKhr69v2gTV5xzhdF0XuraLtq6pd8ONDAsmPyuO1dlxJMaG+n19lCSoRewTn/gEe/fu5Y477pj2nPb2dq6//nr2798vCUqIJWj9+vUMDw9TUFBATEyMz7GhERdnPDPwGtr6JtXdAwgJtpGXGUN+VhwZSZFYrYGzaFcS1BI3ODjIwMCAv8MQQlwih8NBbW0tBQUFPj2bkJAQdu7cOf587L7SiTMdVNZ1MzrFZAeb1UJuWjSrs+PISYsmyBaYdcMlQS0iBw8e5Jvf/CYNDQ1cffXVOJ1mN72pqYn777+fEydO0NnZiVKKr3/966xZs4ZbbrkFgKuuuoof/ehH5OXlcf/993P06FE6OjrIzs7my1/+ss83uBAisFRVVVFRUYHb7SYqKmrK4q6Dw6NU1nZz/EwHHT2Th/AsFgsZSeZkh5UZMYTaA//Xf+BHuMDe1a28Vd7MyOjkvzrmWnCQlW0FqRSr89/UbG9v5+677+YrX/kKN910E7/73e/40pe+xPvf/37uueceVq5cyXe+8x1cLhf33HMPDz/8MI8//jjPPPMMe/fuZf/+/URHR/OVr3wFp9PJ888/T3BwMA899BD3338/zz///Lx/XiHExRkaGsLtNn8nnTx5koyMDGw226x6SwkxYaicOFZnxRIZbl/o0C+JJKgJjp1qW5DkBDAy6ubYqbZZJahXX32VzMxMPvjBDwLwwQ9+kJ/+9KcAfOMb3xjfZbexsZGYmBiqqqqmfJ3Pfe5z2O127HY7jY2NREdH+31bZyHEzJRSNDc3ExwcTFFREaNuKD/bzomzHbR3T+4tBdus5GfHUrAigZT4cL9PdrhYkqAm2Lg6aUF7UBtXJ83q3Pb2dlJSUnzaxrYPqa6u5lvf+hZNTU3k5eUREhIy5c1QgNbWVr75zW9SWVlJbm4uiYmJ054rhFh4DoeDiIiIScVdt2/fTq/T4IjupLKuesreUmJsGOtWJLA6J46Q4PldRLsQJEFNUKySZ9WjWWjJyck0Njb6tLW0tDA6Ospdd93F/fffz/ve9z4AfvKTn/Dss89O+Tr/+I//yC233MITTzyB1Wrlz3/+M4cPH573+IUQM3O73VRWVlJZWUl+fv54cdehERenarqm7S0F2azkZ8WybuXi7i1NRRLUIrFnzx4efPBBfv7zn3Prrbeyb98+ysrK2LNnD0NDQ4SGmsUaT5w4wRNPPDH+3G43x5wdDgfR0dH09fURGhqK1WqlpqaGRx55hJGREb99LiGEqaGhgVOnTgFw6tQpbKEx1LYNU1nbPWXZoYSYMNavXDq9pakE5txCMUlsbCyPPfYYv/zlL9myZQvPPvssl112GeHh4Xzta1/jvvvuY/PmzXzpS1/iIx/5CI2NjfT395OUlMTVV1/NDTfcwKuvvso3vvENfvazn1FcXMxnPvMZbrrpJkZGRqirq/P3RxRiWcvMzCQqJo7GboOTLaE8d7Ce8rOdPskpyGZlbW48H9qTz0ffs5oNqxKXbHICP235rpTaBjyntU72PE8GvgvsBSzAH4HPaa27PMefAG4FvAtFFWqtz8zivXKRLd8XhHw9hZg9wzCwWCwYhkFrl5MTZ9opP9OGwzFAVLRvdfCx3lJ+duyimB5+IQJmy3ellAW4E/j2hEP/A/QAK4Bg4Eng+8DHPMc3AR/QWu9boFCFEGJeuFwutNY4B4cJicnkxJkO2sbuLVls48lpKd9bmq2FTsX3Ae8D7gf+L4BSygq4gfu01v2eth8A/+V5HAasAY4tcKxCCDGnRkZGeOmVA1TW99HUYxCf4CQ0LMznnIToUNblJbA6O27J9ZYu1EJ/+ke11vcqpXaPNWit3cAHJpz3AeBdz+ONmEN7P1BK7QDqgHu11s8tQLxCCDEnOnqcHDvVxltn3Dj6zFsr/f0DhIaFSW9pGguaoLTWjec7Ryn1BcwEdZmnKQo4gNn7KgFuAp5WSu3UWpfMV6xCCHGpDMOgrsXBsVNt1LY4AIiNjWNwaJjo6GjSU+IpWpWEypXe0lQC5iuilAoGvgfcCOzRWlcAaK1fAF7wOvUZpdSnMBPVJSeosRuV4tLIYl8hznG53Jw8285rb5/BbQ31OWa12di0fhUbVTIr02MCqnp4oAmIBKWUigJ+j9lb2qa1bvA6diMQr7X+qdcldmDwUt83ODgYp9NJeHj4pb7Usud0OmU7D7HsDQ6NcvxMB4fLaqlvbGV0dJSEhAQiIyOxWCyszIiheHUSqQnT73IrzgmIBAX8AnNN1i6t9cS9IWzAd5VSJ4G3gY9gDv/95aW+aXJyMg0NDWRkZBAWFiY9qYtgGAZOp5OGhoZJpZiEWC66HUOUVLZxsrqTUZebru4+RkfNVTG9PV1sW5/J5rVpftuZdrHye4JSShUCNwBDQOtYeQ+gW2udqbX+jVLqHuB/gVSgAni/1rr2Ut87OjoaMAusSjWFixccHExKSsr411OI5cAwDJra+zlW2cbZxl6fYe7Y2Fjco4OkRRtcc/l6VuRmyR/AF8EvCUpr/SoQ63lcirk4d6bzv4+5LmrORUdHyy9WIcSsud0GVQ3dHDvVRkvnAG63G6vFAp4ElBgbxsbVSaTErCAsNHS87Ji4cH7vQQkhxGIwPOKi/GwHpafb6e0fBsx7r50dnURERlC0JpuNq5PITI6U3tIckQQlhBAz6BsYpuR0OyfOdDA84hpvHxwcpL2tleRoC5nxDq4sTCAmJmqGVxIXShKUEEJMoaPHydsVrZyu68Y9YRlFWEgQW9fmMNAxSl9vFyEhIQwPD/sp0qVLEpQQQnjp6HFy9GQLp+t7Jq3vi40KYWN+Emty4wmyWenvj6ayspKCgoLxrW3E3JEEJYQQzJyYokLcZMTB3ivW+NxfioiIYOPGjQsd6rIhCUoIsax19g5ypLx5ysSUkxpFmKsNp6MNZze0tWWSnBx4O24vVZKghBDLkpmYWjhd3z0pMa1Ii2ZrQSrJ8eG8804PDWYZPU6dOkVSUpLM0lsgkqCEEMvKbBPTmPXr19Pe3k5KSgoFBQWSnBaQJCghxLJwvsS0ZW0KjPaRFOe7P5Pdbmf37t0yCcIPJEEJIZa02fSYosIslJaW0traSmFhITk5OT7nSXLyD0lQQoglaabElOtJTCmeobyKigpaW1sBKC8vJzk5mbAJO92KhScJSgixpFxIYhqTn59PU1MT/f39ZGdny9YxAUISlBBiSejqHeTIyRYq6yYnppzUaLatMxOTYRhmgVerdfy4zWajuLgYt9tNfHz8QocupiEJSgixqM02MQH09/dTUlJCfHw8a9as8Tk3NjZ2wWIWsyMJSgixKHU7hnirvHlWiQmgt7eX119/HZfLRWdnJ2lpacTExCx02OICSIISQiwqg0OjHDnZQllVO2735MS0tSBlyi3Vo6KiiI2NpaOjA4Du7m5JUAFOEpQQYlFwudyUnm7naEULQ8Mun2MzJaYxFouFoqIi3n33XTZs2CDJaRGQBCWECGiGYXC6vptDZU3jGwWOSUuI4PKi9EmJyeFw0NzcTH5+vk97REQEl19+uVSDWCQkQQkhAlZjex9vlDTS0jng0x4bGcLODWmszIjxSTaGYVBZWUllZSVut5vo6GhSUlJ8rpXktHhIghJCBJxuxxCHyhqpaujxaQ+1B7G1IIX1KxOw2ayTrrNYLPT19eF2uwE4ceIEycnJkpQWKUlQQoiA4Rwa5Wi5ZwKE18w8m9VCYX4Sm9ckE2qf+dfWWHHX8PBwioqKJDktYpKghBB+N+qZAPH2yRaGRnwnQORnxbFzQxrREZPr4TkcDiIjI32SkN1u57LLLiMiIkKS0yInCUoI4TeGYVBZ182bxydPgEhPjOTyovRJZYkAXC4Xp06doqqqig0bNkwq7hoZGTmvcYuFIQlKCOEXjW19vFE69QSIywrTWZEePW0P6OzZs5w+fRqQ4q5LmSQoIcSC6nIM8mZZ05QTILatS2HdykRs1pmH5lasWEFdXR19fX1SomgJm1WCUkrdCLwX2AIkAy6gGTgCPKe1fvFC3lQptc1zXbLnuR34L+BDntd+WGv9gNf5twLfBNKA/cAdWuvWC3lPIYR/OYdGOVLezPGqjkkTIIryk9i8NoWQYNuU1xqG4dObstlsbNy4kd7eXrKzs+Ve0xI1Y4JSSt0O3AtEAn8GngU6ABuQCBQBTyqleoFvaK2fOM/rWYA7gW9POHQfoIA8IAbYp5Rq0Fo/oZQqAH6ImSCPAg8CvwD2XMDnFEL4yajLTWmlWQFieMIECJUdx/b1U0+AABgdHaW8vBy73T6puGtcXBxxcXHzFrfwv2kTlFLqRaAT+BTwutbamOY8C3At8DdKqTu01jMljvuA9wH3A//Xq/2TmL2iLqBLKfVt4LPAE8DHgd9rrV/3vN+XPOfka60rZ/k5hRAL7HwTIK4oSid5igkQY5xOJ2+88QZOpxOLxSLFXZehmXpQ/6y1fvt8L+BJXH8C/qSU2nKe0x/VWt+rlNo91qCUisUcuiv3Oq8C2OB5XIDZcxp7vwGlVJ3nuCQoIQJQe7eT/e/U09TR79MeGxXC5YXp5KZNPwFiTGhoKOHh4TidTgzDoKGhQRLUMjNtgvJOTp6hvv+ntR7yPkcpFQH8ldb6O55rjjIDrXXjFM1j80G9p/IMAOFex32n+fgeF0IEiOERF2+VN1Na6bvQNiwkiG0FqRSsTDjvBIgxY8VdDx06xNq1a0lPT5+vsEWAmmmIz+45bgF+DOxXSrVNOG0z8ADwnUuIYexPLO85ouFAn9fxifNHvY8LIfzMMAyq6nt4vaSBPufIeLvVamHjeSZAAAwPD9PU1DRpPVNERAR79uzx2f1WLB8zDfHdDjwOjP0ZdGaa856/lAC01l1KqWbMSRINnuY1nBvyK/ccA0ApFQ5k4zskKITwk27HEK8dq6e22eHTnpkcyVXFmcRFh854fVNTE2VlZQwNDREaGjqpuKskp+VrpiG+/1FKnQKswMvALZiTJsYYmL2YsjmI40ngq0qpUswhvS8A3/Uc+znwuue+1SHMHtu7WutTc/C+QoiLNOpy805FK29XtODy2jgwPDSYK4rSyc+KndX076amJoaGzLsHpaWl7NmzB5tt+t6WWD5mnGautX4NQCm1AqidbibfHLgXeAg4gZkQHwce9cRQppT6tOd5BnAY+PA8xSGEmIWa5l5ee7eBnr5zt6UtFgsb8hLYti71vAVdvY0Vd7VYLBQWFkpyEuMshjG7nONZLPtFIB/YBNwNNGmtJ65pCihKqVzg7EsvvURmZqa/wxFiUesbGOZASSNV9d0+7Snx4VxVnDnjtHGAoaEh7Hb7pJ5Vd3c3ERERBAcHz3nMIrDV19ezd+9egBVa62rvY7Ma3FVK3QE8AvwaGFtRdxK4Vyn1L3MWqRAiILncBsdOtfLUnyp8klOI3cbuTZnccnX+jMnJMAxqa2t5+eWXqa2tnXQ8NjZWkpOYZLZ3H/8J+BtP+SEXmPeoMBfxfnaeYhNCBICm9n6efvEUr5c0MjLqHm9fkxPPbdetYX1eItbzTB2vq6ujpKRkvDLEwMDElSNCTDbbgeI8vBbLejkGpM5dOEKIQOEcGuVQWSPlZzt92uOjQ9m9KZP0pNlvaZGRkUFVVRV9fX2EhIQwMjJy/ovEsjfbBKWBa4AfTGi/FbPqgxBiiTAMg/KznRwqa2JweHS8PdhmZWtBKkWrk2a92HbMWHHXpqYmlFIyEULMymwT1JeBX3lKGQUBf62UWgW8H7MCuRBiCWjvdvLqO/U0TyhRlJcRwxUbM4gKn7qo6xjDMDh79iyjo6OsXr3a55gUdxUXalYJSmv9R88WGV8EjgPvwZwksUNr/c48xieEWADDIy4On2im9HQ73jN7oyPs7NqYwYr089fAGx4e5q233qKrqwuLxUJKSorUzhOXZNaLFbTWJ4A75i8UIcRCMwyD0/XdvFHSOKlE0SaVzOY1KQQHzW4uVXBw8HjVB8MwOHPmDMXFxfMSt1geZp2gPOugvgCsxlwHdRfQHOjroIQQU+t2DLH/3XrqWiaWKIriqk0ZxEXNXKJoorHirgcOHCAvL4+8vLy5DFcsQ7PdUfcOzE0GHwK+4mmuAB5WSgVprf9tfsITQsw1wzAorWzn0PEmRl3npo1fSIkit9tNc3PzpArjERERXHPNNQQFzb6ShBDTme130dg6qF8qpb4M47X6ujATlyQoIRaBbscQLx+tpbH93CSIsRJF29enzVhxfExXVxclJSU4HA5sNtuk4q6SnMRckXVQQiwD0/WaEmPD2LM567wlirxVV1fjcJjDgqWlpezevVuqQIh5IeughFjipuo1WS0WtqxNYfOaZGy2C9vOYt26dbS1teFyuVi1apX0mMS8kXVQQixR0/WaEmLCuGZrNklxE/cBnWx0dBSbzeZzT8put7N582bCwsIID5eNrcX8mdWfTlrrPwLbgBDOrYMaxFwH9bv5C08IcTG6HUM8+2oVB0oaxpOT1WJh69oUbt2bP6vk1NbWxquvvkpNTc2kYwkJCZKcxLybacv3s8DlWutGpdS9wLe11ncsWGRCiAs2U69p79YskuNml1Sampo4etS87Xzy5EmSk5MlIYkFN9MQXzKwHmgEvgr8NyAliIUIUOa9pjoa2/vG26wWC5vWJLN1bcoF3WtKTk4mKioKh8OB1WplYGBAEpRYcDMlqF8C+5RSY3VPmpVSU56otZbKj0L4iWEYlJ5u51DZpfWavNlsNoqKijhz5gzr168nJCRkLkMWYlZmSlCfwtx6PQ74PfAJoHuG84UQC6ynb4iXjlx8r8kwDBobG3E6naxatcrnWFxcHJs3b56XuIWYjWkTlNbaAA4CKKU+BfxKaz20UIEJIaZnGAZlVe0cKm1ixLvXFB3K3q3Zs1rXNDo6yrvvvktzczMWi4XExERiY2PnM2whLsi0f14ppV7yVDBHa/3T8yUnpdTlSqmX5zpAIYSvnr4hfrO/itfebRhPTmPrmm69ZvWsF93abLbxjQMNw0BrPW8xC3ExZhri+2fgMaWUC/g1sA8o11oPAyilQoAi4Crg455r/moeYxViWZuLXpO3seKur732GhkZGRQUFMx1yEJckpmG+I4qpbYCfwH8LfB1wKKU6gcsQAQwCrzuOfaMZ1hQCDHHevrMGXoNbRd/r6mtrY3k5GSf9oiICK6++mpCQy+scrkQC2HGShJaazfwDPCMUioKKAZSADfQDJRqrR0zvIQQ4hLMRa+pv7+fkpISOjo62Lp1K6mpvuUzJTmJQHUhGxY6gNfmMRYhhJfpek3FKpltBbNf13T69Gk6OjoAKCsrIyEhQYq7ikVBqjwKEYAqajrZ/049I6OXfq9p7dq1tLS0MDw8TFZWFjabLFsUi0NAJCil1G3AYxOaw4CXgBsBBzDsdeyg1vraBQpPiAUzPOJi/zv16Nqu8bYL6TW53W4sFsuk4q7FxcXY7XZiYmLmLXYh5lpAJCit9VPAU2PPlVLFwAvAF4ENQKfWWvadEktac0c/Lxyuobf/3N9isZEhvGd7Dimz6DV1d3dTUlJCTk4Oubm5PseSkpLmOlwh5t2sBrGVUvcqpSb9hCilopVSD89lQEqpYMxk9a9a6xJgM+bGiEIsSW63wdGTLfz6ldM+yWltbjwfec/qWSWn1tZWXn/9dXp7ezl58iQDA1I2Uyx+M1UzzwDGxgO+CryslOqccNpG4K+Bz89hTHcDTuARz/NNQLJSqhRzBuFrwD9orRvm8D2F8Iu+gWH+/Fatz0SIkGAbuzdnkp8VN+vXSUxMJDIyEofDgWEY9Pb2SnFXsejNNMS3FXOB7tjapulm8P1wroJRStkxh/X+2mtNVT/wBvA1YAT4T+BZzP2phFi0quq7efntOoaGXeNtaQkRvGd7DtER9gt6LavVSlFREVprCgsLJTmJJWGmhbq/UUrlYg4DnsFMCK18P5YAACAASURBVG1epxhAn9Z6Yq/qUlyPucbqea84fHpnSqnPA21KqSytdd0cvrcQC2Jk1M0bJQ0cP9Mx3mbxbCa4ZW0KVqtlhqvNjQR7e3vJy8vzaY+Li2PHjh3zErMQ/nC+hbq1noez30jm0twMPO1ZIAyAUuprwP9qrU96msb+tBxcoJiEmDPt3U5eOFxDZ++5b9/IsGCu3Z5DelLkjNe6XC7Kysqoq6vDYrGQkJAgxV3FkjarWXyeKhL/gll7Lwyz1NE4rfWeOYpnB/CVCW2FwBal1Mc8z78LPK+1bkOIRWJsz6aDpY243Ocqgq3KjGX35kxC7ef/UbRarTidzvHXKy8v57LLLpu3mIXwt9lOM/8hsAfz3s987gmVi7mDr7c7Me87ncaM93ngM/MYgxBzamBwhJeO1FHT3DveFmyzsqs4g7W58T5rlmZisVgoLCxk//79pKSksH79+vkKWYiAMNsEdQPwXq31gfkMRmsdMUVbB3DbfL6vEPOltrmXF4/UMTA4Mt6WFBfGtdtziIuavgaeYRh0dnaSkJDg0x4REcHu3btlEoRYFmaboHrwnSAhhJiBy+XmzePNvHuq1ae9eHUyO9anzlgRwul0UlpaSmtr65TFXSU5ieVitpMfHgYeVErNfmGGEMtUl2OQX71S6ZOcwkODuWnXSi4vSj9vuaLKykpaW81ry8rKxjcVFGK5mWmhbhvn1kABJGJO7+4BXN7naq19N5kRYhkyDIOT1Z0c8NrpFiAnNZq9W7MID51dBfE1a9bQ3NzM8PAwaWlps75HJcRSM9MQ3xcWLAohFrnB4VH2v1NPZd25OUQ2q4XLCtMpXJU4bZIxDPNvwKmKu9psNuLj4+c3cCEC2EwLdX+6kIEIsVg1tvfx58O1OAbO1dGLjw7l2u05JMaGTXtdb28vJSUlZGZmsmLFCp9jUtxViNmvg/rRNIcMzG0wGjC3fD85zXlCLDljRV6PnGwZ7wkBrF+ZwOVFGQQHTX+vqb29nTfffBPDMOjr6yMlJUUmPwgxwWwnSTiATwJrMddBdQP5wKcwC7juAI4qpa6fjyCFCDR9zhF+s/80b5U3jyenELuN9+7MZffmrBmTE0B8fDyRkWblCLfbTXf3fC4vFGJxmu0085XAv2mt7/FuVEp9BdiktX6/UuozwP3AvjmOUYiAUtfi4IXDNTiHRsfbMpIiec+2bCLDZ1fkday468mTJyksLBxPVkKIc2aboPYw9ZYavwC+5Hm8D/iPuQhKiEBkGAZvV7Ry+ESzz+SG7etS2aSSpy3y2t7eTk9Pz5TFXXfu3Cmz9ISYxmwTVB1wHVA5of16oNnzOAfoQoglaHB4lBffqqW66Vy5ovDQYK7bkUPGNEVeXS4Xx48fp7a2dtrirpKchJjebBPUvcDPlFK7gSOY9642AzcCn1JKFWDugvu/8xGkEP7U2jnAvjerfXa7TU+M5LodOUSETb+2yWq1ju9sK8Vdhbhws5okobV+GtgNDAEfBz4MDACXaa1/DkQC/w788/yEKcTCMwyDE2c6eOaVSp/kVKyS+cBVeTMmJzB7R0VFRdhsNtLS0ti8efN8hyzEkjLbHhRa64PAwWmOvQW8NVdBCeFvI6Nu9r9TR0XNuVFre7CNa7ZmszIjZtL5hmHQ0dFBYmKiT3t4eLgUdxXiIs1U6uhp4C+11r2ex9PSWt8655EJ4SddjkH2Haymw2tTwcTYMK7fkUtsVMik8wcGBigrK6O1tZUtW7aQlpbmc1ySkxAXZ6YeVD/navH1L0AsQvjd6fpuXj5ax/DIuXKTa3PjuWpTJkHTFHk9ffr0eHHX48ePk5iYSHDw7OruCSGmN1Opo09N9ViIpcjlNjhU1sixU+d2lbFZLVy1KZOCFQkzXAlr164dL+6anp4uM/OEmCOzvgellMoB7gZWA3+DOe28Qmv95jzFJsSC6HOO8KdD1TR1nBsoiI6w896dK0iK862l53a7sVgsPkkoODiY4uJigoKCiIuTHWmEmCuzmsWnlNoOnACKgPcCYcBG4DWl1I3zF54Q86uuxcH/+7P2SU4r0mO49ZrVk5JTd3c3Bw4coLq6etLrJCUlSXISYo7Nthbft4D7tdbXYRaHRWv9D8DXgK/PU2xCzBvDMAu9/u7AmfGSRRaLhcs2pHPDZbmE2n0HF9ra2nj99dfp7e3l5MmT4+ubhBDzZ7YJqhj45RTtT2EO+QmxaAwOj/KHN87y5vGm8ZJF4aHBfOCqPDatSZ7yHlJCQoJPvbyenp4Fi1eI5Wq296A6MKuXV01o3wq0zGlEQsyjS6kKUVRUhNaaDRs2EBERsRDhCrGszTZB/RfwmFLqXwALsFEp9X7MEkjfnq/ghJgrhmFQfraT196tx+U+t3dTsUpmx/o0bF6FXpubm3E4HOTn5/u8RlxcHDt27FiwmIVY7maVoLTW31ZKOYAHgHDgV5hFYu8Hvjt/4Qlx6aarCrF3SxZ5meeKt7pcLt59912ampqwWCwkJSVNKu4qhFg4F1Lq6DHMXlQEYNNa957vGiH8rcsxyL5DNXT0OMfbpqsKYbVaGR01J0wYhkFFRYX0mITwo5lKHRXMdKFSavyx1rp8DmMSYk5U1Xfz0hRVIa4szpxyx1uLxUJhYSH79+8nPT2dgoIZfwSEEPNsph7UccxSR95TmsYG7ye22S41EKXUp4HHMCumj7kbcwuP/wI+BLiAh7XWD1zq+4mly+02OHyimbcrzs3fsVktXFmcScGKeCwWC4Zh0NLSQmpqqs+14eHhXH311YSGhi502EKICWZKUCsmPLdgJq0bgJp5iGUT8JDW+l+8G5VSDwAKyANigH1KqQat9RPzEINY5AaHR/nz4Vpqms+NQEdH2Ll+Zy7JcWbR1t7eXkpKSuju7p6yuKskJyECw0y1+CYlIaWUAdRPdWwObGbqCRefBO7QWncBXUqpbwOfBSRBCR9dvYM8f/As3Y5znfDs1Ciu3Z7js/C2urqa7u5uAMrKyqS4qxABataTJOaTUsoGFAKfUEo9jLkZ4v9gDvmlAd73uCqADQsepAhoZxt7+PNbtT73mzZ5ppBbrb4Lb8eKu46MjLBixQpstkseoRZCzIOASFBAEnAU+CnwQWAt8FvA7jnuXVdmAHOquxAYhsHbFa0cPtE8XhUiyGZl79Ys8rPiGB0dxWKxTSruunnzZkJCQnyqQwghAktAJCitdTNwlVfTMaXU9zAL04JZnHZMONC3ULGJwDUy6uLFI3VU1XePt3lXIW9ubqasrIy8vDxWrlzpc21CwsxbaAgh/G+maeZ3TXP+x5VS7d6NWutHLiUIpdQ64Fat9Ve9mu3AIOaCYAU0eNrX4DvkJ5ahnr4h/nCw2md9U0aSWbIoPDSYpqYmjh49CkBFRQWpqamys60Qi8xMPagvTtHWDEzcvNAALilBAd3APyml6oEfYhan/XvgbzG3+fiqUqoUiAS+gFSvWNbqWhz86c0aBodHx9sKVyVyeVHGeMmilJQUoqKicDgcBAUF4XQ6JUEJscjMNItv4jTzeaO1blBK3QT8O/AfQDvwda31r5RSzwEPYSYqK/A48OhCxSYCh2EYlFS28UbpuSrkNquF3ZuyWLsi3ufcseKuNTU1FBQUYLfbp3pJIUQAC4h7UABa65eBLVO0D2Iu2L17wYMSAWPU5ebVt33r6UWEBnP9zhz6u5s5ebKFtWvX+lwTFxcnmwgKsYgFTIISYjp9A8P84WA1rV3nJnOmJkSwd0s6ZcfepqenB4vFQmpqqiQkIZYQSVAioDW29/HHg9Xju94CFKyI56riTKxWCyEhZsFXwzA4e/asJCghlhBJUCJgHa9q57VjDbg9+zdZLRZ2bcxgfV7C+LqmDRs2cODAgSmnkgshFjdJUCLguFxuDhxr4PiZjvE2e5CFopwQNqxK9Dk3PDycvXv3EhQk38pCLDXyUy0CysDgCPsOVdPY3j/eFmIdITm4k9aGYZrSYiYVd5XkJMTSNHlTHCH8pLVzgKdfPOWTnPKz4ti80o7VGAbM4q4ul2u6lxBCLCHyp6cICBU1nbxytA6X536TxWJh54Y0ilcnMTqaTntbC1arlQ0bNkhxVyGWCUlQwq/cboODZY0cO9UGwMjICJHhoVy7I4ec1GjALO66fft2IiIiZDhPiGVEftqF3wwOjfKnwzXUtTgwDIOenh5GB3vZU7hmPDmNiYmJ8VOUQgh/kXtQwi86epw8/dIp6locAPT19RHk6qUoCxpqTzMwMHCeVxBCLHXSgxIL7mxjDy8crmFk1D3etmfbKgbaKujr6yM2NtaP0QkhAoUkKLFgDMPg3VNtHCptNIu9WiwEB1l5z7YcVmbE0NUVisPhICsry2eDQSHE8iQJSiwIl8vNK2/Xc7yqlY6ODuzBdnKyUrjhshUkxpr7UUpxVyGEN0lQYt4NDI7wx4PV1DZ309RkbpURYh3imk3rx5OTEEJMJAlKzKv2bifPv3EWx8AwwcHBhIaGEmMfJD/FwpCzD0jyd4hCiAAlCUrMmzMNPfz5rXOTISwWCzdcuRZXby3r16+XqeNCiBlJghJzzu128+IhzaGyRhISEgCwB9u4bnsOOWnRQJZ/AxRCLAqSoMScGhl18eNfHaCyvgeAsLAwUpNief8VK4mPDvVzdEKIxUQSlJgz/c4R/nDwLM0959Y32Vx9fHjPVsJCg/0YmRBiMZIEJeZEa9cAf3jjLH3OEWJjY3EOOFmbG8et791MqCQnIcRFkAQlLtro6Chnz56F0EReOlLHqMvsOdlsNj783s0UqxRZcCuEuGiSoMRFaW5uprS0lFMNg/S6Y4mONou7hgTbuG5HDtkTir0KIcSFkgQlLkp3Ty/Hzg7S5jCwWnqIiIggISac912xgrgomQwhhLh0kqDEBetzjlBSa9AzGIzN5iI+Lo6ctBiu35lLqF2+pYQQcyNgfpsopd4D/BuQD7QC39JaP6aUCgEcwLDX6Qe11tf6Icxlqauri8jISIKDg2npNCdD9A+OkJSUiNVmoyg/mSs2ZmCzyv0mIcTcCYgEpZTKAp4BPgn8FtgM/EkpVQ10AJ1a61S/BbhMDQ8PU1FRQU1NDbm5uYTEZPLy0XOTIex2O7uKM9iQl+jnSIUQS1FAJCggF/i51vpZz/MjSqlXgcuBBuCYn+Ja1trb26mpqcEwDPYfrWbY7sRutwMQYrdx/Y5cslKi/BylEGKpCogEpbU+ABwYe66Uigd2AU8C1wPJSqlSIAV4DfgHrXWDP2JdTtLS0ohPSOL10lYGXKHEh9oAiIsK5X2XryA2KsTPEQohlrKA2/JdKRUD/A44jDnc1w+8AewFFOAEnp32BcRFcblcDA0N+bT1OUc40xWJJSyRpOQkbEE2slOj+NDefElOQoh5FxA9qDFKqdWYSakcuE1r7QY+P+GczwNtSqksrXWdH8JcclpaWjh+/DhRUVFs3boVi8VCQ1sf+w5V4xwaJTw8HICi/CQuL0zHKpMhhBALIGASlFLqSszk9CjwZa214Wn/GvC/WuuTnlPtnn8HFz7Kpaevr48jR45gGAYDAwM0NjXR0GXlyMkWc1t2wGq1cFVxJutWJvg5WiHEchIQCUoplQc8B9yjtf7ehMOFwBal1Mc8z78LPK+1blvIGJeqyMhIsrOzqampwU0QLx5txjF0buQ3LCSI9+7MJT0p0o9RCiGWo4BIUMDdQBTwgFLqAa/27wN3Av8JnMaM93ngMwse4RIxOjpKUJDv//a1a9fS2jPCmfYghkeN8faMpEjesz2HyDAp9iqEWHgBkaC01p9nwr2mCW5bqFiWqsHBQcrLy3E4HOzatQur1ewluVxu3jrZRkWzDTCTk8ViYWtBClvWpMj9JiGE3wREghLzy+12c+DAAQYHzdt21dXVrFy5kp6+IV44XENL58D4uZFhwbxnew4ZMqQnhPAzSVDLgNVqZcWKFZw8ac4zcTgcnK7v5pWjdQyNuMbPy0mNZu/WLMJl/yYhRACQBLUEGYYxaR+mlStX0tXVRWZWNrpxhAOHqsePWS0WdmxIo3h1kuzfJIQIGJKglhC32011dTXV1dXs2rWL4OBzPSGr1cqqNRv405s1tHc7x9ujI+xcuz2H1IQIf4QshBDTkgS1hBw5coTW1lYAtNasX79+/FhFTSf736lnZNQ93paXGcvVmzNliwwhRECS30xLSFZW1niCam9vx+1243Ib7H+ngYqazvHzbFYLV2zMYP3KBBnSE0IELElQi9RU95nS0tJITU0lPj6eFStW0Nk7xL43q+l2nKuxFxsVwvU7ckmMDVvokIUQ4oJIglpkDMOgqamJiooKtm/fTkTEuXtHFouFLVu2AHDiTAcHjjXgcp9beLsmJ46rNmUSHGRb8LiFEOJCSYJaZMrLyzlz5sz4461bt/ocHxpx8crb9VTVd4+3BdusXLUpkzW58QsaqxBCXApJUItMRkbGeILq7OxkcHCQ0NBQAFo6B/jTm9X09g+Pn58YG8Z123OIiw71S7xCCHGxJEEFsKnuM8XGxpKTk4PNZmP16tUEBwdjGAbHTrVxqKwJt3FuSG/9ygSu2JhBkC3gtv0SQojzkgQVgAzDoLm5mfLycoqKikhMTPQ5vmHDhvHE5Rwa5aUjtVQ39Y4ftwfb2LM5i1VZsQsatxBCzCVJUAGoqqpqvCxReXk5u3bt8ulJjT1ubOvjhcM19DlHxo+lxIdz7fYcYiJlx1shxOImCSoAZWZmcurUKVwuFwMDA/T19REVFTV+fGBwhCPlLRw/0zG+qSBA8epkdqxPxSZDekKIJUASlJ8NDw8THBzs00MKDQ1l1apVjIyMkJ+fj91ubiI8Muri2Kk23tGtPhUhQu1BXLMtm9y06AWPXwgh5oskKD8ZHR3l7NmznD59mnXr1pGdne1zfPXq1eOP3W6Dk9WdHD7RzMDgiM95WSlR7N2SRWS4fUHiFkKIhSIJyk9qa2upqKgAzLp56enpk3a6NQyD6qZeDpU10dk76HMsITqUywrTyU6NknJFQoglSRKUn+Tk5FBVVcXg4CBBQUE4nU6f+0wtnQMcLG2koa3P57rIsGC2rUtlTU687HYrhFjSJEHNM8MwqK+vJzk5mZCQczPrbDYbBQUFuFwusrKysFgsGIZBY3s/pafbfSpBgDl1fJNKpig/UUoVCSGWBUlQ86ilpYUTJ07Q39/PqlWrWLt2rc/xjIwMwCxPpGs6OV7VMWkoz2qxsD4vgS1rU2SnWyHEsiIJah653W76+/sBqK6uZuXKlT69qLYuJ8fPtHOqposRl3vS9XmZsexcn0ZslKxpEkIsP5Kg5sjIyIjPDrYAqampREdH43Q6ycvLw2azMepyc7q+m7LT7bR0Dkx6neAgKyo7jvV5ibIlhhBiWZMEdYm6urqorq6mqamJK664gujoc2uRLBYLmzZtwhYUTEvXEAdKmqiq72FweHTS6yREh7I+LxGVE4c9WO4xCSGEJKhLVF1dTX19PWCWKCouLsbtNujsHaSpvZ/qpl7qWx0++zKNsVot5GXEsmFVAmkJETJdXAghvEiCmqXR0VH6+/uJiYkZbzMMg7T0LE6ermNwGFpPdXK2u5K2LueU95TGREfYWbcygbW58TLxQQghprEoEpRSqgh4FCgEzgCf1lofWYj3rmvu4tVDZXR29WCxBpG/eg0jLjfOwVF6+ocZHnHR0x1DWHgYdqsdZ3v/lK+TEBNGblo0uWnRpMSHyxomIYQ4j4BPUEopO/Bb4DvAlcAtwAtKqRytde+MF1+igcERfnughvr6XlwuNzDMaFAr9hDfWXUxsTGTro0MCyYlIYLMpEhy0qKJjpBSREIIcSECPkEBu4FgrfV3PM9/oZT6W+AjwA/m840NA2xWC2FhYfT19WG32302BARzO/XoCDvREXbiokNJiQ8nJSGCyDAZuhNCiEuxGBJUAXByQlsFsGG+3zgiLJgP7VlNZW0cNitER0YSFGTBHmQjxG4jOsJOWEiQTG4QQoh5sBgSVCQwccHQABC+EG+eFBdGUlz2+U8UQggxpxbDznb9wMQVq+FA3xTnCiGEWCIWQ4IqB9SEtjWediGEEEvUYhjiewWwKKX+EfgvzFl8hcCzfo1KCCHEvAr4HpTWehh4L2Zi6gTuAT6gtW7za2BCCCHm1WLoQaG1Pg5c4e84hBBCLJyA70EJIYRYnhZFD+oS2QCam5v9HYcQQogJvH43T9rGYTkkqDSA2267zd9xCCGEmF4aUOXdsBwS1BFgF9AEuPwcixBCCF82zOQ0qQC4xTAm71MkhBBC+JtMkhBCCBGQJEEJIYQISJKghBBCBCRJUEIIIQKSJCghhBABSRKUEEKIgCQJSgghRECSBCWEECIgLYdKEpMopYqARzH3lToDfFprPWkVcyBSSm0DntNaJ3ue2zH3yfoQZqWMh7XWD/gxxCkppd4D/BuQD7QC39JaP7aI4n8/8E1gBWb8/76Y4h+jlIoFSoF7tdY/WUzxK6U+DTwGDHk13w38L4vgMyil0oD/Bq4GBoHHtdZfWQz/D5RSt2F+7b2FAS8B72ee4l92CcrzzfBb4DvAlZj7TL2glMrRWvf6NbgZKKUswJ3Atyccug9zx+E8IAbYp5Rq0Fo/scAhTksplQU8A3wS82u/GfiTUqoa2E3gx58G/Ar4C631H5VSm4A3lFJHgA8T4PFP8CiQ4fU84L9/vGwCHtJa/4t3o1LqARbHZ/gt8DaQglnaZ79S6iSwgQCPX2v9FPDU2HOlVDHwAvBF5vF7aDkO8e0GgrXW39Faj2itfwGcAD7i37DO6z7gb4D7J7R/EviG1rpLa12NmcA+u8CxnU8u8HOt9bNaa7ent/oqcDmLIH6tdROQ5ElOViABGAUcLIL4xyilPglEA2VezYsmfsw/bI5N0R7wn0EptR1YCfy91npQa30W83fRKyyC+L0ppYIxk9W/aq1LmMf4l10PCigATk5oq8D8KyaQPaq1vlcptXuswTNckwaUe50XcJ9Fa30AODD2XCkVj1nA90kWQfwAWmuHUioc6MH8uXkQaGORxK+UWgF8FbgM2OdpWxTfPwBKKRvmkPwnlFIPAwPA/2AOOy2Gz7AZ8w+Df1VK3YE5xPcI8EMWR/ze7gacwCPz/T20HBNUJOY3t7cBINwPscya1rpxiuZIz7/enyegP4tSKgb4HXAYc7gDFk/8g0AE5i/KP2D+kEKAx+/55f4z4Ata62al1NihxfT9kwQcBX4KfBBYizlkZvccD/TPMPZH2X7MntQazD8U2jzHAz1+YPwWyReBv9ZaG0qpef0eWo4Jqh/z5p63cKDPD7Fcqn7Pv96fJ2A/i1JqNeYvlXLgNs7FvSji11q7gWHgqFLqcWCL51Cgx/8VQGutfz2hfdF8/2itm4GrvJqOKaW+B7zX8zzQP8MQ0Ku1/lfP8xKl1P9gDo9B4Mc/5nrADTzveT6v30PL8R5UOeYNPW9r8O2iLgpa6y6gGd/PE5CfRSl1JWav6TfAhzzj8IsifqXUVUqptyc0hwCLIn7go8CHlFLdSqluzOGXR4BvsDjiRym1Til134RmO2avdjF8hgog3NMDGRPE4vkeGnMz8LTnj7V5/x20HHtQrwAWpdQ/Yk6NvAVzyOZZv0Z18Z4EvqqUKsUcsvkC8F3/huRLKZUHPAfco7X+3oTDAR8/5o35DKXU5zFj2445o/IvMH84Azp+rfUa7+dKqWPAdzzTzPsI8Pg9uoF/UkrVY963KQb+HvhbzElOgf4Z/ow5nPeQUuqfMH+h34k58ekMgR//mB2YPXJv8/YzvOx6UFrrYcxhgVuATuAe4ANa67YZLwxc9wLHMX9Ij2BO537UrxFNdjcQBTyglOrz+u9BFkH8Wuse4AbMex+dwOPAX2qt97MI4j+PRRG/1roBuAlzdlgvZpxf11r/ikXwGbTWg5hDlCsxd/feh7mW7hkWQfxecoGJ98PnLX7ZUVcIIURAWnY9KCGEEIuDJCghhBABSRKUEEKIgCQJSgghRECSBCWEECIgSYISQggRkJbjQl0hZqSU+gnnStBM5T7MauyvAFFa6wUpS+OpqfcGcLvW+tRCvOdseCq8vwl8Qmut/R2PWDqkByXEZJ/DrNCchrklAsA2r7ZvAwc9j/unuH6+/D1QEkjJCcZrFH6NwF1cKhYpWagrxAyUUusxt0lY4dnrxl9xhAK1wB6t9XF/xTETpVQVcKfW+lV/xyKWBhniE+IiePblGh/iU0oZwP8BvoRZZ+0o8HHMrQk+gVme50ta6yc910cBD2Fuk20ALwOfm2ZbFTALvnaPJSel1B+ADq31J7xiuhfYq7W+6nyvr5TK9xy/ErMSdSXwZa317zzHDczNMT+DWW9wE/Blz/MkzD3Vvqy1/qNXjM9i9j5fvZCvpRDTkSE+IebOvwH/gFlQMxt4BzMxbQV+DTzmtX/O45iJ7DrMGm0G8Cel1HR/NL4Pz0aDHj8DblZKeW9z8H84ty33tK+vlLIAv8fcEXgHsBGzl/jjCdW2bwP2YN6Pu8nz2T6OWa36eeCXSqlor/P3AdfM8BmEuCCSoISYO9/XWr+itT6GWb29D7OXoYGHMXsqK5RSKzF7RB/TWh/x9Io+gVmI8/ppXnsLZjHOMb8BLJiJC6XUJsxCpL+axeuHYe5G+3da6wqt9UnM+2rxQIrXezyutT7h+Ty5mHsa1XiGOr+GWTx3xOv8csxq1j7V04W4WJKghJg7p70eDwDVWuuxm7yDnn9DgALPYz1W2R3owNytd+JeZWNSgPaxJ1rrAcxe2Uc9TR8D/qi17jzf63uu/W/gFqXUY0qpVzCHAAFsXu9Z5fX4Z/+/vfsHbSqK4jj+BRXFgh0E6dLBQX5OFuni1EUEwUEQtKOOQl0UxEHQSVAy6CRughQVXKQgFEEpuAiio3pEi4JDVfyzdRCDw7nRR/SRBEKTlN9nyb9773svQ07uUPNT4gAAAedJREFUu+e9A3wGliU9A84BLyNitdLma3ncUXMMZj3xVNysf362vW7WtNtY2u4lT71Vfavp0yRnTFXzwEJZb5oFznQzvqQxsnjkKrlutEDO9pba2v4JPhHxRdI0sJ+ctZ0ATkuaqSRttP7w/qo5BrOeOECZrb1XwCZgrJw+owSNeeAKeU1RuxUyOaHqERnQzgLbyHWlbsbfDuwCxkudIiQdK33bgyDl8yPARERcBx6WonvvyDpZrQDV2r+Vzl+BWWcOUGZrLCJC0gJwS9IcWWn1Epmw8Lqm23Ngqm2cpqQ7ZIC62wo2XYy/myyXPitpiczQu1aG3Vyz/Q1AQ9InMkNxHzBRnrdMkSXM3/7b3ax3XoMyG4zj5I/7fbIK6ThwICJ+1LR/QGbjtbsNbOFv9l7H8SPiKVlJ+jKZ2HCBLNP9HZj+38Yj4h5wEWgAb8gU9FMR8bjSbAZYjAif4rO+8IW6ZiNA0lbgPXAwIl5U3j9EppRPljs6DES53dEHMnPwyaD2w9YXz6DMRkDJvGsAcwCSdko6Sq4p3RhkcCoOA8sOTtZPDlBmo+MqsEeSgEngJvCRvCPEwJTZ03ng5CD3w9Yfn+IzM7Oh5BmUmZkNJQcoMzMbSg5QZmY2lBygzMxsKDlAmZnZUPoN8NQCq2lgyYoAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_results(results, data):\n", - " plot(results, ':', label='model', color='gray')\n", - " plot(data, label='data')\n", - " decorate(xlabel='Time (years)',\n", - " ylabel='Height (feet)')\n", - " \n", - "plot_results(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result converges to a straight line.\n", - "\n", - "I chose the value of `alpha` to fit the data as well as I could, but it is clear that the data have curvature that's not captured by the model.\n", - "\n", - "Here are the errors:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2 0.000000\n", - "3 0.983969\n", - "4 1.942915\n", - "5 2.792070\n", - "6 3.496882\n", - "8 4.387116\n", - "10 4.557437\n", - "15 2.194275\n", - "20 -1.346851\n", - "25 -4.304519\n", - "30 -6.468590\n", - "35 -7.709926\n", - "40 -7.962119\n", - "45 -7.189989\n", - "50 -5.413433\n", - "55 -2.669382\n", - "60 0.997125\n", - "65 5.522310\n", - "70 10.843273\n", - "dtype: float64" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "errors = results - data\n", - "errors.dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the mean absolute error." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "4.251693738559428" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def mean_abs_error(results, data):\n", - " return np.mean(np.abs(results-data))\n", - "\n", - "mean_abs_error(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This model might explain why the height of a tree grows roughly linearly:\n", - "\n", - "1. If area is proportional to $h^2$ and mass is proportional to $h^3$, and\n", - "\n", - "2. Change in mass is proportional to area, and\n", - "\n", - "3. Height grows linearly, then\n", - "\n", - "4. Area grows in proportion to $h^2$, and\n", - "\n", - "5. Mass grows in proportion to $h^3$.\n", - "\n", - "If the goal is to explain (approximate) linear growth, we might stop there. But this model does not fit the data particularly well, and it implies that trees could keep growing forever.\n", - "\n", - "So we might want to do better." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Model 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a second attempt, let's suppose that we don't know $D$. In fact, we don't, because trees are not like simple solids; they are more like fractals, which have [fractal dimension](https://en.wikipedia.org/wiki/Fractal_dimension).\n", - "\n", - "I would expect the fractal dimension of a tree to be between 2 and 3, so I'll guess 2.5." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(7, 2.8)" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = 7\n", - "dim = 2.8\n", - "\n", - "params = alpha, dim" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll wrap the code from the previous section is a function that takes the parameters as inputs and makes a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object.\n", - " \n", - " params: sequence of alpha, dim\n", - " data: Series\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " alpha, dim = params\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " h_0 = get_first_value(data)\n", - "\n", - " return System(alpha=alpha, dim=dim, \n", - " h_0=h_0, t_0=t_0, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    alpha7.0
    dim2.8
    h_01.4
    t_02.0
    t_end70.0
    \n", - "
    " - ], - "text/plain": [ - "alpha 7.0\n", - "dim 2.8\n", - "h_0 1.4\n", - "t_0 2.0\n", - "t_end 70.0\n", - "dtype: float64" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With different values for the parameters, we get curves with different behavior. Here are a few that I chose by hand." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_plot(alpha, dim, data):\n", - " params = alpha, dim\n", - " system = make_system(params, data)\n", - " results = run_simulation(system, update)\n", - " plot(results, ':', color='gray')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "run_and_plot(0.145, 2, data)\n", - "run_and_plot(0.58, 2.4, data)\n", - "run_and_plot(2.8, 2.8, data)\n", - "run_and_plot(6.6, 3, data)\n", - "run_and_plot(15.5, 3.2, data)\n", - "run_and_plot(38, 3.4, data)\n", - "\n", - "plot(data, label='data')\n", - "decorate(xlabel='Time (years)',\n", - " ylabel='Height (feet)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find the parameters that best fit the data, I'll use `leastsq`.\n", - "\n", - "We need an error function that takes parameters and returns errors:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(params, data, update_func):\n", - " \"\"\"Runs the model and returns errors.\n", - " \n", - " params: sequence of alpha, dim\n", - " data: Series\n", - " update_func: function object\n", - " \n", - " returns: Series of errors\n", - " \"\"\"\n", - " print(params)\n", - " system = make_system(params, data)\n", - " results = run_simulation(system, update_func)\n", - " return (results - data).dropna()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(7, 2.8)\n" - ] - }, - { - "data": { - "text/plain": [ - "2 0.000000\n", - "3 1.148852\n", - "4 2.494726\n", - "5 3.987474\n", - "6 5.596116\n", - "8 9.023410\n", - "10 12.588184\n", - "15 21.692189\n", - "20 32.897280\n", - "25 47.207627\n", - "30 64.370278\n", - "35 84.203833\n", - "40 106.551950\n", - "45 131.281973\n", - "50 158.242758\n", - "55 187.291743\n", - "60 218.296906\n", - "65 251.121491\n", - "70 285.640417\n", - "dtype: float64" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "errors = error_func(params, data, update)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass `error_func` to `leastsq`, which finds the parameters that minimize the squares of the errors." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[7. 2.8]\n", - "[7. 2.8]\n", - "[7. 2.8]\n", - "[7.0000001 2.8 ]\n", - "[7. 2.80000004]\n", - "[6.92221276 2.90250933]\n", - "[6.92221286 2.90250933]\n", - "[6.92221276 2.90250937]\n", - "[9.09216731 3.04344997]\n", - "[9.09216745 3.04344997]\n", - "[9.09216731 3.04345002]\n", - "[11.32004198 3.11949616]\n", - "[11.32004214 3.11949616]\n", - "[11.32004198 3.11949621]\n", - "[11.45136365 3.11757872]\n", - "[11.45136382 3.11757872]\n", - "[11.45136365 3.11757877]\n", - "[11.46621698 3.11792121]\n", - "[11.46621715 3.11792121]\n", - "[11.46621698 3.11792126]\n", - "[11.46393831 3.11787315]\n", - "[11.46393848 3.11787315]\n", - "[11.46393831 3.1178732 ]\n", - "[11.46425733 3.11787985]\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    fvec[0.0, 1.259430004271867, 2.5891995571210504, 3...
    nfev22
    fjac[[-1211.616390427339, -0.0007452893651874872, ...
    ipvt[2, 1]
    qtf[4.18653877720665e-05, 0.00060508849225549]
    cov_x[[0.2779654957988092, 0.005806517068509026], [...
    mesgBoth actual and predicted relative reductions ...
    ier1
    \n", - "
    " - ], - "text/plain": [ - "fvec [0.0, 1.259430004271867, 2.5891995571210504, 3...\n", - "nfev 22\n", - "fjac [[-1211.616390427339, -0.0007452893651874872, ...\n", - "ipvt [2, 1]\n", - "qtf [4.18653877720665e-05, 0.00060508849225549]\n", - "cov_x [[0.2779654957988092, 0.005806517068509026], [...\n", - "mesg Both actual and predicted relative reductions ...\n", - "ier 1\n", - "dtype: object" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "best_params, details = leastsq(error_func, params, data, update)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the best parameters we found, we can run the model and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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yy23AHDVVVdx6NAhenp6+Nu//Vt27NhBaWkpN954I3v37g3aZxJCTG/U5WHElsTxxgiO1FkYNJyM37pkj7Sxemkq/99HFDdfvZTl+UnzJjmB9KAmOaRbeP9EE6OuuanOO15khJVNxZmsVennvbetrY27776b++67j0984hP89re/5etf/zo33HAD9957L0uWLOHxxx/H7XZz77338thjj/GDH/yA5557jmuuuYadO3fidDq57777GBwc5KWXXiIyMpJHH32UBx98kJdeemnOP68QYmYdHR04nU56Blwcr2qnoqaD4VE39tgUsp023yGlaYkOVhamsjw/kciI0FsefqlIgprgcGVrQJITmL8dHa5snVWCevvtt8nNzeXmm28G4Oabb+ZnP/sZAA899JDvlN2GhgYSEhKoqqqa8nW+8pWvYLfbsdvtNDQ04HQ6g36ssxAL3fDwMMfKjnO0oo6RiBRc1li/63a7nQiblaW5iawsTCEjOSZsVuJdDElQE6xZnhbQHtSa5WmzuretrY2MDP+S9ueOaj9z5gzf/va3aWxspLCwkKioqClLmAC0tLTwzW9+k5MnT7Jo0SJSU1OnvVcIMfd6B0Z4Z/9J9hyqZcQFFks7WVl236KmxLgoVhamUFSQTHTUwvqRvbA+7SysVemz6tEEWnp6Og0N/gcSNzc343K5uOuuu3jwwQf5+Mc/DsBPf/pTnn/++Slf56//+q+55ZZbePrpp7Farfz+979n3759cx6/EGKMYRg0tvVzqLKVM409GIaBNSIaXEM4HA5sNhuFOQmsLEwlNz1uQfSWpiIJKkzs2LGDRx55hF/+8pfcdtttvPLKKxw7dowdO3YwPDxMdHQ0AMePH+fpp5/2PbbbzWWmvb29OJ1O+vr6iI6Oxmq1UlNTwxNPPOGreiyEmFsej0Hl2TYOV7bR1u2/RDw5OZmoCNhQkkfxkhTiHLItZP4s95jnEhMTeeqpp/jv//5vNmzYwPPPP8/ll19OTEwM//RP/8QDDzzA+vXr+frXv86nP/1pGhoa6O/vJy0tjauvvprrr7+et99+m4ceeoif//znrF27li9+8Yt84hOfYHR0lNra2mB/RCHmLZfbQ1lVG//x7D5+8uv3KD9V53c9LyOeT1y5jC/duoFNJZmSnLws833+QSm1CDj9xhtv+OZszikvL2fFihVBiWs+kn9P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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system = make_system(best_params, data)\n", - "results = run_simulation(system, update)\n", - "\n", - "plot_results(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The mean absolute error is better than for Model 1, but that doesn't mean much. The model still doesn't fit the data well." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "3.618490489889673" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mean_abs_error(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the estimated fractal dimension is 3.11, which doesn't seem likely.\n", - "\n", - "Let's try one more thing." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Model 3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Models 1 and 2 imply that trees can grow forever, but we know that's not true. As trees get taller, it gets harder for them to move water and nutrients against the force of gravity, and their growth slows.\n", - "\n", - "We can model this effect by adding a term to the model similar to what we saw in the logistic model of population growth. Instead of assuming:\n", - "\n", - "$ m_{n+1} = m_n + \\alpha A $ \n", - "\n", - "Let's assume\n", - "\n", - "$ m_{n+1} = m_n + \\alpha A (1 - h / K) $\n", - "\n", - "where $K$ is similar to the carrying capacity of the logistic model. As $h$ approaches $K$, the factor $(1 - h/K)$ goes to 0, causing growth to level off.\n", - "\n", - "Here's what the implementation of this model looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[2.0, 2.5, 150]" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "alpha = 2.0\n", - "dim = 2.5\n", - "K = 150\n", - "\n", - "params = [alpha, dim, K]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an updated version of `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object.\n", - " \n", - " params: sequence of alpha, dim, K\n", - " data: Series\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " alpha, dim, K = params\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " h_0 = get_first_value(data)\n", - "\n", - " return System(alpha=alpha, dim=dim, K=K, \n", - " h_0=h_0, t_0=t_0, t_end=t_end)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the new `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    alpha2.0
    dim2.5
    K150.0
    h_01.4
    t_02.0
    t_end70.0
    \n", - "
    " - ], - "text/plain": [ - "alpha 2.0\n", - "dim 2.5\n", - "K 150.0\n", - "h_0 1.4\n", - "t_0 2.0\n", - "t_end 70.0\n", - "dtype: float64" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the new update function." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "def update3(height, t, system):\n", - " \"\"\"Update height based on geometric model with growth limiting term.\n", - " \n", - " height: current height in feet\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " area = height**2\n", - " mass = height**system.dim\n", - " mass += system.alpha * area * (1 - height/system.K)\n", - " return mass**(1/system.dim)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we'll test the update function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2.075043351397076" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "update3(h_0, t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can test the error function with the new update function." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2.0, 2.5, 150]\n" - ] - }, - { - "data": { - "text/plain": [ - "2 0.000000\n", - "3 0.515043\n", - "4 0.920001\n", - "5 1.216367\n", - "6 1.431972\n", - "8 1.685640\n", - "10 1.801190\n", - "15 1.975039\n", - "20 3.929748\n", - "25 7.701256\n", - "30 11.775782\n", - "35 15.027748\n", - "40 16.865948\n", - "45 17.173291\n", - "50 16.106566\n", - "55 13.967791\n", - "60 11.095254\n", - "65 7.785693\n", - "70 4.284147\n", - "dtype: float64" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "error_func(params, data, update3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And search for the best parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[ 2. 2.5 150. ]\n", - "[ 2. 2.5 150. ]\n", - "[ 2. 2.5 150. ]\n", - "[ 2.00000003 2.5 150. ]\n", - "[ 2. 2.50000004 150. ]\n", - "[ 2. 2.5 150.00000224]\n", - "[ 2.57150998 2.62640233 152.85619548]\n", - "[ 2.57151002 2.62640233 152.85619548]\n", - "[ 2.57150998 2.62640237 152.85619548]\n", - "[ 2.57150998 2.62640233 152.85619775]\n", - "[ 2.69480841 2.64180464 164.38502718]\n", - "[ 2.69480845 2.64180464 164.38502718]\n", - "[ 2.69480841 2.64180467 164.38502718]\n", - "[ 2.69480841 2.64180464 164.38502963]\n", - "[ 2.69504971 2.64141865 165.06670862]\n", - "[ 2.69504975 2.64141865 165.06670862]\n", - "[ 2.69504971 2.64141869 165.06670862]\n", - "[ 2.69504971 2.64141865 165.06671108]\n", - "[ 2.69600956 2.64152837 165.08460657]\n", - "[ 2.6960096 2.64152837 165.08460657]\n", - "[ 2.69600956 2.64152841 165.08460657]\n", - "[ 2.69600956 2.64152837 165.08460903]\n", - "[ 2.69593577 2.64152036 165.08358693]\n" - ] - }, - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    fvec[0.0, 0.6026560697086136, 1.1051308784106184, ...
    nfev21
    fjac[[-935.0854735477023, -0.0005819515032659498, ...
    ipvt[2, 1, 3]
    qtf[-1.8155922127449653e-05, -0.00029942939542415...
    cov_x[[0.034808802477415246, 0.003865949037799679, ...
    mesgBoth actual and predicted relative reductions ...
    ier1
    \n", - "
    " - ], - "text/plain": [ - "fvec [0.0, 0.6026560697086136, 1.1051308784106184, ...\n", - "nfev 21\n", - "fjac [[-935.0854735477023, -0.0005819515032659498, ...\n", - "ipvt [2, 1, 3]\n", - "qtf [-1.8155922127449653e-05, -0.00029942939542415...\n", - "cov_x [[0.034808802477415246, 0.003865949037799679, ...\n", - "mesg Both actual and predicted relative reductions ...\n", - "ier 1\n", - "dtype: object" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "best_params, details = leastsq(error_func, params, data, update3)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With these parameters, we can fit the data much better." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdeXhb1Zn48a8kS5Zted+3OHZITsi+ESAsIYFSdhiW0pm2QNtpmcJ0mHbozFB+0NKBUqbA0I0JFKYttJ1OW0pbtrATlgRIyJ44J44TO953W7blRcv9/XFlRzaJYxLLkuz38zx5Ip17Lb1KZL06557zHothGAghhBDRxhrpAIQQQoijkQQlhBAiKkmCEkIIEZUkQQkhhIhKcZEOINyUUvHAaUAD4I9wOEIIIUayAfnAZq31QOiBKZ+gMJPTO5EOQgghxJjOAd4NbZgOCaoB4De/+Q15eXmRjkUIIUSIxsZGPve5z0HwszrUdEhQfoC8vDyKiooiHYsQQoij+9glGJkkIYQQIipJghJCCBGVIjLEp5RaCTyvtc45yrGfAAu11ueFtH0G+D7mTI8NwE1a6+ZJClcIIUQETGoPSillUUr9PfAK4DjK8YuBr41qmwc8CdwEZAIVwO/CHqwQQoiImuwe1D3ApcC9wP8LPaCUygZ+Avw3sDDk0OeB57TW7wbPuwPoUErN1lpXnGxAbreb5uZmvF7vyT7UtGW328nJySElJSXSoQghppDJTlDrtNZ3K6XOO8qx/wF+ALgYmaDmAVuG7mitPUqpmuA5J5Wg3G43TU1NFBYWkpCQgMViOZmHm5YMw6Cvr4+6ujoASVJCiAkzqUN8Wuv6o7UrpW4BAlrrJ45y2AV4RrV5gMSTjae5uZnCwkISExMlOZ0gi8VCYmIihYWFNDfLZUEhpgPDMKhr6eGNLTW8/H41PX3hGYGK+DoopdSpwLeAlcc4pRdIGNWWCPSc7HN7vV4SEkY/tDgRCQkJMkwqxBTX0+dlX1U75VXtdPUMEPD7sdpsOB02Vi+b+HWmEU9QwNVADlChlAKIB+xKqU6tdRqwF1BDJyulEoEZwfaTJj2niSH/jkJMTX5/gEMNbsoPtXO4qZvQTW47OjvJzMggPyspLM8d8QSltb4PuG/ovlLqn4GrQqaZ/xZ4N3jdahNwP7BNa71/kkMVQohpo62rj72H2tHV7XS6ewFwOp3Dx+PtNhadko0qSWPOjPSwxBDxBHU8WutdSqkvAeuAQuAD4LrIRjW1/OQnP6G8vJxHH310zPNqa2s5//zz2bx5s0yGEGIK6h/0UVHTSfmhdpo7PAwMDNDS0oLf7yc+Pt4sGZeTzLzSDMoKUzECfurrjzq1YEJEJEFprd8C0o5x7BHgkVFtzwDPhD8yIYSYXgzDoLa5h72H2jhU78bnDwwfs9vtBAIB4uMgzzXIdWtKyc1KPfLDNislJSVhiy3qe1DiiNraWq666ipuu+021q1bh9fr5etf/zpWq5V169YxODjI1772NW666SY2btzIQw89xKFDhygsLOTWW2/loosuGn6cO++8k507d1JWVkZZWdmI5/n973/Pk08+SXt7O4sWLeK73/0uxcXFkXjJQogw6fYMUl7Vzta9dTS3deHxeCgoKMBqNSd326wWZhdnUpbuwYF5LCXpY/UVwkoS1FFordm/37zENWfOHIKTN4bt2bOHgwcPAjBv3jxmzZo14vjOnTuprq4GYNGiRR/7hrF161bq6uqO+tjH093dze7du3nzzTd57bXXuP3227nyyit5/fXXeeedd/j617/OwoULufnmm3nggQe48MIL2bx5M7fccgvZ2dksX76c2267jXnz5vHzn/8crTVf/vKXWbFiBQCvvPIKP/7xj3nssceYPXs2v/jFL/jKV77C888//4niFEJEH58/wMG6Lsqr2qlt7sEwDBobWxgYMPcJ9Hg8lBZlM680k9nFaTjj4xgczMdut0dkIpQkqBh0yy234HA4OPPMM/H7/dxwww04HA7WrFmD3+/nf/7nfzj99NO55JJLADjzzDO5/PLLefbZZ8nJyWH37t088cQTOBwOFi5cyJVXXjm80Pb3v/89N9xwA/Pnzwfgq1/9Kk8//TQffPBBWLvyQojwaenoY9u+Og7UugmMWv6alJiE3zdATrKFxbPsrD135Jdmh2Nye02hJEHFoLQ08/KdzWYDIDk5GWC4a97f309hYeGInykqKuKDDz6gpaWF+Ph40tPTRxwbSlD19fU8+uijPP7448PHvV4v9fX1kqCEiCGDXj+6uoMte2uprG5kYGCAxMREsrOzAXNpSHGui1lL8/F5mikuKhzxuRANJEEdhVJqzKG3+fPnD/cwjmbRokUsWrTomMeXLVvG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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "system = make_system(best_params, data)\n", - "results = run_simulation(system, update3)\n", - "\n", - "plot_results(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the mean absolute error is substantually smaller." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8895329463347671" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mean_abs_error(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The estimated fractal dimension is about 2.6, which is plausible for a tree.\n", - "\n", - "Basically, it suggests that if you double the height of the tree, the mass grows by a factor of $2^{2.6}$" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "6.062866266041593" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "2**2.6" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In other words, the mass of the tree scales faster than area, but not as fast as it would for a solid 3-D object.\n", - "\n", - "What is this model good for?\n", - "\n", - "1) It offers a possible explanation for the shape of tree growth curves.\n", - "\n", - "2) It provides a way to estimate the fractal dimension of a tree based on a growth curve (probably with different values for different species).\n", - "\n", - "3) It might provide a way to predict future growth of a tree, based on measurements of past growth. As with the logistic population model, this would probably only work if we have observed the part of the curve where the growth rate starts to decline." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis\n", - "\n", - "With some help from my colleague, John Geddes, we can do some analysis.\n", - "\n", - "Starting with the difference equation in terms of mass:\n", - " \n", - "$m_{n+1} = m_n + \\alpha A (1 - h / K) $\n", - "\n", - "We can write the corresponding differential equation:\n", - "\n", - "(1) $ \\frac{dm}{dt} = \\alpha A (1 - h / K) $\n", - "\n", - "With\n", - "\n", - "(2) $A = h^2$\n", - "\n", - "and\n", - "\n", - "(3) $m = h^D$\n", - "\n", - "Taking the derivative of the last equation yields\n", - "\n", - "(4) $\\frac{dm}{dt} = D h^{D-1} \\frac{dh}{dt}$\n", - "\n", - "Combining (1), (2), and (4), we can write a differential equation for $h$:\n", - "\n", - "(5) $\\frac{dh}{dt} = \\frac{\\alpha}{D} h^{3-D} (1 - h/K)$\n", - "\n", - "Now let's consider two cases:\n", - "\n", - "* With infinite $K$, the factor $(1 - h/K)$ approaches 1, so we have Model 2.\n", - "* With finite $K$, we have Model 3.\n", - "\n", - "#### Model 2\n", - "\n", - "Within Model 2, we'll consider two special cases, with $D=2$ and $D=3$.\n", - "\n", - "With $D=2$, we have\n", - "\n", - "$\\frac{dh}{dt} = \\frac{\\alpha}{2} h$\n", - "\n", - "which yields exponential growth with parameter $\\alpha/2$.\n", - "\n", - "With $D=3$, we have Model 1, with this equation:\n", - "\n", - "$\\frac{dh}{dt} = \\frac{\\alpha}{3}$\n", - "\n", - "which yields linear growth with parameter $\\alpha/3$.\n", - "\n", - "This result explains why Model 1 is linear.\n", - "\n", - "\n", - "\n", - "#### Model 3\n", - "\n", - "Within Model 3, we'll consider two special cases, with $D=2$ and $D=3$.\n", - "\n", - "With $D=2$, we have\n", - "\n", - "$\\frac{dh}{dt} = \\frac{\\alpha}{2} h (1 - h/K)$\n", - "\n", - "which yields logisitic growth with parameters $r = \\alpha/2$ and $K$.\n", - "\n", - "With $D=3$, we have\n", - "\n", - "$\\frac{dh}{dt} = \\frac{\\alpha}{3} (1 - h/K)$\n", - "\n", - "which yields a first order step response; that is, it converges to $K$ like a negative exponential:\n", - "\n", - "$ h(t) = c \\exp(-\\frac{\\alpha}{3K} t) + K $\n", - "\n", - "where $c$ is a constant that depends on the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "alpha = 10\n", - "D = 3\n", - "K = 200\n", - "params = alpha, D, K\n", - "system = make_system(params, data)\n", - "results = run_simulation(system, update3);" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "t = results.index\n", - "a = alpha/3\n", - "h = (-220) * exp(-a * t / K) + K\n", - "plot(t, h)\n", - "plot(results)\n", - "decorate(xlabel='Time (years)',\n", - " ylabel='Height (feet)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Additional resources:\n", - "\n", - "Garcia, [A stochastic differential equation model for the\n", - "height growth of forest stands](http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=664FED1E46ABCBF6E16741C294B79976?doi=10.1.1.608.81&rep=rep1&type=pdf)\n", - "\n", - "[EasySDE software and data](http://forestgrowth.unbc.ca/)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/wall_soln.ipynb b/soln/wall_soln.ipynb deleted file mode 100644 index 4442ecd9..00000000 --- a/soln/wall_soln.ipynb +++ /dev/null @@ -1,1879 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "\n", - "Copyright 2018 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inferring thermal resistance and thermal mass of a wall\n", - "\n", - "This case study is based on Gori, Marincioni, Biddulph, Elwell, \"Inferring the thermal resistance and effective thermal mass distribution of a wall from in situ measurements to characterise heat transfer at both the interior and exterior surfaces\", *Energy and Buildings*, Volume 135, 15 January 2017, Pages 398-409, [which I downloaded here](https://www.sciencedirect.com/science/article/pii/S0378778816313056).\n", - " \n", - "The authors put their paper under a Creative Commons license, and [make their data available here](http://discovery.ucl.ac.uk/1526521). I thank them for their commitment to open, reproducible science, which made this case study possible.\n", - "\n", - "The goal of their paper is to model the thermal behavior of a wall as a step toward understanding the \"performance gap between the expected energy use of buildings and their measured energy use\". The wall they study is identified as the exterior wall of an office building in central London, [not unlike this one](https://www.google.com/maps/@51.5269375,-0.1303666,3a,75y,90h,88.17t/data=!3m6!1e1!3m4!1sAoAXzN0mbGF9acaVEgUdDA!2e0!7i13312!8i6656).\n", - "\n", - "The following figure shows the scenario and their model:\n", - "\n", - "![Figure 2](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr2.jpg)\n", - "\n", - "On the interior and exterior surfaces of the wall, they measure temperature and heat flux over a period of three days. They model the wall using two thermal masses connected to the surfaces, and to each other, by thermal resistors.\n", - "\n", - "The primary methodology of the paper is a Bayesian method for inferring the parameters of the system (two thermal masses and three thermal resistances).\n", - "\n", - "The primary result is a comparison of two models: the one shown here with two thermal masses, and a simpler model with only one thermal mass. They find that the two-mass model is able to reproduce the measured fluxes substantially better.\n", - "\n", - "Tempting as it is, I will not replicate their method for estimating the parameters. Rather, I will\n", - "\n", - "1. Implement their model and run it with their estimated parameters, to replicate the results, and \n", - "\n", - "2. Use SciPy's `leastsq` to see if I can find parameters that yield lower errors (root mean square).\n", - "\n", - "`leastsq` is a wrapper for some venerable FORTRAN code that runs [\"a modification of the Levenberg-Marquardt algorithm\"](https://www.math.utah.edu/software/minpack/minpack/lmdif.html), which is one of my favorites ([really](http://allendowney.com/research/model)).\n", - "\n", - "Implementing their model in the ModSimPy framework turns out to be straightforward. The simulations run fast enough even when we carry units through the computation. And the results are visually similar to the ones in the original paper.\n", - "\n", - "I find that `leastsq` is not able to find parameters that yield substantially better results, which suggest that the estimates in the paper are at least locally optimal.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Loading the data\n", - "\n", - "First I'll load the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "second" - ], - "text/latex": [ - "$\\mathrm{second}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "m = UNITS.meter\n", - "K = UNITS.kelvin\n", - "W = UNITS.watt\n", - "J = UNITS.joule\n", - "degC = UNITS.celsius\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Q_inQ_outT_intT_ext
    2014-10-05 16:30:0010.9946.84016.9214.68
    2014-10-05 16:35:0010.9526.01216.9214.69
    2014-10-05 16:40:0010.8827.04016.9314.66
    2014-10-05 16:45:0010.7988.88016.9314.59
    2014-10-05 16:50:0010.75610.49116.9414.50
    \n", - "
    " - ], - "text/plain": [ - " Q_in Q_out T_int T_ext\n", - "2014-10-05 16:30:00 10.994 6.840 16.92 14.68\n", - "2014-10-05 16:35:00 10.952 6.012 16.92 14.69\n", - "2014-10-05 16:40:00 10.882 7.040 16.93 14.66\n", - "2014-10-05 16:45:00 10.798 8.880 16.93 14.59\n", - "2014-10-05 16:50:00 10.756 10.491 16.94 14.50" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data = pd.read_csv('data/DataOWall.csv', parse_dates=[0], index_col=0, header=0, skiprows=[1,2])\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The index contains Pandas `Timestamp` objects, which is good for dealing with real-world dates and times, but not as good for running the simulations, so I'm going to convert to seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Timestamp('2014-10-05 16:30:00')" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "timestamp_0 = get_first_label(data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Subtracting the first `Timestamp` yields `Timedelta` objects:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TimedeltaIndex(['0 days 00:00:00', '0 days 00:05:00', '0 days 00:10:00',\n", - " '0 days 00:15:00', '0 days 00:20:00', '0 days 00:25:00',\n", - " '0 days 00:30:00', '0 days 00:35:00', '0 days 00:40:00',\n", - " '0 days 00:45:00',\n", - " ...\n", - " '2 days 23:10:00', '2 days 23:15:00', '2 days 23:20:00',\n", - " '2 days 23:25:00', '2 days 23:30:00', '2 days 23:35:00',\n", - " '2 days 23:40:00', '2 days 23:45:00', '2 days 23:50:00',\n", - " '2 days 23:55:00'],\n", - " dtype='timedelta64[ns]', length=864, freq=None)" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "time_deltas = data.index - timestamp_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can convert to seconds and replace the index." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Q_inQ_outT_intT_ext
    010.9946.84016.9214.68
    30010.9526.01216.9214.69
    60010.8827.04016.9314.66
    90010.7988.88016.9314.59
    120010.75610.49116.9414.50
    \n", - "
    " - ], - "text/plain": [ - " Q_in Q_out T_int T_ext\n", - "0 10.994 6.840 16.92 14.68\n", - "300 10.952 6.012 16.92 14.69\n", - "600 10.882 7.040 16.93 14.66\n", - "900 10.798 8.880 16.93 14.59\n", - "1200 10.756 10.491 16.94 14.50" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.index = time_deltas.days * 86400 + time_deltas.seconds\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The timesteps are all 5 minutes:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.all(np.diff(data.index) == 300)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Mark the columns of the `Dataframe` with units." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "data.Q_in.units = W / m**2\n", - "data.Q_out.units = W / m**2\n", - "data.T_int.units = degC\n", - "data.T_ext.units = degC" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the measured fluxes." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(data.Q_in, color='C2')\n", - "plot(data.Q_out, color='C0')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the measured temperatures." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot(data.T_int, color='C2')\n", - "plot(data.T_ext, color='C0')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Temperature (degC)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Params and System objects\n", - "\n", - "Here's a `Params` object with the [estimated parameters from the paper](https://www.sciencedirect.com/science/article/pii/S0378778816313056#tbl0005)." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    R10.076 kelvin * meter ** 2 / watt
    R20.272 kelvin * meter ** 2 / watt
    R30.078 kelvin * meter ** 2 / watt
    C1212900.0 joule / kelvin / meter ** 2
    C2113100.0 joule / kelvin / meter ** 2
    \n", - "
    " - ], - "text/plain": [ - "R1 0.076 kelvin * meter ** 2 / watt\n", - "R2 0.272 kelvin * meter ** 2 / watt\n", - "R3 0.078 kelvin * meter ** 2 / watt\n", - "C1 212900.0 joule / kelvin / meter ** 2\n", - "C2 113100.0 joule / kelvin / meter ** 2\n", - "dtype: object" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(\n", - " R1 = 0.076 * m**2 * K / W,\n", - " R2 = 0.272 * m**2 * K / W,\n", - " R3 = 0.078 * m**2 * K / W,\n", - " C1 = 212900 * J / m**2 / K,\n", - " C2 = 113100 * J / m**2 / K)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll pass the `Params` object `make_system`, which computes `init`, packs the parameters into `Series` objects, and computes the interpolation functions." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " R1, R2, R3, C1, C2 = params\n", - " \n", - " init = State(T_C1 = Quantity(16.11, degC),\n", - " T_C2 = Quantity(15.27, degC))\n", - " \n", - " ts = data.index\n", - " t_end = ts[-1] * s\n", - " \n", - " return System(init=init,\n", - " R=Series([R1, R2, R3]),\n", - " C=Series([C1, C2]),\n", - " T_int_func=interpolate(data.T_int),\n", - " T_ext_func=interpolate(data.T_ext),\n", - " unit_temp=degC,\n", - " t_end=t_end, ts=ts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a `System` object" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    initT_C1 16.11 degC\n", - "T_C2 15.27 degC\n", - "dtype: o...
    R0 0.076 kelvin * meter ** 2 / watt\n", - "1 0.2...
    C0 212900.0 joule / kelvin / meter ** 2\n", - "1 ...
    T_int_func<function interpolate.<locals>.wrapper at 0x7f...
    T_ext_func<function interpolate.<locals>.wrapper at 0x7f...
    unit_tempdegC
    t_end258900 second
    tsInt64Index([ 0, 300, 600, 900, ...
    \n", - "
    " - ], - "text/plain": [ - "init T_C1 16.11 degC\n", - "T_C2 15.27 degC\n", - "dtype: o...\n", - "R 0 0.076 kelvin * meter ** 2 / watt\n", - "1 0.2...\n", - "C 0 212900.0 joule / kelvin / meter ** 2\n", - "1 ...\n", - "T_int_func .wrapper at 0x7f...\n", - "T_ext_func .wrapper at 0x7f...\n", - "unit_temp degC\n", - "t_end 258900 second\n", - "ts Int64Index([ 0, 300, 600, 900, ...\n", - "dtype: object" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the interpolation function:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(14.68, 14.684999999999999, 14.69)" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.T_ext_func(0), system.T_ext_func(150), system.T_ext_func(300)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Implementing the model\n", - "\n", - "Next we need a slope function that takes instantaneous values of the two internal temperatures and computes their time rates of change.\n", - "\n", - "The slope function gets called two ways.\n", - "\n", - "* When we call it directly, `state` is a `State` object and the values it contains have units.\n", - "\n", - "* When `run_ode_solver` calls it, `state` is an array and the values it contains don't have units.\n", - "\n", - "In the second case, we have to apply the units before attempting the computation. `require_units` applies units if necessary:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function computes the fluxes between the four zones." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_flux(state, t, system):\n", - " \"\"\"Compute the fluxes between the walls surfaces and the internal masses.\n", - " \n", - " state: State with T_C1 and T_C2\n", - " t: time in seconds\n", - " system: System with interpolated measurements and the R Series\n", - " \n", - " returns: Series of fluxes\n", - " \"\"\" \n", - " # unpack the temperatures\n", - " T_C1, T_C2 = state\n", - " \n", - " # compute a series of temperatures from inside out\n", - " T_int = system.T_int_func(t)\n", - " T_ext = system.T_ext_func(t)\n", - " \n", - " T = [require_units(T_int, system.unit_temp),\n", - " require_units(T_C1, system.unit_temp),\n", - " require_units(T_C2, system.unit_temp),\n", - " require_units(T_ext, system.unit_temp)]\n", - " \n", - " # compute differences of adjacent temperatures\n", - " T_diff = np.diff(T)\n", - "\n", - " # compute fluxes between adjacent compartments\n", - " Q = T_diff / system.R\n", - " return Q" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 -10.657894736842135 delta_degC * watt / kelvin...\n", - "1 -3.0882352941176463 delta_degC * watt / kelvin...\n", - "2 -7.564102564102562 delta_degC * watt / kelvin ...\n", - "dtype: object" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "compute_flux(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a slope function that computes derivatives of `T_C1` and `T_C2`" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " Q = compute_flux(state, t, system)\n", - "\n", - " # compute the net flux in each node\n", - " Q_diff = np.diff(Q)\n", - " \n", - " # compute the rate of change of temperature\n", - " dQdt = Q_diff / system.C\n", - " return dQdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 3.555499973097458e-05 delta_degC * watt / joule\n", - "1 -3.844086774341106e-05 delta_degC * watt / joule\n", - "dtype: object" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "slopes = slope_func(system.init, system.ts[1], system)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "16.11 degC 3.555499973097458e-05 delta_degC * second * watt / joule\n", - "15.27 degC -3.844086774341106e-05 delta_degC * second * watt / joule\n" - ] - } - ], - "source": [ - "for y, slope in zip(system.init, slopes):\n", - " print(y, slope*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's run the simulation, generating estimates for the time steps in the data." - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    successTrue
    messageThe solver successfully reached the end of the...
    \n", - "
    " - ], - "text/plain": [ - "success True\n", - "message The solver successfully reached the end of the...\n", - "dtype: object" - ] - }, - "execution_count": 58, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    T_C1T_C2
    016.11 degC15.27 degC
    258916.19153931824483 degC15.119152775835897 degC
    517816.2528855986394 degC14.860249399364765 degC
    776716.294553283278788 degC14.58496288165028 degC
    1035616.317098239731408 degC14.348725465924332 degC
    \n", - "
    " - ], - "text/plain": [ - " T_C1 T_C2\n", - "0 16.11 degC 15.27 degC\n", - "2589 16.19153931824483 degC 15.119152775835897 degC\n", - "5178 16.2528855986394 degC 14.860249399364765 degC\n", - "7767 16.294553283278788 degC 14.58496288165028 degC\n", - "10356 16.317098239731408 degC 14.348725465924332 degC" - ] - }, - "execution_count": 59, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_results(results, data):\n", - " plot(data.T_int, color='C2')\n", - " plot(results.T_C1, color='C3')\n", - " plot(results.T_C2, color='C1')\n", - " plot(data.T_ext, color='C0')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Temperature (degC)')\n", - " \n", - "plot_results(results, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These results are similar to what's in the paper:\n", - "\n", - "![Figure 5](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr5.jpg). \n", - "\n", - "To get the estimated fluxes, we have to go through the results and basically do the flux calculation again." - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    Q_inQ_out
    010.65797.5641
    25899.9310612.6725
    51789.3041417.6391
    77678.9019317.1162
    103568.7908116.4555
    \n", - "
    " - ], - "text/plain": [ - " Q_in Q_out\n", - "0 10.6579 7.5641\n", - "2589 9.93106 12.6725\n", - "5178 9.30414 17.6391\n", - "7767 8.90193 17.1162\n", - "10356 8.79081 16.4555" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def recompute_fluxes(results, system):\n", - " \"\"\"Compute fluxes between wall surfaces and internal masses.\n", - " \n", - " results: Timeframe with T_C1 and T_C2\n", - " system: System object\n", - " \n", - " returns: Timeframe with Q_in and Q_out\n", - " \"\"\"\n", - " Q_frame = TimeFrame(index=results.index, columns=['Q_in', 'Q_out'])\n", - " \n", - " for t, row in results.iterrows():\n", - " Q = compute_flux(row, t, system)\n", - " \n", - " Q_frame.row[t] = (-Q[0].magnitude, \n", - " -Q[2].magnitude)\n", - " \n", - " return Q_frame\n", - " \n", - "Q_frame = recompute_fluxes(results, system)\n", - "Q_frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see how the estimates compare to the data." - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_Q_in(frame, data):\n", - " plot(frame.Q_in, color='gray')\n", - " plot(data.Q_in, color='C2')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')\n", - " \n", - "plot_Q_in(Q_frame, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_Q_out(frame, data):\n", - " plot(frame.Q_out, color='gray')\n", - " plot(data.Q_out, color='C0')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Heat flux (W/$m^2$)')\n", - " \n", - "plot_Q_out(Q_frame, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "These results are also similar to what's in the paper (the bottom row):\n", - "\n", - "![Figure 3](https://ars.els-cdn.com/content/image/1-s2.0-S0378778816313056-gr3.jpg)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_error(frame, data):\n", - " model_Q_in = interpolate(Q_frame.Q_in)(data.index)\n", - " error_Q_in = model_Q_in - data.Q_in\n", - " \n", - " model_Q_out = interpolate(Q_frame.Q_out)(data.index)\n", - " error_Q_out = model_Q_out - data.Q_out\n", - " \n", - " return np.hstack([error_Q_in, error_Q_out])" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-0.33610526, -0.37832695, -0.39254863, ..., 2.26392988,\n", - " -0.7752054 , 1.99865932])" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "errors = compute_error(Q_frame, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the root mean squared error." - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.17995317290043\n" - ] - } - ], - "source": [ - "print(np.sqrt(np.mean(errors**2)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see if we can do any better than the parameters in the paper.\n", - "\n", - "In order to work with `leastsq`, we need a version of `params` with no units." - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.076, 0.272, 0.078, 212900, 113100]" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = [0.076, 0.272, 0.078, 212900, 113100]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an error function that takes a hypothetical set of parameters, runs the simulation, and returns an array of errors." - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func(params, data):\n", - " \"\"\"Run a simulation and return an array of errors.\n", - " \n", - " params: Params object or array\n", - " data: DataFrame\n", - " \n", - " returns: array of float\n", - " \"\"\"\n", - " print(params)\n", - " system = make_system(params, data)\n", - " system = remove_units(system)\n", - " \n", - " results, details = run_ode_solver(system, slope_func)\n", - " Q_frame = recompute_fluxes(results, system)\n", - " errors = compute_error(Q_frame, data)\n", - " print('RMSE', np.sqrt(np.mean(errors**2)))\n", - " return errors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `error_func`." - ] - }, - { - "cell_type": "code", - "execution_count": 102, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.076, 0.272, 0.078, 212900, 113100]\n", - "RMSE 2.17995317290043\n" - ] - }, - { - "data": { - "text/plain": [ - "array([-0.33610526, -0.37832695, -0.39254863, ..., 2.26392988,\n", - " -0.7752054 , 1.99865932])" - ] - }, - "execution_count": 102, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "errors = error_func(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pass `error_func` to `leastsq` to see if it can do any better." - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[7.600e-02 2.720e-01 7.800e-02 2.129e+05 1.131e+05]\n", - "RMSE 2.17995317290043\n", - "[7.600e-02 2.720e-01 7.800e-02 2.129e+05 1.131e+05]\n", - "RMSE 2.17995317290043\n", - "[7.600e-02 2.720e-01 7.800e-02 2.129e+05 1.131e+05]\n", - "RMSE 2.17995317290043\n", - "[7.60000011e-02 2.72000000e-01 7.80000000e-02 2.12900000e+05\n", - " 1.13100000e+05]\n", - "RMSE 2.17995317290043\n", - "[7.60000000e-02 2.72000004e-01 7.80000000e-02 2.12900000e+05\n", - " 1.13100000e+05]\n", - "RMSE 2.17995317290043\n", - "[7.60000000e-02 2.72000000e-01 7.80000012e-02 2.12900000e+05\n", - " 1.13100000e+05]\n", - "RMSE 2.17995317290043\n", - "[7.60000000e-02 2.72000000e-01 7.80000000e-02 2.12900003e+05\n", - " 1.13100000e+05]\n", - "RMSE 2.17995317290043\n", - "[7.60000000e-02 2.72000000e-01 7.80000000e-02 2.12900000e+05\n", - " 1.13100002e+05]\n", - "RMSE 2.17995317290043\n" - ] - } - ], - "source": [ - "best_params, details = leastsq(error_func, params, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 104, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    fvec[-0.33610526315786693, -0.378326947375756, -0....
    nfev6
    fjac[[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
    ipvt[1, 2, 3, 4, 5]
    qtf[-0.33610526315786693, -0.378326947375756, -0....
    cov_xNone
    mesgThe cosine of the angle between func(x) and an...
    ier4
    \n", - "
    " - ], - "text/plain": [ - "fvec [-0.33610526315786693, -0.378326947375756, -0....\n", - "nfev 6\n", - "fjac [[-0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...\n", - "ipvt [1, 2, 3, 4, 5]\n", - "qtf [-0.33610526315786693, -0.378326947375756, -0....\n", - "cov_x None\n", - "mesg The cosine of the angle between func(x) and an...\n", - "ier 4\n", - "dtype: object" - ] - }, - "execution_count": 104, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "details" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'The cosine of the angle between func(x) and any column of the\\n Jacobian is at most 0.000000 in absolute value'" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "details.mesg" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The best params are only slightly different from the starting place. " - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([7.600e-02, 2.720e-01, 7.800e-02, 2.129e+05, 1.131e+05])" - ] - }, - "execution_count": 117, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "best_params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like with the `best_params`." - ] - }, - { - "cell_type": "code", - "execution_count": 108, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.17995317290043\n" - ] - } - ], - "source": [ - "system = make_system(best_params, data)\n", - "system = remove_units(system)\n", - "\n", - "results, details = run_ode_solver(system, slope_func, t_eval=system.ts)\n", - "Q_frame = recompute_fluxes(results, system)\n", - "errors = compute_error(Q_frame, data)\n", - "print(np.sqrt(np.mean(errors**2)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The RMS error is only slightly smaller.\n", - "\n", - "And the results are visually similar." - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOy9eXhcZ3n3/zln9tG+WrIkW14f24njJE5CEgeTkA0SylagpVDghVK2sgXawguUQukP2lJaXqCQltJCSkkICSVkA5p9s5PYjh0vOd5kW7b2bSTNaNZzfn88c0YjWbal8Yxmez7XpStnzpyZuZ2Zc77nvp970SzLQqFQKBSKQkPPtwEKhUKhUMyFEiiFQqFQFCRKoBQKhUJRkCiBUigUCkVB4sy3AblGCOEBLgd6gUSezVEoFArFTBxAK/CCYRiR9CdKXqCQ4vRUvo1QKBQKxVl5NfB0+o5yEKhegJ/+9Ke0tLTk2xaFQqFQpNHX18e73vUuSF6r0ykHgUoAtLS00N7enm9bFAqFQjE3py3BqCQJhUKhUBQkSqAUCoVCUZAogVIoFApFQaIESqFQKBQFiRIohUKhUBQkSqAUCoVCUZAogVIoFBmTSCTo6+vLtxmKEkUJlEKhyJiHHnqI22+/HcMw8m2KogRRAqVQKDJicnKSl156CYBXXnklz9YoShElUAqFIiNeeOEFEglZ/H/06FHUdG5FtlECpVAoFkw8HufFF18koZsMNQYZmhpheHg432YpSgwlUAqFYsHs2bOHUCjEeGeC/sYJTrSNcfTo0XybpSgxlEApFIoFYVkW27ZtA6DPPQpAxBunq6srn2YpssBdL/+a21/4acGEa5VAKRSKBXH06FEGBwfxVHsxMVP7u7q6ME3zLK9U5IO4mWD/wMFzfjfRRIx79j/II0efZjQcWCTrzo4SKIVCsSC2b98OQOsFy1L7fHE3kUiEnp6efJmlOAN/99S/8NeP/RPbTu4663GPdz2b2v73HXcWxM2GEihF0RCLxQripClngsEghw8fRtd13M2+1H7LJf+r1qEKi7iZYHfffgBe6t13xuMsy+KX+3+TevzCqd08fmxbzu07F+UwsFBRAnR3d3PHHXdgWRatra0sXbqUdevW0dnZmW/TyooDBw5gWRarV68mEJ1I7Q9bUaY8Mbq6uti6dWseLVSk0zM+3eXD43Sf8biHDz3O8NTojH0v9e7jtSuvzplt80F5UIpFx7RM/vnZH3LPvgfndfz4+Dh33XUXsViMeDxOd3c327dv54477mBqairH1irS2b9f3o1v2LCBscjEjOemfDG6u7uJRqP5ME0xBycC0yHXJ45tI5qInXZM3+Qg/7Hr56ftf2Xo8IzHo1MB/vrRb/Fc947sG3oGCkaghBA3CiF2CCHGhRCHhRAfSu73CCGiQojJtL/f5tteReYcG+3m2e4d3LX31+c8Nh6Pc9dddxEMBuns7OQzn/kMt77992hsbsQ0TY4dO5Z7gxWADO8dO3YMXdcRQhAIjwOwcYkAwFfnJ5FIcOLEiXyaqUhjIDiU2g7HI3zqwb/mt4efYFfvXqZiYQD2JEOAAG+74NbU9lh4fEZI/bGuZ9k/eIh/evaHfPB//oLxyGTO7S8IgRJCdAD3AF8DaoF3Al8XQtwMbARGDMOoTPu7KY/mKs6TmBmf13GWZXH//ffT09NDbW0tb3/72xmMjfIPL/+Q/qXy5FCpzYvHK6+8gmmZBFfDvpGDjIelB7Wsph0Ab40fgCNHjuTNRsVMBoIzi6eHQiP8cMedfP3J7/FXj3wTgKlYJPX8tSuu4ru3/g0aGgC/O/JU6rmTgd7UdiAywVPHtufSdKBABAroBP7bMIxfGoZhGobxAvA4sAXYDLyUR9sUWeTuvffzi30PpB6fLelhx44d7N69G5fLxR/8wR/g9/t55OjTWFi8Ej6GhaU8qEVk//79BKrDHNV7+Punf5AK8S2vbQNA98klbXudSpF/hkNyXenDl7/7tOeOB04RNxP0TPQD8NoVV9Nc0UBzZSONFfUA/PvOO3llUIb6RqbGAGitbAZkyDDXFIRAGYbxlGEYH7YfCyHqgVcDu4BLgWYhxB4hRL8Q4m4hRFu+bFVkTsJMcPe+B9jddyC1L5yIzHns6Ogov/2tjOT+3u/9HjGfydGR44yHp8MK0SqLwcFBJidzH2ood0KhEF1dXcQ8idS+WCKGx+GmuaIRgKgep7q6mkAgwMmTJ8/4Xjt79vLY0WfP+Lwie4SiIQDaqlu4qmPzac/3jPfx/Cl5/3/T6tek9nsc0wkVO3v3AhCJy7XFD13+bircfo6NnaRrtDtntkOBCFQ6Qoga4D5gO/ArIAg8A1wPCGAK+GXeDFRkTGyOBdpw/HSBMoaO8hcP/y0BR5ALLriACy+8kM88/Dd87nffYNvJnanjnC1eQIX5FgPbK/LXVc7YX+OtotZbBciwz4UXXgjAyy+/POf79E4M8I2nvsf3X7gjdXevyD6WZTEwOcShkWMA+F0+PnL5u3nrhtdzzbLLU8fdu/8hgtEQa+o7WVHXkdqfHoY/MXYKgEhCClSl289rlr8KgAcOPpLTf0dBCZQQYi2wDegH3pYM991mGMbHDcMYNAxjDLgNuDy5bqUoIqJzrD2Fkwu16fzd498joAc52R7g9a9/fSq0MJt48lqpBCr32Nl7/pqKGftrvNXUeKsBCITH2bhxIwD79u1LdTpP51Ra2vPEIiyylyv/sevn/NkDX0o99rm8eF1e/nDjG/nEVe9HNKwESBXvvmXD69A0LXV8PDF9rh4alh1CbIHyON1c0X4xAP0Tgzn9dxSMQAkhtiK9pv9BilM4uf+rQoj1aYfavufpVzZFQTMfD2p0dJTJuAxLxJwJhmNj7Bs4OOf7TWryOLUOlVumpqbo6upC13Uqq6pmPNdU0YDf5cOpOwnHI0S8CSqaq1IhwdmEYtNlAT97+Vep9Q9Fdnn40OMzHvtdsqjasiwCgQCVHnmjYVpyDbjeVzfj+A9s/kMcmpSHiWiQ9977aQaTCRcep4c6Xy1AzlsiFUShrhBiFXA/8AXDML4z6+mLgMuEEH+UfPxt4AHDMHIr3YqsMx+B+vVv74fpGzk++5uvpTKKbFbVL+fIyHGC8TBt3kZGR0cZGxujtrY2J3aXO/39/ViWRVtbG4PM/L5uWXMdmqZR56thMDjMn//ma1APGwaW8Jvdj/H9wz/j46/6P3TWyUy/YHJNBGBX7z7C8Shfee1ti/rvKUe8Tg89PT08/PDDdHd3o10280bD7/bNeHxZ20X84I1f5559D/Hw4cdT3hPI9Sl7jWosPI5lWTO8r2xSKB7Ux4AqZGp5er3T3wEfAEaBw8AxIAr8cd4sVWTMXEWC4fj0Dz8ej7On7/TJrBYzM8JaKpsAmIwFWd65HFBhvlwyMjKCqVm8WHWInT3Ta0sXNK9lbaMMFa2sWzbjNTGnyRPxnXQHevjRzjtT+9M9KABjSKWkLwb3//p+/u3f/o3ubpnUEBqcWWRte1jp1HiruXH1q2ckTIAUKJ/Li8fpIZqIpeqpckFBeFCGYdyGXFs6E+9aLFsUuWOu+qeYKUUrEo/y2MtPEXLJO/TlNW00+OtSGURO3Uk8+fo1DSt4qW8/wWiI1mVLMV4x6Orq4pJLLlmkf0l5MTIywmRFhGFrZjhnRe30MvD6ptVsT2tGWru0HpBBjvSU897JgRnv0eSvz4HFinSqqWDXrl3ous4VV1zBjh07GBsdhzRNmkugADpqlnL7m77B3zz2bY6MHgdA16VfU+etpm9ykNFw4DQPLFsUigelKAOiyTCBaFzFlmWXAdNhvx/vupsfHfwFQw1BAN647ib+4tUfSdVcXN2xmY9c/sdsXf4qblj1aqrdMkOivlWmOHd1danamxwxOjpK2HP6zcW6ptWp7dkpzI3LmlPb9nrHRGSSJ2cVd/YHh86YBKPIDht6ZVXO+973Pm6++WZWrVqFO+ZIPe92uHDqDiYmJjh69Cg9PT2MjY0Ri8lz0+/ysal1/WnvW5tMjhlLdhTJBQXhQSnKg1gyM8jtcOLSZftrO+z3v0efnnHs5raN6JrOF6/9BIeGj3HZ0o24nW6uSzavrPXV0Ds5QNgZo6KigsnJSQ4cOMD69etzFg8vV4ZHhhmvmhnGed3qa7m8bVPqcZ2vhk9c+X7+37YfAdCtTSc/VLhkh4lt3XOPe3i86zneuuH12Ta7rGmtbKZ3coAPbX4XT//0ERwOB21tUqjWrl3Ly4emO5v7XT4SiQQ/+tGPGBubvllwOBy8973vpaOjg+tWXM29+x+ms7Y99XytrwaQPfpyhRIoxaLx28NPAmDFLV5+aQ/UTguUS3emQoDfuulLqZBDU0UDTRUNp73XxiXrODB4iB09e1i/fj0vvvgid999N62trVxzzTVKqLKEZVmcmuwnUjvTg3r3prec9v/3muWXY1om393+n+wdnM68nAzKdPLeZMbeWze8no6aVkZCAe7YfU+qU4Eie9hJDS0Oee40NDSkQnNr167Fed908MylO9m9ezdjY2P4/X6qqqqYmJggFArx3HPP0dHRwZLKJr5769/gdXlTr1sMD0qF+BSLwrHR7lTFejQcBVOG44JhGdJr8crEB6/lpr1u6Tnf74rk3fuLPXu48cYbueGGG6ioqKC3t5e7776bO++8k0h07i4VivkTDAYZ8p1+AXKfYXSD3fYonbGJAKZp8tsj8gals7adLcsuZ8vyy3DoDl7q289QcCS7hpc5tkCNj8rvrqmpKfVcRUUFyzqmk1qiiRjPPPMMADfffDMf/vCH+fCHP4yu67zyyitMTMiEiubKRqo904Xa9vZkNHf1bEqgFItCf1pXZTNuopny7vvYCbnwGg7LENIbmq+d1/t11Cylyl3BeGSS8dgkW7Zs4ZOf/CS33HILPp+Pl7r38t57P81DBx7N7j+kzBgdHSXkn5l92TyHR2tT6a44bd94aILjgVMpb3lVvcy8rPfVsq5xFQAnx3tPe50ic6LJ7NjAsAzZNTY2znh+7dq1qe2pWJiRkRFqa2tTnUCqqqoQQmBZFrt2zR2atb/ryUhozuezgRIoxaIQCE+ntcZiUXRLCtSJU93EYjGCEelJrezonNf7aZrGsuTd+omAbMXicrm45NJLWPraVRxbJlOj/2PP3YyOqpY6mTI4PEjYO1ugGs9w9EyBshNZQtEpegKyg8TGJWJGyHZJsmTg/3vyuwyFlBeVDUKxKWJmHJfDxeiw/H+a7kEBCCFS23ai0pYtW1JhQIDNm2Xiy86dO+ds6mx/17898uRp5QPZQgmUYlEYSZvW6Yu60ZICFU1EeeSRR4gh1zg6WtrnfP1cLKuRApU++PDBQ49y35H/xUpbHrnzzjtVhl+G7Ok7gKVBpT6dRpy+UD4bt8OV2l7VID2lhGZysEfWO3XUzAwBtle3pLYPDqlatmzQNyFT+VsrmxkalJGL2R5UY2MjawKtACztraGyspKLL754xjErV66krq6OQCDA4cOnrxNWeaZvRiajufGilEApFoVQWjFfU6AKLXlDZmqwbfs2Eg4pIBUe/7zfsy15cTs0cizV0PLw8PHTjhsYGKCnp+e0/Ypz82BAZldOmlN8+uo/4ZLWC2YMtZtNeuKE3Xw04TB5sU8W+M4u6L1h5TWp7akc3YWXG3at2ZIK2WVF0zQaGmaGZTVN49XLrmDdwWZqx31ceeWVOJ3O04659NJLATn6ZjYObTpVPVf1bEqgFIuC3ar/w5e/m+D4ZCrE5/K6iLkSmLqF3+Gbcw3jTFzUMl2bYRf0xq3TG5QC7N69O1PTFcCljRdwVcdmPr/1z85ZlHlJ6wUA3LDy1QDEnSYjUbkWcunSC2Vm4KlTWJaF1+XllrWvBWbexCgyxx5J48WNZVnU19efJj4gw3wOU8fr9XLZZZfN+V6XXHIJuq5z6NAhRkZGGBkZ4fjx40xOTiIaV3JB81r+4MLfy1nGrEozVywKds89Bw4ikQgOn7z7qmusZ2pIXryW1Zw7ey+dlsom3nPx7/OTl+7hREB6SAnzdIGysNi3bx8333wzDofjtOcVZ8aZ0Ik7TN696a3zfs2fX/MRIvEIFW4/PqeXqXiYBCa6plPh8vPwww/z/PPPc80113D99denSgqm4sqDygb2epAZlefC7PCeTWdnJzfffDNLlizB4/HMeUxFRQXr169n3759fOc7021Sa2tr+cQnPsGXr/t0lq2fifKgFIuCLVBW8qSxF9CNYBfeBhnWa6lunvvFZ2FNwwoAupMhvr5ZrXQA6pobCIVCc8bRFWcmGAoS12Usdklt0zmOnsapO6hwy++0xjvdlNTr8HDs2DGef/55AJ599lkGBwfxJ2trQlElUNnAFqjElEx+mJ0gYaNpGldeeSUrVqw46/tdddVVOBwOdF2npqYGl8vF2NjYooTNlUApFoVIUqASSYGq9053Hj/ol+KSfjGbL8tq2vA4PRwPnGJv/yv0TpwuUM/U78fULPbs2ZOJ6WVL72AfaOCwdFxO17lfMAeNaWsTTlPnvvvuA6C6uhrTNHnwwQfxOaVAPXjosZw2Hi0X7FBpNCTD6mfyoOZLW1sbn/vc5/jCF77Apz71qVQyhWEY52foPFACpVgUbA8qNiVPmqbK02tpMhEon8vL1uVXAPB417YzHnesYwTDMFL1Vopzc2pI1iZ5tLmLcudDe3VrajsajDA2NkZLSwsf/OAH8fv9HDt2jKHe6ck5X/jfv8/cYAUw7UFNjcvMujN5UAvB6XTO6EQBcPDg3HPasokSKMWiMFug6qpPn91U7Vm4QAFsatkAwHPdp2ca2Uz5YyQSidRkWMW56RmRtUtVzvknrsymM22MuMPU0XWdN7/5zVRWVnLjjTcC0LV9+kKnCnbPH1ugQuOytvB8PajZdHZ24nK56O/vJxDI7cBCJVCKRcEWqEhIejBVVVX8360fn3FMJh4UyLlEuqanevnZ46znQoX55o89zrvOW5Pxe1zZPj0CxRnXufbaa1myZAkAmzZtYtmyZUQmw7yl8rrUcapmLXN6JwbY3SdvwvQY1NTU4HZn7gHPhdPpZNUq2QEk116UEijFomD3BgtPyru76upqmmeF+Woy9KAq3H6uXXFV6nGdf9o7e8/Fb0tt604Hx48fT/UWU5yd4aAsrm6qzLzGxe/2UZHM0ru08yK2bNmSek7TNG666SYA+g/1pNaictWVoBz4l+0/Tm27Yo6shPfmYrHCfEqgFIuC3U4lOCHDDlVVVbRWNlOV1nyyJtkdORPedsEtqe0Kl5+/fPVHecPa67ll7XWpz2huk3fuAwOnJ1IoTmc0KsM3S2tbznHk2fnGTZ/nfZe8nQ/d8N4ZrXQAWltbcbvdBAIBKpOZf4GIuoHIlKOjJ1LbzoSe9fCejS1QXV1dRKPRcxydOUqgFDnHsqxUo9BQmkBpmjajk0C6WC2UBl8dTl2W9dV6q9m8dCPvueRtydobeQc/UDVOxBVneHg4488pF6LRKEFNhmNXNC07x9FnZ0llE7esfe1p4gRyOqs9p8iDDEXZhaaKhZOelKKh5cyDqqiooL29nUQiwdGjR3PyGaAESrEI2GtDDt3B5IS8+FRVyXDe69ZcC8iTyalnXkSraRp/9qr3ccua63jz+ptnPGcPzHs5fpjDq4YYGVFNSc/F6OgoUZcsCWipzM1FzsYWKEdMdiMYCwdSnUcUC8PuhXhRUNY25UqgANasWQPkNsynOkkoco4d3nPrLkzTxOfz4XLJE6nOV8M3b/7iGecLLYSrl23m6mWbT9vfUFHHkdHpHn1KoM7NqYEeYu4EDktPdRzPFe3tsvmsORUHJ3zr2X/D7XDx72/+Jp4s/C7KhX95/icYw9KbiQ5P4SD7GXzpCCF47LHHOHjwIJZl5aTdkfKgFDnHDu85k80lbe/JZlltW07v0pfN6qA9NDx0hiMVNsag7D5e76zBcR6e7XywPajoxPSAyWgilprAqzg3oegUj3c9l3psRUy8Xi8+39n7Jp4Pzc3N1NTUEAwGZ4yKzyZKoBQ5J5rM4LO7H1dXZ54MkQmbl26c8Xg4MEIiMXdTWYWke0LWIy31Lrz91EKprKyktrYWLTo7vTw3DUhLkan4zAJ0R0Kjpibz8oD5oGkab3rTm7juuuty9llKoBQ5x/ag7A7mlZWZJ0Nkgj3B1SamJ3J2x1cq9EWll7m8+vQR7rmgra2NqsmZDUvt2jnFuZktUBraotwIrlixgq1bt86ZAJMNlEApck5slkAttgcFMxf6T7aNqXWoczCUkAK+qm75OY7MDm1tbbhjTlY7pochhuOqLdV8CcdOF/N8nGfZRgmUIufYHhTJqNrsNajF4K9fe1tqO+xVqeZnIxSbIqxF0UzoqF8cD8pOlFg6OF1krTyo+TPbgwIlUArFvJgWKLnGkI8Tp95XS3VandXQkEqUOBP2+G5nQqdqkcKxra2t6LrO8MAQ13RcDiiBWgjpXeAv1QWgBEqhmBe2QFlxOVsoHx4UQMIyU9v9o4NnObK82dN3AABHQqeiIvNGsQvB6XTS0iI7ViQism6uR2XxzRtboK5ZfgUtQemFKoFSKOaBLVBmTMb48iVQZppADQWUBzUXQ8ER/vXFn8oHujbnqPBckUo3D0nP6X8O/Ib+SXUjMR9sb9Pr9DA+Pg4ogVIo5oWdZm7GTXR98e7KZ/Ppq/4ktT06GSAej+fFjkIm3WsJu2OL+tn2OlTtxHTtTndAjd+YD3YzZo/DpQRKoVgI6Wnmdg++fHBx6wWsb1oNQMJhMjo6mhc7CpmRqfyl39se1MTJMV6dHEI5GQ3mzZ5iwj7HNFMjkUjg9XqzPmYjH2TsvwshdGAd0IzMz+oDDhuGoYa5KGYQSzt58hXes6lyy0X/hMNieHg4p73KipGx8Hhq+2ouXNTPrq+vx+fzEQwGqUKuR01ElEDNh1SUIhlGLwXvCTIQKCHEVuCTwA1A+tXGAkaFEA8D/2IYxrPZMVFR7KR7UPk+cfxuGT5K6KaqhZqDsSk5YmPJQBWrVyxODZSNpmm0t7dz6NAh4iH5m5mIqs7m82H2Om+uu0gsFvMO8Qkh1gghHgV+BBwF3gq0AV7AD3QC7wN6gDuFEI8JIdZm22BF8ZEefljsLhKzqUx2NjeTHpRiJpMxmWLuSOTnu7LXoSLjcmih8qDmh32OxZMZkPmOVGSLhXhQ/wV81TCMB87wfHfy734hxF8Cb06+5orzM1FR7MTMpEBZ+Q89VCSH4ikPam5CyXTlxUwxT6ejo0PaMTIJFTAypdYJ54Md4otF5LmW7/MsWyxEoK6c7/pS8rhfCiH+JzOzFKVEND4d4su3B5USKIepPKg5CCWLdHVTy4tAtbW1oWkawcEJqICBoPqO5oPtQcWmZLp52YX4Mkl+UAkTCpi+u9NMDb/fn1dbKt3yoptwWkxMTOR0XHUxEorJ0Fq+PCi3282SJUtwReWlaSA4jGWpy8i5sAUqkhSoUvGg5iVQQnK9EKJq1v435MYsRSmRniSRy/k086Gpoh4A0ysfqzDfTIK2QOXJgwK5DuUwdVyak1gilhJNxZmJJW8CIyEZoi0bgRJCfAz4FfAJYJ8Q4i1pT381V4YpSofRsMwMcyT0vAtUa6WcbxRxxrCwlEClYVkWExGZNacn9LyFY+11KLcpVyACkYm82FFM2GH0qUkp5qUiUPNZg/oQsNkwjKAQYgXwCyHECsMwvkUWJ4oJIW4EvgGsAQaAfzAM43YhhBv4LvA2ZL3VtwzD+Hq2PleRW0zL5OjoCQC8YWfeBarKU4nL4SKWiGFpKpMvncHQCOF4BEdcx6058Xg8535RDrAFiqgFHhgPT7K0aklebCkW7E4SVszE660oiSJdmF+Iz2kYRhDAMIwu4FrgZiFE1gRKCNEB3AN8DagF3gl8XQhxM/AVQACrgMuB9woh3pONz1XknmA0xFQsjJ7QcCUceL3evNqjaRoehzx5TU2F+NLpDvQA4I04qayozFvHj9raWioqKtCTy4PjyoM6J3azWN3Mf61hNpmPQPUJIS62HxiGMQHcCjQCG8/4qoXRCfy3YRi/NAzDNAzjBeBxYAvwXuBvDcMYNQzjGPBNpFenKALSRzd4PJ6cTd5cCC6HDBxYuqXGbqQRCEshcMUceVt/gumCXUdCn2GX4syEkvOgHCUmUPMJ8b0HmNFV0zCMOPAeIcTt2TDCMIyngKfsx0KIeuDVwB1AK7A/7fBXyJ4wKnKM3UutENafbNy6C0CF+GYxmeza4EhoVNTkT6BAhvmcwy8Cag1qPkx7UHp5CZRhGCfP8twz2TUHhBA1wH3AdmBHcnco7ZAQsnOFogiYFqj8Z/DZuBxSoBxuJ1PBKUKhUN7T3wsBu2uDw8xfx3mb9vZ2nDukBzWuPKizEkvEiJtxdLSCKIbPJhk1ixVC/D7wHWSj2BPALmCn/WcYRkaTxpKtkX6F9JjeBdhXtPQrmx9QDbqKhNRFr4A8KDvEV11bQzAYYGRkRAkUMJHm7eZboJYuXYrLdAAwmscO68WA7T05caJRWiG+TBcEvg08CrwR+BYQAN4O/A+yF9+CSTah3Z58j7cZhhE2DGMU2SVdpB26jpkhP0UBY6ctO8zCESg7xFdZK8v6VJhPMllAAuVyuWiqbgRgYFytE56NvQMHAXmOgfKgACqBLyWz+lIkU8IX3KNfCLEKuB/4gmEY35n19B3Al4UQe5Kf+1mkQCqKALsGyhkvHIGyQ3wTXlkzogRKMhmZDsfmW6AAOurb2Bk5zGBIZVqejX9+7ocAmFZpjdqAzAXqPuASYIZAGYYRRYb5FsrHkKM7vi6ESK9x+h7wV8A/AvuQHt+/Aj/I4DMUeWAkOb7BFXMUkEDJn/0LwX2scjcogUpih/icBeBBAXQ0LEU7CZOECMWm8LsK4/dTSJiWmdpOJLeVQEkv5k4hxDHDMDIRpBkYhnEbcNtZDvlY8k9RZNjrBwXlQSVDfABhb1wJVJL0EF++m/oCNNQ34O5yEvHEGZgcprOuPd8mFRwz2kBZ4PF48lZgnQsyFahLgOXAC0KI3cCzyIy7HcA+wzASWbJPUeTYNSzOAkySgOlUc8uy8laYWghYlim914kAACAASURBVJUW4isMD6qurg5nXCfimTnpVzFNMDqd4KwVwEDQbJNpksTtwGHgg8CDyC4PXwdeAlROqCJFIdZBpXtQLo+beDzO+Hh5XwAjiSgxM45myqa+hZDVWF9fjzMuL1Eqk29ugtFpD6qtr7rkBCpTD6oRuN4wjCPpO5Mtiy45b6sUJYFlWalOEoUkUOmekrfSBwMxhoeHS2aGTibMvpFwOBx5tgi8Xi9ePAQIq0y+MxBMTkBe5mulImSVzCRdm0w9qN8hm7rOwDCMbsMw7js/kxSlQtQuILS0ghi1YeNzTsfoNZ+8EJf7OlShhfds6tzSI+gezah6peSxbyyclvwdF8LaYTbJVKB+BXxVCNGZRVsUJUbqrjxZn1EoAmVP1QXoRd6Zl7tAFVKRbjotFbIW6tR4X54tKUxS/RMTpSlQmYb4/h3ZyfwVIcSjpCVJGIYxkC3jFMVNILmwrcdlSC3fncxtltdOZ4MFEpMs1SqUQKXaHGlUVBWOQLXXLoWRXQxHRvNtSkFid3rXY/IcKzWBytSDqkWO3fhLYBB4B9Kr6hVCdGfHNEWxc2zsFACeiBOXy4XTmen9UHa5vG0T79z4ptTjmCtR9gI1WWA1UDZtDa1gQdiKEjdVcvBsUp3eI7IGqtQEKqMrRnLkxpPJPwCEEB5gE3DxmV6nKC9S84UKYFBhOpqm8ZYNr2NP/wH2DRwk5jIZGxsjkUgURHJAPiikNkfpNNQ34EzoxJ0m4+EJ6v21+TapoLAFypxKoFPGAiWEOAT8Fpkg8ahhGDPycg3DiADPJ/8UCiaS4xsKqQYqnaaKBgCGWkJUHnEzMjJCU1NTnq3KDyF7XEOBtDmyqaurwxGXAjUWHlcCNYvBkPT8zckYUBgF1tlkISG+W5FNWv8PcEwI8YwQ4stCiKuFEPmfQqcoOELJGo1CSjFPp94n08qDrjBx3SzrMF/ILgcwC+siV11dnUoA6BtXy9vpWJZF/6RM8tGnZIPdUhn1bjNvD8owjIPAQeB7QggHcBVwI7JP3hohxFMkPSzDMA7nwlhFcRFMtmFxmIWTYp6OZaVt6+U9vNBumVNIc7tAhmNr9UomiXCo/yhXd16Wb5MKhmBM9ij0ONw4EhqV1ZUl1w0lI8/HMIyEYRhPG4bxZcMwrkJ2krgDuAh4KJsGKooX+65cL1AP6ubVr0ltm2U+Xde+mdBNvWCyLW2aPTIUe2z0jLNTy5KRkOyuUeOqQkMrKM83WyxkDep1wFOGYQRnP2cYRgC4N/mnUACF70HV+2vpqG6le7xXeVBp31WhNRttqWyC0EGGp1SqeTr2KBu/wwskyluggAeAuBDiReSwwkeBZ5PJEQrFadhtWAp1DQqmZ0NZGgwNlW87HVug9IRWcB5UW10rhCAQU20+0xlNjrLx4QFCZS9QjcAW5NrTNcCnAV0IsY1pwdquOpkrAEzTTI2i1gvUg4JpgdJdDkITIUKhUEE0Sl1sUgktpl5wHlR7UxuchCkijE4FqPOVb8/EdGyBciWcJCi9FHNYwBqUYRijhmHcbxjGFwzDuA6oAV6DHNF+AfBfwKgQ4oHcmKooJkJxecFz4UCjcAXKnRy9UVXm49/tcKzP6S24hfbG+gYqg1I0n+vekWdrCoeUQCU7vpe1QM0m6SmdBHqBAeBE8v1WZsc0RTFj35E7TSkAhSpQ9uiNymopUOUY5oubCaKJKFjgcxdWeA+gtraWipBMn+6bGMyzNYXDSFgmSWgRmY5aigK1oE4SQohKZIujG5Ap5uuAbuAxZH++PzIMQ7UdVsxIkIACFqhkiK+iqoIRylOg0hMkfN7C+55cLhfVjgr6maAnoJrG2oxNyV4JZkiuqpS1QCXrnK4ARoHHgW8jO0qomifFaQSTrXP0RHEIlK9SrjuVpUCllQMUWoKETVNFA4foYzA4km9TCgZ7iGN8IgqUuUAhEyROAj9CJkQ8ZxhGLCdWKYoeu3UOMRl+KFSBcuvyFPBWyAtzWQpUAaeY2zRWN0B0OnRczoRiU/RNDDCSTDOPT0bRoKBaVGWLhQjUSmRo73rgI0CFEOJp4BGkYO00DMM6y+sVZUQ0Ie/qtAQ4HI6C6WQ+G4cu2+g83buDGk1jdHSUeDxesPbmgvG0YYXeqgL1oOoaoR/CCVXV8oXf/T2nJmSo0+/0oZng9/tLstHxQrL4jhmG8UPDMN5pGMYSpEf1G2Qm32PAkBDiHiHER3Nkq6KIiCbiAGjJSbqFlhlmo2vyFOge76G2thbLshgdLa+C0ImIbOrrSBReirnNknrZxDdqxbCs8r4PtsUJoMotvaZSDO/B+WXx7TYM45+ANyK9qruAm4DvZMk2RRETS8jor2YVbngP4C0bXpfadjVKO8stzGcPvXPGC3gNqqEJzQQLi2hCrSzY1Dpl9mmpCtSC4xhCiHbgVcCVyf9eCsSRU3W/hkygUJQ59kVEtwq3Bgqg3jc9vuExx06E3lyGAlX4HlRdXR26qZPQTULREB5naXXtzpQlrgaGOakESghxLzKLrxWYAJ4Bfg18FjnqXXWQUKSImUkPqoC7SMzFZGWkbAXKWcBZfD6fD6elk8BkeGKUOjUXCoB1rk6eUQIFgBv4Z6SHtNMwDDMnFilKgmgqxFf4AvWNGz/Hlx75JjEzTtxhlqFAJUN8BexBaZqGW3MRIU7/8ACrl6zIt0kFQSxUuinmsDCBerdhGGMLeXMhRJ1hGOW14qwAptegCj3EB7CyfjlvWn8zv9j3AGZSoCzLKtjEjmyTCvEV8BoUyDZME0wxGCjPdlRzMTkpv7tSFaiFJEk8IYT4CyHEOTs1CiEahRBfBJ7M3DRFMRNLZfEVdpKETaU72SDWrRONRlMnfjmQ7kEVskD53fJ3NDKuinVtSl2gFlqo+zXgpBDiGeBhYB8wBGhAE7AJmXb+auDHydcoypBoka1BVSbTdZ1+2VliaGiIqqqqfJq0KAwGh+mdkKPUCzlJAqDSUwFRGJ0M5NuUguD9l/4Bhx5+GShdgVpIHdSkYRifAtYAzwF/BDwI7ABeBO4D3gpsA9YZhvFxwzDGs2+yohgophAfTAtUr3OEgYZJHj36TFmkM+8fOJTadhTgLKh0avzVAASC5S1Q7mR7rmtXXJXyoEr1ZmrBaeaGYfQBXwG+IoTQgQbANAxDBYYVKWKzCnULnZV1HantwaZJfjP0DL59lfzRRW/Oo1W5J2HJ5Nu6CT8ahS1QtRVSoCbCpw31Litipjy3rLhJNBrF4XAUtOd7PpxXP5dkJp/qf684jUiyJY1eJGtQtXMMwdvXb+TBksUlbiarQ+IyKcTlcuXXoLNQWylTy6cSYaLRKG53+dVCJcxEKoFnKiT7ElZWVpZsQk/GnSQUijNhWRb7B2WTe0e8cMe9n5MSPenTSSQFSkM2ii3kC12Dvw6AuDNRdu2obOwbCqfuLPkECVACpcgBTx7bTiQuPShn3FE0XZYd2qzToQx6vtkhPiwKOrwH0FzRAEDUVb4CZRfAu9IEqlTXn0AJlCIH3L3v/tR2pdNf0GGjdD639WMzHpuJ0q9Ft+/INauw159AzoQCiLkSjIyUZ6r5tAflSAlUsdwAZkJGAiWE+DshxGlXHSHESiHEY+dvlqKYafTXp7ZrqqrzaMnC2NSygVvWXJd6nCgDgUqF+CwKfqG9xluFA52E02JgpDyXvu3MUpfDpUJ8Z+GdwE4hxCZ7hxDi08DLnGfihaL4cTnkT6B5sLLowg92MShAIlH67SXtEJ9G4Yf4dE2n1iOTWXrG+vNsTX4IJweB+p1eJiZkgXUpC1SmYnIhcuT7diHEPwLXAWuBTxqG8cNsGacoTkanZPlbZdBDZVtxnTx+lz+1nYjH82jJ4pAe4it0DwqguaKe4cgoA8Hy6pdoY0+q9rl8TI6U/hpURgJlGMa4EOL9ydd/Hjlu41bDMH53vgYJIa4A7jcMozn52IPsnh5NO+xZwzBuOt/PUmSfyWiQ7vEedDTcUUfRnTwVrjLzoIooxAfQXNXEgZEj7K/t5oWTu7m8fdO5X1RCTMVlarnP5S2LEF9GAiWEuBT4AbKrxMeAS4D7hRDfA75kGMaCK+mEEBrwAeCbs57aCIwYhtGSia2KxeXYaDeWZdGo1+Ew9aI7eZorG1PbiXj5CBRFkCQBUJ82ZuMfnvkBP/+D7+fRmsVnKuVBeZmclJGKYrsJXAiZrkE9D/QBFxqG8X3DMP4UeD3wJuBAhu/5FeAjyH5/6WwGXsrwPRWLzFBIpv96TZlDU2wnT3v19H1QvBxCfNa0B1UMAlXrLZ6km1yQCvE5vQSD0g9QWXyn8z7DMN5oGMYpe4dhGI8ivZ17MnzPHxiGsRnZ1y+dS4FmIcQeIUS/EOJuIURbhp+hyDHDSYFyRuVPq9gEqsZbjUNzAFKgrBKvhUqYMlPRLtQtdGp9MwXKtEo/0zId24NyWg4sy8Lv9+NwOPJsVe7ISKAMw/ivM+wPGYbx6Qzfs+cMTwWR03uvBwQwBfwyk89Q5J7hqeTIsCl54Sg2gQL40rWfAMDEZGpqKs/W5Jb0Nahi8KBaK5tnPLYv2OVCMCa9JoclL93FFkJfKJmuQQ0CZ7y1tBMcsoFhGLfN+uzbgEEhRIdhGN3Z+hxFdhgPy9TXRDAGeIryBHIlu0VbGgQCAfx+/zleUbxMh/iKYw2qvbp1xuPJaJAKd+l+P7MZS55fniINoS+UTNPMPzvH+6wC3ofM6ssaQoivAj8zDMNe27I7RJbXrVOREEgOv9Nj8oJXLF0k0nHp0mZTswgEArS2tp7jFcVLsWXxOR1Obll+LQ8efxyAiUiQJZVN+TVqERkLy8QIR1z2TCzGG8CFkGma+Y/n2i+EeAH4JHJYYba4CLhMCPFHycffBh4wDKM8S8kLnPTprFU1xXl3ZxcaW0mBKmXSm8UWgwcF8IcXv4mn9j7HRFWEnvF+Vjd05tukRWNsSv4e9WTRTakLVLZ78e0GXpXl9/wAMAocBo4h66H+OMufocgSdojPEdeLNvyQCvHppS9Q8bRmscXgQYFcK6vR5IX5UP/RPFuzuNgRCmtKfm+lLlCZrkFtmGN3DfBFpJBkjGEYjwO1aY+HgXedz3sqFod4Ik4wNoWGhsPUivbkceu2BwXj46U9FDpRRM1i01lWvZST5jAv9OzmA7wz3+YsGqGoTNqJhaQLVaw3gfMl0zWovcgkidnDY7qR61CKMmQ8KivbfboHDa1oTx7bgzLLIMQXT04+dmg6TmfxtNG8tOVCtnXvZYQAY+HxsqiPSpgJpuJhNDTCk9PDCkuZTH+RK2Y9tpCht37DMEq7cERxRsbDUqDcFHeGkUsvnzWocHJul8dZ2MMKZ9Pe1o73sJOQP8aJsVPUtpS+QNkp9X6Xl+CkTDcv1nNsvsxboM4Q1ptNvRACwzD2n4dNiiLFTpBwmbJwsFjv7px2koQO4xPjJBKJki2GjMRkqMjrKq7x6a2trXgiUqCOjXZzUcv6fJuUc4KxEAB+t78sOpnDwjyoM4X1bOznLKA0z2bFWbEFyhGTP5FivbvTNR2n7iRuxlPrUHV1dfk2KydEE0mBchfP+hOAz+ejXq9mlCkODhyF0tcngsn1J5/DSyKRwO1243YX143FQlmIQH0EeBYo7VVjRcYEkhl8RGSUt1gFCmSquRQoq8QFSg7AS5+DVSwsq2njCP0cHz2Zb1MWhVDSg/LoLiBR8t4TLEyg/gkQhmF0CyESQIuqRVKkMx6Ra1BmWGaGFbVA6U6mKP11qJgpBcrnKS4PCmBtyyoe69vJYGSUuJnAqZd24CYYkx6UK3nZLubza74sRKB6gR8IIZ5HhvL+XAgxOdeBhmF8NRvGKYoLu0bDEZcpy8WUFTab6Uw+SlygZBaf31N87YKWty3DfdxB1JNgb7/Bxa3zWSYvXuwQn9NykKD0159gYQL1XuCvgFuR60w3IgcVzsYClECVIbYH5SziIl0bt14exbrxIhaopUuXUj3hZcgTZHff/pIXKDvE50hoSqBmYxjG08BNAEKILuCGZBGtQgFAMJrstGwWbw2Ujd2ANKGbJStQCTOBiQUW+L3Ftwbl9/upd1QzRJBDA0d5+vjzXNWxGUeJhvomo1KgbLdACdQZMAxjdh2UQpGqqdHN4vegqjxyCFzCUboCFUsmSOhF1kUinfa6pRykl4NjXRzc1kU0EeO1K7fk26ycYHeRIFq8o2wWSrZ78SnKmGmBKt42RzZVbml/wiFDfKU4uNDO4NPM4pgFNReiZRXO+PRl7OR4Xx6tyS2hZJJEIiJdqGI/x+aDEihF1ojEZU2NXgIhviqPPPktj0Y0GiUSieTZouyzp19OsHGYetEKVPvSdpadnC4BKOWWR9FkxmV0qjz68IESKEUWiSQ9KK0EBKo6KVCaX65nlGKY7+BQFwDVE96i6WQ+m9bWVnxhF0tGpTDZSR+liB2SjU7J80x5UGdACPGoEKJ2jv1NQogd52+WohgppRDfirplAAS98t80MjKST3NywmBI5jj5plxF60FVVlZSVVWFmZC1d6UtUPLflojE0XUdn6/4ElsWykJ68V0L2HmcrwH+dI46qPXIybqKMiOeiJOwTDQL9CLuZG6zJjkEb1KbAirp7+9n/frS6qczGJSi64o5itaDAmhqauLoWC8wfREvReyias2SN4DF1Nw3UxaSxTeMHPWuJf/+DEikPW8Bk8BnsmadomgIp4X3oPjj436XD7fDRTQRI6GZ9Pf359ukrDM6NQbIurVi9aAA6urq0Ebl7y5Wwh5UKqnFKv7za74spA7qZWAlgBDiMeCthmGM5sowRXERTkyH94q9iwSApmnUeqsZCA4Td5aeQCXMhKyrscCZ0Ivag6qvr0c7IrfjpexBJf9tulX8IfT5kmkd1HVz7RdCuIHNhmE8d15WKYqOUsrgs6n11jAQHMZyw+joKJFIpKgv5OlMRINYWDgSGm6Xu6hvKOrr69Gt0vegYqmyACVQZ0UIcSVwO3JNanaihZXp+yqKl1SChKWVTOfvBn8dDIOn3g/BKAMDA3R0dOTbrKwwnuw870wUf1F1fX09WhkIVHTWGlQ5kGma+beBQeAPgSng3cDnkWtQ78yOaYpiIpKWwVdbe1qCZ1GyrGYpAGa1PE1KKcyXmt2V0Iv+YldXV4eWrKO2vYxSZLrzR/msQWUqUBcBtxmGcQ+wCznq/e+BTwKfypZxiuIhnBbiKxUPqrNOeksBh+wx2NdXOl0KSqmxr8vlwu+VvROnIlN5tiZ32GtQyoM6N3GmBxceBC5Obj8GXHC+RimKj/QaqFIRqA1Na3BoOn3RIRK6ycDAQL5Nyhr2cElHwkFFRUWerTl/aiploe5UJJxnS3JHKsRXQuu85yJTgdoOfFQIoQO7gdcn918IRLNhmKK4iJTgGpTP5aW9ZikWFhF3nP7+/pLpyZfyoBKlcbGrqaoBIBwtTYEyTZOEmQBL1viUwnc2HzIVqM8D/we4DbgD2CCEOAr8HPjvLNmmKCKm66D0klmDgrR1qBqdaDTK2NhYni3KDvZwSWfcURLhorpq+ZsLx0qvZyLAVFwKr25qOPTS8HrnQ0YCZRjGC0An8ONkLdRm4JvA+4FPZ806RdEQCMqIr8fhxu1259ma7LFxyToAxmrDWFglsw5ld8YuhbZUAA219cB0uUOpMRWbFqiqqip0vTzaqGb8rzQMIwg0CSHeAkwADwE/NwyjNGIgigVhC1RFEU5mPRuvar+EKncFAW2SsDdeMpl8qYywElnPaK5vBiBqlqhAJT0oh6lRXV26Hdtnk2mz2GohxIPAXuBuYAnwT8BLQoj2LNqnKBLGQzJkVOUrrdCDz+XlgmYBQNRVegJVKhlhSxqkQMVIlMw6YTrTHpSuBGoe/CPgAdqRdVAAnwACwD9nwS5FkTE5JVOxq/zFfzc+m+bKRgCi7kTJCJQdCnOg4/cXv9dbk/zdmZrJ+Pj4OY4uPkJpIT4lUOfmVuDPDcPosXcYhnEC+Djw2mwYpiguQtEQALWVNXm2JPvYiRKTldFUy6Nix04m8Ht8JdEV2+VwoVlg6TA4NJhvc7JOOK4EaiFUMu05peM4j/dUFDFTyfTeuqrSyeCzuaJtEw7dQcgbLZl6KLssoLJEQrKapuHUZIe1vuHS8HLTsZNa1BrU/HgY+GshhCv52BJCNCEz+X6XFcsURYWdZm6n+5YSXpdXelEahL2xkgjzReNyDaqqonRCsh5dZo8Ojgzl2ZLsMxaWYUtH3KEEah58HOhAzojyA/8LnABqkO2OSoYTY6f47rb/5GSgN9+mFCyxWIyYJduw1FfX59ma3GAnSoxVh+ntLf7fQjQh16BKac3Q55IzrQYDw3m2JPuMhGT9nSteXkkSmY7b6AeuFkJch+xo7gQOAL8rtTTzl/tf4cnj23ny+HZcDhd/f9P/pa26Jd9mFRRjY2OYyW6d9kWi1HhN56u43/hfgv4op06dyrc5543d1626snQEqtZbzWBkhMGJ0hOo4ZAcvecqkcLq+bKQke8b5tjdn/yzWS+EwDCM/edtWYFw4+qtPHL0GU6O9xJLxPjFvgf45FUfyLdZBcULx18i4pUXPK+zdIp00+moXorX6SFMhMMDJ4hGo0VdkBy35DBsu4ddKdBYWc+hwDFGQ2NYllUSyR8Ae/sNdvS+DECNu3yKdGFhIb69wMvJ/+5Ne5z+Z+8rGeKRGFsqLk49HgqpIcLpxM0E/3nkXgCqtAqaKxrzbFFu0HWdt26QLSf7mseLPsxnC1RtCSW1NFQmu0loUSYnJ/NsTfb46uPTlTstvtI8v87EQgRqBXLk+4q07SnguuT2yrT9JcOOHTvY+9gurvRtBMAYOsLTx5/Ps1WFg51dBHBz45aSvrt7o7gRF06i7gSvHD+Yb3MyxjRNLM0CC2qqSseDqvfJEoeYy2RkZCTP1mSHaFrrJlfUQV11aTRini/zDvEZhnF89j4hhAWcnOu5UmH16tU8+uijRPYFuPiqC3ipfx/37HuIq5ddhq6V7sV4vtj1T86YzoUtIs/W5BZd11lR2c7ByWM83fciN3Njvk3KiEgyQUK3SqPNkU1LZRMgO36MjIywfPnyPFt0/gyEptfTVpyop/qy0rmhmA/qCnsOWltbWbVqFdFolKu0C2nw1XFqoo/nT76Ub9MKAtuDcib0khmzcTbeJG4C4Eji5Iy722IinOxKoJVIo1iblirZ7ijiTpSMBzUwKVPmlzqacJVZijkUoEAJIa4QQgykPXYLIf5VCDEihBgUQnx+sW3asmULAC8+/wI3r9oKwL/t+FnRXqAWSig2NSOUl85k0oPSE6U1ZuNMbF65CV/ETVw3efzwc/k2JyPGJgMAOCwdpzOjRN6CZElFIxoaMVeCoeHSqIXqTwqUJyG/JyVQeUIIoQkh/gT4LZCeHvUVQACrgMuB9woh3rOYtnV2dtLW1kYoFKJ5ooalVUuYiEymMmtKnffdexvvu/c2TMs87bnR5MXOpTnw+XyLbdqio+s6q/U2AH57+Mk8W5MZIxPJmhqtdMQJZLujOk8NaHAqUBpjUfqDUqCcYZmRWFNTeq3EzsZC0sw/eobXv1sIMeN2xTCMf8nAlq8ge/x9Dfhi2v73Au9Lzp0aFUJ8E/gQ8JMMPiMjNE1jy5Yt/PznP+f5bdu5/nXXcMfue3iiaxtXdWxeLDPygmlOi1IoOkWlZ2ZrnIEx2ffM7yx9cbLZ3LyRfUPHOBHsoX9ykCXJtY9iIWDfVOilJVAAbdVLGBkcoz84VBKp5gNBuQZlBeV5qDyoM/Pnc/z1ISfrpu/7bIa2/MAwjM3Ai/YOIUQt0Aqk11W9AmzM8DMyZt26dTQ2NhIIBGgIVuLSnezs3cs9+x5cbFMWlbgZT22PJ6ew2jzXvYO7j8h/f4On9MN7Nis6OqkMSif/nv0P5dmahROYnB4uWWq01bQCEHJECAaDebbm/LHXoMzxGJpWWmuG82EhWXwrcmlIemf0NOxvI5S2L4Rsr7So2F7Ur371K3Y8+wLvvPFN/GT3Pdy199esqFvGJa0XFP3d2lzY9TIA45FJlqY998LJ3ant1TWdi2dUnmlra6N6wsd4dYQnj23nrRten8ogKwbs2V2eEiyqbk0mSkRdcYaHh4v6gm5ZVirE5445ymqSrk2h/2vtW6D0+JEfyEsV3saNG2loaGBkZIQlEzW8/YJbAfjGU9/jw/d9nolI6RQH2sTNmQKVzsSUfFwz7uOWVxVnynUmVFVV0WY1UjnpxrRM7nr5vnybtCDs760U21K1llAmXzAaIhKP4HV4cJTZoEKbghao5LpTHzJJwmYdM0N+i4bD4eD6668H4PHHH+cNq69PPTcaDrC9BFPP00N8Y+HAjOdODcluClc0biyLDD4bTdNob2+neVDWEO3pO5BK3S4GJsJSoCo8xT+ocDYpD8otPahiZjwqvye/Q95IKIEqTO4AviyEaBRCdCLXuO7IlzHr1q2jvb2dUCjEtue28e5Nb0k9968v/pTJSPHHvdNJ96D2HN6XSpoYHR1NrUldc9mWvNiWT5YuXYo34qRer2YiGuSHO+4smlHj41H5vTX4S69urcnfgEPTibtMBkeKe3ChHZFxI6calVJR9XwpBoH6K2SPv33AC8A9wA/yZYymadx4owxnPffcc1y79Eq++trPpJ7/7vb/LJoL1XxI96BeGH2ZO372X4TDYZ548kliTilenS3L8mVe3mhra0NDY81YKx6HmyePb+eZEy+e+4UFwERcLuk2VZVeXzdd12lO9qs7EZhrWbt4sAXKaTqA8ksxhwzHbeQSwzAeB2rTHoeBjyX/CoJly5aR7NrOE088wRve8AZEw0qM4aPs7N3Lrt69XLp00RMNc0IizYOydHhh+GXG/y1A79Qg1nKo8VSV5FrGuejo6MDj8TDZE+BNl93Izw8+wB0v3cPaxpU0VzTk27yzEkKGI1trl+TZktzQJOrHNwAAIABJREFUWddOb2iAgfBwUaea22u+jri0X4X4FPPmhhtuQNM0du7cySuvvMLf3PDn3LLmOgAODB7Os3XZw54bZBOuk404exvletSy2qVzvazkcblcXHDBBQD4BnSqPZWMhgN88+kfzFnQXCgMT4wS9EbAgtVNnfk2Jyd01Mnf5JSjuLua210kdDmsWgmUYv40NjamEibuvfdeenp6WFXfCUxXf5cC3ae65UYyallRW8n6jRuY8suR4a9LinI5cskllwBw4OX9fHHrJwA4NnYSY+hIPs06Ky/3HMDSoDrmK8k1KCA18iXqKu5MvmNjJwFwJDVWCZRiQVx99dVcfPHFxONxfvazn1GBDHVt697Jj3f9Is/WZYdXDhoANLnq0DSN/uAQ8dUuTM1CNK7i8rZNebYwf7S1tdHY2EgwGCQyGOLN628G4Ec77irYrL6Dg1I86yndi50dYrVroYqVY6PJm8OxeFkW6YISqPNC0zTe8IY30NnZyeTkJM899DRLvPLu7YGDj/A/B36TZwvPj0gkQtfxLgDqq+pormjEtMzUv+vWta/Np3l5R9M0Lr5YDrPctWsXbxA30OCv43jgFP+56+6CTJY5OCS/z/aK1jxbkjs6amSIL+KNMzBcnJl8gfA4o+EAXocHd0yOeXc4HPk2a9FRAnWeOBwO3vGOd1BfX8/QwCA1L08vyN7/yiMzetkVG/v370+lmXs9XpbXtqWeEw0rubLj0nyZVjBs2rQJTdM4dOgQjrjGZ67+U1y6k0e7nuWXBx7Ot3mn0TclL9hXrCnd767C7afZ04ClwZGR4hxVZ68/1btr0NBobm7Os0X5QQlUFvD5fLz//e/nuuuuo6OpjfWGzI4aj06wvWtnnq3LnJdeeklOXgWcuoMbV7069dzr1l6bJ6sKi8rKStasWYNpmuzZs4fVDZ186uo/AeDe/Q/RM144XbUHhgaI6nGw4NJ1pR2aXZNcD+6e6s2vIRlij7FxxOUlurW1dD3es1FwaebFSkVFBVu3bmXr1q2MjIzwDw98jyPuHv75hX/H4/Jw6bLCTzs/ceIEzzzzDMFgkHA4zPDwMI5aGVZw6A42tWzgn2/5a+KJOMvSvKly5+KLL+bgwYPs2rWLK6+8ksvbNnHRkvXs6T/A3z7xHb5y/Wdo9Nfn20x27pOdTryaG7er9PrwpbOxdT3P9O5g0BwrylTzyags+LciCcBRtgKlPKgcUF9fz8du/QAAlgbffvqHBCbG82zV2Tlw4AA/+clPOHjwIKdOnUotLi9f0QmAMzmaYWnVEiVOs1i7di1+v5/BwUEOHToEwGe3/Ckd1a0Mhkb49INfKYjhlnsPyw5htd7STZCw2dS2AYCgN8J4gZ97c2ELVCwofzdKoBRZpb1+KX+zVXaYmHJE+dzPvsqPf/JjHn/8cbq6uohG83PBGhkZ4fvf/z63334727ZtIxQKsWPHDu6++24SiQSbN2/m/e9/Px/96Ee57bbbuGCjrPVxauW3QDtfHA4H11xzDQC/+93vME0Tr8vLZ6/5MACRRJQvP/qtvCZNjI2N0RvoB6ClRAt002nw1+E13ZgOi33dRr7NWTATyZZpZiSOx+Mpq16X6agQXw4Rrav5/JUf5RvPfZ/hmiDPjeyh64kuNDQ0TaOlpYX29nZaWlpobm6mubkZt/vsoZeJiQn27t3L6OgogUCA8fFxqqqq6OjoYNmyZdTW1hKNRolGozgcDpYsWZIKbwwODvKTn/wkVbzY19eXuqACXHvttWzdunVGOCTUK0e9l2O3iIVw+eWX8/zzzzM0NMSuXbvYvHkzrVXNfOiyd3H7iz/lyOhxfnngYd664fWLZtMzJ15gRd0yllYt4cCBA4Q9snZteZl4wC3OBo6ZvezsfZmrL7gi3+YsiLGw9PoccZ3W1taiC1FmCyVQOeaS5Rv5gufj/O0T32GkPsRIfYhLgquInQzR29tLb+/MRVyv14vf78fv99PU1MSaNWtYuXIlsViMp59+mh07dhCPz+zu0NfXlwotzaapqYkrrriC5uZm7rrrLkKhEJ2dnWzevJndu3dz5MgRwp4Y/osauPhVl5x2IgSTi7UV7tLrfJ1NnE4nN9xwA7/4xS947LHHuPDCC/F4PFy/6hp8Lh/ffu7fufPl+7hn34N883VfSnXdzhXG0BG+/dyPAPj7m77AgQMHCPmkQK2oK4/eieurV3FsrJeDga58m7Igjo4c55GjTwPgiTppaWnJs0X5QwnUInBRy3oub9vE86fkInXvknG++e4vcurUKU6dOsXAwAADAwMMDg4SDocJh8OMjIxw8uRJdu3aha7r6LqeEqZ169alvKWqqipGR0c5ceIE3d3dhEIh3G43Ho+H8fFxBgcHeeCBB1K2rF69mne84x24XC4uvPBCJiYm+MTvvkxwYpgP/uoveYO4gfdc/Pup422BqlQCdU42bNhAW1sbp06d4tlnn+W662SXjauXbebkeA+/2PcgMTPOJx/8Mt+48XOsrF+eM1uGQ2Op7b994v/R0uMjuDqKQ9O5aMm6nH1uIbGueTUPjT3NUGwM0zLRtcJf0RgJjfH/t3fn8VFVZwPHfzOTyUJ2AmFJIJBAjgECymYEpKApUqxF2SwglVKLbbVi7ebSammltVLta219sa8t1aLSoiAg1bILKCJrgiwHEiSEgYRAQgjZl3n/uHeGSSABgWRmkuf7+fAh9965M+dwhzz3nHvOeR5f85x7O6gyoM0+fwIJUC1m9uBp5J47wcmSU+SdL+Clz/7Oj4fPpmfPC4mKnU4n5eXllJWVUVpaSm5uLocPHyY3N5eamhqUUowaNeqiO6r4+HhSUy8eJVhbW8v+/fvZtm0bDoeDlJQUJkyYQEDAhcseHh5OaXW5e/t9vZb7+t/jztzpOhZqlwB1ORaLhTFjxrBw4UK2bt3KoEGD3MvT3JMylvNVZXx4eCMA8z56mRe/9jSRzTRgodzjmhZXllAVXwEW6NdJERYU2iyf6WuSu/ciYJ+VGnstRwqP0Sumh7eL1KSyqnJ+9MFc93a3khjstW13BB9IgGoxEcHhvDRuLr9YO59DZ46w3ZHBM+tfZO5tj7nv7CwWi7t7r0OHDiQkJDBixAjKy8uprq7+0mtx2Ww2UlNTSU1NpaSkhLCwsCvqyy6qKHav03b8nNEFKV18V6Z79+6kpKRw4MABVq5cybRp07BYLNhtdmYNvJd7+93FE2ueI+98AW/seZcfpn27WcpRUlU/L1m52b13c/xNzfJ5vqh9+/Z0qIogz36WtQc20WtED28XqUmrszdRXmMskfXo0O+w5o1V2O12YmJ8e3X85uT7bd5W5mcjvsew7oMB4znByoNrqa6tbvKckJCQa14oMjw8vNHg5BpC7lJQagwxX5Sx1D0TPyKo7SVLu1pjx44lODiYrKwsduyonyMqNLAdj6TNAmBzzmc8t/kVKq9hCPq247vZd+rQRftdqRp6hsbX258W33pXkGjIYrEwIMboztyel+mTS0+5HCg4zFuZ7wEw86bJdHYa8+Y6d+7s7s1oi9puzb0kIjicOWmz6BubDMCbmcv42X9/69UUDUkNnoW8u/8/bDq6jRUH1wAQH9GF3j7ePeJLIiIi+PrXvw7A6tWrOX26/ur2vWJ6kBRt/JvvOrGXXSf3XtXnHCzI4oWP/8rcDX+sl/kYLiS7s+c5aV/YjgCLjadHzWkz3XsutyQPJaDaSkltKTtPZHq7OI3KyDvg/vm2nsPcg6fa8gAJkADlFRaLhSdHPkx6ojF3xlGSx/NbFnjtDs/VxfjAoG8SHBBERt4B/rztHwBM6XcXz495EptV5kF9GX379mXAgAHU1NSwdOlSamvrB5Bf3faYey3Dv+/8F5l5B+olh7ycmrpanl7/gnvbvfK1ydXFV15cyg2V3Xh9wh/p10YGR3hKSkykw1kjKH94aKN3C9OEHDO1xiNpswi2B7sDVFt+/gQSoLzGbrMze8h00s317Xad2Mvs5T+nuKLlZ727uhh7RnfnmdE/wm52+XWL6MI9KXcQYJNHlVdj7NixREZGcvLkSdatW1fvWFBAILMHT0N1SKK4soRnP/oTz21+5YpvUo40WAT1i4YBypUuvNbK8OHDsQfYr6Em/isoKIiU0CTASCR6ue50b6iqqeJzs5s2uUMigAQokwQoL5sxYAJD442UDcWVJXx3+c955bM3WvQ/kuuz7FY7Se0TeGHsL5k9eDq/HP2otJyuQXBwMPfcY4yI3Lp1Kzt37qx3PCwwlLmjH3MPSMnI23/Fq2+7FhN1ySk+Xm/7TEkRAOFBYe7Eim1V36QUgioCqHbW8PGxHZc/oYVtP5FBZU0lidHdiQ2NobKyksLCQmw2Gx07dvR28bxKApSXhdiD+fGw2cwaeK9738YvtrJSr22xMlTVGQEq0GwpdQ6PJT1pRJtYs625JSQkcOeddwKwatUqsrKy6h23Wq08M+pR93PAl7b+je2ODI4U5nDo9BGyC3Mu2fVXZg4jjzQHr+x07HWv91dRUcE5syU+bFBavWkFbVFSUhKRJcZKKL6Wo2111kfuCdWuEZZ5ecYK+LGxsW0yB5QnCVA+wGKxMLb3KJ4c+UP3vsV7V3Do9JEW+fzqWmMCsN3WNruBmtvAgQMZPnw4TqeTJUuWkJ+fX+945/BYfjL8QcKDwsgvPc38LQt4fM1z/GLdfJ5Y8xx/3/Wvi96zrNpoQQ3smkqHdu05U17Ewt1LqKqu4pl3f0+NtQ6r08KwIbe0SB19WZcuXYgv64C11sKJknzyz3svieHZinO8su0NPji0gcKys7yx5133MdczyT17jAn9Xbt29UoZfYkEKB9yY5c+vD35z3Q0UzO8mbmsRQZOuLv4JEA1m9tvv52+fftSVVXF22+/TVlZ/S66mHbR/Gnc3EuuebgmezOPrHravaoHQJmZUt5aAw/caLS+1x3Zwn1L5/BFgHEHPrTrjQQHyRqKVquV3km9CCsNAmD3yX1eK8vGL7ay8ehWFu7+N0v3f0BVbTVdwmN5etSjdAmPxeFwsGfPHqxWK7fcIjcXEqB8jM1qY176z7BZbRwoyGLJvlWXP+kaVdYaXUOBVglQzcVisTB+/Hji4uIoLi5m6dKlF2VbDg1sx//e9Vsev/UHPD/mSaamjsdmjrDMO1/AYx/8mvVHPgYupGPYuyuTlX9fRp/S+uvrRQaG82DafS1QM/+QlJRE+HkjQH2au8trI2ZPlpxy/7w6exMAc9Jm0a+Twul08sEHHwCQlpbWpifoukiA8kFRIZH8YMi3AHhn3yo2frH1us+TKqsq50hhDlP+9X0qaioJsAYQKC2oZmW325k8eTIhISFkZ2fz0UcfXfSadvYQBnZNpUd0N+7pM5a3p/zFvTZiUUUxC7YvYm32ZrblGt1AATXGOo2W3CoSjkW732femJ/L6h8ekpKSCCsNxFIH+wsOszf/oFfKkdegezG1k3KvyZiRkYHD4SAsLIyRI0d6o3g+p20/PfVht/YYyse5O9h1Yi+vfPYGr3z2BvPSf0bvmJ6XfP2lsobWOes4WJBFQlQ8GXn72XXic0YkDOXQmSO806Bl9s3Uu2Q4eQuIjIxk4sSJLFq0iE2bNhEfH0/v3r2bPOfrKp3UTjfw0//OA+CvO94CwFZroXdIArMf+i4Oh4Njx45hjw5mYMqNBAW07oy5X1Z4eDi9uiVxprCM0x1K2ZSzjf6dU1q0DE6nk+PFJwCYmjoeJ07GJBmBqLKykrVrjYFR6enpBAUFtWjZfJX8RvJhj93yAG9lvsd/Dm8A4Km1z/P25D9jtVipqq12/xIqrjjHL9bO51TpGaYPuJuRCTdT66zjD1teJbuo/rDlTTnbLvqcBwdP5/akEc1fIQEYd/OjR49mw4YNLF26lLvvvhulVJPnJETFs3jKX/jLttfZnPMZABHnQvjqbenY7XZ69OhBjx49WqD0/mvo0KHoZVmc7lDK1txdTOwzrtnTnnjanPMZJVWlhAeGcnfKHe4bSqfTyYcffkhpaSnx8fH079+/xcrk6yRA+bDAgEBmDpzCbYnD+cl/nwVg6pKH3cfjIjoTYLGRU+xw71uUsYxFGcsu+949o7sxe/D0i5Y5Ei3j1ltvJS8vjwMHDrB48WL69+/P2LFjCQkJqfe6kpIStm7dSk1NDSNGjOChm++n8kwZ2ceOcFPgDZdtfYkLlFLEtoshv6SEkvBKlh9czfeGtNxzuv3mZNwQe7A7ONXV1bFy5Ur27NlDQEAA48aNa7PJCS9FApQf6B4Vx8ybJvOP3Uvq7Xecy6u3HRMSzZnyIvd2QmQc3x44ha4RnTladJw+sb0JtNmprq2WEXteZrFYmDRpEtu2bWP9+vVkZmaSnZ1NSkoKcXFxxMbGkpmZWS9B5e7duxk8eDA1e0voXBnBmPu/Kr/MvgSr1cqQIUM4tekMJeGVrD/yMbcnDm+02/x6K6+pBOCbqeMBIzgtX76czMxMAgICmDp1aptfOaIhCVB+YlzybXQMjWH+lgUkRnenT2wyO09kUlBaSFRwBKN73sKkvnfym40vkXvuJA8Onkb/TikEmt2AN3bp434vCU6+wTWUODk5mRUrVnDs2DF27Nhx0QroKSkpWK1W9u3bx6effgpAYmKidOldhYEDB7Jx40bCS4IoCa/k1e1vMv+Op1ok0FeYqTRcUwlWrFhBZmYmdrudadOmyfW8BAlQfmRI3AD+fe//urc9M9+6/GLUIzidTlmiyI/ExMQwc+ZMd1Zkh8NBfn4+nTt3ZuTIke4VrYcNG8a6devIy8sjPT3dy6X2TyEhIfTv35+q3TvJVoUcK3aw7fhu9yTZ5lRuzl0LDgji6NGjZGRkYLfbmTFjBt26dWv2z/dHEqBaGavFCtLr43csFgsJCQkkJDT+TLBr167MmDGjBUvVOt18883s2rWLiLNBnI6q5sVP/o8HBk1lTK/mHdpdYXbxBduCWLvWSGUzYsQICU5NkHlQQog2JTY2lsTERDrmh5KIsZzQkn2r3AGkubieQZ3IdeBwOAgNDSUtLa1ZP9PfSYASQrQ5d955JyGBwQQfrCXGHkVxxTkeXPE4//78/WZLHlphdvFt/8SYJjBy5EgCA2W+WlMkQAkh2pz27dszfvx4LFiIzrLTMbg95dUVvLNvFWuzN1/XzzpZcoqn1vye4soSAIpPFxEdHc2gQYOu6+e0RhKghBBtUkpKCmlpaQSV2+iZHc2NnfoC8NrOxcx491H2nNx/zZ+x79Qh5vznGQ4XHgUgsqIdVqeV0aNHt/lUGldCBkkIIdqs9PR0HA4Hubm5dP8ihqDeN7HNsZvKmkp+u+llEiLj6BObzMS+44gICrui96ysqeLQmSMs+OyfFJQVuvfHVXcgLNdC586d6devX3NVqVWRACWEaLNsNhuTJk3itdde49ixY9wQmUJcytc4cPowBwqyyCl2kFPsYNfJz3lm1KMcK3YQFhiKxWLBZrERYLVRUVPJ2YpzBNoCOX7uJKsOreNM2YUJ87GhHYgoDCTwi1oiIyKZMmWKTLC+QhKghBBtWkREBFOnTmXhwoUc3HuA0R1Gc+/ox1iTvYktOdtxmEkOf/D+U1/qfWNCovlGcjqOLUdwOBxERkZx//33Ex0dffmTBeBHAUopNQt4FfAcC/qQ1vp1LxVJCNFKdOnShYkTJ7J48WI2bNhAQEAAXxmUxpheX6Gw/CzPbvwTx8+dJNBmp1tkVyxYKK0q4+T5C/mdEiLjqKitYnTPWxjbexS1FTW8+eab5OfnExkZycyZM4mKivJiLf2P3wQoYCDwgtb6cW8XRAjR+iilGDNmDKtXr2bNmjVs3LiRlJQUkpKSmNV9InWWOkKD2hEfH+9Oh+F0OjlfVUqovR1W64UxZ2fOnGHRokWcPXuWmJgY7rvvPglOV8GfAtQg4CVvF0II0XqlpaURFhbGzp07ycnJITMzk8zMzHqvsVgsxMXF0aNHDzp16kRUVBTWaAt1dXUUFRVx+vRp1q1bR1lZGXFxcUydOpXQ0FAv1ci/+UWAUkrZgP7ADKXUi0AZ8Brwe621d3I3CyFaHYvFQmpqKqmpqRQVFZGRkUFBQQFOp5Pa2lpKS0s5ceIEx48f5/jx402+V69evZg8ebJMxr0GfhGggI7ADuB1YAKQAiwHzgGveLFcQohWKjo6mlGjRl20v7KykpycHHJycigqKnL/sVqttG/fnujoaLp27crQoUNlrtM18osApbXOA77isWuPUuplYCISoIQQLSgoKIjk5GSSk5O9XZRWzy9WklBK9VVKzW2wOxCo8EZ5hBBCND+/aEEBZ4EfK6WOA38DbgIeAR5u8iwhhBB+yy9aUFprB/AN4EGM507vAr/RWr/j1YIJIYRoNv7SgkJrvR4Y7O1yCCGEaBl+0YISQgjR9kiAEkII4ZMkQAkhhPBJfvMM6hrYAPLy8rxdDiGEEA14/G6+aFZzWwhQXQCmT5/u7XIIIYRoXBcg23NHWwhQ24FbgZNArZfLIoQQoj4bRnDa3vCAxemUtVaFEEL4HhkkIYQQwidJgBJCCOGTJEAJIYTwSRKghBBC+CQJUEIIIXySBCghhBA+SQKUEEIInyQBSgghhE9qCytJXDWl1ABgAdAfOALM0lpfNNvZlymlZgGvApUeux8C3gb+DEzCWGHjRa317zzOmwL8FmOG90fATK31KfNYd4zMxmnAKeCHWuv/mMcswG+A2UAgsBD4qda6phmrWY9SaijwvtY61twOxAt1VUqNBl4CkoAMYIbWut5SLs3hEvUPAkqAKo+XfaK1HmMe9/v6K6W+CjwH9DbLOV9r/WpbuPZN1N3vr7u0oBphfrGXA/8CooB5wGqlVIRXC/blDQRe0FqHefx5HZgLKIwv0RDgfqXUtwCUUn0wvpwzgRjgMLDY4z0XA5nmse8Ci5VSieax2cAE83N7m+/9ZLPW0KSUsiilHgBWY/zHcWnxuiqlOgDvmZ8dBSwD/quUarb/c03UPxUobPAdcP2S8vv6K6W6YWTZftb8rKnA75RSd9DKr/1l6u73110CVONGAXat9f9orau11ouBfcC93i3WlzYI2HOJ/fcD87TWRVrro8AfgAfNY/cBK7XWW7TWFcATwHClVG+lVDJGZuOntdZVZqbjFcB3PN73f7TWx7XWBcCvPN63uc0Fvo/xn9WTN+o6AdintX7X/P7MB4KA269/td0aq39j3wFoHfXvAbyltV6mta4zezk2AsNp/de+qbr7/XWXANW4PsCBBvsOYtyV+AWllA2je3KGUuqEUipLKfW4Uioao1m/3+PlnnXr43lMa10G5JrH+wDHtNalV3KueayrUqr99atZoxZorQcBO1w7lFJReKeuDY8BaJr3+3NR/U0DgVilVKZSKl8ptUQpFWce8/v6a603a62/59o2P/9WYDet/Npfpu5+f90lQDUuDChrsK8MaOeFslytjhi/rF4HemL0w38f+KF53LN+nnVrqu6X+3dpeNz1c7P/u2mtT1xid1iDcrh+bu66tvj3p5H6A5QCH2PcxSqgHKPrBVpR/QGUUpEYd/vbgJ0NytWwDK257stpBdddBkk0rhQIabCvHXDeC2W5KlrrPOArHrv2KKVeBr5mbnvWz7NuTdXd0sSxS53r+mJ669/NdRfY0nUt5eL/lF75/mitH/PcVko9BhSYzy9aTf3NrqnlGHfw0z3K1uqvfcO6a63rAL+/7tKCatx+jLsOTzdwcfPVZyml+iql5jbYHQhUAHnUr59n3erVXSnVDuhu7t8PdFdKhVzJueaxk1rrs9dWm6ujtS7CO3X1me+PUurXSqkUj12uARQVtJL6K6VGYrQc3gMmaa0r2sq1v1Tdzf1+f92lBdW4DYBFKfUjjGGqEzGe5yxr8izfchb4sVLqOMaInZuAR4CHMQZ8PKOUysRolv8EY2gowFvAFqXUKGAr8Dtgt9b6EIBSKgOYp5R6AhgGjAduMc/9J/ATpdQ6jLupX5n7vOmftHxdlwHPm0N5lwFzgDqMB9gtrT8wWCk1zdx+CViltS5QSvl9/ZVSScD7wFNa65cbHG7V1/4ydff76y4tqEZoraswusImAoXAU8Dd5qgVv6C1dgDfwBhhcw5jOOpvtNbvAE8Dn2MEqu3msQXmeXuBWeb2aaAvMNnjrScCKRjzI14DvqO1/tw8tgBYAnyCMXR1v/lZ3tTidTXnk9yFMTqqEOP5313m96qlfQcoArKAoxjzYmaY5WwN9X8ICMcYXn3e48/vaf3Xvqm6+/11l4y6QgghfJK0oIQQQvgkCVBCCCF8kgQoIYQQPkkClBBCCJ8kAUoIIYRPkgAlhBDCJ8lEXSGuE6XUPzBWem7MXIwJixuAcK11iyx7ZC4a/DHwLddEzEZeZwU+xcjfo1uibEI0RVpQQlw/czBWz+6Cka4FYKjHvj9gTG7swoU1AlvCI0BGU8EJwFy/7deYE1mF8DaZqCtEM1BK9QP2Aj3NPETeKkcwcAy4zWMlgMudk42xcsDG5iybEJcjXXxCtCBz7TN3F59SyomRBfUJjEU2d2Akk/spxrI054AntNb/NM8PB17AWELGCawH5jSRauObwFnP4KSU+iVGVtSOGDnPntRaf+BxjmsNtY3XocpCXDXp4hPC+54DHgXSMFaU3oURmIYAS4FXlVKuvFZ/xQhkd2CkUnFipNRu7GbzTuBD14ZS6h7zs+7DWGV6FbBEKRXhcc6HQHoT7ylEi5AAJYT3/UVrvUFrvQdjZerzGK0aDbyIkXunp1IqEaNFNE1rvd1sFc3ASPs9tpH3HoyxUKpLD6ASyDG7Hn+Nkaa72uM1+zFW/r7hutROiKskd0hCeF+Wx89lwFGttevhcIX5dxCQYP6slaqXcqcdRqvq/Uu8dyeM1apdFmGMNDyilNqJkYF1oda63OM1Z8y/Y79kPYS4rqQFJYT3VTfYrmvkdQHma28cdKEbAAABSklEQVQCbvT4kwwsbOScOowMqQCY6WIGYbS4PgFmApnmoA4X1++F2iuugRDNQAKUEP7jAGAHQrXWWVrrLOAkMB8jSF1KHsZgCACUUhOAB7XWq7XWczBaXiXAOI9zOnqcK4TXSBefEH5Ca62VUiuAN5RSDwEFwDyMwRUHGzltJzDAY9sGzFdK5WOMGEwDOps/uwzgQqI7IbxGWlBC+Jf7MYLJexgZYiOBr2qtzzby+lUYo/0A0FovAZ7BaHUdAp4FHtZar/c4ZyTwodZauviEV8lEXSFaMaVUO4x032O11ruu4PVWIAdjpODmZi6eEE2SFpQQrZjWugyjtfTQFZ4yHjgiwUn4AglQQrR+fwT6qwZj0xsyW09PAd9rkVIJcRnSxSeEEMInSQtKCCGET5IAJYQQwidJgBJCCOGTJEAJIYTwSRKghBBC+KT/B87xzMkIJb3xAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_Q_in(Q_frame, data)" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOydeXwbd5n/36PLlizfdmwnTuxcnVxN0iPN0fQIpXe5Srl3C5TtwtICZbl2f7CFsty0BRZYCizbspSb0kLvgx60TZqkaXMnkyaOHTt24vuSdWt+f4xGGkkjn5ItOd/365VX7dFo9HUlzfN9rs8jqaqKQCAQCAS5hmWmFyAQCAQCgRnCQAkEAoEgJxEGSiAQCAQ5iTBQAoFAIMhJhIESCAQCQU4iDJRAIBAIchLbTC9gvMiyfB3wDWAh0Al8R1GUn8qy7AB+BNwAhIG7FUX55sytVCAQCASZQMqHPihZluuA48A7FEV5XJblc4GXgQuBdwGbgLcDpcATwDcURfm/mVqvQCAQCKZOXnhQiqJ0yLJcrSjKkCzLFqASCAFDwAeBDymK0gf0ybJ8J/BRYFwGSpblAmAd0IHmgQkEAoFg+rACdcBORVH8xgfywkABRI2TCxhAW/e3gS60P+yg4dTDwNkTuPQ64MVMrVMgEAgEk+Ii4CXjgbwxUFF8QBGwGngM8EaPjxjOGQFcE7hmB8Cvf/1ramtrM7FGgUAgEIyTU6dO8YEPfACi92IjeWWgFEWJAAHgVVmWfwacH33IaTjNBQxP4LJhgNraWurr6zOyToFAIBBMmJQUS16UmcuyfIksy7uSDhcAfcApQDYcX0ZiyE8gEAgEeUi+eFC7gXmyLP8r8ANgPfAR4B1oBurLsizvBdzAZ6PnCAQCgSCPyQsPSlGUAeAa4HqgF/gZ8E+KorwA3A7sBw4AO4EHgHtmaKkCgUAgyBD54kGhKMprwGaT4z7glug/gUAgEMwS8sKDEggEAsGZhzBQAoFAIMhJ8ibEJxAIBMn09vayb98+XC4XJSUlVFRUUF1dPdPLEmQIYaAEAkFeoqoqDzzwAO3t7QnH161bx9VXX40kSTO0MkGmECE+gUCQlxw9epT29nZcLhfnnHMOS5YswWq1snPnTrZt2zbTyxNkAOFBCQSCvENVVV544QUAlq/ZwNlnr6GhroQDBw7wpz/9iaeffpqysjJWrFgxwysVTAXhQQkEgrzj2LFjnDx5EqfTxU+f7OXWO5/DHwyzcuVKLrvsMgAefPBB2traZnilgqkgDJRAIMgrjN7TouXrYsf7h7RJDRdeeCHnnHMOoVCIP/7xj3i9XtPrCHIfYaAEAkFe0dTURFtbGy6Xi/KaxtjxgWHNQEmSxLXXXsu8efMYHBzk0UcfJR8GswpSEQZKIBDkDUbvaePGjQx54wLYv3nyMJ+86zlO9XiwWq1cf/31OBwODhw4wN69e2dqyYIpIAyUQCDIG44ePUpraysFhS6ah8r5xV/3xx7bdbiT4+2D3PyNZ9h7tIuKigquuuoqAB577DH6+vpmatmCSSIMlEAgyAtUVeW5554DwD7nHH7/zNG0537xJ1vxeIOsXbuW5cuXEwgEePDBB0WoL88QBkogEOQFhw8fpqOjA7fbTcBSMub5n/7eC/z8L/upWXwBbreb1tZW9uzZMw0rFWQKYaAEgjOEY239DI0EZnoZEyYcjvDwi8d4/Gkt93TRRRdhs4x96+ro8fDwi03c9ds9bLroTQA888wz+Hy+rK5XkDmEgRIIzgBO9Xi47Xsv8I9ffoJwJL/CXL99WuFnD+1nW2sZ/dJ8/viKj9N9IwBcs6mRzWvm4iywpn2+qkJFTQMLFizA4/Hw/PPPT9PKBVNFGCiBII+55897+dEfd4953ule7YYejqi0nR7K9rIyyqsHTwPgizg5OlDJ4ZY+lBat4GHz2nl84cZ12G3pDRRA76A/ps+3Y8cOOjs7s75uwdQRBkogyFNUVeXRl4/z5CstBILhUc/1Gx5v7hjM9tIySiic/m9zFmhqbXZb4q3sJ194U8LvvYM+amtrOf/881FVlccee0wUTOQBwkDlGS/tOcn1X3iYfUe7Z3opghnGGKoLhSOjnuvzh2I/3/nrXbR15o8XZSH93+Yq1AzU5//x/Nixz3zgPOrnFPOjz27h4nPmAZqn2d3vZcuWLTidTlpaWoQMUh4gDFSe8e3/e5VgKMLX7t0+00sRzDChUPzGvetwJz//y760hsrrT/RC2rs9WV1bJlBVlUdeauJE50jac9xOBwArFlby8F1v4+G73sal59YD0FBXwiXRnwF+/pd9OJ1Ozl69mtOBKra+ut/0moLcQRioPGXEFxr7JEHeEo6oY4agjMboO796lb/+vYm/v27uFfgCiZ+XsUKCucDLe9v56YP7SOccvvXiRZQUOUa9xrKGitjPW/d2sG1fOwORGlp99fz6JT/hMTxPwcwiDFSOEwxF2HHwFN393pTqKxFDnz14vEEOHe9FVVUCwTC33f08n//hi6O+x8FQ6s11aCRoeq7Xn2ygIjz5SjNf+NGLjPjMnzPTtJ4eTvh9ca2DMndB7PcPXbtyzGuUFDn4/devobFO65v6xn07OdSmlZmrSDz294MZXLEg04h5UDnMTx/cyyMvHY/9vnJRZcLjDz5/FIfdynWbF0330gQZJBJR+X8/eZmmkwN85K2rKHU7YoUMg54ApYabspGgye6/0GFezeZLMlDBUJgf/VFrWn1iWwvXb1kylT8hKyQb53deNI+LNqzmyIk+7DZLSmFEOlyFdq7fsoS7f/MaAK8p8Qq+/UdaecuWVZlbtCCjCAOVo4TCkQTjBHCgqSfh93sf0XZ/F59TP2aoQ5C7dPR4aDo5AMDvnlbweOMezRut/Zy/vMb0eWb5plDY3ONK9qCMVX2RHPXEk9dVVqp5QWctKJ/wtS45pz5moIy0n+5GVVUxHj5HESG+HOXEqfRVVkvqE2Ve+oZEZ3w+o/coAQnGCeC5Xa1pnxcyCfGlC9f5AppBKnVrG5lgMP7c8Xoi000kKaRdXj62vFE6LBaJn/+/N6ccHx4J0NXVNenrCrJLbn4yBTR3aDvq9Str+eWXr+TqjY2xx6y9uxLO7R/0T+fSBBmmsze1Sm3T2XUAnOoeTnlMx8xbSvaUko+XFGnhwkAo9w1UsmNX5HJN6Xq1lUX89+ffxJL6Ui6/YAEAYdXKwYOpeaixyvYF00NufjIFHG/XchBL55dRXlzAufMDlNo9lNv6KLZ5aCw8gc2qhSWEB5Xf9A5q79/S+WUsayjnsx84j7mFWp6kpy99U63ZTdSbprrTFzNQUQ8qFA/x2a25eRtIzkHZ7aOrRYyH+TXFfO/Tl7Jp9VxAM1CHDh1KOOeZHS3c8G+PsH1/x5RfTzA1cvOTKYglyRvrSti6dStPPvEYS51vcPXaAjZs2ECVo5d6txYG7BsSHlQ+o7cMXLR2Ht/95MWcVWfl8KF9QDw0Z4ZZFZ83kMZAJYX4Xnj9ZOwxqzU38y/JVas2S+bWWVRoByAi2ens7KSnR8vverxBfvD73YQjKk/vOJGx1xNMDmGgcpS2Ti20U1NewEsvvQTAW9/6Vt773vdy2WWXUVpaStCnGbF+YaDyGj1v5Cq0xWR4rFH1hEAofQGDmQdlZrQgHuIrdGh1Ucaw4uNbmznZlT6UOFMkh/isGfT0aqu0cOFwyIk3XMirr74KwMHj8UKkXDXcZxLCQOUgkYhKXzTs03RkHz6fj4aGBtauXYskSdhsNt785jdjl7SbzsMvNbH3qEj05iu6B+UqtLNnzx7a2toodhcCEIpIRCLmRudXjx9KOZYud6I36vYOpIaDD7f08bFv/W1Sa88myVV8tgwajPLiwtjPpwNV7Nq1C4/HQ2efN3Z8694OHnrhGB+840k+eMeTdBkeE0wPwkDlIIOeAOGISrHLzs4drwBwySWXJJTCrly5krrqUkDbNX/xJ1tF426eontQNkuEZ555BoCrrngzoKJiobevP+U5zR2DMUVvI2YeVGfvCKd6NI9J16bLB1RDiM8ikfFS8Os2LwSgsKiMYDDItm3b6OpLLFj5xV/30zvoo3fQx7d/tZPbvvc8x9sHMroOQXqEgZphwhGVwy29CUlrPWleYIvEvKeFCxcmPE+SJC67dEPCsR6T3bEg9xmJht+a3jiMx+NhwYIFrF69GrtFu0F3nI6HnTzeID/8w24+cedzptcyM1BGQ3bJufXUz3FncvlZI2zYcGXSe9LZvEYz1g6nttHbsWMHx9u1zYDbaU85X2np41jbAJ+86/m8EtvNZ4SBmmEefvEYn/uvF/nJA3tjfR+6gQr5tJ3apZdeavrcdauXJvx+a5qbliC30UN8A/2aQv2GDRuQJImyIu2mvFs5HTv3kZeaeGp7S9prmRmocDREWFvpwmG3cuGauRlbezZoPT3EzoOnEnJQmcw/6VSUaGG+YV+EBQuXMOyXOHBMew/ef/nC0Z7Kf/1+7BlcgqkjlCRmmMe2NgPw9I4TvLTnJF/96KaYgbKqfhoaGmhsbDR9rsUiccUaJ0/t0WLjHm+QQU9AqErkGbpwq9ejFSqUlZUBsKSukK4hP8cN85sCaYogdJJzUEMjgVhF6IqFmlTWkvqyzCw8S3z8O88CcNaC+DrHGkg4GcpLtJ6w3kEfe7pqODaseZYOm8orzz0ErEj73FM9ua8GPxsQHtQMY9RO8/rDvLKvg+ZWrQfGLgXZsmXLqM9/z1VrOa84vpvrGRCJ3HxDL6f2eLSwUUmJpphQU1kMaNNgdarLnKNey+hBqarKzV9/mgeeOwqANVqmXTXGNXIFo5qKJQtSRIUOG0VOO6GwyrH2uMGxRrw4LPFy/TLbAHYpAMDas6oArbXjJw/syfiaBInkjQcly/LlwLeApUAn8F1FUX4qy7ID+BFwAxAG7lYU5Zszt9KJoZf96nh9AfbsPQyUcNaiehoaGkZ9fnV1NVVVlZSMDDIYLqFnwMfCuaVZXLEg0+gjH/w+L067FVdUMWHenFKgm0FP/GZpHaMXyGig2jqH8Rgad23RMJneA5TrGPUCyVLFd7K0FEBVWRGfuuUTqJZCDjd3099xhBe2vU63v4Ry7wnOXnQ2+5oGeGxrM2+9eDHzqvMjp5eP5IUHJcvyfOAB4GtAGfA+4JuyLF8J3AHIwGJgHfBBWZZvnKm1ThR9ZLXO/sNNePzajnrjujVjPl+SJJYtW4bDon3RcrGfRTA6umSRhEpxcXGsWm3+XC0kp38eILV5NfVacQOV/FnQjVvHyfQ5rFzCmIPKlhzTkvmp4c51qxdTVlZGeUkhG1fXc/WVb+Jzn/gQ6xojDA30Qld8WOh3fvUq37hvR1qJKcHUyAsDBTQCv1EU5UFFUSKKouwEngcuBD4IfF1RlD5FUZqBO4GPztRCJ4onWmL8vitkQIuHh9BySFXl49MeW7FiBW6rFqLYcyS1HyocjvDff9rDs6+KzvhcRO9zkiQoLY17v/NqNNVuf9iK16uFbscyUMZqUL20XMdqtXDgwAH+8uAfM7Lu6SRbckyfeNfa2M8bz67j6o2Nse+ikcrKSj7ykY+wbt06CiQf8wraAWg6OcC2fR28euh0ynMEUycvQnyKorwIvKj/LstyBXAR8CugDjCqPR4Gzp7WBU6B4eiAuYV1RQB4w06KXA4IhWNVRmNRV1dHbSk0++BoW2/K49v2d/D4tmYe39bMm85fkKmlCzJEKBL3oPT8E2jCrhIqYWyc7uyhsaE+VpGnU+Po5HRgTuz3oeERfD4fhYWFdPcn5iNHPMM8+OAzpIsS5vLYiWx5UIvmlfLHb1zL3qPdnL+8BssoIVSbzcY111zDggUL+Pnvnk14rOXUIBeRPz1m+UK+eFAxZFkuBf4KbAd0WW/jVnEEmJrs8TQy7NWSr57eEzgkP2GsDI5ou2Bjt/toSJLEOauWIBGhbyiYMnKhvSueABbNvDOHqqrc8T+v8F+/fz3heDgpxKdjsUg4HdpjJ9q18ufkERSOaPJeJxRS2b5dC0Elj3k/fPgg4XAYu908B5VultR0kvz36WRTcb2wwMYFK2tHNU5GVq1axVWXbUo4dqo7VZFeMHXyykDJsnwW8ApwGq0oQi/zMZYluYC8SMSoqhrzoA7sfY0ia/xDXlFSOKEv5cqVK3BatPL0ZIUBY2XfoCfxhiaYPoa9QV49dJqnd5xISM7rXlGyBwVQXKhVebZ3au9p2GBE7FKAmpo5CeerSDF1bp8/UWg2HAqwZMmStJWhxvDgTGE2JRiyU2Y+FTatSwzS9PQLdYlskDcGSpbli9G8poeAGxRF8SmK0gecQiuS0FlGYsgvZ/EFwoQjKnabRH9fL5VF8S/nRKeczp8/n4pCzUDtOtiW8Fj/cLxMOTnsI5g+jAUMTVG5nEhEjRYDqEgSKQaqyKV5Oz192l7MmIOSUFm4aHHC+REkTp06TU9PD/5gogdV5HJxww03UFdXZ7q+dEKz00m6NQRywHgaSe41HBgQfVHZIC8MlCzLi4FHgNsVRfl3RVGMd+9fAV+WZblKluVG4LPRYzmP7j3ZJO3Ld+3mJZS5tebBzRPs9rdYLNRUaeGhzu5E7Taj2rmQQ5o5QgZlct2TjXtPGikelEsL8/ZFb4BGA+Ww2xKKKopdDkCixVfPp76/NeW9XriwgYKCAmpqzEfIv9Gaqvk33aTz4vpybCinJEmcK8e91xGfiExkg7wokgBuAYrRSsuNPU4/Bm4H7gIOoBncnwH3TPsKJ4Gef1LDfqxWKxvXn8dlW1y80drP/JriMZ6dypzKcjgxTG9/YoTTaKC6RSPvjGEscIhEQ3WxEnNJ+6/R4ACUFjuBQQaGtPctaPCKGueWJeRsdC+jO1gFwQgDI4kGZ17Uc3I6zRt1j7b1c/5yc+M1XaTzoOaU515z8ZduuoDXD53kP+97HV8glNNFJvlKXhgoRVH+FfjXUU65Jfovrxj2xj2olStXUlSkVfKdtaB8UterrakEhhkYjueyQuEIXYawngjxzRzGm69urHSPSFJVLBZL7DOgU16q/T7s9RMOhznZHp/y+rkbN/Lsrng41z/KcEMAh2P0r3soB0J8ZmtYs7SKj98wdk/gdGO3WZkbbQUIRaC/v58Cp5uIai42K5g4eRHim60MDmshGJsUZt26dVO+3ry6akAb3+D3a15TS8dgwo3xj397gz9HpW8E04sxPKfnGHUVCUlKbNLV0cJ2EIpY6enpobVNM0jXXFBFRakzoSrTMcZI9LEEV9PNkppOvvLzV1KOfe4fzmduVW6qNRTYNaMfUS2cbG/nE3c9z81ff1o07mYIYaBmkMNHjgPgdjmYN2/qPRTuaL4irFpob9caCfUSc2PH/C8fPcDQiIiZTzdG70CvxosbrdQKPtCGGIL2nj777LMEAprXXRvNIxlDfN++dfOorz8RmaSZosNEhDWbJeZTpbBA2xREVAvNJzro7B2JVWsKpk7uvvN5Tnd3N6+99hrtnYOm3f+qqqIcbQZg/tw5GYlduwr13ZyVtrY2whGVZ3e1ArC8sYKPvuPs6OPQ3D5I62kx0yZTdPd7U/rPkjF6KPpnQj9mVmIOcTHhCBYURUGNllPo48iv2NBAscvOO7csYUl9Gcsa0oeHx5qplK7Ee7pI16OXywaqwB5/f1rbO2PHxQYwM+RFDiof+cvDj/HMISvD4VZWLSzlm7demvB4a2sr/YMjQAkN883LfieKvtsOqjZaW9vYtq89tpMrdjm4bvMidh/pYvuBU9z+s62EwirfumUzKxdVZuT1s0HPgJcjJ/rZsKo2ZxPQr+zv4Ov37qCxroT/+syladdpZqAiCSoSqSK/BY74Dh2gsNAFAbBatN/Liwu5/46rY02mrlGEYPXnpGOmc1BmGzmLFBe5zUXsNgsSoGLh5OleQMsZPr61mYNNvXzyPWvHDL0K0pO773yes/WoxHBYi5vvPz7AfX96IWGHuGPHDkKqtj/QS8unSnWZk4qSAkKqnUPHuxPEQhfUaGupqdRENvTqsb++eCwjr50tbrv7Bb5x3w7+/vrJaX9tjzfIn597g+ExdsPb9mmFC80dg6OWaicaqEjCMUky96CMO3SA2lptM2MM1xkVEJyF6fecxhv9Z95/7qjrmwnMXt9ZYM3ZjQlo5eZ6mE9XgAHts/DC6208tvX4TC1tViAMVIYZ9gbZtreVTl/izeapHa089NBDhMNhBgcHOXjwIEFV2+2Wj1NzbywsFonljZo31Dsi0dmjDaqrKrHzzEO/YOfOndRUJKpADXlGD0vNNHqT8W4TEdxs8/V7d3DvIwf534cPjHre0ba4URptFLhRSkj3nIwyR6YGyuBBVVdXUxwtQ0+XTypI2q0XGQyW1RDiu/S8+bxrXeLXf6aljsxe35kHo0H0QolAJHVQ6PH2wZRjgvEjQnwZ5t9//FJsgqkRqwX27t3L8PAw1dXVqKqKraAYQuPX3BsP1dF+kRO++Qwf0mLi5WoLSCpPPfUUGy57d8L57d15oQqVois3HeyLjv/e/cboxrHX0BD7xN9eZp1cnqCpp5PgQSUVSUikNulCvDKvqrqGG298Oz/7qwIkGhsjyfkal9Memwm1aF5iCLGutgpttFrq+mYCsxBjUR6Ua+ubiLCaGsqbqCKMIBHhQWUQrz+UYJwk4h/OhgXzKSoqoqmpKSbmGZa00J4+ejoTGKel9g5Fb+phL1arlVAoxIE9iWW8PQO+xMFwOYpvjB6fbBIMpr9xB0PhWD8bQFeflz17zCetTqZIIuYRWWy43e7Y8yxp8knJ/Te3f2QDb7loEe+/chlzksa31NUmNuVu29cxo2LCZgbSVZDfBip3g5P5waQNlCzLFlmWV8iyfKksyxfJsrxUluUz+v14/rVEDby1C+Muf0lxETfddBMVFRUAVFTX0TccxGGzUFmauS75VSYFD0WOCDfddBMul4vujuaUx/sGc1/+aDo8qK4+r2mpdf+wn+Pt5mKg/UOJ+amgauP4cfO8gzGEpRsavWxcklTc7tReH/3mpzfh6s9LF+JLHtHSWFfCP7/9bNMZRzVzqlOO7RnDW8wmpjmoUXJquYK+iTAzULlQup/PTNhAybJ8sSzLDwB9wH7gWeAFtDlMXbIs3y/L8qbRrjFb6UmSEVqzuCL2s91mwRO0c9Vb38PFF1/M0tUXA7B0QXlGy2gX15fxL9evSjh21Zs2MnfuXK6++mqsUuoXJh/0+bLtQR083sNNX3uKnz+0j95BX4JXBLD3aLfp8waGEzXiwqqVEydOEAqlGlRjCKu3V1MnHxjS+n7sVoupV6TnN/zBMMfbB3h5j9bfls5A1c+JhxbHki0qcqWGlg819/H7Z5QZKZM2u5knT5zORQqjCh0RSRioTDPud1+W5aXAT4EFwIPA9Wiq4T1ohq4aWANcDPxOluVjwEcVRTmS6UXnKiO++E2pxDrIBavO5b5ntDLvg8d7+Ph3tJ6kP3/7Oq7/wiMArFhYkXqhKXL1pkXc+9c9+EJWzq3rZ+PGtwCwcuVK9u/fT/PubkakSpYsqGbv0W5688CDynboSVfX0Ac7JtN00tyD8sTkqkKEVBuq5CAUCtHW1kZjY2PCuUYPYc/evfRcvpSBQS0HmK4U2ehBfff+XbHj6WYXnSNX884tS/D6Q3z4upWm5+iYKUv85snDALxxop8v3bR+1OdnGlMPagx5plxAf4+sdicEwWGTCESFgds7RMPuVJjIu38/8FVFUR5N83hr9N8jsix/AXh79DkXTG2J+YN+s6p3dlJja6eq6gY+8e61/PAPuxPGb/9tZ2vs5/OWZV6cU5Ikbn3LXF7ZsYsPvv+dsZ25JElcc801HDv2Q0KhNtzuKwDoG8p9AzXT9A+bq2kPR5tzHZJfM1AWLax7/PjxFAMVNtyAVRWeeuopKF4IQEGaG7HuQYz4Q7gMYc50vUGSJPGhMQzTWNcA2H7g1LiukUnMDJTDnvtp8nieUMuXVVhOUeQc4Zh3IQNDw0QikbQ5Q8HoTOT/2oZRjFMCiqKoiqI8CEzvFmyG0Q1UAR6Kilw4nU6KXalJ3h//SUuilxUXZK1J9pLNG/jCv95CbW1twvGSkhLOP/98ALo7td4iz0hul5pPB2MVivQN+ky9uNh7btFCYoGw5tmY5aH0cB6AZLFx5MgRjh7TzitME8qy2ywUOqxEIioBQ7goE6Evq0Viy+oSSqy5UQodNikzz4cm11grQHS/L6GyuEEblxOOQE9Pz4ytLd8Zt4FKmsGUtefkM57obtoqhams1AyPnkMww6ygYTq48MILsdlsDPRoJcaDeSDLku3qm3RK4Lp81MlTPdx3330MDSX2ObWe1DwNd6EFm1UiFFY1VYGTJ2OCvTrHmlpiP8+Nai+e7uyOvk5qD42OOyoYaxQg1W+KU+UdFzdSX9iekWtNFTOppXwyUMHo5uSCC87n6qu06ISqSjFdTMHEGZeBkjUuk2W5OOn4ddlZVn4y4tVuIEYDNVoJeXLT7HThdru54IILsEraeoeFB5XWg6qJlmYHI1ZaWk7ws5/9jKNNzXh9QZqbmzmkaEoc9XPnxJLlc2rmEolEOHHiROw6IyMjtLXHw2Zz5tRQUVGBGv0KOgvTf05KogbKaEQzVTxQWVmJy5obId6ZllqaLPr7PhLdQJQUF8cKnyIIAzUVxjRQsizfAvwF+CRwQJbldxge/mq2FpaPGD0ovZy8sa6E85bNMT1/Qe3EhxJmik2bNqE36Xf15kaIJxmjUne2XfF0HlQk5EMigoqF+QsaGBoa5t9+soN/vP2v3Hvf/9E3qOUWFzXWx4Rd6+oXANDU1BS7zs6dOzEOi42ocOWVVxJRtV13kSu9gXKbhIkLM+RBFRcXY7fbKbPN/DTdQ829Kcdmsi9rvMTkqAwtAPZo7kxVLXR0dKR9rmB0xuNBfRQ4T1GUtwGXAF+SZVkfHnhG9z0lE6voIu5BSZLEV27eyE++8Cbu/ORFnL24Knb+gtrUxszpoqioiNWrlgFwqrNvxtYxGsYJtNneXafrsxro78USLc2//ob3sGTlOvyRAvxhGwVF5VRUadp41RUlsUKH2rp6IJ6HGhoaYvv27TE9PdC81tdaVB1PNhUAACAASURBVHBpob6y0vSblcrS1HLwwgxVt0mSREVFRUJT+Uzx26eUlGN5YJ9Swq1Wq4TdquelJE6dOkUkkp/e4UwzHgNlUxTFA6AoynHgUuBKWZbvRhioGKqqxsYtWAwhPp36OcXIDRUJIb+Fc1PVq6eTjevOAWDYFyIczj01CaUlbjizLcPj86cJc6phCqK7YX8wwuJla2MPved9/4CrRPOUS4ocMdHQ8spqbDYbp0+fZuvWrfz4xz/G6/VS4Iw34r68t51fP3GYtuifOJrm3EVrU2eFZcqDAi3Ml0tf5Ap73JPKBw8q+b2wWKR4b6NkJRgM0t1t3kcnGJ3xGKhTsizHvpWKogwB1wJVwNnZWli+4fWHiKhgIYxFIhbiS+aSc+opdTv45LvXjjlALttUV2oeXFi10teXW15US8cg//7fL8d+D2ZZyDRdDsoiQXmJZli8/lBCw7DXH2YwWn5e6i6IeTXBMMyfPx+Ap59+Gr/fT2mtzMnB9GE8hy29wVlcX5ZybKzpuBOhoqICSZppodgI+tehsTDehpEH9ilFoNdqscTL4yXtvyIPNTnG8ym/EUhoilAUJaQoyo1oTbkC4k26VilMaWkpdrv5jviClbX86itXcfn6hulcnim6bltItdLZNXMSN2Y0JUkLhULZ8/AiEZV0l59TXYk7mh/y+cMJBsrjDTLo0SogS4ocCU21S5cuBcDlcnH99dfztyOjy1k5RlETKS/OnFajGdpmynyo5nQx6AkQUcHlkLBI05d7zAQpIT6LFKs+DEc0qysM1OQYM5CtKErbKI+9nO6xMw09/2Q1Ce8lkyvzbaxWCw6r1rvTcaqbFctnekVxipJCXsFQ9m5VgVGMX339XLr7NAkrrz+E35CrGhoJ0DekeVAlRY6Y6oHXH+LC9eupqKhg/vz5OJ1OoCnl2kZG05yTJIkr1jfw1HatTP36S5eM6+8aL+lCfKGwit02PZ9VvYTeZtHe503Li3j1qI/rLlw4La8/FZLzgVaLhM0abzuIiFLzSTOpTKssy+8EfgjMAU4ArwOv6f8URTnj9D2GYwYqMqaByiVchVYCnjDtp1MrqGaS5DLqbOagevrSz3Cy2yyx3JI3EMLrjxuzg8d7CYYi1Fa6cBXaDR5UCIvFgixrAq3jEbp1jqHavWZpVcxALWtMP9Z9MmgGKnUDEAyFp23cutcQgQB4x+Z6Pn+TPONh8PGQEuKLjkIpsFsJhUNEsHD69GnC4TBWa+73deUSk/30/QBNJPatwN3AAPAu4CHgjNwqjJg06eYDxdEem86emS8zHo1sim4eeCNtkAC71RIboz7iDSZ4UE/v0PqcljVo+UZ9dpHHoMnoC4RSBh6etSA1p1TkHH2vaFS8z2T+CbQwpNk1p1PoVPegJFX7b2lpaV4YJ0htJtZljfSqzuKSckKhEF05FkbPByZbq+oG/iNa1RdDlmUHsMr8KbMbsxLzfKC0uJDWLi/dfbk1uNDYAwWaB6WqalbCoz98MH34zW6zxPqQhkaCpqrqm9dosjbFTv28uDLHD/+wO2Vc/RXrGzlyYnfCMdcYk2PLDHmo0TT0JoMkSbichZDUrzsTBkqNaN8js9lYuUqyXqBuWPXqvsrqGtqGumlvb+fQySCHmnv52DtWpxX8FcSZrIH6K3AOkGCgFEUJoIX5zjg8vlQViXygvMQJ9OHxhfB6vdF8ycwTNknQ6zmRcDhCMBRJq1+XSWw2SyzcODQSMA3XlUdnMOmSREZljmTjNK/abSpTlJxzS0b3dAFsaabpTgWns1AboGNgOg2UrsIgRYJYrVZcrplRWZkMyR6UvofSc1PlFdW0NWmFEj99TqtQ3LCqjnNl8wZ+QZzJbsU+C9wqy/K5mVxMPjM4rG0/bZYIpaUz2980EfSbali15VSvRrIHBfE81Cfvfp53/b9H2b6/A59/6oMM7RbNK3rLptR+I7vNQnGR9v9IM1CpHpQe2tOFgdNJR82pcPHtWzen5CwgrvmXDuPo82x4kS5najPwaMUjmUb3oCxSmJKSkpwpJBoPye+n3lSub0SKor1yRkWJwTTq+IJEJrsFPQdoAHbKsrwH2Arsiv47oChK7nV9ZpnOHk0uqLioIK+k9fWdeUi10tPTE+vfmWlGM1AnTmlFDV+7dweb18zlCzeum/TrjIyMoNdfLJpfDSR6PHarNfb/aGgkYCqJpHs/urEf8mohvv6hxJvQ8oYKSt0FprmVIufoHpTxOZkwysm4XE4gaTrwNHpQXX2aZJQtaqDyiWQPSled10N8P3qoiYbCSkLtvWh1ZWKQ4XiZ7J30p8BR4GbgMWAx8E1gN5C+JGoWs+eoJqlfV5HdnpVMo+/6QznmQYVNDJTZl/qlPVOryTnZ3h6TICopSn3vbDYpwTPSPSjjaHW9wMEdO0+70X/nV68mXOuitVquSi+o0ZEXlE8or2RmvKeKuygeUiuKenPTKd66/5j2/XFbh/PQQCW+d4Fo07ex+bvFN5/dg8tiv+v9c4LRmawHVQVcpihRKecosizPR/OuzijCEZXuAe2ms6Ixf8J7EPegwlEPKleImOWgQpEpNY/6/CEe29rMBStrYqPRT7S2AxI2S2qoBsBus8ZyCf5AOKYP6HbZY5OI7VEViLinpX0W9h2LG/yvfWwTq5doOowNdYk34NVLqxgPH7t+Na8rnZw3xij3yVBkyPkUOKx4fKFpDfENx+ZqBSkunjkR5cmQ4kEFtc/ImqXVHDxu3r6RbgCmIJHJGqingaVAgoFSFEWfqntGMeQJoKKN/Z5TnZrHyGWSQ3y5QroQX2gMyaNdh08zr9pNbWVRymPb9ndw7yMHuPeRAzx819sAaDt5CiigwGHBZtLzU1VaGMsl+AKhmGdnNu5CV+YYHgngD4axWiTCEZU7bt7ImqXVsfMWzi3lW7dspq1ziNePdPGuy84a9W/SufbChVybpcbVgoJ4EYbe+zSdYSg9fCuh5p2BSvZ+51Vrn713v/ksmjsG2bYvVc3cm4Uw7WxksiG+vwBflWW5MYNryVv03ZBNCqXV4MtV3IYQX29vb86oLpsZqGAoEgufmHHkRB9f+fkr3PyNZ0wfNxYvhMMR/H4/La1aiNBVaDdtSl00rzTuQQXjUkcfvHYFa5ZW8Z1bL4qd63bGy9G/9r/bCUdUFs4t4VyTcSsrF1Vy5YZG/u3GdRmb7TQVjDkuXc1hOg1UWDdQkorb7R7j7NzlsnXzuWClNsXaZrXwmQ+cxxyTuW/9g56UY4JUJvvN+AWakvlhWZafxVAkoShKZ6YWly8MRJPhdimYVyXmEPegIpKdcDhMf39/ThhZsxBfMBwZdTT7cYN+38muYUKhSEI4zXjD9QfDPPPUk/R5tGOl7sIUA3XthQupKCmMyRn5AuHYjbShtoSvfezChPOtVgtFhTY8vhC7j2hNmZdfMPOai+PB2JMjof2N0+tBqdHXznMDdf6ChArEAruVH3z6Et5/++MJwrcn2zuz1tc3m5isB1WGNnbjC0AX8G40r6pDluUzLsR3skur4Cuw5l8Fki5E6g05iKjSjIf5hr1BwuGIeYgvFEk7WBC0IYA6H/vW37j1zucIGvIoxp8PHX6D119/ne6QFnrbtHpugoF6z+Vn8bHrVyNJUqway2+QOko37kIvSdfZsKou7XpziYTKwmizbHAac1DGEF8+Gyiz4ZJul4MVCxM3rm39Ft7zxUd5ozW3pgjkGpPyoKIjN/4e/QeALMsFwBpgbbrnZQJZli8AHlEUZU70dwfwI+AGIAzcrSjKN7O5hmSOtWrJ8HK3Je92RG5DA2izdz49PT0xJe7pZmDYzz9+5QmWN1bw5nULUh4PhiMJKg06+k40YqLXN+ILUerWjEnA4BE88dQzBCM2+oPahuKydQsSPAbj+Au9eEI3ThaJtBp1Ze4CTvVoJdPrVtRQVZbaX5SLGA2UGg4CthkL8RUVpeYPc53/+Mh6TnYOp53xVlmS+jnw+sPc8+e93PWpSwB48fWT1FUVsWR+qhTWmcq4DZQsy28AT6EVSDyrKErCnHBFUfzAjui/jCPLsgR8BLgz6aE7ABmt1L0UeEKW5ZOKovxfNtZhRnunVllfU54fN6NkChxW/IEwvaGKGS01V070oaqaCOul52n9WFesb+B0r4c9b3TT2zfAnb/dn/I8XWHingf3pTxm9LiM+auBYR+HPJoql0XSDIuxsspYOmy1WrBZLbFdfpHTnnYjsvasORxu6aOytJDbP7JhIn/+jGIxJPpDQR/g5kd/3ENJUQEbz86+FxiM/r+1WSUKC/Pve3TBilpYkf7xpQvK+fvukynH9TE9x9sH+M79WluCXsAjmFiI71rgIPBhoFmW5ZdlWf6yLMubZFmejs7UO4B/Ab6WdPyDwNcVRelTFKUZzYB9dBrWE2NoRLuxVZbnV/WRznc/oSX6LYTp7p65EJ/N0OB8ukdLIlssEpGw9iX+80MPmz4vGAqn3e17AyEGhv2oqprQ1xOW4jfBiJo0BZV46biOMaRXVpz+BvqWixZx4zXLufu2S9Kek4s4DX9fOBg31N+4bwfBUISu6MiRbBGO5qDcRa68i0KMh8X15p6V/pls7xJFE2aM24NSFOUIcAT4sSzLVmAjcDlwF7BUluUXiXpYiqIczcJa71EU5XZZli/VD8iyXAbUoRlOncNM86RfrfFSoqoiv3qgdBbOLaXU7WBgOMDJzoGxn5AldMFdIFaYYJHAO6IJ2Vps5jqBvkCYT9z1vOljr+zr4P4nDnP1psbYTRCgYk49JOnj2g1eRPIAwcICW6xXZ7QBgiVFjnGXjecSRl1Di5Ro7L/8s23sO9bNf3/+TcyvyfwmTFXVWPl+cR7nn0Zj/px0/9+iBSmG8HQkogoh2SiT8nwURQkrivKSoihfVhRlI1p47VfAauDxTC7Q8JpmkgH6p3nEcGwEmFalSb30eE5l/saOG6PVbt2DYfz+mWki9BgUFvRwnMUi4fdpu/el8krT5/UO+OjsHTF97HdPKwA8vrU5ofG0oCi1UjHRg0r8apQYcnVlWZ5wOxMYS90tJBZH6A3HR05kJ6Efr+CLUFw8Ow1UqdvBnHInzgJb7LsGMByNvgwZlCVGRI9UjInkoK4CXlQUJcUXVRRlAPhz9N90oq/FuLV2kbI3zi6BoPYFq52TXyXmRhrrStnzRjcjESctLS2cddb0egE+f7w0G+ISRhZJwuf1AGVYHUVAagjS6HklY2zsNZ63tzk1ZGWciWRN0lMsMVTnlY8S4stXEgyUZN4Mna35TGFDBV8+FkiMB0mS+OFntxBR4Wv/uz123OvX/vYBQ/5zeCQQ66k705mIB/Uo0BvNPf2nLMtbopV7M4aiKH3AKbQiCZ1lJIb8sorX6yUU0b64lXka4gNorNNCEO3+Or7924OxcNZ08dVfbOflvalOss/nRY1Etc3SbCx1cdax2HkwPui5byj+nLdfsjj15KR7cYn7zPGgrJjn8+76zWu8loU2x1BE96DI6xLzsXAV2nE77VpBRZSwKjHi9Sf09wmdvjgTMVBVwDuB54HNwMNAnyzLz8qy/KVoscRMzDP+FfBlWZarosoWn40emxZ6enqIoP3ZY41MyGXkhnjIq3NQ4tGXjo1yduYx6tYZ8XiGsUmasWzvNk8k9/ZPPsG8aXUdN70lNXSYnKdP9KBmn4Ey6hDqY9fNuOeBvRl/bb1QQJIis9pA6bz14kV84t3xbpw3mk4kVJg2nZy5PHCuMW4DFa2Se0RRlC8qirIFraT7ErQx7yuB+9EM1qPZWWpabgf2AweAncADwD3T9eKnu7pRkbBIakrlVz4xv6Y4odLo8LFU/bCZwDM0RIFF21G2dAyannPw8ORrcs6V55hWjUlJLpTRa5qNIT7jEMXRDFQ2RE51Ad58b9IdLzarhSvWN1Dm0j5jbxxrSahCPTaNBur+Jw7x0W8+k6KwnytMesuvKEpYluU2oAPoBE6gDTtZlKG1pXvd59GULPTffcAt0X/TzulOTa3YYcv/qpu7PnUJn/rO47R0BVFODOSEFMvQ8GDMQKULOx5rbgPGp/DtsnoZCcdTllvOSzP/KunPnlMer7upLs+NqcOZpNRdwGXr5uMqtNN2uAPSVJVnQ+RUvzmfKQZKp9RdQP+Ij+YTHVBWHjveP5Tdkn4jv3/6CAAv7j7JlRsap+11x8uEqvhkWXbLsnydLMvfl2X5ANAGfBcoQdPnO0tRlOVZWGfO0tXTD2A6xjvfsFok/vNjm7BJIYb8EvuPnh77SVnGO+LBYU1M2ifn6iOSeUK5sS5VdmpVvYWGWi3fduM1y1NGJeiUJEkWGUeuz62anYn82957Lv/89rOpqpheuS69xDxfVSQmS0WZZozbO3voMkiMtbRN//cuV6M/E6niexG4AOhDy0P9AE1RIhs9T3mDZqAqcRXOjqqb8rIy5peHOd5r48VXj3D20tqxnzRFxtJ8q5lTxX7DGMy1Z81JSNbPbZDpNFQA6lSVOWlOCgvW1c7htus2EQiGqSxN9YS+9OELeKOtn1WLEisylzdWUFZcwMqFlQnVfrORmqpyUNIn6jPtWYei7/+Z50FpoeJg2EJn+ym0rAkMDvumPXphNgstF5hIiO9CNI/pf4FngW2KouRm4HKaUFWVvoFhoBK30zHm+fnC8kVzON47gHJ8eoTpR9N8k1Cpn1cLx+K5j+TxFLtNjBNgWqpbP7cuwRtKZv2qOtabCLwWOe3c9x9XpFZPzELqairQimPN8XiDCRqOU2XEpxlDiwQOx+z5Ho2F/vkMq1YsVgdEo6fBsIXTp09TW5vdzeGpnnhxUa5GgCayFVwEfBWtpPuPaAURT8iy/DlZls+LauWdUXi93lhMvsg1eyq71q/VeqBO9kUYHs5+S9lYoqSNCxKHQKb7MpW6E29uZsKy5WWTD19ZrZas9QLlErU18eGK1eVOzkuaZ6WrfGSKwUHtM2a3SjOe85xOdOX7Vn89he64xx5SrTQ1NWX99b9+b1w2NXlsfa4wkSq+ZkVR/kdRlPcpilKD5lE9iVbJ9xzQLcvyA7IsfzxLa805rFYrkkX7kOXC0LlMsUauo8Cm4o8U8NL2PVl/vZCJCrmOhMrChsRChnSjLi45pz7h941nz005J13OSRCndk7cQF12/nwW1ycqpGS6UGLIo6mA2HI0D5It6gy5zI6euBJKBCt3PXQ6a8odOsbwd3LVaq4wabOpKMoeRVG+B7wVuAz4PXAF8MMMrS3nKSgo4LLLrwJml4GyWiRqK7T8zI7XDqKaDA/MJKONcXcWFlBRXppQGKFPuE0m2bNas7Qq5Zx0YzIEcYxyQ4FAIMVr9PoybKCGtZtzru7is8VoxTaBsIWf/jnzPWfpMBsQmgtM+K4qy3I9sB7YEP3vuWjR061oSuPPZ3B9OY2qqtz3mKb15ppFBgqgYW4lLZ0n6er30tTUxOLFJmoLGUL3oGoqXNisFk52xcOKlRVlSJJEgcMW27mn86CMBspZYKXCZAaP8KDGxhhmG/Z4cLkS/z9mWituaFgrq87VRH22WDq/POWYxSLFhnWq6vRp8mV7EzpZxr1lkWX5z9G+pxa0kvIVaGoSbwIqFUW5RlGUbyuKsn2068wmuvrjOajksuR8Rw8/eCNOdu7cmdXX0g2UZjwSvyj1dZoXZDRKBek8KLvxuITDbuWOf96YcI7woCaGxzOSMAYFwOvPbG2UZ0QzUA7H7KiEHS8Wi8THrl+dcMx4HwkFstsPJTfEDaTJAOucYCLfVgfwfTSvqUJRlGsVRfmuoig7FEWZvtnQOYSxSqzEPXuKJADWLNXyEEPhYhRFob9f6/fy+UPsPdoV613JBLrUjd1qSfmirFmlySwaQ6jOAvOdttGI6VGpc+U5rFocT0ALAzUxRkZGUsrqMx3i84z4AHCm2XjMZuZVx8N8xS5HQoVp36D2/2XPkS4eePaNjHs5ZYZ7Vt57UMA/KIpyp6IoryqKMq5Z0LIsp/qwswhj75PNmptJxsmyNDp2eiTspCtQyauvatM+7/rNLr74k608/GLmqox0D8pmk1JGfVSUagoOc6vjeZF5c8x7ZYwhPuPXzZizEiG+idHXN0AonLj/vOfBffzir6mTjSeL16e954WFsysKMR6MI+KXLihL0Hkc8kt4vV6+9NOt3PfoQQ4e783oaxv1/3LUPk3IQL0gy/LnZVkeU7I7Ktz6JeDvk19afpE8niHfMQ6wa/HNZ9eu1wgGg7yyX+uPef611oy9VqxIQo0w4kmc6+Qs0DYB9QajtGhuKZ/7h/P48j8ljlQ35jCMHp7RcM22UGy28fp8dPemaiA+9MKx2JgMnWAozP2PH+JYW/+o11RVlfufOMR7v/QYh1t6GYmq0TvPQANVavBiljdWcOu71lJRoh0LqzYOHI6LNmdaBzFhSGKOWqiJNup+DWiTZfll4Ak0gdZuNOWyamANWtn5RcAvo8+Z1Xz4upVs29fO5jWpJc35zifevZYf/mE3AIMjQbZt2xZ7LJMJbT3ENzjQR31BG0e9i3AWWNm8Zh5VZVqC3riztFotXHxOfYrApdFTSr55mp0jGBsVaD9lrjTvD4ZxGcJ/f37uKL9/5gi/f+YID9/1trTX3PNGV0wD7nu/eQ1nUDdQsytMPl5+/Lkt/G1nK2+/ZDGFDhu//PJV/NNXH+H0QJi9h5pj51ky3CMWDMa/I2qOJqEmMvJ9GLhNluVvAR8F3g+cA+h3qiDwOtrcqJvTTMCddVy/ZQnXb1ky08vIClesb+DJV5o5cqKfVt88/ufRJkCL2h483stbPvMXzltUwDsvnsfZZ5896df5w9+0m1UwGKDMPsg9H1/PvLmJXfTGwghb9KZoS8qNGD0lY+n6bKuwnF4kOnv6SZwJqhEIRjAW+B0dw3PSOdwS7++xWiT8sWb32acSPx4W1Jbw4aSRLxWlLk4PDHH42ElA+y74A5nN/RknTOeofZp4mbmiKKeAO4A7ZFm2AJVARFGU1FGngrxn0bwyjpzopy9knk7c1eSnp/05bq+tpbq62vSc0XijtY+9R7UdeiQUBDtUVaa+lrEAQs/3pRgouxVJSo2nV5fNPvXx6UKSLEj+XmBeymPGIXsAI+MsnjCGtYqcNvr7tTdMeLdxqipK4MQQh/rjGzVPhotTAkYPKkdDfFNKnCiKElEUpUsYp9nL+6+UxzynxTefJ5+ZXLpxeMQQplMjOBwOCgpSQz0Og8qA3qdjSWogLXBYTXOBb7l4MfKCcj72jsl7eWcqpaVlzHF0c815xdxyw5qEx5J39OOdKeQ2FBdZJVCjtyFRYRnHLFea6ZlNxhxUbpqnKRooweynvLiQ737iIs5aUJby2MVr57K0vgQVC9v3n6Sry1y0dTSMNyUJleLiYtPzbOOYt1XgsGI1qaZ0O+3c+amLuXZzVkeVzUpKy8qwSCquYCsLahPfG+MOHMbvQekDCgHK3FZ8EW1DUl3mSveUMw63K7UnbMiT4SKJhCq+yZmo3kEfh5szW11oRBgowZgsa6zgrk9dwvnL40MBL1s3n/dduYyLztF08jzhIv7+94l7UcbvhYqU3kCNY8RFgd2K7QwQc51OiotLsFgstLS0ICUpGySH+MZ7jzNqL0bCodgASeNE5zMds6nNR5tOpBx7Temk9fRQyvHxYKzcU8fVOJTKB+94ks/98MWsjakXBkowbm577zmsX1nLV27ewG3vPZf6OcUsivZxeCNO9u/fP2EvyniTi4xioMYT/ikssGGZZeX+M01xUSELFy5EVVU6TibeIJMN1GhebjiixsY7GAtYfP4AQVXzFuZUCA9K55Jz5qUM3Dx5qiuhT7Ctc4gv/2wbH//Os5N6DYMjO+Uy81f3NU/p+emY1LdZluVvy7Kc4oPKsrxIluXnpr4sQS5S6i7gSzet57xlcU9qUb0m5DoSKSKkWifsRRmHFdql0IQ9qNs/sj72s8Nm4R2XapqBV29snNA6BIl88cMXcN6yObzn8rNYtmwZAG8oBxPO8QeSDNQoXu73f/caN3/jGV54rS2hBWDQEwAkCuzSuLzkMwW3y8F/febShGNh1RJTdAHo6PYwFRI8qCkaqI7T2ZkCPNlPxPuA12RZjmVNZVn+NLCPSVQGCvKXYpeDsxaUE1HBpxaxf/9++vrGPybAb8hjlNv70xoofTdZnBSbNwqbSpLEO7cs5fufvoSPioKIKbFhVR1fuXkjxS4Hy5Ytw263097WknBOigc1ioF5flcbAI9tPU7Q4EENjWjXKCoUCh/JSJLEOWfFK2PDqpXBwXjT9FQLG4xGaSJl5i0dgzyz40TC891u8+/tVJmsMVmFNvJ9uyzLdwFbgLOATymK8j+ZWpwgP6gqc0JLH5Vz6vF3H6S5uZny8vGpXOmJ2gKbSqltKK2Bcrsc/OorV1GYpMOX3JBrsUgp84sEU8PtdnPjjTfy29/+DgzpjsAEDJSOqia+Zz0eFZAoMSkKEMDnb1zHX/9+jN8+pRBKNlBTbF5SJ+lB3XqnFiQrMzTPl5RkJ384KQ9KUZRB4Ca0ybr/DpwPvE8YpzMTXXTyeJ+LrkAlra3jl0HSb3J1bk0YM52BAu0Lkdwrk0nRWkF66uvrufnmf0o4lqxqPt4y8fsejYcKwxHNA64sN9dXPNNxO+28ed0CINWDmupH37i3m0yI72hLZ+xnuyM7MlWTzUGdC2wHrgNuAe4DHpFl+W5ZltNP4RLMSkqjO6n2vhAtvvkoTSfH/dxAVOYoHNKSv6MZKDNqK8XHbbooK0v0TPU5TjrGwYbpbnjJYUGdTatTG4EFGiVu7eYfVB3sPmbURcycB9XSklohOBYDg/HKvWz1+U42xLcDeAx4h6IoJwFkWf4d8HPgBmBBZpYnyAeMOnkAp3pGGBkZweUauypL96BCQT8UTNxALZpXyr9/cB3zqsUOfLrRx2ToSAYDFY6opgr/oTQaG+hKqQAAIABJREFUieL9S48xavDsIbglGMZht07ZgzIaqN4J5I11BgfiBiqSpUjGZIskPqQoylt14wSgKMqzwNnAAxlZmSBv2LCqDqOOpT/iGHeYT/egJCI4nU5stonvmTatnktDUkmuIPt4RpIaRw33qGDI3BAFg+lEfEWRxGgUu+LfC70heqqVd0aj4vcHJvz8AUNFYbZC7ZPNQd2f5viIoiifntqSBPlGqbuAe//jCuaUaw2X/kgBJ06YhwxUVaVnIB4a0hPmo6lICHIHY2/OiC/xpma8YaY1UCHzEJ9TCPqOygevXhb7eSSa+5tsc62O0ab4/GOrVAyPBNh58FTs9/7BeMVMcsFMppjUp0KW5S5GCYAqijJn0isS5CWVpU7+4erl3P2b10b1oL57/y5e3H2SFQsr+NYtm2M7L81ACS8o1/nuJy/iG/c8westYbzJBsrwczpDFEw3BkUYqFG5YuMi/vehVxkJFzIw5GVulRt1Cjmo5JDceDyo//jZNo62Grwmw3uZLrc4VSb7qfisyXUWAx9Cq+oTnIHUVmgFC/5IAe3txwiFQgkhu3A4wou7tajwweO9HG8fTPiiCA8q9yl02JhXVcjrLR58/iTtvXGE+JL1++LXFSG+0ZAkCYdNYiQMPb0DsLB6Sjmo5PCgPzC2gTIaJ9CkyXTWr6xNPj0jTMpAKYryS7PjsizvBD6FNqxQcIZRW6kVRQQpJBwO097ezoIF8XqZYW9iWbI/EI4ZKEkSIb58wV1UCHjwBRMNlHFHP9EQX4EYtTEmhQ4L+KG3XwutTSUHlWzcQsFQyoZyLHQDVVFSyKrFVZNey2hkWltkD7B+zLMEs5Ky4gIKHFaCEQsh1cqJEycIR+I5p/ZTiVNZBj3epBCfMFD5QHGRlmsMBCIMegJs39+BqqoJpcbpqvWMOnw62pgUIfI7Fnqerm9AkziabKMtmGnvSQwPD0/oGqoancuWxTEpk81BrTA5XAp8CTg6pRUJ8hZJkqitcNFyaiiWh9r+u9d4flcb377lQh557Cn0ibwAbe1dsWZBCRHiyxeK3ZqnHAiFufP+V3n9SBcfvi5xImw6D8oMUSAxPoqcdiDEwNAIAGGDsY+o2myt8ZKsQqECHo8npddt1GtI0TleE3nhCTLZT8Z+tL8peWWtaHkowRnK3Gp31EAV0NrayountZvZvQ9uI9TXh9FAnTzVTcRRAWgeVEmJKJLIB0qKtVxjMKTy+hFNvf7Pz7/Bgpr4+6cbqL4hH/1DqRViDilAQNUaUJ0ivDcuilwFQIjBYa3/zFjaHYmoE/JCzdTLPZ704rNmZeSOgiLwg92WvfzhZD8ZC5N+V4EAcFpRFKE9cwYzt0q7eTV5GymyHogd7+rqptSe+HHr7O6nolY3WCLEly+U6gYqrOKwWQiEIgwMB1Br4l/9h19q4u7f7KKzz5sy+RjAIkViRRXJ+ooCc0qiub/haP+ZsYpuouMyku2NOkaIzyx3eGJQ+xyUFadOwM4U4zZQacJ6yVTIsoyiJOnyZ5moqvo9wGqgCbhJUZSd07kGgcaqxVU88JwW5R0IGTwiycKyFWfT9Gq8+7ynb4iSau1LZpGgqEjIFuUDWpEERFQLNqsl1mxtvEe+vKc99rOZyoCF+A0vWV9RYE5psQvowePVKu5CSR7URDDLWY3qQZnkDnUqS1OHK2aKiXwy0oX1dPTHVGDatkSyLDuAvwDfBy4G3gk8JctyQ1TUVjCNnL+8hiXzyzja2o+zvAE6tJtX46KlVNdUAwMUOe14vEHaRipo263dyAoLC8SwwTyhIFoSHkFKUBCZ6DV0pSSRgxof5aWaHJQ3Wt6f4EFN0ECZnT+agUpX9AJw4zXj8V0mx0TuCP8CrEUL75n9W2T473RyKWBXFOX7iqIEFUX5HXAAeM80r0MQ5e0Xa0MDj5yKf6iHvaFY30x1mTPlOS5n6jFBblJgjxoo1ZJgoCZSSeZ2xXfdIsQ3PjQPCgIhlUAgkJiDmmIVn4o0KQM1t6qIipLc8KC+B8iKorTKshwGahVFmdh87+ywAjiUdOwwmi6gYAbQ+6GM34FBTyC286sud9LckejculzZ+5ALMkvMQGFl2BvvhZrIPbKs2EVrr1aNJkJ840Or4tPGbgwNDSWU7E88xJd6bPQclLmBymb+CSZmoDqAe2RZ3oEWyvucLMumf5GiKF/NxOLGiRsYSTo2AowtpS3ICmYjMIYMBqpKeFB5jTUDo9krykugRTdQwoMaD3ooNIyFgYGBjIb4VHVyHlQuGagPArcD16LlmS4HQibnqcB0GigPkHx3cwET6zoTZIySIgfOAlvMIIGmIvH0Dk1A1izE53aL/US+M5EQnx6uAnDYhYEaD65C7XYdiQ4uDEfiQwKnGuKDsXJQ5tfXh5Vmi3EbKEVRXgKuAJBl+TjwZkVRekZ/1rRwEEhWUF8G/N8MrEWA1rBbV1lEU/uA6eMlRakf6qJxzI4S5DYTuUUWGLym8YyKFxg8KNXC4OAgoXBF7LGJjrsws2cjIyNEIhHTYqVQ2hBfdkPzk9XiS+6DmkmeAyRZlj8N/Aitim818OCMruoMp6bSFTNQyd5UQ21qv5O7SBiofMJhkwiEUpppxv98g9ckZI7GRzzEp3tQ8ab3qYb4bHYtv+XxeEz7EWcqxJf3WxdFUQLA1WiGqRf4IvD2HCngOGMx5qHuuHkj8oL4l8lsuKAI8eUXb91Yk3JsIuMf7AavSZpsrfoZRjzEZ2FwcGhKjbrJ4Vi7XQsXpgvzpTNQJS6H6fFMMSvKZxRF2Q9snul1COIYx8Avayznzk9dzOPbmqksKTTNObjdokk3nzCrupzIPdJuEBg1U5oQpGK3aaK64YiF/oFBIlWTr+JLNmh2uwP8EzdQdnt2fZxZYaAEuYdxAJ2+Q756Y2Pa812Fosw8n3C7UgtdJnKLTDBQwj6NG2eBjWFvkL5BD0Xlmavis9nt4E9fap6uSMKe5fzhpK4uy/KzsiynyN7Kslwty/KuqS9LkO9sXjOXYpeDN50/f1znZ6J0WTB9mPatTcCFMhooEeIbP65CLVc0POJP0MebapGEzRbPQZmRrg/KnsVRGzAxLb5L0ZpiAS4B/tmkD2o52mRdwRlOscvBL798JbZxSvELA5VfOAtTcw8TuUXaDArYIsQ3foyl5sYx7VMN8XlDFuxMPMSX7RaBiYT4etBGvUvRf7cCRolbFa336DMZW50gr5nI7kpUcuUXZqXhk85Bibd+3BhLzb3e+BiTCfdBJRm0I+1Bzi+ZRA4qVzwoRVH2EdXZk2X5OeB6RVH6srUwwZmF2EXnF6Y3pkkaKBHiGz+6BxVWrfT2D6BnaabqQemkzUFFQ3w1hQO4pR6OeTXJ1Wz3sE22D2qL2fGosvh5iqJsm9KqBGccwoPKL8yS4xPZxYsy88mhe1CqZGVoaBjQWjYi4x9gDJAQHtSJqBJ9g8mqcRp6jiscDmG1x18sl0J8MWRZ3gD8FC0nlfxJVSd7XcGZi/Cg8gubiQc12kiGZIwjNsRbP370Iom6eQ10Ng3FjuubgxFfkP/5y362nDefs5dUmV4jEAzTekproi+x+xgMagUvBz0yvmOFvLfPS3V5YpWmfn0JFVehI6Z+mjMhviR+AHQB7wV+CdwMzEdrkv2nzCxNcCZRUpTdhj9BZjG7MY021E7nw9etYNATYKmhcVt4UONHN+xz6xvY3RSfWP2rxw9RWVqIxSLx/K42nt5xgofvepvpNW773vO0ntZCeRaLhNtpZ9gbxBfRDNXuI51cvr6Bg8d72L7/FP94zfLYeyuhagMre7Vr5aqBWg2sVxRlryzLt6GNev+tLMudwG3AHzO2QsGs52sf2yRGLuQZZiG+4Dg8qOu3LI39fP7yGl49dJoNq+oyurbZjG6gXj86wHDYHTt+oGn8sqi6cQKwWC04bBbwxh/3+rTiiy/86CVAkzOKbSIkcBfFvauc7INCUzHXB/ocQRtkCJou3sqpLkow+/nQtSuw2yzc+q61rFlaPdPLEUwQs5BseAIhPoDbP7KeP3zj2pRwkiA9epHEG639Y547HnV5q8WC3ZaYR/Loo46jNJ0ciBVhSKgUG2TJsu1BTfbq24GPy7JsAfagaeEBrAJSs28CQRLvfNNSHvjWdVy5oWGmlyKYBGZhuXQ5qIoSc0FRSZLEuPcJMpH/X0aB5s6+EYZHUm/NVosFR5Jcke5B6QwM+wlHqzAkVIoNws7Z7l+c7Kfj34HHgE7gF8AXZFluAmqAn2dobYJZjsg95C8Wk/cuXanzRFUOBOnRPajx0N7lYcn8MoZGAnzka08DpOSlrNZUD8rYXwUwOBIwvLcqFWVuIPGcbDEp86coyk6gEfhltBfqPOBO4CZSZzMJBIJZhsnIoLSG6KI18wBYnaaqTDB+JuJBffr7LwBwuse8dByiHlRSmG4kxYMKGEJ8UFri5p5/u4xffPHyca9lskzav1YUxSPLcoMsy5uBp4DHgWZFUcR2SSCY5Zh5v+kM1JsvWMAl59XTWJs6ZkUwMfQy84kwmuK43ZbqQfmSeqQGh/2x91aSVNxuN/Oq3UwHkxWLLZFl+TH+f3v3HmVXWd5x/Hty5p5JCIEAITHhUvLEcDEoIARBsSIqKgqIl4KiEVExpCp0CbYIKKAiXpbagquWKl00LVUUwVIvQBdq24UXiBjz2MCSIJAAApUkkMvM6R/vPjP7nLPPXM7M2ZeZ32etWZnz7r3PvG/2zHn28+53vy/cTxixtzfwBeBeM1s4ifUTkRxK6uJrFqDK5RksXTy3ZoZ7aU0r9+zi56p+IEtHZ7khgFUDVHUAxI5dg8MBigozZ6a3NE6rd7iuAbqBhQwPUDwf+D/gi5NQLxHJsaTbh83uQelW4+RpZdRc/Lw8v2OgZltXR7mhi2/79p1A7f2u+Gzm/f3pZE/QeoA6GbjQ3R+tFrj7RmAV8MrJqJiI5Nd4pqZKyrakNQv36uekoxdzzpsO4XvXnMLxhy+o2X7x2w5oOGagJkDtqtnW2dnBnFm1S6c8u2UrlUql5sHr6nFpZ1Ct5tz91DzaNaTMFFhGXkRGNp4RmJpncfKUSiU+9JblQ6/jz6P193ZysC0GHqw5ZiA2UV99BtXd2cGec2oD1I6dA2zatKnmwevnng/dft1dncxIGiHTJq3+pNuBS82seseuYmbzCCP5fjgpNROR3BpPUqTHCdonnp2WyyVmz64diDIwMFibQW2vzaC6ujqYN6f2QekKJTZs2DA0gznAI4+Hef+6u9OdkqzVALWKMPfeH4E+4EfARmA3YPXkVE1E8mo8k/tqIuD2iWen5YTMZvvOgbquuroMqquT/r7GoLNhwwM1ge2BR8P0SD09yQ9dt0ury21sBlaY2QmEGc07gN8CP9Qwc5Gpbzz3lXQPqn3iwb+csHr1jp2DNV1823c2BqiOhMD20MaHgd0bynu7cxqgzGxZQvHm6KvqhWaGu6+bcM1EJLfGl0G1sSLTXE0XX8I52VGXQdUPM+/qLDccN3PmTAZr49iQnp50u/jGk0HdT1jrKd6a+mypFJW1dxUrEcnUeO4rKYNqnxmjdPH9dO0j/MP3hvOF+vkSO8ozGjKv2bNnMfhU8jnr7e1JLG+X8QSo/etelwhB63XAQ5NWIxHJvfHcVtI9qPYZrYsvHpwAdu2qzSk6OmY0BLbZs2az5anktLe3J6cByt0bgpCZVYA/JG0TkamrVCpRKsFYVnnXKL72Ga2Lr96uurXhyzNKDYGtt6+XXb19sIUGaWdQ6h0WkZY0Czyr33o4Z7xqydBrZVDtU5tBjf5xHh86DmFmivrAVqLECxbtl3h8Z2cxhpmLyDTX7N7S8iXzeMdJS2P7pVWj6Sf+fzumDCrhHlRHXWArlWDfBclTqvb0pTfNEShAiUiLmn0elkqaPSIttYMkwvd7zmm+QvGugdo+2XJ5RmKGO3/fBQ1lAGkv7TWeYeYfbHL8mWb2ZLzQ3f92ohUTkXwba9dd/XIOMnni56CaCV31wWM558ofJe5fn0F1lksNGVSlAh0dyc877dyVvGpyu4xnFN+FCWWbgHfXlVUABSiRKa7ZPahq+Tc/cRK7BiotzcAtY1OOnYNqsNpnj5kct3wBd9/7SMP+9QGqXG68BzVYqbBzIPlBqNwGKHevH2YuItNY0y6+6N/dZ6c74ms6imdQ3Z3DmWqzi4JHHn2s5vXyJfMSl0mpH45eNX+P9GYyB92DEpEWNe3i0+2n1MTPQfyCoFmAWrdufc3r3Wf1NDwHNVipNGRaVcccOr/VqrZEAUpEWtK0i08RKjXxkZRz4wGqyZDzx3bs01DWUfccVGWweVde2o8MKECJSEuafVjpudz0xM/B3NnDAxs6xnHfr/48VqjUrAWVpVYXLMyMmX0YeLm7vylWtgj4OnA08Diwyt2/n1EVRaYFjSTPXu2ChcMP0Y5nYErSKL76B3qzUpgMysz6zexq4JqEzWuAtcAewDnAGjNrXPtYRCbNaKP4pP3iXXzdXcODJB57cuuY3yNpFF/1HtTSxY1LbqSpMAEKuI0wYe118UIzWwIcAVzi7jvc/Q7gFmBl+lUUmT7UxZe9ZqP4nn52e0vvAUBl+B7Uny2cM7EKTlBuApSZdZnZPglfe0e7vN3dT6d2/SkICyZudPf4JcN64NA06i0yXTWLQ4pP6YkPcOjqHP44P/vkpOX7al189pFAY8Ybz6A6OmZw/hnLAVgV/ZumPN2DWgHcmVA+AHS4+6NNjusHttWVbSMsRS8i7dIsVVIKlZq+7s6h77u7hj/ObZSuud7uDo45dN/EbZV4gCrP4MSXLuZlyxfQ251+uMhNgHL3u2jt4msrUD/5VB+Jk8WLyGRRBpW93p7hj/B4BjXafcCRhotXKgw9vFvdL4vgBDnq4puAdcAiM4sHqaVRuYikTAlUemb2xDKozuZzHu4+q3ZuvZFGYNYEqIxPZuEDlLs7cB9whZl1m9kJwCnAjdnWTGRqS3lia0nQF8ugmgWomT0dXH/JSTVlz27b2fQ9BysVBuoyqKzkpotvgk4DvkZ4BupJYKW7359tlUSmuCbL6WqYeXr64hlUV5MMqlQa9/Ing5VqgGq5apOicAHK3S9NKHsYeG36tRGZvpplUApP6entHg5K9Q/cVo33fAxWKrnp4itcgBKRfKg0W71OESo1M3s7OXzJPHp7OkZ4cHp871kZHO7iy3rhSQUoEWlJ0/ikLr7UlEolLj93xaS+Z6US7+LTIAkRKaQm96BSroWMZvQzEr+mqJCfLj4FKBFpSfMMKt16yMjiz0dV1a/rFA9E8WHmWXfxKUCJSEuaf3QpQuVBf28Y4ffywxc2bFtRF6Di3bKDlcrQxUfWXXy6ByUiLdFMR/n2qfev4OfrN3P6CQc1bCs3jPgbToeTZpLIigKUiLSk+Yq6kgcHLpzDgU1mI69fRXcw1l87MDDIjl0DQPb3oBSgRKQlTT+6lELlXrnuCdz4/cT1Dz3N+oeeBrLPoHQPSkRaUmq2HlTK9ZAWjPEkKUCJSCE16/5RApV/Y+26y7qLTwFKRFrSfJCEIlTejfUUKYMSkUJSICqu0hj7+BSgRKSQkj66FLOKYcwZlLr4RKSIkjIoxadiGGvg0UwSIlJIiZ9xSqGKQfegRGQqUwZVXHNn94xpP3XxiUghJV1cK4EqhhfsPWtM+2W9oq4ClIi0JHkUnyJU3h164J4NZUcu2ztxX3XxiUghJcUnZVD5V0lYx+vCM4/g7JOXNZSri09ECkn3oIqpkrCOV293B0cdvE9DuTIoESmkxM8upVCFlRSMFKBEpJDOffNhzCjBccsXDJUpPhVX0rlTF5+IFNLS/eby7c++kZOP3X+oTPGpuJKmP1IGJSKFVZ5RqrnKHky4vyH5snCv/sTypGQp65kktGChiExI/FmZHTsHsquIjOgrF5zAj+7ZyFtPtMTtSd15AxlfcShAiciEZN0NJGOzeP5sVr7xkOY7JJzGrC84FKBEZELiV9mrzlieYU1kIuIZ1LtffzAPb36WpYvnZlgjBSgRmaCtz+0c+v7VL12cYU1kIuI9fK87dj96urIPD9nXQEQK7ZAD92S/+bN5se2VdVVkAuIPXnd2lDOsyTAFKBGZkO7OMl++4ISsqyETVIlNMZH16L0qDTMXEREGB7OuQSMFKBERYSCHEUoBSkREhhYx3K2/K+OaDCvMPSgzWw2sBvYAHPiou98dbVsEfB04GngcWOXu38+qriIiRdPVWeZfrzyZjnJ+8pb81GQEZnYq8FfA64Hdgb8DbjWzedEua4C1hOB1DrDGzA7Ioq4iIkXV291BZ0d+wkJ+ajKy+cCV7r7O3Qfd/XpgADjUzJYARwCXuPsOd78DuAVYmWF9RURkgnLTxWdmXUDSY8sVd/9q3b7HA/3Ab4BjgI3uvjW2y3rgqHbVVURE2i9PGdQK4LGEr0fiO5nZIcC/AH/t7psJgWpb3XttA/raXWEREWmf3GRQ7n4XoywnY2avB24APu3un42KtwK9dbv2AVsmu44iIpKePGVQI4pG8f0z8F53/0xs0zpgkZnFg9TSqFxERAqqEAHKzM4ArgRe5e7fim9zdwfuA64ws24zOwE4Bbgx/ZqKiMhkyU0X3yg+BnQDPzarWWzrbe5+K3Aa8DXCM1BPAivd/f4xvncZYNOmTZNXWxERGZPYZ2/DDLWl+ASB05GZvQy4O+t6iIhMc8e5+0/iBUXJoNrpHuA4wohBrVctIpKuMuFZ13vqN0z7DEpERPKpEIMkRERk+lGAEhGRXFKAEhGRXFKAEhGRXFKAEhGRXFKAEhGRXFKAEhGRXFKAEhGRXNJMEhNgZi8CrgUOAx4E3uPuDU9D55GZvQe4DtgeKz6PMGP8V4DTCTNrfN7dr4odV524dz7wn8DZ7v54tG0R8HXgaMK8iKvc/fvRthLwSeB9QBdwPXChu+9qYzOHmNlRwK3uvlf0uiuLdkaTGX8JOJAwyfFZ7v5Aiu3uBp4FdsR2+5m7v3oqtNvMTgQ+DRwU1fFqd79uqp/vEdpd6POtDKpF0S/8dwmLJ84BrgB+YGazM63Y2L0YuMbd+2Nf3wAuA4zwi3Uk8C4zeyeAmS0j/MKeDewB/C+wJvaea4C10bZzgDVmdkC07X3AqdHPPSh674vb2sJQ55KZvRf4AeEPqSr1dprZnsB3op89B7gZ+A8zm/S/wxHafSjwVN15r35YFbrdZvYC4FvAp6Kf83bgKjM7iSl8vkdpd6HPtwJU614BdLr7F919p7uvISxB/9ZsqzVmLwHuTSh/F3CFuz/t7r8HPgecG207E/ieu//E3Z8HLgKONbODzGwJcARwibvvcPc7gFuAlbH3/aK7/8HdnwAujb1vO10GfIDwxxuXRTtPBX7j7t+KfmeuJszS/+eT3+ym7W523qH47d4PuNHdb3b3wag34y7gWKb2+R6p3YU+3wpQrVsG/LaubD3hiiXXzKxM6JY8y8weNbMNZvYxM9udkOrHF3uMt2lZfJu7bwMejrYvAza6+9axHBtt29fM5k5eyxJd6+4vAX5eLTCzOWTTzvptAE57fmca2h15MbCXma01s81mdpOZLUiqe9Ha7e53u/v7q6+jn30c8Cum8Pkepd2FPt8KUK3rB7bVlW0jLDefd/MIH1zfAPYn9Mt/AFgVbY+3K96mkdo82v9H/fbq9239/3L3RxOK++vqUP2+3e1M7XemSbsBtgI/JVzNGvAcoQuGUepXiHZXmdluhCv+/wF+UVen+p8/Vdv9XQp+vjVIonVbgd66sj5gSwZ1GRd33wS8PFZ0r5l9GXht9DrernibRmpzaYRtScdWf1mz+P+qXhWm3c6tNP6Rpvo74+4fib82s48AT0T3MaZEu6Puqe8SruL/IlavKX2+69vt7oNAoc+3MqjWrSNckcQtpTG1zR0zO9jMLqsr7gKeBzZR2654m2rabGZ9wKKofB2wyMx6x3JstO0xd39mYq0ZP3d/mmzamfnvjJldbmYvjBVVB1A8zxRot5kdT8gevgOc7u7PT4fzndTuqLzQ51sZVOvuBEpm9mHC8NXTCPd1bh7xqHx4Bviomf2BMIrncOB84EOEgR6fMLO1hFT9AsJwUYAbgZ+Y2SuA/wKuAn7l7r8DMLP7gCvM7CJgBXAKcEx07A3ABWb2Y8IV1qVRWVZuIP123gx8NhraezOwGhgk3NBOy2HAEWb2juj1l4Db3P0JMyt0u83sQOBW4OPu/uW6zVP2fI/S7kKfb2VQLXL3HYQusdOAp4CPA2+KRrTkmrs/AryRMOrmT4Qhqp90938DLgHuJwSqe6Jt10bH/Rp4T/T6SeBg4C2xtz4NeCHhmYm/B1a6+/3RtmuBm4CfEYazrot+VlZSb2f0fMkbCKOlniLc+3tD9LuUlpXA08AG4PeE52POiupX9HafB8wiDLHeEvv6DFP7fI/U7kKfb62oKyIiuaQMSkREckkBSkREckkBSkREckkBSkREckkBSkREckkBSkREckkP6oq0iZn9I2HW52YuIzy8eCcwy91TmfIomiz4p8A7qw9lNtlvBvDfhLV8PI26icQpgxJpn9WEWbTnE5ZnATgqVvY5woOO8xmeHzAN5wP3jRScAKK53C4neqBVJG16UFckBWZ2CPBrYP9oPaKs6tEDbAReGZsVYLRjHiDMInBXO+smUk9dfCIZiuZBG+riM7MKYUXUiwgTbv6csLDchYQpav4EXOTuN0THzwKuIUwnUwHuAFaPsNzG24Bn4sHJzP6GsELqPMIaZxe7+7/HjqnOp3bXJDRZZMzUxSeSP58G/hI4mjC79C8JgelI4NvAdWZWXdPqa4RAdhJhCZUKYXntZhefJwO3V1+Y2Zujn3UmYcbp24CbzGx27JjbgVeN8J4ibaEAJZI/X3X3O939XsIs1VsIWY0Dnyesw7O/mR1AyIje4e73RFnRWYQlwF+VbrhSAAABs0lEQVTT5L2PIEyYWrUfsB14KOp6vJywZPfO2D7rCDOAL52U1omMka6IRPJnQ+z7bcDv3b16s/j56N9uYHH0vZvVLL/TR8iqbk14770JM1dX/RNhpOGDZvYLwmqs17v7c7F9/hj9u9c42yEyIcqgRPJnZ93rwSb7dUT7Hg4sj30tAa5vcswgYbVUAKLlYV5CyLh+BpwNrI0GdVRVPycGxtwCkUmgACVSXL8FOoGZ7r7B3TcAjwFXE4JUkk2EwRAAmNmpwLnu/gN3X03IvJ4FXhc7Zl7sWJHUqItPpKDc3c3sFuCbZnYe8ARwBWFwxfomh/0CeFHsdRm42sw2E0YMHg3sE31f9SKGF70TSY0yKJFiexchmHyHsFLsbsCJ7v5Mk/1vI4z2A8DdbwI+Qci6fgd8CviQu98RO+Z44HZ3VxefpEoP6opMI2bWR1j6+zXu/ssx7D8DeIgwUvDuNldPpIYyKJFpxN23EbKl88Z4yCnAgwpOkgUFKJHp5wvAYVY3Nr1elD19HHh/KrUSqaMuPhERySVlUCIikksKUCIikksKUCIikksKUCIikksKUCIikkv/D92jIUCTNoX7AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_Q_out(Q_frame, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Try starting the model with a different set of parameters and see if it moves toward the parameters in the paper.\n", - "\n", - "I found that no matter where I start, `leastsq` doesn't move far, which suggests that it is not able to optimize the parameters effectively." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Notes\n", - "\n", - "Notes on working with degC.\n", - "\n", - "Usually I construct a `Quantity` object by multiplying a number and a unit. With degC, that doesn't work; you get\n", - "\n", - "```\n", - "OffsetUnitCalculusError: Ambiguous operation with offset unit (degC).\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [], - "source": [ - "#16.11 * C " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The problem is that it doesn't know whether you want a temperature measurement or a temperature difference.\n", - "\n", - "You can create a temperature measurement like this." - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "16.11 degC" - ], - "text/latex": [ - "$16.11\\ \\mathrm{degC}$" - ], - "text/plain": [ - "16.11 " - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T = Quantity(16.11, degC)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you convert to Kelvin, it does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "289.26 kelvin" - ], - "text/latex": [ - "$289.26\\ \\mathrm{kelvin}$" - ], - "text/plain": [ - "289.26 " - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T.to(K)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you subtract temperatures, the results is a temperature difference, indicated by the units." - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "16.11 delta_degC" - ], - "text/latex": [ - "$16.11\\ \\mathrm{delta_degC}$" - ], - "text/plain": [ - "16.11 " - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff = T - 273.15 * K" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you convert a temperature difference to Kelvin, it does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "16.11 kelvin" - ], - "text/latex": [ - "$16.11\\ \\mathrm{kelvin}$" - ], - "text/plain": [ - "16.11 " - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "diff.to(K)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/soln/yoyo_soln.ipynb b/soln/yoyo_soln.ipynb deleted file mode 100644 index 2c0f1a30..00000000 --- a/soln/yoyo_soln.ipynb +++ /dev/null @@ -1,1168 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Case study\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Yo-yo\n", - "\n", - "Suppose you are holding a yo-yo with a length of string wound around its axle, and you drop it while holding the end of the string stationary. As gravity accelerates the yo-yo downward, tension in the string exerts a force upward. Since this force acts on a point offset from the center of mass, it exerts a torque that causes the yo-yo to spin.\n", - "\n", - "![](diagrams/yoyo.png)\n", - "\n", - "This figure shows the forces on the yo-yo and the resulting torque. The outer shaded area shows the body of the yo-yo. The inner shaded area shows the rolled up string, the radius of which changes as the yo-yo unrolls.\n", - "\n", - "In this model, we can't figure out the linear and angular acceleration independently; we have to solve a system of equations:\n", - "\n", - "$\\sum F = m a $\n", - "\n", - "$\\sum \\tau = I \\alpha$\n", - "\n", - "where the summations indicate that we are adding up forces and torques.\n", - "\n", - "As in the previous examples, linear and angular velocity are related because of the way the string unrolls:\n", - "\n", - "$\\frac{dy}{dt} = -r \\frac{d \\theta}{dt} $\n", - "\n", - "In this example, the linear and angular accelerations have opposite sign. As the yo-yo rotates counter-clockwise, $\\theta$ increases and $y$, which is the length of the rolled part of the string, decreases.\n", - "\n", - "Taking the derivative of both sides yields a similar relationship between linear and angular acceleration:\n", - "\n", - "$\\frac{d^2 y}{dt^2} = -r \\frac{d^2 \\theta}{dt^2} $\n", - "\n", - "Which we can write more concisely:\n", - "\n", - "$ a = -r \\alpha $\n", - "\n", - "This relationship is not a general law of nature; it is specific to scenarios like this where there is rolling without stretching or slipping.\n", - "\n", - "Because of the way we've set up the problem, $y$ actually has two meanings: it represents the length of the rolled string and the height of the yo-yo, which decreases as the yo-yo falls. Similarly, $a$ represents acceleration in the length of the rolled string and the height of the yo-yo.\n", - "\n", - "We can compute the acceleration of the yo-yo by adding up the linear forces:\n", - "\n", - "$\\sum F = T - mg = ma $\n", - "\n", - "Where $T$ is positive because the tension force points up, and $mg$ is negative because gravity points down.\n", - "\n", - "Because gravity acts on the center of mass, it creates no torque, so the only torque is due to tension:\n", - "\n", - "$\\sum \\tau = T r = I \\alpha $\n", - "\n", - "Positive (upward) tension yields positive (counter-clockwise) angular acceleration.\n", - "\n", - "Now we have three equations in three unknowns, $T$, $a$, and $\\alpha$, with $I$, $m$, $g$, and $r$ as known parameters. It is simple enough to solve these equations by hand, but we can also get SymPy to do it for us.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy import init_printing, symbols, Eq, solve\n", - "\n", - "init_printing()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "T, a, alpha, I, m, g, r = symbols('T a alpha I m g r')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAE4AAAAJCAYAAACc9xrJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB7klEQVRIDdWWi00CQRRFWUMBJlYgdkCkA+wAtQKwA40VGOgArcBPB2gFRDqQDgh0gOcMM7DAQoIx0X3Jm5n3G+a+vbNLNp/PK0myLKuxvkNn6DH6hd6jp+TpK7WArwuASQRxxvwKrvdNUOQ18dXRBtpGz6PNVKlQ03MIim3yFK3lfJ+LvEVO8hfN5Hko8w/RftFev+3jTBJCEjTT3qwlxhJvtFvGkW6cB6zFk/za0xCLCWmTjnZSkvroINllncFg00Iz8hjEhoaHx3yL2geZlhplnazMk6uuXSWgyBaLXjRyIgtt3p8J18ZzfRx4gDbgRtZQ7/ll3IP2hoyxvYbKCTUz8sfWxt+17iZEGfCvrjWGfim7xixsD2wwdNi8Mirn38KWcBCTMMYDcZLfGWmhLItxV2NnbVJ4QlZEkW1WbvpTfG1mH3881KwF9hs+3cv9KT+P7sGW31TsQ84xyztZX6A7saeras3QISfXrBPd7f6IzaV2oRDza/yvxGbQPM/ku2qXzMh7Kwhe4Xss8AfXkZuz8u56n4PwYx0WviRToxrkpfUiqTyj4GXPmkSM+mSc70LxBmFtL/Q/LzzbY0ZDLDLpCU2ss5E21OunT7atXow4yiTgE4eyZB54ApuI+fEQ6wRfzyR84aOI7X+9QvkGjRGdEcRjQZEAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle a = - \\alpha r$" - ], - "text/plain": [ - "a = -α⋅r" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq1 = Eq(a, -r * alpha)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH4AAAASCAYAAACdFWqpAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADqUlEQVRoBe2ai1HcMBCGfTcUkIQKIB0woQPogJAKAh3ApIIM1wHQAUkHQAUEOuA6CLiDy/8pWkfWyXfc2PFjxjujk7RaeV/a1dowWSwW2WQy2c2y7FktV/vle3XZET+COzXWAGj31Gbaew5ihOFZYOIdf4HosSN1IF6FfhH+Y6ia8JeaPwp/FeLH8XAssOVF3ZUTP4di+yzwTribEO/Hj+rnCfyIGogFpnIwafs2Ie+Bx6XWOBBcCSMM1AJT5K5I2YdeJ+73GJ60x+78eG2cD8AC7o5PyVl1v6do28RJLgpODiXFKMCVc6qD6A6q1slUjClCrfi0InVfuAfRznym+6L5bzXwl8KnDrmW2gPJZXITWGRW9PymtmPB1oiOehgRX2piAvOFGsYorXU5lzwUobcmg8ZLckLDOnS+nQX0GJLFM7WDAM/BeLX5ql50yECNs0l7kx31TA4tBTU1l7O756PpPz8IV1tHK+70rBKsut9LhG1NdMpxDg57bzxljLnwTF0dojH1yoNf51Dkopn5Od0HP94WPoxu8ByKtaB9lkXW0m5CINnh/0PtHL2CvdRSLzZvSscqx6+6302Gyt4rcV9JkF74KoWf0ksOe63fO9HkRuONwNScOOcZnj+ONz1sCwcD+P63K36hs2cUyJYHZBKcH79FEYS8Phs0o6MMtZTKxYF085xa6wInWXAYKfok5K85GWBJTuHIDiIt6yYcBkzRo29xJcT72piLPzIU1xg8BRwEBnuxDMLV0nEp4hUtRErq5AndGXzynOOorIpU8KnsQfT8DLWQvuDQ1+HJFjJyHtKEY60TmezZBIjS0neScDM8NafFMjs+2hvj2V5Lx1S0n+ihnLKj+JR1NUcWZIr5V8kpPNHjCiDbozmGRa+iqGNNYF8hGXPoW9dbPE22Em/hufP5QqrO2SAs+mrpOOWJEdjJjKMrImt16mRRZOAYBxpjFKAkp6fBkPGHJ4ueEr3oyCaG47WwlBG09t9BPHMxQYZQPwKQK84KvX3RuXETOm7pwfyRhvQFU5oVQPfCw8i996rvDDCMZCG1Xainat9WQzZSKEYLAR3AmzNtDXzqbwsUeod6LoYOiyjb11ZPwF1LDuoWAPlNZ3DhQa6tY+UHHDj3GWQgDIGDT/ssZ19lm/ZVsFAuOdmykENrTiondVu6D8nH8Rss0HvHy8nuS5l3tqmEw68S6dzWx36NBdwdv4am62VSOnfasXc+/xvAJ9DWi7CuDdEk/z9IY4Rwt6ZxFQAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle T - g m = a m$" - ], - "text/plain": [ - "T - g⋅m = a⋅m" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq2 = Eq(T - m * g, m * a)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEwAAAAOCAYAAACFB/pMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACoElEQVRYCdWXi1EbQQxAbSYFuAbSASQdmA5IOgA6CCVkoAOSChLSAaSCAB3gVEDiDpz3dlbMnU/nOTyTnKMZ3d5K2tXntFrddLVaTabT6f5kMnkEl+BdHRkmxz6AW1CeoOwBeMnacwm7Dvj3ARvfguHPA+/6eYEPC8bBMK0Bu3DFegBQ9BvyL+ivmztCv2J+D/1Tk77r79i9wsYH7D7c1tZXdeE+m7xrbsLmZtIM/Nqk1/d7xhd9mWSPf0rCn3lV6GnZGvbYyON1k+wQCjKegTSl/yc4qsZm/gz2Y0/JnqMVCrIvYlpHTRusbGTBkgDYnfkz2LRSwzJpMi+tX+uyNdXNUovqCfgGdF4AAy/jfcwRO61ft9gTidAxBxlr+VNlWLev1wMcNay1mIWb6ldLlskRm56zxlT/Dn40SHVu8DYGrBoZxx/xQXCHjrNBkgihI/ZPjyN8/ZV3FgGCZtn5yXgIbVHnc49jBxE8Bf0ixxk/aPDNpCLDaFviFyn78a6RBzEfc8QOM0d/Unuga7stRisW0AzilXTA1mTWEogFMK5BpWZBy8bgO1b5eSY3Ng3bvNUxox0Q54AtUupr5dk+KVcC2hcw69djpiCjIWtDCKtr0C7QtA28yWyBrq99PDNTvmNJnk4Nq+fZjMn6L8gpWEjtnl8M6NOYqDFD1y9wvtU39i1k/9i7U79qXdLXTbbL/4G+pTo6AYPWq8AFPfAe+lZdP4b87d+ruBU77YRBIGi6ZA3rgyVy34JZ+rCY1DG+XEfBmlyZojBu1C8Zfwdo5f8Rp/uyyA8dQX02F7+8+AQzzJu2tErNf0kdF6OHUoG/P6Zjb2vARmakN0nrfxPaaIBNOvkZbPpjlniUOxmNvGVBeM405MqJgeel4HF8Mg5/AGSm93rSTeMmAAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle T r = I \\alpha$" - ], - "text/plain": [ - "T⋅r = I⋅α" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eq3 = Eq(T * r, I * alpha)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left\\{ T : \\frac{I g m}{I + m r^{2}}, \\ a : - \\frac{g m r^{2}}{I + m r^{2}}, \\ \\alpha : \\frac{g m r}{I + m r^{2}}\\right\\}$" - ], - "text/plain": [ - "⎧ 2 ⎫\n", - "⎪ I⋅g⋅m -g⋅m⋅r g⋅m⋅r ⎪\n", - "⎨T: ────────, a: ────────, α: ────────⎬\n", - "⎪ 2 2 2⎪\n", - "⎩ I + m⋅r I + m⋅r I + m⋅r ⎭" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "soln = solve([eq1, eq2, eq3], [T, a, alpha])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAsCAYAAADCfS42AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEUlEQVRoBe2ajXUUNxCA7/wogJ8OTAeGdIA7IKSChA5MCXmmA5MK8kIHQAUO7gB3ELgOzPcJjXKr2/Xez+6ezbt5TydpNBppRjOjPUnzm5ub2dAwn8/P4PkL6WXmfUX+L+mc8a4z7l5l8zEUFRpAYa7CFWM8C9x9zY/GmjhKepF5fxxrjCn5jqYohDjNgnyYUqCxxhrN9bCoz0z6BLebjzX5Kfk+GHGwE3j3uh0KNeBrfV/yXAz2r1FwssjswpaPSW8yTWwSbhiX0L6FzvF+I/1HEn8Bvnd86NYDmM2GToxsfDKQn93Gm/Zz0oegoawy7KeQaV6U3SnJZrqwqfCk/JCUxiF/sdRHRX6L+hD5WBYV8alzRbMl+RnxiJQAga7BW05xLVvJ5Y/WpMQFNG9z3exxLj8BvzyWeJU4HAyh7ZoHszM+ge62Vtq/kYo1SQvoPhYe5nrJM75YTW7Xcgp9jAfuH1KDd7Rtm4+16ynw8gpT/R+ypbjiCrQMuuw1wixERk5RvPWap5Zb6KXJIP2gu+3gikIJSaieiT7PArUJXuMkVSF+3dfgWO+XkXl8FyHhqQ/igoMrign2xidoviocFlL/nemyhFeQNxSYFWDwry3nV3D+GzDe2R4LR3EHgKETHiwxFbd5WHbzpN1VNrYcBx1l3bAt3iis+Nb4FP0jh874GDtlyqNtl/wBTHeGvLp/wUihTDNwCm78iG8f0QnALWjX8s7JL8mfkLSutngjP/ENiwIn/h2phj9BnML3D/KLunHb+mhf5ptOCMF0IRXyetO+U9AfTTFIPQZKcVcsQF1XNJbUu2Ch2XdhckWhFL/GP2flhPwq6F2Le0X73vNBYtSGUuhixpdXWVlPKfuXpbHNb8hzdPI7E6NGl3THASZ3vR3nu7fuB0WtqfqDotZUlGcafvUeoEcDh2Deo6BoPrheaKIn38d3VM+U9tecP4b9l3BM8r/nG77vFs7o4HpqAchK8sM3Hf1Q99+Cpxvp8vbgeklN6SdudgLjKcQJCtO6ZiuKouFMbZJucvJ/2QUpdQguP2m+LGNyOeRMuE7XU0kQ/RTvBrZZVOTXwnS/R8apFYuSKUQeeQj1YdkP7Jq/DkbySuo+gqccJZi3KgqCOPeuz6Pvo8Abz5nFVUkfsaRyh9ilqGRREO5kURvP8A50QEkeIXuf2Dhp7fqOuvVebgp5mLCLpWUbTOPcPXamtd8cZD7KY5/fSV6VlRPWZavJtE9DSbn+lfrVyu0LTJyggbzc8UO4QrcODh4KthUf+sVNiu5vKnwo+1GY5khebmcoO17jzQH1ZT7e0Lx07oA8Cy1llZfayeVjkibdVrdZVMSnvbkdK+mkL0mCFrVAuBIvqD+2Abj1zUELH3fxOEk1DqX7xcRpNvtE7gK40xWAvv3LHOZqdaN3TfRxUC2xBgdWqPqiUzpvXLysXAH4uYpeadnfNwqn1MvCgXe1y9YdDMCLs29a7D4+0W+tHKYNt6KTdjnIAwf4KFBxmXqsvnruD9nKHL2v+9KCV6kr43XxqfvfVm/seqxAWIW+eRdAyxjizUEXn7VlbCiKXnuPT9XMh3pzsMKnGqe3WitKV9EV21axl9mQBFi3QdwYVVt3snrmWGJWHvc5eeB82hivWYLP35luq+zIgEfyT7BBXKbp3QB1A/Q+wbls+uZAWeo3B8Fnp8Xv/FM8hIaYtBbqmc7y1j4E68l5jK0oXUdXXkwu2cADfgetYeMZObLBtgAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle \\frac{I g m}{I + m r^{2}}$" - ], - "text/plain": [ - " I⋅g⋅m \n", - "────────\n", - " 2\n", - "I + m⋅r " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "soln[T]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFwAAAAxCAYAAABXhc7cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFiklEQVR4Ae2bi3EbNxCGRY8L8KMDuQPF6cDqwI8KHHcgl5BROpBTQcbpwE4FfnRgdRCbHSjfBwEY3BGkjvRBRyq3MyCABbAAfuwtcLjl4urq6mimOgKLxeKckgeEY8Il4S14LYl3psUMeB27CPYF+Aj0Efn3RMfkf6m3GMa9N6za/7LW896sfyd/AvBq+840A74ZuhLcZEpK3ubWldL7Fd7MAgFMx5MeECcx/7nH3yo7a/hwuNxA501zOF6710ynFbT+ze5SrlvOGn4DgoD9G1UejAG2Xc2AbwAcsJ9R/CSBbZ6QbPmGluuL5nP4GmwisH9S7HEwkSblBQuQTiyJPzjeG8CZoOfeU8K3OHpfON4wOXm+eKhtpj2WvSVI6az8K+lP1P0jAvWK/L8E+b68fCQOFOWopZa9JjwlZK1VBnn7+0HkW2aHKF90GNtmEOARaNLAmD0BfEjjIC2o3jkIVhgb6XPT0IcYzooygbHwjPCs4LsgP1I+ti/lfKH8eeQrt1O3bDdWevJzOJokKAL1kBCIyV3CNy0Iapsa+Mk05GIsqRM0MXCOjh7F+DH8rM3w5Gctrcj5Sv2/Y1sX/XtMt4vocGrt9tHN2u14IAE24enAfI4jP2txLHfRcv00J3jef2TZpDfKSe1axpOeUqLGqYECU5L2+pKJL2WmmKR886UWy9K25/oyIlk/PCXmB8iJzdpFkwLOtNywpBqAfZ71BPariR4JbDINoYjFlOdiBj75bFrgrZMT2rb8mRrwYDPRvHAFWky0o5kF/yXpzkJEILXrWZNj/RfE2mj3A8uVmWhFTipoHjOgyWw4k1PrtL3eM4dxkNa81OyxoMmv2u/UPsXU8wSSTiQhtgxKck5S3duM7zuCqYiJLtE+H+9zYk8hjwlqe80eC5T8jobDk/+O0CdfWE6R66v5RVGY5NRMU1GtTXJvXnzS9ABI0yCwP31RlGTuU3xvysEArse/TOQ1Mdra/qkl1zn0xGSAA64vGl8iyAlHgX5XMRup/ODjKW24pkN7+jKC7hcWX+U7x7uDR7g3gb2z4b3x3bnsZCblziE5cEIz4AOBGqvaDPhYSA6U4x2oR7F/BtZP1V6zuXVeHNj4wmtcqjDHdQTmTbOOSzPubFKaQVsXPOU5vD6iA+fGFzrN9DHBe6GO89BsUkZc4Aj2Ro/b2aSMCDii/NRXkjeWHY/bZoCz2meE94SrGLw3uSD4qN1lKue3jBPNvOYmRbDp1C8vP+XIfogrxNzVeC/kHjL/AH4zDRcgOvSqVep/NLjmDvh10ATdKA6RVjxumwIOQn7NkfrfG6+5d/gXJRHsj2h26T/T3JkzaDid7qzhh7gmgL3W47b1OdwvOpOBzcRdcJ8yN63m/oj0kcxox+MW9neU7voqhESTr/Z04mTdMLMP4C590d6NZycZtEtf7TVphiyHtC8nYXzE2ROAtP11fAzJl3LW+iNSTwUL5cTKMdhv8Phy/i01PNnvSTQc7XbyegJIaviSCZf29FEowVMAfjlG+S5GoIqcTf6IXgLatvNNFvnhhKLAZsdCBupK6/sxyL2X+m4yPhV9cgKC0HcWsp5f93X4WSHkqVW6Ydhe/8VT8hlY+Gpf58imEPjybBsU5iY5ttmKENzKpPi4ZkfKXftBhsBkU7CtnNieZt15wtdX5VuF7+Ks9LdOTr/9Tfkmx0K0ImnqPhwH1dTO3T15yTF2PljHcftENPNHbAI4A57UftN/SSt+hJoJKmjX+wrR3B+xFeCaAU1VTbMsuhUCWEEV3D6w4QlkfNmmxwE9JU48/+6SND3J+SvW2zkaDXC1huBllZulAwwbEHk3w6nIcWzrj+g8mvkjNjuljIUwk/dp0bu2PNKNJf7W5RwC4JoEzdPy1tFp0OF/dF4ZTvUAv/EAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle - \\frac{g m r^{2}}{I + m r^{2}}$" - ], - "text/plain": [ - " 2 \n", - "-g⋅m⋅r \n", - "────────\n", - " 2\n", - "I + m⋅r " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "soln[a]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEoAAAAnCAYAAACout71AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEp0lEQVRoBe2agVFUMRBA7xgLAOkAO0DsADpArUDpAEpwsAPowNEO1AoY6UA6UK6D872QZPL//cN/XD7HMbczuSSbzWazu9mfSzKeTqejIWA8Hh/D94j0O/K/IT9hPHEj2g/JLO+RzkiCfYQ3pCtoP0O3T/k96U/EX4D/QTlA5CONfT6QDkjWA8gjlZfKYTSqnRDonPQ98aWsMrSIkwzjUT63DHyP6bRo2wZn4ynpsMCryNtUj/1LPr9oP454+TZoy36Lll/ArCpET3KCO4kxQt2At6rwepMWv7IMqMQJNKXlX4aW0WgXfPYecOJVYoAOPtfQf4vNGutvLC+fwbiqRyHRLSl7k/wBFWNhO9ZzHvHZa2K7npPpk4zgvpIyb8r38kn9auRbDFYNooW1uBMqwXh0g8ATkSmnKN566TWijF2ZXkQE6YNXWu/BJ3ZbPquqKMQxkApdE2/jpFMh1xZaoELSEgpNGEGcRgh46nkJgpvHJ/St8VNbUSEmYGm/cCU0PKFoeEe5ocCoAONW9pxI/5bcGGS8s12eCWb4pIZqOQNXi1EIpZWNLXuJL2WXYVe8cbLiO+NT6p9y6PyipS9cyG0DEp/9RDtE/sKRagECTrC2y+Cc3K/aLknv6oo3TlB8w6PAib8kteETiCP4fiS/KBoTn64lXJAtVxyr/SGBibmEVMjJkOMMzXur5gAoxW1ABuouRWNJ+yuYadalUE1RKMUN3q+onDR/FXTZsbxS+9rkNWOUS8x48S4q6xVl/7I0PvNro5mWoIPHqNZ4a1uttvTWVgM9Bd8oaqOonhroSebZx7AbqZ6CPHWyTTDvaaFNjOqpqJr7qJ5DPl2yuGn234T7Qf+jnrEPnCjxZumpBSAqyQ1yOCKi7r8KT0Fe275ZemrhDjx+LsHTin0UpnfNKoqGU7VJmsbk/7cLUuhQcnqG5XKOYckxx4Cbu/RUEkSeKAbXe4ZKuXdKzF8Pc/ntGKe2uqgh8mhEaB+q3WF7/joYyaurdQRPQ3Iw71QUBJ5SCu1z6zvsM//FuCrpB56U7xrnKSp4FIRLedQ66hMledTsfWHjRHbePsqTypUqCYE1lp5tMH2UtwlxzFdJSbH+l/r1zA0MQimggTy/BYBwhq4PDh4GxAfxoV+6cXH5mzIfym4Kg4zk+RaHsuM13htQL/nMfZsAnc4R2snlY3LccBvd5VEpPq3Mo7CkQl+RBD1qgmFyvKD+0gag5tuEn/DTAH7pMjBu984cIdWqd2ThVUXucU+BPgY/PbENDuyk2hei0nkz46XmDMBPK3r1ZX/fMhxRz4YDr7XzpzsxAC/OvsHY/+OT+vXKYdpYVnTSpfNDiHb7InX4OKG8ZBbpK23sT3FGRu/1fnfgVerMePP4tPvfV2989bBA8oqnsi3QM7ouNpWzcWkRZdcDB3mb0FAUg6w8PiFDCTNvClxOEBi32sYc9G1CW1EuFZdilxVtejRAISpDpbQVErweGXPMikIdkCecTyCTZyU+XyLdg7ItLUTyT7BBXKYeOVg3QK8SlGXRtwnOZZC3CXP/FNfQEELroZ7plJ/2GqwfncfQinLpuJQnjz6zygP+A+ryyqCcMfBcAAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle \\frac{g m r}{I + m r^{2}}$" - ], - "text/plain": [ - " g⋅m⋅r \n", - "────────\n", - " 2\n", - "I + m⋅r " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "soln[alpha]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "The results are\n", - "\n", - "$T = m g I / I^* $\n", - "\n", - "$a = -m g r^2 / I^* $\n", - "\n", - "$\\alpha = m g r / I^* $\n", - "\n", - "where $I^*$ is the augmented moment of inertia, $I + m r^2$.\n", - "\n", - "You can also see [the derivation of these equations in this video](https://www.youtube.com/watch?v=chC7xVDKl4Q).\n", - "\n", - "To simulate the system, we don't really need $T$; we can plug $a$ and $\\alpha$ directly into the slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "newton" - ], - "text/latex": [ - "$\\mathrm{newton}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Simulate the descent of a yo-yo. How long does it take to reach the end of the string?\n", - "\n", - "I provide a `Params` object with the system parameters:\n", - "\n", - "* `Rmin` is the radius of the axle. `Rmax` is the radius of the axle plus rolled string.\n", - "\n", - "* `Rout` is the radius of the yo-yo body. `mass` is the total mass of the yo-yo, ignoring the string. \n", - "\n", - "* `L` is the length of the string.\n", - "\n", - "* `g` is the acceleration of gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.008 meter
    Rmax0.016 meter
    Rout0.035 meter
    mass0.05 kilogram
    L1 meter
    g9.8 meter / second ** 2
    t_end1 second
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.008 meter\n", - "Rmax 0.016 meter\n", - "Rout 0.035 meter\n", - "mass 0.05 kilogram\n", - "L 1 meter\n", - "g 9.8 meter / second ** 2\n", - "t_end 1 second\n", - "dtype: object" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "params = Params(Rmin = 8e-3 * m,\n", - " Rmax = 16e-3 * m,\n", - " Rout = 35e-3 * m,\n", - " mass = 50e-3 * kg,\n", - " L = 1 * m,\n", - " g = 9.8 * m / s**2,\n", - " t_end = 1 * s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `make_system` function that computes `I` and `k` based on the system parameters.\n", - "\n", - "I estimated `I` by modeling the yo-yo as a solid cylinder with uniform density ([see here](https://en.wikipedia.org/wiki/List_of_moments_of_inertia)).\n", - "\n", - "In reality, the distribution of weight in a yo-yo is often designed to achieve desired effects. But we'll keep it simple." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, Rout, \n", - " mass, L, g, t_end\n", - " \n", - " returns: System with init, k, Rmin, Rmax, mass,\n", - " I, g, ts\n", - " \"\"\"\n", - " L, mass = params.L, params.mass\n", - " Rout, Rmax, Rmin = params.Rout, params.Rmax, params.Rmin \n", - " \n", - " init = State(theta = 0 * radian,\n", - " omega = 0 * radian/s,\n", - " y = L,\n", - " v = 0 * m / s)\n", - " \n", - " I = mass * Rout**2 / 2\n", - " k = (Rmax**2 - Rmin**2) / 2 / L / radian \n", - " \n", - " return System(params, init=init, I=I, k=k)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    Rmin0.008 meter
    Rmax0.016 meter
    Rout0.035 meter
    mass0.05 kilogram
    L1 meter
    g9.8 meter / second ** 2
    t_end1 second
    inittheta 0 radian\n", - "omega 0.0 radi...
    I3.0625000000000006e-05 kilogram * meter ** 2
    k9.6e-05 meter / radian
    \n", - "
    " - ], - "text/plain": [ - "Rmin 0.008 meter\n", - "Rmax 0.016 meter\n", - "Rout 0.035 meter\n", - "mass 0.05 kilogram\n", - "L 1 meter\n", - "g 9.8 meter / second ** 2\n", - "t_end 1 second\n", - "init theta 0 radian\n", - "omega 0.0 radi...\n", - "I 3.0625000000000006e-05 kilogram * meter ** 2\n", - "k 9.6e-05 meter / radian\n", - "dtype: object" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    theta0 radian
    omega0.0 radian / second
    y1 meter
    v0.0 meter / second
    \n", - "
    " - ], - "text/plain": [ - "theta 0 radian\n", - "omega 0.0 radian / second\n", - "y 1 meter\n", - "v 0.0 meter / second\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write a slope function for this system, using these results from the book:\n", - "\n", - "$ r = \\sqrt{2 k y + R_{min}^2} $ \n", - "\n", - "$ T = m g I / I^* $\n", - "\n", - "$ a = -m g r^2 / I^* $\n", - "\n", - "$ \\alpha = m g r / I^* $\n", - "\n", - "where $I^*$ is the augmented moment of inertia, $I + m r^2$.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, omega, y, v\n", - " t: time\n", - " system: System object with Rmin, k, I, mass\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega, y, v = state\n", - " g, k, Rmin = system.g, system.k, system.Rmin\n", - " I, mass = system.I, system.mass\n", - " \n", - " r = sqrt(2*k*y + Rmin**2)\n", - " alpha = mass * g * r / (I + mass * r**2)\n", - " a = -r * alpha\n", - " \n", - " return omega, alpha, v, a " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your slope function with the initial paramss." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.0 ,\n", - " 180.54116292458264 ,\n", - " 0.0 ,\n", - " -2.888658606793322 )" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "slope_func(system.init, 0*s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write an event function that will stop the simulation when `y` is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "def event_func(state, t, system):\n", - " \"\"\"Stops when y is 0.\n", - " \n", - " state: State object with theta, omega, y, v\n", - " t: time\n", - " system: System object with Rmin, k, I, mass\n", - " \n", - " returns: y\n", - " \"\"\"\n", - " theta, omega, y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your event function:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "1 meter" - ], - "text/latex": [ - "$1\\ \\mathrm{meter}$" - ], - "text/plain": [ - "1 " - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "event_func(system.init, 0*s, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    values
    solNone
    t_events[[0.879217870162702]]
    nfev134
    njev0
    nlu0
    status1
    messageA termination event occurred.
    successTrue
    \n", - "
    " - ], - "text/plain": [ - "sol None\n", - "t_events [[0.879217870162702]]\n", - "nfev 134\n", - "njev 0\n", - "nlu 0\n", - "status 1\n", - "message A termination event occurred.\n", - "success True\n", - "dtype: object" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results, details = run_ode_solver(system, slope_func, events=event_func, max_step=0.05)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Check the final state. If things have gone according to plan, the final value of `y` should be close to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    thetaomegayv
    0.70614744.0182121.320.327291-1.76573
    0.75614750.268128.6090.236982-1.84499
    0.80614756.8724135.4960.142962-1.91405
    0.85614763.8093141.8850.0457628-1.97198
    0.87921867.1147144.6319.02056e-17-1.99469
    \n", - "
    " - ], - "text/plain": [ - " theta omega y v\n", - "0.706147 44.0182 121.32 0.327291 -1.76573\n", - "0.756147 50.268 128.609 0.236982 -1.84499\n", - "0.806147 56.8724 135.496 0.142962 -1.91405\n", - "0.856147 63.8093 141.885 0.0457628 -1.97198\n", - "0.879218 67.1147 144.631 9.02056e-17 -1.99469" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Solution\n", - "\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`theta` should increase and accelerate." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`y` should decrease and accelerate down." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def plot_y(results):\n", - " plot(results.y, color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plot velocity as a function of time; is the yo-yo accelerating?" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "v = results.v # m / s\n", - "plot(v)\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `gradient` to estimate the derivative of `v`. How does the acceleration of the yo-yo compare to `g`?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "# Solution\n", - "\n", - "a = gradient(v)\n", - "plot(a)\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Acceleration (m/$s^2$)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 8ae5c94cc95cf45f9d42f567dc945a249073257f Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 17:18:14 -0400 Subject: [PATCH 105/144] Updating examples --- examples/plague.ipynb | 56 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/examples/plague.ipynb b/examples/plague.ipynb index a2b391c5..6c55ca6f 100644 --- a/examples/plague.ipynb +++ b/examples/plague.ipynb @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 1, "id": "electoral-turkey", "metadata": { "tags": [] @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 2, "id": "formal-context", "metadata": { "tags": [] @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 3, "id": "progressive-typing", "metadata": { "tags": [] @@ -79,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 4, "id": "undefined-miller", "metadata": { "tags": [] @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 5, "id": "growing-sperm", "metadata": { "tags": [] @@ -124,19 +124,19 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "id": "recent-cooper", "metadata": {}, "outputs": [], "source": [ "def add_immunization(system, fraction):\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" + " system.init.s -= fraction\n", + " system.init.r += fraction" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 7, "id": "found-learning", "metadata": {}, "outputs": [], @@ -152,14 +152,14 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 8, "id": "synthetic-element", "metadata": {}, "outputs": [], "source": [ "def calc_total_infected(results, system):\n", - " s_0 = results.S[0]\n", - " s_end = results.S[system.t_end]\n", + " s_0 = results.s[0]\n", + " s_end = results.s[system.t_end]\n", " return s_0 - s_end" ] }, @@ -224,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 9, "id": "blond-armstrong", "metadata": {}, "outputs": [], @@ -259,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 10, "id": "disturbed-amount", "metadata": {}, "outputs": [], @@ -283,7 +283,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 11, "id": "otherwise-answer", "metadata": {}, "outputs": [], @@ -308,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 12, "id": "seventh-strike", "metadata": {}, "outputs": [], @@ -334,7 +334,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 13, "id": "obvious-congress", "metadata": {}, "outputs": [], @@ -355,7 +355,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 14, "id": "polish-multiple", "metadata": {}, "outputs": [], @@ -376,7 +376,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 15, "id": "statistical-garden", "metadata": {}, "outputs": [], @@ -403,7 +403,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 16, "id": "joined-graduation", "metadata": {}, "outputs": [], @@ -424,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 17, "id": "cheap-decision", "metadata": {}, "outputs": [], @@ -464,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 18, "id": "surrounded-copying", "metadata": {}, "outputs": [], @@ -489,7 +489,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 19, "id": "shaped-utility", "metadata": {}, "outputs": [], @@ -509,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 20, "id": "recognized-release", "metadata": {}, "outputs": [], @@ -546,7 +546,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 21, "id": "worth-mounting", "metadata": {}, "outputs": [], @@ -556,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 22, "id": "adjusted-highlight", "metadata": {}, "outputs": [], @@ -601,7 +601,7 @@ "metadata": { "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -615,7 +615,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, From 3efd0f904764a9770bb67651f31ff05c0a212ce6 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 27 Apr 2023 17:18:23 -0400 Subject: [PATCH 106/144] Adding notes --- chapters/build.sh | 25 +++++++++++++++++++++++++ examples/build.sh | 24 ++++++++++++++++++++++++ notes.txt | 19 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 chapters/build.sh create mode 100644 examples/build.sh create mode 100644 notes.txt diff --git a/chapters/build.sh b/chapters/build.sh new file mode 100644 index 00000000..b16f5a3c --- /dev/null +++ b/chapters/build.sh @@ -0,0 +1,25 @@ +# copy the notebooks and remove the solutions +cp ../ModSimPySolutions/chapters/chap*.ipynb . +python remove_soln.py + +# run nbmake +rm modsim.py chap*.py +pytest --nbmake chap*.ipynb + +# add and commit +git add chap*.ipynb chap*.py +git commit -m "Updating chapters" + +# build the zip file +cd ../..; zip -r ModSimPyNotebooks.zip \ + ModSimPy/chapters/chap*.ipynb \ + ModSimPy/examples/*.ipynb + +# add and commit it +mv ModSimPyNotebooks.zip ModSimPy +cd ModSimPy + +git add ModSimPyNotebooks.zip +git commit -m "Updating the notebook zip file" + +git push diff --git a/examples/build.sh b/examples/build.sh new file mode 100644 index 00000000..56d540b8 --- /dev/null +++ b/examples/build.sh @@ -0,0 +1,24 @@ +# copy the notebooks and remove the solutions +cp ../ModSimPySolutions/examples/*.ipynb . +python remove_soln.py + +# run nbmake +rm modsim.py chap*.py +pytest --nbmake \ +bungee1.ipynb \ +bungee2.ipynb \ +glucose.ipynb \ +header.ipynb \ +insulin.ipynb \ +plague.ipynb \ +queue.ipynb \ +spiderman.ipynb \ +throwingaxe.ipynb \ +trees.ipynb \ +wall.ipynb \ + + +# add and commit +git add *.ipynb +git commit -m "Updating examples" +git push diff --git a/notes.txt b/notes.txt new file mode 100644 index 00000000..be6a7006 --- /dev/null +++ b/notes.txt @@ -0,0 +1,19 @@ +How to do an update: + +There are three repos involved: + +* ModSim: contains shared resources between ModSimPy and ModSimMATLAB, mostly figures. Active branch is main. + +* ModSimPy: Public repo with notebooks and examples without solutions. Active branch is master. + +* ModSimPySolutions: Private repo where I do development and keep solutions. + +The active directories are chapters and examples. There are lots of leftover bits I should clean up some day! + +ModSimPySolutions is has actions on GitHub that run tests on push and once a month. + +In ModSimPy, the chapters and examples directories have build.sh files that copy the notebooks from ModSimPySolutions, removes solutions, runs tests, and pushes updates to GitHub. + +Not all notebooks can run without solutions, so those don't get tested. + +The canonical location of modsim.py is in the top directory of ModSimPy. Everything else is a copy. From b981af5236396be59982b8f82d050ccf78c34834 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 May 2023 18:00:46 -0400 Subject: [PATCH 107/144] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5339bbf3..845d86c4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Modeling and Simulation in Python -[Read the book and run the code](https://allendowney.github.io/ModSimPy/). +Order the book from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) or [Amazon](https://amzn.to/3y9UxNb). -[Pre-order the book from No Starch Press](https://nostarch.com/modeling-and-simulation-python). +[Read the book and run the code](https://allendowney.github.io/ModSimPy/). *Modeling and Simulation in Python* is an introduction to physical modeling using a computational approach. It is organized in three parts: From a7153bec6d519e9c5438ab7d9fe0f7703cf84781 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Tue, 2 May 2023 18:01:31 -0400 Subject: [PATCH 108/144] Add files via upload --- modsimpy_cover.png | Bin 0 -> 241955 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modsimpy_cover.png diff --git a/modsimpy_cover.png b/modsimpy_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..483c9c9783e7175b4eb68f79445863bce32f295f GIT binary patch literal 241955 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

    H1>{~J{fK0^?xTd^Lm>`4zI(IoT0Th*( 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

    &8Eiv3I?46eA@_=|(L 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 literal 0 HcmV?d00001 From ab03b58e4b53e28910f98eabf371ecbdeecef067 Mon Sep 17 00:00:00 2001 From: rioj7 <38918937+rioj7@users.noreply.github.com> Date: Mon, 22 May 2023 15:50:14 +0200 Subject: [PATCH 109/144] Updating trees.ipynb --- examples/trees.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/trees.ipynb b/examples/trees.ipynb index 5dad9e80..b0be531f 100644 --- a/examples/trees.ipynb +++ b/examples/trees.ipynb @@ -197,7 +197,7 @@ "\n", "$$ m_{n+1} = m_n + \\alpha A$$\n", "\n", - "where $m_n$ is the mass of the at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", + "where $m_n$ is the mass of the tree at time step $n$, $A$ is the area exposed to sunlight, and $\\alpha$ is an unknown growth parameter.\n", "\n", "To get from $m$ to $A$, I'll make the additional assumption that mass is proportional to height raised to an unknown power:\n", "\n", @@ -440,7 +440,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "I'll wrap the code from the previous section is a function that takes the parameters as inputs and makes a `System` object." + "I'll wrap the code from the previous section in a function that takes the parameters as inputs and makes a `System` object." ] }, { @@ -519,7 +519,7 @@ "\n", "data.plot(label='data')\n", "decorate(xlabel='Time (years)',\n", - " ylabel='Height (feet)')" + " ylabel='Height (feet)')" ] }, { @@ -899,7 +899,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Taking the derivative of the last equation yields\n", + "Taking the derivative of (3) yields\n", "\n", "(4) $\\frac{dm}{dt} = D h^{D-1} \\frac{dh}{dt}$\n", "\n", From 6d77b68687110e65b2e249c5396ccd2c9a230763 Mon Sep 17 00:00:00 2001 From: rioj7 <38918937+rioj7@users.noreply.github.com> Date: Fri, 26 May 2023 10:12:04 +0200 Subject: [PATCH 110/144] find root, min, max of func: update doc string and refactor kwargs check --- modsim.py | 101 +++++++++++++++++++++++++---------------------- modsim/modsim.py | 101 +++++++++++++++++++++++++---------------------- 2 files changed, 108 insertions(+), 94 deletions(-) diff --git a/modsim.py b/modsim.py index ed012ec6..0cd9034f 100644 --- a/modsim.py +++ b/modsim.py @@ -105,38 +105,42 @@ def linrange(start, stop=None, step=1): return linspace(start, stop, n+1) +def __check_kwargs(kwargs, param_name, param_len, func, func_name): + """Check if `kwargs` has a parameter that is a sequence of a particular length + param_len: sequence enumerating possible lengths + """ + param_val = kwargs.get(param_name, None) + if param_val is None or len(param_val) not in param_len: + msg = ("To run `{}`, you have to provide a " + "`{}` keyword argument with a sequence of length {}.") + raise ValueError(msg.format(func_name, param_name, ' or '.join(map(str, param_len)))) + + try: + func(param_val[0]) + except Exception as e: + msg = ("In `{}` I tried running the function you provided " + "with `{}[0]`, and I got the following error:") + logger.error(msg.format(func_name, param_name)) + raise (e) + def root_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `min_func`. + """Find the input value that is a root of `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html - func: computes the function to be minimized + func: computes the function to find a root of bracket: sequence of two values, lower and upper bounds of the range to be searched - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to root_scalar + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed to `root_scalar` returns: RootResults object """ - bracket = kwargs.get('bracket', None) - if bracket is None or len(bracket) != 2: - msg = ("To run root_scalar, you have to provide a " - "`bracket` keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) - - try: - func(bracket[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.root_scalar " - "I tried running the function you provided " - "with `bracket[0]`, " - "and I got the following error:") - logger.error(msg) - raise (e) underride(kwargs, rtol=1e-4) + __check_kwargs(kwargs, 'bracket', [2], lambda x: func(x, *args), 'root_scalar') + res = spo.root_scalar(func, *args, **kwargs) if not res.converged: @@ -148,37 +152,36 @@ def root_scalar(func, *args, **kwargs): def minimize_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `func`. + """Find the input value that minimizes `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html func: computes the function to be minimized - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to minimize_scalar + bracket: (`method` is `brent` or `golden`) sequence of two or three values, the range to be searched + bounds: (`method` is `bounded`) sequence of two values, the range to be searched + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed to `minimize_scalar` returns: OptimizeResult object """ - bounds = kwargs.get('bounds', None) - if bounds is None or len(bounds) != 2: - msg = ("To run maximize_scalar or minimize_scalar, " - "you have to provide a `bounds` " - "keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) + underride(kwargs, __func_name='minimize_scalar') - try: - func(bounds[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.minimize_scalar, " - "I tried running the function you provided " - "with the lower bound, " - "and I got the following error:") - logger.error(msg) - raise (e) + method = kwargs.get('method', None) + if method is None: + method = 'bounded' if kwargs.get('bounds', None) else 'brent' + kwargs['method'] = method + + if method == 'bounded': + param_name = 'bounds' + param_len = [2] + else: + param_name = 'bracket' + param_len = [2, 3] - underride(kwargs, method='bounded') + func_name = kwargs.pop('__func_name') + __check_kwargs(kwargs, param_name, param_len, lambda x: func(x, *args), func_name) res = spo.minimize_scalar(func, args=args, **kwargs) @@ -191,19 +194,23 @@ def minimize_scalar(func, *args, **kwargs): return res -def maximize_scalar(max_func, *args, **kwargs): - """Finds the input value that maximizes `max_func`. +def maximize_scalar(func, *args, **kwargs): + """Find the input value that maximizes `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - min_func: computes the function to be maximized - args: any additional positional arguments are passed to max_func - options: any keyword arguments are passed as options to minimize_scalar + func: computes the function to be maximized + bracket: (`method` is `brent` or `golden`) sequence of two or three values, the range to be searched + bounds: (`method` is `bounded`) sequence of two values, the range to be searched + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed as options to `minimize_scalar` - returns: ModSimSeries object + returns: OptimizeResult object """ def min_func(*args): - return -max_func(*args) + return -func(*args) + + underride(kwargs, __func_name='maximize_scalar') res = minimize_scalar(min_func, *args, **kwargs) diff --git a/modsim/modsim.py b/modsim/modsim.py index ed012ec6..0cd9034f 100644 --- a/modsim/modsim.py +++ b/modsim/modsim.py @@ -105,38 +105,42 @@ def linrange(start, stop=None, step=1): return linspace(start, stop, n+1) +def __check_kwargs(kwargs, param_name, param_len, func, func_name): + """Check if `kwargs` has a parameter that is a sequence of a particular length + param_len: sequence enumerating possible lengths + """ + param_val = kwargs.get(param_name, None) + if param_val is None or len(param_val) not in param_len: + msg = ("To run `{}`, you have to provide a " + "`{}` keyword argument with a sequence of length {}.") + raise ValueError(msg.format(func_name, param_name, ' or '.join(map(str, param_len)))) + + try: + func(param_val[0]) + except Exception as e: + msg = ("In `{}` I tried running the function you provided " + "with `{}[0]`, and I got the following error:") + logger.error(msg.format(func_name, param_name)) + raise (e) + def root_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `min_func`. + """Find the input value that is a root of `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root_scalar.html - func: computes the function to be minimized + func: computes the function to find a root of bracket: sequence of two values, lower and upper bounds of the range to be searched - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to root_scalar + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed to `root_scalar` returns: RootResults object """ - bracket = kwargs.get('bracket', None) - if bracket is None or len(bracket) != 2: - msg = ("To run root_scalar, you have to provide a " - "`bracket` keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) - - try: - func(bracket[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.root_scalar " - "I tried running the function you provided " - "with `bracket[0]`, " - "and I got the following error:") - logger.error(msg) - raise (e) underride(kwargs, rtol=1e-4) + __check_kwargs(kwargs, 'bracket', [2], lambda x: func(x, *args), 'root_scalar') + res = spo.root_scalar(func, *args, **kwargs) if not res.converged: @@ -148,37 +152,36 @@ def root_scalar(func, *args, **kwargs): def minimize_scalar(func, *args, **kwargs): - """Finds the input value that minimizes `func`. + """Find the input value that minimizes `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html func: computes the function to be minimized - args: any additional positional arguments are passed to func - kwargs: any keyword arguments are passed to minimize_scalar + bracket: (`method` is `brent` or `golden`) sequence of two or three values, the range to be searched + bounds: (`method` is `bounded`) sequence of two values, the range to be searched + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed to `minimize_scalar` returns: OptimizeResult object """ - bounds = kwargs.get('bounds', None) - if bounds is None or len(bounds) != 2: - msg = ("To run maximize_scalar or minimize_scalar, " - "you have to provide a `bounds` " - "keyword argument with a sequence " - "of length 2.") - raise ValueError(msg) + underride(kwargs, __func_name='minimize_scalar') - try: - func(bounds[0], *args) - except Exception as e: - msg = ("Before running scipy.integrate.minimize_scalar, " - "I tried running the function you provided " - "with the lower bound, " - "and I got the following error:") - logger.error(msg) - raise (e) + method = kwargs.get('method', None) + if method is None: + method = 'bounded' if kwargs.get('bounds', None) else 'brent' + kwargs['method'] = method + + if method == 'bounded': + param_name = 'bounds' + param_len = [2] + else: + param_name = 'bracket' + param_len = [2, 3] - underride(kwargs, method='bounded') + func_name = kwargs.pop('__func_name') + __check_kwargs(kwargs, param_name, param_len, lambda x: func(x, *args), func_name) res = spo.minimize_scalar(func, args=args, **kwargs) @@ -191,19 +194,23 @@ def minimize_scalar(func, *args, **kwargs): return res -def maximize_scalar(max_func, *args, **kwargs): - """Finds the input value that maximizes `max_func`. +def maximize_scalar(func, *args, **kwargs): + """Find the input value that maximizes `func`. Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - min_func: computes the function to be maximized - args: any additional positional arguments are passed to max_func - options: any keyword arguments are passed as options to minimize_scalar + func: computes the function to be maximized + bracket: (`method` is `brent` or `golden`) sequence of two or three values, the range to be searched + bounds: (`method` is `bounded`) sequence of two values, the range to be searched + args: any additional positional arguments are passed to `func` + kwargs: any keyword arguments are passed as options to `minimize_scalar` - returns: ModSimSeries object + returns: OptimizeResult object """ def min_func(*args): - return -max_func(*args) + return -func(*args) + + underride(kwargs, __func_name='maximize_scalar') res = minimize_scalar(min_func, *args, **kwargs) From 60716525c9b2a5fd1632ed3a782f587be852cace Mon Sep 17 00:00:00 2001 From: bluthej Date: Sat, 2 Sep 2023 17:16:31 +0200 Subject: [PATCH 111/144] Fix 'the the' occurrences --- book/book.tex | 4 ++-- examples/yoyo.ipynb | 2 +- jb/preface.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/book/book.tex b/book/book.tex index 0b0274e3..ea1c9070 100644 --- a/book/book.tex +++ b/book/book.tex @@ -366,7 +366,7 @@ \section{How much programming do I need?} Some features in the ModSim library are like training wheels; at some point you will probably stop using them and start working with the underlying libraries directly. Other features you might find useful the whole time you are working through the book, and later. -I encourage you to read the the ModSim library code. Most of it is not complicated, and I tried to make it readable. Particularly if you have some programming experience, you might learn something by reverse engineering my design decisions. +I encourage you to read the ModSim library code. Most of it is not complicated, and I tried to make it readable. Particularly if you have some programming experience, you might learn something by reverse engineering my design decisions. \section{How much math and science do I need?} @@ -5099,7 +5099,7 @@ \section{The glucose minimal model} insulin must first move from plasma to a remote compartment [...] to exert its action on glucose disposal. \end{quote} -To paraphrase the second point, the effect of insulin on glucose disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a ``remote compartment" where it has its effect. +To paraphrase the second point, the effect of insulin on glucose disposal, as seen in the data, happens more slowly than we would expect if it depended primarily on the concentration of insulin in the blood. Bergman's group hypothesized that insulin must move relatively slowly from the blood to a ``remote compartment" where it has its effect. \index{compartment model} diff --git a/examples/yoyo.ipynb b/examples/yoyo.ipynb index 316e3e0e..e732e41a 100644 --- a/examples/yoyo.ipynb +++ b/examples/yoyo.ipynb @@ -327,7 +327,7 @@ "source": [ "The state variables we'll use are angle, `theta`, angular velocity, `omega`, the length of the spooled string, `y`, and the linear velocity of the yo-yo, `v`.\n", "\n", - "Here is a `State` object with the the initial conditions." + "Here is a `State` object with the initial conditions." ] }, { diff --git a/jb/preface.md b/jb/preface.md index cca775c2..f1aa6f5f 100644 --- a/jb/preface.md +++ b/jb/preface.md @@ -75,7 +75,7 @@ Some features in the ModSim library are like training wheels; at some point you will probably stop using them and start working with the underlying libraries directly. Other features you might find useful the whole time you are working through the book, and later. -I encourage you to read the the ModSim library code. Most of it is not +I encourage you to read the ModSim library code. Most of it is not complicated, and I tried to make it readable. Particularly if you have some programming experience, you might learn something by reverse engineering my design decisions. From dbe6b0eef1fae6ebc431ee503d9b253c6237ab68 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 2 Sep 2023 13:35:12 -0400 Subject: [PATCH 112/144] Updating chapters --- chapters/chap03.ipynb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index dbb7f229..21c4f895 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -496,14 +496,14 @@ "source": [ "The equals operator is one of Python's *comparison operators*; the complete list is in the following table.\n", "\n", - "| Operation \t| Symbol \t|\n", - "|-----------------------\t|--------\t|\n", - "| Less than \t| `<` \t|\n", - "| Greater than \t| `>` \t|\n", - "| Less than or equal \t| `<=` \t|\n", - "| Greater than or equal \t| `>=` \t|\n", - "| Equal \t| `==` \t|\n", - "| Not equal \t| `!=` \t|" + "| Operation | Symbol |\n", + "|-----------------------|--------|\n", + "| Less than | `<` |\n", + "| Greater than | `>` |\n", + "| Less than or equal | `<=` |\n", + "| Greater than or equal | `>=` |\n", + "| Equal | `==` |\n", + "| Not equal | `!=` |" ] }, { @@ -848,7 +848,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, From 9d023f950330b95e4c46969a2bec8ddd77a79608 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sat, 2 Sep 2023 13:35:12 -0400 Subject: [PATCH 113/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240629 -> 240635 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index 9949a6f52dc14595d072564f21e27856a9192209..f8b5120dd3565e16707329b439a1303f8f54e51e 100644 GIT binary patch delta 13034 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 Se-{Uffut}cN#H{n!2bgRSMCA; delta 12969 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 Date: Sat, 2 Sep 2023 13:37:41 -0400 Subject: [PATCH 114/144] update installation --- jb/preface.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jb/preface.md b/jb/preface.md index f1aa6f5f..522750d9 100644 --- a/jb/preface.md +++ b/jb/preface.md @@ -156,7 +156,7 @@ typos): ``` conda install jupyter pandas sympy conda install beautifulsoup4 lxml html5lib -conda install -c unidata pint +conda install pint ``` That should be everything you need. From 9de6579aab1b99bfb3f26b0bdf7e8ae0a8b3e658 Mon Sep 17 00:00:00 2001 From: mcsmart76 Date: Fri, 8 Sep 2023 20:15:45 -0700 Subject: [PATCH 115/144] Fix incorrect population number. --- chapters/chap05.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index 04ddeaab..ac455abb 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -252,7 +252,7 @@ "source": [ "The first column, which is labeled `Year`, is special. It is the *index* for this `DataFrame`, which means it contains the labels for the rows.\n", "\n", - "Some of the values use scientific notation; for example, `2.516000e+09` is shorthand for $2.516 \\cdot 10^9$ or 2.544 billion.\n", + "Some of the values use scientific notation; for example, `2.516000e+09` is shorthand for $2.516 \\cdot 10^9$ or 2.516 billion.\n", "\n", "`NaN` is a special value that indicates missing data." ] From 4a6dc7ab08506a416dda080ce2e851d800156712 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 10 Sep 2023 12:00:30 -0400 Subject: [PATCH 116/144] Updating examples --- examples/queue.ipynb | 2 +- examples/salmon.ipynb | 6 +++--- examples/trees.ipynb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/queue.ipynb b/examples/queue.ipynb index 743a2097..3980cf92 100644 --- a/examples/queue.ipynb +++ b/examples/queue.ipynb @@ -100,7 +100,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", + "Write an update function that takes as parameters `x`, which is the total number of customers in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", "\n", "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n", "\n", diff --git a/examples/salmon.ipynb b/examples/salmon.ipynb index b63b753c..8d052e80 100644 --- a/examples/salmon.ipynb +++ b/examples/salmon.ipynb @@ -336,7 +336,7 @@ "source": [ "Use `run_simulation` to run generate a prediction for the next 10 years.\n", "\n", - "The plot your prediction along with the original data. Your prediction should pick up where the data leave off." + "Then plot your prediction along with the original data. Your prediction should pick up where the data leave off." ] }, { @@ -409,7 +409,7 @@ "source": [ "## Distribution of net changes\n", "\n", - "To describe the distribution of net changes, write a function called `run_many_simulations` that runs many simulations, saves the final populations in a `ModSimSeries`, and returns the `ModSimSeries`.\n" + "To describe the distribution of net changes, write a function called `run_many_simulations` that runs many simulations, saves the final populations in a `SweepSeries`, and returns the `SweepSeries`." ] }, { @@ -689,7 +689,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/examples/trees.ipynb b/examples/trees.ipynb index b0be531f..9faf211d 100644 --- a/examples/trees.ipynb +++ b/examples/trees.ipynb @@ -899,7 +899,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Taking the derivative of (3) yields\n", + "Taking the derivative of the previous equation (3) yields\n", "\n", "(4) $\\frac{dm}{dt} = D h^{D-1} \\frac{dh}{dt}$\n", "\n", From 047bfb02948e332af03332a9a6a501771b491454 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 10 Sep 2023 12:02:19 -0400 Subject: [PATCH 117/144] Updating chapters --- chapters/chap05.ipynb | 2 +- chapters/chap09.ipynb | 4 ++-- chapters/chap10.ipynb | 3 ++- chapters/chap11.ipynb | 6 ++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index ac455abb..4ca1367b 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -984,7 +984,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 26e145d2..22896d73 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -904,7 +904,7 @@ "tags": [] }, "source": [ - "If you use SymPy to compute and expression, and then want to evaluate that expression in Python, SumPy provides a function called `pycode` that generates Python code:" + "If you use SymPy to compute an expression, and then want to evaluate that expression in Python, SymPy provides a function called `pycode` that generates Python code:" ] }, { @@ -1103,7 +1103,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index f35a6820..674ccb62 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -321,6 +321,7 @@ "\n", "![One queue, one server (left), one queue, two servers (middle), two\n", "queues, two servers (right).](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", + "\n", "*One queue, one server (left), one queue, two servers (middle), two\n", "queues, two servers (right).*\n", "\n", @@ -417,7 +418,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index cddab379..abab6411 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -171,9 +171,7 @@ "\n", "- The number of recoveries we expect per day is $\\gamma i N$; dividing by $N$ yields the fraction of the population that recovers in a day, which is $\\gamma i$.\n", "\n", - "- The number of new infections we expect per day is $\\beta s i N$;\n", - " dividing by $N$ yields the fraction of the population that gets\n", - " infected in a day, which is $\\beta s i$.\n", + "- The number of new infections we expect per day is $\\beta s i N$; dividing by $N$ yields the fraction of the population that gets infected in a day, which is $\\beta s i$.\n", "\n", "The KM model assumes that the population is closed; that is, no one\n", "arrives or departs, so the size of the population, $N$, is constant." @@ -826,7 +824,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.8.16" } }, "nbformat": 4, From 32f6b738f40966c47637917b713bda71d3f4e1b9 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Sun, 10 Sep 2023 12:02:19 -0400 Subject: [PATCH 118/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240635 -> 240612 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index f8b5120dd3565e16707329b439a1303f8f54e51e..c6a3aebcf92dcfc5791d28f235fad686bf39632d 100644 GIT binary patch delta 36864 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 delta 36916 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 From a6d698073f54753fb5fc3e639a2ff27c1d017418 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 15 May 2024 10:10:43 -0400 Subject: [PATCH 119/144] Test the examples directory --- .github/workflows/tests.yml | 36 ++++++++++++++++++++++++++++++++++++ Makefile | 5 +++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..975f3a75 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,36 @@ +name: tests + +on: + push: + branches: [master] + pull_request: + schedule: + # Run on the first of the month + - cron: "0 0 1 * *" + workflow_dispatch: + +jobs: + tests: + name: Tests (${{ matrix.os }}, Python ${{ matrix.python-version }}) + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + python-version: ["3.10"] + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements-dev.txt + + - name: Run tests + run: | + make tests diff --git a/Makefile b/Makefile index 4d980441..6fcc56e7 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PROJECT_NAME = ModSimPy -PYTHON_VERSION = 3.8 +PYTHON_VERSION = 3.10 PYTHON_INTERPRETER = python @@ -29,4 +29,5 @@ clean: tests: - cd chapters; pytest --nbmake chap01.ipynb + cd chapters; pytest --nbmake chap*.ipynb + cd examples; pytest --nbmake *.ipynb From 75eff475dc737316fb114eedb79f88981a7b3562 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 31 Jul 2024 20:46:29 -0400 Subject: [PATCH 120/144] Update tests.yml Don't run tests on macos --- .github/workflows/tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 975f3a75..d114f87b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,8 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + # don't run on macos-latest; it can't install pytables + os: [ubuntu-latest, windows-latest] python-version: ["3.10"] steps: From aa88df33f38512a32dfd018665c4642a55441f9e Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Wed, 31 Jul 2024 20:55:56 -0400 Subject: [PATCH 121/144] Update Makefile Limiting tests --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6fcc56e7..d2bdb316 100644 --- a/Makefile +++ b/Makefile @@ -30,4 +30,5 @@ clean: tests: cd chapters; pytest --nbmake chap*.ipynb - cd examples; pytest --nbmake *.ipynb + # many of the examples don't pass tests without the solutions + # cd examples; pytest --nbmake *.ipynb From b47506ba6e436f6329ced0e95dd0b3f947a97391 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 1 Aug 2024 13:50:37 -0400 Subject: [PATCH 122/144] Updating modsim.py --- chap11.py | 2 +- chap22.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chap11.py b/chap11.py index d8569569..859f4dc4 100644 --- a/chap11.py +++ b/chap11.py @@ -26,7 +26,7 @@ def update_func(t, state, system): def plot_results(S, I, R): S.plot(style='--', label='Susceptible') I.plot(style='-', label='Infected') - R.plot(style=':', label='Resistant') + R.plot(style=':', label='Recovered') decorate(xlabel='Time (days)', ylabel='Fraction of population') diff --git a/chap22.py b/chap22.py index 00fe5be2..a5b5f745 100644 --- a/chap22.py +++ b/chap22.py @@ -21,7 +21,7 @@ def make_system(params): - # convert angle to degrees + # convert angle to radians theta = deg2rad(params.angle) # compute x and y components of velocity From 0bc01a09c5ba606aa06cf7f1331d1403fb3fb007 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 1 Aug 2024 13:58:13 -0400 Subject: [PATCH 123/144] Updating chapters --- chapters/chap01.ipynb | 10 +++++++++- chapters/chap02.ipynb | 10 +++++++++- chapters/chap03.ipynb | 8 ++++++++ chapters/chap04.ipynb | 8 ++++++++ chapters/chap05.ipynb | 20 ++++++++++++++++++-- chapters/chap06.ipynb | 8 ++++++++ chapters/chap07.ipynb | 10 +++++++++- chapters/chap08.ipynb | 10 +++++++++- chapters/chap09.ipynb | 10 +++++++++- chapters/chap10.ipynb | 8 ++++++++ chapters/chap11.ipynb | 8 ++++++++ chapters/chap12.ipynb | 8 ++++++++ chapters/chap13.ipynb | 8 ++++++++ chapters/chap14.ipynb | 8 ++++++++ chapters/chap15.ipynb | 8 ++++++++ chapters/chap16.ipynb | 8 ++++++++ chapters/chap17.ipynb | 8 ++++++++ chapters/chap18.ipynb | 8 ++++++++ chapters/chap19.ipynb | 8 ++++++++ chapters/chap20.ipynb | 8 ++++++++ chapters/chap21.ipynb | 8 ++++++++ chapters/chap22.ipynb | 8 ++++++++ chapters/chap23.ipynb | 8 ++++++++ chapters/chap24.ipynb | 8 ++++++++ chapters/chap25.ipynb | 8 ++++++++ chapters/chap26.ipynb | 8 ++++++++ chapters/chap27.ipynb | 8 ++++++++ 27 files changed, 231 insertions(+), 7 deletions(-) diff --git a/chapters/chap01.ipynb b/chapters/chap01.ipynb index 7bb182f1..c5c409ae 100644 --- a/chapters/chap01.ipynb +++ b/chapters/chap01.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "affecting-malta", @@ -1335,7 +1343,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap02.ipynb b/chapters/chap02.ipynb index f1fc36d1..b02e008c 100644 --- a/chapters/chap02.ipynb +++ b/chapters/chap02.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "victorian-latitude", @@ -1222,7 +1230,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap03.ipynb b/chapters/chap03.ipynb index 21c4f895..1716e158 100644 --- a/chapters/chap03.ipynb +++ b/chapters/chap03.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "signal-format", diff --git a/chapters/chap04.ipynb b/chapters/chap04.ipynb index f233a1f8..239f8a03 100644 --- a/chapters/chap04.ipynb +++ b/chapters/chap04.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "existing-guidance", diff --git a/chapters/chap05.ipynb b/chapters/chap05.ipynb index 4ca1367b..49786750 100644 --- a/chapters/chap05.ipynb +++ b/chapters/chap05.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "wicked-mozambique", @@ -958,13 +966,21 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "id": "political-loading", "metadata": {}, "outputs": [], "source": [ "# Solution goes here" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89bab9ad", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -984,7 +1000,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap06.ipynb b/chapters/chap06.ipynb index 058a6412..1656fe55 100644 --- a/chapters/chap06.ipynb +++ b/chapters/chap06.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "creative-motel", diff --git a/chapters/chap07.ipynb b/chapters/chap07.ipynb index e463dcaf..7bf8dacf 100644 --- a/chapters/chap07.ipynb +++ b/chapters/chap07.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "progressive-travel", @@ -781,7 +789,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap08.ipynb b/chapters/chap08.ipynb index d93ef6a4..2610feb4 100644 --- a/chapters/chap08.ipynb +++ b/chapters/chap08.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "external-reward", @@ -769,7 +777,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap09.ipynb b/chapters/chap09.ipynb index 22896d73..217108dc 100644 --- a/chapters/chap09.ipynb +++ b/chapters/chap09.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "asian-customer", @@ -1103,7 +1111,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/chapters/chap10.ipynb b/chapters/chap10.ipynb index 674ccb62..eb5a456f 100644 --- a/chapters/chap10.ipynb +++ b/chapters/chap10.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "dense-storm", diff --git a/chapters/chap11.ipynb b/chapters/chap11.ipynb index abab6411..3752aeb7 100644 --- a/chapters/chap11.ipynb +++ b/chapters/chap11.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "pressing-munich", diff --git a/chapters/chap12.ipynb b/chapters/chap12.ipynb index 2f576a70..2746d139 100644 --- a/chapters/chap12.ipynb +++ b/chapters/chap12.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "combined-semiconductor", diff --git a/chapters/chap13.ipynb b/chapters/chap13.ipynb index 0f04b715..c6137eb9 100644 --- a/chapters/chap13.ipynb +++ b/chapters/chap13.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "colonial-jacob", diff --git a/chapters/chap14.ipynb b/chapters/chap14.ipynb index f8283be9..3bd644a8 100644 --- a/chapters/chap14.ipynb +++ b/chapters/chap14.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "infrared-shower", diff --git a/chapters/chap15.ipynb b/chapters/chap15.ipynb index 92d125d9..2636a53c 100644 --- a/chapters/chap15.ipynb +++ b/chapters/chap15.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "romantic-speech", diff --git a/chapters/chap16.ipynb b/chapters/chap16.ipynb index 562342c3..3c0b142c 100644 --- a/chapters/chap16.ipynb +++ b/chapters/chap16.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "medieval-johnston", diff --git a/chapters/chap17.ipynb b/chapters/chap17.ipynb index 46c74d6b..56ba08b8 100644 --- a/chapters/chap17.ipynb +++ b/chapters/chap17.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "interracial-guitar", diff --git a/chapters/chap18.ipynb b/chapters/chap18.ipynb index b82e3a16..4cf5efab 100644 --- a/chapters/chap18.ipynb +++ b/chapters/chap18.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "electric-netherlands", diff --git a/chapters/chap19.ipynb b/chapters/chap19.ipynb index 70050688..624e8a10 100644 --- a/chapters/chap19.ipynb +++ b/chapters/chap19.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "mighty-israeli", diff --git a/chapters/chap20.ipynb b/chapters/chap20.ipynb index 0ce7dfe4..e17f53ef 100644 --- a/chapters/chap20.ipynb +++ b/chapters/chap20.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "funded-utilization", diff --git a/chapters/chap21.ipynb b/chapters/chap21.ipynb index 240aa9a2..32bc62f1 100644 --- a/chapters/chap21.ipynb +++ b/chapters/chap21.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "excited-advance", diff --git a/chapters/chap22.ipynb b/chapters/chap22.ipynb index 83941ba4..85d7a56c 100644 --- a/chapters/chap22.ipynb +++ b/chapters/chap22.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "collaborative-people", diff --git a/chapters/chap23.ipynb b/chapters/chap23.ipynb index 6c1d23f8..6d94cd6c 100644 --- a/chapters/chap23.ipynb +++ b/chapters/chap23.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "foreign-pepper", diff --git a/chapters/chap24.ipynb b/chapters/chap24.ipynb index fa25bd5a..0c4de2f8 100644 --- a/chapters/chap24.ipynb +++ b/chapters/chap24.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "august-parks", diff --git a/chapters/chap25.ipynb b/chapters/chap25.ipynb index 4d0155ee..11b06002 100644 --- a/chapters/chap25.ipynb +++ b/chapters/chap25.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "unauthorized-winter", diff --git a/chapters/chap26.ipynb b/chapters/chap26.ipynb index a5fcd00b..af4305b7 100644 --- a/chapters/chap26.ipynb +++ b/chapters/chap26.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "early-drove", diff --git a/chapters/chap27.ipynb b/chapters/chap27.ipynb index 6f3a40f3..6daf5e6b 100644 --- a/chapters/chap27.ipynb +++ b/chapters/chap27.ipynb @@ -1,5 +1,13 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "a8b892c8", + "metadata": {}, + "source": [ + "Printed and electronic copies of *Modeling and Simulation in Python* are available from [No Starch Press](https://nostarch.com/modeling-and-simulation-python) and [Bookshop.org](https://bookshop.org/p/books/modeling-and-simulation-in-python-allen-b-downey/17836697?ean=9781718502161) and [Amazon](https://amzn.to/3y9UxNb)." + ] + }, { "cell_type": "markdown", "id": "early-drove", From b17890138c2edfb43aa47dd1ff5b81649489b009 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 1 Aug 2024 13:58:13 -0400 Subject: [PATCH 124/144] Updating the notebook zip file --- ModSimPyNotebooks.zip | Bin 240612 -> 244852 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ModSimPyNotebooks.zip b/ModSimPyNotebooks.zip index c6a3aebcf92dcfc5791d28f235fad686bf39632d..f83bc09bace305c1e18b22af42f7107aebc52c43 100644 GIT binary patch delta 178393 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 z z1#+`@(W=SQfe8NPkjk=iMp7E7z;_3O4Qa@Av;*AU(}_-Ps_lID$bHCwRTCRjY0e^C zs7lZh>^W7mtFCS@6p8JSm9)KO3A(mE^U;7qlzYnC)nq{^DamQV2Fu8WDV?IsC9Ur4H?DiHYWzHItc&Y%OGgccCF*~9 zN7%rjn+o4{5sM~rsTr?Vj4Hkp!9V}9igg`oZ82jr;C0~rqVMq2cBPYc!>c>!%PAbz zrw+*q@b`7QUWhKA9C@jw-+e76DX>Ofo;o=J`EG=jV$;L#HUNctTXC04)Gj_06fEi* zQ`VaI$J1ATqdzwtoh1yh({$xcbuMg;V3Z#H&P`Y}vcKi08u#67L{QBq@`p7c1x!W& z+TG=XUJR zD;6vK^5S{H^lsmG+Q#({Vx*q(E`kb@o)bP#e{ZF`AI#I&^0kjkVo>NQ)BN+{G9$?~?Musj zJRkFq-CJ7d(UR0BJb@jeW!S90R`yV3iTw2KTiWbtNexCFE~OAe$rLu`^&?ZW0?%Tl zH6k+WU1j`io9v4>H@Kb3Ky~+Q+fzIa?sXd#6Cc7)zeeOL|Avz$bq@Gn&~$D$q`uH^ zgU@A~7X*kj(`fGnqHq;FKF&2%!pC!|7Yu&Q=@Xr%IC6fu zyQh;sfTQjK`Eglvd)I{-Lg=iY1OT9r`m^gI8M*7?`k7zIzjs|U=-b$?3dSPDn*8=D zAu|(mm0fWS4Lu@Z3icA=bN%MF=4Ha|zWoW4bK%VD^vqT9_pUBKvTG2Had}+uRRc^W zi3~#z&%kBx7Ysrgq|K6MJUF~PncHno*3C<2QV ztTIr|%-L%9+@%X0Cp#u^JaCDFE0J-~hk@%S+){fKQzSPeFNVO@n$$0Y`a2A+W+rmq z6dDw9?4PY3=DWh6W^jT9AC<9i+^ZB7@DhphtmSDeKj7?hGb<}hoQWrg-#d#V`I}N78wiv$ zBt3EqM~lRN+PjTfk2wo=VSklbOr%M6cm881QM8$5f9il4G{>CE#J0JaHKb)!>$whM z-z!_iHDzx3 zdd@S-Rw*=%I}5{6IRmb^cJo|aZ9!SVBAS6VEIS`|zPO5J5@VaX^Hy!a^lISDWU57e zig_=-Jm%pKfqu@}Y>aLSLl6_P4^> zuR67Q6JgU5GPnn2dEbZXOthgTmtDGUFn}F^-{0-0&xRrcV!D5vfLcSA<3E?n;5zF>9oLYd%@#QW z1+nKh9+#;v+Yc_{JGWU^FKw>TjP`3i{TF#k>csLrLPx_+Vx^-A|`^H=a-^a7yXajR89|1bu~dvLXnl9sLaZ{%>Ki zH>rhz`a_H&tms0X!4_8~Kk)`zNEEKxHEd8liy5cB$v%4Ln-#$c&q@eT|8=FF_ds2o z(oFeHagm^kPXCk7^v*pBTNuoE%N|hu~NGS_X)hLwT%LrQTTBDOSz&Y;Ua+;bqbL7u3vpP@kE*b zRN=$I_96dhh zc2-m5I}-iVz@`s(#FgyqqRotDHsZp?-NVR{+skE&-yR&$L7J)9GF0LNI*T`{jT$FK z-egFYVD8t=7ewwh zCMZI_^*f@f4duPx^r=7oCmsgMa`Bc9G-}{D!hqXuIdjVb8f?X;KCR5Q#22sAAs#l7 zDbCW7Y*Fzvh{|lo1N2UdMi?R!^G-sInOS%1u1v@{T06U(2xZA(+DPweRmJILRmGW?1`W_faQW9r4A;^jv^#sR z^vIXWB$XA5!Rwr_*@e{OOM7!aqmJSt8Gxg6aXzc;rTA-^RK{=O(wx2L8faoucT?X0 zRRKWu(%FYYg`QM9AVBIlVcWW8oc7m##%+EKsg}7V%=GhV(kDONXbp>!i8Q#)YpVn6 zBWynUP$+1B(2GSgX!-=w$1XoX_J13Ppn@)0@>uX-m$SG@5`LZkUAH&ni(M-d{>xBe zx?zT$z%M9!>%U~j*23DO+Qb<=M-?2rDMQ-A5)6Lv5L3FVJk8ClZLJv?6#Lj79@@>0 zVXFr&A7yfiG^FLp*jpm-OGziF#w|DOUK{Kp!p9nnc_O~to#rcKv6|vj4o4$DGA5z&o{vN{#WsILO_?U9rJLc%p?#ZW; ztqc0eGmFEN5|m<=LBXln+1QKMO`~^CHupuOr$Fm5C`ovM+fyf!<(Gqr8rkprQRSqzxL6H#|X<7}N;lZ)n8#$8w#I(MKRL}i@GlK)OtVUHoNgX8i}WaI7Ts4c64lxp?2q=}bNxPk?p5JV*hS3w;~ zgbs${sY7DAq2@H+R$o=%2`J?{{BkWG7kX>7LZ|V1u~$ZF)!3N+q-fp6P^}`@hWnbo z5@A|xcL>(whoYci(bZ){b9v|knDPt7>p}>jfh;4K7-SO<~BwG!SsS~?zUqb z2j1w7i$@DNILdEFGML=mYPwz+?$R`>$y{-ew&?Lq>Z-@^xP>_Ld1UB3MU0m73)fGm zN;C^Nr?d^?v_hU)2hxF4(j@M6@1{ZA9s_)rn0S=FtExiLANB_99!2L32$FUlr5`<| z+-dNpEl6J-bC<31Ds5$buvwti8%Pm*1Ve%EZCzC;FXVl1a~BmqwXy3X$ws`~u#xiP zNn(ATT3J@1+({U!(GZVc-}hnZvbG_pB`RlH&H>~2K{eXRkPNetPVUCRDylGhS?B%f z2di8N{9*?vU+5#;JO$1JD;Xn>_cr;(wr;cIm<$68!m}^@W;1Jl6TKu%9j7a58}XKl zHdHuXljHTMEQosHV``F_P8$u9i1J3mD{|P^YAcVXch6Y$rnfJ)GvkACU>2y|G7W)7ztG}H%K(10HCFph z>N7E}x$Hy2TmZ&V_7}ZLGKf>P^K5qznN-C(N2BoRChUjC%a?(%2+SdRStje+U%A#a z%7QUVQE${*gNXB&CX(eFcW^CqXggTq>*)hzJAM+l0IEFCNutpe_ z&MQY?L!0FZW3nH}VYaz}+`fOoy-1h6^G-*#Tfl^l$<`kubjXnSo=8UXVnFX#*Tc+W z0JN-OiQ1$vmgAhkO`qH7!w`!=qci?fRc1`M2V00*$r-i@pMG@~(D_-l*|fpyGweAJ z4#I`cx{|y#Y?~u|A~cMTaMiRa>Ja?OBtRnN~0C%lE7^-yCi-re-GG7z095{jH z!Vb)r_blTSNr^v_M&w=2v{z%{M;gqX>EL9aj`4FiA2RqqOMHZDtFVLGq1mhmGp*Hr zBm#YTOxCJDC3coG{@yU|jPA5s-jdufSN@~}cm1OmguD#>CnOJ?iWM{c8{8DDB@asd z^(c!{HK}P)r&A+zw5SE9SRe4Ih}92^#o^6T>$AJIL(1g>1DkKY?>&ayp2kA>wfk~R8gwExcsR% ztTFZdq9WxHAaK9F`g1(F;88I8)X_ z(*|STS-(4WqB^bXvm6!qeHt=hOwK^P-i2#TVE)AMf;dy^p-38im$dole7T-WRo}e3 zy+oCC5+{BY*WDp8K6oCSycVs}NdJfr|=m-xw zEEL`rF7wpBO%}8Ahh(oerZS^57bQU5*%&D-)OVHd%f3|hf+}F=`3lvl6gV%7`sn{g zp0kwL7+#an+)INFjx3!fo2#_A@{{v9c1rm5aim6MVL(NG1K}JatJx6G#sh(G&<0id z#_P(jC9(CzCl#BI^ma(yzw+|p^?E!b^^#Zp+e|5TuC?sa5y5~by_m+{Tw@aS)v=;W z)mENReDYI9`pXE)cP^pgXTIE2Z%xG!Ux2DoT?@`LxI$o*;VKa?;>G$;1x+(sB5+Jy zW$yOm<~CPVE#PpD%`?gbs}jkaiE;WBVaA$Si>DgHPYr9V!{|ZGZGX=AeCt#=ajMyPQ8(3WMOwuC26)R$<(jzKmf{BBUS6r6n zQxVC}L~1i@HqEl853@A89^w{o#eoUJ}z)^+q{$1>d|3Fq#_hpwDEvAnJj^ z6H!E>B9TE7#DxwH``$yGlz9x2B`WwGuw|xgNqhsk(5EXX5uv}-T=xc^EDMs=_>D&z z1b7~;bfnw)PIiTVAk?(1)D&;{(bzLzCAxPY;&GnSxna_K5=r=bwrrxw?Rnux3Rg|9 zf_&g+wznS2i7^&3kcg0^5Y((TZ*w3c{uNc21DuHyyuhrW*y>KAag;|BUWk^=OJ<|{ zNlZ;68TZ^~!rhO{i$D&d))N8DjU= z0|B@Zn^peT=`9U;P?U(Fs%eCT&Qg{=4!y_C*V=V#uC#)qQhj|lrpH+ zcm*O^Hj+kuo7O*tw4w9pN1%DT`j!;-_9Rwq<0B18_|iLeI!1WDi!Nwg(#{M;XIm>T zV8=nAEPPQO_aZ(QDrfpFRqV0I=b24KTQZtgK6{rme2W&W(r+xGR2-dC`zY_})Obqv zl-9W$B$|JbRrxiWzu3oLah^^;*Ybiea+Ra_u@{%RZC9#AV3~no1lfEoo}>@n75fXQ zNS;tp_K{x2><*XYA%09355La5zhx0S6|T?rxr%kP2$(*71|@IyXXouir0$`M-TiF! zOvGl`ezh*(T*Rq^wFU15mB+=;;oQ|q^FCvy2Gd8fJ6+mlV%;8vcb`n4X+uKB!iEHS ztILj%la#cp`vg0rZtwLqu{PYMX zI@jOSoW$5>4I+r128wMz z#LFyDb`|idVzSxeVsJ~aT45WVrPdprtUOt_%i0S^E#a_2|0Ue=iQnttK|;y&bCOHH z$56%fy=OTkydsEzz);T$gRZdiQaFYt-%o$JbKxm^4hzy27X>o*NE@2MfmH_G0|(z9 zt;tlVe1(e7r5_?re?}_&7A!%1>G=lw`m4vtx;M6^r9b|`FmL}toqDAjg;yU%kjDHT z!D$Kyd}Y|^s)>%^wK33iql*sRop0kMmk#tv;p(d;na2}PpUhZ48tShe=@@Z*F=D1x zoPXvL|E)po*vYXjGExU4+9#JlXFinQoj_N@@S`C;Q9eWcYzpk9M+y2f;2=l%qsA0b zamYD@aMz%W{VI)idm#Gr^R*9f)2)G~@tvegpO2#r<)@oH7f~JtO49s-=>@n`-l`*b zmtJUTCKg`?4KEQ}R{$7uDNq)5YyHx+%C;03O@O+4odmT2lL%00kxxmh(uaXbcTxAR zrK0P=d3@A^>m=PVkOOp6K;;aWeFydET6%;E3cPb8h2n!6aBq_0G@xI1P*0ErVA0_q zk}5?u5Cst`;u?4@0(y*hQz};;WJrJtxK@ev97IouihiBswgR2qK_$ITayo&G$WW=S zlgMh0@Nclt51>3eJW3;W9h{_U_iuV{#zI!?M0DxdW z0Du-i4!HiHAivqZ+-v}t(IyHRY@h&y3l#Vp({(4;g9cf&`sHngL*a&ri&ngYhIYM* z^e;^$AQSQ-N&vvs{5F;T>W0F9@V~SEZ?O*@BWZ-G0Dv@$f3g+6-JXA}JS)6qCF4YR zp4wdiU`h3#Ot!CX;vdGK2+922#!%ajGv1^C0F~Bl22lK`WqW1+YS|Obz=SKLrXY>m z)OhT;Xnn)zd2Xz{H!eQ!GSpC!6vC;Ni*-gnd6R01~2O&@O){u|SKyEsXKR8}bbPprZ>i}eo{&i!v}jk;ocfe-+Q zllmu??Mov32cs;#<#)qnab-dZ0AS1DHuFsJ5958!{M~;872#@5bN~Rp-EF4AJ?IF>RZCuGcRhT#tI zdPtGO(yp1m>-j4z?QMpg`-Z{$U!dAsj{hqt$Zd2|{15v7-8%j{U+gwoqWj0vzKUCx z{?ZT19>j;9kPJfB{eLQ%GCu$S From 9f1cd31a8b69999ffd61e02cfc3d0e78cf5fe4dd Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 2 Sep 2024 08:02:29 -0400 Subject: [PATCH 125/144] Updating examples --- examples/salmon.ipynb | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/salmon.ipynb b/examples/salmon.ipynb index 8d052e80..58818287 100644 --- a/examples/salmon.ipynb +++ b/examples/salmon.ipynb @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -161,16 +161,16 @@ "source": [ "## Modeling changes\n", "\n", - "To see how the population changes from year-to-year, I'll use `diff` to compute the absolute difference between each year and the next.\n" + "To see how the population changes from year-to-year, I'll use `diff` to compute the absolute difference between each year and the next and `shift` to align the changes with the year they happened." ] }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "abs_diffs = pop_series.diff()\n", + "abs_diffs = pop_series.diff().shift(-1)\n", "abs_diffs" ] }, @@ -183,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -195,12 +195,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "These relative differences are observed annual net growth rates. So let's drop the `0` and save them." + "These relative differences are observed annual net growth rates.\n", + "So let's drop the `NaN` and save them." ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -217,7 +218,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -237,7 +238,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -256,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -276,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -292,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -308,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -341,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -357,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -370,8 +371,7 @@ " \"\"\"\n", " for i in range(iters):\n", " results = run_simulation(system, update_func)\n", - " results.plot(color='gray', label='_nolegend', \n", - " linewidth=1, alpha=0.3)" + " results.plot(color='gray', label='', linewidth=1, alpha=0.3)" ] }, { @@ -385,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -414,7 +414,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -432,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -448,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -464,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -481,7 +481,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -500,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -516,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -532,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -567,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -585,7 +585,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -601,7 +601,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -617,7 +617,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -633,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -649,7 +649,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -665,7 +665,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -689,7 +689,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.16" + "version": "3.10.13" } }, "nbformat": 4, From 0db87da09c5e47bff48e9bec1f190e26f9fdf598 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Mon, 2 Sep 2024 08:04:55 -0400 Subject: [PATCH 126/144] Updating build.sh --- examples/build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/build.sh b/examples/build.sh index 56d540b8..304386ff 100644 --- a/examples/build.sh +++ b/examples/build.sh @@ -12,6 +12,7 @@ header.ipynb \ insulin.ipynb \ plague.ipynb \ queue.ipynb \ +# salmon.ipynb \ does not run without solutions spiderman.ipynb \ throwingaxe.ipynb \ trees.ipynb \ From 1801b17d9df914fc4ecadefe62152e56bb85aea4 Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 22 May 2025 14:26:10 -0400 Subject: [PATCH 127/144] Cleanup --- jupyter/modsim.py | 1087 --------------------------------------------- 1 file changed, 1087 deletions(-) delete mode 100644 jupyter/modsim.py diff --git a/jupyter/modsim.py b/jupyter/modsim.py deleted file mode 100644 index b59bd97c..00000000 --- a/jupyter/modsim.py +++ /dev/null @@ -1,1087 +0,0 @@ -""" -Code from Modeling and Simulation in Python. - -Copyright 2020 Allen Downey - -MIT License: https://opensource.org/licenses/MIT -""" - -import logging - -logger = logging.getLogger(name="modsim.py") - -# make sure we have Python 3.6 or better -import sys - -if sys.version_info < (3, 6): - logger.warning("modsim.py depends on Python 3.6 features.") - -import inspect - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -import scipy - -from scipy.interpolate import interp1d -from scipy.interpolate import InterpolatedUnivariateSpline - -from scipy.integrate import odeint -from scipy.integrate import solve_ivp - -from types import SimpleNamespace -from copy import copy - -import pint - -units = pint.UnitRegistry() -Quantity = units.Quantity - - -def flip(p=0.5): - """Flips a coin with the given probability. - - p: float 0-1 - - returns: boolean (True or False) - """ - return np.random.random() < p - - -def cart2pol(x, y, z=None): - """Convert Cartesian coordinates to polar. - - x: number or sequence - y: number or sequence - z: number or sequence (optional) - - returns: theta, rho OR theta, rho, z - """ - x = np.asarray(x) - y = np.asarray(y) - - rho = np.hypot(x, y) - theta = np.arctan2(y, x) - - if z is None: - return theta, rho - else: - return theta, rho, z - - -def pol2cart(theta, rho, z=None): - """Convert polar coordinates to Cartesian. - - theta: number or sequence in radians - rho: number or sequence - z: number or sequence (optional) - - returns: x, y OR x, y, z - """ - x = rho * np.cos(theta) - y = rho * np.sin(theta) - - if z is None: - return x, y - else: - return x, y, z - -from numpy import linspace - -def linrange(start, stop, step=1, **options): - """Make an array of equally spaced values. - - start: first value - stop: last value (might be approximate) - step: difference between elements (should be consistent) - - returns: NumPy array - """ - n = int(round((stop-start) / step)) - return linspace(start, stop, n+1, **options) - - -def leastsq(error_func, x0, *args, **options): - """Find the parameters that yield the best fit for the data. - - `x0` can be a sequence, array, Series, or Params - - Positional arguments are passed along to `error_func`. - - Keyword arguments are passed to `scipy.optimize.leastsq` - - error_func: function that computes a sequence of errors - x0: initial guess for the best parameters - args: passed to error_func - options: passed to leastsq - - :returns: Params object with best_params and ModSimSeries with details - """ - # override `full_output` so we get a message if something goes wrong - options["full_output"] = True - - # run leastsq - t = scipy.optimize.leastsq(error_func, x0=x0, args=args, **options) - best_params, cov_x, infodict, mesg, ier = t - - # pack the results into a ModSimSeries object - details = ModSimSeries(infodict) - details.set(cov_x=cov_x, mesg=mesg, ier=ier) - - # if we got a Params object, we should return a Params object - if isinstance(x0, Params): - best_params = Params(Series(best_params, x0.index)) - - # return the best parameters and details - return best_params, details - - -def minimize_scalar(min_func, bounds, *args, **options): - """Finds the input value that minimizes `min_func`. - - Wrapper for - https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - - min_func: computes the function to be minimized - bounds: sequence of two values, lower and upper bounds of the range to be searched - args: any additional positional arguments are passed to min_func - options: any keyword arguments are passed as options to minimize_scalar - - returns: ModSimSeries object - """ - try: - min_func(bounds[0], *args) - except Exception as e: - msg = """Before running scipy.integrate.minimize_scalar, I tried - running the function you provided with the - lower bound, and I got the following error:""" - logger.error(msg) - raise (e) - - underride(options, xatol=1e-3) - - res = scipy.optimize.minimize_scalar( - min_func, - bracket=bounds, - bounds=bounds, - args=args, - method="bounded", - options=options, - ) - - if not res.success: - msg = ( - """scipy.optimize.minimize_scalar did not succeed. - The message it returned is %s""" - % res.message - ) - raise Exception(msg) - - return res - - -def maximize_scalar(max_func, bounds, *args, **options): - """Finds the input value that maximizes `max_func`. - - Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html - - min_func: computes the function to be maximized - bounds: sequence of two values, lower and upper bounds of the - range to be searched - args: any additional positional arguments are passed to max_func - options: any keyword arguments are passed as options to minimize_scalar - - returns: ModSimSeries object - """ - def min_func(*args): - return -max_func(*args) - - res = minimize_scalar(min_func, bounds, *args, **options) - - # we have to negate the function value before returning res - res.fun = -res.fun - return res - - -def minimize_golden(min_func, bracket, *args, **options): - """Find the minimum of a function by golden section search. - - Based on - https://en.wikipedia.org/wiki/Golden-section_search#Iterative_algorithm - - :param min_func: function to be minimized - :param bracket: interval containing a minimum - :param args: arguments passes to min_func - :param options: rtol and maxiter - - :return: ModSimSeries - """ - maxiter = options.get("maxiter", 100) - rtol = options.get("rtol", 1e-3) - - def success(**kwargs): - return ModSimSeries(dict(success=True, **kwargs)) - - def failure(**kwargs): - return ModSimSeries(dict(success=False, **kwargs)) - - a, b = bracket - ya = min_func(a, *args) - yb = min_func(b, *args) - - phi = 2 / (np.sqrt(5) - 1) - h = b - a - c = b - h / phi - yc = min_func(c, *args) - - d = a + h / phi - yd = min_func(d, *args) - - if yc > ya or yc > yb: - return failure(message="The bracket is not well-formed.") - - for i in range(maxiter): - - # check for convergence - if abs(h / c) < rtol: - return success(x=c, fun=yc) - - if yc < yd: - b, yb = d, yd - d, yd = c, yc - h = b - a - c = b - h / phi - yc = min_func(c, *args) - else: - a, ya = c, yc - c, yc = d, yd - h = b - a - d = a + h / phi - yd = min_func(d, *args) - - # if we exited the loop, too many iterations - return failure(root=c, message="maximum iterations = %d exceeded" % maxiter) - - -def maximize_golden(max_func, bracket, *args, **options): - """Find the maximum of a function by golden section search. - - :param min_func: function to be maximized - :param bracket: interval containing a maximum - :param args: arguments passes to min_func - :param options: rtol and maxiter - - :return: ModSimSeries - """ - - def min_func(*args): - return -max_func(*args) - - res = minimize_golden(min_func, bracket, *args, **options) - - # we have to negate the function value before returning res - res.fun = -res.fun - return res - - -def minimize_powell(min_func, x0, *args, **options): - """Finds the input value that minimizes `min_func`. - Wrapper for https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html - min_func: computes the function to be minimized - x0: initial guess - args: any additional positional arguments are passed to min_func - options: any keyword arguments are passed as options to minimize_scalar - returns: ModSimSeries object - """ - underride(options, tol=1e-3) - - res = scipy.optimize.minimize(min_func, x0, *args, **options) - - return ModSimSeries(res) - - -# make aliases for minimize and maximize -minimize = minimize_golden -maximize = maximize_golden - - -def run_solve_ivp(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - `t_0` with the start time, and `t_end` with the end time. - - It can contain any other parameters required by the slope function. - - `options` can be any legal options of `scipy.integrate.solve_ivp` - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - system = remove_units(system) - - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # make sure `system` contains `t_end` - if not hasattr(system, "t_end"): - msg = """It looks like `system` does not contain `t_end` - as a system variable. `t_end` should be the - final time:""" - raise ValueError(msg) - - # the default value for t_0 is 0 - t_0 = getattr(system, "t_0", 0) - - # try running the slope function with the initial conditions - try: - slope_func(t_0, system.init, system) - except Exception as e: - msg = """Before running scipy.integrate.solve_ivp, I tried - running the slope function you provided with the - initial conditions in `system` and `t=t_0` and I got - the following error:""" - logger.error(msg) - raise (e) - - # get the list of event functions - events = options.get('events', []) - - # if there's only one event function, put it in a list - try: - iter(events) - except TypeError: - events = [events] - - for event_func in events: - # make events terminal unless otherwise specified - if not hasattr(event_func, 'terminal'): - event_func.terminal = True - - # test the event function with the initial conditions - try: - event_func(t_0, system.init, system) - except Exception as e: - msg = """Before running scipy.integrate.solve_ivp, I tried - running the event function you provided with the - initial conditions in `system` and `t=t_0` and I got - the following error:""" - logger.error(msg) - raise (e) - - # get dense output unless otherwise specified - underride(options, dense_output=True) - - # run the solver - bunch = solve_ivp(slope_func, [t_0, system.t_end], system.init, - args=[system], **options) - - # separate the results from the details - y = bunch.pop("y") - t = bunch.pop("t") - - # get the column names from `init`, if possible - if hasattr(system.init, 'index'): - columns = system.init.index - else: - columns = range(len(system.init)) - - # evaluate the results at equally-spaced points - if options.get('dense_output', False): - try: - num = system.num - except AttributeError: - num = 51 - t_final = t[-1] - t_array = linspace(t_0, t_final, num) - y_array = bunch.sol(t_array) - - # pack the results into a TimeFrame - results = TimeFrame(y_array.T, index=t_array, - columns=columns) - else: - results = TimeFrame(y.T, index=t, - columns=columns) - - return results, bunch - - -def check_system(system, slope_func): - """Make sure the system object has the fields we need for run_ode_solver. - - :param system: - :param slope_func: - :return: - """ - # make sure `system` contains `init` - if not hasattr(system, "init"): - msg = """It looks like `system` does not contain `init` - as a system variable. `init` should be a State - object that specifies the initial condition:""" - raise ValueError(msg) - - # make sure `system` contains `t_end` - if not hasattr(system, "t_end"): - msg = """It looks like `system` does not contain `t_end` - as a system variable. `t_end` should be the - final time:""" - raise ValueError(msg) - - # the default value for t_0 is 0 - t_0 = getattr(system, "t_0", 0) - - # get the initial conditions - init = system.init - - # get t_end - t_end = system.t_end - - # if dt is not specified, take 100 steps - try: - dt = system.dt - except AttributeError: - dt = t_end / 100 - - return init, t_0, t_end, dt - - -def run_euler(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - `t_end` with the end time, and `dt` with the time step. - - `system` may contain `t_0` to override the default, 0 - - It can contain any other parameters required by the slope function. - - `options` can be ... - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # the default message if nothing changes - msg = "The solver successfully reached the end of the integration interval." - - # get parameters from system - init, t_0, t_end, dt = check_system(system, slope_func) - - # make the TimeFrame - frame = TimeFrame(columns=init.index) - frame.row[t_0] = init - ts = linrange(t_0, t_end, dt) * get_units(t_end) - - # run the solver - for t1 in ts: - y1 = frame.row[t1] - slopes = slope_func(y1, t1, system) - y2 = [y + slope * dt for y, slope in zip(y1, slopes)] - t2 = t1 + dt - frame.row[t2] = y2 - - details = ModSimSeries(dict(message="Success")) - return frame, details - - -def run_ralston(system, slope_func, **options): - """Computes a numerical solution to a differential equation. - - `system` must contain `init` with initial conditions, - and `t_end` with the end time. - - `system` may contain `t_0` to override the default, 0 - - It can contain any other parameters required by the slope function. - - `options` can be ... - - system: System object - slope_func: function that computes slopes - - returns: TimeFrame - """ - # the default message if nothing changes - msg = "The solver successfully reached the end of the integration interval." - - # get parameters from system - init, t_0, t_end, dt = check_system(system, slope_func) - - # make the TimeFrame - frame = TimeFrame(columns=init.index) - frame.row[t_0] = init - ts = linrange(t_0, t_end, dt) * get_units(t_end) - - event_func = options.get("events", None) - z1 = np.nan - - def project(y1, t1, slopes, dt): - t2 = t1 + dt - y2 = [y + slope * dt for y, slope in zip(y1, slopes)] - return y2, t2 - - # run the solver - for t1 in ts: - y1 = frame.row[t1] - - # evaluate the slopes at the start of the time step - slopes1 = slope_func(y1, t1, system) - - # evaluate the slopes at the two-thirds point - y_mid, t_mid = project(y1, t1, slopes1, 2 * dt / 3) - slopes2 = slope_func(y_mid, t_mid, system) - - # compute the weighted sum of the slopes - slopes = [(k1 + 3 * k2) / 4 for k1, k2 in zip(slopes1, slopes2)] - - # compute the next time stamp - y2, t2 = project(y1, t1, slopes, dt) - - # check for a terminating event - if event_func: - z2 = event_func(y2, t2, system) - if z1 * z2 < 0: - scale = magnitude(z1 / (z1 - z2)) - y2, t2 = project(y1, t1, slopes, scale * dt) - frame.row[t2] = y2 - msg = "A termination event occurred." - break - else: - z1 = z2 - - # store the results - frame.row[t2] = y2 - - details = ModSimSeries(dict(success=True, message=msg)) - return frame, details - - -run_ode_solver = run_ralston - -# TODO: Implement leapfrog - - -def fsolve(func, x0, *args, **options): - """Return the roots of the (non-linear) equations - defined by func(x) = 0 given a starting estimate. - - Uses scipy.optimize.fsolve, with extra error-checking. - - func: function to find the roots of - x0: scalar or array, initial guess - args: additional positional arguments are passed along to fsolve, - which passes them along to func - - returns: solution as an array - """ - # make sure we can run the given function with x0 - try: - func(x0, *args) - except Exception as e: - msg = """Before running scipy.optimize.fsolve, I tried - running the error function you provided with the x0 - you provided, and I got the following error:""" - logger.error(msg) - raise (e) - - # make the tolerance more forgiving than the default - underride(options, xtol=1e-6) - - # run fsolve - result = scipy.optimize.fsolve(func, x0, args=args, **options) - - return result - - -def crossings(series, value): - """Find the labels where the series passes through value. - - The labels in series must be increasing numerical values. - - series: Series - value: number - - returns: sequence of labels - """ - values = series.values - value - interp = InterpolatedUnivariateSpline(series.index, values) - return interp.roots() - - -def has_nan(a): - """Checks whether the an array contains any NaNs. - - :param a: NumPy array or Pandas Series - :return: boolean - """ - return np.any(np.isnan(a)) - - -def is_strictly_increasing(a): - """Checks whether the elements of an array are strictly increasing. - - :param a: NumPy array or Pandas Series - :return: boolean - """ - return np.all(np.diff(a) > 0) - - -def interpolate(series, **options): - """Creates an interpolation function. - - series: Series object - options: any legal options to scipy.interpolate.interp1d - - returns: function that maps from the index to the values - """ - if has_nan(series.index): - msg = """The Series you passed to interpolate contains - NaN values in the index, which would result in - undefined behavior. So I'm putting a stop to that.""" - raise ValueError(msg) - - if not is_strictly_increasing(series.index): - msg = """The Series you passed to interpolate has an index - that is not strictly increasing, which would result in - undefined behavior. So I'm putting a stop to that.""" - raise ValueError(msg) - - # make the interpolate function extrapolate past the ends of - # the range, unless `options` already specifies a value for `fill_value` - underride(options, fill_value="extrapolate") - - # call interp1d, which returns a new function object - x = series.index - y = series.values - interp_func = interp1d(x, y, **options) - return interp_func - - -def interpolate_inverse(series, **options): - """Interpolate the inverse function of a Series. - - series: Series object, represents a mapping from `a` to `b` - options: any legal options to scipy.interpolate.interp1d - - returns: interpolation object, can be used as a function - from `b` to `a` - """ - inverse = Series(series.index, index=series.values) - interp_func = interpolate(inverse, **options) - return interp_func - - -def gradient(series, **options): - """Computes the numerical derivative of a series. - - If the elements of series have units, they are dropped. - - series: Series object - options: any legal options to np.gradient - - returns: Series, same subclass as series - """ - x = series.index - y = series.values - - a = np.gradient(y, x, **options) - return series.__class__(a, series.index) - - -def source_code(obj): - """Prints the source code for a given object. - - obj: function or method object - """ - print(inspect.getsource(obj)) - - -def underride(d, **options): - """Add key-value pairs to d only if key is not in d. - - If d is None, create a new dictionary. - - d: dictionary - options: keyword args to add to d - """ - if d is None: - d = {} - - for key, val in options.items(): - d.setdefault(key, val) - - return d - - -def contour(df, **options): - """Makes a contour plot from a DataFrame. - - Wrapper for plt.contour - https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.pyplot.contour.html - - Note: columns and index must be numerical - - df: DataFrame - options: passed to plt.contour - """ - fontsize = options.pop("fontsize", 12) - underride(options, cmap="viridis") - x = df.columns - y = df.index - X, Y = np.meshgrid(x, y) - cs = plt.contour(X, Y, df, **options) - plt.clabel(cs, inline=1, fontsize=fontsize) - - -def savefig(filename, **options): - """Save the current figure. - - Keyword arguments are passed along to plt.savefig - - https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html - - filename: string - """ - print("Saving figure to file", filename) - plt.savefig(filename, **options) - - -def decorate(**options): - """Decorate the current axes. - - Call decorate with keyword arguments like - decorate(title='Title', - xlabel='x', - ylabel='y') - - The keyword arguments can be any of the axis properties - https://matplotlib.org/api/axes_api.html - """ - ax = plt.gca() - ax.set(**options) - - handles, labels = ax.get_legend_handles_labels() - if handles: - ax.legend(handles, labels) - - plt.tight_layout() - - -def remove_from_legend(bad_labels): - """Removes some labels from the legend. - - bad_labels: sequence of strings - """ - ax = plt.gca() - handles, labels = ax.get_legend_handles_labels() - handle_list, label_list = [], [] - for handle, label in zip(handles, labels): - if label not in bad_labels: - handle_list.append(handle) - label_list.append(label) - ax.legend(handle_list, label_list) - - -class SettableNamespace(SimpleNamespace): - """Contains a collection of parameters. - - Used to make a System object. - - Takes keyword arguments and stores them as attributes. - """ - def __init__(self, namespace=None, **kwargs): - super().__init__() - if namespace: - self.__dict__.update(namespace.__dict__) - self.__dict__.update(kwargs) - - def get(self, name, default=None): - """Look up a variable. - - name: string varname - default: value returned if `name` is not present - """ - try: - return self.__getattribute__(name, default) - except AttributeError: - return default - - def set(self, **variables): - """Make a copy and update the given variables. - - returns: Params - """ - new = copy(self) - new.__dict__.update(variables) - return new - - -def magnitude(x): - """Returns the magnitude of a Quantity or number. - - x: Quantity or number - - returns: number - """ - return x.magnitude if hasattr(x, 'magnitude') else x - - -def remove_units(namespace): - """Removes units from the values in a Namespace. - - Only removes units from top-level values; - does not traverse nested values. - - returns: new Namespace object - """ - res = copy(namespace) - for label, value in res.__dict__.items(): - if isinstance(value, pd.Series): - value = remove_units_series(value) - res.__dict__[label] = magnitude(value) - return res - - -def remove_units_series(series): - """Removes units from the values in a Series. - - Only removes units from top-level values; - does not traverse nested values. - - returns: new Series object - """ - res = copy(series) - for label, value in res.iteritems(): - res[label] = magnitude(value) - return res - - -class System(SettableNamespace): - """Contains system parameters and their values. - - Takes keyword arguments and stores them as attributes. - """ - pass - - -class Params(SettableNamespace): - """Contains system parameters and their values. - - Takes keyword arguments and stores them as attributes. - """ - pass - - -def State(**variables): - """Contains the values of state variables.""" - return pd.Series(variables) - - -def TimeSeries(*args, **kwargs): - """ - """ - if args or kwargs: - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Time' - if 'name' not in kwargs: - series.name = 'Quantity' - return series - - -def SweepSeries(*args, **kwargs): - """ - """ - if args or kwargs: - series = pd.Series(*args, **kwargs) - else: - series = pd.Series([], dtype=np.float64) - - series.index.name = 'Parameter' - if 'name' not in kwargs: - series.name = 'Metric' - return series - - -def TimeFrame(*args, **kwargs): - """DataFrame that maps from time to State. - """ - return pd.DataFrame(*args, **kwargs) - - -def SweepFrame(*args, **kwargs): - """DataFrame that maps from parameter value to SweepSeries. - """ - return pd.DataFrame(*args, **kwargs) - - -def Vector(x, y, z=None, **options): - """ - """ - if z is None: - return pd.Series(dict(x=x, y=y), **options) - else: - return pd.Series(dict(x=x, y=y, z=z), **options) - - -## Vector functions (should work with any sequence) - -def vector_mag(v): - """Vector magnitude.""" - return np.sqrt(np.dot(v, v)) - - -def vector_mag2(v): - """Vector magnitude squared.""" - return np.dot(v, v) - - -def vector_angle(v): - """Angle between v and the positive x axis. - - Only works with 2-D vectors. - - returns: angle in radians - """ - assert len(v) == 2 - x, y = v - return np.arctan2(y, x) - - -def vector_polar(v): - """Vector magnitude and angle. - - returns: (number, angle in radians) - """ - return vector_mag(v), vector_angle(v) - - -def vector_hat(v): - """Unit vector in the direction of v. - - returns: Vector or array - """ - # check if the magnitude of the Quantity is 0 - mag = vector_mag(v) - if mag == 0: - return v - else: - return v / mag - - -def vector_perp(v): - """Perpendicular Vector (rotated left). - - Only works with 2-D Vectors. - - returns: Vector - """ - assert len(v) == 2 - x, y = v - return Vector(-y, x) - - -def vector_dot(v, w): - """Dot product of v and w. - - returns: number or Quantity - """ - return np.dot(v, w) - - -def vector_cross(v, w): - """Cross product of v and w. - - returns: number or Quantity for 2-D, Vector for 3-D - """ - res = np.cross(v, w) - - if len(v) == 3: - return Vector(*res) - else: - return res - - -def vector_proj(v, w): - """Projection of v onto w. - - returns: array or Vector with direction of w and units of v. - """ - w_hat = vector_hat(w) - return vector_dot(v, w_hat) * w_hat - - -def scalar_proj(v, w): - """Returns the scalar projection of v onto w. - - Which is the magnitude of the projection of v onto w. - - returns: scalar with units of v. - """ - return vector_dot(v, vector_hat(w)) - - -def vector_dist(v, w): - """Euclidean distance from v to w, with units.""" - if isinstance(v, list): - v = np.asarray(v) - return vector_mag(v - w) - - -def vector_diff_angle(v, w): - """Angular difference between two vectors, in radians. - """ - if len(v) == 2: - return vector_angle(v) - vector_angle(w) - else: - # TODO: see http://www.euclideanspace.com/maths/algebra/ - # vectors/angleBetween/ - raise NotImplementedError() - - -def plot_segment(A, B, **options): - """Plots a line segment between two Vectors. - - For 3-D vectors, the z axis is ignored. - - Additional options are passed along to plot(). - - A: Vector - B: Vector - """ - xs = A.x, B.x - ys = A.y, B.y - plot(xs, ys, **options) - - -from time import sleep -from IPython.display import clear_output - -def animate(results, draw_func, *args, interval=None): - """Animate results from a simulation. - - results: TimeFrame - draw_func: function that draws state - interval: time between frames in seconds - """ - plt.figure() - try: - for t, state in results.iterrows(): - draw_func(t, state, *args) - plt.show() - if interval: - sleep(interval) - clear_output(wait=True) - draw_func(t, state, *args) - plt.show() - except KeyboardInterrupt: - pass From 7996c85a4d9090ce03c66b9f9323fb3426a11dbd Mon Sep 17 00:00:00 2001 From: Allen Downey Date: Thu, 22 May 2025 14:35:21 -0400 Subject: [PATCH 128/144] Removing old stuff --- notebooks/chap01.ipynb | 538 - notebooks/chap02.ipynb | 917 - notebooks/chap03.ipynb | 595 - notebooks/chap04.ipynb | 667 - notebooks/chap05.ipynb | 594 - notebooks/chap06.ipynb | 527 - notebooks/chap07.ipynb | 523 - notebooks/chap08.ipynb | 572 - notebooks/chap09.ipynb | 624 - notebooks/chap09sympy.ipynb | 632 - notebooks/chap10.ipynb | 447 - notebooks/chap11.ipynb | 463 - notebooks/chap12.ipynb | 877 - notebooks/chap13.ipynb | 517 - notebooks/chap14.ipynb | 475 - notebooks/chap15.ipynb | 318 - notebooks/chap16.ipynb | 842 - notebooks/chap16sympy.ipynb | 464 - notebooks/chap17.ipynb | 273 - notebooks/chap18.ipynb | 533 - notebooks/chap20.ipynb | 643 - notebooks/chap21.ipynb | 514 - notebooks/chap22.ipynb | 1238 - notebooks/chap23.ipynb | 571 - notebooks/chap24.ipynb | 640 - notebooks/chap25.ipynb | 944 - notebooks/data/DataOWall.csv | 867 - ...C2018-Report-30-2017-Activities-Page11.pdf | Bin 28967 -> 0 bytes .../USASAC2018-Report-30-2017-Activities.pdf | Bin 4817307 -> 0 bytes notebooks/data/USASAC_Report_2017_Page18.png | Bin 61252 -> 0 bytes notebooks/data/World_population_estimates.csv | 68 - .../data/World_population_estimates.html | 2634 - .../data/World_population_estimates2.csv | 68 - .../data/World_population_estimates3.csv | 46 - notebooks/data/baseball_drag.csv | 17 - notebooks/data/baseball_drag.png | Bin 250310 -> 0 bytes notebooks/data/glucose_insulin.csv | 25 - notebooks/diagrams/RC_Divider.png | Bin 1752 -> 0 bytes notebooks/diagrams/RC_Divider.svg | 193 - notebooks/diagrams/queue.png | Bin 8874 -> 0 bytes notebooks/diagrams/throwingaxe1.png | Bin 27102 -> 0 bytes notebooks/diagrams/throwingaxe2.png | Bin 34525 -> 0 bytes notebooks/examples/bigbelly.ipynb | 1104 - notebooks/examples/world_pop_transition.ipynb | 233 - notebooks/figs/README | 1 - notebooks/filter.ipynb | 900 - notebooks/glucose.ipynb | 719 - notebooks/hopper.ipynb | 1342 - notebooks/insulin.ipynb | 316 - notebooks/jump.ipynb | 674 - notebooks/jump2.ipynb | 924 - notebooks/kitten.ipynb | 399 - notebooks/lotka-volterra.ipynb | 944 - notebooks/modsim.html | 58638 ---------------- notebooks/oem.ipynb | 1039 - notebooks/pendulum.ipynb | 4548 -- notebooks/pendulum2.ipynb | 4548 -- notebooks/pendulum_sympy.ipynb | 978 - notebooks/queue.ipynb | 553 - notebooks/rabbits.ipynb | 773 - notebooks/rabbits2.ipynb | 399 - notebooks/rabbits3.ipynb | 630 - notebooks/salmon.ipynb | 703 - notebooks/spiderman.ipynb | 838 - notebooks/test_install.py | 48 - notebooks/throwingaxe.ipynb | 487 - notebooks/trees.ipynb | 972 - notebooks/variables_r_strange.ipynb | 490 - notebooks/wall.ipynb | 930 - notebooks/yoyo.ipynb | 519 - 70 files changed, 104515 deletions(-) delete mode 100644 notebooks/chap01.ipynb delete mode 100644 notebooks/chap02.ipynb delete mode 100644 notebooks/chap03.ipynb delete mode 100644 notebooks/chap04.ipynb delete mode 100644 notebooks/chap05.ipynb delete mode 100644 notebooks/chap06.ipynb delete mode 100644 notebooks/chap07.ipynb delete mode 100644 notebooks/chap08.ipynb delete mode 100644 notebooks/chap09.ipynb delete mode 100644 notebooks/chap09sympy.ipynb delete mode 100644 notebooks/chap10.ipynb delete mode 100644 notebooks/chap11.ipynb delete mode 100644 notebooks/chap12.ipynb delete mode 100644 notebooks/chap13.ipynb delete mode 100644 notebooks/chap14.ipynb delete mode 100644 notebooks/chap15.ipynb delete mode 100644 notebooks/chap16.ipynb delete mode 100644 notebooks/chap16sympy.ipynb delete mode 100644 notebooks/chap17.ipynb delete mode 100644 notebooks/chap18.ipynb delete mode 100644 notebooks/chap20.ipynb delete mode 100644 notebooks/chap21.ipynb delete mode 100644 notebooks/chap22.ipynb delete mode 100644 notebooks/chap23.ipynb delete mode 100644 notebooks/chap24.ipynb delete mode 100644 notebooks/chap25.ipynb delete mode 100644 notebooks/data/DataOWall.csv delete mode 100644 notebooks/data/USASAC2018-Report-30-2017-Activities-Page11.pdf delete mode 100644 notebooks/data/USASAC2018-Report-30-2017-Activities.pdf delete mode 100644 notebooks/data/USASAC_Report_2017_Page18.png delete mode 100644 notebooks/data/World_population_estimates.csv delete mode 100644 notebooks/data/World_population_estimates.html delete mode 100644 notebooks/data/World_population_estimates2.csv delete mode 100644 notebooks/data/World_population_estimates3.csv delete mode 100644 notebooks/data/baseball_drag.csv delete mode 100644 notebooks/data/baseball_drag.png delete mode 100644 notebooks/data/glucose_insulin.csv delete mode 100644 notebooks/diagrams/RC_Divider.png delete mode 100644 notebooks/diagrams/RC_Divider.svg delete mode 100644 notebooks/diagrams/queue.png delete mode 100644 notebooks/diagrams/throwingaxe1.png delete mode 100644 notebooks/diagrams/throwingaxe2.png delete mode 100644 notebooks/examples/bigbelly.ipynb delete mode 100644 notebooks/examples/world_pop_transition.ipynb delete mode 100644 notebooks/figs/README delete mode 100644 notebooks/filter.ipynb delete mode 100644 notebooks/glucose.ipynb delete mode 100644 notebooks/hopper.ipynb delete mode 100644 notebooks/insulin.ipynb delete mode 100644 notebooks/jump.ipynb delete mode 100644 notebooks/jump2.ipynb delete mode 100644 notebooks/kitten.ipynb delete mode 100644 notebooks/lotka-volterra.ipynb delete mode 100644 notebooks/modsim.html delete mode 100644 notebooks/oem.ipynb delete mode 100644 notebooks/pendulum.ipynb delete mode 100644 notebooks/pendulum2.ipynb delete mode 100644 notebooks/pendulum_sympy.ipynb delete mode 100644 notebooks/queue.ipynb delete mode 100644 notebooks/rabbits.ipynb delete mode 100644 notebooks/rabbits2.ipynb delete mode 100644 notebooks/rabbits3.ipynb delete mode 100644 notebooks/salmon.ipynb delete mode 100644 notebooks/spiderman.ipynb delete mode 100644 notebooks/test_install.py delete mode 100644 notebooks/throwingaxe.ipynb delete mode 100644 notebooks/trees.ipynb delete mode 100644 notebooks/variables_r_strange.ipynb delete mode 100644 notebooks/wall.ipynb delete mode 100644 notebooks/yoyo.ipynb diff --git a/notebooks/chap01.ipynb b/notebooks/chap01.ipynb deleted file mode 100644 index 4d73a4a0..00000000 --- a/notebooks/chap01.ipynb +++ /dev/null @@ -1,538 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 1\n", - "\n", - "Copyright 2020 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Jupyter\n", - "\n", - "Welcome to *Modeling and Simulation*, welcome to Python, and welcome to Jupyter.\n", - "\n", - "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code.\n", - "\n", - "### Selecting and running cells\n", - "\n", - "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", - "\n", - "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding and removing cells\n", - "\n", - "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", - "\n", - "Try the following exercises:\n", - "\n", - "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", - "\n", - "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", - "\n", - "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", - "\n", - "4. In the new cell, type some text, and then run it.\n", - "\n", - "5. Use the arrow buttons in the toolbar to move cells up and down.\n", - "\n", - "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", - "\n", - "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", - "\n", - "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the notebooks\n", - "\n", - "The notebooks for each chapter contain the code from the chapter along with additional examples, explanatory text, and exercises. I recommend you \n", - "\n", - "1. Read the chapter first to understand the concepts and vocabulary, \n", - "2. Run the notebook to review what you learned and see it in action, and then\n", - "3. Attempt the exercises.\n", - "\n", - "If you try to work through the notebooks without reading the book, you're gonna have a bad time. The notebooks contain some explanatory text, but it is probably not enough to make sense if you have not read the book. If you are working through a notebook and you get stuck, you might want to re-read (or read!) the corresponding section of the book." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing modules\n", - "\n", - "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", - "\n", - "They also use two less common modules: Pint, which provides units, and modsim, which contains code I wrote specifically for this book.\n", - "\n", - "The following cells check whether you have these modules already and tries to install them if you don't." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", - "\n", - "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", - "\n", - "You can find out what version of Python and Jupyter you have by running the following cells." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "!python --version" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "!jupyter-notebook --version" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Configuring Jupyter\n", - "\n", - "The following cell:\n", - "\n", - "1. Uses a Jupyter \"magic command\" to specify whether figures should appear in the notebook, or pop up in a new window.\n", - "\n", - "2. Configures Jupyter to display some values that would otherwise be invisible. \n", - "\n", - "Select the following cell and press SHIFT-ENTER to run it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The penny myth\n", - "\n", - "The following cells contain code from the beginning of Chapter 1.\n", - "\n", - "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", - "\n", - "The following lines create new variables named `meter` and `second`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "meter = UNITS.meter" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "second = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a variable named `a` and give it the value of acceleration due to gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8 * meter / second**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create `t` and give it the value 4 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t = 4 * second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "a * t**2 / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", - "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", - "\n", - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", - "\n", - "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Falling pennies\n", - "\n", - "Now let's solve the falling penny problem.\n", - "\n", - "Set `h` to the height of the Empire State Building:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the time it would take a penny to fall, assuming constant acceleration.\n", - "\n", - "$ a t^2 / 2 = h $\n", - "\n", - "$ t = \\sqrt{2 h / a}$" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "t = sqrt(2 * h / a)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given `t`, we can compute the velocity of the penny when it lands.\n", - "\n", - "$v = a t$" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "v = a * t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can convert from one set of units to another like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "mile = UNITS.mile\n", - "hour = UNITS.hour" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "v.to(mile/hour)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", - "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", - "\n", - "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", - "\n", - "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", - "\n", - "You can break this question into three parts:\n", - "\n", - "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", - "2. How far would the penny fall during that time?\n", - "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", - "\n", - "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Restart and run all\n", - "\n", - "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", - "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", - "\n", - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap02.ipynb b/notebooks/chap02.ipynb deleted file mode 100644 index 192035b5..00000000 --- a/notebooks/chap02.ipynb +++ /dev/null @@ -1,917 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 2\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)\n", - "\n", - "# If this cell runs successfully, it produces no output." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modeling a bikeshare system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with a `State` object that represents the number of bikes at each station.\n", - "\n", - "When you display a `State` object, it lists the state variables and their values:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the state variables using dot notation." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", - "\n", - "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating\n", - "\n", - "We can use the update operators `+=` and `-=` to change state variables." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we display `bikeshare`, we should see the change." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley += 1\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Functions\n", - "\n", - "We can take the code we've written so far and encapsulate it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conditionals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", - "\n", - "The Python function `help` looks up a function and displays its documentation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "help(flip)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "flip(0.7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')\n", - "else:\n", - " print('tails')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step\n", - "\n", - "Now let's get back to the bikeshare state. Again let's start with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def step():\n", - " if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since this function takes no parameters, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "step()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parameters\n", - "\n", - "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", - "\n", - "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "step(0.5, 0.4)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## For loop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we go on, I'll redefine `step` without the print statements." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's start again with a new `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use a `for` loop to move 4 bikes from Olin to Wellesley." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " bike_to_wellesley()\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can simulate 4 random time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " step(0.3, 0.2)\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If each step corresponds to a minute, we can simulate an entire hour like this." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(60):\n", - " step(0.3, 0.2)\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", - "\n", - "But first, we want to plot the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TimeSeries\n", - "\n", - "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", - "\n", - "We can create a new, empty `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can add a value to the `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "results[0] = bikeshare.olin\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", - "\n", - "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a for loop that runs 10 steps and stores the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(10):\n", - " step(0.3, 0.2)\n", - " results[i] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can display the results." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "results.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "results.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "We can also plot the results like this." - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')\n", - "\n", - "savefig('figs/chap02-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`savefig()` saves a figure in a file." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "help(savefig)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The suffix of the filename indicates the format you want. This example saves the current figure in a PDF file." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", - "\n", - "It should:\n", - "\n", - "1. Create a `TimeSeries` object to hold the results.\n", - "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", - "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", - "4. After the for loop, it should plot the results and\n", - "5. Decorate the axes.\n", - "\n", - "To test your function:\n", - "\n", - "1. Create a `State` object with the initial state of the system.\n", - "2. Call `run_simulation` with appropriate parameters.\n", - "3. Save the resulting figure.\n", - "\n", - "Optional:\n", - "\n", - "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Opening the hood\n", - "\n", - "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", - "\n", - "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", - "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pandas\n", - "\n", - "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", - "\n", - "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", - "\n", - "The primary differences between `TimeSeries` and `Series` are:\n", - "\n", - "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", - "\n", - "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", - "\n", - "3. I provide a function called `set` that we'll use later.\n", - "\n", - "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pyplot\n", - "\n", - "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", - "\n", - "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### NumPy\n", - "\n", - "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", - "\n", - "You can get the source code for `flip` by running the following cell." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(flip)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap03.ipynb b/notebooks/chap03.ipynb deleted file mode 100644 index 82a9d53a..00000000 --- a/notebooks/chap03.ipynb +++ /dev/null @@ -1,595 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 3\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *\n", - "\n", - "# set the random number generator\n", - "np.random.seed(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More than one State object\n", - "\n", - "Here's the code from the previous chapter, with two changes:\n", - "\n", - "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", - "\n", - "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(state, p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " state: State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " results = TimeSeries() \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " results[i] = state.olin\n", - " \n", - " plot(results, label='Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can create more than one `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1 = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2 = State(olin=2, wellesley=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whenever we call a function, we indicate which `State` object to work with:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_olin(bikeshare1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley(bikeshare2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can confirm that the different objects are getting updated independently:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Negative bikes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", - "\n", - "If you run this simulation a few times, it happens often." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if you run the simulation again, it should behave." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparison operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", - "\n", - "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", - "\n", - "Remember that `=` creates a variable or gives an existing variable a new value." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "x = 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whereas `==` compares two values and returns `True` if they are equal." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "x == 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can use `==` in an `if` statement." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if x == 5:\n", - " print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you use `=` in an `if` statement, you get an error." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# If you remove the # from the if statement and run it, you'll get\n", - "# SyntaxError: invalid syntax\n", - "\n", - "#if x = 5:\n", - "# print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", - "\n", - "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now when we run a simulation, it keeps track of unhappy customers." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can print the number of unhappy customers at each location." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin_empty" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", - "\n", - "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", - "\n", - "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", - "\n", - "Test your code by running the simulation and check the value of `clock` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0,\n", - " clock=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", - "\n", - "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", - "\n", - "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", - "\n", - "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap04.ipynb b/notebooks/chap04.ipynb deleted file mode 100644 index 1945f357..00000000 --- a/notebooks/chap04.ipynb +++ /dev/null @@ -1,667 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 4\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim library\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Returning values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a simple function that returns a value:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def add_five(x):\n", - " return x + 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "y = add_five(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you run a function on the last line of a cell, Jupyter displays the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", - "\n", - "In the following example, Jupyter shows the second result, but the first result just disappears." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(3)\n", - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "y1 = add_five(3)\n", - "y2 = add_five(5)\n", - "\n", - "print(y1, y2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", - "\n", - "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running simulations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the code from the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " state = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` doesn't plot anything:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.4, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But after the simulation, we can read the metrics from the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.2, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When `p1` is large, we probably do." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.6, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More for loops" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` creates a NumPy array of equally spaced numbers." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "p1_array = linspace(0, 1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an array in a `for` loop, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " print(p1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will come in handy in the next section.\n", - "\n", - "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "help(linspace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** \n", - "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "help(linrange)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sweeping parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`p1_array` contains a range of values for `p1`." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "p2 = 0.2\n", - "num_steps = 60\n", - "p1_array = linspace(0, 1, 11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " print(p1, state.olin_empty)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "\n", - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", - "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional Exercises\n", - "\n", - "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", - "\n", - "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", - "\n", - "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", - "`num_runs` specifies how many times it should call `run_simulation`.\n", - "\n", - "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", - "\n", - "Test your function with parameters\n", - "\n", - "```\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "```\n", - "\n", - "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", - "\n", - "```\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "```\n", - "\n", - "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", - "\n", - "What value of `p1` minimizes the average number of unhappy customers?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap05.ipynb b/notebooks/chap05.ipynb deleted file mode 100644 index d624e63e..00000000 --- a/notebooks/chap05.ipynb +++ /dev/null @@ -1,594 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 5\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reading data\n", - "\n", - "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The data directory contains a downloaded copy of https://en.wikipedia.org/wiki/World_population_estimates\n", - "\n", - "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", - "\n", - "`head` selects the header and the first five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2 = tables[2]\n", - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`tail` selects the last five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "table2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Long column names are awkard to work with, but we can replace them with abbreviated names." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the DataFrame looks like now. " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", - "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", - "\n", - "`NaN` is a special value that indicates missing data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Series\n", - "\n", - "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "census.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", - "\n", - "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From here on, we will work in units of billions." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what these estimates look like." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year',\n", - " ylabel='World population (billion)')\n", - "\n", - "savefig('figs/chap05-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", - "\n", - "So the largest relative error between the estimates is about 1.3%." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "max(abs(census - un) / un) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", - "\n", - "1. Compute the elementwise differences, `census - un`\n", - "2. Compute the absolute differences, `abs(census - un)`\n", - "3. Compute the relative differences, `abs(census - un) / un`\n", - "4. Compute the percent differences, `abs(census - un) / un * 100`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Constant growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select a value from a `Series` using bracket notation. Here's the first element:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "census[1950]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the last value." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "census[2016]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = get_last_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "elapsed_time = t_end - t_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can get the first and last values:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "p_end = get_last_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can compute the average annual growth in billions of people per year." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "total_growth = p_end - p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TimeSeries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's create a `TimeSeries` to contain values generated by a linear growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "results[t_0] = census[t_0]\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After that, the population in the model grows by a constant amount each year." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "for t in linrange(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results looks like, compared to the actual data." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')\n", - "\n", - "savefig('figs/chap05-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well after 1990, but not so well before." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", - "\n", - "Hint: \n", - "\n", - "1. Copy the code from above and make a few changes. Test your code after each small change.\n", - "\n", - "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", - "\n", - "3. You might want to add a constant to the starting value to match the data better." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "census.loc[1960:1970]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap06.ipynb b/notebooks/chap06.ipynb deleted file mode 100644 index aee7cc16..00000000 --- a/notebooks/chap06.ipynb +++ /dev/null @@ -1,527 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 6\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = get_first_value(census)\n", - "p_end = get_last_value(census)\n", - "total_growth = p_end - p_0\n", - "\n", - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### System objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can rewrite the code from the previous chapter using system objects." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " annual_growth=annual_growth)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can encapsulate the code that runs the model in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation1(system):\n", - " \"\"\"Runs the constant growth model.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = results[t] + system.annual_growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also encapsulate the code that plots the results." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation1(system)\n", - "plot_results(census, un, results, 'Constant growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Proportional growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a more realistic model where the number of births and deaths is proportional to the current population." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation2(system):\n", - " \"\"\"Run a model with proportional birth and death.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " births = system.birth_rate * results[t]\n", - " deaths = system.death_rate * results[t]\n", - " results[t+1] = results[t] + births - deaths\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "system.death_rate = 0.01\n", - "system.birth_rate = 0.027" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation2(system)\n", - "plot_results(census, un, results, 'Proportional model')\n", - "savefig('figs/chap06-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well for the first 20 years, but not so well after that." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Factoring out the update function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func1(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " births = system.birth_rate * pop\n", - " deaths = system.death_rate * pop\n", - " return pop + births - deaths" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The name `update_func` refers to a function object." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "update_func1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which we can confirm by checking its type." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "type(update_func1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation` takes the update function as a parameter and calls it just like any other function." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " birth_rate=0.027,\n", - " death_rate=0.01)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func1)\n", - "plot_results(census, un, results, 'Proportional model, factored')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Remember not to put parentheses after `update_func1`. What happens if you try?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining birth and death" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func2(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = system.birth_rate - system.death_rate\n", - "\n", - "results = run_simulation(system, update_func2)\n", - "plot_results(census, un, results, 'Proportional model, combined birth and death')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", - "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", - "\n", - "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap07.ipynb b/notebooks/chap07.ipynb deleted file mode 100644 index fb1ed01b..00000000 --- a/notebooks/chap07.ipynb +++ /dev/null @@ -1,523 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 7\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Quadratic growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the implementation of the quadratic growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Compute the population next year with a quadratic model.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `System` object with the parameters `alpha` and `beta`:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')\n", - "savefig('figs/chap07-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Can you find values for the parameters that make the model fit better?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Equilibrium\n", - "\n", - "To understand the quadratic model better, let's plot net growth as a function of population." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "pop_array = linspace(0, 15, 100)\n", - "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid')\n", - "\n", - "plot(pop_array, net_growth_array)\n", - "decorate(xlabel='Population (billions)',\n", - " ylabel='Net growth (billions)')\n", - "\n", - "sns.set_style('white')\n", - "\n", - "savefig('figs/chap07-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like. Remember that the x axis is population now, not time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", - "\n", - "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the equilibrium the population tends toward." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dysfunctions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", - "\n", - "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see all the ways that can go wrong.\n", - "\n", - "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity():\n", - " K = -sys1.alpha / sys1.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity()\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", - "\n", - "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " system = System(alpha=0.025, beta=-0.0018)\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", - "\n", - "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", - "\n", - "\n", - "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", - "\n", - "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys2 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys2)\n", - "\n", - "# print(K) This line won't work because K only exists inside the function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", - "\n", - "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", - "\n", - "For example, you could eliminate the temporary variable `pop` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "print(carrying_capacity(sys1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or if you had more than one system, you could compute the total carrying capacity like this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", - "\n", - "$ \\Delta p = r p (1 - p / K) $\n", - "\n", - "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap08.ipynb b/notebooks/chap08.ipynb deleted file mode 100644 index f8690865..00000000 --- a/notebooks/chap08.ipynb +++ /dev/null @@ -1,572 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 8\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Functions from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the data" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table2(filename = 'data/World_population_estimates.html'):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table2 = tables[2]\n", - " table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - " return table2" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "#table2 = read_table2()\n", - "#table2.to_csv('data/World_population_estimates2.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "table2 = pd.read_csv('data/World_population_estimates2.csv')\n", - "table2.index = table2.Year\n", - "table2.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Estimated world population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Running the quadratic model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Update population based on a quadratic model.\n", - " \n", - " pop: current population in billions\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the starting time and population." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the system object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model and plot results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To generate projections, all we have to do is change `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "system.t_end = 2250\n", - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'World population projection')\n", - "savefig('figs/chap08-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The population in the model converges on the equilibrium population, `-alpha/beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "results[system.t_end]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare the projection from our model with projections produced by people who know what they are doing." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table3(filename = 'data/World_population_estimates.html'):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table3 = tables[3]\n", - " table3.columns = ['census', 'prb', 'un']\n", - " return table3" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "#table3 = read_table3()\n", - "#table3.to_csv('data/World_population_estimates3.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "table3 = pd.read_csv('data/World_population_estimates3.csv')\n", - "table3.index = table3.Year\n", - "table3.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projections(table):\n", - " \"\"\"Plot world population projections.\n", - " \n", - " table: DataFrame with columns 'un' and 'census'\n", - " \"\"\"\n", - " census_proj = table.census / 1e9\n", - " un_proj = table.un / 1e9\n", - " \n", - " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", - " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model until 2100, which is as far as the other projections go." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=2100,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "\n", - "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", - "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)\n", - "savefig('figs/chap08-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "People who know what they are doing expect the growth rate to decline more sharply than our model projects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", - "\n", - "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", - "\n", - "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "alpha_census = compute_rel_diff(census)\n", - "plot(alpha_census, label='US Census')\n", - "\n", - "alpha_un = compute_rel_diff(un)\n", - "plot(alpha_un, label='UN DESA')\n", - "\n", - "decorate(xlabel='Year', label='Net growth rate')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", - "\n", - "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", - "\n", - "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", - "\n", - "3. Create a `System` object that includes `alpha_func` as a system variable.\n", - "\n", - "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", - "\n", - "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", - "\n", - "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", - "\n", - "7. Compare your projections with those from the US Census and UN." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap09.ipynb b/notebooks/chap09.ipynb deleted file mode 100644 index 183f2e33..00000000 --- a/notebooks/chap09.ipynb +++ /dev/null @@ -1,624 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 9\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import everything from SymPy.\n", - "from sympy import *\n", - "\n", - "# Set up Jupyter notebook to display math.\n", - "init_printing() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following displays SymPy expressions and provides the option of showing results in LaTeX format." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy.printing import latex\n", - "\n", - "def show(expr, show_latex=False):\n", - " \"\"\"Display a SymPy expression.\n", - " \n", - " expr: SymPy expression\n", - " show_latex: boolean\n", - " \"\"\"\n", - " if show_latex:\n", - " print(latex(expr))\n", - " return expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis with SymPy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a symbol for time." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "t = symbols('t')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you combine symbols and numbers, you get symbolic expressions." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "expr = t + 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `Add` object, which just represents the sum without trying to compute it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "type(expr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`f` is a special class of symbol that represents a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "f = Function('f')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The type of `f` is `UndefinedFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "type(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`diff` returns a `Derivative` object that represents the time derivative of `f`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dfdt = diff(f(t), t)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "type(dfdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a symbol for `alpha`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "alpha = symbols('alpha')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation for proportional growth." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "eq1 = Eq(dfdt, alpha*f(t))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And use `dsolve` to solve it. The result is the general solution." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = dsolve(eq1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", - "\n", - "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "C1, p_0 = symbols('C1 p_0')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "particular = solution_eq.subs(C1, p_0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next example, we have to work a little harder to find the particular solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the quadratic growth equation \n", - "\n", - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r, K = symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = dsolve(eq2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "general = solution_eq.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "at_0 = general.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", - "\n", - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "solutions = solve(Eq(at_0, p_0), C1)\n", - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "value_of_C1 = solutions[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "particular = general.subs(C1, value_of_C1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a method that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "particular = simplify(particular)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", - "\n", - "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "particular.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", - "\n", - "In some places you'll see it written in a different form:\n", - "\n", - "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", - "\n", - "where $A = (K - p_0) / p_0$.\n", - "\n", - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "A = (K - p_0) / p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "logistic = K / (1 + A * exp(-r*t))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "simplify(particular - logistic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap09sympy.ipynb b/notebooks/chap09sympy.ipynb deleted file mode 100644 index ce3e1c0a..00000000 --- a/notebooks/chap09sympy.ipynb +++ /dev/null @@ -1,632 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 9\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import everything from SymPy.\n", - "from sympy import *\n", - "\n", - "# Set up Jupyter notebook to display math.\n", - "init_printing() " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following displays SymPy expressions and provides the option of showing results in LaTeX format." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "from sympy.printing import latex\n", - "\n", - "def show(expr, show_latex=False):\n", - " \"\"\"Display a SymPy expression.\n", - " \n", - " expr: SymPy expression\n", - " show_latex: boolean\n", - " \"\"\"\n", - " if show_latex:\n", - " print(latex(expr))\n", - " return expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis with SymPy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a symbol for time." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "t = symbols('t')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you combine symbols and numbers, you get symbolic expressions." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "expr = t + 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `Add` object, which just represents the sum without trying to compute it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "type(expr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`f` is a special class of symbol that represents a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "f = Function('f')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The type of `f` is `UndefinedFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "type(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`diff` returns a `Derivative` object that represents the time derivative of `f`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dfdt = diff(f(t), t)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "type(dfdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a symbol for `alpha`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "alpha = symbols('alpha')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation for proportional growth." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "eq1 = Eq(dfdt, alpha*f(t))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And use `dsolve` to solve it. The result is the general solution." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = dsolve(eq1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", - "\n", - "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "C1, p_0 = symbols('C1 p_0')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "particular = solution_eq.subs(C1, p_0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next example, we have to work a little harder to find the particular solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the quadratic growth equation \n", - "\n", - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "r, K = symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "eq2 = Eq(diff(f(t), t), r * f(t) * (1 - f(t)/K))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = dsolve(eq2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "general = solution_eq.rhs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "at_0 = general.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", - "\n", - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "solutions = solve(Eq(at_0, p_0), C1)\n", - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "value_of_C1 = solutions[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "particular = general.subs(C1, value_of_C1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a method that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "particular = simplify(particular)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", - "\n", - "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "particular.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", - "\n", - "In some places you'll see it written in a different form:\n", - "\n", - "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", - "\n", - "where $A = (K - p_0) / p_0$.\n", - "\n", - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "A = (K - p_0) / p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "logistic = K / (1 + A * exp(-r*t))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "simplify(particular - logistic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap10.ipynb b/notebooks/chap10.ipynb deleted file mode 100644 index e7167c43..00000000 --- a/notebooks/chap10.ipynb +++ /dev/null @@ -1,447 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 10\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *\n", - "\n", - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", - "\n", - "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - "table2.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `columns`, which labels the columns." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `values`, which is an array of values." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table2.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Series` does not have `columns`, but it does have `name`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "census.name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It contains `values`, which is an array." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "census.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And it contains `index`:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "census.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", - "\n", - "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", - "\n", - "`ndarray` is defined by NumPy." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.values)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "type(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "type(census.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "type(census.values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional exercise\n", - "\n", - "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", - "\n", - "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'data/World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Select `tables[1]`, which is the second table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "table1 = tables[1]\n", - "table1.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "table1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Again, we'll replace the long column names with more convenient abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", - " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "for col in table1.columns:\n", - " table1[col] = pd.to_numeric(table1[col], errors='coerce')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results. Notice that we are working in millions now, not billions." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[-10000, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='Prehistoric population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `xlim` to zoom in on everything after Year 0." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap11.ipynb b/notebooks/chap11.ipynb deleted file mode 100644 index e75bc7e8..00000000 --- a/notebooks/chap11.ipynb +++ /dev/null @@ -1,463 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 11\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SIR implementation\n", - "\n", - "We'll use a `State` object to represent the number (or fraction) of people in each compartment." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "init = State(S=89, I=1, R=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To convert from number of people to fractions, we divide through by the total." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "init /= sum(init)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates a `System` object with the given parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example with hypothetical values for `beta` and `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function takes the state during the current time step and returns the state during the next time step." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run a single time step, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "state = update_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run a simulation by calling the update function for each time step." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: State object for final state\n", - " \"\"\"\n", - " state = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the state of the system at `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", - "\n", - "Hint: what is the change in `S` between the beginning and the end of the simulation?" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using TimeSeries objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add three Series objects to the System: S, I, R\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " S = TimeSeries()\n", - " I = TimeSeries()\n", - " R = TimeSeries()\n", - "\n", - " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " S[t+1], I[t+1], R[t+1] = state\n", - " \n", - " return S, I, R" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what they look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(S, I, R)\n", - "savefig('figs/chap11-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a DataFrame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", - "\n", - "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it, and what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)\n", - "results.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can extract the results and plot them." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap12.ipynb b/notebooks/chap12.ipynb deleted file mode 100644 index 50a9c232..00000000 --- a/notebooks/chap12.ipynb +++ /dev/null @@ -1,877 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 12\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code\n", - "\n", - "Here's the code from the previous notebook that we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example.|" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beta = 0.333\n", - "gamma = 0.25\n", - "system = make_system(beta, gamma)\n", - "\n", - "results = run_simulation(system, update_func)\n", - "print(beta, gamma, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", - "\n", - "1. The fraction of students who are sick at the peak of the outbreak.\n", - "\n", - "2. The day the outbreak peaks.\n", - "\n", - "3. The fraction of students who are sick at the end of the semester.\n", - "\n", - "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", - "\n", - "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", - "\n", - " I.max()\n", - "\n", - "And the index of the largest value like this:\n", - "\n", - " I.idxmax()\n", - "\n", - "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What if?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def add_immunization(system, fraction):\n", - " \"\"\"Immunize a fraction of the population.\n", - " \n", - " Moves the given fraction from S to R.\n", - " \n", - " system: System object\n", - " fraction: number from 0 to 1\n", - " \"\"\"\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start again with the system we used in the previous sections." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run the model without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func)\n", - "calc_total_infected(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now with 10% immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", - "results2 = run_simulation(system2, update_func)\n", - "calc_total_infected(results2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "10% immunization leads to a drop in infections of 16 percentage points.\n", - "\n", - "Here's what the time series looks like for S, with and without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.S, '-', label='No immunization')\n", - "plot(results2.S, '--', label='10% immunization')\n", - "\n", - "decorate(xlabel='Time (days)',\n", - " ylabel='Fraction susceptible')\n", - "\n", - "savefig('figs/chap12-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep through a range of values for the fraction of the population who are immunized." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 11)\n", - "for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " print(fraction, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function does the same thing and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_immunity(immunize_array):\n", - " \"\"\"Sweeps a range of values for immunity.\n", - " \n", - " immunize_array: array of fraction immunized\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " sweep[fraction] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Fraction immunized',\n", - " ylabel='Total fraction infected',\n", - " title='Fraction infected vs. immunization rate',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If 40% of the population is immunized, less than 4% of the population gets sick." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Logistic function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", - "\n", - "`M` is chosen so the transition happens around \\$500.\n", - "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", - "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "plot(spending, percent_reduction)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hand washing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can model the effect of a hand-washing campaign by modifying `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " \"\"\"Modifies system to model the effect of hand washing.\n", - " \n", - " system: System object\n", - " spending: campaign spending in USD\n", - " \"\"\"\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start with the same values of `beta` and `gamma` we've been using." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "beta, gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep different levels of campaign spending." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 13)\n", - "\n", - "for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " print(spending, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " \"\"\"Run simulations with a range of spending.\n", - " \n", - " spending_array: array of dollars from 0 to 1200\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig03.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's put it all together to make some public health spending decisions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)\n", - "dose_array = linrange(max_doses, endpoint=True)\n", - "max_doses" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", - "\n", - "For each scenario, we compute the fraction of students who get sick." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " print(doses, system.init.S, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function wraps that loop and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " \"\"\"Runs simulations with different doses and campaign spending.\n", - " \n", - " dose_array: range of values for number of vaccinations\n", - " \n", - " return: Sweep object with total number of infections \n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compute the number of infected students for each possible allocation of the budget." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_doses(dose_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap12-fig04.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap13.ipynb b/notebooks/chap13.ipynb deleted file mode 100644 index d368dd4c..00000000 --- a/notebooks/chap13.ipynb +++ /dev/null @@ -1,517 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 13\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " beta, gamma = system.beta, system.gamma\n", - " s, i, r = state\n", - "\n", - " infected = beta * i * s \n", - " recovered = gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a range of values for `beta`, with constant `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma = 0.2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the simulation once for each value of `beta` and print total infections." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wrap that loop in a function and return a `SweepSeries` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "label = 'gamma = ' + str(gamma)\n", - "plot(infected_sweep, label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap13-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the same array of values for `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now an array of values for `gamma`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "gamma_array = [0.2, 0.4, 0.6, 0.8]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each value of `gamma`, sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "for gamma in gamma_array:\n", - " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(infected_sweep, label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " loc='upper left')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SweepFrame\n", - "\n", - "The following sweeps two parameters and stores the results in a `SweepFrame`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the `SweepFrame` look like." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in gamma_array:\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(frame[gamma], label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " title='',\n", - " loc='upper left')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also plot one line for each value of `beta`, although there are a lot of them." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "\n", - "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", - " label = 'beta = ' + str(beta)\n", - " plot(frame.row[beta], label=label)\n", - " \n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n", - "savefig('figs/chap13-fig03.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", - "\n", - "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "contour(frame)\n", - "\n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')\n", - "\n", - "savefig('figs/chap13-fig04.pdf')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap14.ipynb b/notebooks/chap14.ipynb deleted file mode 100644 index c9624be2..00000000 --- a/notebooks/chap14.ipynb +++ /dev/null @@ -1,475 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 14\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Contact number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "frame.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_sweep_frame(frame):\n", - " \"\"\"Plot the values from a SweepFrame.\n", - " \n", - " For each (beta, gamma), compute the contact number,\n", - " beta/gamma\n", - " \n", - " frame: SweepFrame with one row per beta, one column per gamma\n", - " \"\"\"\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta/gamma, frac_infected, 'ro')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "\n", - "decorate(xlabel='Contact number (beta/gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", - "\n", - "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "s_inf_array = linspace(0.0001, 0.9999, 101);" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "c_array = log(s_inf_array) / (s_inf_array - 1);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`total_infected` is the change in $s$ from the beginning to the end." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "frac_infected = 1 - s_inf_array\n", - "frac_infected_series = Series(frac_infected, index=c_array);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot the analytic results and compare them to the simulations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "plot(frac_infected_series, label='Analysis')\n", - "\n", - "decorate(xlabel='Contact number (c)',\n", - " ylabel='Fraction infected')\n", - "\n", - "savefig('figs/chap14-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The agreement is generally good, except for values of `c` less than 1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", - "\n", - "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", - "\n", - "What do the results look like, and what does that imply? " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", - "\n", - "What is your best estimate of `c`?\n", - "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap15.ipynb b/notebooks/chap15.ipynb deleted file mode 100644 index 4e0f0cdb..00000000 --- a/notebooks/chap15.ipynb +++ /dev/null @@ -1,318 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 15\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The coffee cooling problem\n", - "\n", - "I'll use a `State` object to store the initial temperature.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "init = State(T=90)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a `System` object to contain the system parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = System(init=init,\n", - " volume=300,\n", - " r=0.01,\n", - " T_env=22,\n", - " t_0=0,\n", - " t_end=30,\n", - " dt=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function implements Newton's law of cooling." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "update_func(init, 0, coffee)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `run_simulation` that uses `linrange` to make an array of time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how it works." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(coffee, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.T, label='coffee')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the final temperature:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "coffee.T_final = get_last_value(results.T)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Encapsulation\n", - "\n", - "Before we go on, let's define a function to initialize `System` objects with relevant parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=0.01, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Simulate the temperature of 50 mL of milk with a starting temperature of 5 degC, in a vessel with the same insulation, for 15 minutes, and plot the results.\n", - "\n", - "By trial and error, find a value for `r` that makes the final temperature close to 20 C." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.T, label='milk')\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap16.ipynb b/notebooks/chap16.ipynb deleted file mode 100644 index b359b505..00000000 --- a/notebooks/chap16.ipynb +++ /dev/null @@ -1,842 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 16\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Code from previous notebooks" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the thermal transfer model.\n", - " \n", - " state: State (temp)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (temp)\n", - " \"\"\"\n", - " r, T_env, dt = system.r, system.T_env, system.dt\n", - " \n", - " T = state.T\n", - " T += -r * (T - T_env) * dt\n", - " \n", - " return State(T=T)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add a TimeFrame to the System: results\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(T_init, r, volume, t_end):\n", - " \"\"\"Makes a System object with the given parameters.\n", - "\n", - " T_init: initial temperature in degC\n", - " r: heat transfer rate, in 1/min\n", - " volume: volume of liquid in mL\n", - " t_end: end time of simulation\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(T=T_init)\n", - " \n", - " return System(init=init,\n", - " r=r, \n", - " volume=volume,\n", - " temp=T_init,\n", - " t_0=0, \n", - " t_end=t_end, \n", - " dt=1,\n", - " T_env=22)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using `root_bisect`\n", - "\n", - "As a simple example, let's find the roots of this function; that is, the values of `x` that make the result 0." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def func(x):\n", - " return (x-1) * (x-2) * (x-3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `root_bisect`, which searches for a root by bisection. The first argument is the function whose roots we want. The second argument is an interval that contains a root." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [0.5, 1.5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an object that contains the root that was found and other information." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we provide a different interval, we find a different root." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [1.5, 2.5])" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the interval doesn't contain a root, the results explain the error." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(func, [4, 5])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to find the value of `r` that makes the final temperature 70, so we define an \"error function\" that takes `r` as a parameter and returns the difference between the final temperature and the goal." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(r):\n", - " \"\"\"Runs a simulation and returns the `error`.\n", - " \n", - " r: heat transfer rate, in 1/min\n", - " \n", - " returns: difference between final temp and 70 C\n", - " \"\"\"\n", - " system = make_system(T_init=90, r=r, volume=300, t_end=30)\n", - " results = run_simulation(system, update_func)\n", - " T_final = get_last_value(results.T)\n", - " return T_final - 70" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.01`, we end up a little too warm." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "error_func1(r=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With `r=0.02`, we end up too cold." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "error_func1(r=0.02)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `root_bisect` is an array with a single element, the estimated value of `r`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(error_func1, [0.01, 0.02])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "r_coffee = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we run the simulation with the estimated value of `r`, the final temperature is 70 C, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you call `root_bisect`, it calls `error_func1` several times. To see how this works, add a print statement to `error_func1` and run `root_bisect` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Repeat this process to estimate `r_milk`, given that it starts at 5 C and reaches 20 C after 15 minutes. \n", - "\n", - "Before you use `root_bisect`, you might want to try a few values for `r_milk` and see how close you can get by trial and error. Here's an initial guess to get you started:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r_milk = 0.1\n", - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=15)\n", - "results = run_simulation(milk, update_func)\n", - "T_final = get_last_value(results.T)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mixing liquids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `System` objects that represent two liquids, computes the temperature of the mixture, and returns a new `System` object that represents the mixture." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def mix(system1, system2):\n", - " \"\"\"Simulates the mixture of two liquids.\n", - " \n", - " system1: System representing coffee\n", - " system2: System representing milk\n", - " \n", - " returns: System representing the mixture\n", - " \"\"\"\n", - " assert system1.t_end == system2.t_end\n", - " \n", - " V1, V2 = system1.volume, system2.volume\n", - " T1, T2 = system1.temp, system2.temp\n", - " \n", - " V_mix = V1 + V2\n", - " T_mix = (V1 * T1 + V2 * T2) / V_mix\n", - " \n", - " return make_system(T_init=T_mix,\n", - " r=system1.r,\n", - " volume=V_mix,\n", - " t_end=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`mix` requires the `System` objects to have `temp` as a system variable. `make_system` initializes this variable;\n", - "the following function makes sure it gets updated when we run a simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_set(system):\n", - " \"\"\"Run a simulation and set the final temperature.\n", - " \n", - " system: System\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " results = run_simulation(system, update_func)\n", - " system.temp = get_last_value(results.T)\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing immediately\n", - "\n", - "Next here's what we get if we add the milk immediately." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "milk = make_system(T_init=5, r=r_milk, volume=50, t_end=30)\n", - "milk.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "mix_first = mix(coffee, milk)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "mix_results = run_and_set(mix_first)\n", - "mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Mixing at the end\n", - "\n", - "First we'll see what happens if we add the milk at the end. We'll simulate the coffee and the milk separately." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "coffee_results = run_and_set(coffee)\n", - "coffee.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "milk_results = run_and_set(milk)\n", - "milk.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "plot(coffee_results.T, label='coffee')\n", - "plot(milk_results.T, '--', label='milk')\n", - "\n", - "decorate(xlabel='Time (minutes)',\n", - " ylabel='Temperature (C)',\n", - " loc='center left')\n", - "\n", - "savefig('figs/chap16-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what happens when we mix them." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "mix_last = mix(coffee, milk)\n", - "mix_last.temp" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "mix_last.temp - mix_first.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function takes `t_add`, which is the time when the milk is added, and returns the final temperature." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "def run_and_mix(t_add, t_total):\n", - " \"\"\"Simulates two liquids and them mixes them at t_add.\n", - " \n", - " t_add: time in minutes\n", - " t_total: total time to simulate, min\n", - " \n", - " returns: final temperature\n", - " \"\"\"\n", - " coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=t_add)\n", - " coffee_results = run_and_set(coffee)\n", - " \n", - " milk = make_system(T_init=5, r=r_milk, volume=50, t_end=t_add)\n", - " milk_results = run_and_set(milk)\n", - " \n", - " mixture = mix(coffee, milk)\n", - " mixture.t_end = t_total - t_add\n", - " results = run_and_set(mixture)\n", - "\n", - " return mixture.temp" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can try it out with a few values." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=0, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=15, t_total=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "run_and_mix(t_add=30, t_total=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then sweep a range of values for `t_add`" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "for t_add in linspace(0, 30, 11):\n", - " sweep[t_add] = run_and_mix(t_add, 30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, label='final temp', color='C2')\n", - "decorate(xlabel='Time added (min)',\n", - " ylabel='Final temperature (C)')\n", - "\n", - "savefig('figs/chap16-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the analytic result to compute temperature as a function of time. The following function is similar to `run_simulation`." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "def run_analysis(system):\n", - " \"\"\"Computes temperature using the analytic solution.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " T_env, r = system.T_env, system.r\n", - " \n", - " T_init = system.init.T \n", - " ts = linspace(0, system.t_end)\n", - " \n", - " T_array = T_env + (T_init - T_env) * exp(-r * ts)\n", - " \n", - " # to be consistent with run_simulation,\n", - " # we put the array into a TimeFrame\n", - " return TimeFrame(T_array, index=ts, columns=['T'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it. From the analysis (see `chap16sympy.ipynb`), we have the computed value of `r_coffee2`" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "r_coffee2 = 0.011610223142273859\n", - "coffee2 = make_system(T_init=90, r=r_coffee2, volume=300, t_end=30)" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_analysis(coffee2)\n", - "T_final_analysis = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can compare to the results from simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "coffee = make_system(T_init=90, r=r_coffee, volume=300, t_end=30)\n", - "results = run_simulation(coffee, update_func)\n", - "T_final_simulation = get_last_value(results.T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "They are identical except for a small roundoff error." - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "T_final_analysis - T_final_simulation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Suppose the coffee shop won't let me take milk in a separate container, but I keep a bottle of milk in the refrigerator at my office. In that case is it better to add the milk at the coffee shop, or wait until I get to the office?\n", - "\n", - "Hint: Think about the simplest way to represent the behavior of a refrigerator in this model. The change you make to test this variation of the problem should be very small!" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap16sympy.ipynb b/notebooks/chap16sympy.ipynb deleted file mode 100644 index c8323988..00000000 --- a/notebooks/chap16sympy.ipynb +++ /dev/null @@ -1,464 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "SymPy code for Chapter 16\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Mixing liquids" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can figure out the final temperature of a mixture by setting the total heat flow to zero and then solving for $T$." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy import *\n", - "\n", - "init_printing() " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle C_{1} \\left(T - T_{1}\\right) + C_{2} \\left(T - T_{2}\\right) = 0$" - ], - "text/plain": [ - "C₁⋅(T - T₁) + C₂⋅(T - T₂) = 0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "C1, C2, T1, T2, T = symbols('C1 C2 T1 T2 T')\n", - "\n", - "eq = Eq(C1 * (T - T1) + C2 * (T - T2), 0)\n", - "eq" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\left[ \\frac{C_{1} T_{1} + C_{2} T_{2}}{C_{1} + C_{2}}\\right]$" - ], - "text/plain": [ - "⎡C₁⋅T₁ + C₂⋅T₂⎤\n", - "⎢─────────────⎥\n", - "⎣ C₁ + C₂ ⎦" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solve(eq, T)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use SymPy to solve the cooling differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{d}{d t} T{\\left(t \\right)} = - r \\left(- T_{env} + T{\\left(t \\right)}\\right)$" - ], - "text/plain": [ - "d \n", - "──(T(t)) = -r⋅(-Tₑₙᵥ + T(t))\n", - "dt " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "T_init, T_env, r, t = symbols('T_init T_env r t')\n", - "T = Function('T')\n", - "\n", - "eqn = Eq(diff(T(t), t), -r * (T(t) - T_env))\n", - "eqn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the general solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle T{\\left(t \\right)} = C_{1} e^{- r t} + T_{env}$" - ], - "text/plain": [ - " -r⋅t \n", - "T(t) = C₁⋅ℯ + Tₑₙᵥ" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solution_eq = dsolve(eqn)\n", - "solution_eq" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAAWCAYAAADts5O8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE0ElEQVRoBe2Zi1EbMRBAbYYCgBKgAwgdkA4gHQQ6gKGCDHQAqSBAB4QKCHQAHQTcAXlPSJfznXycwT8MOyPrpF2t9qNdfdx9enrqzDt0u90bdPyOrrfzrmsb/brz7nQcvoQhHtGz28YgH4Fm4QMouYWO9x9Az9YqvutIJ4p30fQr5ZLyQFmlbFIOKIK1Tu9R/lBOPlN8pzMPTjeKdfpXHPqbhXDH957f1J24n/+gfWH7EwY4Pe6DKYqMEqNohXKJ8U7BG1EaNkUUzclClEG5gpzIYsTXADpPqmvgp5Lio5wuxJRtrIXt56rj4kx92nWdcjxO2y7GiYsKIfdpHFIOqoYEt005AfdNPGVkAF/TcBueO8jVS05knOncSK8BOA1Y0NYIJtOxxzQ1JyLbI/0PGRtrXxfJ+IBJOxZgiaLxnHAp9VdrcArlgNUqbhpt5NB467m56XcBn4sD1O9VMjPOqNzPzfFSH+PC/GU65aAolGeMYP9U02fm2krtcdQLTJDgio8vlA0mSukm4cr1OY1pR0+Qh2jReC7QQffvNfDXgZjsBd1EU3zMNLksZFYTcjgXp4fOsUFwOsIZvaZCHzCaHK4g7qNnfswA6PRwYBsgi3ptop8R/2sAzVi7sedpZoJ0/sjJftvCBxmW7bt8sNBwpvR7JjMyGgEDuhJXoB0qauK4Q8b+jRM419GwfOLYiVbIbnp3azgexcTwS/v5i/YexXxVHh7kPGgIRsWLgOJmgr5sgBJmCR2YVnAfH/CmM/l7rQqLhT4Xm3O3ObxBNh8Q9TZwppYtdXr56jCUZaOz06LRiTWARgU9B7h1JIfbp7NbLTTo5gma9vOJ6Gl6N9XohOUYxY0T68QqHX0hkumvpStwOly8TnYeoUc5q/IJmCn+IOsR0yenlCVR7hVKbktzW9wpEzd9R3sYaK3s3cTrLTj3c+Tuvzrk2tApbO16RJ+GuhswxqtJ7dqSo53VPuRX71dd2ao6wccgy9qqSjuu9iICeILcZQV6UMmtZNAFbELzmufMl/gWE8zzhzZGP7NG434OnTTlQ69RGQ6R4LzHb1D8u9irXcpMvjqmrdbnZ/s9a+mzkInoM5MFUBCjsXElg3dA9tGG/qZIN5N4yOt7hLANNM6ZGzONPuQcSaTDR4ep+PYgPcDpcB0abB3bRaakHR5vqM0Yu4lPbBePT7SDzamdL/FSj8vgCD5siCyYlJiJ88CVdbh0QJPTvSPfJH6RXsXkWQhZxs/aN3KOyuk+xhROyOkJ3jOQReeGkuhop0yhTfu2CNoF3xJdzS/gjhb50fEXhP6yHdQK1rMf8CHGVVakjdA7xA9jj+FputHJruAAb+GZeLyHGr3NkDrLYroVruh3y7vWPqHn/4+O8v+F2sMNfWGbZKz/N2jPALQd0wMf/Fai8wpdbMeR7jnSIaql3mH6YFxbUcOMn3Va9BtJpLfRk7mM2L4MSLsvy9I2tRcHar5dACmdl/vdWot3fL7DdrrAxyjAdD3PYNTlnlPHobNzpYxghtS2P9NEtEOKZwGV/28w6C7BuTirYLaWj+NCplisUgzTjoy8fzvpKm33olzKGobtzNFi4LTdTUI2T9puszopAPOX3wHsL1J2JDHSTeXu82Wc2/IhvK6pTf9h4f4D66qLhYPzB8MAAAAASUVORK5CYII=\n", - "text/latex": [ - "$\\displaystyle C_{1} e^{- r t} + T_{env}$" - ], - "text/plain": [ - " -r⋅t \n", - "C₁⋅ℯ + Tₑₙᵥ" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the initial condition to solve for $C_1$. First we evaluate the general solution at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFcAAAARCAYAAACoyTAdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADlklEQVRYCc2XgVUbMQxAG14GADZo2ADKBnQD6AhhA3hM0AcbQDdo2CBlAlo2gA1K2YD+79j3nDuTO8gFovd0d5JlWZIlnT14fn7+VIfBYLAJbwx+BZ/AR3AbnCJ/xfiI72O+T3mvBUSb7jFGe3/Ht7Yd+gB+gY4J2r8LXqzUB4ObIwuegP/Acc73G9DQS7A4Xpd/TxqbzsX6mtHW+wJfPxo+1uWWoYcsECBm6wTCXf2M0rTLMwGe8K6RM5s3QTOhV0C3mzdinYs3KHbeUT4vZrO2/sz58fsP74cCvzfWRqbphu8v4F4psJmcG/CEzEoNy9Zr/SSIlvi0IHgQeaUxg277WBmEzMU4S0QDj1oCqyH231ImOPZhgN1XhcWtMqFUZXcdfJ3NfuNzwDzbgD+CBxbbadPDRrjj28j2nrnoXqYtNExHn/+Gxy5+NSb3wLAtHEc9Zm8ruNv1wOLELlgqvVZ9qxLAHpNmJf+GrjbbFswWoVQ6s5EXngaVobQ5OrNOsKjfvoudtgVLxx3eMivbViWgm3U5eDpyCb+1ragfeY9NyXlZCULLgSi1HNvW3GkgTSq9WcMfr4nTya+SjmV5Zq4/qEbASooxWGN1/K403pVHkIqXj6j/rUex+vJunhvSmjD1iX3RBtd2MMYxnSplTL7WPjLXOWMdv/UFu6yChaca5JQ5A/+CAfAvnLEZ84a6B3oe9siWKm0HmdQKrUL5tkdjEyoLnpUZQEO8fp0wOHdby2nGnWCGN2Tgu0DjFlSSXcRDh5Wx0I5F89MYOgyMPh0mXv3NmIE1cMGnSE+SHLQ69GvuNhppEzHEATrcCnm7XtKlH9MhQg9E2ohPeD9Bz50X4SnoefGUsQ8rMdZ/DaTevOgn/QOFVuo3fAy68S9lngln1htgj3J5TNwUW6lZq9x33m5C1YKQ9ya7P1QoElt8nsP0SJWCqBJ3syoD6LUE7LaydFa0TIUb+AbwFh9CuQfu7GFAvDQ1NgBeaI8GCJnqiArtHBMwxCeTM/mqdhnlpo0SZ8KreSh20bVpC118wF7LuCpv5wChrNN8aFvCbkYb6NQGcr6XsINMLrS2DZh9gKXSB5hFeQn2ofMlHa6VMtwS1wdbRQBoK8Bg5ycjk2jKmK2yDnmrCJk/rEu8ho4GeKxy0RG0Z8tSCXZSiyOpHXWSX1LI/mobNIgBWD/1amn5VakHgVmLsAVYpfmYbfMMXbe8q//Wf7XWnjUk+QRkAAAAAElFTkSuQmCC\n", - "text/latex": [ - "$\\displaystyle C_{1} + T_{env}$" - ], - "text/plain": [ - "C₁ + Tₑₙᵥ" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "at0 = general.subs(t, 0)\n", - "at0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we set $T(0) = T_{init}$ and solve for $C_1$" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHkAAAARCAYAAAD5XQN+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADgklEQVRoBd2Zi1EbMRBAbYYCSNIBdECGDkgHZlJBoAMylAAdkHQQ0gFQAYEOoIOAOyDvidMhH+I4+xQ4vDOyTqvd1X6k1cfj+/v7UR8Yj8fr8F9TppQ/VU01mvgDnFHsE6TdpBwx7ncRywJD9sO4QJAPDVQzaBh9B/oW/EYaSPDHtC/B/0jx7/0buwbrh5UCzl3PBNgVu0ZxFTfhEsRNEzmENoGaUPYX1GWwfugVZBxi6j3NOGW7wuX6DL5pfWlg6H7oFWSj9Eza/VJFMLeSr+CJe/TSBHrIfui9J+eixMzO7sc52iHh0NvDomn3qIReQ/FD75XcdAaGte3HTfKlbXf1A3T7FA+jC0EX/uJBRtO2/XghQ94pU1c/uKWFk/mCdmb5Cf4lxTPTaEzxIHRuYw74Rkq7ytEj+AS8ae/DUPdedNSpMQipGfriIyV3+r/Bnp2UuO37Lf3A2Npxh77Gd1R8T2aAd7kfB2cU3JPf0g+M7SI7JMjhjWJV40oBwuN+/KtNJnTOtAPK30iHQuGwQ98uuM8U79NeteKK24Bmj3YA6MSbjrbAhxUGLvsg8cDxer/o8aIfcvqrIfg+9juuL4n6Zoos9/pjr0DFCgJV0HfSyXNy6TPABnBNmqp9EulpK0MlzQi7Cd62J9+gL9/OVKowXpTlDD6NNPPW8Mq/Py9fkx4ZXfzwRH/lVLwL2R/1QIb+rWNQLMCVgj5+qGlwehw0relzz7boiFBiP+24Anx1uo54a6CWm9DpjCZdcF7K2/UbWaWC3OqHRH/Hq/VP8F3tn+GPdiJHX9ULYpVGLyAlmCINjiWc5qjPwXt4uWDg5p3TwOyAf/JQAi4ceODdgqa+VtCWZ0r/lNqJGel8dPktTqjocq9sDwT/8ZexO/sh0d/tp7YzwXe1f4Zf89DDGOirx8MjjaKr+SV5KDAzy6QHZlY+bVPzZpTFt46I6S3F++/XdkLXK9Uiq8hKjvq01YzlthWyE3VtkzzAi/ZDk+UHbxYI219Fs77Cx2uDKziueGeeyv6MStAOKRtj0yuaK/mUPoPQhFsRFd/j7G1SdWur22v9O6ZN8Yn3a1RvDvuz/MjxRH1RyTvAjzfFr1BR2edqjDCopjZXYQAUqVM6/Sq/B66+k4Jzdn6iuH/VQYi04DXKFFX30R40VH5wcjsxj9E9bkGd7G/hdwEdUPTJGXKv/gEph4EyR8bG1gAAAABJRU5ErkJggg==\n", - "text/latex": [ - "$\\displaystyle - T_{env} + T_{init}$" - ], - "text/plain": [ - "-Tₑₙᵥ + Tᵢₙᵢₜ" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solutions = solve(Eq(at0, T_init), C1)\n", - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we plug the result into the general solution to get the particular solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle T_{env} + \\left(- T_{env} + T_{init}\\right) e^{- r t}$" - ], - "text/plain": [ - " -r⋅t\n", - "Tₑₙᵥ + (-Tₑₙᵥ + Tᵢₙᵢₜ)⋅ℯ " - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "particular = general.subs(C1, value_of_C1)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We use a similar process to estimate $r$ based on the observation $T(t_{end}) = T_{end}$" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "t_end, T_end = symbols('t_end T_end')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the particular solution evaluated at $t_{end}$" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle T_{env} + \\left(- T_{env} + T_{init}\\right) e^{- r t_{end}}$" - ], - "text/plain": [ - " -r⋅t_end\n", - "Tₑₙᵥ + (-Tₑₙᵥ + Tᵢₙᵢₜ)⋅ℯ " - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "at_end = particular.subs(t, t_end)\n", - "at_end" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we set $T(t_{end}) = T_{end}$ and solve for $r$" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle \\frac{\\log{\\left(\\frac{- T_{env} + T_{init}}{T_{end} - T_{env}} \\right)}}{t_{end}}$" - ], - "text/plain": [ - " ⎛-Tₑₙᵥ + Tᵢₙᵢₜ⎞\n", - "log⎜─────────────⎟\n", - " ⎝ T_end - Tₑₙᵥ⎠\n", - "──────────────────\n", - " t_end " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "solutions = solve(Eq(at_end, T_end), r)\n", - "value_of_r = solutions[0]\n", - "value_of_r" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `evalf` to plug in numbers for the symbols. The result is a SymPy float, which we have to convert to a Python float." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "sympy.core.numbers.Float" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "subs = dict(t_end=30, T_end=70, T_init=90, T_env=22)\n", - "r_coffee2 = value_of_r.evalf(subs=subs)\n", - "type(r_coffee2)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/latex": [ - "$\\displaystyle 0.011610223142273859$" - ], - "text/plain": [ - "0.011610223142273859" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "r_coffee2 = float(r_coffee2)\n", - "r_coffee2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap17.ipynb b/notebooks/chap17.ipynb deleted file mode 100644 index 834f0306..00000000 --- a/notebooks/chap17.ipynb +++ /dev/null @@ -1,273 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 17\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data\n", - "\n", - "We have data from Pacini and Bergman (1986), \"MINMOD: a computer program to calculate insulin sensitivity and pancreatic responsivity from the frequently sampled intravenous glucose tolerance test\", *Computer Methods and Programs in Biomedicine*, 23: 113-122.." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the glucose time series looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration (mg/dL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the insulin time series." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the book, I put them in a single figure, using `subplot`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "plot(data.glucose, 'bo', label='glucose')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "plot(data.insulin, 'go', label='insulin')\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interpolation\n", - "\n", - "We have measurements of insulin concentration at discrete points in time, but we need to estimate it at intervening points. We'll use `interpolate`, which takes a `Series` and returns a function:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The return value from `interpolate` is a function." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the result, `I`, to estimate the insulin level at any point in time." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "I(7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`I` can also take an array of time and return an array of estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(data)\n", - "t_end = get_last_label(data)\n", - "ts = linrange(t_0, t_end, endpoint=True)\n", - "I(ts)\n", - "type(ts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the interpolated values look like." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "plot(data.insulin, 'go', label='insulin data')\n", - "plot(ts, I(ts), color='green', label='interpolated')\n", - "\n", - "decorate(xlabel='Time (min)',\n", - " ylabel='Concentration ($\\mu$U/mL)')\n", - "\n", - "savefig('figs/chap17-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** [Read the documentation](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html) of `scipy.interpolate.interp1d`. Pass a keyword argument to `interpolate` to specify one of the other kinds of interpolation, and run the code again to see what it looks like. " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Interpolate the glucose data and generate a plot, similar to the previous one, that shows the data points and the interpolated curve evaluated at the time values in `ts`." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(interpolate)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap18.ipynb b/notebooks/chap18.ipynb deleted file mode 100644 index e8e6df35..00000000 --- a/notebooks/chap18.ipynb +++ /dev/null @@ -1,533 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 18\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n", - "Read the data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "data = pd.read_csv('data/glucose_insulin.csv', index_col='time');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpolate the insulin data." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "I = interpolate(data.insulin)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The glucose minimal model\n", - "\n", - "I'll cheat by starting with parameters that fit the data roughly; then we'll see how to improve them." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(G0 = 290,\n", - " k1 = 0.03,\n", - " k2 = 0.02,\n", - " k3 = 1e-05)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a version of `make_system` that takes the parameters and data:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params, data):\n", - " \"\"\"Makes a System object with the given parameters.\n", - " \n", - " params: sequence of G0, k1, k2, k3\n", - " data: DataFrame with `glucose` and `insulin`\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " G0, k1, k2, k3 = params\n", - " \n", - " Gb = data.glucose[0]\n", - " Ib = data.insulin[0]\n", - " I = interpolate(data.insulin)\n", - " \n", - " t_0 = get_first_label(data)\n", - " t_end = get_last_label(data)\n", - "\n", - " init = State(G=G0, X=0)\n", - " \n", - " return System(params,\n", - " init=init, Gb=Gb, Ib=Ib, I=I,\n", - " t_0=t_0, t_end=t_end, dt=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params, data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the update function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Updates the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " dt = system.dt\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " G += dGdt * dt\n", - " X += dXdt * dt\n", - "\n", - " return State(G=G, X=X)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before running the simulation, it is always a good idea to test the update function using the initial conditions. In this case we can veryify that the results are at least qualitatively correct." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "update_func(system.init, system.t_0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` is pretty much the same as it always is." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init = system.init\n", - " t_0, t_end, dt = system.t_0, system.t_end, system.dt\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t_0] = init\n", - " ts = linrange(t_0, t_end, dt)\n", - " \n", - " for t in ts:\n", - " frame.row[t+dt] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are in a `TimeFrame` object with one column per state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following plot shows the results of the simulation along with the actual glucose data." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "\n", - "plot(results.G, 'b-', label='simulation')\n", - "plot(data.glucose, 'bo', label='glucose data')\n", - "decorate(ylabel='Concentration (mg/dL)')\n", - "\n", - "subplot(2, 1, 2)\n", - "\n", - "plot(results.X, 'C1', label='remote insulin')\n", - "\n", - "decorate(xlabel='Time (min)', \n", - " ylabel='Concentration (arbitrary units)')\n", - "\n", - "savefig('figs/chap18-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Numerical solution\n", - "\n", - "Now let's solve the differential equation numerically using `run_ode_solver`, which is an implementation of Ralston's method.\n", - "\n", - "Instead of an update function, we provide a slope function that evaluates the right-hand side of the differential equations.\n", - "\n", - "We don't have to do the update part; the solver does it for us." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the glucose minimal model.\n", - " \n", - " state: State object\n", - " t: time in min\n", - " system: System object\n", - " \n", - " returns: derivatives of G and X\n", - " \"\"\"\n", - " G, X = state\n", - " k1, k2, k3 = system.k1, system.k2, system.k3 \n", - " I, Ib, Gb = system.I, system.Ib, system.Gb\n", - " \n", - " dGdt = -k1 * (G - Gb) - X*G\n", - " dXdt = k3 * (I(t) - Ib) - k2 * X\n", - " \n", - " return dGdt, dXdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run the ODE solver." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details = run_ode_solver(system, slope_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`details` is a `ModSimSeries` object with information about how the solver worked." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`results` is a `TimeFrame` with one row for each time step and one column for each state variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the results from `run_simulation` and `run_ode_solver`, we can see that they are not very different." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.G, 'C0', label='run_simulation')\n", - "plot(results2.G, 'C2--', label='run_ode_solver')\n", - "\n", - "decorate(xlabel='Time (min)', ylabel='Concentration (mg/dL)')\n", - "\n", - "savefig('figs/chap18-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The differences in `G` are less than 2%." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "diff = results.G - results2.G\n", - "percent_diff = diff / results2.G * 100\n", - "percent_diff" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "max(abs(percent_diff))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Our solution to the differential equations is only approximate because we used a finite step size, `dt=2` minutes.\n", - "\n", - "If we make the step size smaller, we expect the solution to be more accurate. Run the simulation with `dt=1` and compare the results. What is the largest relative error between the two solutions?" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Here's the source code for `run_ode_solver` if you'd like to know how it works.\n", - "\n", - "Notice that `run_ode_solver` is another name for `run_ralston`, which implements [Ralston's method](https://en.wikipedia.org/wiki/List_of_Runge–Kutta_methods)." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(run_ode_solver)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related reading:** You might be interested in this article about [people making a DIY artificial pancreas](https://www.bloomberg.com/news/features/2018-08-08/the-250-biohack-that-s-revolutionizing-life-with-diabetes)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap20.ipynb b/notebooks/chap20.ipynb deleted file mode 100644 index 46fc858c..00000000 --- a/notebooks/chap20.ipynb +++ /dev/null @@ -1,643 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 20\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dropping pennies\n", - "\n", - "I'll start by getting the units we need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And defining the initial state." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "init = State(y=381 * m, \n", - " v=0 * m/s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Acceleration due to gravity is about 9.8 m / s$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "g = 9.8 * m/s**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start with a duration of 10 seconds and step size 0.1 second." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10 * s" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "dt = 0.1 * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(init=init, g=g, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And define the slope function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object containing `g`\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " g = system.g \n", - "\n", - " dydt = v\n", - " dvdt = -g\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's always a good idea to test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "dydt, dvdt = slope_func(system.init, 0, system)\n", - "print(dydt)\n", - "print(dvdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we're ready to call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's position as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_position(results):\n", - " plot(results.y, label='y')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "plot_position(results)\n", - "savefig('figs/chap20-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Onto the sidewalk\n", - "\n", - "To figure out when the penny hit the sidewalk, we can use `crossings`, which finds the times where a `Series` passes through a given value." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "t_crossings = crossings(results.y, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For this example there should be just one crossing, the time when the penny hits the sidewalk." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = t_crossings[0] * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare that to the exact result. Without air resistance, we have\n", - "\n", - "$v = -g t$\n", - "\n", - "and\n", - "\n", - "$y = 381 - g t^2 / 2$\n", - "\n", - "Setting $y=0$ and solving for $t$ yields\n", - "\n", - "$t = \\sqrt{\\frac{2 y_{init}}{g}}$" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "sqrt(2 * init.y / g)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The estimate is accurate to about 9 decimal places." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Events\n", - "\n", - "Instead of running the simulation until the penny goes through the sidewalk, it would be better to detect the point where the penny hits the sidewalk and stop. `run_ode_solver` provides exactly the tool we need, **event functions**.\n", - "\n", - "Here's an event function that returns the height of the penny above the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we pass it to `run_ode_solver`. The solver should run until the event function returns 0, and then terminate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The message from the solver indicates the solver stopped because the event we wanted to detect happened.\n", - "\n", - "Here are the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the `events` option, the solver returns the actual time steps it computed, which are not necessarily equally spaced. \n", - "\n", - "The last time step is when the event occurred:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is accurate to about 4 decimal places.\n", - "\n", - "We can also check the velocity of the penny when it hits the sidewalk:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "v_sidewalk = get_last_value(results.v)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And convert to kilometers per hour." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "km = UNITS.kilometer\n", - "h = UNITS.hour\n", - "v_sidewalk.to(km / h)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If there were no air resistance, the penny would hit the sidewalk (or someone's head) at more than 300 km/h.\n", - "\n", - "So it's a good thing there is air resistance." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Under the hood\n", - "\n", - "Here is the source code for `crossings` so you can see what's happening under the hood:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(crossings)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The [documentation of InterpolatedUnivariateSpline is here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Here's a question from the web site [Ask an Astronomer](http://curious.astro.cornell.edu/about-us/39-our-solar-system/the-earth/other-catastrophes/57-how-long-would-it-take-the-earth-to-fall-into-the-sun-intermediate):\n", - "\n", - "\"If the Earth suddenly stopped orbiting the Sun, I know eventually it would be pulled in by the Sun's gravity and hit it. How long would it take the Earth to hit the Sun? I imagine it would go slowly at first and then pick up speed.\"\n", - "\n", - "Use `run_ode_solver` to answer this question.\n", - "\n", - "Here are some suggestions about how to proceed:\n", - "\n", - "1. Look up the Law of Universal Gravitation and any constants you need. I suggest you work entirely in SI units: meters, kilograms, and Newtons.\n", - "\n", - "2. When the distance between the Earth and the Sun gets small, this system behaves badly, so you should use an event function to stop when the surface of Earth reaches the surface of the Sun.\n", - "\n", - "3. Express your answer in days, and plot the results as millions of kilometers versus days.\n", - "\n", - "If you read the reply by Dave Rothstein, you will see other ways to solve the problem, and a good discussion of the modeling decisions behind them.\n", - "\n", - "You might also be interested to know that [it's actually not that easy to get to the Sun](https://www.theatlantic.com/science/archive/2018/08/parker-solar-probe-launch-nasa/567197/)." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap21.ipynb b/notebooks/chap21.ipynb deleted file mode 100644 index 54539d62..00000000 --- a/notebooks/chap21.ipynb +++ /dev/null @@ -1,514 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 21\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### With air resistance" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we'll add air resistance using the [drag equation](https://en.wikipedia.org/wiki/Drag_equation)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I'll start by getting the units we'll need from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now I'll create a `Params` object to contain the quantities we need. Using a Params object is convenient for grouping the system parameters in a way that's easy to read (and double-check)." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(height = 381 * m,\n", - " v_init = 0 * m / s,\n", - " g = 9.8 * m/s**2,\n", - " mass = 2.5e-3 * kg,\n", - " diameter = 19e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " v_term = 18 * m / s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can pass the `Params` object `make_system` which computes some additional parameters and defines `init`.\n", - "\n", - "`make_system` uses the given radius to compute `area` and the given `v_term` to compute the drag coefficient `C_d`." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Makes a System object for the given conditions.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " diameter, mass = params.diameter, params.mass\n", - " g, rho = params.g, params.rho, \n", - " v_init, v_term = params.v_init, params.v_term\n", - " height = params.height\n", - " \n", - " area = np.pi * (diameter/2)**2\n", - " C_d = 2 * mass * g / (rho * area * v_term**2)\n", - " init = State(y=height, v=v_init)\n", - " t_end = 30 * s\n", - " dt = t_end / 100\n", - " \n", - " return System(params, area=area, C_d=C_d, \n", - " init=init, t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make a `System`" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function, including acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Compute derivatives of the state.\n", - " \n", - " state: position, velocity\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: derivatives of y and v\n", - " \"\"\"\n", - " y, v = state\n", - " rho, C_d, g = system.rho, system.C_d, system.g\n", - " area, mass = system.area, system.mass\n", - " \n", - " f_drag = rho * v**2 * C_d * area / 2\n", - " a_drag = f_drag / mass\n", - " \n", - " dydt = v\n", - " dvdt = -g + a_drag\n", - " \n", - " return dydt, dvdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, let's test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use the same event function as in the previous chapter." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Return the height of the penny above the sidewalk.\n", - " \"\"\"\n", - " y, v = state\n", - " return y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final height is close to 0, as expected.\n", - "\n", - "Interestingly, the final velocity is not exactly terminal velocity, which suggests that there are some numerical errors.\n", - "\n", - "We can get the flight time from `results`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "t_sidewalk = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the plot of position as a function of time." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_position(results):\n", - " plot(results.y)\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - " \n", - "plot_position(results)\n", - "savefig('figs/chap21-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And velocity as a function of time:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_velocity(results):\n", - " plot(results.v, color='C1', label='v')\n", - " \n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')\n", - " \n", - "plot_velocity(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From an initial velocity of 0, the penny accelerates downward until it reaches terminal velocity; after that, velocity is constant." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with an initial velocity, downward, that exceeds the penny's terminal velocity. Hint: You can create a new `Params` object based on an existing one, like this:\n", - "\n", - "`params2 = Params(params, v_init=-30 * m/s)`\n", - "\n", - "What do you expect to happen? Plot velocity and position as a function of time, and see if they are consistent with your prediction." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "plot_position(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we drop a quarter from the Empire State Building and find that its flight time is 19.1 seconds. Use this measurement to estimate the terminal velocity.\n", - "\n", - "1. You can get the relevant dimensions of a quarter from https://en.wikipedia.org/wiki/Quarter_(United_States_coin).\n", - "\n", - "2. Create a `Params` object with the system parameters. We don't know `v_term`, so we'll start with the inital guess `v_term = 18 * m / s`.\n", - "\n", - "3. Use `make_system` to create a `System` object.\n", - "\n", - "4. Call `run_ode_solver` to simulate the system. How does the flight time of the simulation compare to the measurement?\n", - "\n", - "5. Try a few different values of `t_term` and see if you can get the simulated flight time close to 19.1 seconds.\n", - "\n", - "6. Optionally, write an error function and use `root_scalar` to improve your estimate.\n", - "\n", - "7. Use your best estimate of `v_term` to compute `C_d`.\n", - "\n", - "Note: I fabricated the observed flight time, so don't take the results of this exercise too seriously." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap22.ipynb b/notebooks/chap22.ipynb deleted file mode 100644 index 5a41edee..00000000 --- a/notebooks/chap22.ipynb +++ /dev/null @@ -1,1238 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 22\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Vectors" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Vector` object represents a vector quantity. In the context of mechanics, vector quantities include position, velocity, acceleration, and force, all of which might be in 2D or 3D.\n", - "\n", - "You can define a `Vector` object without units, but if it represents a physical quantity, you will often want to attach units to it.\n", - "\n", - "I'll start by grabbing the units we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a two dimensional `Vector` in meters." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "A = Vector(3, 4) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the elements by name." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "A.x" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "A.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The magnitude is the length of the vector." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The angle is the number of radians between the vector and the positive x axis." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we make another `Vector` with the same units," - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "B = Vector(1, 2) * m" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can add `Vector` objects like this" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "A + B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And subtract like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "A - B" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compute the Euclidean distance between two Vectors." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "A.dist(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the difference in angle" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "A.diff_angle(B)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we are given the magnitude and angle of a vector, what we have is the representation of the vector in polar coordinates." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "mag = A.mag\n", - "angle = A.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `pol2cart` to convert from polar to Cartesian coordinates, and then use the Cartesian coordinates to make a `Vector` object.\n", - "\n", - "In this example, the `Vector` we get should have the same components as `A`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "x, y = pol2cart(angle, mag)\n", - "Vector(x, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another way to represent the direction of `A` is a unit vector, which is a vector with magnitude 1 that points in the same direction as `A`. You can compute a unit vector by dividing a vector by its magnitude:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "A / A.mag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or by using the `hat` function, so named because unit vectors are conventionally decorated with a hat, like this: $\\hat{A}$:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "A.hat()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_grav` that represents acceleration due to gravity, with x component 0 and y component $-9.8$ meters / second$^2$." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Degrees and radians\n", - "\n", - "Pint provides units to represent degree and radians." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "degree = UNITS.degree\n", - "radian = UNITS.radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you have an angle in degrees," - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "angle = 45 * degree\n", - "angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can convert to radians." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad = angle.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If it's already in radians, `to` does the right thing." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad.to(radian)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also convert from radians to degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "angle_rad.to(degree)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As an alterative, you can use `np.deg2rad`, which works with Pint quantities, but it also works with simple numbers and NumPy arrays:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "np.deg2rad(angle)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Create a `Vector` named `a_force` that represents acceleration due to a force of 0.5 Newton applied to an object with mass 0.3 kilograms, in a direction 45 degrees up from the positive x-axis.\n", - "\n", - "Add `a_force` to `a_grav` from the previous exercise. If that addition succeeds, that means that the units are compatible. Confirm that the total acceleration seems to make sense." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Baseball" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `Params` object that contains parameters for the flight of a baseball." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 10 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.33,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end, dt=dt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the function that uses the `Params` object to make a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that computes drag force using vectors:" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `v`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can test it like this." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "V_test = Vector(10, 10) * m/s\n", - "drag_force(V_test, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the slope function that computes acceleration due to gravity and drag." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an event function to stop the simulation when the ball hits the ground:" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call `run_ode_solver`" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final label tells us the flight time." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "flight_time = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `x` tells us the how far the ball landed from home plate:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "R_final = get_last_value(results.R)\n", - "x_dist = R_final.x" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Visualizing the results\n", - "\n", - "The simplest way to visualize the results is to plot x and y as functions of time." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "xs.plot()\n", - "ys.plot()\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Position (m)')\n", - "\n", - "savefig('figs/chap22-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can plot the velocities the same way." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "vx = results.V.extract('x')\n", - "vy = results.V.extract('y')\n", - "\n", - "vx.plot(label='vx')\n", - "vy.plot(label='vy')\n", - "\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Velocity (m/s)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The x velocity slows down due to drag.\n", - "\n", - "The y velocity drops quickly while drag and gravity are in the same direction, then more slowly after the ball starts to fall.\n", - "\n", - "Another way to visualize the results is to plot y versus x. The result is the trajectory of the ball through its plane of motion." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_trajectory(results):\n", - " xs = results.R.extract('x')\n", - " ys = results.R.extract('y')\n", - " plot(xs, ys, color='C2', label='trajectory')\n", - "\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')\n", - "\n", - "plot_trajectory(results)\n", - "savefig('figs/chap22-fig02.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "One of the best ways to visualize the results of a physical model is animation. If there are problems with the model, animation can make them apparent.\n", - "\n", - "The ModSimPy library provides `animate`, which takes as parameters a `TimeSeries` and a draw function.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The draw function should take as parameters a `State` object and the time. It should draw a single frame of the animation.\n", - "\n", - "Inside the draw function, you almost always have to call `set_xlim` and `set_ylim`. Otherwise `matplotlib` auto-scales the axes, which is usually not what you want." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "xs = results.R.extract('x')\n", - "ys = results.R.extract('y')\n", - "\n", - "def draw_func(state, t):\n", - " set_xlim(xs)\n", - " set_ylim(ys)\n", - " x, y = state.R\n", - " plot(x, y, 'bo')\n", - " decorate(xlabel='x position (m)',\n", - " ylabel='y position (m)')" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Delete the lines that set the x and y axes (or [comment them out](https://en.wiktionary.org/wiki/comment_out)) and see what the animation does." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "`Vector` is a function that returns a `ModSimVector` object." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "V = Vector(3, 4)\n", - "type(V)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `ModSimVector` is a specialized kind of Pint `Quantity`." - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "isinstance(V, Quantity)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There's one gotcha you might run into with Vectors and Quantities. If you multiply a `ModSimVector` and a `Quantity`, you get a `ModSimVector`:" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "V1 = V * m" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "type(V1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you multiply a `Quantity` and a `Vector`, you get a `Quantity`:" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "V2 = m * V" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "type(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `ModSimVector` you can get the coordinates using dot notation, as well as `mag`, `mag2`, and `angle`:" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "V1.x, V1.y, V1.mag, V1.angle" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With a `Quantity`, you can't. But you can use indexing to get the coordinates:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "V2[0], V2[1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can use vector functions to get the magnitude and angle." - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "vector_mag(V2), vector_angle(V2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And often you can avoid the whole issue by doing the multiplication with the `ModSimVector` on the left." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation with and without air resistance. How wrong would we be if we ignored drag?" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system_no_drag = System(system, C_d=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The baseball stadium in Denver, Colorado is 1,580 meters above sea level, where the density of air is about 1.0 kg / meter$^3$. How much farther would a ball hit with the same velocity and launch angle travel?" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "# Hint\n", - "\n", - "system2 = System(system, rho=1.0*kg/m**3)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The model so far is based on the assumption that coefficient of drag does not depend on velocity, but in reality it does. The following figure, from Adair, [*The Physics of Baseball*](https://books.google.com/books/about/The_Physics_of_Baseball.html?id=4xE4Ngpk_2EC), shows coefficient of drag as a function of velocity.\n", - "\n", - "\n", - "\n", - "\n", - "I used [an online graph digitizer](https://automeris.io/WebPlotDigitizer/) to extract the data and save it in a CSV file. Here's how we can read it:" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "baseball_drag = pd.read_csv('data/baseball_drag.csv')\n", - "mph = Quantity(baseball_drag['Velocity in mph'], UNITS.mph)\n", - "mps = mph.to(m/s)\n", - "baseball_drag.index = magnitude(mps)\n", - "baseball_drag.index.name = 'Velocity in meters per second'\n", - "baseball_drag" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Modify the model to include the dependence of `C_d` on velocity, and see how much it affects the results. Hint: use `interpolate`." - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "C_d = drag_interp(43 * m / s)" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap23.ipynb b/notebooks/chap23.ipynb deleted file mode 100644 index 0eca5394..00000000 --- a/notebooks/chap23.ipynb +++ /dev/null @@ -1,571 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 23\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "degree = UNITS.degree" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = 20 * s\n", - "dt = t_end / 100\n", - "\n", - "params = Params(x = 0 * m, \n", - " y = 1 * m,\n", - " g = 9.8 * m/s**2,\n", - " mass = 145e-3 * kg,\n", - " diameter = 73e-3 * m,\n", - " rho = 1.2 * kg/m**3,\n", - " C_d = 0.3,\n", - " angle = 45 * degree,\n", - " velocity = 40 * m / s,\n", - " t_end=t_end,\n", - " dt=dt)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object with angle, velocity, x, y,\n", - " diameter, duration, g, mass, rho, and C_d\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " angle, velocity = params.angle, params.velocity\n", - " \n", - " # convert angle to degrees\n", - " theta = np.deg2rad(angle)\n", - " \n", - " # compute x and y components of velocity\n", - " vx, vy = pol2cart(theta, velocity)\n", - " \n", - " # make the initial state\n", - " R = Vector(params.x, params.y)\n", - " V = Vector(vx, vy)\n", - " init = State(R=R, V=V)\n", - " \n", - " # compute area from diameter\n", - " diameter = params.diameter\n", - " area = np.pi * (diameter/2)**2\n", - " \n", - " return System(params, init=init, area=area)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def drag_force(V, system):\n", - " \"\"\"Computes drag force in the opposite direction of `V`.\n", - " \n", - " V: velocity Vector\n", - " system: System object with rho, C_d, area\n", - " \n", - " returns: Vector drag force\n", - " \"\"\"\n", - " rho, C_d, area = system.rho, system.C_d, system.area\n", - " \n", - " mag = rho * V.mag**2 * C_d * area / 2\n", - " direction = -V.hat()\n", - " f_drag = direction * mag\n", - " return f_drag" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes derivatives of the state variables.\n", - " \n", - " state: State (x, y, x velocity, y velocity)\n", - " t: time\n", - " system: System object with g, rho, C_d, area, mass\n", - " \n", - " returns: sequence (vx, vy, ax, ay)\n", - " \"\"\"\n", - " R, V = state\n", - " mass, g = system.mass, system.g\n", - " \n", - " a_drag = drag_force(V, system) / mass\n", - " a_grav = Vector(0, -g)\n", - " \n", - " A = a_grav + a_drag\n", - " \n", - " return V, A" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Stop when the y coordinate is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: y coordinate\n", - " \"\"\"\n", - " R, V = state\n", - " return R.y" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimal launch angle\n", - "\n", - "To find the launch angle that maximizes distance from home plate, we need a function that takes launch angle and returns range." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def range_func(angle, params): \n", - " \"\"\"Computes range for a given launch angle.\n", - " \n", - " angle: launch angle in degrees\n", - " params: Params object\n", - " \n", - " returns: distance in meters\n", - " \"\"\"\n", - " params = Params(params, angle=angle)\n", - " system = make_system(params)\n", - " results, details = run_ode_solver(system, slope_func, events=event_func)\n", - " x_dist = get_last_value(results.R).x\n", - " print(angle, x_dist)\n", - " return x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test `range_func`." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "range_func(45, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And sweep through a range of angles." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "angles = linspace(20, 80, 21)\n", - "sweep = SweepSeries()\n", - "\n", - "for angle in angles:\n", - " x_dist = range_func(angle, params)\n", - " sweep[angle] = x_dist" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting the `Sweep` object, it looks like the peak is between 40 and 45 degrees." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, color='C2')\n", - "decorate(xlabel='Launch angle (degree)',\n", - " ylabel='Range (m)',\n", - " title='Range as a function of launch angle',\n", - " legend=False)\n", - "\n", - "savefig('figs/chap23-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `maximize` to search for the peak efficiently." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "bounds = [0, 90] * degree\n", - "res = maximize(range_func, bounds, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`res` is an `ModSimSeries` object with detailed results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "res" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`x` is the optimal angle and `fun` the optional range." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "optimal_angle = res.x" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "max_x_dist = res.fun" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "Read the source code for `maximize` and `minimize_scalar`, below.\n", - "\n", - "Add a print statement to `range_func` that prints `angle`. Then run `maximize` again so you can see how many times it calls `range_func` and what the arguments are." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(maximize)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(minimize_scalar)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### The Manny Ramirez problem\n", - "\n", - "Finally, let's solve the Manny Ramirez problem:\n", - "\n", - "*What is the minimum effort required to hit a home run in Fenway Park?*\n", - "\n", - "Fenway Park is a baseball stadium in Boston, Massachusetts. One of its most famous features is the \"Green Monster\", which is a wall in left field that is unusually close to home plate, only 310 feet along the left field line. To compensate for the short distance, the wall is unusually high, at 37 feet.\n", - "\n", - "Although the problem asks for a minimum, it is not an optimization problem. Rather, we want to solve for the initial velocity that just barely gets the ball to the top of the wall, given that it is launched at the optimal angle.\n", - "\n", - "And we have to be careful about what we mean by \"optimal\". For this problem, we don't want the longest range, we want the maximum height at the point where it reaches the wall.\n", - "\n", - "If you are ready to solve the problem on your own, go ahead. Otherwise I will walk you through the process with an outline and some starter code.\n", - "\n", - "As a first step, write a function called `height_func` that takes a launch angle and a params as parameters, simulates the flights of a baseball, and returns the height of the baseball when it reaches a point 94.5 meters (310 feet) from home plate." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Always test the slope function with the initial conditions." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function with a launch angle of 45 degrees:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now use `maximize` to find the optimal angle. Is it higher or lower than the angle that maximizes range?" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With initial velocity 40 m/s and an optimal launch angle, the ball clears the Green Monster with a little room to spare.\n", - "\n", - "Which means we can get over the wall with a lower initial velocity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Finding the minimum velocity\n", - "\n", - "Even though we are finding the \"minimum\" velocity, we are not really solving a minimization problem. Rather, we want to find the velocity that makes the height at the wall exactly 11 m, given given that it's launched at the optimal angle. And that's a job for `root_bisect`.\n", - "\n", - "Write an error function that takes a velocity and a `Params` object as parameters. It should use `maximize` to find the highest possible height of the ball at the wall, for the given velocity. Then it should return the difference between that optimal height and 11 meters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your error function before you call `root_bisect`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then use `root_bisect` to find the answer to the problem, the minimum velocity that gets the ball out of the park." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And just to check, run `error_func` with the value you found." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap24.ipynb b/notebooks/chap24.ipynb deleted file mode 100644 index 6d7e6b52..00000000 --- a/notebooks/chap24.ipynb +++ /dev/null @@ -1,640 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 24\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Rolling paper\n", - "\n", - "We'll start by loading the units we need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And creating a `Params` object with the system parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(Rmin = 0.02 * m,\n", - " Rmax = 0.055 * m,\n", - " L = 47 * m,\n", - " omega = 10 * radian / s,\n", - " t_end = 130 * s,\n", - " dt = 1*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function estimates the parameter `k`, which is the increase in the radius of the roll for each radian of rotation. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def estimate_k(params):\n", - " \"\"\"Estimates the parameter `k`.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: k in meters per radian\n", - " \"\"\"\n", - " Rmin, Rmax, L = params.Rmin, params.Rmax, params.L\n", - " \n", - " Ravg = (Rmax + Rmin) / 2\n", - " Cavg = 2 * pi * Ravg\n", - " revs = L / Cavg\n", - " rads = 2 * pi * revs\n", - " k = (Rmax - Rmin) / rads\n", - " return k" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As usual, `make_system` takes a `Params` object and returns a `System` object." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params with Rmin, Rmax, and L\n", - " \n", - " returns: System with init, k, and ts\n", - " \"\"\"\n", - " init = State(theta = 0 * radian,\n", - " y = 0 * m,\n", - " r = params.Rmin)\n", - " \n", - " k = estimate_k(params)\n", - "\n", - " return System(params, init=init, k=k)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `make_system`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "system = make_system(params)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "system.init" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write a slope function based on the differential equations\n", - "\n", - "$\\omega = \\frac{d\\theta}{dt} = 10$\n", - "\n", - "$\\frac{dy}{dt} = r \\frac{d\\theta}{dt}$\n", - "\n", - "$\\frac{dr}{dt} = k \\frac{d\\theta}{dt}$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with r, k\n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, y, r = state\n", - " k, omega = system.k, system.omega\n", - " \n", - " dydt = r * omega\n", - " drdt = k * omega\n", - " \n", - " return omega, dydt, drdt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing `slope_func`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll use an event function to stop when `y=L`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func(state, t, system):\n", - " \"\"\"Detects when we've rolled length `L`.\n", - " \n", - " state: State object with theta, y, r\n", - " t: time\n", - " system: System object with L\n", - " \n", - " returns: difference between `y` and `L`\n", - " \"\"\"\n", - " theta, y, r = state\n", - " \n", - " return y - system.L" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "event_func(system.init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results, details = run_ode_solver(system, slope_func, events=event_func)\n", - "details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of `y` is 47 meters, as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "unrolled = get_last_value(results.y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final value of radius is `R_max`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "radius = get_last_value(results.r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The total number of rotations is close to 200, which seems plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "radians = get_last_value(results.theta) \n", - "rotations = magnitude(radians) / 2 / np.pi" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The elapsed time is about 2 minutes, which is also plausible." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "t_final = get_last_label(results) * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Plotting" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `theta`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, color='C0', label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `y`" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_y(results):\n", - " plot(results.y, color='C1', label='y')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Length (m)')\n", - " \n", - "plot_y(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Plotting `r`" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_r(results):\n", - " plot(results.r, color='C2', label='r')\n", - "\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Radius (m)')\n", - " \n", - "plot_r(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also see the relationship between `y` and `r`, which I derive analytically in the book." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.r, results.y, color='C3')\n", - "\n", - "decorate(xlabel='Radius (m)',\n", - " ylabel='Length (m)',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the figure from the book." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_three(results):\n", - " subplot(3, 1, 1)\n", - " plot_theta(results)\n", - "\n", - " subplot(3, 1, 2)\n", - " plot_y(results)\n", - "\n", - " subplot(3, 1, 3)\n", - " plot_r(results)\n", - "\n", - "plot_three(results)\n", - "savefig('figs/chap24-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "Here's a draw function that animates the results using `matplotlib` patches." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " # get radius in mm\n", - " theta, y, r = state\n", - " radius = r.magnitude * 1000\n", - " \n", - " # draw a circle with\n", - " circle = Circle([0, 0], radius, fill=True)\n", - " plt.gca().add_patch(circle)\n", - " \n", - " # draw an arrow to show rotation\n", - " dx, dy = pol2cart(theta, radius)\n", - " arrow = Arrow(0, 0, dx, dy)\n", - " plt.gca().add_patch(arrow)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Run the simulation again with a smaller step size to smooth out the animation." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Since we keep `omega` constant, the linear velocity of the paper increases with radius. Use `gradient` to estimate the derivative of `results.y`. What is the peak linear velocity?" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "plot(dydt, label='dydt')\n", - "decorate(xlabel='Time (s)',\n", - " ylabel='Linear velocity (m/s)')" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now suppose the peak velocity is the limit; that is, we can't move the paper any faster than that.\n", - "\n", - "Nevertheless, we might be able to speed up the process by keeping the linear velocity at the maximum all the time.\n", - "\n", - "Write a slope function that keeps the linear velocity, `dydt`, constant, and computes the angular velocity, `omega`, accordingly.\n", - "\n", - "Run the simulation and see how much faster we could finish rolling the paper." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/chap25.ipynb b/notebooks/chap25.ipynb deleted file mode 100644 index 5c74611e..00000000 --- a/notebooks/chap25.ipynb +++ /dev/null @@ -1,944 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Modeling and Simulation in Python\n", - "\n", - "Chapter 25\n", - "\n", - "Copyright 2017 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# Configure Jupyter to display the assigned value after an assignment\n", - "%config InteractiveShell.ast_node_interactivity='last_expr_or_assign'\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Teapots and Turntables" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Tables in Chinese restaurants often have a rotating tray or turntable that makes it easy for customers to share dishes. These turntables are supported by low-friction bearings that allow them to turn easily and glide. However, they can be heavy, especially when they are loaded with food, so they have a high moment of inertia.\n", - "\n", - "Suppose I am sitting at a table with a pot of tea on the turntable directly in front of me, and the person sitting directly opposite asks me to pass the tea. I push on the edge of the turntable with 1 Newton of force until it has turned 0.5 radians, then let go. The turntable glides until it comes to a stop 1.5 radians from the starting position. How much force should I apply for a second push so the teapot glides to a stop directly opposite me?\n", - "\n", - "The following figure shows the scenario, where `F` is the force I apply to the turntable at the perimeter, perpendicular to the moment arm, `r`, and `tau` is the resulting torque. The blue circle near the bottom is the teapot.\n", - "\n", - "![](diagrams/teapot.png)\n", - "\n", - "We'll answer this question in these steps:\n", - "\n", - "1. We'll use the results from the first push to estimate the coefficient of friction for the turntable.\n", - "\n", - "2. We'll use that coefficient of friction to estimate the force needed to rotate the turntable through the remaining angle.\n", - "\n", - "Our simulation will use the following parameters:\n", - "\n", - "1. The radius of the turntable is 0.5 meters, and its weight is 7 kg.\n", - "\n", - "2. The teapot weights 0.3 kg, and it sits 0.4 meters from the center of the turntable.\n", - "\n", - "As usual, I'll get units from Pint." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "radian = UNITS.radian\n", - "m = UNITS.meter\n", - "s = UNITS.second\n", - "kg = UNITS.kilogram\n", - "N = UNITS.newton" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And store the parameters in a `Params` object." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "params = Params(radius_disk=0.5*m,\n", - " mass_disk=7*kg,\n", - " radius_pot=0.4*m,\n", - " mass_pot=0.3*kg,\n", - " force=1*N,\n", - " torque_friction=0.2*N*m,\n", - " theta_end=0.5*radian,\n", - " t_end=20*s)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates the initial state, `init`, and computes the total moment of inertia for the turntable and the teapot." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(params):\n", - " \"\"\"Make a system object.\n", - " \n", - " params: Params object\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " mass_disk, mass_pot = params.mass_disk, params.mass_pot\n", - " radius_disk, radius_pot = params.radius_disk, params.radius_pot\n", - " \n", - " init = State(theta=0*radian, omega=0*radian/s)\n", - " \n", - " I_disk = mass_disk * radius_disk**2 / 2\n", - " I_pot = mass_pot * radius_pot**2\n", - " \n", - " return System(params, init=init, I=I_disk+I_pot)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `System` object we'll use for the first phase of the simulation, while I am pushing the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "system1 = make_system(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulation\n", - "\n", - "When I stop pushing on the turntable, the angular acceleration changes abruptly. We could implement the slope function with an `if` statement that checks the value of `theta` and sets `force` accordingly. And for a coarse model like this one, that might be fine. But we will get more accurate results if we simulate the system in two phases:\n", - "\n", - "1. During the first phase, force is constant, and we run until `theta` is 0.5 radians.\n", - "\n", - "2. During the second phase, force is 0, and we run until `omega` is 0.\n", - "\n", - "Then we can combine the results of the two phases into a single `TimeFrame`.\n", - "\n", - "Here's the slope function we'll use:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def slope_func(state, t, system):\n", - " \"\"\"Computes the derivatives of the state variables.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: sequence of derivatives\n", - " \"\"\"\n", - " theta, omega = state\n", - " radius_disk, force = system.radius_disk, system.force\n", - " torque_friction, I = system.torque_friction, system.I\n", - " \n", - " torque = radius_disk * force - torque_friction\n", - " alpha = torque / I\n", - " \n", - " return omega, alpha " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we'll test the slope function before running the simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops the simulation when `theta` reaches `theta_end`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func1(state, t, system):\n", - " \"\"\"Stops when theta reaches theta_end.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: difference from target\n", - " \"\"\"\n", - " theta, omega = state\n", - " return theta - system.theta_end " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "event_func1(system1.init, 0, system1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "results1, details1 = run_ode_solver(system1, slope_func, events=event_func1)\n", - "details1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And look at the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Phase 2\n", - "\n", - "Before we run the second phase, we have to extract the final time and state of the first phase." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = results1.last_label() * s" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And make an initial `State` object for Phase 2." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "init2 = results1.last_row()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And a new `System` object with zero force." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "system2 = System(system1, t_0=t_0, init=init2, force=0*N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an event function that stops when angular velocity is 0." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def event_func2(state, t, system):\n", - " \"\"\"Stops when omega is 0.\n", - " \n", - " state: State object\n", - " t: time\n", - " system: System object \n", - " \n", - " returns: omega\n", - " \"\"\"\n", - " theta, omega = state\n", - " return omega" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "event_func2(system2.init, 0, system2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the second phase." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "slope_func(system2.init, system2.t_0, system2)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "results2, details2 = run_ode_solver(system2, slope_func, events=event_func2)\n", - "details2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "results2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Pandas provides `combine_first`, which combines `results1` and `results2`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "results = results1.combine_first(results2)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot `theta` for both phases." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_theta(results):\n", - " plot(results.theta, label='theta')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angle (rad)')\n", - " \n", - "plot_theta(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `omega`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_omega(results):\n", - " plot(results.omega, label='omega', color='C1')\n", - " decorate(xlabel='Time (s)',\n", - " ylabel='Angular velocity (rad/s)')\n", - " \n", - "plot_omega(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "subplot(2, 1, 1)\n", - "plot_theta(results)\n", - "subplot(2, 1, 2)\n", - "plot_omega(results)\n", - "savefig('figs/chap25-fig01.pdf')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Estimating friction\n", - "\n", - "Let's take the code from the previous section and wrap it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def run_two_phases(force, torque_friction, params):\n", - " \"\"\"Run both phases.\n", - " \n", - " force: force applied to the turntable\n", - " torque_friction: friction due to torque\n", - " params: Params object\n", - " \n", - " returns: TimeFrame of simulation results\n", - " \"\"\"\n", - " # put the specified parameters into the Params object\n", - " params = Params(params, force=force, torque_friction=torque_friction)\n", - "\n", - " # run phase 1\n", - " system1 = make_system(params)\n", - " results1, details1 = run_ode_solver(system1, slope_func, \n", - " events=event_func1)\n", - "\n", - " # get the final state from phase 1\n", - " t_0 = results1.last_label() * s\n", - " init2 = results1.last_row()\n", - " \n", - " # run phase 2\n", - " system2 = System(system1, t_0=t_0, init=init2, force=0*N)\n", - " results2, details2 = run_ode_solver(system2, slope_func, \n", - " events=event_func2)\n", - " \n", - " # combine and return the results\n", - " results = results1.combine_first(results2)\n", - " return TimeFrame(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's test it with the same parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "force = 1*N\n", - "torque_friction = 0.2*N*m\n", - "results = run_two_phases(force, torque_friction, params)\n", - "results.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And check the results." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "theta_final = results.last_row().theta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the error function we'll use with `root_bisect`.\n", - "\n", - "It takes a hypothetical value for `torque_friction` and returns the difference between `theta_final` and the observed duration of the first push, 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def error_func1(torque_friction, params):\n", - " \"\"\"Error function for root_scalar.\n", - " \n", - " torque_friction: hypothetical value\n", - " params: Params object\n", - " \n", - " returns: offset from target value\n", - " \"\"\"\n", - " force = 1 * N\n", - " results = run_two_phases(force, torque_friction, params)\n", - " theta_final = results.last_row().theta\n", - " print(torque_friction, theta_final)\n", - " return theta_final - 1.5 * radian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Testing the error function." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "guess1 = 0.1*N*m\n", - "error_func1(guess1, params)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "guess2 = 0.3*N*m\n", - "error_func1(guess2, params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And running `root_scalar`." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "res = root_bisect(error_func1, [guess1, guess2], params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the coefficient of friction that yields a total rotation of 1.5 radian." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "torque_friction = res.root" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a test run with the estimated value." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "force = 1 * N\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Looks good." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Animation\n", - "\n", - "\n", - "Here's a draw function we can use to animate the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.patches import Circle\n", - "from matplotlib.patches import Arrow\n", - "\n", - "def draw_func(state, t):\n", - " theta, omega = state\n", - " \n", - " # draw a circle for the table\n", - " radius_disk = magnitude(params.radius_disk)\n", - " circle1 = Circle([0, 0], radius_disk)\n", - " plt.gca().add_patch(circle1)\n", - " \n", - " # draw a circle for the teapot\n", - " radius_pot = magnitude(params.radius_pot)\n", - " center = pol2cart(theta, radius_pot)\n", - " circle2 = Circle(center, 0.05, color='C1')\n", - " plt.gca().add_patch(circle2)\n", - "\n", - " # make the aspect ratio 1\n", - " plt.axis('equal')" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "state = results.first_row()\n", - "draw_func(state, 0)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "animate(results, draw_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Exercises\n", - "\n", - "Now finish off the example by estimating the force that delivers the teapot to the desired position.\n", - "\n", - "Write an error function that takes `force` and `params` and returns the offset from the desired angle." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test the error function with `force=1`" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run `root_bisect` to find the desired force." - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "force = res.root\n", - "results = run_two_phases(force, torque_friction, params)\n", - "theta_final = get_last_value(results.theta)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "remaining_angle = np.pi - 1.5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Now suppose my friend pours 0.1 kg of tea and puts the teapot back on the turntable at distance 0.3 meters from the center. If I ask for the tea back, how much force should they apply, over an arc of 0.5 radians, to make the teapot glide to a stop back in front of me? You can assume that torque due to friction is proportional to the total mass of the teapot and the turntable." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 44, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/notebooks/data/DataOWall.csv b/notebooks/data/DataOWall.csv deleted file mode 100644 index 040eabf1..00000000 --- a/notebooks/data/DataOWall.csv +++ /dev/null @@ -1,867 +0,0 @@ -,Q_in,Q_out,T_int,T_ext -,W/m2,W/m2,Deg C,Deg C -,Avg,Avg,Avg,Avg -2014-10-05 16:30:00,10.994,6.84,16.92,14.68 -2014-10-05 16:35:00,10.952,6.012,16.92,14.69 -2014-10-05 16:40:00,10.882,7.04,16.93,14.66 -2014-10-05 16:45:00,10.798,8.88,16.93,14.59 -2014-10-05 16:50:00,10.756,10.491,16.94,14.5 -2014-10-05 16:55:00,10.924,11.058,16.93,14.43 -2014-10-05 17:00:00,10.728,12.025,16.93,14.33 -2014-10-05 17:05:00,10.616,12.224,16.94,14.28 -2014-10-05 17:10:00,10.616,13.497,16.94,14.2 -2014-10-05 17:15:00,10.518,15.046,16.95,14.09 -2014-10-05 17:20:00,10.392,16.472,16.96,13.96 -2014-10-05 17:25:00,10.35,16.564,16.96,13.89 -2014-10-05 17:30:00,10.322,16.917,16.95,13.79 -2014-10-05 17:35:00,10.196,16.089,16.96,13.77 -2014-10-05 17:40:00,10.098,16.196,16.95,13.7 -2014-10-05 17:45:00,10.014,16.396,16.95,13.64 -2014-10-05 17:50:00,9.972,17.055,16.96,13.58 -2014-10-05 17:55:00,9.958,17.04,16.96,13.5 -2014-10-05 18:00:00,9.888,17.423,16.96,13.44 -2014-10-05 18:05:00,9.846,17.04,16.95,13.39 -2014-10-05 18:10:00,9.776,16.917,16.96,13.38 -2014-10-05 18:15:00,9.65,17.577,16.97,13.32 -2014-10-05 18:20:00,9.734,16.104,16.98,13.37 -2014-10-05 18:25:00,9.776,17.347,16.98,13.28 -2014-10-05 18:30:00,9.65,15.153,16.98,13.29 -2014-10-05 18:35:00,9.482,14.985,16.98,13.33 -2014-10-05 18:40:00,9.538,15.752,16.97,13.24 -2014-10-05 18:45:00,9.44,14.923,16.98,13.25 -2014-10-05 18:50:00,9.426,14.908,16.99,13.24 -2014-10-05 18:55:00,9.356,15.598,16.99,13.19 -2014-10-05 19:00:00,9.062,15.997,16.97,13.12 -2014-10-05 19:05:00,9.02,15.537,16.98,13.11 -2014-10-05 19:10:00,8.978,15.552,16.96,13.07 -2014-10-05 19:15:00,9.02,14.969,16.97,13.06 -2014-10-05 19:20:00,8.908,14.294,16.98,13.06 -2014-10-05 19:25:00,8.922,14.371,16.99,13.07 -2014-10-05 19:30:00,8.796,14.678,16.98,13.04 -2014-10-05 19:35:00,8.697,15.199,16.98,13 -2014-10-05 19:40:00,8.599,15.936,16.97,12.95 -2014-10-05 19:45:00,8.585,15.859,16.97,12.91 -2014-10-05 19:50:00,8.599,16.273,16.97,12.88 -2014-10-05 19:55:00,8.515,16.595,16.98,12.84 -2014-10-05 20:00:00,8.459,17.485,16.97,12.77 -2014-10-05 20:05:00,8.403,18.957,16.97,12.73 -2014-10-05 20:10:00,8.375,20.046,16.96,12.64 -2014-10-05 20:15:00,8.333,21.288,16.96,12.57 -2014-10-05 20:20:00,8.291,20.537,16.97,12.52 -2014-10-05 20:25:00,8.179,20.506,16.98,12.47 -2014-10-05 20:30:00,8.151,20.736,16.96,12.42 -2014-10-05 20:35:00,8.109,20.859,16.96,12.38 -2014-10-05 20:40:00,8.221,20.997,16.97,12.36 -2014-10-05 20:45:00,8.109,20.061,16.96,12.31 -2014-10-05 20:50:00,7.969,19.724,16.96,12.32 -2014-10-05 20:55:00,7.969,19.279,16.96,12.31 -2014-10-05 21:00:00,7.997,19.156,16.95,12.29 -2014-10-05 21:05:00,7.927,19.172,16.96,12.28 -2014-10-05 21:10:00,7.857,19.064,16.95,12.24 -2014-10-05 21:15:00,7.871,19.724,16.95,12.2 -2014-10-05 21:20:00,7.773,20.629,16.95,12.15 -2014-10-05 21:25:00,7.717,21.488,16.96,12.11 -2014-10-05 21:30:00,7.717,22.285,16.94,12.03 -2014-10-05 21:35:00,7.703,22.807,16.94,11.97 -2014-10-05 21:40:00,7.703,23.236,16.94,11.93 -2014-10-05 21:45:00,7.549,23.543,16.93,11.85 -2014-10-05 21:50:00,7.577,23.42,16.93,11.81 -2014-10-05 21:55:00,7.535,23.267,16.93,11.77 -2014-10-05 22:00:00,7.465,23.512,16.92,11.72 -2014-10-05 22:05:00,7.465,23.62,16.92,11.69 -2014-10-05 22:10:00,7.409,23.221,16.91,11.65 -2014-10-05 22:15:00,7.423,23.236,16.91,11.62 -2014-10-05 22:20:00,7.339,23.359,16.92,11.6 -2014-10-05 22:25:00,7.297,23.451,16.92,11.58 -2014-10-05 22:30:00,7.283,22.975,16.9,11.53 -2014-10-05 22:35:00,7.353,22.837,16.9,11.51 -2014-10-05 22:40:00,7.255,23.175,16.89,11.48 -2014-10-05 22:45:00,7.185,23.42,16.9,11.44 -2014-10-05 22:50:00,7.185,23.865,16.89,11.4 -2014-10-05 22:55:00,7.087,24.463,16.88,11.34 -2014-10-05 23:00:00,7.003,24.049,16.87,11.32 -2014-10-05 23:05:00,6.989,23.451,16.87,11.3 -2014-10-05 23:10:00,6.933,23.252,16.87,11.29 -2014-10-05 23:15:00,6.835,22.914,16.86,11.28 -2014-10-05 23:20:00,6.821,23.313,16.85,11.25 -2014-10-05 23:25:00,6.807,23.083,16.85,11.23 -2014-10-05 23:30:00,6.751,23.451,16.84,11.2 -2014-10-05 23:35:00,6.765,22.469,16.84,11.19 -2014-10-05 23:40:00,6.709,21.61,16.82,11.19 -2014-10-05 23:45:00,6.723,21.273,16.82,11.2 -2014-10-05 23:50:00,6.695,21.242,16.83,11.2 -2014-10-05 23:55:00,6.555,21.81,16.81,11.18 -2014-10-06 00:00:00,6.569,21.304,16.8,11.16 -2014-10-06 00:05:00,6.513,21.104,16.8,11.16 -2014-10-06 00:10:00,6.457,21.181,16.79,11.15 -2014-10-06 00:15:00,6.527,20.399,16.78,11.16 -2014-10-06 00:20:00,6.457,20.092,16.77,11.16 -2014-10-06 00:25:00,6.485,19.555,16.78,11.19 -2014-10-06 00:30:00,6.499,19.248,16.77,11.2 -2014-10-06 00:35:00,6.555,17.592,16.76,11.23 -2014-10-06 00:40:00,6.527,17.362,16.76,11.26 -2014-10-06 00:45:00,6.471,16.595,16.75,11.29 -2014-10-06 00:50:00,6.485,16.503,16.73,11.29 -2014-10-06 00:55:00,6.457,16.871,16.73,11.31 -2014-10-06 01:00:00,6.485,16.35,16.73,11.32 -2014-10-06 01:05:00,6.499,16.074,16.73,11.34 -2014-10-06 01:10:00,6.457,16.549,16.72,11.36 -2014-10-06 01:15:00,6.513,16.227,16.69,11.33 -2014-10-06 01:20:00,6.513,16.58,16.71,11.35 -2014-10-06 01:25:00,6.471,17.607,16.7,11.32 -2014-10-06 01:30:00,6.555,17.546,16.7,11.31 -2014-10-06 01:35:00,6.653,17.408,16.67,11.28 -2014-10-06 01:40:00,6.625,18.206,16.66,11.26 -2014-10-06 01:45:00,6.639,18.62,16.67,11.23 -2014-10-06 01:50:00,6.611,19.571,16.66,11.19 -2014-10-06 01:55:00,6.541,20.015,16.66,11.16 -2014-10-06 02:00:00,6.513,19.172,16.65,11.17 -2014-10-06 02:05:00,6.429,18.436,16.63,11.16 -2014-10-06 02:10:00,6.513,18.067,16.62,11.16 -2014-10-06 02:15:00,6.569,18.16,16.63,11.17 -2014-10-06 02:20:00,6.527,18.19,16.61,11.15 -2014-10-06 02:25:00,6.513,18.113,16.59,11.14 -2014-10-06 02:30:00,6.555,17.408,16.61,11.17 -2014-10-06 02:35:00,6.583,16.549,16.6,11.19 -2014-10-06 02:40:00,6.611,16.12,16.61,11.23 -2014-10-06 02:45:00,6.611,16.549,16.6,11.22 -2014-10-06 02:50:00,6.681,17.285,16.58,11.19 -2014-10-06 02:55:00,6.667,17.592,16.57,11.16 -2014-10-06 03:00:00,6.639,17.301,16.56,11.14 -2014-10-06 03:05:00,6.653,16.702,16.55,11.14 -2014-10-06 03:10:00,6.625,15.859,16.56,11.19 -2014-10-06 03:15:00,6.611,14.678,16.54,11.22 -2014-10-06 03:20:00,6.639,13.252,16.52,11.25 -2014-10-06 03:25:00,6.723,12.117,16.52,11.31 -2014-10-06 03:30:00,6.639,11.028,16.52,11.38 -2014-10-06 03:35:00,6.667,10.506,16.52,11.44 -2014-10-06 03:40:00,6.667,10.66,16.53,11.5 -2014-10-06 03:45:00,6.653,10.199,16.53,11.54 -2014-10-06 03:50:00,6.681,9.709,16.5,11.56 -2014-10-06 03:55:00,6.639,9.187,16.5,11.61 -2014-10-06 04:00:00,6.653,9.018,16.5,11.65 -2014-10-06 04:05:00,6.709,9.08,16.5,11.68 -2014-10-06 04:10:00,6.765,8.819,16.48,11.69 -2014-10-06 04:15:00,6.709,9.202,16.46,11.71 -2014-10-06 04:20:00,6.737,8.834,16.46,11.73 -2014-10-06 04:25:00,6.765,8.497,16.46,11.77 -2014-10-06 04:30:00,6.779,8.298,16.46,11.8 -2014-10-06 04:35:00,6.821,7.776,16.45,11.83 -2014-10-06 04:40:00,6.779,7.531,16.44,11.87 -2014-10-06 04:45:00,6.849,6.825,16.44,11.92 -2014-10-06 04:50:00,6.863,6.534,16.43,11.96 -2014-10-06 04:55:00,6.905,6.028,16.43,12.02 -2014-10-06 05:00:00,8.179,6.212,16.45,12.03 -2014-10-06 05:05:00,7.801,6.104,16.44,12.04 -2014-10-06 05:10:00,7.885,5.475,16.44,12.08 -2014-10-06 05:15:00,8.039,5.368,16.44,12.11 -2014-10-06 05:20:00,8.095,5.261,16.45,12.15 -2014-10-06 05:25:00,7.773,5.123,16.43,12.17 -2014-10-06 05:30:00,7.689,5.322,16.41,12.17 -2014-10-06 05:35:00,7.661,5.491,16.41,12.2 -2014-10-06 05:40:00,7.633,5.184,16.42,12.25 -2014-10-06 05:45:00,7.563,5.015,16.42,12.27 -2014-10-06 05:50:00,7.563,4.954,16.39,12.27 -2014-10-06 05:55:00,7.535,4.647,16.38,12.3 -2014-10-06 06:00:00,7.577,5.445,16.39,12.32 -2014-10-06 06:05:00,7.661,6.304,16.39,12.33 -2014-10-06 06:10:00,7.717,4.985,16.39,12.35 -2014-10-06 06:15:00,7.787,4.985,16.39,12.37 -2014-10-06 06:20:00,7.815,4.908,16.4,12.4 -2014-10-06 06:25:00,7.773,5.169,16.39,12.4 -2014-10-06 06:30:00,7.843,5.475,16.38,12.4 -2014-10-06 06:35:00,8.445,5.399,16.39,12.4 -2014-10-06 06:40:00,10.21,5.475,16.43,12.4 -2014-10-06 06:45:00,9.734,5.245,16.44,12.43 -2014-10-06 06:50:00,9.412,5.215,16.44,12.44 -2014-10-06 06:55:00,9.342,5.123,16.44,12.45 -2014-10-06 07:00:00,9.398,4.816,16.45,12.47 -2014-10-06 07:05:00,9.118,4.34,16.44,12.51 -2014-10-06 07:10:00,8.908,4.08,16.44,12.54 -2014-10-06 07:15:00,8.81,3.067,16.42,12.59 -2014-10-06 07:20:00,8.824,2.991,16.41,12.63 -2014-10-06 07:25:00,8.81,2.883,16.41,12.66 -2014-10-06 07:30:00,8.908,3.313,16.42,12.69 -2014-10-06 07:35:00,9.02,3.359,16.41,12.69 -2014-10-06 07:40:00,9.048,2.669,16.4,12.72 -2014-10-06 07:45:00,9.16,1.963,16.41,12.77 -2014-10-06 07:50:00,9.286,1.442,16.43,12.84 -2014-10-06 07:55:00,9.286,0.874,16.42,12.89 -2014-10-06 08:00:00,9.538,0.798,16.42,12.93 -2014-10-06 08:05:00,9.986,0.905,16.43,12.95 -2014-10-06 08:10:00,9.944,0.276,16.45,13 -2014-10-06 08:15:00,9.93,-0.291,16.45,13.06 -2014-10-06 08:20:00,10.098,-0.936,16.46,13.12 -2014-10-06 08:25:00,10.756,-1.641,16.47,13.18 -2014-10-06 08:30:00,10.7,-0.598,16.49,13.2 -2014-10-06 08:35:00,10.784,0.199,16.5,13.18 -2014-10-06 08:40:00,10.826,0.567,16.51,13.19 -2014-10-06 08:45:00,11.807,1.426,16.54,13.14 -2014-10-06 08:50:00,12.787,0.629,16.58,13.1 -2014-10-06 08:55:00,13.501,-0.491,16.62,13.16 -2014-10-06 09:00:00,13.992,-0.859,16.66,13.23 -2014-10-06 09:05:00,14.58,-0.675,16.7,13.29 -2014-10-06 09:10:00,14.916,-0.475,16.74,13.34 -2014-10-06 09:15:00,15.266,-0.767,16.77,13.37 -2014-10-06 09:20:00,15.406,-1.074,16.8,13.42 -2014-10-06 09:25:00,15.84,-0.644,16.84,13.44 -2014-10-06 09:30:00,15.658,1.089,16.86,13.42 -2014-10-06 09:35:00,16.064,2.27,16.89,13.38 -2014-10-06 09:40:00,17.311,2.347,16.95,13.35 -2014-10-06 09:45:00,17.871,1.626,17,13.36 -2014-10-06 09:50:00,18.571,2.224,17.05,13.39 -2014-10-06 09:55:00,18.768,0.966,17.1,13.41 -2014-10-06 10:00:00,19.342,-0.368,17.15,13.48 -2014-10-06 10:05:00,19.72,-3.451,17.19,13.57 -2014-10-06 10:10:00,20.28,-3.482,17.24,13.68 -2014-10-06 10:15:00,20.476,0.414,17.28,13.69 -2014-10-06 10:20:00,21.821,-0.583,17.37,13.71 -2014-10-06 10:25:00,22.801,-3.16,17.44,13.75 -2014-10-06 10:30:00,23.669,-3.037,17.51,13.84 -2014-10-06 10:35:00,23.992,2.853,17.59,13.85 -2014-10-06 10:40:00,23.641,5.445,17.63,13.7 -2014-10-06 10:45:00,23.81,4.049,17.66,13.61 -2014-10-06 10:50:00,25.056,4.448,17.74,13.6 -2014-10-06 10:55:00,24.79,8.16,17.8,13.55 -2014-10-06 11:00:00,24.51,9.294,17.84,13.54 -2014-10-06 11:05:00,24.482,7.362,17.87,13.49 -2014-10-06 11:10:00,24.622,8.328,17.9,13.42 -2014-10-06 11:15:00,25.378,9.218,17.96,13.31 -2014-10-06 11:20:00,24.552,10.644,17.98,13.28 -2014-10-06 11:25:00,23.347,10.138,17.97,13.24 -2014-10-06 11:30:00,22.997,5.966,17.99,13.29 -2014-10-06 11:35:00,23.165,9.402,18,13.24 -2014-10-06 11:40:00,22.773,7.546,18.01,13.26 -2014-10-06 11:45:00,22.605,7.73,18.03,13.27 -2014-10-06 11:50:00,22.577,6.028,18.04,13.22 -2014-10-06 11:55:00,22.437,7.147,18.05,13.33 -2014-10-06 12:00:00,22.871,14.141,18.06,13.2 -2014-10-06 12:05:00,23.347,12.899,18.12,13.17 -2014-10-06 12:10:00,23.571,10.844,18.16,13.13 -2014-10-06 12:15:00,24.286,14.463,18.21,12.92 -2014-10-06 12:20:00,24.034,17.393,18.23,12.75 -2014-10-06 12:25:00,24.188,16.181,18.26,12.75 -2014-10-06 12:30:00,24.244,12.347,18.29,12.88 -2014-10-06 12:35:00,24.216,9.264,18.31,12.93 -2014-10-06 12:40:00,24.3,8.604,18.34,13.02 -2014-10-06 12:45:00,24.552,6.564,18.37,13.04 -2014-10-06 12:50:00,24.51,6.043,18.4,13.09 -2014-10-06 12:55:00,24.86,4.095,18.43,13.19 -2014-10-06 13:00:00,24.594,8.313,18.45,13.12 -2014-10-06 13:05:00,24.65,8.528,18.48,13.09 -2014-10-06 13:10:00,24.58,10.414,18.51,13.05 -2014-10-06 13:15:00,24.482,9.11,18.52,13.03 -2014-10-06 13:20:00,24.58,10.23,18.54,13.02 -2014-10-06 13:25:00,24.412,12.485,18.57,12.95 -2014-10-06 13:30:00,24.314,8.543,18.58,12.99 -2014-10-06 13:35:00,24.314,6.334,18.61,13.1 -2014-10-06 13:40:00,24.37,11.702,18.63,13 -2014-10-06 13:45:00,24.622,12.301,18.65,12.93 -2014-10-06 13:50:00,24.664,10.859,18.68,12.92 -2014-10-06 13:55:00,24.916,8.067,18.72,13.02 -2014-10-06 14:00:00,24.79,7.945,18.72,13.04 -2014-10-06 14:05:00,24.804,4.571,18.76,13.14 -2014-10-06 14:10:00,24.37,6.856,18.78,13.2 -2014-10-06 14:15:00,24.51,3.344,18.78,13.26 -2014-10-06 14:20:00,24.818,5.276,18.82,13.33 -2014-10-06 14:25:00,25,7.592,18.85,13.32 -2014-10-06 14:30:00,25.21,9.939,18.88,13.2 -2014-10-06 14:35:00,25.07,9.402,18.89,13.19 -2014-10-06 14:40:00,24.93,8.589,18.91,13.21 -2014-10-06 14:45:00,24.706,10.399,18.93,13.19 -2014-10-06 14:50:00,24.202,7.837,18.92,13.18 -2014-10-06 14:55:00,24.062,11.396,18.94,13.12 -2014-10-06 15:00:00,23.95,6.38,18.95,13.23 -2014-10-06 15:05:00,23.725,4.31,18.95,13.36 -2014-10-06 15:10:00,23.501,8.037,18.97,13.34 -2014-10-06 15:15:00,23.571,7.546,18.98,13.31 -2014-10-06 15:20:00,23.445,9.632,18.99,13.28 -2014-10-06 15:25:00,23.193,10.92,18.98,13.21 -2014-10-06 15:30:00,23.123,9.08,18.98,13.2 -2014-10-06 15:35:00,22.969,8.727,19.01,13.25 -2014-10-06 15:40:00,22.829,9.08,19.01,13.25 -2014-10-06 15:45:00,22.759,9.187,19.03,13.24 -2014-10-06 15:50:00,22.703,7.132,19.02,13.29 -2014-10-06 15:55:00,22.507,6.979,19.02,13.32 -2014-10-06 16:00:00,22.549,9.954,19.05,13.26 -2014-10-06 16:05:00,23.151,7.669,19.06,13.29 -2014-10-06 16:10:00,23.305,5.874,19.1,13.37 -2014-10-06 16:15:00,23.683,5.322,19.12,13.43 -2014-10-06 16:20:00,23.221,6.365,19.12,13.45 -2014-10-06 16:25:00,22.955,9.248,19.13,13.37 -2014-10-06 16:30:00,23.179,9.08,19.16,13.35 -2014-10-06 16:35:00,22.717,8.865,19.15,13.34 -2014-10-06 16:40:00,23.838,11.656,19.18,13.26 -2014-10-06 16:45:00,23.333,11.58,19.21,13.22 -2014-10-06 16:50:00,22.899,9.479,19.21,13.23 -2014-10-06 16:55:00,23.067,9.433,19.23,13.26 -2014-10-06 17:00:00,23.109,8.466,19.24,13.26 -2014-10-06 17:05:00,22.815,8.727,19.24,13.28 -2014-10-06 17:10:00,22.997,8.589,19.26,13.27 -2014-10-06 17:15:00,22.381,8.85,19.24,13.26 -2014-10-06 17:20:00,22.157,9.003,19.25,13.27 -2014-10-06 17:25:00,22.129,10.429,19.26,13.21 -2014-10-06 17:30:00,21.905,9.877,19.26,13.21 -2014-10-06 17:35:00,22.423,9.417,19.29,13.23 -2014-10-06 17:40:00,22.017,10.782,19.29,13.21 -2014-10-06 17:45:00,21.429,11.012,19.28,13.2 -2014-10-06 17:50:00,21.849,11.181,19.3,13.19 -2014-10-06 17:55:00,21.19,12.96,19.29,13.15 -2014-10-06 18:00:00,20.644,12.807,19.28,13.11 -2014-10-06 18:05:00,20.364,13.528,19.26,13.08 -2014-10-06 18:10:00,19.09,15.721,19.22,13.01 -2014-10-06 18:15:00,18.768,16.196,19.19,12.93 -2014-10-06 18:20:00,19.496,15.736,19.22,12.92 -2014-10-06 18:25:00,18.95,14.601,19.21,12.91 -2014-10-06 18:30:00,18.852,11.457,19.19,12.95 -2014-10-06 18:35:00,18.501,8.374,19.19,13.06 -2014-10-06 18:40:00,18.207,11.104,19.16,13.08 -2014-10-06 18:45:00,18.375,15.966,19.17,12.97 -2014-10-06 18:50:00,17.115,15.169,19.13,12.92 -2014-10-06 18:55:00,17.143,13.037,19.13,12.94 -2014-10-06 19:00:00,16.793,11.334,19.11,12.97 -2014-10-06 19:05:00,16.919,11.779,19.11,12.99 -2014-10-06 19:10:00,16.877,15.015,19.1,12.91 -2014-10-06 19:15:00,16.821,16.933,19.08,12.82 -2014-10-06 19:20:00,16.246,17.193,19.07,12.78 -2014-10-06 19:25:00,16.148,16.58,19.05,12.76 -2014-10-06 19:30:00,15.812,16.426,19.04,12.73 -2014-10-06 19:35:00,16.204,16.043,19.03,12.72 -2014-10-06 19:40:00,15.98,15.061,19.03,12.74 -2014-10-06 19:45:00,15.322,13.298,19,12.77 -2014-10-06 19:50:00,15.084,12.132,18.98,12.81 -2014-10-06 19:55:00,16.176,10.061,19,12.87 -2014-10-06 20:00:00,14.93,8.972,18.98,12.94 -2014-10-06 20:05:00,13.557,8.267,18.92,12.97 -2014-10-06 20:10:00,13.039,8.742,18.88,12.99 -2014-10-06 20:15:00,12.885,9.601,18.85,13 -2014-10-06 20:20:00,12.465,10.598,18.83,13 -2014-10-06 20:25:00,12.241,12.761,18.8,12.96 -2014-10-06 20:30:00,12.101,14.525,18.78,12.9 -2014-10-06 20:35:00,11.877,14.801,18.75,12.85 -2014-10-06 20:40:00,11.765,13.39,18.73,12.87 -2014-10-06 20:45:00,11.709,12.975,18.71,12.87 -2014-10-06 20:50:00,11.415,12.546,18.7,12.89 -2014-10-06 20:55:00,11.317,11.564,18.67,12.9 -2014-10-06 21:00:00,11.12,11.794,18.65,12.92 -2014-10-06 21:05:00,11.036,13.16,18.63,12.88 -2014-10-06 21:10:00,10.854,13.298,18.61,12.87 -2014-10-06 21:15:00,10.812,13.727,18.6,12.85 -2014-10-06 21:20:00,10.756,14.801,18.58,12.81 -2014-10-06 21:25:00,10.588,16.242,18.54,12.73 -2014-10-06 21:30:00,10.518,17.178,18.53,12.67 -2014-10-06 21:35:00,10.42,17.546,18.5,12.62 -2014-10-06 21:40:00,10.322,17.577,18.48,12.58 -2014-10-06 21:45:00,10.21,17.331,18.48,12.56 -2014-10-06 21:50:00,10.126,16.61,18.46,12.56 -2014-10-06 21:55:00,9.972,15.353,18.43,12.57 -2014-10-06 22:00:00,9.958,13.39,18.43,12.62 -2014-10-06 22:05:00,9.846,12.301,18.41,12.65 -2014-10-06 22:10:00,9.818,10.936,18.39,12.71 -2014-10-06 22:15:00,9.664,10.475,18.37,12.74 -2014-10-06 22:20:00,9.608,10.583,18.36,12.79 -2014-10-06 22:25:00,9.552,11.012,18.35,12.78 -2014-10-06 22:30:00,9.496,11.166,18.33,12.79 -2014-10-06 22:35:00,9.454,10.844,18.32,12.81 -2014-10-06 22:40:00,9.342,11.273,18.31,12.82 -2014-10-06 22:45:00,9.3,11.365,18.29,12.81 -2014-10-06 22:50:00,9.3,11.748,18.28,12.8 -2014-10-06 22:55:00,9.23,12.132,18.26,12.78 -2014-10-06 23:00:00,9.118,11.856,18.26,12.79 -2014-10-06 23:05:00,9.048,12.776,18.24,12.76 -2014-10-06 23:10:00,9.02,13.052,18.23,12.74 -2014-10-06 23:15:00,8.95,12.362,18.21,12.75 -2014-10-06 23:20:00,8.908,12.132,18.2,12.76 -2014-10-06 23:25:00,8.88,12.546,18.19,12.76 -2014-10-06 23:30:00,8.824,13.957,18.17,12.71 -2014-10-06 23:35:00,8.725,13.252,18.16,12.71 -2014-10-06 23:40:00,8.697,12.837,18.14,12.7 -2014-10-06 23:45:00,8.641,13.558,18.14,12.71 -2014-10-06 23:50:00,8.599,15.69,18.12,12.64 -2014-10-06 23:55:00,8.543,19.586,18.11,12.52 -2014-10-07 00:00:00,8.543,19.156,18.1,12.44 -2014-10-07 00:05:00,8.417,13.512,18.08,12.53 -2014-10-07 00:10:00,8.431,13.512,18.08,12.58 -2014-10-07 00:15:00,8.361,14.095,18.06,12.58 -2014-10-07 00:20:00,8.319,11.902,18.05,12.62 -2014-10-07 00:25:00,8.277,12.807,18.03,12.63 -2014-10-07 00:30:00,8.235,14.433,18.03,12.59 -2014-10-07 00:35:00,8.151,14.402,18.01,12.58 -2014-10-07 00:40:00,8.165,11.81,18,12.61 -2014-10-07 00:45:00,8.193,12.684,17.99,12.63 -2014-10-07 00:50:00,8.095,12.377,17.98,12.63 -2014-10-07 00:55:00,8.109,13.865,17.96,12.61 -2014-10-07 01:00:00,8.053,16.457,17.96,12.55 -2014-10-07 01:05:00,8.039,21.242,17.94,12.39 -2014-10-07 01:10:00,7.955,22.776,17.93,12.25 -2014-10-07 01:15:00,7.927,23.466,17.92,12.16 -2014-10-07 01:20:00,7.773,23.604,17.9,12.08 -2014-10-07 01:25:00,7.787,23.528,17.89,12.02 -2014-10-07 01:30:00,7.773,23.221,17.88,11.99 -2014-10-07 01:35:00,7.773,22.868,17.86,11.95 -2014-10-07 01:40:00,7.619,22.883,17.85,11.92 -2014-10-07 01:45:00,7.591,23.129,17.83,11.87 -2014-10-07 01:50:00,7.563,23.052,17.82,11.84 -2014-10-07 01:55:00,7.549,23.267,17.81,11.8 -2014-10-07 02:00:00,7.437,23.252,17.8,11.77 -2014-10-07 02:05:00,7.465,23.589,17.79,11.73 -2014-10-07 02:10:00,7.493,23.773,17.78,11.7 -2014-10-07 02:15:00,7.381,23.221,17.76,11.66 -2014-10-07 02:20:00,7.297,23.144,17.75,11.66 -2014-10-07 02:25:00,7.255,21.442,17.74,11.67 -2014-10-07 02:30:00,7.241,21.212,17.72,11.67 -2014-10-07 02:35:00,7.241,20.399,17.72,11.69 -2014-10-07 02:40:00,7.143,19.54,17.7,11.71 -2014-10-07 02:45:00,7.143,18.098,17.69,11.75 -2014-10-07 02:50:00,7.129,15.89,17.69,11.83 -2014-10-07 02:55:00,7.157,14.678,17.67,11.9 -2014-10-07 03:00:00,7.171,14.494,17.65,11.94 -2014-10-07 03:05:00,7.213,13.972,17.66,11.99 -2014-10-07 03:10:00,7.143,13.988,17.64,12 -2014-10-07 03:15:00,7.115,13.16,17.62,12.03 -2014-10-07 03:20:00,7.087,12.025,17.62,12.1 -2014-10-07 03:25:00,7.199,16.12,17.62,12.11 -2014-10-07 03:30:00,7.115,13.957,17.6,12.08 -2014-10-07 03:35:00,7.087,15.859,17.59,12.05 -2014-10-07 03:40:00,7.059,21.38,17.58,11.9 -2014-10-07 03:45:00,7.003,20.798,17.57,11.79 -2014-10-07 03:50:00,7.017,18.742,17.56,11.75 -2014-10-07 03:55:00,6.933,20.092,17.54,11.69 -2014-10-07 04:00:00,6.919,19.985,17.54,11.68 -2014-10-07 04:05:00,6.919,21.641,17.52,11.64 -2014-10-07 04:10:00,6.863,20.368,17.51,11.66 -2014-10-07 04:15:00,6.891,21.917,17.5,11.63 -2014-10-07 04:20:00,6.807,21.304,17.49,11.61 -2014-10-07 04:25:00,6.765,24.877,17.47,11.55 -2014-10-07 04:30:00,6.751,21.212,17.46,11.56 -2014-10-07 04:35:00,6.681,17.975,17.46,11.62 -2014-10-07 04:40:00,6.737,20.399,17.44,11.53 -2014-10-07 04:45:00,6.723,22.699,17.43,11.38 -2014-10-07 04:50:00,6.863,23.252,17.42,11.31 -2014-10-07 04:55:00,6.905,24.141,17.42,11.31 -2014-10-07 05:00:00,7.563,22.546,17.43,11.31 -2014-10-07 05:05:00,7.507,19.279,17.42,11.36 -2014-10-07 05:10:00,7.675,18.282,17.42,11.42 -2014-10-07 05:15:00,7.745,18.696,17.43,11.46 -2014-10-07 05:20:00,7.577,18.39,17.41,11.43 -2014-10-07 05:25:00,7.353,16.887,17.41,11.45 -2014-10-07 05:30:00,7.241,16.212,17.39,11.52 -2014-10-07 05:35:00,7.213,18.911,17.38,11.51 -2014-10-07 05:40:00,7.129,16.288,17.37,11.54 -2014-10-07 05:45:00,7.101,17.255,17.36,11.55 -2014-10-07 05:50:00,7.073,16.825,17.34,11.54 -2014-10-07 05:55:00,7.073,17.025,17.32,11.52 -2014-10-07 06:00:00,7.003,17.914,17.32,11.53 -2014-10-07 06:05:00,6.933,19.969,17.31,11.46 -2014-10-07 06:10:00,7.003,20.613,17.3,11.4 -2014-10-07 06:15:00,6.989,20.828,17.28,11.37 -2014-10-07 06:20:00,7.129,19.448,17.29,11.38 -2014-10-07 06:25:00,7.129,16.871,17.28,11.42 -2014-10-07 06:30:00,7.129,17.117,17.26,11.42 -2014-10-07 06:35:00,7.241,21.672,17.27,11.33 -2014-10-07 06:40:00,7.717,21.58,17.26,11.23 -2014-10-07 06:45:00,8.263,23.543,17.29,11.24 -2014-10-07 06:50:00,8.137,25.215,17.28,11.1 -2014-10-07 06:55:00,8.123,25.061,17.28,11.06 -2014-10-07 07:00:00,8.151,23.926,17.28,11.08 -2014-10-07 07:05:00,7.955,24.494,17.27,11.03 -2014-10-07 07:10:00,7.885,24.479,17.26,11.01 -2014-10-07 07:15:00,7.815,21.84,17.25,11.05 -2014-10-07 07:20:00,7.787,22.27,17.24,11.07 -2014-10-07 07:25:00,7.941,21.472,17.23,11.1 -2014-10-07 07:30:00,7.899,21.043,17.23,11.12 -2014-10-07 07:35:00,8.011,19.601,17.23,11.17 -2014-10-07 07:40:00,8.137,17.5,17.22,11.26 -2014-10-07 07:45:00,8.263,21.963,17.21,11.21 -2014-10-07 07:50:00,8.473,23.727,17.21,11.08 -2014-10-07 07:55:00,8.88,19.693,17.24,11.16 -2014-10-07 08:00:00,9.062,15.736,17.24,11.3 -2014-10-07 08:05:00,9.258,18.42,17.24,11.28 -2014-10-07 08:10:00,9.356,22.025,17.25,11.24 -2014-10-07 08:15:00,9.734,19.034,17.26,11.21 -2014-10-07 08:20:00,10.63,18.88,17.29,11.29 -2014-10-07 08:25:00,11.849,15.322,17.33,11.35 -2014-10-07 08:30:00,12.395,16.488,17.37,11.41 -2014-10-07 08:35:00,12.787,10.491,17.41,11.59 -2014-10-07 08:40:00,13.109,8.788,17.43,11.78 -2014-10-07 08:45:00,13.151,15.199,17.45,11.69 -2014-10-07 08:50:00,14.3,12.454,17.5,11.71 -2014-10-07 08:55:00,16.331,12.868,17.58,11.78 -2014-10-07 09:00:00,16.317,16.043,17.63,11.72 -2014-10-07 09:05:00,16.779,15.337,17.67,11.67 -2014-10-07 09:10:00,17.283,12.423,17.71,11.78 -2014-10-07 09:15:00,18.039,9.294,17.77,11.93 -2014-10-07 09:20:00,18.599,7.914,17.82,12.04 -2014-10-07 09:25:00,19.118,4.417,17.89,12.2 -2014-10-07 09:30:00,19.72,10.337,17.92,12.17 -2014-10-07 09:35:00,20.224,8.574,17.98,12.23 -2014-10-07 09:40:00,20.434,9.202,18.02,12.27 -2014-10-07 09:45:00,21.078,7.945,18.08,12.31 -2014-10-07 09:50:00,21.471,8.129,18.12,12.37 -2014-10-07 09:55:00,21.443,9.156,18.18,12.38 -2014-10-07 10:00:00,21.232,9.739,18.2,12.39 -2014-10-07 10:05:00,21.821,9.969,18.24,12.41 -2014-10-07 10:10:00,21.989,5.414,18.28,12.51 -2014-10-07 10:15:00,22.199,6.534,18.31,12.58 -2014-10-07 10:20:00,22.395,9.248,18.35,12.56 -2014-10-07 10:25:00,22.675,8.512,18.39,12.56 -2014-10-07 10:30:00,23.039,7.791,18.42,12.59 -2014-10-07 10:35:00,23.571,6.273,18.47,12.66 -2014-10-07 10:40:00,23.501,4.448,18.5,12.75 -2014-10-07 10:45:00,23.768,2.699,18.53,12.86 -2014-10-07 10:50:00,23.95,5.706,18.57,12.85 -2014-10-07 10:55:00,24.062,6.181,18.6,12.82 -2014-10-07 11:00:00,24.174,3.911,18.63,12.89 -2014-10-07 11:05:00,24.272,2.132,18.66,13 -2014-10-07 11:10:00,24.454,-0.675,18.7,13.13 -2014-10-07 11:15:00,23.641,-0.015,18.69,13.21 -2014-10-07 11:20:00,23.852,-3.344,18.72,13.36 -2014-10-07 11:25:00,24.09,-12.439,18.74,13.69 -2014-10-07 11:30:00,24.832,-16.396,18.78,14.04 -2014-10-07 11:35:00,25.154,-10.782,18.82,14.09 -2014-10-07 11:40:00,24.286,1.472,18.83,13.84 -2014-10-07 11:45:00,24.51,1.089,18.85,13.76 -2014-10-07 11:50:00,24.678,-3.742,18.89,13.88 -2014-10-07 11:55:00,24.65,-10.153,18.9,14.1 -2014-10-07 12:00:00,24.734,-17.991,18.92,14.46 -2014-10-07 12:05:00,25.238,-17.132,18.95,14.59 -2014-10-07 12:10:00,25.616,-17.561,18.99,14.78 -2014-10-07 12:15:00,25.826,-17.009,19.02,14.94 -2014-10-07 12:20:00,25.84,4.862,19.04,14.54 -2014-10-07 12:25:00,26.078,5.905,19.08,14.26 -2014-10-07 12:30:00,25.546,2.914,19.09,14.26 -2014-10-07 12:35:00,25.504,-0.399,19.11,14.31 -2014-10-07 12:40:00,25.028,-4.294,19.1,14.4 -2014-10-07 12:45:00,24.622,-7.071,19.11,14.57 -2014-10-07 12:50:00,24.44,-5.445,19.11,14.62 -2014-10-07 12:55:00,24.328,-0.46,19.13,14.56 -2014-10-07 13:00:00,24.37,0.905,19.13,14.51 -2014-10-07 13:05:00,24.23,-4.525,19.14,14.62 -2014-10-07 13:10:00,24.594,-7.914,19.16,14.78 -2014-10-07 13:15:00,24.258,0.429,19.17,14.68 -2014-10-07 13:20:00,24.062,0.874,19.18,14.66 -2014-10-07 13:25:00,23.501,0.997,19.16,14.59 -2014-10-07 13:30:00,23.711,-2.009,19.18,14.66 -2014-10-07 13:35:00,23.922,-3.344,19.2,14.74 -2014-10-07 13:40:00,23.95,-0.199,19.21,14.7 -2014-10-07 13:45:00,24.146,-4.233,19.22,14.8 -2014-10-07 13:50:00,24.216,-2.393,19.25,14.83 -2014-10-07 13:55:00,24.552,4.202,19.27,14.68 -2014-10-07 14:00:00,23.669,-1.549,19.26,14.76 -2014-10-07 14:05:00,23.207,-2.592,19.26,14.87 -2014-10-07 14:10:00,22.969,-0.613,19.25,14.82 -2014-10-07 14:15:00,22.871,-2.914,19.24,14.86 -2014-10-07 14:20:00,22.731,-2.929,19.25,14.93 -2014-10-07 14:25:00,22.927,-0.107,19.27,14.94 -2014-10-07 14:30:00,23.529,3.451,19.29,14.82 -2014-10-07 14:35:00,23.613,1.718,19.31,14.85 -2014-10-07 14:40:00,23.908,5.844,19.36,14.76 -2014-10-07 14:45:00,23.922,5.031,19.38,14.71 -2014-10-07 14:50:00,24.202,5.982,19.4,14.65 -2014-10-07 14:55:00,24.272,1.166,19.43,14.73 -2014-10-07 15:00:00,24.258,-3.267,19.45,14.89 -2014-10-07 15:05:00,24.902,-0.092,19.48,14.9 -2014-10-07 15:10:00,24.93,1.948,19.51,14.84 -2014-10-07 15:15:00,24.202,3.543,19.5,14.78 -2014-10-07 15:20:00,24.524,3.589,19.53,14.74 -2014-10-07 15:25:00,24.538,4.663,19.54,14.7 -2014-10-07 15:30:00,24.622,5.092,19.56,14.7 -2014-10-07 15:35:00,24.23,7.991,19.57,14.67 -2014-10-07 15:40:00,24.216,12.055,19.58,14.5 -2014-10-07 15:45:00,24.034,12.362,19.59,14.38 -2014-10-07 15:50:00,23.964,14.049,19.59,14.27 -2014-10-07 15:55:00,23.669,14.678,19.62,14.21 -2014-10-07 16:00:00,23.683,14.494,19.62,14.18 -2014-10-07 16:05:00,23.725,18.221,19.62,13.96 -2014-10-07 16:10:00,23.025,14.877,19.63,14.03 -2014-10-07 16:15:00,23.053,17.684,19.64,13.89 -2014-10-07 16:20:00,22.927,21.089,19.65,13.68 -2014-10-07 16:25:00,23.025,18.865,19.67,13.61 -2014-10-07 16:30:00,22.591,15.874,19.66,13.63 -2014-10-07 16:35:00,22.087,13.819,19.64,13.63 -2014-10-07 16:40:00,22.031,16.196,19.64,13.54 -2014-10-07 16:45:00,22.115,17.791,19.65,13.45 -2014-10-07 16:50:00,21.877,20.936,19.66,13.29 -2014-10-07 16:55:00,22.283,24.11,19.68,13.14 -2014-10-07 17:00:00,21.457,19.34,19.66,13.16 -2014-10-07 17:05:00,21.457,18.742,19.66,13.15 -2014-10-07 17:10:00,21.457,20.644,19.66,13.08 -2014-10-07 17:15:00,20.924,24.724,19.66,12.97 -2014-10-07 17:20:00,20.616,25.261,19.65,12.85 -2014-10-07 17:25:00,20.168,24.601,19.63,12.79 -2014-10-07 17:30:00,19.692,24.126,19.63,12.79 -2014-10-07 17:35:00,19.44,24.356,19.61,12.71 -2014-10-07 17:40:00,19.034,24.141,19.6,12.68 -2014-10-07 17:45:00,18.796,23.988,19.58,12.62 -2014-10-07 17:50:00,18.361,24.479,19.57,12.59 -2014-10-07 17:55:00,18.151,25.123,19.56,12.52 -2014-10-07 18:00:00,17.815,24.877,19.54,12.46 -2014-10-07 18:05:00,17.745,23.88,19.52,12.43 -2014-10-07 18:10:00,17.437,24.233,19.49,12.38 -2014-10-07 18:15:00,16.681,24.294,19.46,12.33 -2014-10-07 18:20:00,16.05,24.294,19.43,12.31 -2014-10-07 18:25:00,15.756,25.905,19.4,12.23 -2014-10-07 18:30:00,15.42,25.813,19.38,12.17 -2014-10-07 18:35:00,15,25.613,19.36,12.14 -2014-10-07 18:40:00,14.79,26.089,19.33,12.07 -2014-10-07 18:45:00,15.266,25.69,19.34,12.05 -2014-10-07 18:50:00,15.252,25.414,19.33,12 -2014-10-07 18:55:00,14.692,26.733,19.31,11.97 -2014-10-07 19:00:00,14.44,27.071,19.29,11.89 -2014-10-07 19:05:00,14.356,26.012,19.28,11.87 -2014-10-07 19:10:00,14.132,25.644,19.26,11.86 -2014-10-07 19:15:00,13.964,26.074,19.25,11.82 -2014-10-07 19:20:00,13.697,24.678,19.22,11.81 -2014-10-07 19:25:00,13.599,25.859,19.21,11.79 -2014-10-07 19:30:00,13.319,26.273,19.19,11.73 -2014-10-07 19:35:00,13.249,24.693,19.17,11.72 -2014-10-07 19:40:00,13.277,25.184,19.17,11.71 -2014-10-07 19:45:00,13.249,26.089,19.16,11.65 -2014-10-07 19:50:00,13.361,25.23,19.15,11.63 -2014-10-07 19:55:00,11.891,25.138,19.11,11.62 -2014-10-07 20:00:00,11.092,25.721,19.05,11.59 -2014-10-07 20:05:00,10.672,25.521,19.01,11.57 -2014-10-07 20:10:00,10.392,25.322,18.99,11.55 -2014-10-07 20:15:00,10.126,24.939,18.95,11.54 -2014-10-07 20:20:00,9.818,24.816,18.91,11.53 -2014-10-07 20:25:00,9.594,25.46,18.89,11.5 -2014-10-07 20:30:00,9.37,25.521,18.86,11.48 -2014-10-07 20:35:00,9.062,25.46,18.82,11.44 -2014-10-07 20:40:00,8.894,24.617,18.77,11.41 -2014-10-07 20:45:00,8.711,24.172,18.75,11.43 -2014-10-07 20:50:00,8.529,24.202,18.71,11.42 -2014-10-07 20:55:00,8.389,24.34,18.69,11.41 -2014-10-07 21:00:00,8.277,24.034,18.66,11.4 -2014-10-07 21:05:00,8.067,23.988,18.63,11.39 -2014-10-07 21:10:00,7.941,23.62,18.61,11.4 -2014-10-07 21:15:00,7.801,23.834,18.58,11.38 -2014-10-07 21:20:00,7.717,23.374,18.56,11.38 -2014-10-07 21:25:00,7.661,23.313,18.53,11.36 -2014-10-07 21:30:00,7.521,23.39,18.51,11.34 -2014-10-07 21:35:00,7.367,23.083,18.49,11.34 -2014-10-07 21:40:00,7.339,23.42,18.46,11.33 -2014-10-07 21:45:00,7.199,23.773,18.44,11.31 -2014-10-07 21:50:00,7.073,24.11,18.41,11.27 -2014-10-07 21:55:00,6.933,23.896,18.39,11.26 -2014-10-07 22:00:00,6.891,23.819,18.37,11.25 -2014-10-07 22:05:00,6.779,22.393,18.34,11.27 -2014-10-07 22:10:00,6.667,22.009,18.33,11.3 -2014-10-07 22:15:00,6.625,22.071,18.3,11.29 -2014-10-07 22:20:00,6.527,21.242,18.28,11.31 -2014-10-07 22:25:00,6.429,20.383,18.26,11.35 -2014-10-07 22:30:00,6.415,20.521,18.24,11.35 -2014-10-07 22:35:00,6.345,20.46,18.22,11.36 -2014-10-07 22:40:00,6.218,20.199,18.19,11.38 -2014-10-07 22:45:00,6.176,20.613,18.17,11.38 -2014-10-07 22:50:00,6.162,21.043,18.15,11.36 -2014-10-07 22:55:00,6.148,20.966,18.13,11.35 -2014-10-07 23:00:00,6.078,20.752,18.12,11.36 -2014-10-07 23:05:00,5.98,20.353,18.09,11.36 -2014-10-07 23:10:00,5.938,20.552,18.08,11.37 -2014-10-07 23:15:00,5.924,21.258,18.05,11.34 -2014-10-07 23:20:00,5.896,21.595,18.03,11.32 -2014-10-07 23:25:00,5.868,22.316,18.02,11.3 -2014-10-07 23:30:00,5.882,22.485,18,11.27 -2014-10-07 23:35:00,5.826,22.623,17.98,11.25 -2014-10-07 23:40:00,5.77,21.825,17.96,11.24 -2014-10-07 23:45:00,5.7,21.902,17.93,11.23 -2014-10-07 23:50:00,5.644,21.641,17.92,11.23 -2014-10-07 23:55:00,5.686,20.92,17.9,11.25 -2014-10-08 00:00:00,5.7,21.104,17.89,11.25 -2014-10-08 00:05:00,5.672,20.905,17.87,11.24 -2014-10-08 00:10:00,5.63,21.81,17.84,11.21 -2014-10-08 00:15:00,5.588,21.887,17.84,11.21 -2014-10-08 00:20:00,5.546,21.887,17.81,11.2 -2014-10-08 00:25:00,5.56,21.917,17.79,11.19 -2014-10-08 00:30:00,5.574,21.733,17.78,11.17 -2014-10-08 00:35:00,5.532,21.196,17.76,11.18 -2014-10-08 00:40:00,5.546,20.828,17.74,11.19 -2014-10-08 00:45:00,5.532,21.012,17.73,11.17 -2014-10-08 00:50:00,5.49,21.181,17.71,11.17 -2014-10-08 00:55:00,5.448,21.656,17.69,11.15 -2014-10-08 01:00:00,5.392,21.38,17.67,11.14 -2014-10-08 01:05:00,5.392,21.181,17.65,11.13 -2014-10-08 01:10:00,5.392,21.38,17.63,11.12 -2014-10-08 01:15:00,5.406,20.89,17.63,11.15 -2014-10-08 01:20:00,5.434,20.69,17.61,11.13 -2014-10-08 01:25:00,5.42,20.537,17.59,11.13 -2014-10-08 01:30:00,5.42,20.69,17.57,11.11 -2014-10-08 01:35:00,5.42,20.399,17.56,11.12 -2014-10-08 01:40:00,5.42,19.785,17.54,11.13 -2014-10-08 01:45:00,5.42,19.095,17.51,11.18 -2014-10-08 01:50:00,5.42,19.601,17.51,11.16 -2014-10-08 01:55:00,5.42,20.169,17.5,11.12 -2014-10-08 02:00:00,5.42,20.245,17.48,11.13 -2014-10-08 02:05:00,5.406,19.755,17.45,11.13 -2014-10-08 02:10:00,5.406,17.776,17.45,11.18 -2014-10-08 02:15:00,5.42,15.66,17.42,11.25 -2014-10-08 02:20:00,5.392,13.405,17.41,11.32 -2014-10-08 02:25:00,5.42,10.92,17.39,11.44 -2014-10-08 02:30:00,5.378,13.727,17.39,11.46 -2014-10-08 02:35:00,5.434,13.436,17.36,11.44 -2014-10-08 02:40:00,5.406,11.641,17.35,11.53 -2014-10-08 02:45:00,5.42,17.117,17.33,11.44 -2014-10-08 02:50:00,5.42,18.267,17.32,11.36 -2014-10-08 02:55:00,5.434,18.098,17.31,11.35 -2014-10-08 03:00:00,5.42,16.518,17.29,11.35 -2014-10-08 03:05:00,5.406,16.319,17.27,11.37 -2014-10-08 03:10:00,5.434,16.104,17.26,11.37 -2014-10-08 03:15:00,5.462,16.396,17.26,11.38 -2014-10-08 03:20:00,5.462,17.485,17.24,11.36 -2014-10-08 03:25:00,5.49,17.086,17.22,11.35 -2014-10-08 03:30:00,5.532,14.08,17.2,11.42 -2014-10-08 03:35:00,5.518,12.055,17.19,11.51 -2014-10-08 03:40:00,5.518,11.856,17.18,11.56 -2014-10-08 03:45:00,5.518,12.239,17.16,11.58 -2014-10-08 03:50:00,5.588,12.224,17.15,11.61 -2014-10-08 03:55:00,5.574,11.564,17.13,11.63 -2014-10-08 04:00:00,5.63,11.457,17.12,11.67 -2014-10-08 04:05:00,5.644,11.81,17.12,11.69 -2014-10-08 04:10:00,5.672,12.071,17.11,11.71 -2014-10-08 04:15:00,5.686,10.782,17.1,11.75 -2014-10-08 04:20:00,5.644,10.399,17.08,11.78 -2014-10-08 04:25:00,5.784,9.862,17.07,11.84 -2014-10-08 04:30:00,5.798,10.399,17.05,11.83 -2014-10-08 04:35:00,5.77,11.488,17.04,11.81 -2014-10-08 04:40:00,5.77,12.853,17.03,11.79 -2014-10-08 04:45:00,5.854,11.917,17.02,11.81 -2014-10-08 04:50:00,6.639,10.337,17.04,11.86 -2014-10-08 04:55:00,6.639,9.923,17.02,11.89 -2014-10-08 05:00:00,6.849,9.34,17.03,11.94 -2014-10-08 05:05:00,7.129,10.031,17.03,11.97 -2014-10-08 05:10:00,7.143,10.844,17.01,11.94 -2014-10-08 05:15:00,6.961,10.245,17,11.97 -2014-10-08 05:20:00,6.919,8.819,16.99,12.03 -2014-10-08 05:25:00,6.933,7.699,16.98,12.08 -2014-10-08 05:30:00,6.905,7.193,16.98,12.14 -2014-10-08 05:35:00,6.947,7.623,16.98,12.18 -2014-10-08 05:40:00,7.045,6.733,16.97,12.23 -2014-10-08 05:45:00,7.129,6.273,16.97,12.29 -2014-10-08 05:50:00,7.199,6.074,16.96,12.32 -2014-10-08 05:55:00,7.269,6.396,16.96,12.34 -2014-10-08 06:00:00,7.283,6.764,16.95,12.36 -2014-10-08 06:05:00,7.227,9.54,16.94,12.32 -2014-10-08 06:10:00,7.353,10.491,16.93,12.3 -2014-10-08 06:15:00,7.493,9.264,16.93,12.29 -2014-10-08 06:20:00,7.591,8.88,16.92,12.29 -2014-10-08 06:25:00,7.815,7.684,16.92,12.34 -2014-10-08 06:30:00,7.801,6.472,16.93,12.42 -2014-10-08 06:35:00,7.843,6.212,16.92,12.45 -2014-10-08 06:40:00,7.983,6.994,16.91,12.47 -2014-10-08 06:45:00,8.039,7.377,16.91,12.52 -2014-10-08 06:50:00,8.011,6.472,16.92,12.57 -2014-10-08 06:55:00,8.067,5.92,16.91,12.59 -2014-10-08 07:00:00,8.165,4.724,16.9,12.62 -2014-10-08 07:05:00,8.193,4.601,16.9,12.66 -2014-10-08 07:10:00,8.137,4.985,16.9,12.69 -2014-10-08 07:15:00,8.375,5.291,16.9,12.7 -2014-10-08 07:20:00,8.922,4.954,16.91,12.71 -2014-10-08 07:25:00,9.146,4.049,16.92,12.75 -2014-10-08 07:30:00,9.342,5.199,16.92,12.79 -2014-10-08 07:35:00,9.846,6.365,16.95,12.78 -2014-10-08 07:40:00,10.154,4.985,16.96,12.81 -2014-10-08 07:45:00,10.518,3.451,16.98,12.86 -2014-10-08 07:50:00,10.742,2.791,17,12.92 -2014-10-08 07:55:00,10.798,2.899,17,12.95 -2014-10-08 08:00:00,10.672,3.129,17.01,12.99 -2014-10-08 08:05:00,10.882,1.472,17.03,13.05 -2014-10-08 08:10:00,11.261,-0.353,17.04,13.15 -2014-10-08 08:15:00,12.003,-1.396,17.07,13.26 -2014-10-08 08:20:00,13.263,-3.374,17.12,13.38 -2014-10-08 08:25:00,13.894,-5.031,17.16,13.53 -2014-10-08 08:30:00,14.524,-4.54,17.21,13.62 -2014-10-08 08:35:00,14.944,-4.831,17.25,13.7 -2014-10-08 08:40:00,15.672,-4.755,17.29,13.77 -2014-10-08 08:45:00,17.199,-3.497,17.36,13.79 -2014-10-08 08:50:00,16.443,-4.525,17.39,13.86 -2014-10-08 08:55:00,16.947,-4.847,17.41,13.94 -2014-10-08 09:00:00,16.891,0.368,17.44,13.86 -2014-10-08 09:05:00,17.073,4.479,17.47,13.73 -2014-10-08 09:10:00,17.507,-2.071,17.51,13.82 -2014-10-08 09:15:00,17.899,-10.015,17.54,14.14 -2014-10-08 09:20:00,18.249,-11.534,17.58,14.32 -2014-10-08 09:25:00,18.543,-9.218,17.61,14.4 -2014-10-08 09:30:00,19.006,-8.359,17.65,14.45 -2014-10-08 09:35:00,19.608,-3.267,17.71,14.37 -2014-10-08 09:40:00,19.244,-3.788,17.73,14.35 -2014-10-08 09:45:00,19.636,-4.939,17.76,14.4 -2014-10-08 09:50:00,20.364,-3.558,17.81,14.34 -2014-10-08 09:55:00,21.485,-4.816,17.88,14.37 -2014-10-08 10:00:00,22.255,-3.39,17.95,14.41 -2014-10-08 10:05:00,21.877,-4.77,17.99,14.49 -2014-10-08 10:10:00,21.751,-3.067,18.03,14.52 -2014-10-08 10:15:00,22.297,-3.819,18.07,14.57 -2014-10-08 10:20:00,22.759,-7.761,18.12,14.73 -2014-10-08 10:25:00,22.549,-4.294,18.15,14.71 -2014-10-08 10:30:00,22.871,-6.718,18.18,14.78 -2014-10-08 10:35:00,23.543,-9.908,18.24,14.9 -2014-10-08 10:40:00,23.81,-9.555,18.29,14.98 -2014-10-08 10:45:00,24.79,-12.607,18.35,15.17 -2014-10-08 10:50:00,24.286,-12.316,18.38,15.33 -2014-10-08 10:55:00,24.468,-9.479,18.42,15.34 -2014-10-08 11:00:00,24.804,-6.718,18.46,15.23 -2014-10-08 11:05:00,24.44,-7.301,18.48,15.28 -2014-10-08 11:10:00,25.14,-10.629,18.53,15.45 -2014-10-08 11:15:00,25.448,-9.264,18.57,15.53 -2014-10-08 11:20:00,25.658,-4.095,18.62,15.43 -2014-10-08 11:25:00,25.742,-6.043,18.65,15.46 -2014-10-08 11:30:00,25.266,-9.923,18.68,15.58 -2014-10-08 11:35:00,25.322,-9.724,18.7,15.69 -2014-10-08 11:40:00,25.322,-16.994,18.73,15.89 -2014-10-08 11:45:00,25.238,-9.08,18.76,15.85 -2014-10-08 11:50:00,25.07,-15.123,18.78,15.99 -2014-10-08 11:55:00,25.014,-11.058,18.8,15.99 -2014-10-08 12:00:00,25.252,-12.147,18.83,16.08 -2014-10-08 12:05:00,25.07,-3.175,18.86,15.88 -2014-10-08 12:10:00,25.154,-9.908,18.88,15.91 -2014-10-08 12:15:00,24.986,-8.175,18.91,15.94 -2014-10-08 12:20:00,25.224,-8.267,18.92,15.93 -2014-10-08 12:25:00,25.182,-4.325,18.96,15.86 -2014-10-08 12:30:00,24.65,4.939,18.96,15.51 -2014-10-08 12:35:00,24.328,7.761,18.97,15.21 -2014-10-08 12:40:00,23.978,6.856,18.97,15.04 -2014-10-08 12:45:00,23.711,8.758,18.97,14.95 -2014-10-08 12:50:00,24.16,-2.592,19,15.12 -2014-10-08 12:55:00,24.832,-2.239,19.04,15.22 -2014-10-08 13:00:00,24.944,-5.015,19.07,15.36 -2014-10-08 13:05:00,24.986,-5.767,19.09,15.51 -2014-10-08 13:10:00,25.112,-11.258,19.12,15.76 -2014-10-08 13:15:00,25.42,-15.552,19.16,15.97 -2014-10-08 13:20:00,25.252,-12.684,19.18,16.05 -2014-10-08 13:25:00,25.504,-2.96,19.22,15.85 -2014-10-08 13:30:00,25.56,-5.69,19.24,15.87 -2014-10-08 13:35:00,25.672,-18.957,19.27,16.19 -2014-10-08 13:40:00,25.658,-15.399,19.3,16.33 -2014-10-08 13:45:00,25.896,-14.647,19.33,16.37 -2014-10-08 13:50:00,25.476,-13.359,19.37,16.42 -2014-10-08 13:55:00,25.364,-14.678,19.38,16.48 -2014-10-08 14:00:00,25.672,-16.733,19.41,16.63 -2014-10-08 14:05:00,25.532,-17.485,19.44,16.73 -2014-10-08 14:10:00,25.42,-10.245,19.45,16.73 -2014-10-08 14:15:00,24.804,-6.702,19.47,16.6 -2014-10-08 14:20:00,24.748,-3.313,19.47,16.53 -2014-10-08 14:25:00,25.14,-4.218,19.51,16.66 -2014-10-08 14:30:00,25.042,-4.939,19.54,16.66 -2014-10-08 14:35:00,24.832,-9.387,19.54,16.77 -2014-10-08 14:40:00,24.692,-6.227,19.56,16.78 -2014-10-08 14:45:00,24.566,-5.936,19.57,16.73 -2014-10-08 14:50:00,24.538,-9.954,19.59,16.83 -2014-10-08 14:55:00,24.594,-6.365,19.6,16.84 -2014-10-08 15:00:00,24.65,-8.436,19.63,16.87 -2014-10-08 15:05:00,24.468,-2.469,19.65,16.81 -2014-10-08 15:10:00,24.328,1.258,19.67,16.67 -2014-10-08 15:15:00,24.216,2.393,19.67,16.54 -2014-10-08 15:20:00,25.182,0.859,19.72,16.51 -2014-10-08 15:25:00,25.378,-2.101,19.75,16.59 -2014-10-08 15:30:00,25.308,0.598,19.79,16.52 -2014-10-08 15:35:00,25.252,-0.123,19.82,16.59 -2014-10-08 15:40:00,25.28,3.804,19.83,16.39 -2014-10-08 15:45:00,25.294,-1.656,19.86,16.45 -2014-10-08 15:50:00,25.182,-4.003,19.87,16.52 -2014-10-08 15:55:00,25.098,-0.982,19.9,16.47 -2014-10-08 16:00:00,24.972,-0.092,19.92,16.42 -2014-10-08 16:05:00,24.902,0.936,19.93,16.36 -2014-10-08 16:10:00,24.524,0.752,19.94,16.33 -2014-10-08 16:15:00,24.076,1.242,19.95,16.32 -2014-10-08 16:20:00,23.529,4.693,19.94,16.2 -2014-10-08 16:25:00,23.725,2.331,19.96,16.22 diff --git a/notebooks/data/USASAC2018-Report-30-2017-Activities-Page11.pdf b/notebooks/data/USASAC2018-Report-30-2017-Activities-Page11.pdf deleted file mode 100644 index ac49bb7520d90180ccfa44b302861a139168fadc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28967 zcmafa17Ib~wstVFJ@Jlh+qP}nb|y9^lZkCkY;$7Uwyi&N&OP_t_kMNn?&`H_Rn@B1 zwR_k8zG@PAVNn_eS{7)M`m@RxXeIzXz|PPTnwuLyCv9SD=4=jN{!}SK0{{RzQ44El z6UWcg+Q8XF*u==r*aVuF7uw0$(Zs+8+C9A@Lo1eu!!dZ{j_M1a#DHXC+wPfz4Xpmx zfpQ)lnBM9)`tzf6i&isJof%N0kM?iLkcy?d29%|f{PmKCq9M^oSo{4|w}uXRItM#9MLTSKu!C})xTap(A!RzFQ=D=T<%1*c8Dw7G@Aj{cjiDYf zo%TppRgqOvIIHyidAr2toE}bI$Y!?V`fH9(5nG(_JIIH&A7n$FUYwH`w{|?>2@X07 zd+e2JOmMyWF>-wP9Z&9(=iUrA;kq$JoqW?L6z%WltvBw^ zOmDVFZf?&-wV1NEzqoup&iH0pPmbg^W>(}5Ks)UwlAoA^@JU~PPRtx(iyeF&|9HBM zh3M3!@a(-h5-VNGS7gHd%KLJEL@#`~8g{~2;2MNcKvAnxb(J(`!%#pYcM!?9u&S%Tq&#vEt!;= z_k`Nqg`-9P^U)z_kh*%e zw8?%{lYMvzc0V(bP@}$IsdM7SR$7u?%K8M7AnydrO88Qq^Fr3_nKY75e0IQUS_ zXiQh~WXA-tikklju-6txgyKI;g6|jGUd*+{w1SPo_Lb62SAHQhEA}776$f&?-f9F;?>}rgyJdDPAzbOh^kOkLZbp6 zds35}UdXH*W&g|EM{Ot(o6@&YA0xOxsk&?6fl!#nMj7C1e{+>kOM;6(CVb~nz=18M zW%fwa!hKj;#Ye?i?LzGH`zkMX7$_)C4Xo74amW6^CK!h{yhTPU8765|O^SjXSDB0w zZI_#duMxbQAE?p?KRpjFRn7t;KP;4ur^>s#1eD?zjnAYg*h=@x|;mf(mE>0 zV7vdOl7_EOBZ=eK;iVvQ=U#co6@NbHU1z2V&b(q2G?@vfIi(J(8O8#y8S^uB^RIN4 zOcp)YRo{Ufm9joFwSG!4Ott)qVTd^(MHmKtMn7caXl?KnVh9GW%W3WoNcYhl=%6|o zxGnYo+z-yVEWmxrM0&-QClYi)7j7|-9Mtvb&fx*IH`;@?u66=LqxRC>H{M|LwWqM7 zO4N4a;bd;ertqsSf$!K*hQ~?#i>s$X&2GS#JKr!{_ay=qzo9bCr_^Ox$f*NXSr*ge z{3M3f32v;kLIL&a0U!%qNYz;%r#oHePAnXC>zM<(5c3fm$t)$y@tymx8=RmB*WMxX zA0(7i!>!2J|UML zxY{kKwxIHkRSqDm5F{W&xUf)7ju3{NOSrp)*dtu6tKCg4j|q&;2k_{J@Qe_db534( zX>%BE{^mN0t5WLBA?N-QQ*D_7_~{FgT!$g`P2ZZ&+8z~+vDk;{!Y_x2JDa}QTCbez zZ=OKQTyUJmN?%a9`Codk=>N*LKeOl5^L&dx;%@!s{l#CSj}bO~9zm$3zc76v z_N1$K@nlV4-)7=O>IXMt72UbMp7)OZiCfb*R@psx$!T83Ji2orhKX(XLYeMdVEyz3 zafrfDZDB4RoTBVS2Zu&BpmK8{eRy`B@Au|Kp<(k`Pw0ukp#E`zM>+nMMWJieKa9bg z(zt;j;ZpHb!?V-y2#vXc?C0z~$qm$G5s)&^WDyEnnR&`Rb(nZo7Y_1ZfmXipA^^dD zD-0znv8j$XR3;w*`P1B^)s zo{#V62_BGGY9QJ`xNHI%hbh1uZ>29uviSb+>W5BqlSfk3^|GB=nc|1duDiEo9ll*h zazbrfwSqk&g*i8-a*=IjUv@9Vkb$?AR$kiJwq<5{c397RlCTh#UUJXdN6aJ_Je1Z} zfRb90SCz4zbscHXBDsrOWuU@feQ0x8Z%x|eKg^k#AWX^~YC<}xs|qv_VF>aKvC2aau@XrXGZa83uUU(*{bzJ?t%Ua2oN zo0@M)@s&|?XH%i`ay6af;)MjDuP>i4tG5TU-A*g_RUti%t~6Yd2z^KIa6@ZmCbEt2 z#?D55O30Oj*+3~^SlhM=f7PFE0O)TyAyot;JRoh$#@AC_uZ%=dU#Ea-x!cCh_Yi5) zwRfB)3-6|&YPf^XX}W*mlvMu}YzF?>_`?accjLzjVOH4ydgix^x=S5y2paAMcpC2` ztLR{{pt8r9nBWP>p&l>EO10Crn~_mEy{dD}Mw=}u%R_2zXiEh*{jI;lHLKw+Y{7Zs ztmwuUdsp#712Z8~hrTZ7!DOVj)<~CMem)9J(^e;DwbfeZAuV=Ho8Q#~Q|u~(7qDJ2 zOlR>O!s=S^+o*REBqvjB+*K;K8r)c0kdDPZ()yRNw%Mpr@3|c;rp~HPpXvN_Pwrj- z6MhE;QYTso^Nla#Q5tZSn%97h=M$xXb8G#5@WOAJ%Ck43@;9I&bHAi2PO}XY-Q^KD zftNR|#73J_C#d==Hz(Qk%uBloZjDD2Fz35f^!gIJJkI9YXbju0DC(Ytv$lP}-`zMk zUF>=pVI1!ZKJcGQWmeJ9!8#LxR-|0ZpGq9f&p7rq%{I2IsKbn>CR~X0^f~CE`)IA?$@JBb~gAgP^@QGlUFCtI+oBh$h<@v+7rWkPzt9#C6o)s zE{rV)_p~sQ_u@t-L}qC>er5-5l^%z`xiV{V>>K-7s`Tw%q;5hhP$F9&;m zY56_I(G)@iJGqj4uIA|l6k*rvIJdasRGsuH_SAGQZdmru#-%SIY?=W&f_XgU=by&>VTR`rUO}gZ*)HEfWublGWz2TSP z4y}X9m#)nNWX*3EKNxiMu_s)bQQmCmQbqWT_(Lb6r#QX)jzuJ{#8cBBosyC|WR!wBj7!GX+^PuL;&x1x z_}I)w);|Y-dl410&ZSR5=tiq4y!k}|kLKr0ROe-cLlFA3-QV(z2ZScgzp-(lW`GH_ z=0WA*g?4SNW$nJ^C%I3E!2G(*OXeCSg*1<@mZ4{v!BI0=<9(*W{RHDSv{s z=oWyD@IIuNWjPqaE2h(IxFMt1gb_*=TB!T1ZF218Z8C;e9vm@ChHicg^(EJ@5=kIE3x0-`D;>oZ!m>VU=IpAlE7X$8p{l8-X%I28`l72e zs2y8?{Pfp8;W1dW2+xBp`Yn$+;o-}(YXT;YZVMDZWE6%xvKbCxw$yGYM0dSvk2oPc zv1U-QVlUy?I3aVr3)oY`AXyxpCsZKftb@s{g=#OeWlUb3~d9A^I9;)v(nKhj*y zhPt41rD*FCre+j4*(RR{fp>`egCGuS`usyQx0sXZ8wrlUeB~Cv*e#N~0Ry1EmI6+* ztxS=l)qk}ArS4jrM|&WCl4`-BC45r->u|(GeO_>S=>ZEBN7&>>CF`h73i93ry*b5T zNLW>U5}T>7@H+)gnFrC+MB7+@I;E6z8OKXy*|m3$4FqK`KXwrowB+>hyc6OL@d?LR z(U!WM*M!t2;qqO2HWTgB{<=L-r{oBZJ&)M(&8BCJoYC=Yk?DEWv#j} z2MMRq{dQwjA5(r9c9n?}bbG|&lkbWMewZTMxt# zQ=<*;)&>LWyi{=Df{l+vzK-0hViY>ot!nFYI`FHaUYp5zp&*Mzj+)=OU&5u1m55)? zMw+_pe)d~5LZ9BoW{J`0%Ka<}opUTTzXHtz_6kBiFi=uya-VXGIll(p^osM8DXwQM z^(LVv2JU+~|M$F((q6ktMhNGrX}mKX1z{`BJYuQVI1nnDY)z_Y{*0gSkFyL0{HiU- zzH7FFwB}07&6ehQB#V;R6SOSd91^$D^mt9fZpZop8g;&1Cf#F_lghkoME(?NeoAM0kh*t-74L2lGh#5hOfw zuw$Hq8b@=jI&0{++6*gAIjF zW0U#GzN#tC{A}T+cGxTmcTqqxElvz-bEIp}sFQ5&#jrOGGM>XQ1riVnG#d(&Bvsn2 z#=M*K@EY$eA>=j-kSQfGSuQ09M!XnYOyxP3AKhS?$j4Fra0SyVr%SJ2Z@#}{bh2yl zJe`>u(x=^G$Q0dng|d*ok-TY)EE0uO#yldnD;tU%>FD^2=9qgIzG7%qg0j39emQdI zNMCP%p?~iQ9odNgjyzv^glwHbSnL`s4uaxJu=+h)a$9fTf`t&$YPE%ak1sssx{-40 z)n3fOEdt<+2F7Bndm&j)%bQs`7n3cef=0@nvD<*V-txI2p}Ie(&g0B-I-iqDPCfc{ee&2C;LAw8+rVrmH;?Ay8PwSpAHIrS_zxDS{RuqiV6NP z`B!KZO`Pmp9F0tz0Dr=)_#b`b_>}(#tjh4G1OIni^-nv01F#GLb{0nZ{|2<4v0FK# zETlZNG7&`^FJVO!uNVce7*cOu^{54VXU`9?rW@T)tha0!`9qPs+5 z{uU`!?VDU$V&SaKKwLvU8JshlMcNF+utm)ZYn=N^VbR(^aG^vaS>LsA<- zO1#ahQB7tmUSmBZn=b^U_Cf7g*4IV*DG#?6T(@s312TVS2OI z;r>d9Unypgu`ZyGa<%PYr?rv0g%6ZO8fn|pS6@w!FJr7NJg%TqboCfm*!VH{ENGWj zfZcAh0o2XaThLrkUCe!Ey*tAPtP`%0;1#Hc%J!tyDa=o+T<}pNXfEfiHRN`%Yx8*M%bsy-j9iwRW zV4#)!L@J3Mm-deQhp(Gu(XX)%q=1|!x1hmbtZlN`!yI6LXsyI()i4=Co#YONj0h<} z^o`vC4IYe(I*2#W@o&&*U@Uefzw_JQ_CfW}nk;m=;Qk2iAh(V{=7jWE^dJWyOu*eM zi2`2`4x*GW780D4;KwAwEC7Y!n3dwGX|uteMzz0MYL?0sAtwg5fBC!!=J>QT9Le-m zQHDPZEP{?uf#{ZvBnq&wRQ1#Y?M>HAYif4K^1#r^q2aqfP3^u6f28IvDUEOqB74O= zpk4V5l@t#>T~?gwaZTS3Mrt=hwNJ7BAg8qFL`ondI*xqk7%p#o7$PUNq%W& zW(&%OHi!3b=PpY3WrP)r=+@F!kY1?z!n=|v(+|S7Xd*5(0u9`QEhI5U#Zs3qIvAogwIgEUCDqo#cDyHYagH|m3*?+C=v(ll!lIt|x8OJp z$gBkYJm+L#T*WPD-a#xqxa#GKey1?}*LR%E*`#2jX=>jB4URI#hDZJ;wgLOkNTlqW zjv(r)2pYCOM&8k0R>!tdQzbJcsp?vnkXMO-nVL4&?e%BVjAZM|RrZfKx0U~-j$fZE!wRc1{85oPwvOz@Tf)(TGm5Oh6H_~b9dLhlmL{# zs|hDOqNq+*C{WSVf|%X8b6;8^xc?0Q;VhzF#wFAruf}bjnyJQ}%#$u5RK~KBzKSZ> zu^ZFJQ=JOI%R@xK<$y^mo~TJeDTyB7rtV?33eSkwYi(g+p`)Q;CtV3Uh!|*3jSd}b z=wRCZQh?vDuvGaw)!uwVy#W;qroCxW{9s%_8p~)yg+#zE+Ys)%0J>E(5QH|6Z@RU| zS6yG=b#{)2>)Ox*+Su-?jV?JVN=olny~;3N>#dGm0$=@e`2AMgn~O`kytj}c|MRu_ zFKtraq}*us+LpRcb(Xa0VXntVKkn;jcnFQk=mukm_b`q`;%X~|C&4HW4K;-?2hM_Q z=Ee^WUUt4@Ak&bWSR%sbcuDe6z*SLppKTFQk5Gj~IC{9~YFN;YIqDg47jn%DU?z7v z{2)ubnOQNK;m@*cv8v{?E}5|LrF9r=Jhv_W=sS9=e|cs-__Cm-dft8#X7;jB#eGE` zrgu_pGIYO-t%neNCpY1Hw)Np|o>xbF_#|*mBKE_Y%(T4ck(@i~*KZlpJNt(E5y=I0 zfe_X*^D~DLyhdvmJ2Lce5lXr%!HjdTIhe$COga&`SNs)w}0vaksOYuNypB* z(m4v3v1PgR6VfgS7~$4Mul4VY6)EjN(DP(%HnoI~nNcc%bP?I_^w?8yZF)uFK*N8= zc=(O5sY}9`w*pqSAZe3MzQZbdmmuudM`-r@$+6ZuuT86=jjY$s*j*-M?ONc8;wkO= z!8k_+rB_0{T$XDNc5llU90 z*d9SjVoKx}HQ`ZKvy!D_sZ|Z6WfYfD_F~ZK9occDMllgY5n6*}8BoK3-_B7Q`(IzS zUmhL`Z!v_1yzfKvvwjlbl~?i~9kZM>+6pM$8XX95-wNBFc|QGKQBtbYM0BczHC6{u zaU>`zQrgmcnTz345NCNyboQU)xy_J0nRz@*Jab6KHpR3a@+0EufPhM!>j?%s)9o{n zU@y1f^(U_F+_|fhZBkzaE~L%uXcJTb`SedlsHtX?-3!y`U&RTt(}yk5>R*wSJ76Dx zNpYv?K?1wf){cHCwNgi)CDT^>wC?`?{VPtmgNrmMA7cs`ozOn2uaW`W84um6V)VsE zURPRZ)9@Ws?!*544n?VMtNY@Vj$(PX6U+9^`P$kM_Vh_h%(H{D{p}q4$CQkO@06yb zQI_?_>(v>{^s1c?nllPc#Ce4t<3m-zj};8-Lℜe$hKugAz9i6IH*^p?;cgKagO^ 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 NDGD4M%DO6q{|EDJNWuUB diff --git a/notebooks/data/USASAC2018-Report-30-2017-Activities.pdf b/notebooks/data/USASAC2018-Report-30-2017-Activities.pdf deleted file mode 100644 index 7e589a63505ab274dd8f2b36bbe7ac46e55274a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4817307 zcma&M1C%DsvNqbbrfu7{ZBN_w+nlziZBE;^ZEM=LZBO&>`Sw2d?7Qwc>%X6qv_;K_FPrsm*b*x6Xv2pI_hMpp2=ybQ9IcBY1omL8@igiH*w zgshxQ94w3+3<`u_Y#a4WwFy}{I0>0pnOJrC z`Qc6NO#Uh){O9`H2kU?IA!=$2Ffmm$bhLH)>QMw><6>*)M99jZ=xAzUY3vMeBxGXd z=VuVNv~f0dWDvJ8bT<8$2!oWUHm?|`5F5L&n5dYTFc&iiE1M9zxUdKpqbRc|Clezh zi!eX0n5ZZh6DtcBBP*+jun?;#mzdb!W)^W~W+o2QB%M#gyYH{Wl!@Ps`;8E8<5@GxJI{I{}y$JEK$(9zk=(bNnch7lfy zj7&^H93JLhfhPPLX*Q1k9!(KKW@a{~|1pwZEgWqBFKn zo}S*aj-;F*flxm#K+%9uz)^Vl$!(0U3oY4z9QJD1H1a?>NeHkCQq26k{2KqTZ>t)t zp(yBrHb7+gv@s{M6@kQg<3)p~SnsZWyEh`efu{sCY3IN2lrTy|?+%%|^!FyPZ6l?Rcu;&wt>vCS(nR`v|TPNatl>|5BH*@=KEphXOM+I(UU(P4|K;mM7K z;C(v<$v*TGVVfsoT=$CuKjayK&%x=b>fr%C^>lcrPmZzpA^eB=`^ees&bMDzpzMBi zZniLPhsVBS^ydo?3^q(6E-2<7+r=#51R*320$jklqRU=;`NAH>6DSM-{7%w3`Y{L$7O#eD`%al1 z{D@@Hxdek4lX-nX16wx*$O@rUfd26eJFK5vt2ni9;$_L#k6>;ir40Q|M${2Y-mq7x zCu?58pdXNYT znqud~KAYi9PFMHW&Pg$@;IIW>EqS9;G5hivJr^GC$zppjS8m=+nyqC7Ubg+x0Ep|I zm65=`mAU5_`8o@qX{Q#f_3t9vq+7aSJDQ74*M+9E+V)bKlrtL~7&E=r7R-qSob~`s zrV6`xoOfg4K|88`frHutf~&@cr^M`Dtg4D!8ZgZ=e;IoAhCzrd)wSPM6;r2c;^aZp zg=s1!LzIP&TD0y6S&r4*j<>Yua^MC-r;d@Qaw+2vMY-EtotBDAM|_;es9M=@$vBZt zMCS)cSY2WPbq$a@VwxUH3>ni}SOAyDf^tbA`oxk^EG~C1o9%*iwGMg;)$h~`)O1xn z8`7oC3!1ixrBv{{;E6xZUW{x>R2nL4&1M1v72rqrSm9q^-<(~?_0ij5s)^ZZG_0(D z70q~WhfR{X1#MZ>ZY#u8*LH+O4jgBb%BZDKJD58Ye5V{d2&$rY--;y5v?0p10daNy zP17)`aq&2z+}(ZV!R5O&iH8f*BI6+)j05my^4QkoFr4dYojeU4g52)^wL$@MK!$v4 z80TUX_sptMYna-n@J3Rm=`lv15BVB9O5q6|4?0f$R`7(9&v7|e(lbA92m!t(Wi`gk z>@I~m37j-c5pNL?1BEt7UMR&CIe_9BHfW#*CaZ}~8UO}dI7lO-b77a48aDR4yIyF} zr`@Oz40=7pf**)PA;+o=gjE}+CM`WjgbOW3Xbf8FWRx7Pq!EwZcOccQ7y^LabQ38+ zU>X#IkAovE%;BGu9Et-L3kb}B;Q`GBDFC*lz?OyWaQi^sF~|ER@%gFtr@HI=wZOFs zWqUW;68RR`lnjkE2s(QhnoQ~9fW)@)l|~*%_dQ34uM16fNx3gn^-NRxDOrkwd~fZf zI=5MAwOPV)fyH-j7g}zCChyD+H&%qK3D#JC!;vSbHZXjQ84lpp8Y}@z1G`4USJ0AU z4I<#@w$ExHP#_SIzMKDHjs7=E{2No{3>~fiBFq=q{jGjMtC^vVlj#@4$(cGEnix78 z60&l!{DUeAF3vVz2<$}2`41>7GbkFGe^KnLT%7+x9cM=uV`o)IQ`3LYh>4Mz@t^nq zV35d{CL4hHf5Y#W8UG0e06S+>JLfNLY%E;=NQpQC?1cet+KlvHTD~53Cg!h_gX^o* z{j$x(((r$6{X*|AU0k{wJW$t7`)G*pWVH zyw39^-3dU@VV5u4;HPml+BZOi@EfAjpc)T)7W3LayE48>snp>?+Rf}43R-dEPWJxc zWY)s!3!NE5_RlAQ84j?wd=q6MjtYdP(ApM7qCt}--Km;pR1vlBH7p84MHqyOOJj1B zV4z5FXsyH-qkM|!`+p)boRSUXLdC7`U+z<%2;`^A>~`;~P5+OJJS#0_OfiasyO{6q z&-2J6;O||hYV@S_&TX^=&6}{?x*Qj79UqRaxv2weeL>BOSKY&dmaS#K^t)3N$6w}( zeCBRWP04y_fc1#Z+H}4!p~)8MGPNFxg_p!x_1) z%NH01YA5B8z|%P%oZ2_1^#f_fH11J|VTt=iwm2dlL^gP5V_aCQnp|G87SnBc+^IQc zE;4T~>HTN~l6X>AjuhxHnV+NtBM#59(^sv_1@-d0>gEZarul8Jelk9}<8vC5%ltg} zdZt5=4I_uxd^O(}K)^d?BiUVAz3O4Pee{1%MKyUct)^kTTMWIqHcQ#+%Jjb;C$V z1BUG5Bww)wwAC`Rg|VIQzX_E1;I)piKikE~kSN{ePY?y9TqLNwEz3Ng9fy-~Xb?!D z5i)b&36hIH^yBqyJ(w@9AVk-&?HkDUO%hnf#XTfnhG{S3+ZxzNL|!)q)Z<6S1bIl^#c`>%J*j*VknhCT#AKF& z7S3Zf;_l>PBR(D9L_myf=@Yi<>{+69wJC$%)ZnV`%Ex*j54W+D7>q?U8vneSA#?+% zeYf6VW3IG+eqRe*aPKT@+HZRa^wOvvBL~&cxq%(&&dfw?q`+rCcu{Qky-dxanF84W zZQjo&&248^oglLjl)bZFuhoU_O;eK61M8V&Iv|s7o;wRI@H)W=c%lY6+6f*y4b34~ z(n(qKQ*jWOAUOm9ZYY4+whCAWQ9j{T9f&=>r1YAt+w-Ivr>%j|;W)t- z#ZSZihG7!OOIS6FwF;6QQey(>8dGL1czz_IHlG){d49tus(Cop0_wtSAnIKSdG_>s zon25LES<#!qIZ>e)v!i*tnJ&;0@Jyaf2zgUd$`>p?OP>*I{Q4FJT}`)HP0*m=x%Dz z_@(x+=|IbK^3jycp6k3gD_n}IMsUd%jAtvVB)G)Fvx=*0EQ5#B8hY#i=0kh5u8vuI z9zu2%zRBOf5rcTPEeDpec4kp8|C|y1L-9m{do|~30k85k0?#)2`4{)9@$=Kxv4#G# zPy}lSJlA0KkC^UuTYQ60R0E)~aK*39!~bWm@o%K~-Y4w3T|MuRM%k7`IM&7(2!BI)#T=KunREf;oV(S7y4Rg`!D0 z3<5W&O%TQrmCqKa_VLjczIu1`>Gb-khozSA=VGJZ%SD~9r`}bMK2@8N7ursBKawQ> z4MBGh1`JjlU*gqlWuJLTR**gI-XVAo+IxppnSuUJ;eY^7-V+Z(-ma}MeSqGNoPPwv zOXfu)*_F>^4j1u9Y;6Wh;OyB$s5tCO4X=m}XDnrlafYXnpe70sbc@Tng0|JS{s^sp za4@!+RN+=Rz8Q7qKUOrc;>;^Bdr1-~fx}KBEBbchlv!+BYV>+`yXJV>kL;CQJ|ZRHuS=wy!k3{c!pGuO z$Wj+<`zYK|&N$Jk3^oJzf?Ey7X+)xvS6R z(q{3=kqlIvqAbNqw+to}I-E;%4s#x}J<(p`Reg8S2>CIqJ#?QuDY{6TzIZf$J7o!{ zr*e}qVrR*g8C^7o&5hmcEVpe)Y&{|3b ze+3`NS#%HnHx75vbybw+-x9=4>|R|=Gd>h{cD!%&)b5X zK3wRj=Zz~eq-8<5)uEM}mstF#>64*9il{qa054Y>0pE`qTb?msSzvICAcs%2_?86A zw)`J{T8MyaBUiN%A@qq^a26%&co))>3O_03K9SZ+wkfMY`m2wHN`BH^1ykTUej+3y z8tN4~K@)>!hEx-V1G?qb2KzbBk?!4^Po#7|gW~O)QMNyWKEW}8x=;xj{>LSf^>23i ze_bM(**N|lo3Z@oGMSO=uBzgSKI{t^&5BK`={JVg_N#%2WwSAi!vj--l7a$87M5HF z7ZL?W6%+kgmc+bh>nyGymPub_T#2ygeL4&Jz<7Gh*?_(jor%FIktuIpG#4~5Q`I%GO^JygU6w&jN@4L5i7&JFo`@^3FYht z%%O?3)+(#>$m@`6bpR$x&A*b)hurfm45QrEsi7Y42?v zwOnb;3Rv)jyj_TjVR!}6yp5kiCg2VPXvBGeN9P3rClMZEu8?%0O}ta1-M2|xBn34Ws*~;%b7mL*M5H5}AD%PJWD88o43akQ4EiJ~?z}3r; zHT1VYx6QCX2eUxR4e(q3oA-1{@sP~dY+E~!6AUPo9+rTsih#CGoNFcsQAbmotp^&45c>8`JHK-#(T+={&C6IJEc+UR#HTX6l z{RTXkpzXar_DGR|F}={&6889B&{h802FS93AqEh<;MIgs#6obPu$n>$u{8VOe?*KZ zk;6ljb7@O}sQp!A(V2zmreR7TPeX!p@uuyLpQe?L!JHA=z`Vibgb;JCa(*#_%o*a_ zK(_aG)nG>Zt8C-CL01G=Z$%B=RUgI}wM7Q!){7gyV|P5h9P17=cX;byR{w%iFO)PKy|u!EQji5DS^nJvO{& z^#IQlHlJPsgXm4(7K0*@gpPos7Us*1V3b^zdJeS@wvS?zbCV`T{v!&^^fN`2mQW2T zJ*;z}asYH-Z$M_CeLxdA%tY*#SS)r{iaFkYUTjr(RpKSmIh9q;L%t{uZ{%Yi%#lb_ z=8_OG{wY>~OrLyFj*NK?Bk1l|}Ykkp;ssZX1QJFhd^B$=NZ%Y|LDDo`4}Erd_0k zI8lF(#_;lQ&cWxjoApTRLt}C_m6XQRs1!W*cALi(DZ@5q;}n@xxe1{|qC>Gm67-;h zq4*k;3bjS3Gs-gv>*U|25z8kw@a?}kL%gHCvqg4W9Co>2HAy`rCS^? zVJ<^#Vh$LSt`#en>Dj* zeN6i6p_}8@oY!z0S}kGMJXXzC*w=gvJbQmEPHxiA$eTA0UM6mkcy@U=cn7`vy%#?s z;MrNGtag3fTvsI( zfXqD~~2lQs{rq-3x6^?Klqqqje zI!(sy&TGMo^K;}Y@1x5N-TlV4=i*bNeyo1dR>~ILH;F{rQzSeT@1v^|h9`oXZtNZ? zNhk|gPULIb9Q7P#d+qJ)z!o7(q4EHEh<6fBQVoI*foGvm8A+)TPa=*1UWeco^*47) zB3AYWy8FFp48vZ-;F>@~Uqp;x_24V$?ry;v!BzvC-VLZ?D9wTB&{0X+I?~(sknvhLktE|PV;(OO|BEbJKDXGU7_QhW;WV{OfiD@N zn5@`Vw!L%OCHKdU8@J@IB7kgn0?|mx=(7kp6AOtG=^cY+UPW?6{mT0J?m6Fzf|HTc zi=*8^+Yz>t!XeXL`0bA)zVVpxtEp_A{dS9$ygTqk@Y4X2pn|@RzRaNdh&>E|7OyU< z>il0eW@OP!nK*9gZr0d*c4 zXgK5;lxg>^o~Ed#?~3>LpH}&&Lhh=64E~Tbit<%_G!d5?c@EZ(-H##C_*RTnbLS9Q zOS4Ke;@TEIIyZW|h&+&G{;HDU&_q$IFEta-&fC(2U7#=JGuqw}P{D}297-B0Z5wHe zYdd;ye+a=|hF=YajmnC$#=c@BV|_2evQ6g5wsEkr1f*)A*V{VZ1Ga9e zaNnpr{>U4yHm^Af(R07TuoklpS^Q|Jve^*Tx8G`d7izx>wcPT%q(5aZN6s>HjqN~cSMz4;j0jhDSIjuFQU96L->#OIiuWBG` z$Y?}q3~vH%a&NkBwrJjN(QKJ%m2T~8<7sPbr*ALrAnHi(MC**{g6aC%_1W#w{m^6I zbKYy-yVs}Rx7M%GKR=)}FgYkQI5H$Y)ITgV+&#iK(lN?C+B(KL);!KW-Za5B(fFI~ zcjF}cWYZMKRLeBiblVK?OxLWyZ10@t+|az#{P=?W!p!3L#pNZPrR`;t<>M8bm7CQc ztFLQ*>)`9*8%P_;o4A{KTU1-s+w9w&JEA)iyDGbDd&YZb`%e3B2R{$t50j4wj!KW2 zk2_ApPo__`PY=%Q&tA`iFTP!5TvA>(TnS!HTx(n(+&JER-bUVG-4)-n-uFEyK5RbP zKE6JMKVvNs`Ihod_1^X&^RfPE`}qk12lVvw?)868Et&p*rIt+p z95?=FW@%(#kg;>TyFW(S(-WJnuDp-GkBRjStFXr>%RkCL6&MaVAp#Z`6vRvLyyLAy z6$0-10vnVhw5tM^8CC_K!9b3lk{Wmx(r=lPtdSE-(ieDl;x-;6htn7&mM%UK-YjrF z%p?Si3v>lfkX>KO3S2U>m#aIcj*^8hU$l36c2>EUiA;d%J5ftr3n^Q(MlTBkS9b|v zH)Sm;8+Zx26(rPkI|i8=bqmGeAvrbX30B;(BQX#qEm6f3(Ke$IDo+fOh~NHf9y4V^ z+-QnF@YmN+sUgn)CH?+;9{hh#zqz>B{_At+*C{d=3p3+?#w$|I(?(?p>vOVmscY%+ zVQ=&7s4;W7t2T3he3FMLw-&2f2%3oKH*x4%@HKW2Ij^{-5Nab@5;qYw{CAwtOC@fl z`Q*dzI?EPXrn7BQk+~L#+$kw-&~os3+JjAgnVH4}cbK0O@l#Kk!<{ca-FL5DS0Erj zEVy9kYOYmM^PfkjA>EK}cM5I~C%qS-{pxy;1weZ5pnkWj+gTg_h|vnV5YIaxK$(EK z>%)s?fNLla#VZip>7nfuz{ARF-1VmZ`48HLHamjNb8&_fNJleHH5;H8_V8)H((Qvj zOWkIr%kwJP_=tY@51Ai0MKe4+LJdbGzu&O+&D;E=e`kMhQXI8kcft|q6oSpxa|B<1 zHYn~EP!B%`Z-aI7{jmN!_!R-!Yd;SM!sprKwz(UBv_1e5PtXU$Q`5Zn*iBLxvLe7m z0F>nvf?`4f1toegBFOy>ya5UmDhD44C|AsqW;kW4%u1SPtw3Nxdc59Z(=A+Jf-!bX zcU)I?zv}nM=m4CwPN&aB+eLYVGV_eR_lt)vU3`G@4xpKl7qDcVi(N#8ZE0sw0x(a* zCea${LtVs9*Ir!-eqj!7{H3;v#Vm1t&~CjlnUTenQ|N)?Y+ANpw|It`t)10OXroSi;Q4zP##yNh|g?iv+Ij4-N&p=Pz%Foiks2F9PCS}5;d&DWVLo}+bnJZ;b#5WDB2wD)1lXQZmzCGV%V;}LB5Nxt{ch_LD7isObHH`{CybGz6 z6wJ?9L7{_HEl0N_cwu?DXDVLmtL?B5wEZ&$X9ika@0PhI25Z92KEe&kpyEKYh+Mand)93$Zs-*ugi0P^cyx!83zs5f zZ{Pk6R|S!ggUjDLl+~bU_*%*a5T#klhH-wuRBHf;Obs=)vAm0sO&}jC5bv%k-=nD; zVYE84njoHo+5#<2RTXNMN*vK)h*cB7qv3YrLYG1JmMz=pv+PwYkg~F|gED%=6`eAr zwW=^=l_NG%yKKj$23+8-*YbXLm6weL5x2)6Ebqz&%I&0n^h8HF z)%>E>2He}TPA5N~v_q>Wa2VKxX-X!p+50Hd2h+p>O~W)MeGW1Qgl?Y?21XRHn?Htq z$y*joULwXu60DaoJIAsggDm#kv?aH&5PX6D4r*EII?YN3eO~j635+8Sje?oGH_OLr z>lU<|f4258YO8Cx&E-P5I>(r+msI1F$JO}}e{*`4_4%bOT30tpZL`FDYIVJCP!H|l zG2`uYAm%FT#1*Wp6J0Fnf`1T6PV^VRrT#sMtHwil3P1^9t<8W#! z2PR!*(O}hv5Yk=&LO+sDz}Ac9huO|cf3aQ0ahe4#xA*bH$j2N{!bGi#>*giB-hK0C z+f5)qp`&iMYToA>rN=cquJ)Cwj`JK#DgRzPpY@b7id#BAdbT8AQ(PJcPFfIpdwYQv zdG;{y8!ML3FJemM8P7V*m{ywb-=QB_rz|`_j5NZ8v1*kbFfLQwMNhO8UkH9}Okw>N zzVrkms+VGf<;KIm^aIM|9W_rc_pilfl zClsNJzc=vJ2k%vlrx0Psw3i5>^k{!w32)*Y_VMt{qUp^G=TEl-R8bpDR(j zlg#S=-n-3asV_I8Bv#JmaSptw(&VdCBqWzN;;L+EI>u9Z&ysn+);T84N+lsHo#s*} z<~xNY+}$bD)3r(SK;kdJn@E*`uZ{$UFAl)sFtoG1+%H&)p9+#Yt|y1UU(;^q;s>zo zV>s;`$Hd)zK40Kn0A7F80Ed~WOX?jB4q;aNS*ma0NTp#F9v6MnAEWB%ukXiy6v2y> zkZkz5s!P84j?kHHcDmdzpF@I{sTBr?zig}RWu^O_yOkkW5*JDqpoXau6DNgAQXxaP z@~a1h)c}ak)1h9;`?|vBAyH1g(M$5!8%xoc)JR#772NQ*)Hx*>y9F*I-ei@x;c&#d zt#VW4$q*wGTn=&OnkhrMMp+8eB(1*>jQzZlx)54GD=z}APSUY!G(c=y@Y5ZMGMo}g zq*xZQQ<$b_!~>@@QW!ip9t{JT%X)3tcT$(uvrC@&<&~yif_Qi2w_vVPCBKA)0h=hC zg9=iJL>VMV_0y?^9Q%lT%7{F&=@LW-?oN*gP5=brA!(PLGk|_7aAq?mR&;RcDOEpw14Bog?4$S(`w$~ErSIAb)NPO??RXJ#2C@p4mq>yo=fxjvV-6RqiaxP zqboTrHf)KB_EIrGqMQnG0m4QMDjb;Zg0rP*(jZAx>2^f^jm|QuQdw?E_)#t(#00of z|8qzZ+rV3^jKoq`W?ry7KL+@qE6vzQdBLAtCf^+Y)jW5O4T$9_zOG^kW z!$y*2H+KPf%i?g4`});r;kt1UMNUQgvP>T*9DPv~YX>%+nt`6Ks{+Q&+SY%eeBgZv zO1)D9gMKk6!ez%uw?zYk_7U08AyM~^Fl-4~^0UeTK=Y{RBpS;H@NXZib5oILjc~*0 zJw~4)(b!J@W4WiU>o(Zu>2NeB)uQPUMsT*C_0j(hp)C=TA+N0xo;T?$PAiD97h$5Y z816Oj-?!ar_$o4T*`+ui_6e>z>PoU2Gu7%A^QCW&A&MBqzymIALvL#AO6y_R)v3&p zW9Y8B>~~B;#}GKgzVfE;@Vi0?8?JH$+?MF?c3hMx@C&%3Evz#KC|F;=g860bsBM!q zyFWs56NiK2as-%TE)X~g>|R5i-`Zblb6VG>Nx}$YMM@o|T}?HMYcvizxrXyzS-Y^H z3pp7o@LTSO@$a6rw)7JjF`m9<_`4TaS(H3c-%$ds-)=5rO>vHgj4d$Ra7xszN<18z=2D^;a1GcGaKx*T4WC%>vwR+%%@ zZ>a9#o3qb`31`+@P3cqIDo1DS&^;7rSILsD1O$fNdzB0#e@Fi9P*{9?2>!~|yY%P- zBjnO&IU^aCj;K82n&E?8ptCrB^JP`7pTW>7Ko%?tr0(o~7Vor)35t$Jo;SCgcvesp zo{ZQY?ORK@v~E#`9W)Z&Kmw!spPCl_^-}&wu)jBL)fM+oPnw-zpzRc>{845*ZTOlb zw#nt?V;3J?p}YBuT$bj^uIplzKoN65ruRq8)P^h9$F@ueVs``2x3!z!66X4w3r21? zJg!^Id@dgXTLMp`Q$GN&J0Swx&k-v52~&DoPsdRzBneZWxV7BQL(MyH?qOgz&p6+( zF@*PoEqEPS@wvXL`RK9k@T2)e?yS*`{)X^{Lhz1LVgWJ2r>Xgt=*goKtwSql)9L^u zJGQ5wr9S*dkd@KqhdlxJw@5Llwz%?!vYrKQ=DQL5UB@Za!VAwW?2Tq7;jER{i@?qW zRVVuG@9F!ylPD_Mi2D~2pSCNka`QArm>LcgOp+Ok-a6q7DLVjN!SAS6-%%C6gFBCd zyN#=(aKD-7jgU}nhYinOYhdHc^c!2cQT`SKga>B$9@HQ>>s|)J=paOoFPm67#|U5W zr8dDTKw~2_i*1sGk-kde+L{W*3-Y7K3}WX7=MIJ{z=y-RtS@W|tT+`Ap~G$D; zFZ9-K7xS!hWmS3i6eY>V&x(_CcHvxRf!Hvco5gd)p8RdLORy9=J9{C6fB^TaMwE>J?@L2z^>5Jj{97!5Iz41i0E=-p1Ef@$9;LuEV$QVbB2@bKDSlnfaY7I$Hy@9VCz$ z4^IY1A)yR<-<=a3-3nI8emZ2kU(XO9{Ib&#&s5-1%9*>iF(>-rqlj`;N$Se766rK< zuu)TwP2Hg$k!y}K530af6t7t0T&BeU8iTgeavMoMzraw8&cy#S zh)wNqEbE}F6dd+^d-MRk)Xx)GQ3tklKI}CsL*ViHi~{mZNR6>s4tK5NVA-vXTn>r( zvU0eJk89d@cg%r#J$CQ1+m*Mzv-849Kb80(X#zjsvWcJ!nF!%j3k*wJ2CU>5OGPLG z&WL^b5W*J5erk`X5-;|GDvIMchi8VSc~{Ly$ybw!`)sst<@fF z4LU8U1!djE2pP%56VvjuIl;Fj-7cea$po#`$Q<2Hc_R{33>UKg8mDX+W=g!Bnk2}p zv63FSa^Ufkp|!SV#+0!yPdo&ku}^#)e^s;SW+O1^qnUSk+^DCL^oW}WR`~9aV=2LJ zT*up=iF;Q_U)3nm>9WEqmgQ20l;r2UWB?2EcD_}8Yws4EuaK!Sd3xi^d0Rf8Zaw&Q z%7UFRxU_x9)z7se$u7{l4Ec^KNLbqm7AL@nv&KwEt)Ve3!XC^xVTj2Gea`|2@c6c5}G82{kULjkG zYyifEUm=O(KhQ^rj~+^VJf}`>bY^`-HGuHlbey}y{8 zLr%f_81{5~S2&j_7;26foJa2t9S?;__lJb!;oKRY@oH(XIN610tMsQ$KlXfLR<|t| zO|p3T*buxfNBhc0`|fTNWGvUl;0=fE4G`5T{LQ#RVnL)R!GsAjhrmeRP+=+rB}2uvYISWa3j7Q9jdTcYbyUO2OXe-hTS`|0Vi$Fj%Ah^Fox1i8i*+#uk9hbg zhHqZIrd~Uy?hd0NA1%le*EZw8oy~zZhEJso5KTgO2<<8u!bal<_N9zErahsn_d)(7 z9q)ph#DX)t1^HcL#FE28IT-pIiQ)CukBVnY>oyCPT|vN9WwfRQ%&ndBONjvsdzK{< zbPZM%UN#;ws+S7Bap?EACK2ZU1#4AFj}PJ>ywia|Q4pB6nU$4RTQ0)Z z{5+6zEEl2Md)_*EZ=aCxcD}#sJc(=pjR#B(@(!ovQokR$UGrvHvI5xjIGLhoFG6V2 z?8kecVOa~&Ld*#A@kB$qn?(#0-yOS<9*rA;e*)uJJ#s4P4RG5BbD)55;D$0{H1rO~ zhoV>Xn8BnW8PCXe7hPQ5E7c+_<*E`Ch{$)ZWO*DQfh{;}LNL(wA?5vrU;<|z0$EoI zK~buSM%WW$VZxKAL=4s!^{8w$w6e;ByY@MLGxRu`s@o^nG?P20sFqK)+*W@u@1D&$ zn}$6B1%b-%YwVyEIe99lc60tpvGp>ZN_QCkJDPdY5Z=R!t?Q4r$gkia>fY)DcA{!N zn3j%Wep#?kREO{PCQY#(>M$S#(Wt~SR&icJNTRahbiuvhhBZbl#>SWx zn8c{#e;i*_rwgeAn^dQ`VWv;Zp2lD1#Y`kgxlN^KVAgC0Cs5X92W}C6}5E`hqSIbR+XTtc)Kfpig zw(oW@ScXfJpe>k0Ai@oyjbuf`+fv5if+r8lByjnl>$^Y1zMVO3 zMR}LyBV=f$%HM}RuqZjRqLbwkl}y`;laPDGYntTnRYWU4^aEtsTOy;Phpx26Xng4Y zQ1YiF0+}AC<~X@8W~O5zAs!k-h*#%QrOi-4QViyI3oOoZyYKbnx=Q48oN&lDUPu9o zD5;On`1mx&)vsk!=dAW+Av))J3#Vu^xNdp}tIluq5uH?)tRwd1EH1xyzooTR@WW4T zZ&&<|#8$N8#ZaUBm8V8eYfdjqUgOAMcGkB5%kWFI97|Y~?Ui>$_nVvE(jHx!XTiK$ zw*P4mB)t9@-{N%+DzHh!)VPbaS}}X9yVwR9uIjw$H9K~&YlzMQG+;%fQm?ov4c|&A z4OdUzbJIp#*=cjjsb%}BgxT+i$>EW?QNG%V6|NzYDH*0}?DaQ`NsOv}jynKN-Oy0{ zv5OCrISno&g3uz*;Q-?v?FAs3wk&;4k}SH3eIc&9SQ!-G-f0$1`-8)zhm8n|xux5{ z+Yw`9jPc!`8e2}SZuv?%_4F7bSm>Nd#%%*5${yL)K!?7Fs7x3$0vha=@dcw_kA;^V zw+j8CMlJmmv#s?SvHx+(-KQb-Bd?L-{NlN#wdU0rAV3r|5y{Gw?Mo`tJ$+3CvV;JE zqA3fj!|F@fQ=Nm0bm~|8n>;2!P!ZI_tbT37*^(V-QI1g$Me2mowW)ejoE)UkA+4xI zln|3P|AyxU#=Pygx`Lp!rt!pY+zOz;f0p4^$bOTMo)BU_L~N$NjuW$>?pcQHNslhF zfj?_gTTu}iGw(8dzSq9T$MpK>4XW=Zg0OLa*12bi;oWytiXCpt*U48mYF6p;YE6}V z+jy}WpS6rtjqXb3b#e$%T#spq1Fst6e4n}UZNbu;M*s3pTr-z`{TZ8r%GB*+TcWa~lq0>RA}aAu}}dgyDxHOf8qJ4FXG+i1EthB1!84$>21}#k5Ra zuEdjuuqggC-j6iHya@@|?_B0e@d~U_h7v|~I|(5-*cT0wB_hg)k$ zK|B(-K8X&N?3<_8m={Z&M@MU9T#8DCMKV6F6*}bvQL^4~$(v^?{H+5tNq4^!`m=94 zQd1zQSx#wp$ovF+7&X|tqr?^9kjA~awGksww4`%qz}v*yT449oLV^k`j=gZ2OUMX? z+lA+ET+4sJZmKLsNJkYjA|ur55aD{`@7eY=uJ=YnF$=yUzdaM9k+KKY{wilOFv7HN zh0v)2j?3*sk3ud{Ohs+_?cpNV#cZwwWhe(s)T8H@oupdx5vJ@~dQJET&$$N}dLWKS zDm{w77<}pKmPa-%>Et0amZw3Df;9Md$E1Z;s{}sNDGd_1#ZU>!XT8z7WF+7NVWp=e z-!SqR4&iRBGsy}zhKXd(4@)8R4$HIqy(IHv^E&^W9hh^X_Ao=0X>;ppeJRTGWc_*J zx>=E-S9MFA7fn}<$h<$ZJ8Z%{GD-$^!37(` zOihyJwx^;}GOUZz?Y0T2R3Efk9W>hJ(FpfH)Zsg`p1jJbKjyi=ueb$e1uMzUad$q> zPkw}Jc*^nO917ZnhoAN#ETSxlC3FNH`+>W?(;IH+cBfO~w?2&AjB!U671EB!6ZgNn z(+*08im_`!@s!`f+*`;eH(*B820VTejl3a3J3Mx*GSaYc#Dd7q>AP*qJD7FeRIeD+SX^ z*e8)t=tLu%arITa;SVAYjKAKI=K(;PMq35r>x%*i>W~o#vl9qYEmnSN8iU~m34fCQ}>>))5f0;1JXiOlhDG{KnPe~i6V<`55 zP;1!dtbtH#3yvH^Wy!I>sGf3<@VSD5t8cDn2dL<{k&~>IN|c*D`JPlYVRBS4dreNb znN3bCJJk>W(p+Qd^6YGSx-@aEf23|7ZA+I)h%Z2sgRxWuw~{WTq^rpV)`|^B^@jn2 zrY5=(902{Q8^S00zAR6Wr%U7B>9gy%HD9_VUql{$SbvCZ;=M!$bfpiB2@9I zOTHE3}1MN<-;gxhd1nEaniX?Z6d){6aeH5D6Hz#kR2(+UwwWl?U z(Wc5oA`Z6p#J28!_Fd`VJ3vGGOc6SvZf82K$OJNw1>=HSr8Q z`TSLe``>WPFHSs{4&#_|?+P@}w(hLg7|p>M&+Qw{{WPAlF;xLy=^h|Z9&I4i+D}SW ze>T+gyGt7r3sSQ3wUqpvCs-6H6ezEU@66R!@lC4*JqW2lY?}wcRKLI2o{F)eNu#I< z*N4c#`gtM8@HL+v?!{JE*|qlG*$7&jJz+p6mL#IRZMU}LT7_hG-85rqe)q4vn1@^# zo$ZJ~Y7O4@4hFXV33C)R$X%4-9gS>0d#`jXnCEsoj#K*qC+K@U8wpJT; z?$*VqC2dYU7g9XLzk#n98Cq15Tr|wq8?J5kqo$fu&5`+CB|FD;r|L6;YxEsXE@znG zS6o)*ON#n?d&!Hd(nGz*g1Ko@ykZzcInBx+6MHglfqU{pdgu+(23bpv*+EmcKdaZ% zgeEq2XAn0Z?6W9@x-1l8zp0k;+T|PK8A`+j;llMVSE8T9g6xA|e2iULmoU&lNqfAR zQ)h&KPBCPx4*zV!+l2?_AN&SRu7|i17tJq3iVQVqvAz}b_D=nZuG*rmWm#hF7{^>9 ziKU8KYJKe`rgR4frq?<9U29c>>>?jzPa=!`X1hdv`G@RDSKPx)2?9S$Rh&AWW6GMfQ?N}HHsm|-v2gQ#=0=|Ka%L_#>=4~K!;B4UgC$dD{kabyG zZLNapKdkaD6jU~U9K_$4IxG)6X09dhHUVq~vwqm6dwIb!z!_A%L(y=PrZqCfau`QC z=Wgu?lUyw&yI<9SJ-|0U<}28JO|QB;i6D77mzhMApz^h95$xai*fF zd3+Gjf5-$q5jM1h+llxt{HA+U_Bs!2TZD$a;4yS`?Cpu7V5xK@cZ~?>9a<)K!=!k* z{3*)atbnZL!LAnG9%G{EppVPA>;sBk)|_pq8e*qyU5YNeqXSmvAFZ>OCap3SnJe6F z3o-!;UYR~{S$#8XZ-Eiv@d zZxE9>7%E^45-ZU+|nLr5zE z%o6}CBcO}9;E{EcYxv+4JL2SmCE}k8zhw+3zt#P)x(lDL5j1HbI&NP?{@DW$PIM#e z)P{amiK&$L^c}*5w#R#6h9h|z2`C@*?vxcUZ!wfov4eSi10yS8%z1hQQQmB7D7><& z(9ZahN%gbY^rj`!G$hT`gQkv`Rm0BQly7B`1McRr$j;!Hw{6-8rhRHldK1P~MJ(=t zkq&hT2UGC@2W~EKrVhyKN3jL^T&a!d;m6lLl_a&xL~j^unA=s<20hb+oz`KzdykaQ zmf{XVgu5J+NCjH3nreH>*#`;~M{xqFE1coy1mW;){B-Njr~V#CM~w^I{1s5#ZLA)O z5CnQ693#B^v1W&rA*O1y$epjl;sI1>`RRDxxSktZ)D}+p=DqlpWb~GIi(Wu)8sUbt zdV^{Q{Th6uAv#P?hLV6duaPo@rkaL^=YGVgod1&>R@e4Tv5Kn5YXM@4KBG;zkkxwR54{c-9c3Ri7n*G z)nLu7%*0@wvV3s0+fg~L9uc3lc5Fbj?ACv@Vj_XkJz$&2y1b_1M_tfI0Q=oiDnT~k zts8xSe50fKq2|$`7Nw6tI)ehr-fhH#J!Oq>5$MzC1DS2yee@voNQUZ@pxHrPST{Xb zdRNlAu2Uoq1lJQ-8S>GColSD1yh`OiYeYt&8=e5URIvxQTxWyGnM#dUZcWzQzSH(y zvLuW;>iPBBGs{2J6t(lG+lZ#Rpd7EEknpt%_0{yX`&1y1HSL?Mw?~Bri_P%Dk8EA5J?T5SwUM-8+pmAdth2~As3)&DmB*wi6GH%)3KAh73s zeMuOaquhJ<_}-K6`906?`Ta!5GxgA<-LHvJyQu~0D7E9_+=44uL{H20F{3NmL>+V$ zTm@?NQ+sZDL*DvBcZBgf0|UK`aUnJr&P5rje`qp5HfY3 z)Ek5Zmg`@9iNjy;fBptU{7v{L#Yog>HE9AY*VTkV8cS5dsI*vzLYzo-knJTYU(%@@ zU>P9uN=qh_B*8sudr7)BBJF-bY8&6zA6}gfGNInCPG2OS2)I~IY#N^L6Pwcw<$}6G zvXpTedW?^^hw}|p4z_Oo^AmfEuWs(FaWIKPH{R{uJCX*yuc48eF=nQpUwiez;(J{N zZ`0V}-~9EpGvB|}xA>_vkN~gXcj!|&S3^@yx_4iNI$l4vZ#-cQWP+hgfERr6madw} z?B2PtMza|AjdGlt0lH3(42M@wZkuTs`Q^Sf$+0~PFCX4rJzG51BUlB->=ZbQ*~r># z+~}EqyqzFKiPvK&*ae79BR*@WDW&#C|9K0Wt*|0!gwHscBD{m3T0C$l0qr?;?iykiBRNN zqF|#2s_qkb3>7ybuxoe0z0v)~?8A6mBNY+#k#(%2i0l_M8;RYpWN-mTCU3wroV-c2 z288(1Spyy(j~Fxc<3@}rDGVm5Tqe={8}k8^(`$L|-1caEa0}+4A;|3&jSrZ$ zky?YEzf7gExe!oa8oLZUfl@^!l3I!+mmz)5#1M6(_|iS`CEN07 zkoi-ve&};-4HmHV@lG?rFlp-ChY&mTXjl zcw^HQx*hue#zhSB3h37^+LV=7R#R#H7;B|GR!uB^Mm`P?%`g4v{L+ukD?d7qOHE+0 zvS3rKn&@KLSm)w$v1FiDZYrLOd`cIDJ;=h7KTH>ief3YB+PdlZWUWu0Y*{ngTm5Zi({O5L z)}0w?*)mg8)w!)Bx3Sgx!qFoOsBitkc&uh~39Xp{ zrMO_dg)xKm2W-n={SHrH@N#02j>>vgq~erJsaTAq9(L5R>sXp14iBzazElv`NXJtw z#YSu0MZ|t&9){7tUeIhHAYvU%(8BT;8a=WCSP8Nv&+)kIfG$_#E>|dBt@^6&>GRJW zcz~*3r$-M<@ z{WyM86Ha#=Q8=|!xL8VPSV<^ZO=Kkr4J&3MT%-k=^SJOPmjNFQg3?E@lD-m@K6)g6 z4L?F4sfQi!2uQG6iYRx{KNRMRh`FF$Pn7E-NTpIvBiAEeMiT!fr@vR4Va3r+D!Nw5 zuMae+w&dg*gC$nA3;3uytz}Kj;sj$fXtjEi4smy_PEgxggC5nWjTV>1C0ew%bevw( zVJ+twhA+2T$_2gZ+c#OY$>S7UyixnPO09-zXwcp}t_LXt*`9}NzXdhjM!g}M!f6!o zpl~IUJV-7sjUgF1a1}cU^EgD}!szIwL=gU{jFRij75Xq`C?&@L$&w9boX)0QbB5$xr4!S3tk0O z)?$jYn;8{rHr^ZAp0QM<29mAQ-StMWU20mRb2X3cY@T{;GUixwZ1y^x(3uUI9!rH) z&+s0H&Es^M5Ib>l|E5T!KU-B5s?u3JcC&-$>;b&VQq~5O=T*IN>DZ zZxm@RQ{#}b3Y@ZWRIh`i)Z@mlCwZ&Kd8;qdDVbe6EUjJZvZ8)S@prNWw@4x!WQa<# zigV+gZoJb?cDnISw^Fih$o%h!;l<U$+Cd~H=*E=DOBZ4Kf!t)AQ zXo*lSsQ?1mGJz~d{vU{Tm;fi+_I$W=)!b;-tkbGElRh;(+mYYgQ56|}w*Met#b^zj zelEYgySh9%n95G~HLw7ziq`6^*}|+m{?Zdsv2DD$eRd#<=Esh2ZM0W7D6|i9|2kP$ zI`FX%_9gyh<0&k+CR*Vt2l6AI>T8?jq|PRmxkM|oc+1F}G_;mw&|frGPp!vS@8M4h z_6P6M51v5pquoB~!M}6{omveC#A|tv%jzj}np75@QK!;?1H1nRKmE_e?0?xW6QHQ> zGk|~J`@cP4VNaH0VR^?MEQegmA*;9|B8Q*|;w^XiE;G(}pK zVbByDtVnlB=Nrv)nrm|nY86McI!$=WqNdUXt<~vC)w}EFu5>5F3U+R;))20WGLPCF zWtlA}T4v+1#viv7nBrpf5hk126mQbT*==I+x5^9a=Lr!u7iW;fFq#CNp3&!3T+W95 ze*f59!l}t6P%OWR#y}6Xya4aL2_~Am!c7t`HW`EUaWIrz0;M+aJy<9I5%9$wv{N#n zv2RSus7M(@QpS)};Id8^fs1zcbg7vsLR9&mYbXBr#f&18;%$I03&8ErIN%L1m(KyL0nUlHI|gtk}JWsKV5v z=_*5v(c6S^kOwdqRFqe({VIF=O8;jP9|cD4DP<)(>XjPagS+AOfkl(y*55r!?%*#@jq2!R z)ZNoV(+HsL{VHK!j1%59eROp}B5Fh2m>PXKfT440jIDQvY2!HNzR5(bof>P(WTJi3 zC&md7TQW6qZU*Dd*!JB$@x1^ESEh&k%gG3Z(?cx&-$qWH9uD_7&e*SyYw-lGPEFEb z08j6oNxph_q{0M7CNrabdZh2VcVu)=pDZ3A`_xyNc@1FJ(XW!Tmcd{!7>qk`E=X<_ zi{Kn6nbsZ%M{wX zl)3LCZ+)|rXMO`LV=x#D27|$1Fc=I5gTY`h7z_r3!C){L3NstB^PylnF z5Q5_Y=%a71a`oq&;}i(leCh@$zjrl!^oiljcCI}^x#rljq9)po3RCV z;x62S-^Byig@^EmcpA^+1$-NSiI>Sme;< zCw-UuNf$XzuJBK)Ec$u&U)V1t9!Wf!_)ozq*oB2crLaO+C9DzF344T7!bRb?!taGo zg`2{tXcT49EoO?d!~(HUEEemZN_s z52ROQPFBkX*(_USn=Hu5a;jV^Z;-b*IET?8IUjM}bb*U=MYxQvC|9iOxa+5`%dTI$ z{*u&@)|~e3^q7;jlhQ4I)G_M!`vd+N2_hWhnz+}gCELh8s?S0C#@^wdruu;WynU4F zb4&msRuF|!VQEO8dZAP372X!!6+RF~gfB!8%~YQZF(x*Y*9MDH}HaLfz{z>}0>bexrXIEN7+77Bu%t`SU zjEVt$(EqujlIlGGf4Z_8?Hdb5fAhyrDeH}W6GQal@6f-!Qw8t9On~9AfmFKt({QzN z=C6kUKG_Cv{l)&*2l4^>_x5)Tqz)wfdHI;kb?mR`FYhm=&;3#0=^6cw4{rf{I54zw zsA6c&&`ZkM!F7YRgVlpogB638K^?$HgCAWD%KssG6WKTl@E>aH`n#(m3jp}co$p-U zOzvEQyEJ(4gy0n0hT`s;K#V{LAxO~>Ae5lN-QC^YU5Ztyce~v#rR{d1EW7Osu=XeH z4>NP_nK$pueRJmXZqBuQ>9rnLWrm+mULkM}F82GicsWOLFEe|}EH}G_u-^tP4LTom zlL}JEtG7@n#nMgs&IKI1Fjvz>x>*01U*_%7U-j9MJLtDZuhzJa|C719=N`Dn?#aL7 z=h@A@cpW|auP2{y;D5i`t6BGqEx+E)zsCP_2bF61QnB?a`{rjs4z*I=R`G%6{_aY4gg{uJn-=Blv}s-DU_Dj`rQ5E=+mZG5lL_s4swX-?nMV!o&)e2c2Rwy22j zYpa(YwH56G4MiuB@KUA0Vyx&U7yIf4e0R~8*ZL~v^W81^Qr^X(n)>zn4w zn;vK+GkkpyW&10y$V}fvD?Je;jbKS4kIW_V%G@Hq%q#NAJfe^+A_~i*B1D!JrDPdV zT9y@MWI0h%hKTaAy{I5Nh)~&4RFs`WW!Y0yk-bE?j1m#Dzo;n(h}tqn)RM8Hj*Jua zWTI#w2g@YUP$rAUGDS3!Lq$`WDw@b)B2tbN&E;s(OpcOcL<>1qw3m}a2RT`ElvA=b z7d_=n(Ob?Iz2q#>S7wQRa;}J$^F@@Lr-OAa5hIt0IJrU$l1D_6JSK+7<04s}5JTlj zks?otk@CD4C$Ea}B2C^9>GGDCC~wLoI8EQx_b^l6$Lackeuy*l`}za@Ao4?|I2Y&PeEpUF8W-qq0$G7m`j5C!e~XLspY(UQSpOM6!zKEA zT&n*PSQ5CTAL}3V6I`Z$#O3-Y{WGq>mH4^-E3U#XFbluLukdU9M*pJ!hO6~c{S4RW zU-ffbtN)Jc^b1_C|A8CyKXIe}4L6~{%_wmT0&c}^sBk+5a0hDKiHN%}2ku4>_n^VO zXmK9~;eI@TgboiP;~~t6!I%pV3nzm_uw>C$PQ~1K1oPlg%!|h`A0Eg2cmfOHNi2w` zun?Zc!gvOY;8`q+=dc)_7yab|5i6HtalC*f@FJGPOZWy}#t^)MrSK}2#%ovxuVY!f zf#vWfmd9II0dM0Sd=Kx+fp`z^V<=X{2UrO!<3oHOtKbJ%6{}%&48spG96!Pu_z6bf zBdm#^dS$(GUU{#A7wT2?DtVQ?DqdBunpfQm^TNFvUW8ZEtL4@9>Ued%dR~36f%m3q zX5Kc0|nuekRI9 zoBn2ii7~Mz&cvGpGteZy{_9urD}WMakQr=}%n*}ohME*J%%qy(W`r4O16EtKIjm=m zwKm9-b(U>T8*Fpg+%}KRYxCLswty{Y3&|()7x^4C1amm#gYpo>C802c$lo}EYjGW} z#|^k4H|C}wb);^_Z*e3yb6dGNx8RoCid%CVZp&fZj@xr_s0fw019#+3+?l&@SMJ8$ zxd->;Uff$p>j64e$8%rq$59;3{W(Ub=u|y|FY_Z<9Ix$aXL@p$(+Gcc^XgW89a;Ua2C(w1-yut@G@S(t9T8s;|;utw@_D` zXb0KBum+aGa;Od~p(fOU`p^Q}K{`}}FbIbl5COHIHq?cB@Fp~bM$j0VKvQ@NBB2?) z4b7nyw1zg&78*cH7zXdaSV)6;kOHYN0!G3p7!6}!987>oFd3#m226!%Fdb&VESL$i zVGhiPg|G+~!$g=1nUDobY_yHB-E4Q;!zS4{JJR;D$+n+OwLR?++uIJceeEzez$LmE zH^{}h!7k1vxp+6kCAefa&<(Y*Hr@`j!)-^~-wv=*c7*L@``8qlU_09`wkvFh9dI8u z!+UTR_Q8HQ07u|BJb**67cRh6SPvUuBW!}Lunl&?F4zrw;2<1^qi_sPz$rKlXW$&1 zhf8o7uD~_84maQ?+=AP12kyc>Marq1Dp=)J`BfoRSQSx4)f=jmDx=D(@+wqSQk7Lz zRbACk5vr!Dt?H<{s-CK^8mKo_Bh^?HPz6;Jl}j~LRa9|RLX}jdRXNpEg{WdGOx1D| z+)Q|={@~KwEH}~3_G^JTZj#G#ligf5#m#dWZa$n;72u)@cT?R0_pV#$rnyBf(=B$> z-4Zv$Ep=n~G5^3n^3QIZ8&5rH74@Rk)SK487L}X&&|2zC>!=^CrzqM$(X^5J(DLPH#=nRdgvowLuQ5v16iFAR|=^{;{OEj4- z(-gWw8FZDV(lvUQuG2KSL79HFG@WkI47yD-=??u)e04`heIsG*{>CGik#;Fb=&+>F z45njxvB6XqYL)N+5*ZJA||sQV9tmf#iK#?A-c>8rMYT%3r%Kc%wOYNe)~FBET6I~i zQ&-e_^`Y9JK2jUipVTJxXSG>fRZpsqRjK;KvBR+|bm-6PzMLajI;JMY0)AlVLbrHkU1AOW8`cmThEP$c5iS z9{d6F;g3)NPeUPWg~_lDrob~W6}CeWJPXrc2TX^ZFavhMOxO*xU=PfOy)Xy%!Ccr6 z^WXr?hl8*H4#7e=42$3hEQX`71dhQ{I1bC;1T2S>umVm&F`R}~@EnxDSy&Cv!y0%2 z*20Uh4qk%w@G@+KS6~yIgU#?NJPEHsDZDPG+FpSz@CN)2-h!v#O|~;Ka0RwlatK$X z1+;_~(K1>{OKCAJ=UQBs>#&P!b3J;Ro}q2@EN!Lj{1`XnC%7>`&W*SMH=$j$kM__3 z+D-duFCFBL+?6|Xckaa9xC{57bMywiMsLxp^d`Md=eZw8^8k+J{v1OW>3zCHm+3wF zfCup~9>ODdFc0UUJd!@<6duoMJb_c$&FMUm{!U-eXY>_)N?+3Fbd8ybALaVoltVd+ zd+|Vy<8eHeGdY7R@k3mNAK}XUFjwVjw3^n_TG~i!XalXIP28MYb4zZ^Ew~N0;&ybD zPSSBYO~>dIouD(E&AII5e4fO4oWlilgTAMm^aFiMx9B_iksYkL20OVrE3QeaXeAZX z3Mx^9)KC?r`l$qN&tV+S&A0>Yq#bma4$%=cK=oJA+?V@sBu8*>?n&>`J9L5GR-AJP^2ny%9~s*mce8|p^7 zv2LP6byM9;hw0|Jg>Gr|RcqZw@6@|2uWoDQTKQI?4%h9i5!Og6Nq4ZuSYxeZ-O*ZM z6Hcuu+NuZWXdR3hcPe~M#2af1*2gQbhU~g76#~{ z5TS=V?au1X8qS)|TF%ofW}eb!kG zXUKLq6KCOU87|x79N7Wq%8ocsc9NZOq3kBR+d^$&w%)e(w*KXUQSA1s#Q;tzSB|Di zk#8(pP)oKFmxI^}D4KE%2G!yVuynwlH z^mwy9-o#wDCo9a=BO}8V?@k||o8yX4%}Mp2BO#Y99##fC;EX1J5Q?gv@H&gIT= zCAxCGi7Ba>iQb7WPns)teCj<*rh7ek*?xDjCo?-S%bl7N_CE=Dl!y@#<~va$R)pRc zem^_i1TP~H@CPyf)3N_cy3IR+P+PGG5fwrxM%~gf)-S%B8+iL1j zv(vkt5@S^b*IkdVlJEL`zUyTrzDi|Bv5KI;Ty4K#yf1$D6cFFzL-OY03&%S!OKVv}wi~YgoyK<;Qnf zp5T?wHL1=wCEMVfpyeN%6tMF|fhmPzvX~;KiXt&B*cJplMP_75z%Dd(x|m@yGfT`4 zpgVoJXO5UF=9#Q55DUek2U?4MLyN@{vDD;wxmfXU@v?uiicMK5R+;;-TC5Rk#d>ou zHi^ymdDjK}8%3$uV(yH8Y>n}32_XOIN%68cWd2k3h{J(cCYz|0N90ai(gHEeHZdqN zC!BN7j?3d$@LRN|o3s1Rwm5jwLgSx(&y4(F9R18+887$Prmj1V|L((&BxEs+qI5=Z zom+>bNl4d*Hl=Cm#&#a0KwfC~hL;^DS*W@WDwSqkE2Tpn)WEb&-KwlGNV|=V26PNl z=g@U!9o?f%*RB(-_QxbNb!d;EZPJ)j81ug8oNMDaDUIWg&+qp=zw!9u@}dLl`W<61K7vthj_M+(@Qjozw36sCCig^LhKx)6rG~e z^keMg%k&dU3;jlQ^XaD@{ZvkwqBHagPRP&bEN+_D@t0Lzh4z}Go)en%U#DNd=TXx8 zCH)FF)SL7cP18H{2E5;j&tJoPm)@h_(+5f^tl!aJ@p+Bjb$y8caPB8^oxwUEqHVM- z)Hb+%+tw|c`)zAeUvE!$*TxO&ALv}y(cab?jf7k758c;%Z__<%?{2*7&NcO`>uRei zgSVI!E6bNI_LY^E6c>3tZWnH5g=(W_Ys_GkF{W3V?d^5kH{%fEc|wfgTbH%Yj$uYj zgc-9VLx>zMhz!ZdP%cvO8BNqwS8GH~gS{OwjkMC=ZNWYmF>Qlg683sw>y^SOg%b#% zg%K?ui5N_Y8Bx}{dn6f+MUXF5QXDqJL&bHqlqxQPSpthynLATTRkI=twJN$ch3}b9a0e;{BBjlv=qbBCEn zn#arl->PWLdG8)6XJZ3KT`g8$yn}e7-e6i~Y#=eh%lJ^zj6~$R^;s+wff0&3bB(5M zt4Dl1hDq$;%g}AHdUGdRYPQG#2nOGS9le%l;xuDR!;E4HrxmM@M)6+~x)`OG~*uVJZv&E~rW!Dz*Y+0ujxAGS-ld`DZF3`_A-HVnNu5!{-U z2aXmDxAQ8EHx0M@19m{ZZZIUjGbUG%dGm7lAmqj*`}x?R$!I>HY9l%n$s6FTq%LQG zPPX~Ssq(dOIz|gG-_G`Il@`R43r$5DA@N--HyCvpmN{hFCeBc(%i?q6Yc2M-v)AnG z?zhBlJEx>?mM7~QrN=0M>a3%NaRys!{Ml_4ew*-fZhJv>N4DBXdd<$>Bu{QS3CX|{ zgh{(AJL3Brmo(tfY{l(nw#H4vXS62c>CD(bG8GCXcSd6)Yk3Z{V=!shOw{T^5Pl-9kkGtYO`$|um6|WBsnB$(g@ndm*rf6iEHSRz zs4>X5=Lvfx8MFDrMa!_2cq>dXn~AArb4pR&i&(Ka)WS;47OvmN_4}mm=DG(5Ls_O^ zarm8-jG4HnaG)&mEAl96Jf)G&WcsYY+x|;-07q>L=(ku=4eowda2?{>I5Eg=Y%CGy z8c}>}IKMGnukKnIn_j-Xtm!h{>=i$oUiteI)4Y7IY;^qUm23NpW;`#$ zEyB|vewFf1`FphZ=+!G%juy>0dhS(Lt$*ser@TX?PmsA#-2TioNAIUeJwow$nL*tQ zJ*Q{L&(Z!ulOXDptquvW9X#deliCTIbSX~&Yt5DtzJ`1|Q zM(}0mE5IuKn}|C|9`#`6M|u_718u9|DQ&>9chYiw8%?@DK<-=T!2=$k#3!;*;{FFE z^a}I^Tm!Hz*pgmeVt#E7H-Yk;f04@aaaGXqg`y{^!n1*d#=~%mn5!FQ_xdILG2u^DMZY5F5`Mb=7b*3e5AZjPb=?d z9!6P)vL6`W5nzGOLthNWwX^iJzJm5Cf6JVANN6uYci=JLR&}{3JC&=nT)jr)?m^zy zEH;Sph0I}5Hex?!vvH2rBymrRz02l_sc+J_B=Zr~Il#-GQl);80{Wv118W`dbmDyfVPRmL&w{Txs669iLBXu7v|7bQp@Pt;MX0eT ztsz!?)T9(K0v1JWsiMnHKj+TOkDn_hB>wTqojEgepJ&eZoPE;HJi-~BlsVp1ne5FC z-{*dgH<5TYhIc=440PY|jrTv=F4E6CCT;Z_vqCPnr{!w142`>2E;rXpKQoGWwg@Uz zwa<|Z)SNJ5erRKUVoSl4n^Hf-Ug0vrmIbwjKSQ!8Qn{J9`x@v+cPb z3bQhO++iDV-v}BzTQxjm9_0H+p~~4#!bgT2!|aD$yt@yMl5@E1qh=&@_1+>6c^BS_ zU@gNH)>clt)ZFRX#opIaZn`G%myL zPxZyIid;+S!+)BOKR$%^b>Y1y@lh}bhyjH>Q~DB*mPpFvONGe~Pr*`XlUR z2)=G)xV8K{Nlcg{9sEmVG2h?J`H#0P#QLMY0ynZ2RF!Q)_qCvj8p^<$*qc6 z>CUn~`=n>x%>?pDhIaUUDDxC|p2KCEJI`OoEar^bi_OX%C#PmG#+y z>t*t-V`5X^!h2EPn6~HhIR9*P&YGttxfkn<*h5^Xh|W5=ly}a+0$G^)iauI%{cmZM zYEIh+rpN?;vP?u$_R9Ww!l-{3W035PdI|%l)aqABcu~&W`^3{n;1wt;59i*J2K< z28CnE^O~tnWNSG6_aY}K@Qd-iVsfftG%eD=1*&WIMf?r?JZYLT(j=HErT$=atV66- zU7@4XpL;Vohw4lVsjpfW$L8ktZE54zVkdUviyQrGoQC!b-jR(#E%(EuelQB#eprof zuVrqpbA3>{`^Di|)n?ASxt+(_V(`@`74w)^-#jLJ6}wATz(mJC@$E_S8SJpP%2KqT z6hH2$J`FFae+T!<25f88p0u3N{m?0CV_PTlqAY}0lh$uR&ewwfA#QCm@yro4;dyVB zt?{1Y{%73((%goIfUO~)gmf=ipAELNwnp}4{<*ob0+yPEtZAX#V#;LF{%y2D4!*jCAy8Z`Mi+dlzx=HsWEmTxDl4kKOFSQ0a_s6xf$#B=aePwJ;5) zKo6Mi=DZpI*^IyP&JX6-;iBi)`(dDR7!X6jC3_4rKcH+Uk;O8Gl*|SNEg#x+L#jh8cyFA z``(VQz&4QqK`Ef6L9@916%@l8a+71a3=Vd~7WkXA5AKkGTn|LsHJ=-jbCV3gHa`6Z z=T(EQ*GM5uf=)0ozP=gwhd8U~`DhrU{v4c?tNlQ(OZ{DDa`uzWXXJl1lB4;C<^igi zscFRGQ8LbND#Q5aHo*pX!_iQlPdD^>ByIhhWK*g;wOg5V@K%uz{KM()PsBSE;hW?qnrAEAwGb-aFIqP!|5Q(uNJ!4B9H zK~0&t&e+Ch=}Q;;UHDC73bw#H?2Xa>dQg$c2e(q!Y-POj zZJB@SM_7wrL6DbWQ`|1nHp(NzFSWfWzuPBeK|As$B}I<&Ffmp64f7{w(wa_l4y{|M z8Lv!8Ej|x*#HHrAtg|V!yFk{Nr(q5E1Gpb2>%6DnpakY$*tz%T@@x@ta}k>JzPr8! z?JY6OWe~B!Cyy#I$E2k{kXW&czE{H@DI&)_r}$-In2p`1pf3$*8)RCeHH6}YVVDhl z)Kkn>xjW`jg_@*1%NB7ba|Ty0Jt*b;hv%^8LK9bSWnfILv$TG4dJLPQ+Djy)W~(h^ z%Gqt;M4=DCaIgmV0>NV_Dc8AV2`aV5gdZx!~n~n5N9STE*Ya7$Y zJ0e{i$0c8pZ)AXC(rAKGPYM;Ul6NYdE#DE_ZH!kMGg6v6{wz%$d+||V|3_rQ-al(! z!B1MU2TD`%94+hMiOELC(0yRtZZG)v8oAn~kF<6*K_&HAD6N8J&R$47ofBM1ZT2QU zzb$+>XoyyWk_F{eR#O2#?zd(#n2<22{wc{%rPkAp5pn+A;3q<_Sqt>rAD_ zX-OP!<<>(T8M9IAJkF@PE{s_ob2nTIcd_4YjXK9HI%vzfy1{%sub3+4RSnm{Bq-B* zGeP&~d(>Htm1TbujDy@QFJf&hmTPw zwbJq2SL+ zDWu-&B{w@ebs91K3a1e@jQ0!rR9`J451t`KY2B|^$(>sB?qL~2O<3Zz`C3^D_h*By zPvM=h3jfAQv08D6Rj}fV7KfR3MvIjS8lSDLy|H}&bAO$fa)z6iHn)a@(eGl-K!2wV!Wa2Y zB|6}^j`8+I-}ClKH#-;~Fj#)*&gNjW_aE4&YUweoInf-+cgDAV4-Mee%4Yix`)7~A zgEAx7z_%-S*EL4f{c=_rJIosq{XFEg)Z1NayIxJuQ1D{$f4S+ zh&Ht=Z>siXj%QsTZNp}n_hq6xiwC8MwoP^x`#TJy81sw_!Hz?{cV(FA!8si&Wt{ob z%)9akbT|9udKX_VmqGSbS3eOww$yHuIcBZQHKpjsYFS9!dA2tQ&2lUX&GXU_43hPB zJ#FYRe}gRIPMv0sqmRZj{ua)A4P`Wv-5KjM;>2!-IL17HzI{*@n9Wj_eNh@tE8`wc zkp^Ozrr>}yWan}p(TjX%w9|a|%cfM{rKH-^|4#IVuFb9QdE&rCJMs-l=hn8M4DD7S zKey{y-$zk%tVhw@t7L5ESojj(x{Yz?yRpZkZR}$<-x2pM)@xUwhtYqgnYG`?9uhs9 zqgCVY)+CyEzZBvF`kC_R9di}2uEn3+Px(LigjMK-;mo~GzeQb*bmbdm+K>Ct#6NCw z_hE({*SQ$mkg$k(Z?%==V}6jN8(GT$xEMx)z>TJqHnq(P(wHr9q2}4|04US{m~c1i zZ2*D(P#6UK;{>%^8}j$v>}=EE{(sDHSkGCwAqR0OXCmQT=#l)>JCpPdXLGd^1jFS@ z#k{~7R%+ZC^4&R_7w?5Ry0|`x?Va7H5nnWuvKG6WKJS5!(X(EP|EQ-v)$OAb((?Fr z^n7(fTCV*(Z|@*J>44z%j^XZZO8i^=zHn#FPe1p6?kxbnr&Ow6gc5rN48`}2jD4(Q z0&QERmw5>dak-1@Vn2m{z{h>a9mXG0{#&%&`&8>_UxUw^C3Ozx`=V#uxQT$T^LYcg z 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%0D=hi^`nm&7+>*~S5Hgi=5>A=~l=5t41WYC|4(nHj z3V^mPKvykY4{@J_^LdO6N>>h1(TzGr4pEJCaNY|8AfR*oXC%sa3xF=l{b>H8i{7BW z#NMy~|5IkeDF4>o1mg15-V}ff6LjkU()jT|cvPK{R-ipdm`_}hYZ#UIW0YulzlGL^ z|Bv1%e+p{mEDqG%ie>ou$)8FoD*Ap0mpX>%UB1*fD1w;H9CshW+7-LJ% zuqhZ*tXsK___&Th^J|V7j@ni(wR~~HO3t`CEK+0_nm-qj083nLY{%6-pT}#g zh`(7uOi3dPFu9dJ#g(Dm5hc&4lbdH4p+b$<%7z{AT$dPiZK%QV4~_36$w`b^5P4W_ z*Qo-PUv$f!37_KlGWB767b<34<)lJV{3$QZM;TA>PImoAmozv)1*4tWOzjd_x`U`< zLwA4mDEAaW*TcFt2z8~a@ma!{{y{=*5Nq+v4_injA2+^RDb?Z|v^5OfSZa6X<)CgC z$gp~8E_phY(Ko7Jqg#%qL~O_@2s4UB8p5x{pi(ijH<^^zM+!RO)3+v6fr$D$eoYVl zV!u{8i$S^65S=-|VeVKcvKaK)$@9s>oTYM-{U9^G333&ziY;k)SfgMu7RAE_#3iJfyUF3^>Qn>#9fdPV*O=4$5|_O@ zI#R{jw5>dZ^LR(U(e;jv`Aa53gGB7$)=~4=H^32?v2xUeu8y|`pV-r6X2pkRW|NQ| zq@JgoE%e!SNy6P2mzt-u0#1TGP$;hA6Ard7hy!jve8^?%S1mez&J`Do!xVp^x)`*m zBq5ylli~A%ZM9m^$W0PnnrX7$(A)HiE8fABDEeRlYT9!GX1c($_VSYkLz1@%;HNC$E^|3ZYJnT*6bC_r#nvILlag(Zmx!i3cdwdG&E} z%09rtR63ZN)wk?ZfTjcqVolGo~2(_c;?iNd^Qb=~`!CjGYMopZyS;W$cL|ML4q8WF#9LaO5StJLYN^pvbe{5k(l z90z>QL>L3fs*-3iUJLCL$!*gDTtxZx_a7jJ)RdkYmkua;wO61pB!VKgRaWWPs#HjXFh#jnFTog^@#N5ICSAAkFC4nk5<*x6Hytf0} zoewDWijQfVXhPabdG03e75Ui*yu6yk7n5MJ-jif3UkqJ39H$<+5sRlV=K%`Qzae35wRYL=}kMaOP?SB4sR;Ax$)*w7C4xQHFn%Y#v{V zS7ZHlkgJvrF(BlQI3a^%TxJ&&vw91gZ`0*ppHX4@Y2r_ZUAi2lkr`vmt(vlqVT<=i z=G=ZaZI+)Gv$gH+;yyN_5I5HOk;ko=+ESHhn(Kg>F=*oiIhJ>Qr#+rPom@Q za6dXA6HPP>cS+hhABpZJi{DiqEolWTJdv3#F!fIK?i({f7v9Mphh=QOL!4U2D2oh^ z@}DX!X1ME3pUz4(jpqOyBDF=Qron1E@uw2ox>fqc*LPsP?wLu??mWg9?M~z;S$_kc zD6&7kCPa3g)^2SLiTIHU7QK?h6UU(l(;9Ogj=0<|_*JPey(-Q%68F5vdfDl>M)P=@ zkc<;67MEOYG(qT#ccQlgGp}fjV}@aIlkyLY^5Cq$^!xCqVg1;~nDta3N)bvlm&rrH zcKo{!92Je}WMNZNqz^oUOCTIXuqDxSXcNY*m8lQLC+(0JalH%FS{b$EE5CcRB8NNOc1 zaapy|s(ZeCcDw#r@9RlJBrI06SoKZ5`)cR%svQ>dPIfeSgX}nnD>%#9(un3EiO6#P zFq1``N>=MY{f&osTbk{HOU46R;uqVH>pPpp-foXF5BcY*^oCSjrWY*AXUx5?LXc5VfcnMNWaK^nJofrFAg(!WI__H|m zlLpwUiQlz%wM?&H4V#v2Z|OgZVd|von?gi5&Ff8$`=v&MKZQ*ENz^=Uv*PDz!ImFNE`K}GdSBu)Li#h{QIqL40|TS-;z>=%|AS2y~W%8EM)8;53( zDq)6j8Woc=G8Com9>Jkpf(py&rCoWVvpxk8<@tk-nk(r8>-ZPqJMC=e0T52LKD%!Q z8}jZ!hiwx>nmyH*&kQKM`A++Qn zs@j?#0SDy5

      pgmQ)3@gaza_I~_LTyhRZ z<=oNV=uZjl!PhcbFEpk zff=b(1DmavJbtikvnz+VrhaXTGeJ2HRK?pTz$yCCZs5pKd1+#K?`){wl%~tLOt`HC z!i0-fZqYDe73Yj$xt5FyIN6+@kS-kQ9@wGyQgfMhRJuqN_`==PEhOILv4x>4PsazM z66O=RR~&+QzV#dv8$w*gJ&i1!3`dL%T3ha#4QlS433)c6FR*${a~DDrxa@)p?Q(pe zcFYiKC9`v2;65a_W9vnqJ`8_dgD6i_`FUF!lZ@U}9$XA{6axG>S5Kf&)2g|-j*g{c zs~5rSCwNmIfCH-H6caa#)x1DK0j*mtjEzSd^U0Q>ZsQVtFx_&KL*9>Kd3Z&@|@jECrQ4#ibZlbb z8pa;2NQcZ2IvWINls($ED_tNO{m3&s8nPucA27uB%iQOp9T8P3qZa&_dR%IwN@aW_ zSRQOihx9E!x(U@DQN1(=T^!GKcC+mx0q$5k<(;Kj9oJ}wWchi~H*sx{3g9r__ZWj7 zQ6G}Q`DaVb0w#hbUg|`o-rkV7)m%xI_pAb{U27g2@<)^1npMDki+crBB)P&bU1~NU za!Ji0mHbKeqtc7lV=-UoPl@Lyk`W7cZ6*6gc`s7e>;Z~&?56G0i zQl}CeeodK)5~+bHG^HH6i5OGS4>2Gw1luafR1WAOu0Jo2e_D09A9>55dC)sg2MwHU zbbGhiNhCi`bx%o*QUdIRe=;l0=-UWiHqeQ)``c=J$cjNQrRo94^`bd@neSKU-7P2!DlVXmq!W9e_9W;27oYjgL8T1Uf4hYj zs$c$0WluVw`YXN0*Tg=M&q=ZHpm=&jwbgVS#n6~~?XdmE8!3G;V(X&F{7Wx#uPEJ1$CD{VU!MxHBtOH!G3sXTp@Hr_?mtheW4Fg=kw*9;515u zOwxj5Hb`Mhx}1Lisa!TSxG*)?etGl@Y-!w%M)mitQd(aucOL98*Thohu1SNtYzOq> z1eN5HVGCzRLGwuThhPnFK3bVDMi*_q8xHS)q{Oe$0>Uj}bljxxcJOlVJUZ7@Ia!84 zT=!({FO!)V$Cb4JGv=1YiM&JAfev;q2PqEMrqLIFm`_}{$70xPW-?J$Dwj5rOIHQ# zA-zf2x-$QWX&#=muJS=^Z$_GuFkTqQ);=F*;nw@y+srm^3qQin5T7Gz;H4|4#|n$L8B7r# zl2h+`FC|Vi4P7HJb$ay(U-wD6Dh}}%6BZn=JQL&a3c)uO99WES#sf-^g^3Xsoof?+ zR=5vt@dl#)(62YfFNUl$--lW(7?g^|<5+I(Gq6exyKrG z_&GC%f>Kr;@&VkfpGbQu9)s+v__wphlgr>Zo-fKtFpwQYp~PNZv-H~eu%*~pVdY(u zx=1^dFDn1Y1`h||`%^acItCMDbN+=qJWnpfk~Nw256O=#-kts5Z(zdOyT8%#wNWvz zg%OdcV%QrX?v82OjE$Qa8aKj-J?f^XKCjTKkrjdq!Xt{y{`uR}d0-esIQ>|y@UMbH z^ZaMD?EfmtvyQu^wGE{J7cY=i`+qLNGcTtg_x}~(Sl!JEwqrWqJ-QvB)6h$Cylnzo4a{KFiTT~cUhh*N zAcU!JKN67N|6ZRtEj@vE4D@Ia-rx7#g)@bQ+zr5E3`^_o*_e=lV81biwe`OO%)hSQl=!75pjFhs>vlQyTjGe_NaXmt+%SVu%M@=#?>Z*HAzXh`mCG`J>dI9f`^a5k>x9~4< z%SZ^~zssmG)`!!JUTaPQpAuX6eDIJ(*EZ1AwZg~ZmSta83<>zKIBvg!*@4zhUHxU8 zQ3CM2__eT7H`7L9b`czOUJgjvaS!l`397mRc&gbR2B8BAwZ1;zuhs{6Yr7o$Y5Z3) zz?u#ppnS#6D5Mi7Y_ki~nL?mY)}NaMs)j3CS12@@Y{maxADsVY-T$&y_;1$z|6!fA z-|4>`TEVw@mtElDg#Hw_e&9>B8oUAwWvt77024ent33BvmYW6=TM8zRabKPH0Ymn~ zaw(9u7AX-*?nq>Iu{mW1s0r39KxKI9jr~9H0_-o6_-`%n@2LgSpIVF?RkS{6y@{5v z`AmqV`2BT+Dl#(?R~XG}q<56GQpZp6_t1w*AHDjTHie)flD9qGTfc7qCoy2U5X&96 zsNWJlpa>VVE)m5@YL^JmbK44j;RdX2@j4A80YcY-hP1@sJvs@bKwUC`6k>OgvzbT! zM`*gxon29MkpzK@Snq)d`KE5stf6^zzs0!adX0EVWkDp;%sMTQLTqYKG@F}P%R$KP zlE1`o@ef7wZvja`U%!ZBV41aE0y@^uTPIlBF1Y+QoGQkp_BOJxU0{06Z5K#68j`w1 zDFEV-Bg%l+%YYR4snYVtc0#j@hoF5AAZa8JV4nZ%F~A0yzaVVN5SqQSKclw}fHZZ5 zC4vj*I(>6a&@#A2(W>jVmndTYc3Rd;AMW6HTKWJ$ z2C@`aplx-Hy5^jFO)h#xvkUMF!@HxK?d|*le9R&9Lze%WfUONP7^bXg3_QVu{U0X_ z#&#Mn@Di?SI0*j~Z#IgT#6Sj;AbddKHrF>^OOF6z7Ei9>IDo#b2Sl#~@B^`VG; z7aV|WQbVoAf$HdAscxSJWcS~0x)gE^Spi1paF3TRe60nLg;7|l*RUDA4z3oFeK!DC5?~uQY9?3#G3;gWR z{OnXhPJQ8qfk5~4x&4(jvwNf9PpJ{`8bE~op#QwvbLto;UL;r$~DR*2CWFn6}qkN}1zG{g{SK9-7GjRpb& zLJo=fOF{(VBf^q@wM6lE-NDVu5kpk;UoAe!J9v6|Q}T1D+PKLr9d)ipKV4&J>ar1F%b80p<&-r5Na|-ajf<#T)k~vy}c-T`2Vr6A>--hF74)L%*oD4`S(vih#R=_ za{*UV4mBH)gXMpjs%hy7ltjtT$I11NqO@(i+aj{8eGCtJ~yX?>9(&Ffj}{4!B1ff&bRg;0rH$>&iVjl{&DI`o?IFey^Co^AD#*Rj&kJEz%149JKu{vN^E&DTAPu3K5OtR&< z+)+614cXAD4e7p>g!^tu1c`?9tv9y}P+*R2iixauhMu&q6v5YbD~AgoPKVDa%$qV= z2u_50u7~_eR8flF8=M+44XhL*V)TQyF~|6!wFw>Tw1ZcOU$tO@@Gm$c78^YhOUdp zWYYk1oqDqaJFW!;!`b=B*;(Il!xuRpi)>!W15L4kbgh>Yp=I}5CIM-oD?8yMr}H_( z@1Mhqh@?W-_f5B#54Veur5mFv>1MopT)szSEVIFg=VlhC_3;p{UjOsjz_OjWS|1Fz z`|!pg5{{Kh;%z?ycmN4&{^d!2sF+kN7rEh?H2;pM9x9gyo$YC62pv;q7OQtwg{G%g zL$K%9<>>l14?7xU^*CK`t0@a!7$j-nH{gxxg?h7GXWSgM4{17E*S|b;CmHl*%B?Y0 zG4GGwiLBk;Aq;x>UP-Yt&Dp|FB4r#K?zA@Y5SfJjL93R|gJD(6@5u&*uQ7}Do8E`K z_j>KQByl3x8&V^>sw;d!Ms(kB*M{^%auB5BC+W;TTfg>07xQyv8Fry!F%QbWto}s4 z5pv%vo`smXos42H(9XP3S-O1?^aBI-gP5M!IM}d}{__Qm2s(Zg!gkQPPN*|u%s}q;RK-$sU3nFmZ385foq-s^! zfecv>D>@Ta$FGH>Tjr}An63271YcTScJTeQx{OwKS)Y((wGK#$qF&d@LcANMla1oR z+3Iri!I29d#+X$zyIS z@P<*&qXjKl`e)-B!$VegVAJz@5_t1-JA&diIksTLc3VyRccFJNT+s-RuQhFk6i<&E z8ks!71oN$%9SWO|!WUu~dBaD^M>3aNAsbpnI(_92_Z}*PCHBJ~78*3q(wN%>$`%Ko#KTI@n%4H zCKXv=K{?k(h$62@dYH$8E)|BetA}QWlY)ANY`@v`+)dD?fYp#NRZ?xLwThFS;B^zr z7JbO?m)x;t#A9YH-+m*Q4_#&%)Fao7Ar)JMM^tIhq@q!4w#g#q$WnSe%XuAE!=l@x zgm8Oy-3A`ixp#aPLZha2Xn5^1=vMqtUYHQ7yh2Q4!k>;1QgYMQvp(mH=9TA%SqSqj z@VG9=W#`ReQV<@KJ~|Ub4x4q%&wptXyJ3`*FFf^p82kE^bI{Kx(F9B0Rb{E*Rep!$ z(Cew6y|@^AgrMYt&U~99q5l(vb8?>&=(k^_qth2%$%Zil@o*{>^JkN|LBTz!<;uINJvJ`TU z;+YF-N^)dt6JCi>Z@+f^NcfxhGP4%4Y|XTAxg;$J%=AusftujOm?l!_l0 zK;1L&45=?^>aYng1?&zw(__jidfm9OJ6@gw`%CnIOF% zeK>l4Z~_f2AJ=bW9|d*MY3%6f{vGVR?$7P{K9O4IhObq=h|d8J3*pGSYR})O$MK>< zR&h&d&>@{;)%BQGCNxb$^rNy{3(9FmY*^fcVyL>Wla{c$Ei09Urnd!Mj7gNlo8BzG za#(p*xmZ9nNIcpD$$cB4PIM73ELUl!mS@gfHKnZ>((a{8xt8x7%Qfu(? z<;DXOM*{ti+Y`#7ss;&-A)b8K{k~axgwW4=?N0_#2Kt>Cif?KY!hiR43*GWMHw8rCx<38Y^iX;^t|2Rua58JDJ8M(A9Bc> zjvVNb!u$gej@~WCTzspZ=27h3{}LHg+KhfhlZ#`(Iaa$jYs7&uPJF1{+A0OnZ=EtD zd81)$2*x-rA4}6#E_2J-(YLyn7n=3bsjb<&4gBnCe)H&yT_ zn?(tIjKRmHapzGZYMI5VNqOFAm_2$2B?p)0Tg5jhl@}~5T$#UL*PRi#nOXT)u9en| zw6?oz{+X9RgG+6wLWJf@QmAs*IOnK5_lGz(|7lA$aVQddwK%w}HDi;BGz6OCR{R@% z2NT%03A-*J;L7(?GxU&S7{7f0-){))XLv6@$qfGQD#dNCtJNw6c-vNPyg<=a>$kQE zqJ@iHr^7XombHPN?rc7s#a@CXG;dJ`QuK9m#GXB-iv*I11#QE)_?r6Wt9l7I3o382 z)y63W5o1JWmSx`32?8dEs8!NFa%;XZ0+vK`uZsjSJ790J(b6>&@r(=tZ`PFNXukP| zY|}U{?DP7O+h}BOvf1xJ`FXF4dS0tR0_aAo$MgjtzDLb1;6VZ_RNj5<=--ffTwrKH zCh+>bKrXRCkrGMXnVHhH{B!Cs_o-Ol^}f}Bb94OS0g7hI-~sLgoN5ITM@u(jI2^a$ z0_Axc8s}AZ2zai>I(7YLIId_C2dK)hwaN>}=v6Vd;i5oSo18H#)$e0PyzNBHeL$5> zX$YZSI5jHkE`9DPhS4-QUyh7um=D6}rzquRf0nxRYP4JR?R_L>9cCzwA;LLjEU0!m zNG*4mr6(>}G1q7NuC8W0#JsE3qDjT;rc?UYxPo;#R;N5=(IUe>s)WSZqh2*+GBk3C z#D%|J+mvRY0vRRS0QzO>wJ~0w+=Z*(D?yE3f-!yG6T{5hLAIbYI0$5fv+$j@Un#jJ zb}zO;MGK2Kb8HAUc#fi|s)Li7QL^TVX09S2Hw)2E_MPrK8p_bjVO3 ztFckdmMAVki@zbaTCDb{~>v$`G&J zTguMfu50tM-ddKj&dWv?PM;+nHXatrM!wV>qH8<>)D<>kawSdWp_SSQ4CFp8 zcMnesEedaEuMQ*oR$p!HTdxKT?mr0;Iu?HI7rgHNDih!bsISb}Yr4Ia7&k4#zq3_^ z_EaybJsdvPS&J@}Yez{-s>!UD*~>n7_IN$5s4cWw;Gq|W8MeS9bA+LzKoJULwqKo*1x+?nV0vGXOK@BE4m3~sfXh7ev9M+~Jobxc^N%xg z7qiNTB>1$Zs^yy~ohKv%-e62NAH_a@Ee@-l<2-{G4H*3o8kpVh@n6OL1ds`J7y|2b|@?o5g5`bMH->`EnWKq|_wJG&ESPzRP z-Vuz-dCp-c!h@+%+fw1(UT2!2nV~v}*tUc^DDf|BD>ZsbV^_tDe^Bm$d5`1fb(zK2 zGjexywROiKbo*644PsX_1gMKbz2_>9f_Fz?je7Mz3~U7VtCrtj^n0yb3_Y4^IQmhE z_+h><1U$PFYT~VFcRzMrzHUvPZGWyhGT&in3`jZs z-IORlTYpW_OP?(tfXp*e3-`ZXd5-KsFn9$#_nCa|`wqTX7wHadhwLy8U$a})$b@Xn zd7bP!?8^kc#2zHlu4^|B^Y!Re*ZxUpd(XNei++P@9rSpHh@1rdB@N)1w>wa%=@85n5{6CF7)e(mYrd=o9H-L`9$VU~{!zIM6~_ujqH z)Addx+}WkiZ%gc4?yS~rVPhupIPM-0i_Il%z1@Y2CLro7+sp%gE!dzDsCeoaEDgW^ zAV_;(wh$#4YcU!Jpa0YD+Ar}n)Dp}yGUytZEll8G0wPhky1lu(@PoEzvmj4KxN#N{ zBK($uc~xP1*S!@32^6tZA_8Xqup35fD*kx#E77yynoww5I0sy_OsMJ7%14nFjc-lxwbFF8E}DBjLyJGGrOH)raxrRRbaNSrX$9m zd&T@MVi@{#*sYUcPb**y^iB@~4G1w&N?oiU{Z5ISOE?`FH{;{tBMq z*3@K7LS&&_1OWr36yIA;7St4Q#6;PD-@RIe20;J^V}X}dg9>`fuU~i2|1k{2qlO#+ zn5;=}ve_X0n??VrZk~>AT8%yC1Gxi}Hw_a2su5_*g|=I8fMrZ4vK9x5oY)3y9$o1q zXACBVngAtPd=lS_NdK%$CLCHh5kHzCnYsMp9X&4j(*;Xt-d%D>)|OlRN@rn!&#Jr! z2B60<6ZnoZIrq6hP#lf52&r8K=2vVoH{aBO%*Y;;;OIs2Bb^>i5<5C1vGGHt&wGsN zIU~-(1B+ov#rG<&v$x+A z*3E*2^N7r0;rjB!ZGz_82{*FFvIX(dMA3J?AkW-SKlb_^X9fb$L_s#?*?@eUvrnN!$}J=ysoius@8owFH-y8X*YR`fg71Ggzf$++^t` z^;lgTr>glLnTG}OMk)X2E9JZiBgm3Ap&O=;gY}WyZoJlgyU9V~;6)hM;ziBX2&Ru7 zKGc)!2p@}W=w_RsetOwfrp^XYiax&|Y30}?CrXK$_l3{eUzRG}dtP0oh2UMq1s4N- zH*4coXY?E)pj30uj5C%F%_(xXX*&Ai%m%?=_ibx!Yi!2sWP z1X;#EgemCVGDEy_t7+{}2p@Iv<*U(1u46S$A|KisT7$Klh;$Q#xb=@egJ=)3nWHe+ z^@)dF0zcTQ^jLj53t|yx!nnKNZYx!|NHZ$E+Y-KInfon;=fc8<|?{w&i1+rST$v-fX-YBTbU9XEcPdn^K#5{ zUu>h@2Q3iov3=dK@b1=vRk~)bj4xjPlzwC zY=c$il7C7{$hL*$Lg`XxIupN^;vHva+@99x=$w8QoIi%lT)V@$V>|ec%0!o17KD;v zaQByDc(n^m6G;xeLIud%KD$Rk344lyffv!BF|{N2X3XUn8KZ_w4zkBMOuslm6~P+T z8JifAvrw}#6-6iwM)RAp-d()?5r}uXKxj3XBZm>uHRh!_Ln+hgrL`u9GK1+e@sD&$ zw#~K-kCE}2Yk-a;unVWJMn*jil0)66&ZL`roWhvSuxoBKi{-i7#DGwA*J1yu6XEFN z{yHZOUy?_|!t_B&K;nrN%$eJ4h7G#kXdGvy^e38)Is)R{jf||xIG#Z zFPWZ4q1}g3>@YEiTBFwocvl(-tw`@Ap&xyZ;UqO#wMF_9#^5rrzlbmg-%260Iz6z}&KlBx948|xKO$Mh@Gl6OX+$MnX#=g|> zr7qHo9Jf%zZ``MidHh3@NW<@|PZ#_&77^pDc+vvTsnRMV&qM3UOx-!Fnz{z2f7GnCvS{Z@8IMuc2i>X*S^s*@ zqXkiYA0X9CqzCX~Dq=>|9641AFhxa*sS0MJcTA;H1fhvVUZZ|X>HcDH^wL;SmC%Z) zmW)CfqmDv)D=9bVICI^!Y0+}0p>$!@IB2Fy#4B}W!s_x@S6NLzo=By#31pk4$q6MW z0HugFDmIME(FD>Hokt*CC{QGGv7AB}w>n*Nfoibwv`WFQVz6)aQ=blemFB4GMecqBZ&xd zFS+UWduyGr%5Y`HB4Mcb(!81FB3yP9P{>yrXe6ZJNJ9f!enR6#r8!4N5#M{7Y+RB= zDS|wTK~n2}d9s7Zh*ivtxw2N4)1sNV0t2O9Fx~O1kP$lvR>gRY*=QVPYuxjxC_(YH z54TV@;zlNgN~HJj{w+ay8MTK@u9SEl?MPQRlgOr5E17~zA@lp!vSOx7p$PE>wi+jr zePCD0L=uw9q)nj!t5eJjv1x@Cb{_6rLd|hPqk^jnlt4u~hrf!Q*W9 zAESirYaXDRDcMBr&y;9sU>!bnrwL-pkk>+|oMre@b7jO47*@a-)*noP%T(9O*O86O z$dA{$YSIcYTi2XtMwCQbfA~$7^8+&vx`|WibpvCGdP*Rv#dZo&>S16bjb9*Fh8qDN z@`0;Py@2ySfHmq?@!eLOS==0e4ymMk!Q^Oz3=na)NR?Gag{l-g_UpHsEx6EAPbGGL z*FSxpgH@=7)Xl;K2?M$}VF}fPT^l}))XW@dVH1DDd7t2!C1E&g+ZI-h8cSiI5o>Y% zMr5|TOCk)Y8nocTxDPd1wK~SiO4c7ybBMso8gD-`q8xGriX~=;>mB};8q5C^PNv?l z7A=^?!BBR*a}3zT9o8g2>`>DcO@mgt22fOnG-V76 z+^dKnQHKQ8=S5iUr|;Hhyn6?;_qRAQMD>}IA-@ukYK*N`9&Dn97NXWAGi|iAi0C&0 z;L{AGPgPgaw*t3#bRyr2V}fi20j8}j#PM9hy~5K>x{Wf;ZV7NJ`d(Fv!Lwk;=qjUg zovv6~hKUxmUsaY+zt1u-<4c0&8sG+cOIKF`|R0 zq9%XQsB*Ox@b<0dQHI;)xYe|1bBd9`6dq>Tb6vgI0P;7g;B_8}!urpPuV?8BNv|?3 z+==03ZM2CIg+AX~V7$yoQbcz|MSIR_Pm@=w06OoifaBTJWEvRg@Cit5sV*R~Ur|_S zj{(Vgl$gF7hy+I25Q#jrBsvIg>$x1qIh_5%S2Yk1K~9--ymVO_V0#w%0F(W_UFDTM zqROX3~=RTUhUqEjmZhB=^+M0f+;@C^5@TUJO1#g{Oidt z<+Q6}Q;o`>F+qz{&mJ{e+=f=DuT0TIFJL~;m@Qo+LiHdWIV~bZ4N~HD0xJE@%75Oi z`14H8bAJI(!o>IIU4zb{)9Tu<`kj|h`{Nv)P4ONTm!^aAp}F+DHvv+BQ6BMvR7H$1 zjOU{6g!dvrfkLym0;ENNVVYimPOgue_=khfdVd*CeBZ`-mRT*-7}mt}hlPy-VHIe` zIEm&=baX?mxb#7%+iP9UJ*wk_vPZ-*GNjdDZ#VGuL@(WfJ4k1nog(qE++ZF|XGnf8 zHX0K}p;Gw#_C$Q@$8U=FTcUh3Q`p?7l1Xk9^C}ke5L1cdgZdr1c#I4K=~P%OKQ1`U zVU4Wd2-nPFa?7?Ry$P_xk1KvX^2Mcc{Rup+03nc7=uFRDwn^lr^FBUXz#)|;mCIEZ z=iGm-1t6hIA$-#foO}R955ao$lO3P$)=xdL^deATT=BAOru>Z%S zb|Wa@yV$jUScc2E(=gm#cjcg8Z-Nb**luvpnQu7zt@>?UwI`+aa4Pjyqaj7%f``uN zF6ok|8ZW0si#nPe*6VE8M9zMLO|wCd@?+4DZ@AM*qlE!_*))}^LY8b9X4vlvK=E{$ zSxK*Fz~9jwt2uN>$8>${Q5Y>;N9b8$wcpw64lc5%>no9Z^1SSrOWQ-VS{ zVS-91@>t{YZSH*$N{bBH_<1!9uV^dkOl>$@GDd8|3ZDSIR3@y~Qq_-wWyvX& zYA2VnfRSy-Sp0OQj`F z?x{iK=u}cDCn5@Tb@u7>)3dAd(=Qs^asHXz$(-XbZE3HR=GD!77!B9)$ zNi`*jSWhd*rVh5APZ={1Hxc3XF7skbwSkYZI@+0m9^m|*OOIK~Ish@sWtk9Ha&P(s z@whB5lC5Gr!*3RZJkVC__aDQN8-s9=6foylU0#yum}Z~t^K-`$IbF^ivsZw)wL2jP z?IQa)OBL%@(|i9_SRdl}eOK(+dd`6kssXMgSkD-;+D(c&Jmq15}a11L(YpybC14-yACHyTyxQ0 zD3jrqACH=YljDX9kY&-p7FQth*EAvS!7bKtHYDyA1X64HGrIvmXFLL*;OrfKUCx>PubQKi|fjCP!I6*Jo=>86Lghurbmf?d|i0NZVSLBB+mFx{UGXPdeb3ku;*-n5ytTS~E zimzyyqsyQSV}|H2*Yt1r11yLX2N|CPCiu)h0faN&E=UA7f-*`aoWF&540hI@^G5`! zd>8rP9$m=Ml2C}`G71$Y5GYr8IvVW^-%YYW-$kTlCk?ATL3mLos9@{Q2-X?ZXzQnE zGEA0E+Ht%~h{*Q>;U!v$6c2+VWbh%VvGM-OF2f5NoZ(E~b{G|^;RZHEF7B-#1s^9F z-GRq|=d!eW)C6<(zz`cRT$YZa#X+yFD<9t1Isi9A?wp~HQWqnMBEp*>VW5iA7Qkz; zoVB|!mLZL*#K{%YN5)tZ*`Q7AwoL)WPy^g=v7cU#1c8rDaSA`Pd_lp#KY{|=0< zR4`()W?S7bPUFdLC~s5q%dr3Og(CMW9NW@arw04uDij#zbn0^Bv^$PJ9Vmxq)nqQ8etk^5P{-0O6CuOd$P zQ|HK@MbZWLCy#oILjAduRP9l%9qjr$SOls|gOLCNB)dTtzkpy8qw`C_diS}E;D=_8 z2qo#8l>NzAi8NGmWZz5A>!lEHO@G`Qxl7Ln(=(RzhC_`!%f6X@Y+tGx;lebkC(8KX zc%y9+51^;Se}nTgeNs7d>eb{{nnViMPmZvK<2X?y!o!N0(yHl+P{q?c#)bSth4mk~5Y}&{*mp_Xe^ieB z6Wj5>D98S3^nY+6|6X19zdZ&xqShOM#1OHr-|Ng)ked45mmx z;t~qKHI|Fh*T~g&oK5q)QO9QW_3G~jhgywm2X?^bl>0#U+tvLW3%gFP9+dk_1ayrY zc#rzxjgHO0YT3k8m2wqzo09BlqK)P+jnvI*iZuaOS4PEMGzw{}sxlcA82aBG`#yb09#;&90X!r$XG4qN7 zEw0TXIhGxiNgng8pLirv`ZD1FoUAO|g83KBAlT=1edZ@a&9_kUIY#(jQ(@@a)7!de zuoFi=LKk%#xH`v%`9csaZUP5@Aigp+x^|WT9G@!CdHQJZ(a%fpp~%NWg|4LfzuNo| z5}Tj9K2Fc^FFF%qb}FBaBKD38)!T09PN*XDY|$9bIRm6eD|=^YVF!*f^#@VkV5B&A zsSXPbdVlOCdDLk_kx_@n4zfG1yo|cVA%Q3oP0Jt z#ew8J6C3I5&I?|n128ew&~WxDSe+iZmPSW3@yH9JShH0K4Vd{f5PK-J6-N<%ca>l1 zbF5e4NYnH_A1+go^nlhGnkUbA_0334pC$wOouDVeTB6tP=zOP_X!aW6<;~jQCBTiN zm{t#r)hzl6y39n>97Gkv+^;UXE166Qu^7)YdG(pd%&c}{Z)m<)o?gPWCO!-Z;9GRZ z=^Jq+2V^HH2zt+1&1zmLA=p$5Y47b0teDvkW?#8taf{=nJjGpNPD! zCPf7$A^U^b>(b2{hELg*&E{QX(%!z}%FxcT+0Y(D9nclPZvw z5Goz%Zl>3B@W=emsr6Vm>&)qfH1-$CbL}kcXf-dQ=q7r3i-6+4X~duVzrv_-SKVw% zSo*Jl4t3!AI!rNHIZCFVi;WtXax%w5%}5Hycj7VJ@|4^TGbd%mE0iQGV<}S>#R~qO z%mM3>o2LTay`Q`#;CD)I9Q%r(ox`!rL@Zo+t`eiQp_uH|Od!=K&2RyP_ZJUeMkkwQ=07q}w@a=o9aF|{rB>{Y zxmnMfX|PutOR*UOAlVg-w#u>eQGEt7oVj=<)vs4QZqmR1$R(Ro5$cj2mwD)6zZ~bPc#mqiH+A>Zf3owh| zaLu71WqVF)97SPKL6vlbqz080R~mcY#_xE?rFS=vpphoAgIYblr&0<}dS?3E=Fm*F zY2fgvt3Fe?&e?%h>*|sZJ&0a!lKGqY6hw*K4#Y*=nmT-RbbXD*8eI*##6Gt2w@s6M zgEs!nNHvYvpYJK5V_eE#!*Y*TdAl}6Y;s&BFYd|Lxds*$1?H_!!YSZQfKV}s{(oDAg= zayFa->g`!|xa(e7nnOYjb|sTLYRNiWO_?(lz&xM^+M`YEINcv1Hf6(EqYhkK1teSd z0${v?P)LnZN_xiCt`#*bVd|SS}ZsPq|PF#=CIx z)l08KHXb+B-~QV3L{w+%ciGq9eE;PvmU9C?#$oelua8x>Zv__oNl4VNNv8UOnJLh_ z&{5dqA@}U}JWY`NRCN%9@*R!xB5t=|xG<{wY zJAuUb}m1>s{>m#^8&WcvPwoG#A{SC%7!8^JKwCCR*w zm75!qYjU&JtlC>Xt{M-DYk3whKEh~Fjl7Tq*I&a~x4t01bIWPyJTb0mHj(Lsex_`m z5H51A%|&hN%*bo0itLv)d;csOYDtWhaIz>FCRVW| zH4_!w=1^EW4rcD`(kF{l^|dK!J%)8_omH4Iel=V|qaQ4HTU1HrqI+L*^PTnr#G~`G zDf8LqvzZ2H6y%DaH>v-p;bdJc$wMA%|bUVy5=mQ*)1ov^3TT`y?17%Si0{i8aO?P zOE6r&PH(|fov1Mi5*eXA$!fB>%#l+$LAmM}Yu@1`$>=-^r?FknqJ|jw_z}&Fmy?V1 zl|On9i=AJ9H#9Mfx*fCKT|tor`7s-MEh`49bKkU*!VpuqIKJg%!G-<=sD1WX|i8bidda$CE$r4h%Ld zhhDG-K*Nr@@4s5pfa|BrE!BjB3=!<)a6m6ddY-D+{ja!~~B?&^*ue(zuPf;u66lui%6z1c0W9f=kj$KR$MZksjoli-2!7`mH{H zys=%@;5KB&xXZfch$K**x`O^B#gwao_Z|(P4%xR5h;BR4P-Zm@qz}l;TNY3NO;dYg zlIxO}S(tn>`7_7)48vM~H zbEA}=bR@(?Z9Ayjyt~~?k^H_t9@>L6l^-BbLW9%J~#d>UoIE^7zFI5>uy-uN&XrIM8qGA&KYs9 z!mdfz?-!aGR7Tq#2s3M4Su6(>($d zPl1TFRt=m)a$E!s;RN~WFX58eT50A^N?kQcX~8MNdn3{jb4ZwSgaJCLrSjSr8{ zcz@S(HVeto9qoO#CGAb~PWLg7uev#pX+6jSe27j=>Z-c$_inD2b_Nmm_F_9+80fonxn^w88}Esf;K`!Btfi%m z?60AvM9%zbfSr{|p4HB&mY0Kar8a#ELX148iU%8tRU#sMH(ijZ?))H2AK|n=m-G)a ze|FF~LzJ9&TC2($EXSP={V{Di0T)>h-9syn{Sd^LdWb9Fb3&?fNGEVqEZ0Q+hX!A( zU2GBx?j=dRu)oLC`=u#yM{rqCuY(QJP5kj#@h_KgSIqK1!XuJCFl@CgX+V_RZkxJ#f0#RnyHufZs z{={!2io8A|)6J?Y9wD9WEDFISAM0E`s?j%Sz@!#oeR8Cs6B*!HAPm4FC(yn>WFG=a zyJ6;>u?!aBIqRSNA#l-z%~6yawK5P&!1WHOtNwZBXkg>(ZVb$%JjmaVxdeYwP<^5x z{gD=q^n2)&TKO@_aDCdDI4I8QC7-Mq*I@dNz3t12mD9PC&6DjcL$FYTYE~U^p5MJp zy!`F1XM~HkI~8FvWo?rDB&!Txi9J+)8(hdTYF1rUgKhE|RlrNgo64pllrCG$pkL_X zRE|jqXN|j_P2j^&DYy*Wu2N-$)gX!gd1>=%Q2NDsYLd=6<3{qHgP29OI1j&0U9NEEZ{$0JvFI##U;YiXTx;-37RYEj|*vAwtd@4J&ApW+!U?ouK3zb*|bC z5IfY2-X(eITgs2}0E1K=5!!;w%mg;Q;a-VII76FxuJ^mTvrEPX3?PDVwv}DXyj^I3 zq}2+``^!Z5txw%#e}D-cOBoARnf@MtiGZU2^|un4V6?9ytbVKasNO|za7~8?+0TRiup+&Elzp^R$6nom2Iqt zVdH@1Vc*Pv*73%&;!d=AfD{}+H6+UIvwNuLT#pUby2h;!IXja$HnL+~N(m_>S?44L zkOy_>8x>q8Sr@1vf<*9Z8!d?Iixk)A2ahWtBf9MmIA)s%=Yj2IG=4uk1>}_=q2mW^ z!DUAog7!*EmxM`3>5BfkXC484CjzEMzq4KWwJz!n_cBzSeOygX#`y)(A5u_dxPz6-$d|0&YzjF? zzWpos@{!_6>&h-oD=0^NT8~w5B(-I>mXDYys#!hNj?SW;y-=~v$rLqOK&5}{XN6bh z->jzkv`Y26I?3I&TK#it5>qr=N7!j$`*O1qlAWfM5)z~yn8}}Kqx2|gj}MD(zkFPh znzuIDD0ST7D=)fPn+>#+^@0QG^gu@;Ah#&5+LE#hD?E@_)&$j#Ewr5_MZ|6wc-#fJ-4n`m3 zQ@z$4syep}b!~hQ;l)2|B$G?cATP5(+w{j<&F!3H3B~*B2|KWEb2eP2Q)W_Vxh~_W zBAjZtX1^vcidWSUH}w<;J(PY2@6COI4yE~_;yUw1?nep3Jqq5!MRv}$C+W2l|n9dYaa*+H$s~ zGpt%Q-57==8f;RQFo`|N*^b~m%#zIedp+Pm0CSuV_vc@H($~7Yxc01&-aA zQxo)uH7$GTs~5!>;Zb9#;aS94PIW_>Ec#DjOsqBT^qS8d?{TILW>D8%o&=(mJkXV} zqCV~vR<+3~Y^y8nswH#)skWElY!xgH&=9Nea5XLX$wPqT%OoTA5pinrhlj%8+tNmv zbY=Y#Rqi7-KB{zVSTj@k3Pmf1-5JV~p9qLg11dbV2Y!Ge5QKfTLO36Q-PMmf|7MCr zuZ}R)5Q+p%&E{-Va#`8m&c=!8Mwx66WB`lCjdJ`_TM4!AihkV{Kw14_cwB(gz^Nh{!{%#C+PC;>VX;rQMn~iH!%#@37<079Ww++e*fpyi3+!o7F-Z zVGad3fmcGT>AF-5gRKnfxmv8gM|PI z`<)bCVh&YZ>);88a{-pHfuum9etjkt)ef1$$8uw$k#TN~5u6oC>h9NRH9 zNs41w$wl0TeV&g39vJj+os3KTIc{OKYr<_iuO_Nk+4o>!*KfBN+|LNGGdqs4gV#gb z6dU4fE(nZd21o6mZrpJT@WM%mw0BH1|J+Ji$^&rF1cJaXv+kJDL|cQcR43rX(P7PX z^67kR+G@NhKmc`Mv_`&8WZi5>i5u!j(zDVB&&Lpydpi5kqze@D=^pSDWm`ECmVnC6@9Mkzl*!|kUUdrTibD});fLtlt;aDLUr=vISQqVrP2JA# zd``X6#FlOp?&KcsHj3kA^tPsLW&2vQlQ;?ckjar4c<)+4&Id=0Ho@6Ww-S(o71Yrm zO;!?GzZpf4wtQr;hqVjM`t#P2A?$k#mof(f5fL^I4Tp$iD+fAi?OW{4#-Od7Gi3of zvNow^jcL^7q4#timaM~tWon)Tp;QGB+tkp_z_j2M#Xky$p>$n0LKc5Dp(tUJDnqy2 zv30v2Kk)d3jWGKq#EZhx4RjcgWuSgEov?`S64q?yXN`WOnXG$q$G$aCM;l#RO|;IL zeZT7HR5rv)-kb_&UVJGoSzhldC{gsNRP~rP@w6L(@>94P=px0J zVINTduZpx|6L<4<5kvD+OWufNCJu|JV$}-=qd-rC&LPTip07rNHf09{2D)^4(X18Z z+q}qQQ9d&;LLsP;iG{aqnxiQir<8SGNXe1oDxKKt>TShS|20AQ{oYHfmU|$uJ3;Nk zF_2R817&K3=7A8tS==-X53w1dpo$*XP`%Lb!T69lB$cXe$TYGl6zi#+ugk?>Zqa16 z1kYimzGmOy&J>>_C~ATg8qZ-_b>FEqN$JbEUa}~I)M_z!N0`ONU^x{m7(tgsNMxgK zq{}cH#um9K!VWJnPwv-;;jAO9C57zdbFi*`-08HzOD8sIhZK~rEISuz^OR{C(9{gL zp~>(biJlOv-Y&0Z5KamdDjB6+*H^skc_k@+EG-m!OQ|b4=d5O*%e61JTAZ`;mDo?| z_S2qV*TBbCe~nVu^v6P3%u<+hSnpDHr_{j9au~IgdGt@&((|h>HnY=wSj@X(5=cIe z&SqjBne`tH>F_)vNrrunx*$i{=58DAyqQ-94oD>BhvyA&>z^evmP|bTVZv&|>iZHmM zn6ykl2(R2fGTBv=8Yh}xobW~L2ukmD#f_u9cRmQj6JTR_v!Lyf$QBxNkb8Fh;t@++ z)J~l!M#&Up(^ZPyTM0#MtSkq6zfHvpB%BdAw2{%s`5lq&El|RYq`dI#dy~me`I5;a zCilQ@V^vcOMyBW8q=Yg2!uxxEK+gr0i~Pk`xiYZdhnP7bk(OT_2H)(EeaIl#WIf$Y z(zVF~c=&Pag3zVMIC8u+$u&HWwagXv_$Y8JsI{-wswwbwkqVC~k50_1pZ!WgxcSX3 zNF3oAx};i>*B8mrtuBy4r8lMYN{B@@fBy-dGBgu)Qlz7ZPV71GWA+&9A_SddHN)AQ z9(O)IJ7?P5*rjjkgqdA}-CQ&^m&>k{LTaip9T$SaIIFp+VR@3sz7vCptXVn$Z9o5a zC_UKdBW)d#V8#$bP#*ky7g8o`e(*Ymbh&?% z(pVc{P&wDXWj@&7Uqd1X#6x45?~Z?sdkhS|yzfGN+CADfu77Ti)nYOjTz!(|73Y6znbFW?QR%o26S2fIkZ-aO z5%Zq>KO98pKf5e4&1z%!brobhD-ZwES zS(UI^&|PCV3a1*r{c9tdu65NNL@^Koms*unhzEf8wZsh=zJ7WLDp zDsLcZ>2_sFKq1~Z50L}@P=vdTx`0mChQ=fIx)8;Apn}y2+H+vNgkgF}IU%$cajK#L z-IiX%R+1y|d^o8Dkm0P%UW1KH!|h-cUt=}Ya&m-&+^1ZT1nGvSTCf0w-X*Y-qT1>);E5lFlOwPn?=WB z*pie9_GwvRg6*>Px@PHCcTKMO^L^tsTjit{-l#5bG^qUxWcw#li{cgN?p2A?*N4N# zbKfs=4+O1u5QaZjwwkQrT{_epuUj8Sy9mddTMQ+>Ya0P4nMYjji{7Q)q0dI{WLtsm`uONDH2fm`@l<{D| zMv2=@e|#CVvuFB`<_F{P+y7ELpf_61zaXOO1a&g_LaNVq+kgNCS zW=l!6d`^VJTqzs#8+mYbkS=sK(ANd|aL;YGcie)*h&HrrLt?a_=_OU1_z3x7KHHd49Rb6ZAUJ9S>1M4v;>r?Uhb`)tH2`5dV%Dx3 zWS~!u3uF(LLvIUILb?GG#nON)_*C=#7?hp)!xqTwjqHKO>ZN&2C%g}rDBjJM@zF0q zrtsXxc7|q?^i>~}?Ah?No53P-A#BgGHNgsdqj;WeB8xhtyD3;y&C@*YFg2HlH^v`a z+@%A)=7OTm;+;e062`*ckXGQ$D}|*(qY6Fq)~k;fIK|Q8fCP9dJpfCYf(SRZqw|_t z-;n5L%(~0xZM`z4CFE4oNCs@appxXYJ=vB2M6~!0+ef?eG)`|f*`gzRjlJpgkfH@-=siYfm9f&X2SccDPLw@WsZuWmH_Mu$+W7;hYo5lYf8oyC+E( zyPs{ESPdU}Lz)Ge7rc$7t5fcq|cez|q{bUs~h6O4w-^Ga8 z4U4~4e-Wm&96xoxjIIf9AQC#ZI`&ToXahq%2B%QPFroiYfITveAbDtJ;e})%QH3Q97>{<2?$EIC{jBV_z~;PM=lex2D?ECC|=_;ryhE@m(}xy}E!)pf8A4 zQ}1V7ZVWNnBE$OrGDDB}1mW58e|JaQO6mP03f#n6!^ zTYNClmHAi=qTUxM5aLoGV2gZeta56>04E)Ki@YzOtdPBgp&191sDtD&i5(&+n!SK1 zFi0#n5Ev zhz)4f0tZUJ{c2FoNAgXo{Nurw7}txJ^Hx;qKecNtKYZU(tMbkVUzyIZ&Iw(asA!f6 zt+g9J-EBXxT+$z4aZzOUBc6^^7CU>IAuOAW;K#QdP_E;mj}5O0Lju90BA#ZTDn0z^ zbgn-ft1GnqIhy?lnVmj2=EKV$6j`B2zt6=S5OkM->AY3WA83G*pG^t`pYLxyKeSLty~ry-8*z$)#f z8bY_|j)Lj5lpxa>C)gycx}d#%M(nriA;rLY*v4>9?GPm0p(F6#K2Yx}-Jr$Mn+uO@ z?4_f3jm}6isOr&RqwiA{@x)GJk^-T5w+$)~EBm$QL-RXK1TTYm_YWUh%Be<`MOUX= zOxv;{CHbYubYd{?Ho<1>yf(8Mi_z*IlGNL&hW&^>uje-i2~aTDC7BMDcG~jZOFwEk zRI(ZU+Z#v5LjBNCj;DaL8Q3$6Rx_WtA!i`oJ!^7cGD&6cE!@-$_M`o>ppH3v18tiB zjJ2hUGw-L&6@z!j%#-6rlBv@rgKvj#VqUSX>w^v<4Bh+!+5J7!ugzC(oo?c!$!f&O zw6e7Bs`l{`hRkB0(*f2<)pO;_mwZxs-vrtKbwI~h2?L+gM`%H3P!h9JbSD3 zOYgOnB~1v^CXZuMDPo~{HQ{7Ia~DOKOeTKM1fd-yNFmmhdahWbw<>WQy{?_4&(BFL zax$LRY?*FwaT__+qP}nwrz8jt5&({*8e>xC)xMD*?TAV zoSXZhXCggg%%1ej(Vo_y_G_Y{I)KFb0ZeS&KqsKdwSLQ1JP2vlFHi_Y7{GvrvOpj< z(?`PG{MsUT;_3H&V%cHfLchWScT-NYEcynp^6Pd=I1u8TP{GO?K!D4UFkaFE^$4Oa zkK;r`KZ|_!FP*hx?H@w^Puk59$i@FX0C`PS?jVAZ^AQ@*MEj+#PUYpfa{Cws?pqeNBxSw z5qtI0%7MQ8*u=K{j9azg8kg!*E!XftP;c-W9!-g549)%~1jaRvUoRcrjv zPboMJ<(AB;6+U>yaEdyGZ^*;aj97Yn@SrNuokZ2{wcSm)q)u<+6~#S#3#^$j)vWuJ zUre~7W^M6~;vD%4ZhjulM_+XE-b~702rDJe;!})#80&SacNmKVYMajS9hDdHu-fpn zQma)Cez}^iyjlNXD1P%%aT&uX#ivgFXMv-#>kYCimxh<*YmDj(!wcW|sV8@GsHo*8 z&|{O2DVaetX^Qmi%cgT%YfwWsZg{5{ox@L;x9HT@&+8Ki!3n%``gnts;g*mGhN*mJ zUT@4&5*R~H+B|M-u$_t{tc3CqfEn^{ri2bVC9IdUT;QltEJv7;1em`P4v7cVx(A+e zA}lwAHLhFSWJ)o|tpE=kUb6LQ_9{$=`n#5c>%mDAs&+o*d{X^Lf0Co5I}kYj!r(rm zAS-aN7s*nQn|PA4D#)w6c7on$8%a0rDH19r9+>C7o11jSSg5$VkVXi6d7fks9>T-9 zpmdg`?^>E>8+FT)%Z3k*341Vxb0jWW$oD@i6e6d_kAEke{vA2;f3O?>AO7F}9}1`c z$wK+@0yF>g0r{^*6zhK`qW*zX{+AXE)}Pz_2NCsS!Pw;Z$AWRIu#sSPFe0_Qq`WR` zV%b90TCeyXmjOPk(3LZ^uwie)=G(i?ALs`FRAkhAVRUZ0ign=iq2wOiY_uGxeE1mdigmv zmhY>RcE)G@2EP@4cwO_`qqDtz+ZxaIx%1#OmtIE;t+8>kvZC!vRk>Im_M^HI?W;u) zb-49%J8HSh%&6S0KbS^DyR4x+GW6=t1D{@XKYr7cJEYy)@w)fM-`!ywm->%8dCU~Rc+u=_&}5E zvLmXF;Xa{t>2rkHDC~hp_k^d#KxzG8l@(QcS8pAC;3`$$bOT;xH9^FoJbY8Ty0og! zjC{Hb3K0fyz3QRxe}_rCDE0$^z9Jj!p=)(}S8GYS-mK^Q(R&Ynuqczmk_YIv)wS#{ z#@#Q5pS7kC^|7I?D&yK5v&n+eT7j5a^NFc~JNJq$K2Yw%8Nm`W>w>6`0(=#xF{*XS zRmyQ5z}nHXKSsu+nlGQ4c`)q8`B32`l{S0z^f1cyo{CN4rcw;j4-&Q@Zj`IgMH@>t^ zq1LXgXLuWn){Z@UXU7WIUd6}LGao(0vo+D)cd%c?((l{2Q%|u?ukddp9W5yh$K5Ga3`>ianCQ?>q7vULx(Ufa`tl+Nd z_jhG7Dw%pfudl3KA>|Zrg1q!sQkz^#rUGi*!fp0z5KyS~`Pf5pRfu%_9Nk@OD*Zl{ zM~#-HGD1_$M$8;(FQz24t{a+PFWzSY+IeFt<& zZD(d|^?<&H5~UI$d6}A;&MVL zLxjMb0Dd0tg9~)e4r0#+#8qU)f#j#TZrqv^0Xydcs&s0A2J~1nKh4i(?%(?bF0Vgc z0GBW#^>0SwakzYNw;hNB=fow(fC~}DC)M=B|6!|=MiVt$B%)SO?GE>AXSTP|5TXaS zVgbkWI@E}x$lbW35ubM_97nr>3ukHa#>yitk^+9DyUbzWo72WU0V~gZ`LMBF9x9xa zjmjJ@%ASPRk}fSOwcaY4f?KVbl?_$bewrA%4I{)9qKEgQfS)+&7Xg1RB^yM5LaHj6 z=3lYYL=eEM4Gcw*=wzNbTMq#(7=+s3Iq$B$HfyvSl~Z*FI#qcylen;-#z(bL$v2zV zcYcdU+t+aZA`uzBXjRFrzs|o`C2;42$xqAQ==hqcs~+cbt4?44a$-*=VPITfeu z^aI{SahYPwqFu^A#7JK#2C^@W@~_yL;;*}=-m+jj&b$_~WxG77o~ja6X-)=bJpuwH zH`p{?c56)_=rQk6qe4rVDaEv19qk~X0bLEdS1qfe6`A^8QY=FBy_v02LZY^?nATrp zmTzW;yl*jl`c=Mnk@i$?SzD*DE%Lukow6A`jlwg6R|zhVI=~o7vi%NbRxAN@s`yL^ zv23GHg7FB`n3!le`^L8pqbjWm9BRLH~Zs~q#*I2$d5O^5@eI?b0AR~4@+$lcr8 z(2p}OxB7iKEv%xU?fi~{-Tr+Kjups6C(A2Jy$R`hqS;^I3A(@X96_xA8=d^HB_PA@ zln#id0}{cm0}=;1J1YxrJM59N8^7YQrz4IqcGy}g3ug0T3lesgSYwCXYb;Nrws1iZ z-?L>u_b9i>z2T5r*QQxEXVa1K9!Kqw%hrD%@&G8S;8rHgYb*%23L+?4ieen~vPk;7MUkALDQ^c>^FQ2^U~ViLQkom2R3%KBw!Ra1E1LZ@C!_@Tlf+C*g?EIzjV+#RrV05%D^%rjOF(`Js7XLG z_Fg_#Q`{df`iYE`wUXPj2>+zE1wJxaFuUv%+i^#C(Q&A&Z3WSyQV+ z2s1^g#9szNLvb&kpy+~Ffa9FPP5Ye7p9_vOMMVX%?j4YW1}n2(je@)_$wOx_b0pu1 zM@@+)kiA}+LIZjD<4RWRkEG)yoc z8!?z0DH!CPvfx&EErkifMHcy992x1l)O;W@9(yNa;WMA)kJP1;gd3HGR2K4^x^P6@ z&Efcm{&CLgXf(&!Ax)k#{_kY=m9dbEN>RB8oaIQri)e|E3sy|ZY4{UDiKniCg}I_f zxjih5gW-?qNXw?3yo7>l+uWy;WINI6g2=AWawVOm1!wG+x z)Adw^HccY`;2`EluPZ{f8#&`jLcwn$CK#~T8Q9(D;EKc-<;}^( zp}?uGI!oy+#}{FMun1S}^M@YOaIA>AimBh zos#@^;pYrDBsym@J_=eWrq5g~o*XYVDjo>(CnUaFfR8%g5D5VmqQNFhVXY;8a#$Lx zyDdJjapa3h-tWuXuwc& z5kj&M`nrJ>Ko~H+>IeS9afeigb5{}P7Co&nWcdTPa3p&Jo&=Q0MhBJ|{?sCwi44mE zC=J&N7Pb*u5{8>zauRbwel0`2c7~e9^kBni5aJJhlrENd6 z7yCgK`_&UtGSDg;o*__^LBhN|kLtV%3!-B|f%anyZ^2c9#`(XnH|M0e`9WFb98V zt~8hFeM-T|iO>jWMC?iL+{R*dsUu^lzYrNwDbHKkYUtz`DZ!a&Vh`?Ld~@r{{2he4 zdhyMyOFC)4CH|;(v4$(a1jP@i!a>Cim)kXlHHzb85ox`yUoN3}!f|qwjV-TUnK{k* zQc&E;bm!oU*(bQhRJU(e(ZrAN@)jggHi{zc(6N-^qfyT<-7On5ekD&?FeN&SDL_6j zwskp|H}xc#h_G@Y0!?lFCm2jJfvifvR&T(dS5F{lgP=lG@MZl?xvcC|0&IC72@&l_ zMMkvG-D(mNri^Aq)c@+}P{*sJlg27mDsNS;v+hzSth`79WSb-Cc&0!b#{$Ds2}hYS z0B*(~M!NqMUh6=GC>LTI*TR$%p^z+gxvnm43j5fIho0JU`TX)i^E+s`S&)~g~ zj{%R8)?UI~r#5}lZANeZZ6D1fwt-`1_2KyTp_J#tCUo0g z-f4VmJ~#0LTlA)G@iBLQTSw^X`eo1kr7koF!=-mnSMQX)=^$kL{O~r|*Zu3`^%lGb z2>&y-7uQFB`PT8}(TyUebeq;=^Imw`wXm@(Yv<+*fj&o$9p(-go12?yYXUPdi33&p=)=0QVc#f76{&Yn{?$Ue&6oEK@JJfhvvK7DE$*`T|N*LaCMAd*(rt}DPU6%efm`*>o zV}FQB;izmA+9|&b^}#d*K7b<|7GK~tkfp$^n_~UM1XWo8jKIF{2kR28Sc{%spQK-k zXRjx4&y*HNE5ccWr2mn7bAMtI=>ZX5Kg+y#=mBGST#7%^78YBSO!eLDLNRPesTpAb z^)*#UDPz49|20p11>C(Gnne(1Vm%E<5PL$tAd@mPX1``a41U{Au266_s#Z*Fikv8C zIHX$%4(%<9&c&j~*L(z=B-&s;Qgw-3t9L1k65bVxCP8UWLW)f^jl~T9ap0lA2tQN9 z7b#P^iv8az>)*kEm79@vH4N)E zf0>M+=Bs+>&ib>6@j+20K2Q#$j!Hzd{p|K4wV-8!xnZB)N_6NQ1&vGD-6wp_5xv+! zX9`}vlOfHf*E+o?4W;3OhE2jF9{9HvA&=fy6)~gxwO7>45f74bEkmr4?leBgFLuI~ui}U_BZ;9Ps>tyNFPHu`nAUD)dipr zVRtR+OZG#}hqdfS*rYDmEAf%T_u#SN)9LL$Ncvhnup&wB-Bf~f)O${fW$x0l5s;aA zbS$abC{VVLoD_Y!?C;j1dB39k=pyC~`j}c=lL{H^+TB3mJUfPZpm&4c_9v;^lOagC zRCjnFCtw={!3b*eL3>Op9NyaSYMxW0%-S75pmjO3F=mJ3iGMj9J>Fi5cRDR5>e0M4 zykB(IBAy+mW^8d0<~ZFrd8tP@iaAX#;e4jy?AVB z%5swc*<>N%s(H`+G=U!Nw-^}KwA5UhE<*zW2{!q_WJ0+`#Iyj`8p(nN^&1Gz3$tEs z`AzMcQy!>0ZNP=Qsv_V5 z)W+{pa482{Nl>}>++dcxe_c`6>s@{o4WVIdfBQ^K5=B*%hM_{v(m|kHKpa$|fy$b* zPV{NHA_zV)ysVc$v*pl(UOkk(NaQY9yUN=eX9763S-HwFTl(-#cTDwRrlG ztc|~W?#_kkdVOJI%4DsNj7*QII7As2CM!&7HKAsQ=|R4bU`ENVC@OA-OLwJ0L2b57 zW5lL@Y@IvDe&RKau5c2dfbk^ynt;^u6ok~EBMX_BSOxT}zm*I?Wl|d}qYwVK2O5Q9 z6ik!Y2;iz^{tEK-7zfu@eKAIxq5L1m(eXI~z3a7hMYPOBv6XVO^~I8LFV&Mrhr~g^ zV8}++N6#;ktvz%DsKLMwT#lnn>ioxeH@sBpBwKjTv>u;g%F;vU+EpjH2M$PE zl||tf3T#u}jmb=ENJ?szphxpf3t}Bpy184O6fOu1lACwiMgH!+?Ki|Vu*rp3Wxa02 znjsI*_zbCyNlDZz?~RtX`w6I<>iCGE7ieU|l0kTX{MPgOpa;-B3zEih2h|WIw`LG9 zcW3%EDS;{tV>+OA{TmoXMr{9?8Ir6kRF~<5W_MITqj7^&H&1$i9)fEm0K#hx1gOLd zgF1s>2FvU#Ci-nV4J94tA%t-Tn6|=)T=BPt2jtdM*ru`sk9FK7bh*7p z(RAUpH0U@w4KhRR=;$g5ZmLK~xi?F&m8OWX?o!m*Acra`tfh@=!~^A|n~Ng}_Z@oA zK%>fB7LzBOZC1YunhiIoY8n2Bc5*TSox`_uDlm{<#_CgynCu>KmKkseva&}iNMO{o z{wcS5ALh3bN95Zv$?%y-C%aUZexSmGRGPjE`DCwIfOH|RT>ze!$Rh)O7y~bInXH4x zc72gxyYK8C>D`$d!8NZv^ki5eU+gFfG6RnpoUvkJvy~bdksMfK32E>7@+f3j^BYYV zbmBqR=irBb_6KMCDJdb6-$@3ENDkufMsTaMr?txm0MZYvcxlh0s!C8wevl?fT9MtJ z`myw*MBM#`u;+sAp{3eS4UmNBi;&DRg+eqkf;#07v8K%KY(MjEKO1guJJW7IRjaJs zcyNzK@%&0)@9^wt(E8&pF}#wacBoG0u~LEd3HsZsnrY);I%%9LanJTjo3+B=E`sm) zfTvfLm_egb#z?;t#LQc(Ln|0@t=Jk9g}CnAB>lr={2?Y|uSC;KOu%Ii{fyBAT8sk? zX;LFDVtXtzacE_~LvrYjDsrQENp!R863L#!bc4QdNo0}XBI-UptHv*ePWsV&IT$rj zl32wiAZO1JS%8`*P&fiNA(T3GgGBQoYC0t%IJ((cAnnBxYFk`CV}j!8mqN?0hw()7 zU{v-47;JN^A)vkMVO?#qfFq?z{ex6#De4$SA?QXMby&roDPB~pH2y9jY948hRz#D{ z6Q;T%E(_iR-6HNn80Kms$xFxd!rusiKn&!`P>j=-@(v=>OqbId;(rP}YxHdbEiw5| zaa_Emz?G;Z1`Wm-KWO^^sF*#a|6PLq-@(dR{x`zP|37gy{VPHL-vO7i{bvdK{}#BM ziG!K-KPKok9I;0ceNJoB#H=LMXS|i$wMfSuA}FQuhg6OQ?t!KKP>_-Jgy&kmygN?U zvU%z&Z$U>NA2~mt?7!|W@2*W8y-9xTO<(tJTUx&B*5joQYN3aBc5*&EzE2mo=&wa8 z<5eVr$pPjCNmTo}#YGs}y%qqgu|4qp%Zc3a-0r^(;0?d{#0wlS`uJU`|pHNI{# z)6?2oigq88CX|W3(h@Y@p8`p4otxPxDptk@ zrN(dB+pow!vpOneneN*HtL`ca1LDq(Cu11{<-`iW^qAz!pX(7Q%e}KZ%BDB7AkJm< z;ph~c%rbS-oM|JQB{KH2Y_gDt!7%FR*`Z;gvzSAv@DlW>$J(%#nu;9NHIQHOMQ@2t zLWmJ~p0T9q5m>QgQ>jbpgDvWkIYOct4<7 zpg8CnuzJ0}9gw%BORA~V!!T6+&Cb7xN>&yf|0-pSyAaiT`OH)s*3`eZ^?C1Be?Zdl z7Q;B=)JXnP8s0^~Zh!)DP~oQ}tSo(hpI#mNs*ZaRfn&ErR&aV$V{dJhZ)Sg|ZQn&f zkjo>9`38X_=moL2W49xrUU>56=!qO%RhTt=*(thwmY?i4>N}so2U>H@9Mv4x=H5g` zf$0JG1L}d89WL4hf#>io@@Z`*%7O4NmteN~FQ)4xrkKF5Y__wBROoz*55lWrqObU~Bz~KTJct~)$)a>^Z zvvdP{HHjhRIKba5v%nI2W2sU|_F{AY!V0&P5V~b+=A7UStfZsGTUw0i`W36W>pe2V zG*Y)1#!x7@Yn+JY*`cc%l|&Ql)y5!5zs4CW^FTUiFuDHQVW71=pSgGnz4vLj_gE1CJV4_qa4G#c8%DF+ZKw$*HAPbxa1;s^}5$VSrE>bfqvzGv6DoO+20C7V$>mAD3whOx zaLj19CWGz-`Tlb*cptcUI`4=@c@P(^?W>V6XO@9edyQSHw6*#>jgU?!OURRtLk??( zhEnU3UjFI6_R9{=H7h+(VPBp3&^(N7kS-|$g2qCm$)Mc~s*Knh-9#-`S zr*N~YyJ}!EIk6rec#$Rf@n=a76?*eB!`@q3YffVMFw9-Lw@~H%_1mmq{2i5 z$|gf;qk~xqt0&?ViJZfyLt*7e#A-_Ibf}J;>!GeeYW?B|$k zAqf|c6X^CMHQL5+Pj0BR-r_Jo z)%$qW`Bo*1tMf<5%P@pZb<>8xa>g$V6$2AZa1!IW1IER1M~p@`MvX||3?0&t88ImX z({LDB4VYdzqs9?;!p21}LCDfy;N%4{1d70qXYJ=?Z#jxMaYxlH>|x_czD*Q8@OTKXzhA$v zh`0j0Ee+=ROru_=6wBsaG;pc_bsXFy$$S3lgI+j6c{?rW zjJT-shB*jXgxp$Ns5=dYHRV~OxU`ee0?Qn8x)0{WpEc5g$~@HyN1wq+0=0o+$87BQ z5Xe|}a_(4n;DiJov)^DGxrak2n2q$4ht7&g(2M~#W^n)EF^a}6Y}%=U#L^^||t89mVt zCLW}VBe~}#NMNqhV4Z{14%F+xHPFy&Fnv=6Xpk*4EA`I$;AnUi-hc>}FI(u3CIdh5ucF z9fz@M{8#(giYEnbluW+pJmk`vBIkQmo2{;U;jlrV6s|}>V z{oJ=NZwRT?(`@<|{6HaWt=Y~Nik`li0h{s}SlWj+7yiyvRF*9n`fB7Yl$Z$|56&Rk zS3gtk`q)VAe`OpNW3H7HG+?DBb|BFJ&lb^f)k%x=cm!pxpmu5>rYcnR%F-s56TBW( zskeVAr!~xGtsv+7{*ul3n_50X>aM6{QC+B@NynHJ5|7|aU0Xx_>8=6^#NT!v2@_ZP z6>br3mmB=vbhIVwOh5fD*=L)MR&We-*+C}>z7Gs$^5M+JDRFK5LBk-))VU#&wi zk|BxfpvsXJ-k7B_GreZa)V?TJFp`;HyoSLfAuY#MRf?mEvNg{W>h5Z4{*lbQH4K8{ zHK4r4 z2~QLk4Hq$#BVs=C&mVm0odi|ZQ0d_WcsnjXfH283@Yw^o zBB5Umu7Gdcoy)-QNmSkp_c$YSF$~6z=>9mN2-g7dtF&%$5$AagWYHc~6!J9x4TeC2 zY(5WgN3u$J?i2yM#th`B^y2FKRcZ;g#J&+I$}#^k>h1VNz-r49)xtaPY)Co|lmUGj z#6;S@khB464fl>6j9;3z1q2tJ`(>9U*Mv!X${>|fX2)z^{o3_=HClFRv~88>Tdd^Q z1JD@3Pt*OCZ>KD2EwZ6WAGtp+ATHcG$$uv@{v8F7^?xG;@SpMwMf(2(6u|$qWP<%a z5flGf-GAx!VPa$Yzx9v(?YPx~>a(lsKWaQ#Y}Y$w#6-M)(UiT`TqwhZOAc>oeq2`H z)X)@>>AMSj>jy#^2VH(YsRNMp?rI}8>iS+eIsKaB^}IcQ=hMsi?d&PQi+#u<(X;NoKxK%AM34o@qA=xhAK&Djd|zf`XzV+mP3zGaedo51r&!F&{%+@V>Cd6T zmxZfP&-d5S6LkZJhqLJTD^Gs3JQy!)^R0RCPpQO*iN11SczpCh5cIm8gt8$^`z9UT zcN2hlLFe%n_1rdH&(z#k<-||ME$x++|TEGI}>G&yp*(%gBDWj;!(F9U2qgmgG@H+i~Wk3_vdwq}Sw!2>_ zF(f#j@|R7pYIXx&uQqcqhV!o}M~Wp*xNvop!;!Ncc>p z*cM9U4inPL9j9fAMwGYk-u9lH@LCOjiKqg@0LIZ9)$Or4Tn+lSQWLmlLbI$LUqQx^ zG5T8fh1&qn&#}uCa^A9QLu_?EuUNaHiY>cMBnIkcTu!V_tMZXJLvvGpP*3}x_yIjN zsuP924|k5u2e3ijQWyZ)G?};MckCRYG>gysl%+%suM~ ze)w35>(tF!?wuI6S@mB>K(y1C05c)-L1J;o%aU&K6t8WcM5ij^OWRLREdhD{Ij%bt z90QruO;*U#kH&q84Q21As`Jw_@9aII1`fMEwgtX5`Lzico@J$zUGp4A`h{ZMNaItrVErK6mQaxO9Opp=XiS zkBcWRRg_F*SFdzKHO=GT^!DX{x*t3zt+3a3V*{oL9kTeK=zUR?V|)sd59Y zyEVfTJ^PRI@P?uIQ-;t0Z=!};Il3T>u$P9dUQVy2pP4KYvyT|9ia_Q!im=4ddF0Od z<07ydx(&a$kRXyUTE-8Gg!;YfA8dJDL;#DDhF(~6S8O8HwY&AL4x&hy7hVI4i`B2be&E!6QepuGEVK$bxGJh-v7eNt^A?B;~Tu zltFTqg|qcwKhoBe1v8{I=<6*lywGu)5ph|8G49lhIR&Fzn9@Xk$}7;QSB&`UnH}ai zBXFMya1HI-s%OxR%}&<*3NF0Vju74j9Lr^-{C&eF4N}Ap5%^3W`q%065N#m;Ln26j z6x=zCo;b-?AuzX60Yhf63_FN%^Jds^Y051^$VxQl4bk(IFI0wEbLHF}+NKl7h_Ga< zR-#!cu)b@$YRUT9^9Btc38Nt2>9YlP7oB)hq%5Afo#?bGq*;VILHv_CV{JKPt?+vB z0LcYXv5#j?uXj4<#pLKOJMI;IB^6IrNQ}8L6HOf@*CRNp$AW$W@U$HJ^ zlP-``JbrdkkCN3ajf~-B9@xWz#Q-ImYgXKhvV4^w_}pd-i_e+oZ2lu4*@$7}Mfpzy z-YEv|hO=Aew7+_gd$E23ED&s9=$-5xbe=7}>B|-SkR9NZGe)qcQy|{VrF|~sV;i|% z4EDB}R1?_tz^@`wNIt@x)Ov$MS}zLrHdZ`Xw@W{^_9K1^Yr$V#FxZksNqS1YlpxQV zN0gv6q8-F6I?rE7`{|`geJQS1nCQ{c=Aq59VpDuTQ4jvABdollbp-YpSlxUN%Y(wa z9s9ppBsHi-AL~4F|Uut`q6VTeXX)|e0sv_A&r6mt_M9;8gjaE<` zjdAnKLSr4b(cdBG^>0GX?OEfo@R)a2rEsh^K+efWaneEJ4JLPRbWLl+_z96`^RmR0mn8$>{3vV77(KBA6^nEXm&e zgls1n_g)6;K?}|HD`@Q@rpOWH=Fpsz?O=YvGlCNV6L*s9c0mV+wkmJ{}a+B2+Z6+JW#(RrM!Q%;!u zC)&)w9PxRglW?qX9!W{nhH&Q89+sY`C%Gn!g%&j;>4r#C;)}e;xb#5LXZ(pXx;PWbtQAw8HLF09TC1>4l!FOV2Ieqf`+f9W9Nzu1^e|Qx_S{D! zv%H^Oxwb9?KuCt2%pCSTzGPw}QMO$?v;7d66+8XwkpmJS#*C8s+SCXo`qhW!fUL~& zVz@F@Zg`fm)xK(aq2gD4^$@}So-*My)t{X@Xi5z&RICRYUZBT9&(a$NO4xS%kquS~ zTfu)H^syipUF2By+@?|xBS+--BaH1sNST@e4>Xe0*@@P12@sP}V{*pkA@kYFyTuoWEZD}zrRy+{`0#B2 zXToloaD(CQsw0LWD{LZt4J^&zqnj8Xr7}~^Y*=k4DGuHqL|l}7syZ*CEl(%y@w2Zo7a?zN{nDXUT?w#i$#k5y z95+j+?p0xTUAN&~OxX6f;bn$s3wI87)PUA#scEC3;*45Sjv!L&unm?}+nA2F(DQUC z(8mG$5be{M<4{M4f3dg!JAQkP|11LkXQlsT1kTLL_#YzhALL=o)(E0^ZtYnrz$E|R)jKEy zjCcbONgT>J79j)(Uz8fL`Qe`#57(83Z(fyYn}+cp(%lk(gwDwT+2ztz7L^WfH=ma8 zh7RtS>#jC04^E4kt_%Kn=%nfUpuVq=PlwlEt8cE?JeBF6tp4&pS^bKCvib^rJU4j0 zydU|F;y%LjH)^I1y{6?RIp{PT`T2$bpSKWL z`q5Et=mDWoA!C?Fsj(WhsK-J!mPs&LmYh_=C8I?9&eu3h0RUwCqC%W|2$ z*~CL^Kasd~r`t@5&{S4GO3h#`N$Avh#s*7x7LyX|d3zN~JHkFZk7rkwCw1XnNX;Wc z59usg{lUs_8~t=1?CUsq!}{YFkfS@Wy-hnJt($rDTK>Y@bM~^3+MMqv@HS@2Rg*!a zfjTyqka}iSB}|(4+!6jtZ2$9T)?H=G;OXAa*WKleRrx1e{khYlg1@%U~#6BeOcF^1&jnA_H3fPNB zHongo^q_5*dZIfZUki$kooKG%fb+HJQlWa9bPT44ZFAFpZkFX8F3Ks>haJ})~1~)%m(F1Ob4V>7!q9zmSmZ( zS<791QGk6JOss4nU2()1$W5(oR!GcyzudJatbs0&bL(hsW;CneQ$^Dm(s`BYsDU8^ z!tTd8HH^FQ;q?WZV1_&tl(KS*f*`TjX+gwPEO5d>TCzZcBwL;d7eo*1M<1fKz^HU8 zE5%Or(-kN=@<4iVA^cR!Ufw`?kPIeF^c3RTNig)xW*P-h?T3DQgG)SU-_EfNqFw{p zdBd+_p1k-C6Y%M%6^z$e<#Y8_;9Z0^)14Q zMWP`CHy@u$a&O z8}?U~=JyR!?pyK2>6^&0)Z^a!ShI1vO~jJ2&86CkkX8A%yt#$73?1BJWZ+YmKi%rD z=tCZ~Z9UUauvi}a2?7I5CyKxkrZLCVe0mxeP4%McX-a+bp#nrSNa{?-#fgRWNvg=q zS{gyBCH89lrA<+duV;^(`ESX^#<_cp6Zedq`tQLSxzE$lNYAsXy4FjIj~7XRj#_Mz zldN+?Kmm+dgXRZ&5Wvy=Xen|}#n%WFSN$+G)jsxI;E%X%&!)lLP9Qq)$pw1GNg**hbwLxSN@BEFz61 zVzURpWqDvqYgnr_wz-a>R4)?yaGsx0)a_Gp3?s9AH0=_(VJ*VlrDB4ma4g{#4CA2I zp*7ncwG>a`Ww~QUsbH~3%{*+@2o9~>tlr~GM?XbRScHxQY=4JZDasy3A}WG_%%MRM zm^y;Sf$t+oCRHGx8UvXXQ-zE{zlH%o>7zjqq$UETp&W?=CLgbjl0v1WO-d4|xkLW> zL$gF%Gh6Dv#r2|bN-h?fe-E~l>*XV%4t9$dBP!RM}%;86fuA1XH0So zP!eQ1_=yAxe~T5|P@_9^xR@2_z{L zHKr7Y86l(mT+2#id{zvRaz+d>-BSv?6oR@aY^t{yS79jPfJgi!j905U16^P`Qs7?s zhWlzp&BCdFGmdvGgg7~U z{bq`zka0%OEbJCHvo!A3*f#yMF3|c}*um0vLUU_b8Q2#fWRb12DdTqiArSU|7C1Nd zU_V&)GmcjN+S`-~+N6Cfj_2u~KapUY zK^*sR><(v?IumbIc2QUznx}6P(Exv8iaiNq>S@@dV^L#c9Xc)#z8KECXv|~ff#%y+ z2au(pW|X?X@{>Y}SchR8!=*)tIWq4#KPB@0mrKa2Kdq?t^zYx@KqX(T3H}H$9-uVf z7_d7y&l654(vY^K{9L4o6es*JSLT@;T$mAmf)A8ofspL|^j!ofviy_7wx$(KGB~je zGyGXuXru?@!qb$okk!DR>%t7<=b#N5Q1CgSphC>BmT>9_cgt_x)1V|v1w_0p>`X3{ zh+P3oWj8G2n?5$FouCHQ>HB_GDQgmh|M$(CC9q=8w=D8 zv@?d@&MCC$p#~Kt`elt1`Da$NW}prI-9fWg)A=yL3t3=6h);ojzhi?#gh7+=P9bom z5po9IVJ@U|;X+_%62mUF&ioh-pqZH@9Vo~}$Fss-);J*5BS*tsnfzTdN)e~|Ik89_ z^zNO64Xn~Ys%&w{Xg}^IPxNw*Ze^zuIqS#k(--tmr<33;t*THktwttrPM6orD9tW8 zG!v+%(&$J5^gE^?MPp^s0%Bs2O>`Kf00!dHk)trNStOum@mQD(HT)1vr^D?+Y%QZU zrY90l#jr zkX(2KN>UE_98bYcp8$Bykxhcz3f1hA<&?K=oF!Ft%sJ}V!93GGJhs!tH2Lpo_RcrX{(HU;YNeHhfx%c_Wwf4>7XX~oU5cFmhQlz3!iEUI*eDi>zLMudO7{@Ys)pMT3J- znyNO_^@N%lB18WTU?TCVG`4|osBX;xQ1Xga$5M-4r=D zUS3EmjBi%hWVZ2j*UUF3+RqSJ%!}Knh((^2RR#r3JrLrk?{tIsqzI*@DusjBP>0m6P?iE8lMI&dJIYc!L7`jT>_^k=A`K zr0l+arX$)-?m*U4OKPp#<}vk-%V$dKw(L$$ zMrz36oAK2%`tyuSlO25)u9Tb5;Xo!l?S6NC^2$i%v(=w|)g8KBW>72-sNvhx?9~ zmtNG?#_8u|@hU1?qAPf))iFA!(&KVdL}dY>);^;U56e@?tAB zwS^%Y)70>+-1wA6^`_j&*$>&_>4>Meo^qy#h_;8vGvt>7!@4t?X!uYRjJ=S!+!xh{ z#22OhIXXohD1gaHtyl=DBXw^;wv7LMgph(x9=UlFn%~&HB)7(m2JkHlGIlWbbO2?V zbl1bSczf|@n^W^`UM1xNGiZi`qB!RFf*%fnU94X6fdI1&%VCyr#NHp`1VzDm!8XPA zC}e976IAj5{c@UTY|V1RrRhh+Q5%26#@>Uy_3A;DCy)`8%SvxMDckx`*tMOiQ--(5 zKKz3LB9G3>iI8Cz8w&{gRFpNPf%Bf|)%{gY}X`qbH zw;X^=nW|`|FurK}wf?bm&ji%=cZ7#ES@=o7Z`B>RL%*w1m?@Ti&kC))JpXi|@~iqN z{C%9jR@nZ5R7A`b7!@Wl2deLjvL08H_mVGI38~sIYEvmrtfLn`$aqz7pB}h?f#lG# z%9#l!BPnTi!kVhiH~b32a2z{HW7#A4EAA0$MCkmBOUwl9 zvyh>k)ozanH1;=2Y_9?h&AFyTqL(0DMT9fZZxgFf@*IKgu@bN zin_AT!tzJcZb=(C)?kg`8Eh)^+5D#>AH}SsK1|h|v!%^d<*!k9oQa(DRjv0wJk59q zp@X_E)^p2fTNy`o53qWjP8S8a{Pw9T2SyDM%=1W<0Xe8LI2S#}dLmK#_^rEatQvx+ zFeN_9>{)wJ6IB)!BF3c)2`xZ2+mFN2K4fG*LnvAvjOSyq%L8)lpmBYMZ`|jF z-UA6T93bj(;=HGu)IG>DZfok=SU}_S4@{>K!MUWl%Vm-=rZz;C#X#z`^B2@Hqp!Rc zRBnMEaK<1C<(kg_%+~)8Ge$%$U7VGFI*HlaI@sI&v~wZhW)`!zv3L6JU}W->S^TG~ zrO8hzCnFDFX<~2s6F5iE))_FF|EtTKNm&1L{V!WPXA&+J_W#&qOB_6C>xpoWLEpn@_)C~%$k;_ zE*AfNTW1%ipGLNbaMIxyeV~XSARzsDpXK&QTzSCq|Nr~{b_e|F(G5XjGDK_tXQK2! z%xL*v$;5w&5-<(szkUAyT{&X^e1yJUvGo+M+Js7`Nar7N`myEEx<;1PK}kL!h__hKPy^*6LqKJ?*4T z$O5bgG=gQ}T`19T7#dao1`NY`ZUg7xRJ?zu@^f0)+nqgX6F$eAbb{0EPa9Xh&%K5$ zIQ+ZExqeGHyOWt*P0cJg2v9+Nz^DK7f1x@zkB^_HV&3naMgHhL?UYYptzTM+wtdxg{GhkOpV zy1bx~2;!tEz`?=qgYTdZ9;q=I7#UL;v_;YMH8op}2B09~uP-m{*oZBqZc#-@%ixaj zlarH)h=?pisFiXE2nZ-d%GElY4rTfHI{*CPx1(}J)Iq^hQBXjntbZ>mDl&b!J$!t8 z#Aen%2z+>W$mFzTV`q739nJK5Fp6%YFPq>IqFT=Hc1bYm=jrKbY+O)YPJ0{0 z7#@m?iyQ9l;&LAd2~Q;G{rlzVYFld5)5~joe7sh_OIBBqSQ!7HMOadDXeyh}h^TJF zktIDX?P9$Z*^$8N^73+EU?45FiTs5I6t3@mz#_l|-cky_{}A$6O;{KtFqT*-G*!^^ zo+c0p3F$<_lq~~U2gNGbHF#1~o!d`ZPENPQ2DbxcA~QaIHeW0Z#rysQ^(?SE_{Yx0 z1%fr`T~tkSdiv_h%F5PO%!{q9ZBsKljk6KNqO^zzD1T{l^Fv<{^o{$+>qCFPD8h_{ ziLvoX*#XCJEHU-5ilHHiA}dpjjhBaqQCxEJucyl&2pO4~-&IvDP7hce9UT!75pgcI zy7P6|2js1Zq!O26Rfo9D1F6ikYer&6%isIj6xqW&X?pm2ID{+q|SA5 zanWjd97oL19tsjNo>9iXn2U=mb^MTtiD`CrmRRzU+fMg*I(K?>G=RLAIwcna8~bXr zGd1dJyJvfCZLBM>%gxz&Ag{0xJSHZ|Kg%&n1tJ@Ti-AqQ)o!!ddbv&Wq_`-O?4Put ztiNa;ftt%L!Z&m!B_#w|Sy=!_3qvM;yuKzeIUx9q&Qy~1cMUEn^6h&EA4PzLePMA5 z5yzB9VM4MkEiF9;-m^3}6h({)Sp3F@o=w2q++1Iuh*bw}Q=hT_XpheuCw3pNqpNF* zGzHH3+FJivVw-BYxKwp@buoET56SLH?)6u0kLa%%(OSKBQKHU{4i?{!*Je-1+uYYz z&!oK8)>M8xeEiBw7_IYYe69r6gjlpZ6b!Z7_(t>TjEoE_3W}B0Rc#%e8vU+}br|cV zs@dgbDaQNzds8;tC(I_2Z)8p6vI#GeT3R>>#F&^rIRblndPMWfs;V%;#bsn(;JOz@Oxolfl;^R{fvIW z`0Mk-YKdI9#dh8GU77#H+-O#Il_N=d7=0+uGeBpO(dCE z&*pOz%mvPb%mEBvr6$Q&cz8G|rB;UvZMe&?U%SSOb94QZj!sT=^z{2gMvRaD)=SN@ z`OOAG5sM(MCxC4@VcDSH@Ib9CFR!nwbHCYx#BObAVWOeQBTdN#R4fjysJOU~ZU-f_Oe@VX9P~Vy&vSAdaxiL3bMxhmjfu$s5C4I`b2@DO zO_uWx@Fvz~O%}GclrLer%5=%Ud((Cg@NjUHvqR4=R_eir2`JOOOY-vrlKk(cQ<)9) zJ6)^Kvf|?6s;U?+9ruT#2L}hO)JLsz1bt*>K@yb>46Y6j2fNNrPU@PPl15FrD|q?% z+PT*j>P?0%ejid}Vqz9S0Lo`^rQ2$EsK43eh27oJ+KQbC1`UA?XqVsnGb>_!R6WdV zX=dj7_4V~vhQFMMlT!mPC2TZcef|9W7Dv`w?HxJ9)}W!GjaXh^Uw=;;dXp9u7Mhrt zsFMTx?|eKJQY&^lohuX@nWo27S`>3^82|S2Li)vBx`QPuCPq$1hJuWY92*to{d7qv zOA;^bP#ADi!kCgvayK5;C8L1r3nF^W|D%JiG$N z6jqIqkr4++$CqeWKx~11SIZ;-|+Hh7Ue|x&h<@aa+TvbiYrI6J1%}qX~5=>i1 z2e3`AiH4%0{eL{};@$@%u~UP@pX771+lP;VK-M3A zY9I{Ra{PcDFh_v(CX0u$7Gz?I(WBn(@ry;%($=2L;22+DfBTPb{mC|j(suCqnBc#D zb#|r-{G`D5Lb!_fp&`k1`A4;ok`gM}GYAo9XZB0I+~Gqfo`hO8xmCnhi`0E7DJg4fI&_}@S5GYpyasFQ^XqFCThjjG&d$!RuIv^#k$J!> zuCB`HhUCSMAHszM0v`pT{qg(CX@MJB2IUu1R*s8_QB+bwwq*qS2@Deeo_b{DcMHny z-10J)$q)jdylbMta?Z|;DJdFiY8d~y`JX=olr(g71&qNrzh)K}Lm=6W`hx*?y`}>( zRwxzw?b|m51Oy9sR3_jZ(F8O$vI7@Uvaz92u5@{E0c*%3TuK@ShNAzvesz_{aZem@ zN@heBq{*`N<`QJ6|M@;2A3mj4vlZrl)(i{?lq;QX%)okZb{3Vg&0!bJmNcps9N<_f zD3}q^sH&?EPJsV#a&}Jl$dhw-=VnKC0d&~-DB$Lc{o6M{BZ~_Q#dLo=lvh>`pL*(S-0Bh_Os3a0j&J^Ie_s-5D(4;BQ)BmnU}WR{i^H2HmddmD~U zZDnP()$vPi)9+1a6vvrIg&mN~mBx;aj>7j&%))msekxvGJj%NI`g}(5wkm@jBFgKB zhhj!kwU-LK%;aQDSrlU8FE78}@3k^t@fz=Ioy-Hn+jdq~1wK2mc&x1T-%H+Q{yPjC zN;N%OC}-0q{Ac2aQC3-*`OR{!&Cw4f67jF`$EwK%Io8+nB-fgBTfMX0(pu7ID~ z_K4QiwBHL7Pks)lCvjKoY8r>{J9m;W11CWjW&xM^RIK0EXDz##Jh4o}R@wRR^i&ql z$D7|fVuPjmt=p&6{h%{K+?S9dPVB$y@j@L}(6=b>dr8^rp!#|y+3SC9-<1RX8VxQ* z6n=ORT)FTvt_$h>a&vVpId9rLn{d^vMs8ZVVJ-gGu_&<$M&D7rUh#eXCSbFGL>U7E z1|lxCI*`9#(E%1?c8naH6j@Xh4UOd1Nn|qdU~A)#dvGa_R~ss#v>V3(=*{O5pPS-k zFHg@M-|^F%Pfh6$Pd3|LjtBJV4GuYdpTXl0Y~QD&^DDo)n+Gm^-Fm0Nv&G8ofKZ{M z#_AuPu0Zg24U@w3qr+~K*TBHwyV>r^;`s+YVO&{Y5u)4Fo0o?I2Ga2dEsWsV*YK%}vVob`^Kg#m*y#Os$Fgxj78? z;U6u*e3bo4efxI&*2ZgyhL~1==lk~cd0J3s+Y@tbfsycEZ6||2nFU&nXPLDy7iN7C zX7imwRP*ELiPBYBzvQbmG9A#v#bIG#(Za<`=V_B;+Tpn9!@l5G#mbep+HU4sY_G1? zvGsIy4V(L?agm5vH3^zfT6CBLp-10Cp<^u)wA3oBF_+OwJMc-5E864G1}#U1@yP}_ zJjTpf<}AN8wDy9NDp>~1_3xvZnM+i8dwJyLUX}V@gC#0Mu%*ij<|6Qh8fmGhsJOekdwKEQJ192NCObgkMPs2mbF$0`@tmsJ+f#y| z{ZVea{A=DDw3yiCHwEQZ&$1hEdiD|)iid_CJ95YcV(8`Bn3E8>=J~P0%}o8|qKShEbt!x32|Wa~t<*{LS?nvih+lbQW0}SixGyco_0kWF()qwukc{Vp@K$ zgP`KtORbhPnelnjH7~Yw#Zob43U>BH#oAemZ@0kUu_}?M)ARH1m5Ux89)Q1v3GBVm zTY;J~yyT*$pt4)-z?3X(yptlp$NPaCv4xDRaTV~7TE0?y`>xVjRsHOInuUMj_ne*` z&Ukz4tX4A6sa9euDM!iHq|#@T=uGk)&rneit46Nd+TQF4i?ApJr`#*75b; z5^zOEX`;I%bG=={WNev}KsG?3Iu`&A4F{JXDcR<_(%S@|K|f{8%daJ{`g&~F*gw!% zlzXmyEeQ)u2;3#s61X}J)X4r3XT+ZwSxcp+ZoYH9(;-1E)Qq+ti-f45^wN9pLI8v6 z)NF?F?dAl>n=?~B>WT9u;X89wbnMf^g9uq1ZIT%{-JcAs_Y`DGW1*6hE^1Aiue-3> z*)WheDCn!-QBhSD6{0AA+bOQqpm;!edynt-_xFt|0}rl~&_}4^jUqViJ$-a_b>%10 ze|&<5A^Y|1Di2BWfH-W71kdjp1+23pBR8568_*SFV2HOiABsiP0sQZ156Yp1L>^Nk zOl4zdr-D%GfZW49iA?FDeK9c(S3wlA1KW((rt|%a1wlOuVKL#q?8ge#l>}RyOd>9(P0vR zIT#h(PkTpC61He#(*2sxoxLW#*js==mx_@VmEW zFdGQc#$)VX3&#y?Jg|i7)wf;m4N8OHZ8p<5dk6l+cjtu(hH00o>g!vptMl3R%WboM zdOQJm${ageV3S`S5Xih3)$JIama})FlF3tsYIMnNmm9E1TgjRD(Qcq=d>d0SdwF@i zF^^LX4Qwmj*^$s+>wxG2S)Q7jnw(r@pP_?0QMz7eL0OYRhnJ?X-o{IRU{X9PlfE~R z2E|*$PL8TlZ;)n$rCe8hyk}RA59x<4uK+p-Xdm(vdX%Y&0Qmspwc+<5X_uege^UIR zMYqVPYP8q4#T+S&t#)!ggcip$?ZInYR5{&A64|5Uh@wKT<6?W(Zd+s=b!*g2(k|x? ziB~Sa0uF4myva_*ubatXb1TYik zC~q!PYmR(1%zqK*UePlt;^Xgw^yXCOC=JcX_72SBgCe_X{^sGIprdq#X!SI``q+f;cy) zmu<0T#(;yDK2<9x__mb+g*GkYDU2UVzI>3 zRA_BT#d8*(UWt4!PXzeb-`98R8=F3eoE_z|pKVl;L5m7u(!D{;R>py>oI^_%HQ+M| zDXxJkxk1!60-(r>XwEK4x$=TkshS|Y&3^XTN$lADxqqrA>Wt(NL6L)x>dmSd*=I7` zp6uF{l`(SN&ulKjXH}Lks2BQ<@Bi)^;|Sd64xe}v_S}K;tPBJVvMmhMzMM=-q#7&Y zs5Gk<+u7P8B7fo4ez9+$WJMyLpPbBCG$X&YRWlC{4$hvstX!f(Sbj3U{Un+<%@}t4 zTKzEjT4{51OJt=wS8T9$H^|`=MK^1in}?D9 z{U+`b>Bj}~S-x^SV0tju1x=J;&~1u^DZ$s_P8nyfAKi6&Y1vaZ)8Kv3@Yhnc9FN?D ziP~Jv6@d)Tp3vR>(_3FT{q4}cbuo1_J1vDiIpV6P$7ApBGEiTegbg1+jT}cJd`%Ue zp^ukMslxScFDimy0Ae{4U*GQLX3Vewz_YIc*`Ka1G7?f~aIm|lClmw(fq*A~z5qHO zF}U}XAm-?JQ!JO-8@2N}UuPta%qg1;AS351ts0-c?$o7?4~WXW>zZ~~M=b$3{5B$| z`U7IRI=nff9nE#US~IE-Q05dP9lwfZXZH5~82n*zQGzmC$%`uC`c~BKu43YjLM1O* z=Eieia@inL`iQ8cyLJoncn&=>!MCTaa38eX< zD>N*XnM3>e`|#)OupQEOI(+p?^~c8;w_2g-_g>m;^+}B z0TqJ)>yznB%>B2Ko}65~Xa%4IWaQ+1Qb$KeG#IjOZchMPPdG%j7!D53xN#N8*6i;* zg;B%B!M>?#X{BXktN}@^pdeCTtazwVmwtVajzD6noB43ec1UQ);UQ(H{*C)<6AbCv z7~|m1u6ZYmJBtNt$SRi;Q>)`81JzN5ku`amphjG~4UI-~bGh<)3Z&m-R4A-&ZK%i8 zq@eyg_M3NFlt`#E40MBx{p!_;@(H8-m<)97CF);7VeB9o;D=|Y_`>dpR2JXzURnJ5 z=7Yv@M!k!LB_Z*5dk2Xe&mNM;pSxf4Ixa3PFphI;a_nuSdo?^he6&0wV%TrUHbBJ%E(Cb8(wr@DJZO{sOa9_-o(U&s;Vl9ot>Q`2?~?`pWnm# zQc_Z&n7to|PVJy{NwSB0BcM?5A^iY!b8&GoIx17H_G-BT@*Q-sY|#pia(<&fK{)W^ zblD!>25DfVLkLiYI&L1|;L0l9A-6N%_JW$|GPPggWS^_-G@j8{mw$W%^*M}hZhW1c z)p0lt*#udGeFnR`9~Gi8Xa*egmgOLLQ*~{OJc5%pXPC0w9wGvDeE68*NN15HAUfyu z&3`xw2o$rkPXb`P3TvN;QLxU^x5SHh86>({U5#>Tt;{{G#8FlQ&H zCY^uXK5sF^LP*?>M-#XJk_89`OyB+uP-|${V{(68k0LhPzk30Y%*xtY=m?a^L1HB& zF;52^T;g1maB*Rzp09zJh_R>;$VcN-&i<<59izzb4wt(N+-UJXEF9{EVK2+zE}piJ zWPZRNVPA}l!Wz{(A<}K0Gm&jn{uV|3i9$!&ZLpE&(F^}0$u>Zaddnf zE?$tDnkrlDnRx?%-`fE6!om_auq&^i;6uU5&<7qjz#=@-+uQs3@zqrK96CC&{9Soq zth;tAZA}=Eo{BW}y%wqRsWZxii&?P%#4= zU8^iIOyRN8^W~mo<=$t)a}Ww5GVD^xsZu(9f90aoWW^yxio=EQb3||SPx$XCkpv$c zADf%09^6`{%Tr;=`9ni=bt#q-_SfwE_>tXPK0Y>LqjGa|Gk|7E6?6hXC;bV4;unDFhlYkqN=cDE%UrX7U9+>Z&(9BV zaS7oO6JHmBkK`j(Z=d5TfdYb4SrMIZV{n;B<^z9C)xBl;_x^kFd~?Dm_A9h3CS?CG8(F3rO4lqxOj`CQgNe$E%~4lyD^ zffg>2u)9l&#u_?E=j7V*5A$*C&?#9Kvc|~RI3Yb92+U4hIsk~Ry!;d>Bn3bl_U`QL z0I6I>Wo3YXMm)IT08se@K)Dc6&~xaxX9zQYN||CbEui2iEiGNw&=MXYh+Lb;yk{aV~5R8QlKtE(MNb$RdOqF)bt{{8vh- zk&Q^5LP1`GWTA;Q)^L#v1wImOH_gw%XgK&3{9y}S;zt9^ z=2>n=QpH+Dg&MnaV+ECVD-0-96I|SS`*`kG?1xjV6$t@_mJ=J$)G zPb2k(4&A16R96W%O{L|EiB!QB`sO0t@6u~HVB+MiM6mh~} zq{5CK5ndTdbzTWk9&HuXo=Kv3FE|#1GNqt1h1b@Gkv76c{FhF z8Yy*J3>sVhN`_*Ms|fVEU+~T=qdPl>zP`Th?rqW(XaD~F;N+Z$xmT|*MDLcUT>Q7` zW%w14Eq@erWQJ#_o7H}}^6s^Pgxo?G1IkD)uJ?D>=x#V4u?$ZF9x80bdEIYP{rgnJ z)MO--u#JIo=clGlOr$pbw^>|T)Y)$}raKdE%j`~n&-77Jv%IE0Y!t(}DGT4L-j){_ za>UukK}31VFw)5i62L_J%f5-&-gVZ4My$ga-dz;E)vWtrUSem(C2ein*Y|@*oPh_u z2L;w*VjSQhNS=(VmVcu^FPB|3X33j5oS&N`r4T;n!i%P_f766b05E3d%0-|SGCDen zf^Vp)QKm)9->cyejHeJ5Ij+KXdbWbYU!V>meLX#romS=_Hu_dK{O{T@F)$$PUN>!U zQ02LF<=ydFAKq8LZTsA^X!7xIX7~t&C#xzM;+NFl*nX z{v_yw^UwO@?yl$6_yPT`?%150a~+UsEk+Gck@<=6ZKjS{6n(<%YNJC~O= z1M?N5eWq-d-!g!5(8PrN%5g>K+1bfo7KBgNU%!e~!9gt`g=NkEUO$&7CiWk%s(gNG zUTud>|8%bOpYS=Dq~haWsjC3lX>Bpv4M8N1vW;9{l8mI#PnKaf^6+?SJ{(_DM@*EN z8YNxb?W=i6!bHFWDf@w9Hgf)p8$9R`N~~ToQGnB`njB?OC_-sertk&~oSFD*>|ew* zqbgaUKB85!KQ;KfB*?h;i#1E{u!kWi{=~%DziSd3C`7Oa1HY&9l{miXI|-GdzmV56 z#e?WYFj{&ii!&!b*;Z2+bxB0EW{ojn6TpM|U|?Z)?_K~J#dD-aB1!PQp+Mcsr4V08 zs0YYQ`7$;&RcJ}E00JWX?Jcj8c@kiSLV}?%yZx6@b|s+)<{Acq5Gx;L%vd_vaP9s@ z6NMwf6Xk4_(;`J2At7t-y!i-Z5k5vm#jqK4GlWS!Nh+-}WiBF=vFYNh@*K!Qa#B>m~?>O2ysrqY{6|x(D{==oP#P4yZTyYFDQMD4W9luATsDtCM z5O!J+SZ3@Ihg*$>$15yAdvkO@$!a}XX6PDth39RSEHtXuvTF7$Ewz>(_Rl&U!no8d_H{JA zz|YPU@-|ar5chK|H0!bm$e;QqCPSrRdheopG~vGF zpox7hyq}d_nQ$k1{SR831)K#h$TSpKE9&luwsReO)$E5rJ`1Sz^yCJDn$R~o zh+Y?Cw$IdjkaHF#;%TrVSK(l|xm*}_euv1jjw8?9Yl3W#i%f+#O4{2eANYWPlE_ zadH2n;ObsyL^?2l=>lcxnPJ^iQ6^!&xrUgqJVxSffX?vo>Zl!g=i~Az{er^J4t|{q=T;G4C}R;#yRd{l0AJ442UPf#mS;2gG!JmeGW&iE4T{#exD(RArT6?I~@Nl zD(lP)NDSJr_**4Bw^_}eu8`XG<-9Q1-jf?qw%a$<#4@q+TuwPz5Yj@E z+d~xXTAh5BGuzLtt_EVY^dd2GJwBG!X1%|kd5u$Vtq+qkz+vU$vhm8#N8n#_dRkFV z`*@DIwK{NiAG6YH-yp|@%|ETseSv;{WtCixI&L;%T%wU&#gI z@$)t+%L=)cgsYVtLzW_59)|kw7J?!cZGb~{`mWTqgZD6Ja{+c3v~17dA1g5fGRtNi z0M9C&2L}Ud)3fvQ6Y_4jwR5>HMYo6UE39pGo6hk`{i6svW5vQo$}@6UI|2#-j7h@z zS^U5FKW-S`1AB9H;}tr$0keEpp;7LXc=e_re|ry5K9`c?_{GUcUeSra+UZs*o`3}6mpu&bJezf;rVV}P zs%E&~3cE{YzqbL?rlOYr{JN0-4G+zU@93|LTe9QYuuxy0ku}B5QMvtwY#fs|wS@(A z@?JpaL6hyepOTNN#@{8`bx=7A<7Gry4r?W(4au1WNNEw&8sd+VAG6@Q0n!CpOQ1x` z7>lPaKt3x^B}b6}RAW8-3?u?=Rn&x7StVj(99_3KIH^PtCoH6qB8W#sYL^G#$jJ*K zLnNSu9M4W@z=ffN2PMOvoJ_-@buj~v8#Q5z*_h*n-+q`{d@N(l_F-Dq}MR zG4;$yO~g*lL4`u?H>Dd|HFTu5$ug=aDdnlIo_2p%a~EWIX1-_epi530S59_X>*3zj z9<#f9=p0T&3`JGV&T=LGT=y0Fs?=uAuuk@;2S-CB8T`)dWzcr=K*&lJ{@Uc(8MGgc zUW)!b5<(&Iy@cZsnkSAkc1z$3IToCl9y8@vAT&ZIhYMH$P&&3}!HJUGS0aT@Go;2- z7@o`oCH6gGVe9{QDl!sBaNu+v2?+jNL6US42HfD_Vsln9jQ@ec?!Cd|IDbVseeAxU z`&1Tt*b?s)v9qVy(F(5lhE*wh^ISnQi`~e=fGRy5Rukj>Zw9&m7)M&UmHvdfauh69 z2na_|SQuCelm;393mZ66d{`<5R0%z&<0DY4GgS>l? z?v9aBEDXX7P$`o(RV)V!I)cOKsRLMazs0bDTf z#B@ir%*P_H`+#*zmzQ?QpRQ-i_FB1$3Q}6!{K5Ev$&HI za+oiPV56t%8=dP`>u5XU26{LWuX}AFn=&|C7yU@WLPi#-$kL-D<%rT$+<`#;@a~0` zmDNE62u^`lQ8|2)alKisM)%nI`6J-a<0;B>;&kr*X#Ce!iqS@vDjV9OP8lvXjF=k3g?QYwnE*GCX?fLlpH!ey zbcy;3f>y_JO0!O{d^L6QXKeo624sr9-EX2Mzq6qnz~mZQ^x=iqleW7xePr@>ZYbH5)mQ*5_`1EZMMR!s}!C?pgWb?;xDMqqI!b|02< zA0JXluZ8`t^HSs$-%kpY1;da_OjE=R4Pmc%F78WMT)6Tb?=DjoAN8s`k`pE^It0v4 z#0v(N&S!p$Nt&9PZ*|8c$%MDNIkX(yxyhaEAYU}v=LEA{Lrt3bjDQ#9_G zAra+`17t8wHMP9ila3DFpgxdEpI4)>&`@cL+qq)7q>6}%s(B)!7zi*UixVOQB&h`p z&kX_o$E)r0^EZLy6!=!Ck)Skb&%1O2D~4-;f91S~h|E5nBSMc+46-0FZ$5SW(sDMt z-yz(+wRh!+4Y1kXRwK~>}WaL~0o@0zluytX_nuQ*tx(`?n*wRw!+I_rMM z&XX(@;@Lk2LG>%A0EanuaRerMV04UR2nr%wUN+p#af<*|Q~GD6;JZV0V&neeSjyfl zR4%!ciDTKW5l+O-Gb{Q2#wn#-N}e(_h%zwWzP*E&-}|q`Cy5*dSy$(?Kqew*fCvqo z7->=_Vu#6L1K0!v{ z=H^bzO1eGm_~q`+0>bMg$Vp17Qm)n~$I?A(F)_y5)uFaKe z8W0x3nC5h`o=s_KNmCR!Ie_4Ot`=>GV{IDD+ewAA8$d|7ZygZEgXVqt00IMQ;aQT# z-q}Gzt@z^M@m3fUwhvos*>r(ua5*woxqaFctDTDkaYjEFq1|C)yz6cm+M>W#&y z<8tYZC|CB`|9Jj~elkgCGCnW3t}LqHR`EdqB~k6*@^ZzzO!5MDYmqSUCQ!m@nd?!v z)lY&9J%`_t;8)FXEadt>u2t_{X^O>#jfIk*v-oQux?pJqj^VlcrzjM7_Tc^LdIU(A znOT}s$_cg2H)|6g=2%24Y$T>KdYTLZVS~-5!jgi)VF#A|;NNbxw)9VqxCxkOX<=1^ zWs5TudrNZxrv)(H9?pgME*hahJRDgC`N0ZRD|b+SY~FSY28ol^H#c|c%Yx*2ywhqb zDf+({R5D)I?WiwrIX;xKTy1UP??e7AIQ_l26+eA!4&IxdjT%o#zv*pgY*ZhXn|9*d z1=hn6o#Gg(mT`P~n)F);%HQJ8j+kGM$3M@EtNNX1)45jYk1n5}0rD8BU9^>g?x36i z4GoP2y7$Udat-Ts$|rEeprHy_{5c)dnKRhNz0o4<<*E#=mkZ>@V zPLLi#wS`I_a5Bh#ep9eQE+?KW8~Vy^W`oaIMEut0!oW+U*`~F*PPcJTi`C;2Zu665oCq&V3>4K}OLu;$}MbRhBIXoC|8LAXRk!Yf6NpHEgvnbzmk zsK%h!0b$*zTKp8yOsV*om=cAvQIh2R>U7C*G&_{i7`)j?Y`ybS*Jw5XyP*e9qjC`r zB5*RZH4m(7aL)-1Hq)0$pPQ-i1m6X7F-S}i!ro4kG8NpKDH&kl>R7}dWNC@L$@ z{dw*ZGW(gsi9?tFGj`Zxwuh5C;q+Ki5$y9o(9Nwn1#Fkt(g-ISQ<`8YnET#KOg?oJ ziO>u0gSFPL-qC5L8cE@r|_T=leO-hZ~e_WgTi)tFQF&qihej&(G zKx<(fRr+;rFLDYq?CkET>f;lUz#&-sTm8V0uK)kJV?3jN3}+uZqpi( zh;w6SSlGaq4G2m%;^-He_KuNA#OHmlMNw%n$iW%l76{cT-_cLt8I(`E+Jn`(U@FGZSg$A4z$EUHV3Iw zWWvJ2FKC5DmLWQOM^yCe@u_+&qLNt;b;qH6roUlyy zsdV8Web~`_>GDGBW8l}Y>mOOS=9rqA@6|LcjBRv^0TIyZ<|+`VD4211Sb=+xIA9}2 z-1H<)K@h?I44PoD5NISQV4|YjqF@$iXm+5~)1S8uZDlS39in5mQ>ku5Is8}7?>YN# z9%%sIQ9(vVg)SN3m;f~>5==AcmjlbD;`i++tn!t*P=%}S^e}4jh+4khVt<3B4 zc9wulYX{x#OvaXh8@MZUK@Gbnlz)1oeGQQwXz%8 z5--IdfHH!muqsWl_`8kc5;Vs@7I-7vd%6glskLnqewfH&%!XHO1uJmIN~ysMQpxOy zKCwmb`^_5SvWx^Pyqz(9ro#+`;1^{S>?cw{0PVgSlDM1CUo4 z1!Qw}VvXy*B2FH=Nif((j_6uByeCn})=7pM;}XeA%96h0Jk--cX2V}bc7Z77vL25+ zDBpCF6VGdV#?yomcpPS)uR_DVs|E?c<^-U&Q$bg!|G8n?k_rw$4uUo#uVA)cYc#_R z$4O6G6u$4ORJ-rS=JXE=x{4e$1_-)n;R^uY6%4ec)2ZQW}+L7@T%VJ^NI zd1lDdg}LT~sGW%2|LFGC{_f1C2Vv&L`sFz}FtDK!t|jm2!mTqs4g=p)wacY3iH^ya zUWtc~&dz54_RL)>KoJ!?Z$J*cDDM&!LHH)m!EXv-b-)i+g5}K3YU6s}Xs(SzBrh%# z4JS4b!r+P#NhrW_jT5CrRa&>IqKr14g+X6Y$>*Fv3}^1e{UtFYprP}c4dH~@3eI{) zjTjSYrHk5$o9v{5tMu!2f~U9vn2{|eXZ_QrYIq#ovSYD7CZ_NF%qKDFVtanTrNd$E zpQp64JJQyGLb0mS$B9M0)~%As{*}$tW{jd~+ita#lpJdTO^zN8gMBW1WiuzhGr8$h zkszn5mOvzP!M$pCzex!Gs|&NJlu|Xp{QDc{5^}7Am!Pac^O2l!?}syX4V9oVA-j;N z>qLvB|Comrit$3_*4gP#=J_k-XHD3%TB$?C6WB=mHZ#lLSJ3@IYIKbB^qs%XHGF+P zdwW3)!B;v|%Msw=8yg$vmzH8;V*%HG5SU^MGpd3ymS@;|#75%ndPxJ7d~qyXz(r zDG}BpF4DzYMO7fK<4~XawLBv7J#X_aXLvmLWsIMNoh^QarAX%!5x3*Uf_qPTOpU$< zmOSoVs&(PRBUby~G~u^KUdx|^SPFLWWQy=kov-MwLbepItC>WvtOr~BLowLYwgUHv zO;VC{R69m!5@iDe6Zrbrsh>AW&=WRtJmfQBf1~iSB7@pPetDW1N=e1YszW&kqfk>^ z6l}E)bqCD4f$60%ybQp~@$s6smBZtHIIQ)LC9l^Ijq_=}NR@<~?gTIjCtZ(#S7K3a zPDe~1bYt_oxVnxV-U6KoKtlmuG=Q4)&X5|A#b3Mg1NdNoa2~*>&dJ%@-tGY!&FJar z#l*yV!w(Kj1#@eQi+?>{XajhvfIt_}wX+j88nMnAE}m^%W}u`rJTY-_OKFYAv9z5_ zgVOYS(AYvcUpY=X-~AoaJj;Y#2s8iI!+oa7oQSC8H!o%11%^sspd-K_$MYt!jxjVy zy?ZH#AP$2@w!1q+uRHwfOYWjviHc6St6H7`~KxP*LL-G zafifKmby}jfGf}&fv6u9?eCC>7%#;_kSOf*7}D4nl15KsAVlD|V4M|dcH9+Ylpx*I z_Xn=b>VLIBO{)P`rR;~)WHvU#^X7K<(s2u^27AYeVpDx%tbz%5yWSoLg~`gx?cH(| zIMllP-rw#4DZ=x0We(y&!K!?W$bW=c0|U%I9vqsQ28)%sU1E%LZ(`fzj<1G2x;^33 zw8BtqHGcg%J6jyTAPBeZ8hKN!2pTvQcM3>mRFslh9~lv*8donrNy-8dQl)d5+Zr9e zuUlOEwN|`1Z5=#gA$AbN)|-P{9QdU23%}zkrqishBAmJ_b>i`+tJ0mzJ%=s|2awA_A@qeJYn|JPtPTeQl?CqjvKvQs@DB=6g7z9 zejNx9fg$D5UH@Sue@ITLpHNgbb1W~oJZZEA zN0E!CFaH<>!4%!eL;_GH{u;uOD0_e#bCSFUe_yWLx;#=o`VsLF3qe?EEmqHUZQkm$ zG~wgPoL(FXeW<$w`ll0Ue`{`DoStT;r-zp(@b1Q~F5Sk6L<+rnNBbyRd~=vI|g zrUE{%Y6~@&0jlK`@uC2O;fF4EEN&u{-4^mZKmU8~@2v%SB$y6=6t5Pq0?PtXhdKy! zT}}r!&7t8R^u=LDk55#b6B^XJKjIS=r2S4x;}gq5p;vr9KbcBOfCj+~;|<6c_3&_g zgX(!Q^WgH`0Ho{Q*yuOxw?m?Zh2-Iz&&Ge3RqU4+YOX`LrLI4g{<#j<*UYaq@0k=g z|7@NAA8C{`^bj+> zUz~k|l>89jVAD`>EJ&c!OZjvX?4^p?rcSb9a@Rf|UTEO+@KY~~I3d~`G5YhFm7Zb4 zZ8#=YbVgiM$5qEuOHWnbnpoLFJSSBj_`gs4e}FP$3eUhCxo(#=+S~XU4)BQh_Ukr=7(ZOP*_} zoS&z+tH$cwW`lmcDhw<<6ze??%fma04&+n0JPyiG%PYqI^E4dG^{4amMhiefYHJ6> zTwUT&nSMAbUpzh%yqRo6K)jY5vkep$goe_A1rE5g374yyZYVBUShZ-`H}JiOq#oCs z%L{B4Y0qwTtuqxilJW}^p)>_V_WfnCvFrW$6)tlr<+ts~aU)oIb4oxb?O%qTCpy_ROHjK_NWCQx8d%%0<8x0>ln( z0>ymg-Zn2*PMk>D;=qTu*Vm1Wjj^#Y66xMFVG^MG7e7G^=#ucpUJ@ys?R5PIhlm)$ zDh~Et&{60ZH$dXS$~P(&IdS~(OuxDQXLQNc{b?i6U7V8g4QU~%t3#D!TBGA>tJv}IvCIe(hpZ|H4y^$*SQ zFIjMVhQ2>wX&ZI8Eq z2GKDZBo~ z&9?iJl}Y$CX^4sWxX_SS3&)2NL_7_|=!B|$r^v(NAS8X%A<2zlGmelVA~j`^`YpM{ z7sQ7AGa7%yYoFWOapb*;iUN7o)j?p;RO+=aFNb6JxMg@jTRr*?U#fQ$JxcuyWwUK` zV$oGME5Uk|LZgr41`?#QsAgygAL=)8ecy#m=F5~p?M#<~L&Yn+k{BoFFc-^}DJUp_ zzI_;=HN{NAhJ{hK7|j@590^BwKI{g(NLbO|&5#@gZAZyHq+WHJl#b>%uBg#Ke68)T z4o_nppi_~jDle-P;~D7uy$lp?{RAwiUzP2xq^;%KqDVO z@@(H88Mn5OKxk+%vXU3C%+1enIK=-q0C7Q%z9T%`&ceW$Qg~e~rietjA`!VkL~fGi z&Cb#nXWjybNz*ONh2RPfRZ!Yd#n(E!dLBAt;~$J~?bDleR9pcz8s?!L0O=l^og1t+ zTW{Ug)=mLHysSaS!-q5s#zQW@7l+5+%;LG6b|sNw^7EtdsYNBst}pEVbL1QQf1hyY zank`1z9=W~sVE`AFETb?+_hl7JQ-jJM(iEV1cs+KD)o032tfiw9pIc#d^u~lw)st9 z!-Ax`m#oQ`17?L_@4LSyVB*9|z?Xqyn#$QV(AOXB?YDw11YnQaJLTk%M@L7Y*U#aB zO7%j7c%=fH8y_D(aKM&G3>+S=j*1HH?;kX+0O0|iNiGF?=yY{UCQfJmmHhLy1`n%8 zY*9mQ!u22Erf2S+ym`^#k#=yXA|>S#J`u%Yksdwz5da!TAo;$W+ce_j;lR&sMF~JMCbn;vK6O1}- zb=`0THiA}7oSx<)5Nn)P?$}u6*cemTK*Yx9wrN0SL0wpM+No0~BV%sL)S#fGapxyC z&Zity-6ivsYY<~TGjx;I_)6v7(;nw5c|%4LfSkaR0B*CMYU<_s*wmNdQ+V@Q3hm1E zd!o)a3lA?R*h5*@Eb70mc3Z53)ncw}Za9K={gv0Uf?9e(2s)#vsAOnpaIxFJzS5<9 zG&+jK#{A`j%`-Fg7|aD(i%hLnn^u9`qS5ppJa|x{$X+~m)jG@CUVfU^;9>QMn~{FG zrJ1~B8LtveO|fHe-Zd=ZyiYM-0uShB@AhKxN=mL!?p(D<{9_F-z(bornDM*y>)344 zhktu7Gb;oF1GNf)2ettoB4OOok%!C$!$i!*Ik(Uac4n6GKwC|vro<)QZt9-#@Cnb# z3QbGBe8w9qRq4$uuUHs?jSUP5^0^REMD2h!7oT!BDh7A@jCXLTk5W_-jRg#8r3LpJ%`ILZMsS*-@D(z&BJ?WxB|(QF(C}(b-0Y#NYa=H z2G>a&$*%6FG7B3-T}vT>ZSs?2YRyu>kpi}O@~n3ZQ~XpPzdqlG=FUaj+(^0l&qMx&9-<(uDs zzlL?Iwl;%6NYrW{AWu}r>+tY!W@h$3cJCM&p(9gfx{54xZNG}v;9>QMK0Z!Gb{n(z zlSP4O4{eF+bI9Q*Po0fTB1^h-8Dv4=5`;hjk#Y-25m0UxL`Z-nOr8apPX6P$IaM8uZ9GID@C(AfH* z4jF`MV5_xw0QW2j3~yWuFfh($AwW6+l{-Ei*ete@D1bM{)@0**oF+b_g$KIwKpBUhs6CDCX>l}dwXZW!^4MaOG^y)>~R1@OM79NpH|`FO^|lp zQu+L>2M=n|50;fTlV2?A$Ve^vvG(E;EoFFsfiY^TqsyPb!%~ZrI(VxN{`>s>F#vF( z{QWTS)Z*WJ0N}vCW>xihcuFRp2SApQ848cr{Pry!op*F}ey4-})~?n0>&8E;HGJEs z&F*<1vFNIwnnZ}v!4;G~j$C8$>G>^|){g!G_Thw(YU*uhh0_KNkD;JH3VT4C9PHX{ zURoNTkes^H_^^S|eo|ttm90C0=m~%TO_>5MCMd|x?5G{HW3-7o*(wE`E+82Ixy9^v z|M;E<7J5*tw$#0QwSVsTi1yoYB{Fd@MUm&%rCt$FIj-bxkBZeezStJk_c z{VuRNCTMed|4(V2&Jcm7w#PgEvG1b|n>K9NWbaJkD*)22DTNa@2J3qPp2Et&Xt{D= zf$=BCm2tbCGg_+zP|CF_yoLM zF7NN}hh4KSzH{d;9v{kLr2#-+?0Ne-vVCNJ{#K8Y|>P-de` zWreV}ySoqob{jVv9=o|6b9Fu9>UvZw7nh?r+^Nw~m{-FRh6g5v5^sUQ3VHw{2KC6T zN^%#OF>u22Xhh6~HrY(q7EI9vfX<%`2un@ASXSRGhveYs?5O+c){pHq5qJZ|=ES&gy@1gegEAZ)P3=NMT)4w$_ z{ARy-cx+K=t-$PveUpmtgh?S>5w&RevgmJ=LIstdg}#2;rJ6SR6Z2{o0_c^{Myb$7r681${N48^_;Urkt}%D7$h@B;J31?L zw{G6NMenprTd>?O{1tVfdv%Slc)|VWSYChFIod`kYRXkVcOBv795H&+W6| z0opg#FX7-JJMX}xh}c551i(Zh<0}0_Qx6=nJ!yjz_JUR!@CwR~h{-cBG7ZFMPQ!y% zO*|k}g6xD${dK>o$t`H>))3CT;o+5ReSLi`EzI=vNH#nF%U$}`))sMb(Km12d=?m< zIp`i9z84o8BNkm;q3i7`JiH--%OE==JuoTB2mNj(KV8xnJ+NOvjf1zUxV#JikeMkj zzY2_uG)13t8y{b0VJ}bB&6yr_dUFc?Tn0}G7-CS>s4_G%G1-4S0EgGp+m@0`XLo9x zOXJ<#u^QSSs~re$fV@(ENMvdSSpv)rWk}s=kf8n#g61n(5$%u zYu=ie6qI?H(<0S46iYmnmd7lq?!Z{v5=lvP!HCwiq4kFlayD%?F0K}56*R>rl^PiC z$}VJ5TI2^0I~_Fr3V?2Oa0Y_p6c@+)1}As)L*u^h;)#z4bFw;RRnL0F>;PgFfO{%W zGbSPit(_n|CeQBl=@0($VPR1e0Q}$(r^M9DsaYvRqW|AMHsEyu!HxNwK9#R|gir9r zOT_{$1uaZdjT|*Bl;kF;XWjo~lYUv95)u(i%GBIh3lH##G$9Zu!54;y0zxw(JZM`G z31}6JNf05y`tZ*6?=a~dOexy6sPHf_Fi=xd>*;ADku;=bL^L!|V9PXF%)K5$g+wA< zzy5utvTzk1mj1R14^L@QnbzUZ%M~!DLx!seueeI;4oj4rW1# zOiVNr2`=N~*Wa)=xR{zkD-UPR(9kts93Bx(PMZ|ugzLyXTzFO!=N_~DNh5T8LVS5R z>2k_N%7-6qDyr&Wwhvz{46`t^Gn5S>62mULcmvm%N3%Gyz6crX996fG3T$et3Wwfk&@Fy zYkNe8*DTEOVdN#XN~}*3boqG_h+x{~rz$Bbh7fSO0i8FtP*|&Vcc$ay0+T2 z?OLs^xVpvr!q#==SSte33IYm<8U*AJkW)dqD~HG-${`4*f^vm~TyGA*TqGo1F+l`d z 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 z zGF5}xJ7?-%$F4u(sjqW>WcA8yPSgafBK%Wf>7fj^g`e>B9H6!)l#%s{Fuo}!Xo+Z; zp7{D=G3KEKD;Wl;*X`5)P`zQA0d*NYBqki0r|W9%K}nhf47=sN;J^p| zFVA25ef!1G@9MwSw)AbW`dSShwVYhCAdFWjN0vW0k}$J5)l)(is#2NWSi2!Z$d

      PXwCDMWVRXh8>TgdgHSH$1_tV)SDdMmZ)DA7DvM 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 z�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�a604J_*R=iuGVKL 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

    1. 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

  3. oGgSf5Yw!N5>(Z$6Z4lV>^(_OC#)S5%8WM? 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䆸US^lqej_HhJo(EyBfws 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 WzZv1a|rqp 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